diff --git a/G940LEDControl/Forms/MainFrm.pas b/G940LEDControl/Forms/MainFrm.pas
index 696ecf6..bd5a9de 100644
--- a/G940LEDControl/Forms/MainFrm.pas
+++ b/G940LEDControl/Forms/MainFrm.pas
@@ -19,9 +19,7 @@ uses
pngimage,
X2UtPersistIntf,
- LEDFunctionMap,
LEDStateConsumer,
- LEDStateProvider,
Profile;
@@ -95,7 +93,6 @@ type
procedure FormCreate(Sender: TObject);
procedure btnRetryClick(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
- procedure FunctionComboBoxChange(Sender: TObject);
procedure lblLinkLinkClick(Sender: TObject; const Link: string; LinkType: TSysLinkType);
procedure btnCheckUpdatesClick(Sender: TObject);
procedure LEDButtonClick(Sender: TObject);
@@ -109,15 +106,8 @@ type
FProfiles: TProfileList;
FActiveProfile: TProfile;
FLoadingProfiles: Boolean;
-// FStateConsumerTask: IOmniTaskControl;
+ FStateConsumerTask: IOmniTaskControl;
protected
-// procedure ReadFunctions(AReader: IX2PersistReader; AComboBoxes: TComboBoxArray);
-// procedure ReadFSXExtra(AReader: IX2PersistReader);
-// procedure ReadAutoUpdate(AReader: IX2PersistReader);
-// procedure WriteFunctions(AWriter: IX2PersistWriter; AComboBoxes: TComboBoxArray);
-// procedure WriteFSXExtra(AWriter: IX2PersistWriter);
-// procedure WriteAutoUpdate(AWriter: IX2PersistWriter);
-
procedure FindLEDControls;
procedure LoadProfiles;
procedure SaveProfiles;
@@ -129,11 +119,6 @@ type
procedure SetDeviceState(const AMessage: string; AFound: Boolean);
// procedure SetFSXToggleZoomButton(const ADeviceGUID: TGUID; AButtonIndex: Integer; const ADisplayText: string);
-// procedure InitializeStateProvider(AProviderClass: TLEDStateProviderClass);
-// procedure FinalizeStateProvider;
-
-// procedure UpdateMapping;
-
procedure CheckForUpdatesThread(const ATask: IOmniTask);
procedure CheckForUpdates(AReportNoUpdates: Boolean);
@@ -150,7 +135,7 @@ type
property ActiveProfile: TProfile read FActiveProfile;
property EventMonitor: TOmniEventMonitor read FEventMonitor;
property Profiles: TProfileList read FProfiles;
-// property StateConsumerTask: IOmniTaskControl read FStateConsumerTask;
+ property StateConsumerTask: IOmniTaskControl read FStateConsumerTask;
end;
@@ -170,7 +155,6 @@ uses
ButtonFunctionFrm,
ConfigConversion,
- FSXLEDStateProvider,
G940LEDStateConsumer,
LEDColorIntf,
LEDFunctionIntf,
@@ -193,28 +177,13 @@ const
TEXT_STATE_FOUND = 'Connected';
-type
- TComboBoxFunctionConsumer = class(TInterfacedObject, IFunctionConsumer)
- private
- FComboBox: TComboBoxEx;
- protected
- { IFunctionConsumer }
- procedure SetCategory(const ACategory: string);
- procedure AddFunction(AFunction: Integer; const ADescription: string);
-
- property ComboBox: TComboBoxEx read FComboBox;
- public
- constructor Create(AComboBox: TComboBoxEx);
- end;
-
-
{ TMainForm }
procedure TMainForm.FormCreate(Sender: TObject);
-//var
-// consumer: IOmniWorker;
-//
+var
+ consumer: IOmniWorker;
+
begin
lblVersion.Caption := App.Version.FormatVersion(False);
@@ -222,12 +191,12 @@ begin
FEventMonitor := TOmniEventMonitor.Create(Self);
-// consumer := TG940LEDStateConsumer.Create;
-// FStateConsumerTask := FEventMonitor.Monitor(CreateTask(consumer)).MsgWait;
+ consumer := TG940LEDStateConsumer.Create;
+ FStateConsumerTask := FEventMonitor.Monitor(CreateTask(consumer)).MsgWait;
EventMonitor.OnTaskMessage := EventMonitorMessage;
EventMonitor.OnTaskTerminated := EventMonitorTerminated;
-// StateConsumerTask.Run;
+ StateConsumerTask.Run;
FindLEDControls;
@@ -235,6 +204,7 @@ begin
FProfiles := TProfileList.Create(True);
LoadProfiles;
+ FStateConsumerTask.Comm.Send(TM_LOADPROFILE, ActiveProfile);
// LoadFunctions(TFSXLEDStateProvider, FFSXComboBoxes);
// LoadDefaultProfile;
end;
@@ -549,6 +519,7 @@ begin
if TButtonFunctionForm.Execute(ActiveProfile, buttonIndex) then
begin
UpdateButton(ActiveProfile, buttonIndex);
+ FStateConsumerTask.Comm.Send(TM_LOADPROFILE, ActiveProfile);
SaveProfiles;
end;
end;
@@ -657,20 +628,20 @@ end;
procedure TMainForm.EventMonitorMessage(const task: IOmniTaskControl; const msg: TOmniMessage);
begin
case msg.MsgID of
- MSG_NOTIFY_DEVICESTATE: HandleDeviceStateMessage(task, msg);
- MSG_RUN_IN_MAINTHREAD: HandleRunInMainThreadMessage(task, msg);
- MSG_PROVIDER_KILLED: HandleProviderKilled(task, msg);
+ TM_NOTIFY_DEVICESTATE: HandleDeviceStateMessage(task, msg);
+// MSG_RUN_IN_MAINTHREAD: HandleRunInMainThreadMessage(task, msg);
+// MSG_PROVIDER_KILLED: HandleProviderKilled(task, msg);
MSG_UPDATE:
if MessageBox(Self.Handle, 'An update is available on the G940 LED Control website.'#13#10'Do you want to go there now?',
'Update available', MB_YESNO or MB_ICONINFORMATION) = ID_YES then
ShellExecute(Self.Handle, 'open', PChar('http://g940.x2software.net/#download'), nil, nil, SW_SHOWNORMAL);
- MSG_NOUPDATE:
- if msg.MsgData.AsBoolean then
- MessageBox(Self.Handle, 'You are using the latest version.', 'No update available', MB_OK or MB_ICONINFORMATION)
- else
- MessageBox(Self.Handle, 'Failed to check for updates. Maybe try again later?', 'Uh-oh', MB_OK or MB_ICONWARNING);
+// MSG_NOUPDATE:
+// if msg.MsgData.AsBoolean then
+// MessageBox(Self.Handle, 'You are using the latest version.', 'No update available', MB_OK or MB_ICONINFORMATION)
+// else
+// MessageBox(Self.Handle, 'Failed to check for updates. Maybe try again later?', 'Uh-oh', MB_OK or MB_ICONWARNING);
end;
end;
@@ -748,53 +719,9 @@ begin
end;
-procedure TMainForm.FunctionComboBoxChange(Sender: TObject);
-var
- comboBox: TComboBoxEx;
-
-begin
- comboBox := TComboBoxEx(Sender);
- if comboBox.ItemIndex > -1 then
- begin
- if not Assigned(comboBox.ItemsEx[comboBox.ItemIndex].Data) then
- comboBox.ItemIndex := Succ(comboBox.ItemIndex);
- end;
-end;
-
-
procedure TMainForm.lblLinkLinkClick(Sender: TObject; const Link: string; LinkType: TSysLinkType);
begin
ShellExecute(Self.Handle, 'open', PChar(Link), nil, nil, SW_SHOWNORMAL);
end;
-
-{ TComboBoxFunctionConsumer }
-constructor TComboBoxFunctionConsumer.Create(AComboBox: TComboBoxEx);
-begin
- inherited Create;
-
- FComboBox := AComboBox;
-end;
-
-
-procedure TComboBoxFunctionConsumer.SetCategory(const ACategory: string);
-begin
- with ComboBox.ItemsEx.Add do
- begin
- Caption := ACategory;
- Data := nil;
- end;
-end;
-
-
-procedure TComboBoxFunctionConsumer.AddFunction(AFunction: Integer; const ADescription: string);
-begin
- with ComboBox.ItemsEx.Add do
- begin
- Caption := ADescription;
- Indent := 1;
- Data := Pointer(AFunction);
- end;
-end;
-
end.
diff --git a/G940LEDControl/G940LEDControl.dpr b/G940LEDControl/G940LEDControl.dpr
index 313a0e4..99c2a5c 100644
--- a/G940LEDControl/G940LEDControl.dpr
+++ b/G940LEDControl/G940LEDControl.dpr
@@ -5,11 +5,8 @@ uses
MainFrm in 'Forms\MainFrm.pas' {MainForm},
LogiJoystickDLL in '..\Shared\LogiJoystickDLL.pas',
SimConnect in '..\Shared\SimConnect.pas',
- FSXLEDStateProvider in 'Units\FSXLEDStateProvider.pas',
G940LEDStateConsumer in 'Units\G940LEDStateConsumer.pas',
- LEDFunctionMap in 'Units\LEDFunctionMap.pas',
LEDStateConsumer in 'Units\LEDStateConsumer.pas',
- LEDStateProvider in 'Units\LEDStateProvider.pas',
LEDColorIntf in 'Units\LEDColorIntf.pas',
LEDColor in 'Units\LEDColor.pas',
LEDFunctionIntf in 'Units\LEDFunctionIntf.pas',
diff --git a/G940LEDControl/G940LEDControl.dproj b/G940LEDControl/G940LEDControl.dproj
index 88044e5..a3cb490 100644
--- a/G940LEDControl/G940LEDControl.dproj
+++ b/G940LEDControl/G940LEDControl.dproj
@@ -165,11 +165,8 @@
-
-
-
diff --git a/G940LEDControl/Units/DynamicLEDColor.pas b/G940LEDControl/Units/DynamicLEDColor.pas
index 99754b5..178e1c2 100644
--- a/G940LEDControl/Units/DynamicLEDColor.pas
+++ b/G940LEDControl/Units/DynamicLEDColor.pas
@@ -12,23 +12,24 @@ const
type
- TLEDColorDynArray = array of TLEDColor;
+ TStaticLEDColorDynArray = array of TStaticLEDColor;
- TDynamicLEDColor = class(TCustomDynamicLEDColor)
+ TDynamicLEDColor = class(TCustomLEDStateDynamicColor)
private
- FCycleColors: TLEDColorDynArray;
+ FCycleColors: TStaticLEDColorDynArray;
FCycleIndex: Integer;
FTickInterval: Integer;
FTickCount: Integer;
protected
{ ILEDState }
- function GetColor: TLEDColor; override;
+ function GetCurrentColor: TStaticLEDColor; override;
{ ITickLEDState }
+ procedure Reset; override;
procedure Tick; override;
public
- constructor Create(ACycleColors: TLEDColorDynArray; ATickInterval: Integer = TICKINTERVAL_NORMAL);
+ constructor Create(ACycleColors: TStaticLEDColorDynArray; ATickInterval: Integer = TICKINTERVAL_NORMAL);
end;
@@ -39,7 +40,7 @@ uses
{ TDynamicLEDState }
-constructor TDynamicLEDColor.Create(ACycleColors: TLEDColorDynArray; ATickInterval: Integer);
+constructor TDynamicLEDColor.Create(ACycleColors: TStaticLEDColorDynArray; ATickInterval: Integer);
begin
inherited Create;
@@ -49,16 +50,22 @@ begin
FCycleColors := ACycleColors;
FCycleIndex := Low(FCycleColors);
FTickInterval := ATickInterval;
- FTickCount := 0;
+ Reset;
end;
-function TDynamicLEDColor.GetColor: TLEDColor;
+function TDynamicLEDColor.GetCurrentColor: TStaticLEDColor;
begin
Result := FCycleColors[FCycleIndex];
end;
+procedure TDynamicLEDColor.Reset;
+begin
+ FCycleIndex := 0;
+end;
+
+
procedure TDynamicLEDColor.Tick;
begin
Inc(FTickCount);
diff --git a/G940LEDControl/Units/G940LEDStateConsumer.pas b/G940LEDControl/Units/G940LEDStateConsumer.pas
index 8739416..caf058c 100644
--- a/G940LEDControl/Units/G940LEDStateConsumer.pas
+++ b/G940LEDControl/Units/G940LEDStateConsumer.pas
@@ -8,46 +8,31 @@ uses
OtlComm,
OtlTaskControl,
- LEDFunctionMap,
- LEDStateConsumer,
- LEDStateProvider;
+ LEDStateConsumer;
const
- MSG_FINDTHROTTLEDEVICE = MSG_CONSUMER_OFFSET + 1;
- MSG_NOTIFY_DEVICESTATE = MSG_CONSUMER_OFFSET + 2;
- MSG_TIMER_BLINK = MSG_CONSUMER_OFFSET + 3;
+ TM_FINDTHROTTLEDEVICE = 2001;
+ TM_NOTIFY_DEVICESTATE = 2002;
- TIMER_BLINK = TIMER_CONSUMER_OFFSET + 1;
type
TG940LEDStateConsumer = class(TLEDStateConsumer)
private
FDirectInput: IDirectInput8;
FThrottleDevice: IDirectInputDevice8;
-
- FRed: Byte;
- FGreen: Byte;
-
- FBlinkTimerStarted: Boolean;
- FBlinkCounter: Integer;
protected
- procedure MsgFindThrottleDevice(var msg: TOmniMessage); message MSG_FINDTHROTTLEDEVICE;
- procedure MsgTimerBlink(var msg: TOmniMessage); message MSG_TIMER_BLINK;
+ procedure MsgFindThrottleDevice(var msg: TOmniMessage); message TM_FINDTHROTTLEDEVICE;
protected
function Initialize: Boolean; override;
- procedure ResetLEDState; override;
- procedure LEDStateChanged(ALEDIndex: Integer; AState: TLEDState); override;
- procedure Changed; override;
-
- procedure StartBlinkTimer;
- procedure StopBlinkTimer;
procedure FindThrottleDevice;
procedure FoundThrottleDevice(ADeviceGUID: TGUID);
procedure SetDeviceState(AState: Integer);
+ procedure Update; override;
+
property DirectInput: IDirectInput8 read FDirectInput;
property ThrottleDevice: IDirectInputDevice8 read FThrottleDevice;
end;
@@ -58,8 +43,8 @@ const
DEVICESTATE_FOUND = 1;
DEVICESTATE_NOTFOUND = 2;
- EXIT_ERROR_LOGIJOYSTICKDLL = EXIT_CONSUMER_OFFSET + 1;
- EXIT_ERROR_DIRECTINPUT = EXIT_CONSUMER_OFFSET + 2;
+ EXIT_ERROR_LOGIJOYSTICKDLL = 9001;
+ EXIT_ERROR_DIRECTINPUT = 9002;
implementation
@@ -68,15 +53,18 @@ uses
Windows,
OtlCommon,
+ OtlTask,
+ LEDColorIntf,
LogiJoystickDLL;
-
const
- BLINK_INTERVAL = 500;
+ G940_BUTTONCOUNT = 8;
+
+(*
type
TRunInMainThreadSetLEDs = class(TOmniWaitableValue, IRunInMainThread)
private
@@ -89,6 +77,7 @@ type
public
constructor Create(ADevice: IDirectInputDevice8; ARed, AGreen: Byte);
end;
+*)
function EnumDevicesProc(var lpddi: TDIDeviceInstanceW; pvRef: Pointer): BOOL; stdcall;
@@ -134,10 +123,11 @@ begin
end;
Result := True;
- Task.Comm.OtherEndpoint.Send(MSG_FINDTHROTTLEDEVICE);
+ Task.Comm.OtherEndpoint.Send(TM_FINDTHROTTLEDEVICE);
end;
+{
procedure TG940LEDStateConsumer.ResetLEDState;
begin
FRed := 0;
@@ -200,36 +190,18 @@ begin
inherited;
end;
+}
+{
procedure TG940LEDStateConsumer.Changed;
begin
inherited;
if Assigned(ThrottleDevice) then
- { Logitech SDK will not change the color outside of the main thread }
+ { Logitech SDK will not change the color outside of the main thread
RunInMainThread(TRunInMainThreadSetLEDs.Create(ThrottleDevice, FRed, FGreen), Destroying);
end;
-
-
-procedure TG940LEDStateConsumer.StartBlinkTimer;
-begin
- if FBlinkTimerStarted then
- exit;
-
- FBlinkCounter := 0;
- Task.SetTimer(TIMER_BLINK, BLINK_INTERVAL, MSG_TIMER_BLINK);
- FBlinkTimerStarted := True;
-end;
-
-
-procedure TG940LEDStateConsumer.StopBlinkTimer;
-begin
- if not FBlinkTimerStarted then
- exit;
-
- Task.ClearTimer(TIMER_BLINK);
- FBlinkTimerStarted := False;
-end;
+}
procedure TG940LEDStateConsumer.FindThrottleDevice;
@@ -243,7 +215,7 @@ begin
if not Assigned(ThrottleDevice) then
SetDeviceState(DEVICESTATE_NOTFOUND)
else
- Changed;
+ Update;
end;
@@ -256,7 +228,54 @@ end;
procedure TG940LEDStateConsumer.SetDeviceState(AState: Integer);
begin
- Task.Comm.Send(MSG_NOTIFY_DEVICESTATE, AState);
+ Task.Comm.Send(TM_NOTIFY_DEVICESTATE, AState);
+end;
+
+
+procedure TG940LEDStateConsumer.Update;
+
+ procedure SetBit(var AMask: Byte; ABit: Integer); inline;
+ begin
+ AMask := AMask or (1 shl ABit)
+ end;
+
+
+var
+ red: Byte;
+ green: Byte;
+ buttonIndex: Integer;
+ buttonColor: TStaticLEDColor;
+
+begin
+ if not Assigned(ThrottleDevice) then
+ exit;
+
+ red := 0;
+ green := 0;
+
+ for buttonIndex := 0 to Pred(G940_BUTTONCOUNT) do
+ begin
+ if buttonIndex >= ButtonColors.Count then
+ buttonColor := lcOff
+ else
+ buttonColor := (ButtonColors[buttonIndex] as ILEDStateColor).GetCurrentColor;
+
+ case buttonColor of
+ lcGreen:
+ SetBit(green, buttonIndex);
+
+ lcAmber:
+ begin
+ SetBit(green, buttonIndex);
+ SetBit(red, buttonIndex);
+ end;
+
+ lcRed:
+ SetBit(red, buttonIndex);
+ end;
+ end;
+
+ SetLEDs(ThrottleDevice, red, green);
end;
@@ -266,52 +285,8 @@ begin
end;
-procedure TG940LEDStateConsumer.MsgTimerBlink(var msg: TOmniMessage);
-var
- warningState: TLEDState;
- errorState: TLEDState;
- ledIndex: Integer;
- state: TLEDState;
-
-begin
- Inc(FBlinkCounter);
- if FBlinkCounter > 3 then
- FBlinkCounter := 0;
-
- warningState := lsOff;
- errorState := lsOff;
-
- { Error lights blink twice as fast }
- if (FBlinkCounter in [0, 1]) then
- warningState := lsAmber;
-
- if (FBlinkCounter in [0, 2]) then
- errorState := lsRed;
-
- if StateMap.FindFirst([lsWarning, lsError], ledIndex, state) then
- begin
- BeginUpdate;
- try
- repeat
- case state of
- lsWarning:
- if StateMap.GetState(ledIndex) <> warningState then
- LEDStateChanged(ledIndex, warningState);
-
- lsError:
- if StateMap.GetState(ledIndex) <> errorState then
- LEDStateChanged(ledIndex, errorState);
- end;
- until not StateMap.FindNext([lsWarning, lsError], ledIndex, state);
- finally
- EndUpdate;
- end;
- end else
- StopBlinkTimer;
-end;
-
-
{ TRunInMainThreadSetLEDs }
+(*
constructor TRunInMainThreadSetLEDs.Create(ADevice: IDirectInputDevice8; ARed, AGreen: Byte);
begin
inherited Create;
@@ -326,5 +301,6 @@ procedure TRunInMainThreadSetLEDs.Execute;
begin
SetLEDs(FDevice, FRed, FGreen);
end;
+*)
end.
diff --git a/G940LEDControl/Units/LEDColor.pas b/G940LEDControl/Units/LEDColor.pas
index bcb3c03..03f4b7a 100644
--- a/G940LEDControl/Units/LEDColor.pas
+++ b/G940LEDControl/Units/LEDColor.pas
@@ -8,16 +8,17 @@ uses
type
- TCustomLEDColor = class(TInterfacedObject, ILEDColor)
+ TCustomLEDStateColor = class(TInterfacedObject, ILEDStateColor)
protected
{ ILEDState }
- function GetColor: TLEDColor; virtual; abstract;
+ function GetCurrentColor: TStaticLEDColor; virtual; abstract;
end;
- TCustomDynamicLEDColor = class(TCustomLEDColor, IDynamicLEDColor)
+ TCustomLEDStateDynamicColor = class(TCustomLEDStateColor, ILEDStateDynamicColor)
protected
{ ITickLEDState }
+ procedure Reset; virtual; abstract;
procedure Tick; virtual; abstract;
end;
diff --git a/G940LEDControl/Units/LEDColorIntf.pas b/G940LEDControl/Units/LEDColorIntf.pas
index 352a0fe..17b415f 100644
--- a/G940LEDControl/Units/LEDColorIntf.pas
+++ b/G940LEDControl/Units/LEDColorIntf.pas
@@ -11,14 +11,15 @@ type
- ILEDColor = interface
+ ILEDStateColor = interface
['{B40DF462-B660-4002-A6B9-DD30AC69E8DB}']
- function GetColor: TLEDColor;
+ function GetCurrentColor: TStaticLEDColor;
end;
- IDynamicLEDColor = interface(ILEDColor)
+ ILEDStateDynamicColor = interface(ILEDStateColor)
['{9770E851-580D-4803-9979-0C608CB108A0}']
+ procedure Reset;
procedure Tick;
end;
diff --git a/G940LEDControl/Units/LEDColorPool.pas b/G940LEDControl/Units/LEDColorPool.pas
index b24ce5a..03a337d 100644
--- a/G940LEDControl/Units/LEDColorPool.pas
+++ b/G940LEDControl/Units/LEDColorPool.pas
@@ -8,13 +8,13 @@ uses
type
TLEDColorPool = class(TObject)
private
- FStates: array[TLEDColor] of ILEDColor;
+ FStates: array[TLEDColor] of ILEDStateColor;
protected
class function Instance: TLEDColorPool;
- function DoGetColor(AColor: TLEDColor): ILEDColor;
+ function DoGetColor(AColor: TLEDColor): ILEDStateColor;
public
- class function GetColor(AColor: TLEDColor): ILEDColor; overload;
+ class function GetColor(AColor: TLEDColor): ILEDStateColor; overload;
end;
@@ -31,7 +31,7 @@ var
{ TLEDStatePool }
-class function TLEDColorPool.GetColor(AColor: TLEDColor): ILEDColor;
+class function TLEDColorPool.GetColor(AColor: TLEDColor): ILEDStateColor;
begin
Result := Instance.DoGetColor(AColor);
end;
@@ -46,9 +46,9 @@ begin
end;
-function TLEDColorPool.DoGetColor(AColor: TLEDColor): ILEDColor;
+function TLEDColorPool.DoGetColor(AColor: TLEDColor): ILEDStateColor;
- function GetFlashingCycle(AColor: TLEDColor): TLEDColorDynArray;
+ function GetFlashingCycle(AColor: TLEDColor): TStaticLEDColorDynArray;
begin
SetLength(Result, 2);
Result[0] := AColor;
@@ -56,16 +56,16 @@ function TLEDColorPool.DoGetColor(AColor: TLEDColor): ILEDColor;
end;
var
- state: ILEDColor;
+ state: ILEDStateColor;
begin
if not Assigned(FStates[AColor]) then
begin
case AColor of
- lcOff: state := TStaticLEDColor.Create(lcOff);
- lcGreen: state := TStaticLEDColor.Create(lcGreen);
- lcAmber: state := TStaticLEDColor.Create(lcAmber);
- lcRed: state := TStaticLEDColor.Create(lcRed);
+ lcOff: state := TLEDStateStaticColor.Create(lcOff);
+ lcGreen: state := TLEDStateStaticColor.Create(lcGreen);
+ lcAmber: state := TLEDStateStaticColor.Create(lcAmber);
+ lcRed: state := TLEDStateStaticColor.Create(lcRed);
lcFlashingGreenFast: state := TDynamicLEDColor.Create(GetFlashingCycle(lcGreen), TICKINTERVAL_FAST);
lcFlashingGreenNormal: state := TDynamicLEDColor.Create(GetFlashingCycle(lcGreen), TICKINTERVAL_NORMAL);
diff --git a/G940LEDControl/Units/LEDFunctionMap.pas b/G940LEDControl/Units/LEDFunctionMap.pas
deleted file mode 100644
index 2b68e7a..0000000
--- a/G940LEDControl/Units/LEDFunctionMap.pas
+++ /dev/null
@@ -1,228 +0,0 @@
-unit LEDFunctionMap;
-
-interface
-uses
- Classes,
- SyncObjs,
-
- X2UtHashes;
-
-
-type
- TLEDState = (lsOff, lsGreen, lsAmber, lsRed, lsWarning, lsError);
- TLEDStateSet = set of TLEDState;
-
-
- TLEDFunctionMap = class(TObject)
- private
- FFunctions: TX2IIHash;
- public
- constructor Create;
- destructor Destroy; override;
-
- procedure Clear;
-
- procedure SetFunction(ALEDIndex, AFunction: Integer);
- function GetFunction(ALEDIndex: Integer): Integer;
-
- function HasFunction(AFunction: Integer): Boolean; overload;
- function HasFunction(AFunctions: array of Integer): Boolean; overload;
-
- function FindFirst(AFunction: Integer; out ALEDIndex: Integer): Boolean;
- function FindNext(AFunction: Integer; out ALEDIndex: Integer): Boolean;
- end;
-
-
- TLEDStateMap = class(TObject)
- private
- FStates: TX2IIHash;
- public
- constructor Create;
- destructor Destroy; override;
-
- procedure Clear;
-
- function GetState(ALEDIndex: Integer; ADefault: TLEDState = lsGreen): TLEDState;
- function SetState(ALEDIndex: Integer; AState: TLEDState): Boolean;
-
- function HasStates(AStates: TLEDStateSet): Boolean;
- function FindFirst(AStates: TLEDStateSet; out ALEDIndex: Integer; out AState: TLEDState): Boolean;
- function FindNext(AStates: TLEDStateSet; out ALEDIndex: Integer; out AState: TLEDState): Boolean;
- end;
-
-
-const
- FUNCTION_NONE = 0;
- FUNCTION_OFF = 1;
- FUNCTION_RED = 2;
- FUNCTION_AMBER = 3;
- FUNCTION_GREEN = 4;
-
- { Note: if this offset ever changes, make sure to write a conversion for
- existing configurations. And probably reserve a bit more. }
- FUNCTION_PROVIDER_OFFSET = FUNCTION_GREEN;
-
-
-implementation
-uses
- SysUtils;
-
-
-{ TLEDFunctionMap }
-constructor TLEDFunctionMap.Create;
-begin
- inherited;
-
- FFunctions := TX2IIHash.Create;
-end;
-
-
-destructor TLEDFunctionMap.Destroy;
-begin
- FreeAndNil(FFunctions);
-
- inherited;
-end;
-
-
-procedure TLEDFunctionMap.Clear;
-begin
- FFunctions.Clear;
-end;
-
-
-procedure TLEDFunctionMap.SetFunction(ALEDIndex, AFunction: Integer);
-begin
- FFunctions[ALEDIndex] := AFunction;
-end;
-
-
-function TLEDFunctionMap.GetFunction(ALEDIndex: Integer): Integer;
-begin
- Result := FFunctions[ALEDIndex];
-end;
-
-
-function TLEDFunctionMap.HasFunction(AFunctions: array of Integer): Boolean;
-var
- functionNo: Integer;
-
-begin
- Result := False;
-
- for functionNo in AFunctions do
- begin
- Result := HasFunction(functionNo);
- if Result then
- break;
- end;
-end;
-
-function TLEDFunctionMap.HasFunction(AFunction: Integer): Boolean;
-var
- ledIndex: Integer;
-
-begin
- Result := FindFirst(AFunction, ledIndex);
-end;
-
-
-function TLEDFunctionMap.FindFirst(AFunction: Integer; out ALEDIndex: Integer): Boolean;
-begin
- FFunctions.First;
- Result := FindNext(AFunction, ALEDIndex);
-end;
-
-
-function TLEDFunctionMap.FindNext(AFunction: Integer; out ALEDIndex: Integer): Boolean;
-begin
- Result := False;
-
- while FFunctions.Next do
- begin
- if FFunctions.CurrentValue = AFunction then
- begin
- ALEDIndex := FFunctions.CurrentKey;
- Result := True;
- break;
- end;
- end;
-end;
-
-
-{ TLEDStateMap }
-constructor TLEDStateMap.Create;
-begin
- inherited;
-
- FStates := TX2IIHash.Create;
-end;
-
-
-destructor TLEDStateMap.Destroy;
-begin
- FreeAndNil(FStates);
-
- inherited;
-end;
-
-
-procedure TLEDStateMap.Clear;
-begin
- FStates.Clear;
-end;
-
-
-function TLEDStateMap.GetState(ALEDIndex: Integer; ADefault: TLEDState): TLEDState;
-begin
- Result := ADefault;
- if FStates.Exists(ALEDIndex) then
- Result := TLEDState(FStates[ALEDIndex]);
-end;
-
-
-function TLEDStateMap.SetState(ALEDIndex: Integer; AState: TLEDState): Boolean;
-begin
- if FStates.Exists(ALEDIndex) then
- Result := (FStates[ALEDIndex] <> Ord(AState))
- else
- Result := True;
-
- if Result then
- FStates[ALEDIndex] := Ord(AState);
-end;
-
-
-function TLEDStateMap.HasStates(AStates: TLEDStateSet): Boolean;
-var
- ledIndex: Integer;
- state: TLEDState;
-
-begin
- Result := FindFirst(AStates, ledIndex, state);
-end;
-
-
-
-function TLEDStateMap.FindFirst(AStates: TLEDStateSet; out ALEDIndex: Integer; out AState: TLEDState): Boolean;
-begin
- FStates.First;
- Result := FindNext(AStates, ALEDIndex, AState);
-end;
-
-
-function TLEDStateMap.FindNext(AStates: TLEDStateSet; out ALEDIndex: Integer; out AState: TLEDState): Boolean;
-begin
- Result := False;
-
- while FStates.Next do
- if TLEDState(FStates.CurrentValue) in AStates then
- begin
- ALEDIndex := FStates.CurrentKey;
- AState := TLEDState(FStates.CurrentValue);
- Result := True;
- break;
- end;
-end;
-
-end.
diff --git a/G940LEDControl/Units/LEDState.pas b/G940LEDControl/Units/LEDState.pas
index 73a671f..cd3aace 100644
--- a/G940LEDControl/Units/LEDState.pas
+++ b/G940LEDControl/Units/LEDState.pas
@@ -33,12 +33,12 @@ type
TLEDStateWorker = class(TCustomLEDState, ILEDStateWorker)
private
- FColor: ILEDColor;
+ FColor: ILEDStateColor;
protected
{ ILEDStateWorker }
- function GetColor: ILEDColor;
+ function GetColor: ILEDStateColor;
public
- constructor Create(const AUID: string; AColor: ILEDColor);
+ constructor Create(const AUID: string; AColor: ILEDStateColor);
end;
@@ -83,7 +83,7 @@ end;
{ TLEDStateWorker }
-constructor TLEDStateWorker.Create(const AUID: string; AColor: ILEDColor);
+constructor TLEDStateWorker.Create(const AUID: string; AColor: ILEDStateColor);
begin
inherited Create(AUID);
@@ -91,7 +91,7 @@ begin
end;
-function TLEDStateWorker.GetColor: ILEDColor;
+function TLEDStateWorker.GetColor: ILEDStateColor;
begin
Result := FColor;
end;
diff --git a/G940LEDControl/Units/LEDStateConsumer.pas b/G940LEDControl/Units/LEDStateConsumer.pas
index c809a12..a791bc5 100644
--- a/G940LEDControl/Units/LEDStateConsumer.pas
+++ b/G940LEDControl/Units/LEDStateConsumer.pas
@@ -2,29 +2,22 @@ unit LEDStateConsumer;
interface
uses
+ System.Classes,
+
OtlComm,
OtlCommon,
OtlTaskControl,
- LEDFunctionMap,
- LEDStateProvider;
+ LEDColorIntf,
+ LEDFunctionIntf,
+ Profile;
const
- MSG_CLEAR_FUNCTIONS = 1001;
- MSG_SET_FUNCTION = 1002;
- MSG_INITIALIZE_PROVIDER = 1003;
- MSG_FINALIZE_PROVIDER = 1004;
- MSG_PROCESS_MESSAGES = 1005;
- MSG_FINALIZE = 1006;
+ TM_LOADPROFILE = 1001;
+ TM_TICK = 1002;
- MSG_PROVIDER_KILLED = 1007;
- MSG_RUN_IN_MAINTHREAD = 1008;
-
- MSG_CONSUMER_OFFSET = MSG_RUN_IN_MAINTHREAD;
-
- TIMER_PROCESSMESSAGES = 1001;
- TIMER_CONSUMER_OFFSET = TIMER_PROCESSMESSAGES;
+ TIMER_TICK = 101;
type
@@ -32,320 +25,219 @@ type
['{68B8F2F7-ED40-4078-9D99-503D7AFA068B}']
procedure Execute;
end;
-
- TLEDStateConsumer = class(TOmniWorker, ILEDStateConsumer)
+
+ TLEDStateConsumer = class(TOmniWorker)
private
- FFunctionMap: TLEDFunctionMap;
- FStateMap: TLEDStateMap;
- FProvider: TLEDStateProvider;
- FTimerSet: Boolean;
- FChanged: Boolean;
- FUpdateCount: Integer;
- FDestroying: Boolean;
+ FButtonWorkers: TInterfaceList;
+ FButtonColors: TInterfaceList;
+ FHasTickTimer: Boolean;
protected
- procedure MsgClearFunctions(var msg: TOmniMessage); message MSG_CLEAR_FUNCTIONS;
- procedure MsgSetFunction(var msg: TOmniMessage); message MSG_SET_FUNCTION;
- procedure MsgInitializeProvider(var msg: TOmniMessage); message MSG_INITIALIZE_PROVIDER;
- procedure MsgFinalizeProvider(var msg: TOmniMessage); message MSG_FINALIZE_PROVIDER;
- procedure MsgProcessMessages(var msg: TOmniMessage); message MSG_PROCESS_MESSAGES;
- procedure MsgFinalize(var msg: TOmniMessage); message MSG_FINALIZE;
-
+ function Initialize: Boolean; override;
procedure Cleanup; override;
- procedure InitializeProvider(AProviderClass: TLEDStateProviderClass);
- procedure FinalizeProvider;
+ function CreateWorker(AProfileButton: TProfileButton): ILEDFunctionWorker;
- procedure RunInMainThread(AExecutor: IRunInMainThread; AWait: Boolean = False);
- procedure InitializeLEDState; virtual;
- procedure ResetLEDState; virtual;
- procedure LEDStateChanged(ALEDIndex: Integer; AState: TLEDState); virtual;
+ property ButtonWorkers: TInterfaceList read FButtonWorkers;
+ property ButtonColors: TInterfaceList read FButtonColors;
+ property HasTickTimer: Boolean read FHasTickTimer;
+ protected
procedure Changed; virtual;
-
- { ILEDStateConsumer }
- function GetFunctionMap: TLEDFunctionMap;
- procedure SetStateByFunction(AFunction: Integer; AState: TLEDState);
-
- property Destroying: Boolean read FDestroying;
- property FunctionMap: TLEDFunctionMap read GetFunctionMap;
- property StateMap: TLEDStateMap read FStateMap;
- property Provider: TLEDStateProvider read FProvider;
- property UpdateCount: Integer read FUpdateCount write FUpdateCount;
- public
- constructor Create;
-
- procedure BeginUpdate;
- procedure EndUpdate;
+ procedure Update; virtual; abstract;
+ protected
+ procedure TMLoadProfile(var Msg: TOmniMessage); message TM_LOADPROFILE;
+ procedure TMTick(var Msg: TOmniMessage); message TM_TICK;
end;
- procedure ClearFunctions(AConsumer: IOmniTaskControl);
- procedure SetFunction(AConsumer: IOmniTaskControl; ALEDIndex, AFunction: Integer);
- procedure InitializeStateProvider(AConsumer: IOmniTaskControl; AProviderClass: TLEDStateProviderClass);
- procedure FinalizeStateProvider(AConsumer: IOmniTaskControl);
- procedure Finalize(AConsumer: IOmniTaskControl);
-
-
implementation
uses
- SysUtils,
- Windows;
+ System.SysUtils,
+ Winapi.Windows,
+
+ LEDFunctionRegistry,
+ LEDStateIntf;
const
- G940_LED_COUNT = 8;
+ INTERVAL_TICK = 500;
+
+
+type
+ TProfileButtonWorkerSettings = class(TInterfacedObject, ILEDFunctionWorkerSettings)
+ private
+ FProfileButton: TProfileButton;
+ protected
+ { ILEDFunctionWorkerSettings }
+ function GetStateColor(const AUID: string; out AColor: TLEDColor): Boolean;
+
+ property ProfileButton: TProfileButton read FProfileButton;
+ public
+ constructor Create(AProfileButton: TProfileButton);
+ end;
{ TLEDStateConsumer }
-constructor TLEDStateConsumer.Create;
+function TLEDStateConsumer.Initialize: Boolean;
begin
- inherited;
+ Result := inherited Initialize;
+ if not Result then
+ exit;
- FFunctionMap := TLEDFunctionMap.Create;
- FStateMap := TLEDStateMap.Create;
-
- InitializeLEDState;
+ FButtonWorkers := TInterfaceList.Create;
+ FButtonColors := TInterfaceList.Create;
end;
procedure TLEDStateConsumer.Cleanup;
begin
- inherited;
+ FreeAndNil(FButtonColors);
+ FreeAndNil(FButtonWorkers);
- FreeAndNil(FStateMap);
- FreeAndNil(FFunctionMap);
+ inherited Cleanup;
end;
-procedure TLEDStateConsumer.BeginUpdate;
-begin
- if FUpdateCount = 0 then
- FChanged := False;
-
- Inc(FUpdateCount);
-end;
-
-
-procedure TLEDStateConsumer.EndUpdate;
-begin
- if FUpdateCount > 0 then
- Dec(FUpdateCount);
-
- if (FUpdateCount = 0) and FChanged then
- Changed;
-end;
-
-
-function TLEDStateConsumer.GetFunctionMap: TLEDFunctionMap;
-begin
- Result := FFunctionMap;
-end;
-
-
-procedure TLEDStateConsumer.SetStateByFunction(AFunction: Integer; AState: TLEDState);
+function TLEDStateConsumer.CreateWorker(AProfileButton: TProfileButton): ILEDFunctionWorker;
var
- ledIndex: Integer;
+ provider: ILEDFunctionProvider;
+ ledFunction: ILEDFunction;
begin
- if FunctionMap.FindFirst(AFunction, ledIndex) then
- repeat
- if StateMap.SetState(ledIndex, AState) then
- LEDStateChanged(ledIndex, AState);
- until not FunctionMap.FindNext(AFunction, ledIndex);
-end;
+ Result := nil;
-
-
-procedure TLEDStateConsumer.MsgClearFunctions(var msg: TOmniMessage);
-begin
- FunctionMap.Clear;
-end;
-
-
-procedure TLEDStateConsumer.MsgSetFunction(var msg: TOmniMessage);
-var
- values: TOmniValueContainer;
-
-begin
- values := msg.MsgData.AsArray;
- FunctionMap.SetFunction(values[0], values[1]);
-end;
-
-
-procedure TLEDStateConsumer.MsgInitializeProvider(var msg: TOmniMessage);
-begin
- InitializeProvider(TLEDStateProviderClass(msg.MsgData.AsPointer));
-end;
-
-
-procedure TLEDStateConsumer.MsgFinalizeProvider(var msg: TOmniMessage);
-begin
- FinalizeProvider;
-end;
-
-
-procedure TLEDStateConsumer.MsgProcessMessages(var msg: TOmniMessage);
-begin
- BeginUpdate;
- try
- Provider.ProcessMessages;
-
- if Provider.Terminated then
- begin
- FinalizeProvider;
- Task.Comm.Send(MSG_PROVIDER_KILLED, '');
- end;
- finally
- EndUpdate;
- end;
-end;
-
-
-procedure TLEDStateConsumer.MsgFinalize(var msg: TOmniMessage);
-begin
- FDestroying := True;
- FinalizeProvider;
- Task.Terminate;
-end;
-
-
-procedure TLEDStateConsumer.InitializeProvider(AProviderClass: TLEDStateProviderClass);
-begin
- FinalizeProvider;
-
- FProvider := AProviderClass.Create(Self);
- try
- Provider.Initialize;
-
- if Provider.ProcessMessagesInterval > -1 then
- begin
- Task.SetTimer(TIMER_PROCESSMESSAGES, Provider.ProcessMessagesInterval, MSG_PROCESS_MESSAGES);
- FTimerSet := True;
- end;
-
- InitializeLEDState;
- except
- on E:Exception do
- begin
- FProvider := nil;
- Task.Comm.Send(MSG_PROVIDER_KILLED, E.Message);
- end;
- end;
-end;
-
-
-procedure TLEDStateConsumer.FinalizeProvider;
-begin
- if Assigned(Provider) then
+ provider := TLEDFunctionRegistry.Find(AProfileButton.ProviderUID);
+ if Assigned(provider) then
begin
- if FTimerSet then
- begin
- Task.ClearTimer(TIMER_PROCESSMESSAGES);
- FTimerSet := False;
- end;
-
- Provider.Terminate;
- Provider.Finalize;
- FreeAndNil(FProvider);
-
- StateMap.Clear;
- ResetLEDState;
+ ledFunction := provider.Find(AProfileButton.FunctionUID);
+ if Assigned(ledFunction) then
+ Result := ledFunction.CreateWorker(TProfileButtonWorkerSettings.Create(AProfileButton));
end;
end;
-procedure TLEDStateConsumer.RunInMainThread(AExecutor: IRunInMainThread; AWait: Boolean);
-begin
- Task.Comm.Send(MSG_RUN_IN_MAINTHREAD, AExecutor);
- if AWait then
- AExecutor.WaitFor(INFINITE);
-end;
-
-
-procedure TLEDStateConsumer.InitializeLEDState;
-var
- ledIndex: Integer;
- state: TLEDState;
- newState: TLEDState;
-
-begin
- BeginUpdate;
- try
- ResetLEDState;
-
- for ledIndex := 0 to Pred(G940_LED_COUNT) do
- begin
- state := StateMap.GetState(ledIndex, lsGreen);
- newState := state;
-
- case FunctionMap.GetFunction(ledIndex) of
- FUNCTION_OFF: newState := lsOff;
- FUNCTION_RED: newState := lsRed;
- FUNCTION_AMBER: newState := lsAmber;
- FUNCTION_GREEN: newState := lsGreen;
- end;
-
- if state <> newState then
- LEDStateChanged(ledIndex, newState);
- end;
- finally
- EndUpdate;
- end;
-end;
-
-
-procedure TLEDStateConsumer.ResetLEDState;
-begin
- if UpdateCount = 0 then
- Changed
- else
- FChanged := True;
-end;
-
-
-procedure TLEDStateConsumer.LEDStateChanged(ALEDIndex: Integer; AState: TLEDState);
-begin
- if UpdateCount = 0 then
- Changed
- else
- FChanged := True;
-end;
-
-
procedure TLEDStateConsumer.Changed;
+var
+ hasDynamicColors: Boolean;
+ buttonIndex: Integer;
+ state: ILEDStateWorker;
+ color: ILEDStateColor;
+ dynamicColor: ILEDStateDynamicColor;
+
begin
- FChanged := False;
+ hasDynamicColors := False;
+ ButtonColors.Clear;
+
+ for buttonIndex := 0 to Pred(ButtonWorkers.Count) do
+ begin
+ color := nil;
+
+ if Assigned(ButtonWorkers[buttonIndex]) then
+ begin
+ state := (ButtonWorkers[buttonIndex] as ILEDFunctionWorker).GetCurrentState;
+ if Assigned(state) then
+ begin
+ color := state.GetColor;
+ if Assigned(color) then
+ begin
+ if (hasDynamicColors = False) and Supports(color, ILEDStateDynamicColor, dynamicColor) then
+ begin
+ { If the tick timer isn't currently running, there were no
+ dynamic colors before. Reset each dynamic colors now. }
+ if not HasTickTimer then
+ dynamicColor.Reset;
+
+ hasDynamicColors := True;
+ end;
+
+ ButtonColors.Add(color as ILEDStateColor);
+ end;
+ end;
+ end;
+
+ if not Assigned(color) then
+ ButtonColors.Add(nil);
+ end;
+
+ if hasDynamicColors <> HasTickTimer then
+ begin
+ if hasDynamicColors then
+ Task.SetTimer(TIMER_TICK, INTERVAL_TICK, TM_TICK)
+ else
+ Task.ClearTimer(TIMER_TICK);
+ end;
+
+ Update;
end;
-{ Helpers }
-procedure ClearFunctions(AConsumer: IOmniTaskControl);
+procedure TLEDStateConsumer.TMLoadProfile(var Msg: TOmniMessage);
+var
+ profile: TProfile;
+ buttonIndex: Integer;
+
begin
- AConsumer.Comm.Send(MSG_CLEAR_FUNCTIONS);
+ profile := Msg.MsgData;
+ ButtonWorkers.Clear;
+
+ for buttonIndex := 0 to Pred(profile.ButtonCount) do
+ begin
+ if profile.HasButton(buttonIndex) then
+ ButtonWorkers.Add(CreateWorker(profile.Buttons[buttonIndex]) as ILEDFunctionWorker)
+ else
+ ButtonWorkers.Add(nil);
+ end;
+
+ Changed;
end;
-procedure SetFunction(AConsumer: IOmniTaskControl; ALEDIndex, AFunction: Integer);
+procedure TLEDStateConsumer.TMTick(var Msg: TOmniMessage);
+var
+ buttonIndex: Integer;
+ checkButtonIndex: Integer;
+ alreadyTicked: Boolean;
+ color: ILEDStateColor;
+ dynamicColor: ILEDStateDynamicColor;
+
begin
- AConsumer.Comm.Send(MSG_SET_FUNCTION, [ALEDIndex, AFunction]);
+ // (MvR) 19-2-2013: I could pass a tick count to Tick() so that they can all use modulus to blink synchronously... think about it.
+
+ for buttonIndex := 0 to Pred(ButtonColors.Count) do
+ begin
+ alreadyTicked := False;
+ color := (ButtonColors[buttonIndex] as ILEDStateColor);
+
+ if Supports(color, ILEDStateDynamicColor, dynamicColor) then
+ begin
+ { Check if this color has already been ticked }
+ for checkButtonIndex := Pred(buttonIndex) downto 0 do
+ if (ButtonColors[checkButtonIndex] as ILEDStateColor) = color then
+ begin
+ alreadyTicked := True;
+ break;
+ end;
+
+ if not alreadyTicked then
+ dynamicColor.Tick;
+ end;
+ end;
+
+ Update;
end;
-procedure InitializeStateProvider(AConsumer: IOmniTaskControl; AProviderClass: TLEDStateProviderClass);
+{ TProfileButtonWorkerSettings }
+constructor TProfileButtonWorkerSettings.Create(AProfileButton: TProfileButton);
begin
- AConsumer.Comm.Send(MSG_INITIALIZE_PROVIDER, Pointer(AProviderClass));
+ inherited Create;
+
+ FProfileButton := AProfileButton;
end;
-
-procedure FinalizeStateProvider(AConsumer: IOmniTaskControl);
+function TProfileButtonWorkerSettings.GetStateColor(const AUID: string; out AColor: TLEDColor): Boolean;
begin
- AConsumer.Comm.Send(MSG_FINALIZE_PROVIDER);
-end;
-
-
-procedure Finalize(AConsumer: IOmniTaskControl);
-begin
- AConsumer.Comm.Send(MSG_FINALIZE);
+ Result := ProfileButton.GetStateColor(AUID, AColor);
end;
end.
diff --git a/G940LEDControl/Units/LEDStateIntf.pas b/G940LEDControl/Units/LEDStateIntf.pas
index 357a6e5..ad40fa1 100644
--- a/G940LEDControl/Units/LEDStateIntf.pas
+++ b/G940LEDControl/Units/LEDStateIntf.pas
@@ -21,7 +21,7 @@ type
ILEDStateWorker = interface(ICustomLEDState)
['{0361CBD5-E64E-4972-A8A4-D5FE0B0DFB1C}']
- function GetColor: ILEDColor;
+ function GetColor: ILEDStateColor;
end;
diff --git a/G940LEDControl/Units/LEDStateProvider.pas b/G940LEDControl/Units/LEDStateProvider.pas
deleted file mode 100644
index ba81459..0000000
--- a/G940LEDControl/Units/LEDStateProvider.pas
+++ /dev/null
@@ -1,127 +0,0 @@
-unit LEDStateProvider;
-
-interface
-uses
- Classes,
- SyncObjs,
- SysUtils,
-
- LEDFunctionMap;
-
-type
- EInitializeError = class(Exception);
-
- ILEDStateConsumer = interface
- ['{6E630C92-7C5C-4D16-8BED-AE27559FA584}']
- function GetFunctionMap: TLEDFunctionMap;
- procedure SetStateByFunction(AFunction: Integer; AState: TLEDState);
-
- property FunctionMap: TLEDFunctionMap read GetFunctionMap;
- end;
-
-
- IFunctionConsumer = interface
- ['{97B47A29-BA7F-4C48-934D-EB66D2741647}']
- procedure SetCategory(const ACategory: string);
- procedure AddFunction(AFunction: Integer; const ADescription: string);
- end;
-
-
- TLEDStateProvider = class(TObject)
- private
- FConsumer: ILEDStateConsumer;
- FTerminated: Boolean;
- protected
- procedure Execute; virtual; abstract;
-
- function GetProcessMessagesInterval: Integer; virtual;
-
- property Consumer: ILEDStateConsumer read FConsumer;
- public
- class procedure EnumFunctions(AConsumer: IFunctionConsumer); virtual;
-
- constructor Create(AConsumer: ILEDStateConsumer); virtual;
- destructor Destroy; override;
-
- procedure Initialize; virtual;
- procedure Finalize; virtual;
- procedure ProcessMessages; virtual;
-
- procedure Terminate; virtual;
-
- property ProcessMessagesInterval: Integer read GetProcessMessagesInterval;
- property Terminated: Boolean read FTerminated;
- end;
-
- TLEDStateProviderClass = class of TLEDStateProvider;
-
-
-const
- EXIT_SUCCESS = 0;
- EXIT_ERROR = 1;
-
- EXIT_CONSUMER_OFFSET = 100;
- EXIT_PROVIDER_OFFSET = 200;
-
-implementation
-const
- CATEGORY_STATIC = 'Static';
-
- FUNCTION_DESC_OFF = 'Light off';
- FUNCTION_DESC_GREEN = 'Green';
- FUNCTION_DESC_AMBER = 'Amber';
- FUNCTION_DESC_RED = 'Red';
-
-
-{ TCustomLEDStateProvider }
-class procedure TLEDStateProvider.EnumFunctions(AConsumer: IFunctionConsumer);
-begin
- AConsumer.SetCategory(CATEGORY_STATIC);
- AConsumer.AddFunction(FUNCTION_OFF, FUNCTION_DESC_OFF);
- AConsumer.AddFunction(FUNCTION_GREEN, FUNCTION_DESC_GREEN);
- AConsumer.AddFunction(FUNCTION_AMBER, FUNCTION_DESC_AMBER);
- AConsumer.AddFunction(FUNCTION_RED, FUNCTION_DESC_RED);
-end;
-
-
-constructor TLEDStateProvider.Create(AConsumer: ILEDStateConsumer);
-begin
- inherited Create;
-
- FConsumer := AConsumer;
-end;
-
-
-destructor TLEDStateProvider.Destroy;
-begin
- inherited;
-end;
-
-
-procedure TLEDStateProvider.Initialize;
-begin
-end;
-
-
-procedure TLEDStateProvider.Finalize;
-begin
-end;
-
-
-procedure TLEDStateProvider.ProcessMessages;
-begin
-end;
-
-
-procedure TLEDStateProvider.Terminate;
-begin
- FTerminated := True;
-end;
-
-
-function TLEDStateProvider.GetProcessMessagesInterval: Integer;
-begin
- Result := -1;
-end;
-
-end.
diff --git a/G940LEDControl/Units/Profile.pas b/G940LEDControl/Units/Profile.pas
index 96c8ea3..66eb916 100644
--- a/G940LEDControl/Units/Profile.pas
+++ b/G940LEDControl/Units/Profile.pas
@@ -3,6 +3,7 @@ unit Profile;
interface
uses
Generics.Collections,
+ System.Classes,
X2UtPersistIntf,
@@ -12,7 +13,7 @@ uses
type
TProfileButtonStateColors = TDictionary;
- TProfileButton = class(TObject)
+ TProfileButton = class(TPersistent)
private
FProviderUID: string;
FFunctionUID: string;
@@ -39,7 +40,7 @@ type
TProfileButtonList = class(TObjectList);
- TProfile = class(TObject)
+ TProfile = class(TPersistent)
private
FName: string;
FButtons: TProfileButtonList;
@@ -71,8 +72,7 @@ type
implementation
uses
- Classes,
- SysUtils,
+ System.SysUtils,
LEDResources;
diff --git a/G940LEDControl/Units/StaticLEDColor.pas b/G940LEDControl/Units/StaticLEDColor.pas
index ecabd62..59f8464 100644
--- a/G940LEDControl/Units/StaticLEDColor.pas
+++ b/G940LEDControl/Units/StaticLEDColor.pas
@@ -7,13 +7,13 @@ uses
type
- TStaticLEDColor = class(TCustomLEDColor)
+ TLEDStateStaticColor = class(TCustomLEDStateColor)
private
- FColor: TLEDColor;
+ FColor: TStaticLEDColor;
protected
- function GetColor: TLEDColor; override;
+ function GetCurrentColor: TStaticLEDColor; override;
public
- constructor Create(AColor: TLEDColor);
+ constructor Create(AColor: TStaticLEDColor);
end;
@@ -21,7 +21,7 @@ implementation
{ TStaticLEDState }
-constructor TStaticLEDColor.Create(AColor: TLEDColor);
+constructor TLEDStateStaticColor.Create(AColor: TStaticLEDColor);
begin
inherited Create;
@@ -29,7 +29,7 @@ begin
end;
-function TStaticLEDColor.GetColor: TLEDColor;
+function TLEDStateStaticColor.GetCurrentColor: TStaticLEDColor;
begin
Result := FColor;
end;