1
0
mirror of synced 2024-11-05 02:59:16 +00:00

Added: start of configuration conversion

Added: registration of states
Added: prototype FSX function implemention
- subject to change; separation of definition and running state will be added later
This commit is contained in:
Mark van Renswoude 2013-02-14 21:45:25 +00:00
parent b1035c6db2
commit 32f411c1b8
12 changed files with 546 additions and 158 deletions

View File

@ -32,12 +32,8 @@ object MainForm: TMainForm
ActivePage = tsFSX
Align = alClient
TabOrder = 1
ExplicitWidth = 390
ExplicitHeight = 510
object tsFSX: TTabSheet
Caption = 'Configuration'
ExplicitWidth = 382
ExplicitHeight = 482
DesignSize = (
441
446)
@ -346,7 +342,6 @@ object MainForm: TMainForm
Anchors = [akTop, akRight]
Caption = 'Save as...'
TabOrder = 9
ExplicitLeft = 340
end
object btnDeleteProfile: TButton
Left = 364
@ -356,12 +351,13 @@ object MainForm: TMainForm
Anchors = [akTop, akRight]
Caption = 'Delete'
TabOrder = 10
ExplicitLeft = 421
end
end
object tsAbout: TTabSheet
Caption = 'About'
ImageIndex = 1
ExplicitLeft = 0
ExplicitTop = 0
ExplicitWidth = 382
ExplicitHeight = 482
object lblVersionCaption: TLabel
@ -479,7 +475,6 @@ object MainForm: TMainForm
Align = alTop
BevelOuter = bvNone
TabOrder = 0
ExplicitWidth = 390
DesignSize = (
449
64)
@ -861,7 +856,6 @@ object MainForm: TMainForm
TabOrder = 0
Visible = False
OnClick = btnRetryClick
ExplicitLeft = 315
end
end
end

View File

@ -175,7 +175,7 @@ uses
LEDColorIntf,
LEDFunctionIntf,
LEDFunctionRegistry,
StaticLEDFunction;
StaticResources;
{$R *.dfm}
@ -192,11 +192,6 @@ const
TEXT_STATE_NOTFOUND = 'Not found';
TEXT_STATE_FOUND = 'Connected';
KEY_SETTINGS = '\Software\X2Software\G940LEDControl\';
SECTION_DEFAULTPROFILE = 'DefaultProfile';
SECTION_FSX = 'FSX';
SECTION_SETTINGS = 'Settings';
type
TComboBoxFunctionConsumer = class(TInterfacedObject, IFunctionConsumer)
@ -306,7 +301,7 @@ begin
if not FileExists(FProfilesFilename) then
begin
{ Check if version 0.x settings are in the registry }
defaultProfile := ConfigConversion.Convert0To1;
defaultProfile := ConfigConversion.ConvertProfile0To1;
if not Assigned(defaultProfile) then
defaultProfile := CreateDefaultProfile;
@ -519,61 +514,6 @@ end;
//end;
//procedure TMainForm.LoadDefaultProfile;
//var
// registryReader: TX2UtPersistRegistry;
// reader: IX2PersistReader;
//
//begin
// registryReader := TX2UtPersistRegistry.Create;
// try
// registryReader.RootKey := HKEY_CURRENT_USER;
// registryReader.Key := KEY_SETTINGS;
//
// reader := registryReader.CreateReader;
//
// if reader.BeginSection(SECTION_DEFAULTPROFILE) then
// try
// ReadFunctions(reader, FFSXComboBoxes);
// ReadFSXExtra(reader);
// finally
// reader.EndSection;
// end;
//
// ReadAutoUpdate(reader);
// finally
// FreeAndNil(registryReader);
// end;
//end;
//
//
//procedure TMainForm.SaveDefaultProfile;
//var
// registryWriter: TX2UtPersistRegistry;
// writer: IX2PersistWriter;
//
//begin
// registryWriter := TX2UtPersistRegistry.Create;
// try
// registryWriter.RootKey := HKEY_CURRENT_USER;
// registryWriter.Key := KEY_SETTINGS;
//
// writer := registryWriter.CreateWriter;
// if writer.BeginSection(SECTION_DEFAULTPROFILE) then
// try
// WriteFunctions(writer, FFSXComboBoxes);
// WriteFSXExtra(writer);
// finally
// writer.EndSection;
// end;
//
// WriteAutoUpdate(writer);
// finally
// FreeAndNil(registryWriter);
// end;
//end;
//procedure TMainForm.InitializeStateProvider(AProviderClass: TLEDStateProviderClass);
//begin
// UpdateMapping;

