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:
parent
b1035c6db2
commit
32f411c1b8
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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}
|
||||
|
||||
|
@ -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>
|
||||
|
@ -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.
|
||||
|
231
G940LEDControl/Units/FSXLEDFunction.pas
Normal file
231
G940LEDControl/Units/FSXLEDFunction.pas
Normal 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.
|
28
G940LEDControl/Units/FSXResources.pas
Normal file
28
G940LEDControl/Units/FSXResources.pas
Normal 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.
|
14
G940LEDControl/Units/FSXSimConnectClient.pas
Normal file
14
G940LEDControl/Units/FSXSimConnectClient.pas
Normal file
@ -0,0 +1,14 @@
|
||||
unit FSXSimConnectClient;
|
||||
|
||||
interface
|
||||
uses
|
||||
OtlTaskControl;
|
||||
|
||||
type
|
||||
TFSXSimConnectClient = class(TOmniWorker)
|
||||
|
||||
end;
|
||||
|
||||
implementation
|
||||
|
||||
end.
|
@ -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
|
||||
|
@ -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;
|
||||
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
||||
|
31
G940LEDControl/Units/StaticResources.pas
Normal file
31
G940LEDControl/Units/StaticResources.pas
Normal 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.
|
Loading…
Reference in New Issue
Block a user