diff --git a/G940LEDControl/Forms/MainFrm.dfm b/G940LEDControl/Forms/MainFrm.dfm index 857ac1a..f43fd5a 100644 --- a/G940LEDControl/Forms/MainFrm.dfm +++ b/G940LEDControl/Forms/MainFrm.dfm @@ -14,7 +14,6 @@ object MainForm: TMainForm Font.Style = [] OldCreateOrder = False Position = poScreenCenter - OnCloseQuery = FormCloseQuery OnCreate = FormCreate OnDestroy = FormDestroy PixelsPerInch = 96 @@ -450,6 +449,7 @@ object MainForm: TMainForm Height = 17 Caption = ' Automatically check for &updates' TabOrder = 2 + OnClick = cbCheckUpdatesClick end object btnCheckUpdates: TButton Left = 344 diff --git a/G940LEDControl/Forms/MainFrm.pas b/G940LEDControl/Forms/MainFrm.pas index 7cb4299..abed7b8 100644 --- a/G940LEDControl/Forms/MainFrm.pas +++ b/G940LEDControl/Forms/MainFrm.pas @@ -20,7 +20,8 @@ uses X2UtPersistIntf, LEDStateConsumer, - Profile, Vcl.AppEvnts; + Profile, + Settings; const @@ -96,12 +97,12 @@ type bvlProfiles: TBevel; procedure FormCreate(Sender: TObject); - procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); procedure lblLinkLinkClick(Sender: TObject; const Link: string; LinkType: TSysLinkType); procedure btnCheckUpdatesClick(Sender: TObject); procedure LEDButtonClick(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure cmbProfilesClick(Sender: TObject); + procedure cbCheckUpdatesClick(Sender: TObject); private FLEDControls: array[0..LED_COUNT - 1] of TLEDControls; FEventMonitor: TOmniEventMonitor; @@ -114,6 +115,9 @@ type FDeviceNotification: Pointer; FG940Found: Boolean; + + FSettingsFileName: string; + FSettings: TSettings; protected procedure RegisterDeviceArrival; procedure UnregisterDeviceArrival; @@ -124,6 +128,9 @@ type procedure LoadProfiles; procedure SaveProfiles; + procedure LoadSettings; + procedure SaveSettings; + function CreateDefaultProfile: TProfile; procedure LoadActiveProfile; procedure UpdateButton(AProfile: TProfile; AButtonIndex: Integer); @@ -144,6 +151,7 @@ type property ActiveProfile: TProfile read FActiveProfile; property EventMonitor: TOmniEventMonitor read FEventMonitor; property Profiles: TProfileList read FProfiles; + property Settings: TSettings read FSettings; property StateConsumerTask: IOmniTaskControl read FStateConsumerTask; end; @@ -178,6 +186,7 @@ const DefaultProfileName = 'Default'; FILENAME_PROFILES = 'G940LEDControl\Profiles.xml'; + FILENAME_SETTINGS = 'G940LEDControl\Settings.xml'; SPECIAL_CATEGORY = -1; @@ -213,26 +222,16 @@ begin FProfiles := TProfileList.Create(True); LoadProfiles; - // TODO implement profile changing properly + FSettingsFileName := App.UserPath + FILENAME_SETTINGS; + LoadSettings; + + // #ToDo1 -oMvR: 22-2-2013: implement profile changing properly FStateConsumerTask.Comm.Send(TM_LOADPROFILE, ActiveProfile); RegisterDeviceArrival; end; -procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean); -begin -// SaveProfiles; -// if Assigned(StateConsumerTask) then -// begin -// SaveDefaultProfile; -// -// LEDStateConsumer.Finalize(StateConsumerTask); -// CanClose := False; -// end; -end; - - procedure TMainForm.FormDestroy(Sender: TObject); begin UnregisterDeviceArrival; @@ -395,6 +394,55 @@ begin end; +procedure TMainForm.LoadSettings; +var + persistXML: TX2UtPersistXML; + +begin + if not FileExists(FSettingsFileName) then + begin + { Check if version 0.x settings are in the registry } + FSettings := ConfigConversion.ConvertSettings0To1; + + if not Assigned(FSettings) then + FSettings := TSettings.Create; + end else + begin + FSettings := TSettings.Create; + + persistXML := TX2UtPersistXML.Create; + try + persistXML.FileName := FSettingsFileName; + Settings.Load(persistXML.CreateReader); + finally + FreeAndNil(persistXML); + end; + end; + + cbCheckUpdates.Checked := Settings.CheckUpdates; + + if not Settings.HasCheckUpdates then + PostMessage(Self.Handle, CM_ASKAUTOUPDATE, 0, 0) + else if Settings.CheckUpdates then + CheckForUpdates(False); +end; + + +procedure TMainForm.SaveSettings; +var + persistXML: TX2UtPersistXML; + +begin + persistXML := TX2UtPersistXML.Create; + try + persistXML.FileName := FSettingsFileName; + Settings.Save(persistXML.CreateWriter); + finally + FreeAndNil(persistXML); + end; +end; + + function TMainForm.CreateDefaultProfile: TProfile; begin { Default button functions are assigned during UpdateButton } @@ -468,8 +516,12 @@ begin 'Do you want to automatically check for updates?', 'Check for updates', MB_YESNO or MB_ICONQUESTION) = ID_YES then begin cbCheckUpdates.Checked := True; + Settings.CheckUpdates := True; + CheckForUpdates(False); end; + + SaveSettings; end; @@ -485,43 +537,6 @@ begin end; -//procedure TMainForm.ReadAutoUpdate(AReader: IX2PersistReader); -//var -// checkUpdates: Boolean; -// askAutoUpdate: Boolean; -// -//begin -// askAutoUpdate := True; -// -// if AReader.BeginSection(SECTION_SETTINGS) then -// try -// if AReader.ReadBoolean('CheckUpdates', checkUpdates) then -// begin -// cbCheckUpdates.Checked := checkUpdates; -// askAutoUpdate := False; -// end; -// finally -// AReader.EndSection; -// end; -// -// if askAutoUpdate then -// PostMessage(Self.Handle, CM_ASKAUTOUPDATE, 0, 0) -// else if cbCheckUpdates.Checked then -// CheckForUpdates(False); -//end; - - -//procedure TMainForm.WriteAutoUpdate(AWriter: IX2PersistWriter); -//begin -// if AWriter.BeginSection(SECTION_SETTINGS) then -// try -// AWriter.WriteBoolean('CheckUpdates', cbCheckUpdates.Checked); -// finally -// AWriter.EndSection; -// end; -//end; - - procedure TMainForm.LEDButtonClick(Sender: TObject); var buttonIndex: NativeInt; @@ -607,7 +622,7 @@ begin try latestVersion := httpClient.Get('http://g940.x2software.net/version'); if VersionIsNewer(Format('%d.%d.%d', [App.Version.Major, App.Version.Minor, App.Version.Release]), latestVersion) then - ATask.Comm.Send(MSG_UPDATE) + ATask.Comm.Send(MSG_UPDATE, latestVersion) else begin if ATask.Param.ByName('ReportNoUpdates').AsBoolean then @@ -629,6 +644,13 @@ begin end; +procedure TMainForm.cbCheckUpdatesClick(Sender: TObject); +begin + Settings.CheckUpdates := cbCheckUpdates.Checked; + SaveSettings; +end; + + procedure TMainForm.CheckForUpdates(AReportNoUpdates: Boolean); begin btnCheckUpdates.Enabled := False; @@ -647,9 +669,10 @@ begin HandleDeviceStateMessage(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); + if MessageBox(Self.Handle, PChar('Version ' + msg.MsgData + ' is available on the G940 LED Control website.'#13#10 + + 'Do you want to open the website now?'), 'Update available', + MB_YESNO or MB_ICONINFORMATION) = ID_YES then + ShellExecute(Self.Handle, 'open', PChar('http://g940.x2software.net/category/releases/'), nil, nil, SW_SHOWNORMAL); MSG_NOUPDATE: if msg.MsgData.AsBoolean then diff --git a/G940LEDControl/G940LEDControl.dpr b/G940LEDControl/G940LEDControl.dpr index 99c2a5c..382ee4e 100644 --- a/G940LEDControl/G940LEDControl.dpr +++ b/G940LEDControl/G940LEDControl.dpr @@ -27,7 +27,9 @@ uses FSXSimConnectClient in 'Units\FSXSimConnectClient.pas', FSXSimConnectIntf in 'Units\FSXSimConnectIntf.pas', FSXLEDFunction in 'Units\FSXLEDFunction.pas', - LEDResources in 'Units\LEDResources.pas'; + LEDResources in 'Units\LEDResources.pas', + Settings in 'Units\Settings.pas', + FSXLEDFunctionWorker in 'Units\FSXLEDFunctionWorker.pas'; {$R *.res} diff --git a/G940LEDControl/G940LEDControl.dproj b/G940LEDControl/G940LEDControl.dproj index d357a23..25ff0fd 100644 --- a/G940LEDControl/G940LEDControl.dproj +++ b/G940LEDControl/G940LEDControl.dproj @@ -190,6 +190,8 @@ + + Cfg_2 Base diff --git a/G940LEDControl/Units/ConfigConversion.pas b/G940LEDControl/Units/ConfigConversion.pas index 90b04ae..a7e6790 100644 --- a/G940LEDControl/Units/ConfigConversion.pas +++ b/G940LEDControl/Units/ConfigConversion.pas @@ -2,10 +2,12 @@ unit ConfigConversion; interface uses - Profile; + Profile, + Settings; { Version 0.x: registry -> 1.x: XML } function ConvertProfile0To1: TProfile; + function ConvertSettings0To1: TSettings; implementation @@ -16,6 +18,7 @@ uses X2UtPersistIntf, X2UtPersistRegistry, + FSXResources, LEDColorIntf, StaticResources; @@ -46,7 +49,7 @@ const V0_FUNCTIONFSX_SPOILERS = V0_FUNCTIONPROVIDER_OFFSET + 13; V0_FUNCTIONFSX_PRESSURIZATIONDUMPSWITCH = V0_FUNCTIONPROVIDER_OFFSET + 14; - V0_FUNCTIONFSX_CARBHEAT = V0_FUNCTIONPROVIDER_OFFSET + 15; + V0_FUNCTIONFSX_ENGINEANTIICE = V0_FUNCTIONPROVIDER_OFFSET + 15; V0_FUNCTIONFSX_AUTOPILOT = V0_FUNCTIONPROVIDER_OFFSET + 16; V0_FUNCTIONFSX_FUELPUMP = V0_FUNCTIONPROVIDER_OFFSET + 17; @@ -62,7 +65,7 @@ const V0_FUNCTIONFSX_TAXILIGHTS = V0_FUNCTIONPROVIDER_OFFSET + 25; V0_FUNCTIONFSX_RECOGNITIONLIGHTS = V0_FUNCTIONPROVIDER_OFFSET + 26; - // TODO 27 (de-ice) + V0_FUNCTIONFSX_DEICE = V0_FUNCTIONPROVIDER_OFFSET + 27; @@ -76,45 +79,50 @@ procedure ConvertProfileFunction0To1(AOldFunction: Integer; AButton: TProfileBut begin + { Default states are handled by the specific functions } 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]); + 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_GEAR: SetButton(FSXProviderUID, FSXFunctionUIDGear); + V0_FUNCTIONFSX_LANDINGLIGHTS: SetButton(FSXProviderUID, FSXFunctionUIDLandingLights); + V0_FUNCTIONFSX_INSTRUMENTLIGHTS: SetButton(FSXProviderUID, FSXFunctionUIDInstrumentLights); + V0_FUNCTIONFSX_PARKINGBRAKE: SetButton(FSXProviderUID, FSXFunctionUIDParkingBrake); + V0_FUNCTIONFSX_ENGINE: SetButton(FSXProviderUID, FSXFunctionUIDEngine); - 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_EXITDOOR: SetButton(FSXProviderUID, FSXFunctionUIDExitDoor); + V0_FUNCTIONFSX_STROBELIGHTS: SetButton(FSXProviderUID, FSXFunctionUIDStrobeLights); + V0_FUNCTIONFSX_NAVLIGHTS: SetButton(FSXProviderUID, FSXFunctionUIDNavLights); + V0_FUNCTIONFSX_BEACONLIGHTS: SetButton(FSXProviderUID, FSXFunctionUIDBeaconLights); + V0_FUNCTIONFSX_FLAPS: SetButton(FSXProviderUID, FSXFunctionUIDFlaps); + V0_FUNCTIONFSX_BATTERYMASTER: SetButton(FSXProviderUID, FSXFunctionUIDBatteryMaster); + V0_FUNCTIONFSX_AVIONICSMASTER: SetButton(FSXProviderUID, FSXFunctionUIDAvionicsMaster); + V0_FUNCTIONFSX_SPOILERS: SetButton(FSXProviderUID, FSXFunctionUIDSpoilers); + V0_FUNCTIONFSX_PRESSURIZATIONDUMPSWITCH: SetButton(FSXProviderUID, FSXFunctionUIDPressDumpSwitch); + V0_FUNCTIONFSX_ENGINEANTIICE: SetButton(FSXProviderUID, FSXFunctionUIDEngineAntiIce); 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]); + begin + { The only exception regarding states; the new default is Amber / Off } + SetButton(FSXProviderUID, FSXFunctionUIDAutoPilot); + AButton.SetStateColor(FSXStateUIDOn, lcGreen); + AButton.SetStateColor(FSXStateUIDOff, lcRed); + end; + + V0_FUNCTIONFSX_FUELPUMP: SetButton(FSXProviderUID, FSXFunctionUIDFuelPump); + V0_FUNCTIONFSX_TAILHOOK: SetButton(FSXProviderUID, FSXFunctionUIDTailHook); + V0_FUNCTIONFSX_AUTOPILOT_AMBER: SetButton(FSXProviderUID, FSXFunctionUIDAutoPilot); + V0_FUNCTIONFSX_AUTOPILOT_HEADING: SetButton(FSXProviderUID, FSXFunctionUIDAutoPilotHeading); + V0_FUNCTIONFSX_AUTOPILOT_APPROACH: SetButton(FSXProviderUID, FSXFunctionUIDAutoPilotApproach); + V0_FUNCTIONFSX_AUTOPILOT_BACKCOURSE: SetButton(FSXProviderUID, FSXFunctionUIDAutoPilotBackcourse); + V0_FUNCTIONFSX_AUTOPILOT_ALTITUDE: SetButton(FSXProviderUID, FSXFunctionUIDAutoPilotAltitude); + V0_FUNCTIONFSX_AUTOPILOT_NAV: SetButton(FSXProviderUID, FSXFunctionUIDAutoPilotNav); + V0_FUNCTIONFSX_TAXILIGHTS: SetButton(FSXProviderUID, FSXFunctionUIDTaxiLights); + V0_FUNCTIONFSX_RECOGNITIONLIGHTS: SetButton(FSXProviderUID, FSXFunctionUIDRecognitionLights); + V0_FUNCTIONFSX_DEICE: SetButton(FSXProviderUID, FSXFunctionUIDDeIce); end; end; @@ -124,7 +132,6 @@ const KEY_SETTINGS = '\Software\X2Software\G940LEDControl\'; SECTION_DEFAULTPROFILE = 'DefaultProfile'; SECTION_FSX = 'FSX'; - SECTION_SETTINGS = 'Settings'; var registryReader: TX2UtPersistRegistry; @@ -162,9 +169,42 @@ begin finally reader.EndSection; end; + finally + FreeAndNil(registryReader); + end; +end; - // TODO auto update settings - //ReadAutoUpdate(reader); + +function ConvertSettings0To1: TSettings; +const + KEY_SETTINGS = '\Software\X2Software\G940LEDControl\'; + SECTION_SETTINGS = 'Settings'; + +var + registryReader: TX2UtPersistRegistry; + reader: IX2PersistReader; + value: Boolean; + +begin + Result := nil; + + registryReader := TX2UtPersistRegistry.Create; + try + registryReader.RootKey := HKEY_CURRENT_USER; + registryReader.Key := KEY_SETTINGS; + + reader := registryReader.CreateReader; + + if reader.BeginSection(SECTION_SETTINGS) then + try + if reader.ReadBoolean('CheckUpdates', value) then + begin + Result := TSettings.Create; + Result.CheckUpdates := value; + end; + finally + reader.EndSection; + end; finally FreeAndNil(registryReader); end; diff --git a/G940LEDControl/Units/FSXLEDFunction.pas b/G940LEDControl/Units/FSXLEDFunction.pas index f829279..acf7aa6 100644 --- a/G940LEDControl/Units/FSXLEDFunction.pas +++ b/G940LEDControl/Units/FSXLEDFunction.pas @@ -8,14 +8,13 @@ uses type - { Base classes } - TFSXOnOffFunction = class(TCustomFSXFunction) + TCustomFSXOnOffFunction = class(TCustomFSXFunction) protected procedure RegisterStates; override; end; - { Function implementations } + { Misc } TFSXEngineFunction = class(TCustomFSXFunction) protected procedure RegisterStates; override; @@ -28,8 +27,74 @@ type function GetWorkerClass: TCustomLEDFunctionWorkerClass; override; end; + TFSXParkingBrakeFunction = class(TCustomFSXOnOffFunction) + protected + function GetWorkerClass: TCustomLEDFunctionWorkerClass; override; + end; - TFSXLightFunction = class(TFSXOnOffFunction) + TFSXExitDoorFunction = class(TCustomFSXFunction) + protected + procedure RegisterStates; override; + function GetWorkerClass: TCustomLEDFunctionWorkerClass; override; + end; + + TFSXTailHookFunction = class(TCustomFSXFunction) + protected + procedure RegisterStates; override; + function GetWorkerClass: TCustomLEDFunctionWorkerClass; override; + end; + + TFSXFlapsFunction = class(TCustomFSXFunction) + protected + procedure RegisterStates; override; + function GetWorkerClass: TCustomLEDFunctionWorkerClass; override; + end; + + TFSXSpoilersFunction = class(TCustomFSXFunction) + protected + procedure RegisterStates; override; + function GetWorkerClass: TCustomLEDFunctionWorkerClass; override; + end; + + TFSXBatteryMasterFunction = class(TCustomFSXFunction) + protected + procedure RegisterStates; override; + function GetWorkerClass: TCustomLEDFunctionWorkerClass; override; + end; + + TFSXAvionicsMasterFunction = class(TCustomFSXFunction) + protected + procedure RegisterStates; override; + function GetWorkerClass: TCustomLEDFunctionWorkerClass; override; + end; + + TFSXPressDumpSwitchFunction = class(TCustomFSXFunction) + protected + procedure RegisterStates; override; + function GetWorkerClass: TCustomLEDFunctionWorkerClass; override; + end; + + TFSXEngineAntiIceFunction = class(TCustomFSXFunction) + protected + procedure RegisterStates; override; + function GetWorkerClass: TCustomLEDFunctionWorkerClass; override; + end; + + TFSXFuelPumpFunction = class(TCustomFSXFunction) + protected + procedure RegisterStates; override; + function GetWorkerClass: TCustomLEDFunctionWorkerClass; override; + end; + + TFSXDeIceFunction = class(TCustomFSXFunction) + protected + procedure RegisterStates; override; + function GetWorkerClass: TCustomLEDFunctionWorkerClass; override; + end; + + + { Lights } + TCustomFSXLightFunction = class(TCustomFSXOnOffFunction) protected function GetCategoryName: string; override; @@ -39,82 +104,96 @@ type function GetLightMask: Integer; virtual; abstract; end; - TFSXLandingLightsFunction = class(TFSXLightFunction) + TFSXLandingLightsFunction = class(TCustomFSXLightFunction) protected function GetLightMask: Integer; override; end; - TFSXInstrumentLightsFunction = class(TFSXLightFunction) + TFSXInstrumentLightsFunction = class(TCustomFSXLightFunction) protected function GetLightMask: Integer; override; end; - TFSXBeaconLightsFunction = class(TFSXLightFunction) + TFSXBeaconLightsFunction = class(TCustomFSXLightFunction) protected function GetLightMask: Integer; override; end; - TFSXNavLightsFunction = class(TFSXLightFunction) + TFSXNavLightsFunction = class(TCustomFSXLightFunction) protected function GetLightMask: Integer; override; end; - TFSXStrobeLightsFunction = class(TFSXLightFunction) + TFSXStrobeLightsFunction = class(TCustomFSXLightFunction) protected function GetLightMask: Integer; override; end; - TFSXTaxiLightsFunction = class(TFSXLightFunction) + TFSXTaxiLightsFunction = class(TCustomFSXLightFunction) protected function GetLightMask: Integer; override; end; - TFSXRecognitionLightsFunction = class(TFSXLightFunction) + TFSXRecognitionLightsFunction = class(TCustomFSXLightFunction) protected function GetLightMask: Integer; override; end; + { Autopilot } + TCustomFSXAutoPilotFunction = class(TCustomFSXFunction) + protected + function GetCategoryName: string; override; + end; + + TFSXAutoPilotFunction = class(TCustomFSXAutoPilotFunction) + protected + procedure RegisterStates; override; + function GetWorkerClass: TCustomLEDFunctionWorkerClass; override; + end; + + TFSXAutoPilotHeadingFunction = class(TCustomFSXAutoPilotFunction) + protected + procedure RegisterStates; override; + function GetWorkerClass: TCustomLEDFunctionWorkerClass; override; + end; + + TFSXAutoPilotApproachFunction = class(TCustomFSXAutoPilotFunction) + protected + procedure RegisterStates; override; + function GetWorkerClass: TCustomLEDFunctionWorkerClass; override; + end; + + TFSXAutoPilotBackcourseFunction = class(TCustomFSXAutoPilotFunction) + protected + procedure RegisterStates; override; + function GetWorkerClass: TCustomLEDFunctionWorkerClass; override; + end; + + TFSXAutoPilotAltitudeFunction = class(TCustomFSXAutoPilotFunction) + protected + procedure RegisterStates; override; + function GetWorkerClass: TCustomLEDFunctionWorkerClass; override; + end; + + TFSXAutoPilotNavFunction = class(TCustomFSXAutoPilotFunction) + protected + procedure RegisterStates; override; + function GetWorkerClass: TCustomLEDFunctionWorkerClass; override; + end; + + implementation uses - System.Math, - System.SysUtils, - - FSXSimConnectIntf, + FSXLEDFunctionWorker, FSXResources, + FSXSimConnectIntf, LEDColorIntf, - LEDState, - LEDStateIntf, - SimConnect; - - -type - { Worker implementations } - TFSXEngineFunctionWorker = class(TCustomFSXFunctionWorker) - protected - procedure RegisterVariables(ADefinition: IFSXSimConnectDefinition); override; - procedure HandleData(AData: Pointer); override; - end; - - TFSXGearFunctionWorker = class(TCustomFSXFunctionWorker) - protected - procedure RegisterVariables(ADefinition: IFSXSimConnectDefinition); override; - procedure HandleData(AData: Pointer); override; - end; - - TFSXLightStatesFunctionWorker = class(TCustomFSXFunctionWorker) - private - FStateMask: Integer; - protected - procedure RegisterVariables(ADefinition: IFSXSimConnectDefinition); override; - procedure HandleData(AData: Pointer); override; - public - property StateMask: Integer read FStateMask write FStateMask; - end; + LEDState; { TFSXOnOffFunction } -procedure TFSXOnOffFunction.RegisterStates; +procedure TCustomFSXOnOffFunction.RegisterStates; begin RegisterState(TLEDState.Create(FSXStateUIDOn, FSXStateDisplayNameOn, lcGreen)); RegisterState(TLEDState.Create(FSXStateUIDOff, FSXStateDisplayNameOff, lcRed)); @@ -139,84 +218,6 @@ begin end; -{ TFSXEngineFunctionWorker } -procedure TFSXEngineFunctionWorker.RegisterVariables(ADefinition: IFSXSimConnectDefinition); -var - engineIndex: Integer; - -begin - ADefinition.AddVariable('NUMBER OF ENGINES', FSX_UNIT_NUMBER, SIMCONNECT_DATAType_INT32); - - for engineIndex := 1 to FSX_MAX_ENGINES do - ADefinition.AddVariable(Format('GENERAL ENG COMBUSTION:%d', [engineIndex]), FSX_UNIT_BOOL, SIMCONNECT_DATAType_INT32); - - for engineIndex := 1 to FSX_MAX_ENGINES do - ADefinition.AddVariable(Format('ENG FAILED:%d', [engineIndex]), FSX_UNIT_BOOL, SIMCONNECT_DATAType_INT32); - - for engineIndex := 1 to FSX_MAX_ENGINES do - ADefinition.AddVariable(Format('ENG ON FIRE:%d', [engineIndex]), FSX_UNIT_BOOL, SIMCONNECT_DATAType_INT32); -end; - - -procedure TFSXEngineFunctionWorker.HandleData(AData: Pointer); -type - PEngineData = ^TEngineData; - TEngineData = packed record - NumberOfEngines: Integer; - Combustion: array[1..FSX_MAX_ENGINES] of Integer; - Failed: array[1..FSX_MAX_ENGINES] of Integer; - OnFire: array[1..FSX_MAX_ENGINES] of Integer; - end; - -var - engineData: PEngineData; - engineCount: Integer; - engineIndex: Integer; - hasFire: Boolean; - hasFailure: Boolean; - runningCount: Integer; - -begin - engineData := AData; - - if engineData^.NumberOfEngines > 0 then - begin - engineCount := Min(engineData^.NumberOfEngines, FSX_MAX_ENGINES); - hasFire := False; - hasFailure := False; - runningCount := 0; - - for engineIndex := 1 to engineCount do - begin - if engineData^.OnFire[engineIndex] <> 0 then - hasFire := True; - - if engineData^.Failed[engineIndex] <> 0 then - hasFailure := True; - - if engineData^.Combustion[engineIndex] <> 0 then - Inc(runningCount); - end; - - if hasFire then - SetCurrentState(FSXStateUIDEngineOnFire) - - else if hasFailure then - SetCurrentState(FSXStateUIDEngineFailed) - - else if runningCount = 0 then - SetCurrentState(FSXStateUIDEngineAllOff) - - else if runningCount = engineCount then - SetCurrentState(FSXStateUIDEngineAllRunning) - - else - SetCurrentState(FSXStateUIDEnginePartiallyRunning); - end else - SetCurrentState(FSXStateUIDEngineNoEngines); -end; - - { TFSXGearFunction } procedure TFSXGearFunction.RegisterStates; begin @@ -235,64 +236,161 @@ begin end; -{ TFSXGearFunctionWorker } -procedure TFSXGearFunctionWorker.RegisterVariables(ADefinition: IFSXSimConnectDefinition); +{ TFSXParkingBrakeFunction } +function TFSXParkingBrakeFunction.GetWorkerClass: TCustomLEDFunctionWorkerClass; begin - ADefinition.AddVariable('IS GEAR RETRACTABLE', FSX_UNIT_BOOL, SIMCONNECT_DATAType_INT32); - ADefinition.AddVariable('GEAR TOTAL PCT EXTENDED', FSX_UNIT_PERCENT, SIMCONNECT_DATAType_FLOAT64); - ADefinition.AddVariable('GEAR DAMAGE BY SPEED', FSX_UNIT_BOOL, SIMCONNECT_DATAType_INT32); - ADefinition.AddVariable('GEAR SPEED EXCEEDED', FSX_UNIT_BOOL, SIMCONNECT_DATAType_INT32); + Result := TFSXParkingBrakeFunctionWorker; end; -procedure TFSXGearFunctionWorker.HandleData(AData: Pointer); -type - PGearData = ^TGearData; - TGearData = packed record - IsGearRetractable: Cardinal; - TotalPctExtended: Double; - DamageBySpeed: Integer; - SpeedExceeded: Integer; - end; - -var - gearData: PGearData; - +{ TFSXExitDoorFunction } +procedure TFSXExitDoorFunction.RegisterStates; begin - gearData := AData; + RegisterState(TLEDState.Create(FSXStateUIDExitDoorClosed, FSXStateDisplayNameExitDoorClosed, lcGreen)); + RegisterState(TLEDState.Create(FSXStateUIDExitDoorBetween, FSXStateDisplayNameExitDoorBetween, lcAmber)); + RegisterState(TLEDState.Create(FSXStateUIDExitDoorOpen, FSXStateDisplayNameExitDoorOpen, lcRed)); +end; - if gearData^.DamageBySpeed <> 0 then - SetCurrentState(FSXStateUIDGearDamageBySpeed) - else if gearData^.SpeedExceeded <> 0 then - SetCurrentState(FSXStateUIDGearSpeedExceeded) +function TFSXExitDoorFunction.GetWorkerClass: TCustomLEDFunctionWorkerClass; +begin + Result := TFSXExitDoorFunctionWorker; +end; - else if gearData^.IsGearRetractable <> 0 then - begin - case Trunc(gearData ^.TotalPctExtended * 100) of - 0: SetCurrentState(FSXStateUIDGearRetracted); - 95..100: SetCurrentState(FSXStateUIDGearExtended); - else SetCurrentState(FSXStateUIDGearBetween); - end; - end else - SetCurrentState(FSXStateUIDGearNotRetractable); + +{ TFSXTailHookFunction } +procedure TFSXTailHookFunction.RegisterStates; +begin + RegisterState(TLEDState.Create(FSXStateUIDTailHookRetracted, FSXStateDisplayNameTailHookRetracted, lcGreen)); + RegisterState(TLEDState.Create(FSXStateUIDTailHookBetween, FSXStateDisplayNameTailHookBetween, lcAmber)); + RegisterState(TLEDState.Create(FSXStateUIDTailHookExtended, FSXStateDisplayNameTailHookExtended, lcRed)); +end; + + +function TFSXTailHookFunction.GetWorkerClass: TCustomLEDFunctionWorkerClass; +begin + Result := TFSXTailHookFunctionWorker; +end; + + +{ TFSXFlapsFunction } +procedure TFSXFlapsFunction.RegisterStates; +begin + // #ToDo1 -cEmpty -oMvR: 22-2-2013: TFSXFlapsFunction.RegisterStates +end; + + +function TFSXFlapsFunction.GetWorkerClass: TCustomLEDFunctionWorkerClass; +begin + Result := TFSXFlapsFunctionWorker; +end; + + +{ TFSXSpoilersFunction } +procedure TFSXSpoilersFunction.RegisterStates; +begin + // #ToDo1 -cEmpty -oMvR: 22-2-2013: TFSXSpoilersFunction.RegisterStates +end; + + +function TFSXSpoilersFunction.GetWorkerClass: TCustomLEDFunctionWorkerClass; +begin + Result := TFSXSpoilersFunctionWorker; +end; + + +{ TFSXBatteryMasterFunction } +procedure TFSXBatteryMasterFunction.RegisterStates; +begin + // #ToDo1 -cEmpty -oMvR: 22-2-2013: TFSXBatteryMasterFunction.RegisterStates +end; + + +function TFSXBatteryMasterFunction.GetWorkerClass: TCustomLEDFunctionWorkerClass; +begin + Result := TFSXBatteryMasterFunctionWorker; +end; + + +{ TFSXAvionicsMasterFunction } +procedure TFSXAvionicsMasterFunction.RegisterStates; +begin + // #ToDo1 -cEmpty -oMvR: 22-2-2013: TFSXAvionicsMasterFunction.RegisterStates +end; + + +function TFSXAvionicsMasterFunction.GetWorkerClass: TCustomLEDFunctionWorkerClass; +begin + Result := TFSXAvionicsMasterFunctionWorker; +end; + + +{ TFSXPressDumpSwitchFunction } +procedure TFSXPressDumpSwitchFunction.RegisterStates; +begin + // #ToDo1 -cEmpty -oMvR: 22-2-2013: TFSXPressDumpSwitchFunction.RegisterStates +end; + + +function TFSXPressDumpSwitchFunction.GetWorkerClass: TCustomLEDFunctionWorkerClass; +begin + Result := TFSXPressDumpSwitchFunctionWorker; +end; + + +{ TFSXEngineAntiIceFunction } +procedure TFSXEngineAntiIceFunction.RegisterStates; +begin + // #ToDo1 -cEmpty -oMvR: 22-2-2013: TFSXEngineAntiIceFunction.RegisterStates +end; + + +function TFSXEngineAntiIceFunction.GetWorkerClass: TCustomLEDFunctionWorkerClass; +begin + Result := TFSXEngineAntiIceFunctionWorker; +end; + + +{ TFSXFuelPumpFunction } +procedure TFSXFuelPumpFunction.RegisterStates; +begin + // #ToDo1 -cEmpty -oMvR: 22-2-2013: TFSXFuelPumpFunction.RegisterStates +end; + + +function TFSXFuelPumpFunction.GetWorkerClass: TCustomLEDFunctionWorkerClass; +begin + Result := TFSXFuelPumpFunctionWorker; +end; + + +{ TFSXDeIceFunction } +procedure TFSXDeIceFunction.RegisterStates; +begin + // #ToDo1 -cEmpty -oMvR: 22-2-2013: TFSXDeIceFunction.RegisterStates +end; + + +function TFSXDeIceFunction.GetWorkerClass: TCustomLEDFunctionWorkerClass; +begin + Result := TFSXDeIceFunctionWorker; end; { TFSXLightFunction } -function TFSXLightFunction.GetCategoryName: string; +function TCustomFSXLightFunction.GetCategoryName: string; begin Result := FSXCategoryLights; end; -function TFSXLightFunction.GetWorkerClass: TCustomLEDFunctionWorkerClass; +function TCustomFSXLightFunction.GetWorkerClass: TCustomLEDFunctionWorkerClass; begin Result := TFSXLightStatesFunctionWorker; end; -function TFSXLightFunction.DoCreateWorker(ASettings: ILEDFunctionWorkerSettings): TCustomLEDFunctionWorker; +function TCustomFSXLightFunction.DoCreateWorker(ASettings: ILEDFunctionWorkerSettings): TCustomLEDFunctionWorker; begin Result := inherited DoCreateWorker(ASettings); (Result as TFSXLightStatesFunctionWorker).StateMask := GetLightMask; @@ -348,19 +446,88 @@ begin end; -{ TFSXLightStatesFunctionWorker } -procedure TFSXLightStatesFunctionWorker.RegisterVariables(ADefinition: IFSXSimConnectDefinition); +{ TCustomFSXAutoPilotFunction } +function TCustomFSXAutoPilotFunction.GetCategoryName: string; begin - ADefinition.AddVariable('LIGHT ON STATES', FSX_UNIT_MASK, SIMCONNECT_DATATYPE_INT32); + Result := FSXCategoryAutoPilot; end; -procedure TFSXLightStatesFunctionWorker.HandleData(AData: Pointer); +{ TFSXAutoPilotFunction } +procedure TFSXAutoPilotFunction.RegisterStates; begin - if (PCardinal(AData)^ and StateMask) <> 0 then - SetCurrentState(FSXStateUIDOn) - else - SetCurrentState(FSXStateUIDOff); + // #ToDo1 -cEmpty -oMvR: 22-2-2013: TFSXAutoPilotFunction.RegisterStates +end; + + +function TFSXAutoPilotFunction.GetWorkerClass: TCustomLEDFunctionWorkerClass; +begin + Result := TFSXAutoPilotFunctionWorker; +end; + + +{ TFSXAutoPilotHeadingFunction } +procedure TFSXAutoPilotHeadingFunction.RegisterStates; +begin + // #ToDo1 -cEmpty -oMvR: 22-2-2013: TFSXAutoPilotHeadingFunction.RegisterState +end; + + +function TFSXAutoPilotHeadingFunction.GetWorkerClass: TCustomLEDFunctionWorkerClass; +begin + Result := TFSXAutoPilotHeadingFunctionWorker; +end; + + +{ TFSXAutoPilotApproachFunction } +procedure TFSXAutoPilotApproachFunction.RegisterStates; +begin + // #ToDo1 -cEmpty -oMvR: 22-2-2013: TFSXAutoPilotApproachFunction.RegisterStates +end; + + +function TFSXAutoPilotApproachFunction.GetWorkerClass: TCustomLEDFunctionWorkerClass; +begin + Result := TFSXAutoPilotApproachFunctionWorker; +end; + + +{ TFSXAutoPilotBackcourseFunction } +procedure TFSXAutoPilotBackcourseFunction.RegisterStates; +begin + // #ToDo1 -cEmpty -oMvR: 22-2-2013: TFSXAutoPilotBackcourseFunction.RegisterStates +end; + + +function TFSXAutoPilotBackcourseFunction.GetWorkerClass: TCustomLEDFunctionWorkerClass; +begin + Result := TFSXAutoPilotBackcourseFunctionWorker; +end; + + +{ TFSXAutoPilotAltitudeFunction } +procedure TFSXAutoPilotAltitudeFunction.RegisterStates; +begin + // #ToDo1 -cEmpty -oMvR: 22-2-2013: TFSXAutoPilotAltitudeFunction.RegisterStates +end; + + +function TFSXAutoPilotAltitudeFunction.GetWorkerClass: TCustomLEDFunctionWorkerClass; +begin + Result := TFSXAutoPilotAltitudeFunctionWorker; +end; + + +{ TFSXAutoPilotNavFunction } +procedure TFSXAutoPilotNavFunction.RegisterStates; +begin + // #ToDo1 -cEmpty -oMvR: 22-2-2013: TFSXAutoPilotNavFunction.RegisterStates +end; + + +function TFSXAutoPilotNavFunction.GetWorkerClass: TCustomLEDFunctionWorkerClass; +begin + Result := TFSXAutoPilotNavFunctionWorker; end; end. diff --git a/G940LEDControl/Units/FSXLEDFunctionProvider.pas b/G940LEDControl/Units/FSXLEDFunctionProvider.pas index 2a7d61b..e02864f 100644 --- a/G940LEDControl/Units/FSXLEDFunctionProvider.pas +++ b/G940LEDControl/Units/FSXLEDFunctionProvider.pas @@ -129,38 +129,37 @@ end; procedure TFSXLEDFunctionProvider.RegisterFunctions; begin - { - AConsumer.AddFunction(FUNCTION_FSX_CARBHEAT, 'Anti-ice'); - AConsumer.AddFunction(FUNCTION_FSX_AUTOPILOT, 'Auto pilot (main)'); - AConsumer.AddFunction(FUNCTION_FSX_AUTOPILOT_AMBER, 'Auto pilot (main - off / amber)'); - AConsumer.AddFunction(FUNCTION_FSX_AUTOPILOT_ALTITUDE, 'Auto pilot - Altitude'); - AConsumer.AddFunction(FUNCTION_FSX_AUTOPILOT_APPROACH, 'Auto pilot - Approach'); - AConsumer.AddFunction(FUNCTION_FSX_AUTOPILOT_BACKCOURSE, 'Auto pilot - Backcourse'); - AConsumer.AddFunction(FUNCTION_FSX_AUTOPILOT_HEADING, 'Auto pilot - Heading'); - AConsumer.AddFunction(FUNCTION_FSX_AUTOPILOT_NAV, 'Auto pilot - Nav'); - AConsumer.AddFunction(FUNCTION_FSX_AVIONICSMASTER, 'Avionics master switch'); - AConsumer.AddFunction(FUNCTION_FSX_BATTERYMASTER, 'Battery master switch'); - AConsumer.AddFunction(FUNCTION_FSX_ENGINE, 'Engine'); - AConsumer.AddFunction(FUNCTION_FSX_EXITDOOR, 'Exit door'); - AConsumer.AddFunction(FUNCTION_FSX_FLAPS, 'Flaps'); - AConsumer.AddFunction(FUNCTION_FSX_PARKINGBRAKE, 'Parking brake'); - AConsumer.AddFunction(FUNCTION_FSX_PRESSURIZATIONDUMPSWITCH, 'Pressurization dump switch'); - AConsumer.AddFunction(FUNCTION_FSX_SPOILERS, 'Spoilers (air brake)'); - AConsumer.AddFunction(FUNCTION_FSX_TAILHOOK, 'Tail hook'); - } - { Misc } - RegisterFunction(TFSXEngineFunction.Create( Self, FSXFunctionDisplayNameEngine, FSXFunctionUIDEngine)); - RegisterFunction(TFSXGearFunction.Create( Self, FSXFunctionDisplayNameGear, FSXFunctionUIDGear)); + RegisterFunction(TFSXAvionicsMasterFunction.Create( Self, FSXFunctionDisplayNameAvionicsMaster, FSXFunctionUIDAvionicsMaster)); + RegisterFunction(TFSXBatteryMasterFunction.Create( Self, FSXFunctionDisplayNameBatteryMaster, FSXFunctionUIDBatteryMaster)); + RegisterFunction(TFSXDeIceFunction.Create( Self, FSXFunctionDisplayNameDeIce, FSXFunctionUIDDeIce)); + RegisterFunction(TFSXEngineAntiIceFunction.Create( Self, FSXFunctionDisplayNameEngineAntiIce, FSXFunctionUIDEngineAntiIce)); + RegisterFunction(TFSXEngineFunction.Create( Self, FSXFunctionDisplayNameEngine, FSXFunctionUIDEngine)); + RegisterFunction(TFSXExitDoorFunction.Create( Self, FSXFunctionDisplayNameExitDoor, FSXFunctionUIDExitDoor)); + RegisterFunction(TFSXFlapsFunction.Create( Self, FSXFunctionDisplayNameFlaps, FSXFunctionUIDFlaps)); + RegisterFunction(TFSXFuelPumpFunction.Create( Self, FSXFunctionDisplayNameFuelPump, FSXFunctionUIDFuelPump)); + RegisterFunction(TFSXGearFunction.Create( Self, FSXFunctionDisplayNameGear, FSXFunctionUIDGear)); + RegisterFunction(TFSXParkingBrakeFunction.Create( Self, FSXFunctionDisplayNameParkingBrake, FSXFunctionUIDParkingBrake)); + RegisterFunction(TFSXPressDumpSwitchFunction.Create( Self, FSXFunctionDisplayNamePressDumpSwitch, FSXFunctionUIDPressDumpSwitch)); + RegisterFunction(TFSXSpoilersFunction.Create( Self, FSXFunctionDisplayNameSpoilers, FSXFunctionUIDSpoilers)); + RegisterFunction(TFSXTailHookFunction.Create( Self, FSXFunctionDisplayNameTailHook, FSXFunctionUIDTailHook)); { Lights } - RegisterFunction(TFSXBeaconLightsFunction.Create( Self, FSXFunctionDisplayNameBeaconLights, FSXFunctionUIDBeaconLights)); - RegisterFunction(TFSXInstrumentLightsFunction.Create( Self, FSXFunctionDisplayNameInstrumentLights, FSXFunctionUIDInstrumentLights)); - RegisterFunction(TFSXLandingLightsFunction.Create( Self, FSXFunctionDisplayNameLandingLights, FSXFunctionUIDLandingLights)); - RegisterFunction(TFSXNavLightsFunction.Create( Self, FSXFunctionDisplayNameNavLights, FSXFunctionUIDNavLights)); - RegisterFunction(TFSXRecognitionLightsFunction.Create(Self, FSXFunctionDisplayNameRecognitionLights, FSXFunctionUIDRecognitionLights)); - RegisterFunction(TFSXStrobeLightsFunction.Create( Self, FSXFunctionDisplayNameStrobeLights, FSXFunctionUIDStrobeLights)); - RegisterFunction(TFSXTaxiLightsFunction.Create( Self, FSXFunctionDisplayNameTaxiLights, FSXFunctionUIDTaxiLights)); + RegisterFunction(TFSXBeaconLightsFunction.Create( Self, FSXFunctionDisplayNameBeaconLights, FSXFunctionUIDBeaconLights)); + RegisterFunction(TFSXInstrumentLightsFunction.Create( Self, FSXFunctionDisplayNameInstrumentLights, FSXFunctionUIDInstrumentLights)); + RegisterFunction(TFSXLandingLightsFunction.Create( Self, FSXFunctionDisplayNameLandingLights, FSXFunctionUIDLandingLights)); + RegisterFunction(TFSXNavLightsFunction.Create( Self, FSXFunctionDisplayNameNavLights, FSXFunctionUIDNavLights)); + RegisterFunction(TFSXRecognitionLightsFunction.Create( Self, FSXFunctionDisplayNameRecognitionLights, FSXFunctionUIDRecognitionLights)); + RegisterFunction(TFSXStrobeLightsFunction.Create( Self, FSXFunctionDisplayNameStrobeLights, FSXFunctionUIDStrobeLights)); + RegisterFunction(TFSXTaxiLightsFunction.Create( Self, FSXFunctionDisplayNameTaxiLights, FSXFunctionUIDTaxiLights)); + + { Autopilot } + RegisterFunction(TFSXAutoPilotFunction.Create( Self, FSXFunctionDisplayNameAutoPilot, FSXFunctionUIDAutoPilot)); + RegisterFunction(TFSXAutoPilotAltitudeFunction.Create( Self, FSXFunctionDisplayNameAutoPilotAltitude, FSXFunctionUIDAutoPilotAltitude)); + RegisterFunction(TFSXAutoPilotApproachFunction.Create( Self, FSXFunctionDisplayNameAutoPilotApproach, FSXFunctionUIDAutoPilotApproach)); + RegisterFunction(TFSXAutoPilotBackcourseFunction.Create(Self, FSXFunctionDisplayNameAutoPilotBackcourse, FSXFunctionUIDAutoPilotBackcourse)); + RegisterFunction(TFSXAutoPilotHeadingFunction.Create( Self, FSXFunctionDisplayNameAutoPilotHeading, FSXFunctionUIDAutoPilotHeading)); + RegisterFunction(TFSXAutoPilotNavFunction.Create( Self, FSXFunctionDisplayNameAutoPilotNav, FSXFunctionUIDAutoPilotNav)); end; diff --git a/G940LEDControl/Units/FSXLEDFunctionWorker.pas b/G940LEDControl/Units/FSXLEDFunctionWorker.pas new file mode 100644 index 0000000..7d97d89 --- /dev/null +++ b/G940LEDControl/Units/FSXLEDFunctionWorker.pas @@ -0,0 +1,526 @@ +unit FSXLEDFunctionWorker; + +interface +uses + FSXLEDFunctionProvider, + FSXSimConnectIntf; + + +type + { Misc } + TFSXEngineFunctionWorker = class(TCustomFSXFunctionWorker) + protected + procedure RegisterVariables(ADefinition: IFSXSimConnectDefinition); override; + procedure HandleData(AData: Pointer); override; + end; + + TFSXGearFunctionWorker = class(TCustomFSXFunctionWorker) + protected + procedure RegisterVariables(ADefinition: IFSXSimConnectDefinition); override; + procedure HandleData(AData: Pointer); override; + end; + + TFSXParkingBrakeFunctionWorker = class(TCustomFSXFunctionWorker) + protected + procedure RegisterVariables(ADefinition: IFSXSimConnectDefinition); override; + procedure HandleData(AData: Pointer); override; + end; + + TFSXExitDoorFunctionWorker = class(TCustomFSXFunctionWorker) + protected + procedure RegisterVariables(ADefinition: IFSXSimConnectDefinition); override; + procedure HandleData(AData: Pointer); override; + end; + + TFSXTailHookFunctionWorker = class(TCustomFSXFunctionWorker) + protected + procedure RegisterVariables(ADefinition: IFSXSimConnectDefinition); override; + procedure HandleData(AData: Pointer); override; + end; + + + TFSXFlapsFunctionWorker = class(TCustomFSXFunctionWorker) + protected + procedure RegisterVariables(ADefinition: IFSXSimConnectDefinition); override; + procedure HandleData(AData: Pointer); override; + end; + + + TFSXSpoilersFunctionWorker = class(TCustomFSXFunctionWorker) + protected + procedure RegisterVariables(ADefinition: IFSXSimConnectDefinition); override; + procedure HandleData(AData: Pointer); override; + end; + + + TFSXBatteryMasterFunctionWorker = class(TCustomFSXFunctionWorker) + protected + procedure RegisterVariables(ADefinition: IFSXSimConnectDefinition); override; + procedure HandleData(AData: Pointer); override; + end; + + + TFSXAvionicsMasterFunctionWorker = class(TCustomFSXFunctionWorker) + protected + procedure RegisterVariables(ADefinition: IFSXSimConnectDefinition); override; + procedure HandleData(AData: Pointer); override; + end; + + + TFSXPressDumpSwitchFunctionWorker = class(TCustomFSXFunctionWorker) + protected + procedure RegisterVariables(ADefinition: IFSXSimConnectDefinition); override; + procedure HandleData(AData: Pointer); override; + end; + + + TFSXEngineAntiIceFunctionWorker = class(TCustomFSXFunctionWorker) + protected + procedure RegisterVariables(ADefinition: IFSXSimConnectDefinition); override; + procedure HandleData(AData: Pointer); override; + end; + + + TFSXFuelPumpFunctionWorker = class(TCustomFSXFunctionWorker) + protected + procedure RegisterVariables(ADefinition: IFSXSimConnectDefinition); override; + procedure HandleData(AData: Pointer); override; + end; + + + TFSXDeIceFunctionWorker = class(TCustomFSXFunctionWorker) + protected + procedure RegisterVariables(ADefinition: IFSXSimConnectDefinition); override; + procedure HandleData(AData: Pointer); override; + end; + + + TFSXLightStatesFunctionWorker = class(TCustomFSXFunctionWorker) + private + FStateMask: Integer; + protected + procedure RegisterVariables(ADefinition: IFSXSimConnectDefinition); override; + procedure HandleData(AData: Pointer); override; + public + property StateMask: Integer read FStateMask write FStateMask; + end; + + + TFSXAutoPilotFunctionWorker = class(TCustomFSXFunctionWorker) + protected + procedure RegisterVariables(ADefinition: IFSXSimConnectDefinition); override; + procedure HandleData(AData: Pointer); override; + end; + + + TFSXAutoPilotHeadingFunctionWorker = class(TCustomFSXFunctionWorker) + protected + procedure RegisterVariables(ADefinition: IFSXSimConnectDefinition); override; + procedure HandleData(AData: Pointer); override; + end; + + + TFSXAutoPilotApproachFunctionWorker = class(TCustomFSXFunctionWorker) + protected + procedure RegisterVariables(ADefinition: IFSXSimConnectDefinition); override; + procedure HandleData(AData: Pointer); override; + end; + + + TFSXAutoPilotBackcourseFunctionWorker = class(TCustomFSXFunctionWorker) + protected + procedure RegisterVariables(ADefinition: IFSXSimConnectDefinition); override; + procedure HandleData(AData: Pointer); override; + end; + + + TFSXAutoPilotAltitudeFunctionWorker = class(TCustomFSXFunctionWorker) + protected + procedure RegisterVariables(ADefinition: IFSXSimConnectDefinition); override; + procedure HandleData(AData: Pointer); override; + end; + + + TFSXAutoPilotNavFunctionWorker = class(TCustomFSXFunctionWorker) + protected + procedure RegisterVariables(ADefinition: IFSXSimConnectDefinition); override; + procedure HandleData(AData: Pointer); override; + end; + + +implementation +uses + System.Math, + System.SysUtils, + + FSXResources, + LEDStateIntf, + SimConnect; + + +{ TFSXEngineFunctionWorker } +procedure TFSXEngineFunctionWorker.RegisterVariables(ADefinition: IFSXSimConnectDefinition); +var + engineIndex: Integer; + +begin + ADefinition.AddVariable('NUMBER OF ENGINES', FSX_UNIT_NUMBER, SIMCONNECT_DATAType_INT32); + + for engineIndex := 1 to FSX_MAX_ENGINES do + ADefinition.AddVariable(Format('GENERAL ENG COMBUSTION:%d', [engineIndex]), FSX_UNIT_BOOL, SIMCONNECT_DATAType_INT32); + + for engineIndex := 1 to FSX_MAX_ENGINES do + ADefinition.AddVariable(Format('ENG FAILED:%d', [engineIndex]), FSX_UNIT_BOOL, SIMCONNECT_DATAType_INT32); + + for engineIndex := 1 to FSX_MAX_ENGINES do + ADefinition.AddVariable(Format('ENG ON FIRE:%d', [engineIndex]), FSX_UNIT_BOOL, SIMCONNECT_DATAType_INT32); +end; + + +procedure TFSXEngineFunctionWorker.HandleData(AData: Pointer); +type + PEngineData = ^TEngineData; + TEngineData = packed record + NumberOfEngines: Integer; + Combustion: array[1..FSX_MAX_ENGINES] of Integer; + Failed: array[1..FSX_MAX_ENGINES] of Integer; + OnFire: array[1..FSX_MAX_ENGINES] of Integer; + end; + +var + engineData: PEngineData; + engineCount: Integer; + engineIndex: Integer; + hasFire: Boolean; + hasFailure: Boolean; + runningCount: Integer; + +begin + engineData := AData; + + if engineData^.NumberOfEngines > 0 then + begin + engineCount := Min(engineData^.NumberOfEngines, FSX_MAX_ENGINES); + hasFire := False; + hasFailure := False; + runningCount := 0; + + for engineIndex := 1 to engineCount do + begin + if engineData^.OnFire[engineIndex] <> 0 then + hasFire := True; + + if engineData^.Failed[engineIndex] <> 0 then + hasFailure := True; + + if engineData^.Combustion[engineIndex] <> 0 then + Inc(runningCount); + end; + + if hasFire then + SetCurrentState(FSXStateUIDEngineOnFire) + + else if hasFailure then + SetCurrentState(FSXStateUIDEngineFailed) + + else if runningCount = 0 then + SetCurrentState(FSXStateUIDEngineAllOff) + + else if runningCount = engineCount then + SetCurrentState(FSXStateUIDEngineAllRunning) + + else + SetCurrentState(FSXStateUIDEnginePartiallyRunning); + end else + SetCurrentState(FSXStateUIDEngineNoEngines); +end; + + +{ TFSXGearFunctionWorker } +procedure TFSXGearFunctionWorker.RegisterVariables(ADefinition: IFSXSimConnectDefinition); +begin + ADefinition.AddVariable('IS GEAR RETRACTABLE', FSX_UNIT_BOOL, SIMCONNECT_DATAType_INT32); + ADefinition.AddVariable('GEAR TOTAL PCT EXTENDED', FSX_UNIT_PERCENT, SIMCONNECT_DATAType_FLOAT64); + ADefinition.AddVariable('GEAR DAMAGE BY SPEED', FSX_UNIT_BOOL, SIMCONNECT_DATAType_INT32); + ADefinition.AddVariable('GEAR SPEED EXCEEDED', FSX_UNIT_BOOL, SIMCONNECT_DATAType_INT32); +end; + + +procedure TFSXGearFunctionWorker.HandleData(AData: Pointer); +type + PGearData = ^TGearData; + TGearData = packed record + IsGearRetractable: Cardinal; + TotalPctExtended: Double; + DamageBySpeed: Integer; + SpeedExceeded: Integer; + end; + +var + gearData: PGearData; + +begin + gearData := AData; + + if gearData^.DamageBySpeed <> 0 then + SetCurrentState(FSXStateUIDGearDamageBySpeed) + + else if gearData^.SpeedExceeded <> 0 then + SetCurrentState(FSXStateUIDGearSpeedExceeded) + + else if gearData^.IsGearRetractable <> 0 then + begin + case Trunc(gearData ^.TotalPctExtended * 100) of + 0: SetCurrentState(FSXStateUIDGearRetracted); + 95..100: SetCurrentState(FSXStateUIDGearExtended); + else SetCurrentState(FSXStateUIDGearBetween); + end; + end else + SetCurrentState(FSXStateUIDGearNotRetractable); +end; + + +{ TFSXParkingBrakeFunctionWorker } +procedure TFSXParkingBrakeFunctionWorker.RegisterVariables(ADefinition: IFSXSimConnectDefinition); +begin + ADefinition.AddVariable('BRAKE PARKING INDICATOR', FSX_UNIT_BOOL, SIMCONNECT_DATATYPE_INT32); +end; + + +procedure TFSXParkingBrakeFunctionWorker.HandleData(AData: Pointer); +begin + if PCardinal(AData)^ <> 0 then + SetCurrentState(FSXStateUIDOn) + else + SetCurrentState(FSXStateUIDOff); +end; + + +{ TFSXExitDoorFunctionWorker } +procedure TFSXExitDoorFunctionWorker.RegisterVariables(ADefinition: IFSXSimConnectDefinition); +begin + ADefinition.AddVariable('CANOPY OPEN', FSX_UNIT_PERCENT, SIMCONNECT_DATAType_FLOAT64); +end; + + +procedure TFSXExitDoorFunctionWorker.HandleData(AData: Pointer); +begin + case Trunc(PDouble(AData)^) of + 0..5: SetCurrentState(FSXStateUIDExitDoorClosed); + 95..100: SetCurrentState(FSXStateUIDExitDoorOpen); + else SetCurrentState(FSXStateUIDExitDoorBetween); + end; +end; + + +{ TFSXTailHookFunctionWorker } +procedure TFSXTailHookFunctionWorker.RegisterVariables(ADefinition: IFSXSimConnectDefinition); +begin + // #ToDo1 -cEmpty -oMvR: 22-2-2013: TFSXTailHookFunctionWorker.RegisterVariables +end; + + +procedure TFSXTailHookFunctionWorker.HandleData(AData: Pointer); +begin + // #ToDo1 -cEmpty -oMvR: 22-2-2013: TFSXTailHookFunctionWorker.HandleData +end; + + +{ TFSXFlapsFunctionWorker } +procedure TFSXFlapsFunctionWorker.RegisterVariables(ADefinition: IFSXSimConnectDefinition); +begin + // #ToDo1 -cEmpty -oMvR: 22-2-2013: TFSXFlapsFunctionWorker.RegisterVariables +end; + + +procedure TFSXFlapsFunctionWorker.HandleData(AData: Pointer); +begin + // #ToDo1 -cEmpty -oMvR: 22-2-2013: TFSXFlapsFunctionWorker.HandleData +end; + + +{ TFSXSpoilersFunctionWorker } +procedure TFSXSpoilersFunctionWorker.RegisterVariables(ADefinition: IFSXSimConnectDefinition); +begin + // #ToDo1 -cEmpty -oMvR: 22-2-2013: TFSXSpoilersFunctionWorker.RegisterVariables +end; + + +procedure TFSXSpoilersFunctionWorker.HandleData(AData: Pointer); +begin + // #ToDo1 -cEmpty -oMvR: 22-2-2013: TFSXSpoilersFunctionWorker.HandleData +end; + + +{ TFSXBatteryMasterFunctionWorker } +procedure TFSXBatteryMasterFunctionWorker.RegisterVariables(ADefinition: IFSXSimConnectDefinition); +begin + // #ToDo1 -cEmpty -oMvR: 22-2-2013: TFSXBatteryMasterFunctionWorker.RegisterVariables +end; + + +procedure TFSXBatteryMasterFunctionWorker.HandleData(AData: Pointer); +begin + // #ToDo1 -cEmpty -oMvR: 22-2-2013: TFSXBatteryMasterFunctionWorker.HandleData +end; + + +{ TFSXAvionicsMasterFunctionWorker } +procedure TFSXAvionicsMasterFunctionWorker.RegisterVariables(ADefinition: IFSXSimConnectDefinition); +begin + // #ToDo1 -cEmpty -oMvR: 22-2-2013: TFSXAvionicsMasterFunctionWorker.RegisterVariables +end; + + +procedure TFSXAvionicsMasterFunctionWorker.HandleData(AData: Pointer); +begin + // #ToDo1 -cEmpty -oMvR: 22-2-2013: TFSXAvionicsMasterFunctionWorker.HandleData +end; + + +{ TFSXPressDumpSwitchFunctionWorker } +procedure TFSXPressDumpSwitchFunctionWorker.RegisterVariables(ADefinition: IFSXSimConnectDefinition); +begin + // #ToDo1 -cEmpty -oMvR: 22-2-2013: TFSXPressDumpSwitchFunctionWorker.RegisterVariables +end; + + +procedure TFSXPressDumpSwitchFunctionWorker.HandleData(AData: Pointer); +begin + // #ToDo1 -cEmpty -oMvR: 22-2-2013: TFSXPressDumpSwitchFunctionWorker.HandleData +end; + + +{ TFSXEngineAntiIceFunctionWorker } +procedure TFSXEngineAntiIceFunctionWorker.RegisterVariables(ADefinition: IFSXSimConnectDefinition); +begin + // #ToDo1 -cEmpty -oMvR: 22-2-2013: TFSXEngineAntiIceFunctionWorker.RegisterVariables +end; + + +procedure TFSXEngineAntiIceFunctionWorker.HandleData(AData: Pointer); +begin + // #ToDo1 -cEmpty -oMvR: 22-2-2013: TFSXEngineAntiIceFunctionWorker.HandleData +end; + + +{ TFSXFuelPumpFunctionWorker } +procedure TFSXFuelPumpFunctionWorker.RegisterVariables(ADefinition: IFSXSimConnectDefinition); +begin + // #ToDo1 -cEmpty -oMvR: 22-2-2013: TFSXFuelPumpFunctionWorker.RegisterVariables +end; + + +procedure TFSXFuelPumpFunctionWorker.HandleData(AData: Pointer); +begin + // #ToDo1 -cEmpty -oMvR: 22-2-2013: TFSXFuelPumpFunctionWorker.HandleData +end; + + +{ TFSXDeIceFunctionWorker } +procedure TFSXDeIceFunctionWorker.RegisterVariables(ADefinition: IFSXSimConnectDefinition); +begin + // #ToDo1 -cEmpty -oMvR: 22-2-2013: TFSXDeIceFunctionWorker.RegisterVariables +end; + + +procedure TFSXDeIceFunctionWorker.HandleData(AData: Pointer); +begin + // #ToDo1 -cEmpty -oMvR: 22-2-2013: TFSXDeIceFunctionWorker.HandleData +end; + + +{ TFSXLightStatesFunctionWorker } +procedure TFSXLightStatesFunctionWorker.RegisterVariables(ADefinition: IFSXSimConnectDefinition); +begin + ADefinition.AddVariable('LIGHT ON STATES', FSX_UNIT_MASK, SIMCONNECT_DATATYPE_INT32); +end; + + +procedure TFSXLightStatesFunctionWorker.HandleData(AData: Pointer); +begin + if (PCardinal(AData)^ and StateMask) <> 0 then + SetCurrentState(FSXStateUIDOn) + else + SetCurrentState(FSXStateUIDOff); +end; + + +{ TFSXAutoPilotFunctionWorker } +procedure TFSXAutoPilotFunctionWorker.RegisterVariables(ADefinition: IFSXSimConnectDefinition); +begin + // #ToDo1 -cEmpty -oMvR: 22-2-2013: TFSXAutoPilotFunctionWorker.RegisterVariables +end; + + +procedure TFSXAutoPilotFunctionWorker.HandleData(AData: Pointer); +begin + // #ToDo1 -cEmpty -oMvR: 22-2-2013: TFSXAutoPilotFunctionWorker.HandleData +end; + + +{ TFSXAutoPilotHeadingFunctionWorker } +procedure TFSXAutoPilotHeadingFunctionWorker.RegisterVariables(ADefinition: IFSXSimConnectDefinition); +begin + // #ToDo1 -cEmpty -oMvR: 22-2-2013: TFSXAutoPilotHeadingFunctionWorker.RegisterVariables +end; + + +procedure TFSXAutoPilotHeadingFunctionWorker.HandleData(AData: Pointer); +begin + // #ToDo1 -cEmpty -oMvR: 22-2-2013: TFSXAutoPilotHeadingFunctionWorker.HandleData +end; + + +{ TFSXAutoPilotApproachFunctionWorker } +procedure TFSXAutoPilotApproachFunctionWorker.RegisterVariables(ADefinition: IFSXSimConnectDefinition); +begin + // #ToDo1 -cEmpty -oMvR: 22-2-2013: TFSXAutoPilotApproachFunctionWorker.RegisterVariables +end; + + +procedure TFSXAutoPilotApproachFunctionWorker.HandleData(AData: Pointer); +begin + // #ToDo1 -cEmpty -oMvR: 22-2-2013: TFSXAutoPilotApproachFunctionWorker.HandleData +end; + + +{ TFSXAutoPilotBackcourseFunctionWorker } +procedure TFSXAutoPilotBackcourseFunctionWorker.RegisterVariables(ADefinition: IFSXSimConnectDefinition); +begin + // #ToDo1 -cEmpty -oMvR: 22-2-2013: TFSXAutoPilotBackcourseFunctionWorker.RegisterVariables +end; + + +procedure TFSXAutoPilotBackcourseFunctionWorker.HandleData(AData: Pointer); +begin + // #ToDo1 -cEmpty -oMvR: 22-2-2013: TFSXAutoPilotBackcourseFunctionWorker.HandleData +end; + + +{ TFSXAutoPilotAltitudeFunctionWorker } +procedure TFSXAutoPilotAltitudeFunctionWorker.RegisterVariables(ADefinition: IFSXSimConnectDefinition); +begin + // #ToDo1 -cEmpty -oMvR: 22-2-2013: TFSXAutoPilotAltitudeFunctionWorker.RegisterVariables +end; + + +procedure TFSXAutoPilotAltitudeFunctionWorker.HandleData(AData: Pointer); +begin + // #ToDo1 -cEmpty -oMvR: 22-2-2013: TFSXAutoPilotAltitudeFunctionWorker.HandleData +end; + + +{ TFSXAutoPilotNavFunctionWorker } +procedure TFSXAutoPilotNavFunctionWorker.RegisterVariables(ADefinition: IFSXSimConnectDefinition); +begin + // #ToDo1 -cEmpty -oMvR: 22-2-2013: TFSXAutoPilotNavFunctionWorker.RegisterVariables +end; + + +procedure TFSXAutoPilotNavFunctionWorker.HandleData(AData: Pointer); +begin + // #ToDo1 -cEmpty -oMvR: 22-2-2013: TFSXAutoPilotNavFunctionWorker.HandleData +end; + +end. diff --git a/G940LEDControl/Units/FSXResources.pas b/G940LEDControl/Units/FSXResources.pas index b6f6300..f22919e 100644 --- a/G940LEDControl/Units/FSXResources.pas +++ b/G940LEDControl/Units/FSXResources.pas @@ -7,6 +7,7 @@ const FSXProviderUID = 'fsx'; FSXCategory = 'Flight Simulator X'; FSXCategoryLights = FSXCategory + ' - Lights'; + FSXCategoryAutoPilot = FSXCategory + ' - Autopilot'; FSXStateUIDOn = 'on'; FSXStateUIDOff = 'off'; @@ -72,6 +73,76 @@ const FSXFunctionUIDRecognitionLights = 'recognitionLights'; FSXFunctionDisplayNameRecognitionLights = 'Recognition lights'; + FSXFunctionUIDParkingBrake = 'parkingBrake'; + FSXFunctionDisplayNameParkingBrake = 'Parking brake'; + + FSXFunctionUIDExitDoor = 'exitDoor'; + FSXFunctionDisplayNameExitDoor = 'Exit door'; + + FSXStateUIDExitDoorClosed = 'closed'; + FSXStateUIDExitDoorBetween = 'between'; + FSXStateUIDExitDoorOpen = 'open'; + + FSXStateDisplayNameExitDoorClosed = 'Closed'; + FSXStateDisplayNameExitDoorBetween = 'Opening / closing'; + FSXStateDisplayNameExitDoorOpen = 'Open'; + + FSXFunctionUIDTailHook = 'tailHook'; + FSXFunctionDisplayNameTailHook = 'Tail hook'; + + FSXStateUIDTailHookRetracted = 'retracted'; + FSXStateUIDTailHookBetween = 'between'; + FSXStateUIDTailHookExtended = 'extended'; + + FSXStateDisplayNameTailHookRetracted = 'Retracted'; + FSXStateDisplayNameTailHookBetween = 'Extending / retracting'; + FSXStateDisplayNameTailHookExtended = 'Extended'; + + + FSXFunctionUIDFlaps = 'flaps'; + FSXFunctionDisplayNameFlaps = 'Flaps'; + + FSXFunctionUIDSpoilers = 'spoilers'; + FSXFunctionDisplayNameSpoilers = 'Spoilers'; + + FSXFunctionUIDBatteryMaster = 'batteryMaster'; + FSXFunctionDisplayNameBatteryMaster = 'Battery master'; + + FSXFunctionUIDAvionicsMaster = 'avionicsMaster'; + FSXFunctionDisplayNameAvionicsMaster = 'Avionics master'; + + FSXFunctionUIDPressDumpSwitch = 'pressurizationDumpSwitch'; + FSXFunctionDisplayNamePressDumpSwitch = 'Pressurization dump switch'; + + FSXFunctionUIDEngineAntiIce = 'engineAntiIce'; + FSXFunctionDisplayNameEngineAntiIce = 'Engine anti-ice'; + + FSXFunctionUIDFuelPump = 'fuelPump'; + FSXFunctionDisplayNameFuelPump = 'Fuel pump'; + + FSXFunctionUIDDeIce = 'structuralDeIce'; + FSXFunctionDisplayNameDeIce = 'De-ice'; + + FSXFunctionUIDAutoPilot = 'autoPilotMaster'; + FSXFunctionDisplayNameAutoPilot = 'Autopilot master'; + + FSXFunctionUIDAutoPilotHeading = 'autoPilotHeading'; + FSXFunctionDisplayNameAutoPilotHeading = 'Autopilot heading'; + + FSXFunctionUIDAutoPilotApproach = 'autoPilotApproach'; + FSXFunctionDisplayNameAutoPilotApproach = 'Autopilot approach'; + + FSXFunctionUIDAutoPilotBackcourse = 'autoPilotBackcourse'; + FSXFunctionDisplayNameAutoPilotBackcourse = 'Autopilot backcourse'; + + FSXFunctionUIDAutoPilotAltitude = 'autoPilotAltitude'; + FSXFunctionDisplayNameAutoPilotAltitude = 'Autopilot altitude'; + + FSXFunctionUIDAutoPilotNav = 'autoPilotNav'; + FSXFunctionDisplayNameAutoPilotNav = 'Autopilot nav'; + + + implementation diff --git a/G940LEDControl/Units/FSXSimConnectClient.pas b/G940LEDControl/Units/FSXSimConnectClient.pas index 70a4c37..bfd34e7 100644 --- a/G940LEDControl/Units/FSXSimConnectClient.pas +++ b/G940LEDControl/Units/FSXSimConnectClient.pas @@ -306,7 +306,8 @@ end; procedure TFSXSimConnectClient.Cleanup; begin - // TODO unregister definitions ? + // #ToDo1 -oMvR: 22-2-2013: unregister definitions + if SimConnectHandle <> 0 then SimConnect_Close(SimConnectHandle); @@ -491,7 +492,7 @@ var begin removeDefinition := Msg.MsgData; - // TODO actually remove the definition + // #ToDo1 -oMvR: 22-2-2013: actually remove the definition removeDefinition.Signal; end; diff --git a/G940LEDControl/Units/LEDStateConsumer.pas b/G940LEDControl/Units/LEDStateConsumer.pas index 09b998a..f7c1912 100644 --- a/G940LEDControl/Units/LEDStateConsumer.pas +++ b/G940LEDControl/Units/LEDStateConsumer.pas @@ -192,7 +192,10 @@ begin for oldWorker in ButtonWorkers do begin if Assigned(oldWorker) then + begin + (oldWorker as ILEDFunctionWorker).Detach(Self); oldWorkers.Add(oldWorker); + end; end; ButtonWorkers.Clear; diff --git a/G940LEDControl/Units/Settings.pas b/G940LEDControl/Units/Settings.pas new file mode 100644 index 0000000..14c9d4a --- /dev/null +++ b/G940LEDControl/Units/Settings.pas @@ -0,0 +1,63 @@ +unit Settings; + +interface +uses + X2UtPersistIntf; + +type + TSettings = class(TObject) + private + FCheckUpdates: Boolean; + FHasCheckUpdates: Boolean; + + procedure SetCheckUpdates(const Value: Boolean); + public + procedure Load(AReader: IX2PersistReader); + procedure Save(AWriter: IX2PersistWriter); + + property CheckUpdates: Boolean read FCheckUpdates write SetCheckUpdates; + property HasCheckUpdates: Boolean read FHasCheckUpdates; + end; + + +implementation +const + SectionSettings = 'Settings'; + + KeyCheckUpdates = 'CheckUpdates'; + + +{ TSettings } +procedure TSettings.Load(AReader: IX2PersistReader); +var + value: Boolean; + +begin + if AReader.BeginSection(SectionSettings) then + try + if AReader.ReadBoolean(KeyCheckUpdates, value) then + CheckUpdates := value; + finally + AReader.EndSection; + end; +end; + + +procedure TSettings.Save(AWriter: IX2PersistWriter); +begin + if AWriter.BeginSection(SectionSettings) then + try + AWriter.WriteBoolean(KeyCheckUpdates, CheckUpdates); + finally + AWriter.EndSection; + end; +end; + + +procedure TSettings.SetCheckUpdates(const Value: Boolean); +begin + FCheckUpdates := Value; + FHasCheckUpdates := True; +end; + +end.