View File

@ -25,7 +25,11 @@ uses
LEDState in 'Units\LEDState.pas',
Profile in 'Units\Profile.pas',
LEDColorPool in 'Units\LEDColorPool.pas',
ButtonFunctionFrm in 'Forms\ButtonFunctionFrm.pas' {ButtonFunctionForm};
ButtonFunctionFrm in 'Forms\ButtonFunctionFrm.pas' {ButtonFunctionForm},
FSXLEDFunction in 'Units\FSXLEDFunction.pas',
StaticResources in 'Units\StaticResources.pas',
FSXResources in 'Units\FSXResources.pas',
FSXSimConnectClient in 'Units\FSXSimConnectClient.pas';
{$R *.res}

View File

@ -191,6 +191,10 @@
<Form>ButtonFunctionForm</Form>
<FormType>dfm</FormType>
</DCCReference>
<DCCReference Include="Units\FSXLEDFunction.pas"/>
<DCCReference Include="Units\StaticResources.pas"/>
<DCCReference Include="Units\FSXResources.pas"/>
<DCCReference Include="Units\FSXSimConnectClient.pas"/>
<BuildConfiguration Include="Debug">
<Key>Cfg_2</Key>
<CfgParent>Base</CfgParent>

View File

@ -5,59 +5,167 @@ uses
Profile;
{ Version 0.x: registry -> 1.x: XML }
function Convert0To1: TProfile;
function ConvertProfile0To1: TProfile;
implementation
uses
System.SysUtils,
Winapi.Windows,
X2UtPersistIntf,
X2UtPersistRegistry,
LEDColorIntf,
StaticResources;
const
V0_FUNCTION_NONE = 0;
V0_FUNCTION_OFF = 1;
V0_FUNCTION_RED = 2;
V0_FUNCTION_AMBER = 3;
V0_FUNCTION_GREEN = 4;
V0_FUNCTIONPROVIDER_OFFSET = V0_FUNCTION_GREEN;
V0_FUNCTIONFSX_GEAR = V0_FUNCTIONPROVIDER_OFFSET + 1;
V0_FUNCTIONFSX_LANDINGLIGHTS = V0_FUNCTIONPROVIDER_OFFSET + 2;
V0_FUNCTIONFSX_INSTRUMENTLIGHTS = V0_FUNCTIONPROVIDER_OFFSET + 3;
V0_FUNCTIONFSX_PARKINGBRAKE = V0_FUNCTIONPROVIDER_OFFSET + 4;
V0_FUNCTIONFSX_ENGINE = V0_FUNCTIONPROVIDER_OFFSET + 5;
V0_FUNCTIONFSX_EXITDOOR = V0_FUNCTIONPROVIDER_OFFSET + 6;
V0_FUNCTIONFSX_STROBELIGHTS = V0_FUNCTIONPROVIDER_OFFSET + 7;
V0_FUNCTIONFSX_NAVLIGHTS = V0_FUNCTIONPROVIDER_OFFSET + 8;
V0_FUNCTIONFSX_BEACONLIGHTS = V0_FUNCTIONPROVIDER_OFFSET + 9;
V0_FUNCTIONFSX_FLAPS = V0_FUNCTIONPROVIDER_OFFSET + 10;
V0_FUNCTIONFSX_BATTERYMASTER = V0_FUNCTIONPROVIDER_OFFSET + 11;
V0_FUNCTIONFSX_AVIONICSMASTER = V0_FUNCTIONPROVIDER_OFFSET + 12;
V0_FUNCTIONFSX_SPOILERS = V0_FUNCTIONPROVIDER_OFFSET + 13;
V0_FUNCTIONFSX_PRESSURIZATIONDUMPSWITCH = V0_FUNCTIONPROVIDER_OFFSET + 14;
V0_FUNCTIONFSX_CARBHEAT = V0_FUNCTIONPROVIDER_OFFSET + 15;
V0_FUNCTIONFSX_AUTOPILOT = V0_FUNCTIONPROVIDER_OFFSET + 16;
V0_FUNCTIONFSX_FUELPUMP = V0_FUNCTIONPROVIDER_OFFSET + 17;
V0_FUNCTIONFSX_TAILHOOK = V0_FUNCTIONPROVIDER_OFFSET + 18;
V0_FUNCTIONFSX_AUTOPILOT_AMBER = V0_FUNCTIONPROVIDER_OFFSET + 19;
V0_FUNCTIONFSX_AUTOPILOT_HEADING = V0_FUNCTIONPROVIDER_OFFSET + 20;
V0_FUNCTIONFSX_AUTOPILOT_APPROACH = V0_FUNCTIONPROVIDER_OFFSET + 21;
V0_FUNCTIONFSX_AUTOPILOT_BACKCOURSE = V0_FUNCTIONPROVIDER_OFFSET + 22;
V0_FUNCTIONFSX_AUTOPILOT_ALTITUDE = V0_FUNCTIONPROVIDER_OFFSET + 23;
V0_FUNCTIONFSX_AUTOPILOT_NAV = V0_FUNCTIONPROVIDER_OFFSET + 24;
V0_FUNCTIONFSX_TAXILIGHTS = V0_FUNCTIONPROVIDER_OFFSET + 25;
V0_FUNCTIONFSX_RECOGNITIONLIGHTS = V0_FUNCTIONPROVIDER_OFFSET + 26;
procedure ConvertProfileFunction0To1(AOldFunction: Integer; AButton: TProfileButton);
procedure SetButton(const AProviderUID, AFunctionUID: string);
begin
AButton.ProviderUID := AProviderUID;
AButton.FunctionUID := AFunctionUID;
end;
begin
case AOldFunction of
{ Static }
V0_FUNCTION_OFF: SetButton(StaticProviderUID, StaticFunctionUID[lcOff]);
V0_FUNCTION_RED: SetButton(StaticProviderUID, StaticFunctionUID[lcRed]);
V0_FUNCTION_AMBER: SetButton(StaticProviderUID, StaticFunctionUID[lcAmber]);
V0_FUNCTION_GREEN: SetButton(StaticProviderUID, StaticFunctionUID[lcGreen]);
{ FSX }
{
V0_FUNCTIONFSX_GEAR:
V0_FUNCTIONFSX_LANDINGLIGHTS:
V0_FUNCTIONFSX_INSTRUMENTLIGHTS:
V0_FUNCTIONFSX_PARKINGBRAKE:
V0_FUNCTIONFSX_ENGINE:
V0_FUNCTIONFSX_EXITDOOR:
V0_FUNCTIONFSX_STROBELIGHTS:
V0_FUNCTIONFSX_NAVLIGHTS:
V0_FUNCTIONFSX_BEACONLIGHTS:
V0_FUNCTIONFSX_FLAPS:
V0_FUNCTIONFSX_BATTERYMASTER:
V0_FUNCTIONFSX_AVIONICSMASTER:
V0_FUNCTIONFSX_SPOILERS:
V0_FUNCTIONFSX_PRESSURIZATIONDUMPSWITCH:
V0_FUNCTIONFSX_CARBHEAT:
V0_FUNCTIONFSX_AUTOPILOT:
V0_FUNCTIONFSX_FUELPUMP:
V0_FUNCTIONFSX_TAILHOOK:
V0_FUNCTIONFSX_AUTOPILOT_AMBER:
V0_FUNCTIONFSX_AUTOPILOT_HEADING:
V0_FUNCTIONFSX_AUTOPILOT_APPROACH:
V0_FUNCTIONFSX_AUTOPILOT_BACKCOURSE:
V0_FUNCTIONFSX_AUTOPILOT_ALTITUDE:
V0_FUNCTIONFSX_AUTOPILOT_NAV:
V0_FUNCTIONFSX_TAXILIGHTS:
V0_FUNCTIONFSX_RECOGNITIONLIGHTS:
}
else
SetButton(StaticProviderUID, StaticFunctionUID[lcGreen]);
end;
end;
function ConvertProfile0To1: TProfile;
const
KEY_SETTINGS = '\Software\X2Software\G940LEDControl\';
SECTION_DEFAULTPROFILE = 'DefaultProfile';
SECTION_FSX = 'FSX';
SECTION_SETTINGS = 'Settings';
var
registryReader: TX2UtPersistRegistry;
reader: IX2PersistReader;
buttonIndex: Integer;
value: Integer;
function Convert0To1: TProfile;
begin
Result := nil;
registryReader := TX2UtPersistRegistry.Create;
try
registryReader.RootKey := HKEY_CURRENT_USER;
registryReader.Key := KEY_SETTINGS;
reader := registryReader.CreateReader;
// FUNCTION_NONE = 0;
// FUNCTION_OFF = 1;
// FUNCTION_RED = 2;
// FUNCTION_AMBER = 3;
// FUNCTION_GREEN = 4;
if reader.BeginSection(SECTION_DEFAULTPROFILE) then
try
if reader.BeginSection(SECTION_FSX) then
try
for buttonIndex := 0 to 7 do
begin
if reader.ReadInteger('Function' + IntToStr(buttonIndex), value) then
begin
if not Assigned(Result) then
Result := TProfile.Create;
{
FUNCTION_PROVIDER_OFFSET = 4
ConvertProfileFunction0To1(value, Result.Buttons[buttonIndex]);
end;
end;
finally
reader.EndSection;
end;
finally
reader.EndSection;
end;
FUNCTION_FSX_GEAR = FUNCTION_PROVIDER_OFFSET + 1;
FUNCTION_FSX_LANDINGLIGHTS = FUNCTION_PROVIDER_OFFSET + 2;
FUNCTION_FSX_INSTRUMENTLIGHTS = FUNCTION_PROVIDER_OFFSET + 3;
FUNCTION_FSX_PARKINGBRAKE = FUNCTION_PROVIDER_OFFSET + 4;
FUNCTION_FSX_ENGINE = FUNCTION_PROVIDER_OFFSET + 5;
FUNCTION_FSX_EXITDOOR = FUNCTION_PROVIDER_OFFSET + 6;
FUNCTION_FSX_STROBELIGHTS = FUNCTION_PROVIDER_OFFSET + 7;
FUNCTION_FSX_NAVLIGHTS = FUNCTION_PROVIDER_OFFSET + 8;
FUNCTION_FSX_BEACONLIGHTS = FUNCTION_PROVIDER_OFFSET + 9;
FUNCTION_FSX_FLAPS = FUNCTION_PROVIDER_OFFSET + 10;
FUNCTION_FSX_BATTERYMASTER = FUNCTION_PROVIDER_OFFSET + 11;
FUNCTION_FSX_AVIONICSMASTER = FUNCTION_PROVIDER_OFFSET + 12;
FUNCTION_FSX_SPOILERS = FUNCTION_PROVIDER_OFFSET + 13;
FUNCTION_FSX_PRESSURIZATIONDUMPSWITCH = FUNCTION_PROVIDER_OFFSET + 14;
FUNCTION_FSX_CARBHEAT = FUNCTION_PROVIDER_OFFSET + 15;
FUNCTION_FSX_AUTOPILOT = FUNCTION_PROVIDER_OFFSET + 16;
FUNCTION_FSX_FUELPUMP = FUNCTION_PROVIDER_OFFSET + 17;
FUNCTION_FSX_TAILHOOK = FUNCTION_PROVIDER_OFFSET + 18;
FUNCTION_FSX_AUTOPILOT_AMBER = FUNCTION_PROVIDER_OFFSET + 19;
FUNCTION_FSX_AUTOPILOT_HEADING = FUNCTION_PROVIDER_OFFSET + 20;
FUNCTION_FSX_AUTOPILOT_APPROACH = FUNCTION_PROVIDER_OFFSET + 21;
FUNCTION_FSX_AUTOPILOT_BACKCOURSE = FUNCTION_PROVIDER_OFFSET + 22;
FUNCTION_FSX_AUTOPILOT_ALTITUDE = FUNCTION_PROVIDER_OFFSET + 23;
FUNCTION_FSX_AUTOPILOT_NAV = FUNCTION_PROVIDER_OFFSET + 24;
FUNCTION_FSX_TAXILIGHTS = FUNCTION_PROVIDER_OFFSET + 25;
FUNCTION_FSX_RECOGNITIONLIGHTS = FUNCTION_PROVIDER_OFFSET + 26;
}
// TODO auto update settings
//ReadAutoUpdate(reader);
finally
FreeAndNil(registryReader);
end;
end;
end.

View File

@ -0,0 +1,231 @@
unit FSXLEDFunction;
interface
uses
Generics.Collections,
LEDFunction,
LEDStateIntf,
ObserverIntf;
type
TCustomFSXFunction = class;
TCustomFSXFunctionList = TObjectList<TCustomFSXFunction>;
TFSXLEDFunctionProvider = class(TCustomLEDFunctionProvider)
private
FConnectedFunctions: TCustomFSXFunctionList;
FSimConnectHandle: THandle;
protected
procedure SimConnect;
procedure SimDisconnect;
procedure Connect(AFunction: TCustomFSXFunction); virtual;
procedure Disconnect(AFunction: TCustomFSXFunction); virtual;
property ConnectedFunctions: TCustomFSXFunctionList read FConnectedFunctions;
property SimConnectHandle: THandle read FSimConnectHandle;
protected
procedure RegisterFunctions; override;
function GetUID: string; override;
end;
TCustomFSXFunction = class(TCustomMultiStateLEDFunction)
private
FProvider: TFSXLEDFunctionProvider;
protected
procedure SimConnected; virtual;
procedure SimDisconnected; virtual;
property Provider: TFSXLEDFunctionProvider read FProvider;
protected
procedure Attach(AObserver: IObserver); override;
procedure Detach(AObserver: IObserver); override;
function GetCategoryName: string; override;
public
constructor Create(AProvider: TFSXLEDFunctionProvider);
end;
TFSXGearFunction = class(TCustomFSXFunction)
private
FRetractedState: ILEDState;
FBetweenState: ILEDState;
FExtendedState: ILEDState;
FSpeedExceededState: ILEDState;
FDamageBySpeedState: ILEDState;
protected
procedure RegisterStates; override;
function GetDisplayName: string; override;
function GetUID: string; override;
function GetCurrentState: ILEDState; override;
end;
implementation
uses
FSXResources,
LEDColorPool,
LEDFunctionRegistry,
LEDState;
{ TFSXLEDFunctionProvider }
procedure TFSXLEDFunctionProvider.RegisterFunctions;
begin
RegisterFunction(TFSXGearFunction.Create(Self));
end;
function TFSXLEDFunctionProvider.GetUID: string;
begin
Result := FSXProviderUID;
end;
procedure TFSXLEDFunctionProvider.SimConnect;
var
fsxFunction: TCustomFSXFunction;
begin
if SimConnectHandle <> 0 then
exit;
// FSimConnectHandle :=
if SimConnectHandle <> 0 then
begin
for fsxFunction in ConnectedFunctions do
fsxFunction.SimConnected;
end;
end;
procedure TFSXLEDFunctionProvider.SimDisconnect;
begin
if SimConnectHandle = 0 then
exit;
end;
procedure TFSXLEDFunctionProvider.Connect(AFunction: TCustomFSXFunction);
begin
if ConnectedFunctions.IndexOf(AFunction) = -1 then
begin
ConnectedFunctions.Add(AFunction);
if ConnectedFunctions.Count > 0 then
SimConnect;
end;
end;
procedure TFSXLEDFunctionProvider.Disconnect(AFunction: TCustomFSXFunction);
begin
ConnectedFunctions.Remove(AFunction);
if ConnectedFunctions.Count = 0 then
SimDisconnect;
end;
{ TCustomFSXFunction }
constructor TCustomFSXFunction.Create(AProvider: TFSXLEDFunctionProvider);
begin
inherited Create;
FProvider := AProvider;
end;
procedure TCustomFSXFunction.Attach(AObserver: IObserver);
begin
if Observers.Count = 0 then
Provider.Connect(Self);
inherited Attach(AObserver);
end;
procedure TCustomFSXFunction.Detach(AObserver: IObserver);
begin
if Assigned(Provider) and (Observers.Count > 0) then
begin
inherited Detach(AObserver);
if Observers.Count = 0 then
Provider.Disconnect(Self);
end else
inherited Detach(AObserver);
end;
function TCustomFSXFunction.GetCategoryName: string;
begin
Result := FSXCategory;
end;
procedure TCustomFSXFunction.SimConnected;
begin
end;
procedure TCustomFSXFunction.SimDisconnected;
begin
end;
{ TFSXGearFunction }
procedure TFSXGearFunction.RegisterStates;
begin
FRetractedState := RegisterState(TLEDState.Create(FSXStateUIDGearRetracted,
FSXStateDisplayNameGearRetracted,
TLEDColorPool.GetColor(cpeStaticRed)));
FBetweenState := RegisterState(TLEDState.Create(FSXStateUIDGearBetween,
FSXStateDisplayNameGearBetween,
TLEDColorPool.GetColor(cpeStaticAmber)));
FExtendedState := RegisterState(TLEDState.Create(FSXStateUIDGearExtended,
FSXStateDisplayNameGearExtended,
TLEDColorPool.GetColor(cpeStaticGreen)));
FSpeedExceededState := RegisterState(TLEDState.Create(FSXStateUIDGearSpeedExceeded,
FSXStateDisplayNameGearSpeedExceeded,
TLEDColorPool.GetColor(cpeFlashingAmberNormal)));
FDamageBySpeedState := RegisterState(TLEDState.Create(FSXStateUIDGearDamageBySpeed,
FSXStateDisplayNameGearDamageBySpeed,
TLEDColorPool.GetColor(cpeFlashingRedFast)));
end;
function TFSXGearFunction.GetDisplayName: string;
begin
Result := FSXFunctionDisplayNameGear;
end;
function TFSXGearFunction.GetUID: string;
begin
Result := FSXFunctionUIDGear;
end;
function TFSXGearFunction.GetCurrentState: ILEDState;
begin
// TODO TFSXGearFunction.GetCurrentState
end;
initialization
TLEDFunctionRegistry.Register(TFSXLEDFunctionProvider.Create);
end.

View File

@ -0,0 +1,28 @@
unit FSXResources;
interface
const
FSXProviderUID = 'fsx';
FSXCategory = 'Flight Simulator X';
FSXFunctionUIDGear = 'gear';
FSXFunctionDisplayNameGear = 'Gear';
FSXStateUIDGearRetracted = 'retracted';
FSXStateUIDGearBetween = 'between';
FSXStateUIDGearExtended = 'extended';
FSXStateUIDGearSpeedExceeded = 'speedExceeded';
FSXStateUIDGearDamageBySpeed = 'damageBySpeed';
FSXStateDisplayNameGearRetracted = 'Retracted';
FSXStateDisplayNameGearBetween = 'Extending / retracting';
FSXStateDisplayNameGearExtended = 'Extended';
FSXStateDisplayNameGearSpeedExceeded = 'Speed exceeded';
FSXStateDisplayNameGearDamageBySpeed = 'Damage by speed';
implementation
end.

View File

@ -0,0 +1,14 @@
unit FSXSimConnectClient;
interface
uses
OtlTaskControl;
type
TFSXSimConnectClient = class(TOmniWorker)
end;
implementation
end.

View File

@ -26,7 +26,8 @@ type
function DoGetColor(AEntry: TLEDColorPoolEntry): ILEDColor;
public
class function GetColor(AEntry: TLEDColorPoolEntry): ILEDColor;
class function GetColor(AEntry: TLEDColorPoolEntry): ILEDColor; overload;
class function GetColor(AColor: TLEDColor): ILEDColor; overload;
end;
@ -49,6 +50,19 @@ begin
end;
class function TLEDColorPool.GetColor(AColor: TLEDColor): ILEDColor;
begin
Result := nil;
case AColor of
lcOff: Result := GetColor(cpeStaticOff);
lcGreen: Result := GetColor(cpeStaticGreen);
lcAmber: Result := GetColor(cpeStaticAmber);
lcRed: Result := GetColor(cpeStaticRed);
end;
end;
class function TLEDColorPool.Instance: TLEDColorPool;
begin
if not Assigned(LEDColorPoolInstance) then

View File

@ -14,7 +14,8 @@ type
private
FFunctions: TInterfaceList;
protected
procedure RegisterFunction(AFunction: ILEDFunction);
procedure RegisterFunctions; virtual; abstract;
function RegisterFunction(AFunction: ILEDFunction): ILEDFunction; virtual;
protected
{ ILEDFunctionProvider }
function GetUID: string; virtual; abstract;
@ -30,24 +31,20 @@ type
TCustomLEDFunction = class(TInterfacedObject, IObservable, ILEDFunction)
private
FObservers: TInterfaceList;
FStates: TInterfaceList;
protected
// procedure SetCurrentState(AState: ILEDState); virtual;
procedure NotifyObservers; virtual;
property Observers: TInterfaceList read FObservers;
protected
{ IObservable }
procedure Attach(AObserver: IObserver);
procedure Detach(AObserver: IObserver);
procedure Attach(AObserver: IObserver); virtual;
procedure Detach(AObserver: IObserver); virtual;
{ ILEDFunction }
function GetCategoryName: string; virtual; abstract;
function GetDisplayName: string; virtual; abstract;
function GetUID: string; virtual; abstract;
function GetEnumerator: ILEDStateEnumerator; virtual;
function GetCurrentState: ILEDState; virtual; abstract;
public
constructor Create;
@ -55,6 +52,22 @@ type
end;
TCustomMultiStateLEDFunction = class(TCustomLEDFunction, ILEDMultiStateFunction)
private
FStates: TInterfaceList;
protected
// procedure SetCurrentState(AState: ILEDState); virtual;
procedure RegisterStates; virtual; abstract;
function RegisterState(AState: ILEDState): ILEDState; virtual;
protected
{ ILEDMultiStateFunction }
function GetEnumerator: ILEDStateEnumerator; virtual;
public
constructor Create;
destructor Destroy; override;
end;
TLEDFunctionEnumerator = class(TInterfacedObject, ILEDFunctionEnumerator)
private
FList: TInterfaceList;
@ -93,13 +106,11 @@ begin
inherited Create;
FObservers := TInterfaceList.Create;
FStates := TInterfaceList.Create;
end;
destructor TCustomLEDFunction.Destroy;
begin
FreeAndNil(FStates);
FreeAndNil(FObservers);
inherited Destroy;
@ -118,13 +129,38 @@ begin
end;
function TCustomLEDFunction.GetEnumerator: ILEDStateEnumerator;
{ TCustomMultiStateLEDFunction }
constructor TCustomMultiStateLEDFunction.Create;
begin
inherited Create;
FStates := TInterfaceList.Create;
RegisterStates;
end;
destructor TCustomMultiStateLEDFunction.Destroy;
begin
FreeAndNil(FStates);
inherited;
end;
function TCustomMultiStateLEDFunction.RegisterState(AState: ILEDState): ILEDState;
begin
Result := AState as ILEDState;
FStates.Add(Result);
end;
function TCustomMultiStateLEDFunction.GetEnumerator: ILEDStateEnumerator;
begin
Result := TLEDStateEnumerator.Create(FStates);
end;
//procedure TCustomLEDFunction.SetCurrentState(AState: ILEDState);
//procedure TCustomMultiStateLEDFunction.SetCurrentState(AState: ILEDState);
//begin
// FCurrentState := AState;
// NotifyObservers;
@ -147,6 +183,7 @@ begin
inherited Create;
FFunctions := TInterfaceList.Create;
RegisterFunctions;
end;
@ -174,9 +211,10 @@ begin
end;
procedure TCustomLEDFunctionProvider.RegisterFunction(AFunction: ILEDFunction);
function TCustomLEDFunctionProvider.RegisterFunction(AFunction: ILEDFunction): ILEDFunction;
begin
FFunctions.Add(AFunction as ILEDFunction);
Result := AFunction as ILEDFunction;
FFunctions.Add(Result);
end;

View File

@ -10,15 +10,16 @@ uses
type
TStaticLEDFunctionProvider = class(TCustomLEDFunctionProvider)
protected
procedure RegisterFunctions; override;
function GetUID: string; override;
public
constructor Create;
end;
TStaticLEDFunction = class(TCustomLEDFunction)
private
FColor: TLEDColor;
FState: ILEDState;
protected
function GetCategoryName: string; override;
function GetDisplayName: string; override;
@ -30,42 +31,20 @@ type
end;
const
StaticProviderUID = 'static';
StaticFunctionUID: array[TLEDColor] of string =
(
'off',
'green',
'amber',
'red'
);
implementation
uses
LEDFunctionRegistry;
const
CategoryStatic = 'Static';
FunctionDisplayName: array[TLEDColor] of string =
(
'Off',
'Green',
'Amber',
'Red'
);
LEDColorPool,
LEDFunctionRegistry,
LEDState,
StaticResources;
{ TStaticLEDFunctionProvider }
constructor TStaticLEDFunctionProvider.Create;
procedure TStaticLEDFunctionProvider.RegisterFunctions;
var
color: TLEDColor;
begin
inherited Create;
for color := Low(TLEDColor) to High(TLEDColor) do
RegisterFunction(TStaticLEDFunction.Create(color));
end;
@ -88,13 +67,13 @@ end;
function TStaticLEDFunction.GetCategoryName: string;
begin
Result := CategoryStatic;
Result := StaticCategory;
end;
function TStaticLEDFunction.GetDisplayName: string;
begin
Result := FunctionDisplayName[FColor];
Result := StaticFunctionDisplayName[FColor];
end;
@ -106,7 +85,10 @@ end;
function TStaticLEDFunction.GetCurrentState: ILEDState;
begin
if not Assigned(FState) then
FState := TLEDState.Create('', '', TLEDColorPool.GetColor(FColor));
Result := FState;
end;

View File

@ -0,0 +1,31 @@
unit StaticResources;
interface
uses
LEDColorIntf;
const
StaticProviderUID = 'static';
StaticFunctionUID: array[TLEDColor] of string =
(
'off',
'green',
'amber',
'red'
);
StaticCategory = 'Static';
StaticFunctionDisplayName: array[TLEDColor] of string =
(
'Off',
'Green',
'Amber',
'Red'
);
implementation
end.