Added proof-of-concept client application
This commit is contained in:
parent
1c0ecea038
commit
f7c199eb56
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
AssettoCorsa/source/__history
|
||||||
|
AssettoCorsa/*.dproj.local
|
||||||
|
AssettoCorsa/bin
|
||||||
|
AssettoCorsa/lib
|
19
AssettoCorsa/AssettoCorsaSF.dpr
Normal file
19
AssettoCorsa/AssettoCorsaSF.dpr
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
program AssettoCorsaSF;
|
||||||
|
|
||||||
|
uses
|
||||||
|
Vcl.Forms,
|
||||||
|
MainFrm in 'source\MainFrm.pas' {MainForm},
|
||||||
|
AssettoCorsa.SharedMemory in 'source\AssettoCorsa.SharedMemory.pas',
|
||||||
|
CPort in 'source\CPort.pas';
|
||||||
|
|
||||||
|
{$R *.res}
|
||||||
|
|
||||||
|
var
|
||||||
|
MainForm: TMainForm;
|
||||||
|
|
||||||
|
begin
|
||||||
|
Application.Initialize;
|
||||||
|
Application.MainFormOnTaskbar := True;
|
||||||
|
Application.CreateForm(TMainForm, MainForm);
|
||||||
|
Application.Run;
|
||||||
|
end.
|
155
AssettoCorsa/AssettoCorsaSF.dproj
Normal file
155
AssettoCorsa/AssettoCorsaSF.dproj
Normal file
@ -0,0 +1,155 @@
|
|||||||
|
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup>
|
||||||
|
<ProjectGuid>{3CBA51E1-33C8-4599-8659-3A1F26AA5E70}</ProjectGuid>
|
||||||
|
<ProjectVersion>13.4</ProjectVersion>
|
||||||
|
<FrameworkType>VCL</FrameworkType>
|
||||||
|
<MainSource>AssettoCorsaSF.dpr</MainSource>
|
||||||
|
<Base>True</Base>
|
||||||
|
<Config Condition="'$(Config)'==''">Debug</Config>
|
||||||
|
<Platform Condition="'$(Platform)'==''">Win32</Platform>
|
||||||
|
<TargetedPlatforms>1</TargetedPlatforms>
|
||||||
|
<AppType>Application</AppType>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
|
||||||
|
<Base>true</Base>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="('$(Platform)'=='Win64' and '$(Base)'=='true') or '$(Base_Win64)'!=''">
|
||||||
|
<Base_Win64>true</Base_Win64>
|
||||||
|
<CfgParent>Base</CfgParent>
|
||||||
|
<Base>true</Base>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Base)'=='true') or '$(Base_Win32)'!=''">
|
||||||
|
<Base_Win32>true</Base_Win32>
|
||||||
|
<CfgParent>Base</CfgParent>
|
||||||
|
<Base>true</Base>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_1)'!=''">
|
||||||
|
<Cfg_1>true</Cfg_1>
|
||||||
|
<CfgParent>Base</CfgParent>
|
||||||
|
<Base>true</Base>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_1)'=='true') or '$(Cfg_1_Win32)'!=''">
|
||||||
|
<Cfg_1_Win32>true</Cfg_1_Win32>
|
||||||
|
<CfgParent>Cfg_1</CfgParent>
|
||||||
|
<Cfg_1>true</Cfg_1>
|
||||||
|
<Base>true</Base>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_2)'!=''">
|
||||||
|
<Cfg_2>true</Cfg_2>
|
||||||
|
<CfgParent>Base</CfgParent>
|
||||||
|
<Base>true</Base>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Base)'!=''">
|
||||||
|
<VerInfo_Keys>CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=</VerInfo_Keys>
|
||||||
|
<Manifest_File>None</Manifest_File>
|
||||||
|
<VerInfo_Locale>1043</VerInfo_Locale>
|
||||||
|
<DCC_Namespace>System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace)</DCC_Namespace>
|
||||||
|
<Icon_MainIcon>$(BDS)\bin\delphi_PROJECTICON.ico</Icon_MainIcon>
|
||||||
|
<DCC_UsePackage>bindcompfmx;fmx;rtl;dbrtl;IndySystem;DbxClientDriver;bindcomp;inetdb;DBXInterBaseDriver;DataSnapCommon;DataSnapClient;DataSnapServer;DataSnapProviderClient;xmlrtl;DbxCommonDriver;IndyProtocols;DBXMySQLDriver;dbxcds;soaprtl;FMXTee;bindengine;DBXOracleDriver;CustomIPTransport;dsnap;DBXInformixDriver;IndyCore;FmxTeeUI;DBXFirebirdDriver;inet;inetdbxpress;DBXSybaseASADriver;IPIndyImpl;dbexpress;DataSnapIndy10ServerTransport;$(DCC_UsePackage)</DCC_UsePackage>
|
||||||
|
<DCC_DcuOutput>.\$(Platform)\$(Config)</DCC_DcuOutput>
|
||||||
|
<DCC_ExeOutput>.\$(Platform)\$(Config)</DCC_ExeOutput>
|
||||||
|
<DCC_E>false</DCC_E>
|
||||||
|
<DCC_N>false</DCC_N>
|
||||||
|
<DCC_S>false</DCC_S>
|
||||||
|
<DCC_F>false</DCC_F>
|
||||||
|
<DCC_K>false</DCC_K>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Base_Win64)'!=''">
|
||||||
|
<DCC_UsePackage>DBXOdbcDriver;DBXSybaseASEDriver;vclimg;vclactnband;vcldb;bindcompvcl;vcldsnap;vclie;vcltouch;DBXDb2Driver;websnap;VclSmp;vcl;DBXMSSQLDriver;dsnapcon;vclx;webdsnap;$(DCC_UsePackage)</DCC_UsePackage>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Base_Win32)'!=''">
|
||||||
|
<DCC_ExeOutput>.\bin\x86</DCC_ExeOutput>
|
||||||
|
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
|
||||||
|
<DCC_Namespace>Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)</DCC_Namespace>
|
||||||
|
<DCC_UsePackage>madBasic_;vcldbx;TeeDB;vclib;inetdbbde;Tee;DBXOdbcDriver;madDisAsm_;svnui;ibxpress;DBXSybaseASEDriver;vclimg;vclactnband;vcldb;TeeUI;bindcompvcl;vcldsnap;vclie;madExcept_;vcltouch;DBXDb2Driver;websnap;VclSmp;vcl;DataSnapConnectors;CloudService;DBXMSSQLDriver;dsnapcon;vclx;webdsnap;svn;bdertl;VirtualTreesR;$(DCC_UsePackage)</DCC_UsePackage>
|
||||||
|
<DCC_DcuOutput>.\lib\x86</DCC_DcuOutput>
|
||||||
|
<VerInfo_Locale>1033</VerInfo_Locale>
|
||||||
|
<Manifest_File>$(BDS)\bin\default_app.manifest</Manifest_File>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Cfg_1)'!=''">
|
||||||
|
<DCC_Define>DEBUG;$(DCC_Define)</DCC_Define>
|
||||||
|
<DCC_Optimize>false</DCC_Optimize>
|
||||||
|
<DCC_GenerateStackFrames>true</DCC_GenerateStackFrames>
|
||||||
|
<DCC_DebugInfoInExe>true</DCC_DebugInfoInExe>
|
||||||
|
<DCC_RemoteDebug>true</DCC_RemoteDebug>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Cfg_1_Win32)'!=''">
|
||||||
|
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
|
||||||
|
<VerInfo_Locale>1033</VerInfo_Locale>
|
||||||
|
<DCC_RemoteDebug>false</DCC_RemoteDebug>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Cfg_2)'!=''">
|
||||||
|
<DCC_LocalDebugSymbols>false</DCC_LocalDebugSymbols>
|
||||||
|
<DCC_Define>RELEASE;$(DCC_Define)</DCC_Define>
|
||||||
|
<DCC_SymbolReferenceInfo>0</DCC_SymbolReferenceInfo>
|
||||||
|
<DCC_DebugInformation>false</DCC_DebugInformation>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<DelphiCompile Include="$(MainSource)">
|
||||||
|
<MainSource>MainSource</MainSource>
|
||||||
|
</DelphiCompile>
|
||||||
|
<DCCReference Include="source\MainFrm.pas">
|
||||||
|
<Form>MainForm</Form>
|
||||||
|
<FormType>dfm</FormType>
|
||||||
|
</DCCReference>
|
||||||
|
<DCCReference Include="source\AssettoCorsa.SharedMemory.pas"/>
|
||||||
|
<DCCReference Include="source\CPort.pas"/>
|
||||||
|
<BuildConfiguration Include="Release">
|
||||||
|
<Key>Cfg_2</Key>
|
||||||
|
<CfgParent>Base</CfgParent>
|
||||||
|
</BuildConfiguration>
|
||||||
|
<BuildConfiguration Include="Base">
|
||||||
|
<Key>Base</Key>
|
||||||
|
</BuildConfiguration>
|
||||||
|
<BuildConfiguration Include="Debug">
|
||||||
|
<Key>Cfg_1</Key>
|
||||||
|
<CfgParent>Base</CfgParent>
|
||||||
|
</BuildConfiguration>
|
||||||
|
</ItemGroup>
|
||||||
|
<ProjectExtensions>
|
||||||
|
<Borland.Personality>Delphi.Personality.12</Borland.Personality>
|
||||||
|
<Borland.ProjectType/>
|
||||||
|
<BorlandProject>
|
||||||
|
<Delphi.Personality>
|
||||||
|
<Source>
|
||||||
|
<Source Name="MainSource">AssettoCorsaSF.dpr</Source>
|
||||||
|
</Source>
|
||||||
|
<VersionInfo>
|
||||||
|
<VersionInfo Name="IncludeVerInfo">False</VersionInfo>
|
||||||
|
<VersionInfo Name="AutoIncBuild">False</VersionInfo>
|
||||||
|
<VersionInfo Name="MajorVer">1</VersionInfo>
|
||||||
|
<VersionInfo Name="MinorVer">0</VersionInfo>
|
||||||
|
<VersionInfo Name="Release">0</VersionInfo>
|
||||||
|
<VersionInfo Name="Build">0</VersionInfo>
|
||||||
|
<VersionInfo Name="Debug">False</VersionInfo>
|
||||||
|
<VersionInfo Name="PreRelease">False</VersionInfo>
|
||||||
|
<VersionInfo Name="Special">False</VersionInfo>
|
||||||
|
<VersionInfo Name="Private">False</VersionInfo>
|
||||||
|
<VersionInfo Name="DLL">False</VersionInfo>
|
||||||
|
<VersionInfo Name="Locale">1043</VersionInfo>
|
||||||
|
<VersionInfo Name="CodePage">1252</VersionInfo>
|
||||||
|
</VersionInfo>
|
||||||
|
<VersionInfoKeys>
|
||||||
|
<VersionInfoKeys Name="CompanyName"/>
|
||||||
|
<VersionInfoKeys Name="FileDescription"/>
|
||||||
|
<VersionInfoKeys Name="FileVersion">1.0.0.0</VersionInfoKeys>
|
||||||
|
<VersionInfoKeys Name="InternalName"/>
|
||||||
|
<VersionInfoKeys Name="LegalCopyright"/>
|
||||||
|
<VersionInfoKeys Name="LegalTrademarks"/>
|
||||||
|
<VersionInfoKeys Name="OriginalFilename"/>
|
||||||
|
<VersionInfoKeys Name="ProductName"/>
|
||||||
|
<VersionInfoKeys Name="ProductVersion">1.0.0.0</VersionInfoKeys>
|
||||||
|
<VersionInfoKeys Name="Comments"/>
|
||||||
|
</VersionInfoKeys>
|
||||||
|
</Delphi.Personality>
|
||||||
|
<Deployment/>
|
||||||
|
<Platforms>
|
||||||
|
<Platform value="Win64">False</Platform>
|
||||||
|
<Platform value="Win32">True</Platform>
|
||||||
|
</Platforms>
|
||||||
|
</BorlandProject>
|
||||||
|
<ProjectFileVersion>12</ProjectFileVersion>
|
||||||
|
</ProjectExtensions>
|
||||||
|
<Import Condition="Exists('$(BDS)\Bin\CodeGear.Delphi.Targets')" Project="$(BDS)\Bin\CodeGear.Delphi.Targets"/>
|
||||||
|
<Import Condition="Exists('$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj')" Project="$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj"/>
|
||||||
|
</Project>
|
BIN
AssettoCorsa/AssettoCorsaSF.res
Normal file
BIN
AssettoCorsa/AssettoCorsaSF.res
Normal file
Binary file not shown.
333
AssettoCorsa/source/AssettoCorsa.SharedMemory.pas
Normal file
333
AssettoCorsa/source/AssettoCorsa.SharedMemory.pas
Normal file
@ -0,0 +1,333 @@
|
|||||||
|
unit AssettoCorsa.SharedMemory;
|
||||||
|
|
||||||
|
interface
|
||||||
|
type
|
||||||
|
AC_STATUS = Integer;
|
||||||
|
TACStatus = AC_STATUS;
|
||||||
|
|
||||||
|
|
||||||
|
const
|
||||||
|
{ AC_STATUS }
|
||||||
|
AC_OFF = 0;
|
||||||
|
AC_REPLAY = 1;
|
||||||
|
AC_LIVE = 2;
|
||||||
|
AC_PAUSE = 3;
|
||||||
|
|
||||||
|
|
||||||
|
type
|
||||||
|
AC_SESSION_TYPE = Integer;
|
||||||
|
TACSessionType = AC_SESSION_TYPE;
|
||||||
|
|
||||||
|
const
|
||||||
|
{ AC_SESSION_TYPE }
|
||||||
|
AC_UNKNOWN = -1;
|
||||||
|
AC_PRACTICE = 0;
|
||||||
|
AC_QUALIFY = 1;
|
||||||
|
AC_RACE = 2;
|
||||||
|
AC_HOTLAP = 3;
|
||||||
|
AC_TIME_ATTACK = 4;
|
||||||
|
AC_DRIFT = 5;
|
||||||
|
AC_DRAG = 6;
|
||||||
|
|
||||||
|
|
||||||
|
type
|
||||||
|
AC_FLAG_TYPE = Integer;
|
||||||
|
TACFlagType = AC_FLAG_TYPE;
|
||||||
|
|
||||||
|
const
|
||||||
|
{ AC_FLAG_TYPE }
|
||||||
|
AC_NO_FLAG = 0;
|
||||||
|
AC_BLUE_FLAG = 1;
|
||||||
|
AC_YELLOW_FLAG = 2;
|
||||||
|
AC_BLACK_FLAG = 3;
|
||||||
|
AC_WHITE_FLAG = 4;
|
||||||
|
AC_CHECKERED_FLAG = 5;
|
||||||
|
AC_PENALTY_FLAG = 6;
|
||||||
|
|
||||||
|
|
||||||
|
type
|
||||||
|
TACSMPhysics = packed record
|
||||||
|
packetId: Integer;
|
||||||
|
gas: Single;
|
||||||
|
brake: Single;
|
||||||
|
fuel: Single;
|
||||||
|
gear: Integer;
|
||||||
|
rpms: Integer;
|
||||||
|
steerAngle: Single;
|
||||||
|
speedKmh: Single;
|
||||||
|
velocity: array[0..2] of Single;
|
||||||
|
accG: array[0..2] of Single;
|
||||||
|
wheelSlip: array[0..3] of Single;
|
||||||
|
wheelLoad: array[0..3] of Single;
|
||||||
|
wheelsPressure: array[0..3] of Single;
|
||||||
|
wheelAngularSpeed: array[0..3] of Single;
|
||||||
|
tyreWear: array[0..3] of Single;
|
||||||
|
tyreDirtyLevel: array[0..3] of Single;
|
||||||
|
tyreCoreTemperature: array[0..3] of Single;
|
||||||
|
camberRAD: array[0..3] of Single;
|
||||||
|
suspensionTravel: array[0..3] of Single;
|
||||||
|
drs: Single;
|
||||||
|
tc: Single;
|
||||||
|
heading: Single;
|
||||||
|
pitch: Single;
|
||||||
|
roll: Single;
|
||||||
|
cgHeight: Single;
|
||||||
|
carDamage: array[0..4] of Single;
|
||||||
|
umberOfTyresOut: Integer;
|
||||||
|
pitLimiterOn: Integer;
|
||||||
|
abs: Single;
|
||||||
|
kersCharge: Single;
|
||||||
|
kersInput: Single;
|
||||||
|
autoShifterOn: Integer;
|
||||||
|
rideHeigh: Single;
|
||||||
|
turboBoost: Single;
|
||||||
|
ballast: Single;
|
||||||
|
airDensity: Single;
|
||||||
|
airTemp: Single;
|
||||||
|
roadTemp: Single;
|
||||||
|
localAngularVelocity: array[0..2] of Single;
|
||||||
|
finalFF: Single;
|
||||||
|
performanceMeter: Single;
|
||||||
|
|
||||||
|
engineBrake: Integer;
|
||||||
|
ersRecoveryLevel: Integer;
|
||||||
|
ersPowerLevel: Integer;
|
||||||
|
ersHeatCharging: Integer;
|
||||||
|
ersIsCharging: Integer;
|
||||||
|
kersCurrentKJ: Single;
|
||||||
|
|
||||||
|
drsAvailable: Integer;
|
||||||
|
drsEnabled: Integer;
|
||||||
|
|
||||||
|
brakeTemp: array[0..3] of Single;
|
||||||
|
clutch: Single;
|
||||||
|
|
||||||
|
tyreTempI: array[0..3] of Single;
|
||||||
|
tyreTempM: array[0..3] of Single;
|
||||||
|
tyreTempO: array[0..3] of Single;
|
||||||
|
|
||||||
|
isAIControlled: Integer;
|
||||||
|
|
||||||
|
tyreContactPoint: array[0..3, 0..2] of Single;
|
||||||
|
tyreContactNormal: array[0..3, 0..2] of Single;
|
||||||
|
tyreContactHeading: array[0..3, 0..2] of Single;
|
||||||
|
|
||||||
|
brakeBias: Single;
|
||||||
|
end;
|
||||||
|
PACSMPhysics = ^TACSMPhysics;
|
||||||
|
|
||||||
|
|
||||||
|
TACSMGraphic = packed record
|
||||||
|
packetId: Integer;
|
||||||
|
status: TACStatus;
|
||||||
|
session: TACSessionType;
|
||||||
|
currentTime: array[0..14] of WideChar;
|
||||||
|
lastTime: array[0..14] of WideChar;
|
||||||
|
bestTime: array[0..14] of WideChar;
|
||||||
|
split: array[0..14] of WideChar;
|
||||||
|
completedLaps: Integer;
|
||||||
|
position: Integer;
|
||||||
|
iCurrentTime: Integer;
|
||||||
|
iLastTime: Integer;
|
||||||
|
iBestTime: Integer;
|
||||||
|
sessionTimeLeft: Single;
|
||||||
|
distanceTraveled: Single;
|
||||||
|
isInPit: Integer;
|
||||||
|
currentSectorIndex: Integer;
|
||||||
|
lastSectorTime: Integer;
|
||||||
|
numberOfLaps: Integer;
|
||||||
|
tyreCompound: array[0..32] of WideChar;
|
||||||
|
|
||||||
|
replayTimeMultiplier: Single;
|
||||||
|
normalizedCarPosition: Single;
|
||||||
|
carCoordinates: array[0..2] of Single;
|
||||||
|
penaltyTime: Single;
|
||||||
|
flag: TACFlagType;
|
||||||
|
idealLineOn: Integer;
|
||||||
|
isInPitLane: Integer;
|
||||||
|
|
||||||
|
surfaceGrip: Single;
|
||||||
|
end;
|
||||||
|
PACSMGraphic = ^TACSMGraphic;
|
||||||
|
|
||||||
|
|
||||||
|
TACSMStatic = packed record
|
||||||
|
smVersion: array[0..14] of WideChar;
|
||||||
|
acVersion: array[0..14] of WideChar;
|
||||||
|
|
||||||
|
// Session static info
|
||||||
|
numberOfSessions: Integer;
|
||||||
|
numCars: Integer;
|
||||||
|
carModel: array[0..32] of WideChar;
|
||||||
|
track: array[0..32] of WideChar;
|
||||||
|
playerName: array[0..32] of WideChar;
|
||||||
|
playerSurname: array[0..32] of WideChar;
|
||||||
|
playerNick: array[0..32] of WideChar;
|
||||||
|
sectorCount: Integer;
|
||||||
|
|
||||||
|
// Car static info
|
||||||
|
maxTorque: Single;
|
||||||
|
maxPower: Single;
|
||||||
|
maxRpm: Integer;
|
||||||
|
maxFuel: Single;
|
||||||
|
suspensionMaxTravel: array[0..3] of Single;
|
||||||
|
tyreRadius: array[0..3] of Single;
|
||||||
|
maxTurboBoost: Single;
|
||||||
|
|
||||||
|
deprecated_1: Single;
|
||||||
|
deprecated_2: Single;
|
||||||
|
|
||||||
|
penaltiesEnabled: Integer;
|
||||||
|
|
||||||
|
aidFuelRate: Single;
|
||||||
|
aidTireRate: Single;
|
||||||
|
aidMechanicalDamage: Single;
|
||||||
|
aidAllowTyreBlankets: Integer;
|
||||||
|
aidStability: Single;
|
||||||
|
aidAutoClutch: Integer;
|
||||||
|
aidAutoBlip: Integer;
|
||||||
|
|
||||||
|
hasDRS: Integer;
|
||||||
|
hasERS: Integer;
|
||||||
|
hasKERS: Integer;
|
||||||
|
kersMaxJ: Single;
|
||||||
|
engineBrakeSettingsCount: Integer;
|
||||||
|
ersPowerControllerCount: Integer;
|
||||||
|
trackSPlineLength: Single;
|
||||||
|
trackConfiguration: array[0..32] of WideChar;
|
||||||
|
ersMaxJ: Single;
|
||||||
|
end;
|
||||||
|
PACSMStatic = ^TACSMStatic;
|
||||||
|
|
||||||
|
|
||||||
|
const
|
||||||
|
ACSM_PHYSICS = 'Local\acpmf_physics';
|
||||||
|
ACSM_GRAPHICS = 'Local\acpmf_graphics';
|
||||||
|
ACSM_STATIC = 'Local\acpmf_static';
|
||||||
|
|
||||||
|
|
||||||
|
type
|
||||||
|
IAssettoCorsaSharedMemory = interface
|
||||||
|
['{D7C0E678-CB11-4C34-81EB-4AAD5737C44F}']
|
||||||
|
function GetPhysics(out APhysics: TACSMPhysics): Boolean;
|
||||||
|
function GetGraphic(out AGraphic: TACSMGraphic): Boolean;
|
||||||
|
function GetStatic(out AStatic: TACSMStatic): Boolean;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
function GetAssettoCorsaSharedMemory(): IAssettoCorsaSharedMemory;
|
||||||
|
|
||||||
|
|
||||||
|
implementation
|
||||||
|
uses
|
||||||
|
WinApi.Windows, System.SysUtils, System.Classes;
|
||||||
|
|
||||||
|
|
||||||
|
type
|
||||||
|
TACSMMapping = record
|
||||||
|
Handle: THandle;
|
||||||
|
Buffer: Pointer;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
TAssettoCorsaSharedMemory = class(TInterfacedObject, IAssettoCorsaSharedMemory)
|
||||||
|
private
|
||||||
|
FPhysicsMapping: TACSMMapping;
|
||||||
|
FGraphicMapping: TACSMMapping;
|
||||||
|
FStaticMapping: TACSMMapping;
|
||||||
|
protected
|
||||||
|
function OpenMapping(const AName: string; var AMapping: TACSMMapping; ASize: Integer): Boolean;
|
||||||
|
procedure CloseMapping(var AMapping: TACSMMapping);
|
||||||
|
public
|
||||||
|
destructor Destroy; override;
|
||||||
|
|
||||||
|
{ IACSM }
|
||||||
|
function GetPhysics(out APhysics: TACSMPhysics): Boolean;
|
||||||
|
function GetGraphic(out AGraphic: TACSMGraphic): Boolean;
|
||||||
|
function GetStatic(out AStatic: TACSMStatic): Boolean;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
function GetAssettoCorsaSharedMemory(): IAssettoCorsaSharedMemory;
|
||||||
|
begin
|
||||||
|
Result := TAssettoCorsaSharedMemory.Create;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
{ TACSM }
|
||||||
|
destructor TAssettoCorsaSharedMemory.Destroy;
|
||||||
|
begin
|
||||||
|
CloseMapping(FPhysicsMapping);
|
||||||
|
CloseMapping(FGraphicMapping);
|
||||||
|
CloseMapping(FStaticMapping);
|
||||||
|
|
||||||
|
inherited;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
function TAssettoCorsaSharedMemory.GetPhysics(out APhysics: TACSMPhysics): Boolean;
|
||||||
|
begin
|
||||||
|
Result := OpenMapping(ACSM_PHYSICS, FPhysicsMapping, SizeOf(TACSMPhysics));
|
||||||
|
if Result then
|
||||||
|
APhysics := PACSMPhysics(FPhysicsMapping.Buffer)^;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
function TAssettoCorsaSharedMemory.GetGraphic(out AGraphic: TACSMGraphic): Boolean;
|
||||||
|
begin
|
||||||
|
Result := OpenMapping(ACSM_GRAPHICS, FGraphicMapping, SizeOf(TACSMGraphic));
|
||||||
|
if Result then
|
||||||
|
AGraphic := PACSMGraphic(FGraphicMapping.Buffer)^;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
function TAssettoCorsaSharedMemory.GetStatic(out AStatic: TACSMStatic): Boolean;
|
||||||
|
begin
|
||||||
|
Result := OpenMapping(ACSM_STATIC, FStaticMapping, SizeOf(TACSMStatic));
|
||||||
|
if Result then
|
||||||
|
AStatic := PACSMStatic(FStaticMapping.Buffer)^;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
function TAssettoCorsaSharedMemory.OpenMapping(const AName: string; var AMapping: TACSMMapping; ASize: Integer): Boolean;
|
||||||
|
var
|
||||||
|
handle: THandle;
|
||||||
|
buffer: Pointer;
|
||||||
|
|
||||||
|
begin
|
||||||
|
if AMapping.Handle <> 0 then
|
||||||
|
begin
|
||||||
|
Result := True;
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
|
||||||
|
Result := False;
|
||||||
|
handle := OpenFileMapping(FILE_MAP_READ, False, PChar(AName));
|
||||||
|
if handle = 0 then
|
||||||
|
Exit;
|
||||||
|
|
||||||
|
buffer := MapViewOfFile(handle, FILE_MAP_READ, 0, 0, ASize);
|
||||||
|
if Assigned(buffer) then
|
||||||
|
begin
|
||||||
|
AMapping.Handle := handle;
|
||||||
|
AMapping.Buffer := buffer;
|
||||||
|
Result := True;
|
||||||
|
end else
|
||||||
|
begin
|
||||||
|
CloseHandle(handle);
|
||||||
|
RaiseLastOSError;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
procedure TAssettoCorsaSharedMemory.CloseMapping(var AMapping: TACSMMapping);
|
||||||
|
begin
|
||||||
|
if AMapping.Handle <> 0 then
|
||||||
|
begin
|
||||||
|
UnmapViewOfFile(AMapping.Buffer);
|
||||||
|
CloseHandle(AMapping.Handle);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
end.
|
227
AssettoCorsa/source/CPort.inc
Normal file
227
AssettoCorsa/source/CPort.inc
Normal file
@ -0,0 +1,227 @@
|
|||||||
|
{ ComPort Library global definitions }
|
||||||
|
|
||||||
|
{ Fixed up for Delphi 2009 by W.Postma. }
|
||||||
|
|
||||||
|
{$B-}
|
||||||
|
{$X+}
|
||||||
|
{$H+}
|
||||||
|
|
||||||
|
{$IFDEF VER110} { C++ Builder 3 }
|
||||||
|
{$ObjExportAll On}
|
||||||
|
{$DEFINE VER_RECOGNIZED}
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
|
{$IFDEF VER120} { Delphi 4 }
|
||||||
|
{$DEFINE DELPHI_4_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_4}
|
||||||
|
{$DEFINE VER_RECOGNIZED}
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
|
{$IFDEF VER125} { C++ Builder 4 }
|
||||||
|
{$DEFINE DELPHI_4_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_4}
|
||||||
|
{$ObjExportAll On}
|
||||||
|
{$DEFINE VER_RECOGNIZED}
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
|
{$IFDEF VER130} { Delphi 5 and C++ Builder 5 }
|
||||||
|
{$DEFINE DELPHI_4_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_5_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_5}
|
||||||
|
{$IFDEF BCBNOTDELPHI}
|
||||||
|
{$ObjExportAll On}
|
||||||
|
{$ENDIF}
|
||||||
|
{$DEFINE VER_RECOGNIZED}
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
|
{$IFDEF VER140} { Delphi 6 and C++ Builder 6}
|
||||||
|
{$DEFINE DELPHI_4_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_5_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_6_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_6}
|
||||||
|
{$IFDEF BCBNOTDELPHI}
|
||||||
|
{$ObjExportAll On}
|
||||||
|
{$ENDIF}
|
||||||
|
{$DEFINE VER_RECOGNIZED}
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
|
{$IFDEF VER150} { Delphi 7 }
|
||||||
|
{$DEFINE DELPHI_4_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_5_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_6_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_7_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_7}
|
||||||
|
{$IFDEF BCBNOTDELPHI}
|
||||||
|
{$ObjExportAll On}
|
||||||
|
{$ENDIF}
|
||||||
|
{$WARN UNSAFE_TYPE OFF}
|
||||||
|
{$WARN UNSAFE_CODE OFF}
|
||||||
|
{$WARN UNSAFE_CAST OFF}
|
||||||
|
{$DEFINE VER_RECOGNIZED}
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
|
{$IFDEF VER160} { Delphi 8 }
|
||||||
|
{$DEFINE DELPHI_4_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_5_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_6_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_7_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_8_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_8}
|
||||||
|
{$IFDEF BCBNOTDELPHI}
|
||||||
|
{$ObjExportAll On}
|
||||||
|
{$ENDIF}
|
||||||
|
{$WARN UNSAFE_TYPE OFF}
|
||||||
|
{$WARN UNSAFE_CODE OFF}
|
||||||
|
{$WARN UNSAFE_CAST OFF}
|
||||||
|
{$DEFINE VER_RECOGNIZED}
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
|
{$IFDEF VER170} { Delphi 9 (2005) }
|
||||||
|
{$DEFINE DELPHI_4_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_5_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_6_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_7_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_8_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_2005_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_2005}
|
||||||
|
{$IFDEF BCBNOTDELPHI}
|
||||||
|
{$ObjExportAll On}
|
||||||
|
{$ENDIF}
|
||||||
|
{$WARN UNSAFE_TYPE OFF}
|
||||||
|
{$WARN UNSAFE_CODE OFF}
|
||||||
|
{$WARN UNSAFE_CAST OFF}
|
||||||
|
{$DEFINE VER_RECOGNIZED}
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
|
{$IFDEF VER180} { Delphi 10 (2006) }
|
||||||
|
{$DEFINE DELPHI_4_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_5_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_6_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_7_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_8_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_2005_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_2006_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_2006}
|
||||||
|
{$IFDEF BCBNOTDELPHI}
|
||||||
|
{$ObjExportAll On}
|
||||||
|
{$ENDIF}
|
||||||
|
{$WARN UNSAFE_TYPE OFF}
|
||||||
|
{$WARN UNSAFE_CODE OFF}
|
||||||
|
{$WARN UNSAFE_CAST OFF}
|
||||||
|
{$DEFINE VER_RECOGNIZED}
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
|
{$IFDEF VER185} { Delphi 11 - 2007 }
|
||||||
|
{$DEFINE DELPHI_4_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_5_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_6_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_7_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_8_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_2005_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_2006_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_2007_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_2007}
|
||||||
|
{$WARN UNSAFE_TYPE OFF}
|
||||||
|
{$WARN UNSAFE_CODE OFF}
|
||||||
|
{$WARN UNSAFE_CAST OFF}
|
||||||
|
{$IFDEF BCB}
|
||||||
|
{$DEFINE BCB11}
|
||||||
|
{$ObjExportAll On}
|
||||||
|
{$ENDIF}
|
||||||
|
{$DEFINE VER_RECOGNIZED}
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
|
|
||||||
|
{$IFDEF VER190} { Delphi 12 2008 }
|
||||||
|
{$DEFINE DELPHI_4_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_5_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_6_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_7_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_8_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_2005_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_2006_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_2007_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_2008_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_2008}
|
||||||
|
{$DEFINE DELPHI_UNICODE}
|
||||||
|
{$IFDEF BCBNOTDELPHI}
|
||||||
|
{$ObjExportAll On}
|
||||||
|
{$ENDIF}
|
||||||
|
{$WARN UNSAFE_TYPE OFF}
|
||||||
|
{$WARN UNSAFE_CODE OFF}
|
||||||
|
{$WARN UNSAFE_CAST OFF}
|
||||||
|
{$DEFINE VER_RECOGNIZED}
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{$IFDEF VER200} { Delphi 14 2009 UNICODE }
|
||||||
|
{$DEFINE DELPHI_4_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_5_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_6_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_7_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_8_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_2005_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_2006_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_2007_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_2008_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_2009_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_2009}
|
||||||
|
{$DEFINE DELPHI_UNICODE}
|
||||||
|
{$IFDEF BCBNOTDELPHI}
|
||||||
|
{$ObjExportAll On}
|
||||||
|
{$ENDIF}
|
||||||
|
{$WARN UNSAFE_TYPE OFF}
|
||||||
|
{$WARN UNSAFE_CODE OFF}
|
||||||
|
{$WARN UNSAFE_CAST OFF}
|
||||||
|
{$DEFINE VER_RECOGNIZED}
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{$IFDEF VER210} { Delphi 15 XE 2010 UNICODE }
|
||||||
|
{$DEFINE DELPHI_4_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_5_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_6_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_7_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_8_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_2005_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_2006_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_2007_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_2008_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_2009_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_2010_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_2010}
|
||||||
|
{$DEFINE DELPHI_UNICODE}
|
||||||
|
{$IFDEF BCBNOTDELPHI}
|
||||||
|
{$ObjExportAll On}
|
||||||
|
{$ENDIF}
|
||||||
|
{$WARN UNSAFE_TYPE OFF}
|
||||||
|
{$WARN UNSAFE_CODE OFF}
|
||||||
|
{$WARN UNSAFE_CAST OFF}
|
||||||
|
{$DEFINE VER_RECOGNIZED}
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
|
|
||||||
|
{... Lets try to make it work, for Delphi 2011 and later, right now...}
|
||||||
|
{$IFNDEF VER_RECOGNIZED}
|
||||||
|
{$DEFINE DELPHI_4_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_5_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_6_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_7_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_8_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_2005_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_2006_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_2007_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_2009_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_2010_OR_HIGHER}
|
||||||
|
{$DEFINE DELPHI_UNICODE}
|
||||||
|
{$WARN UNSAFE_TYPE OFF}
|
||||||
|
{$WARN UNSAFE_CODE OFF}
|
||||||
|
{$WARN UNSAFE_CAST OFF}
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
|
|
||||||
|
{$UNDEF VER_RECOGNIZED}
|
||||||
|
|
3652
AssettoCorsa/source/CPort.pas
Normal file
3652
AssettoCorsa/source/CPort.pas
Normal file
File diff suppressed because it is too large
Load Diff
90
AssettoCorsa/source/MainFrm.dfm
Normal file
90
AssettoCorsa/source/MainFrm.dfm
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
object MainForm: TMainForm
|
||||||
|
Left = 0
|
||||||
|
Top = 0
|
||||||
|
BorderIcons = [biSystemMenu, biMinimize]
|
||||||
|
BorderStyle = bsSingle
|
||||||
|
Caption = 'SimulatorFans - Assetto Corsa'
|
||||||
|
ClientHeight = 309
|
||||||
|
ClientWidth = 645
|
||||||
|
Color = clBtnFace
|
||||||
|
Font.Charset = DEFAULT_CHARSET
|
||||||
|
Font.Color = clWindowText
|
||||||
|
Font.Height = -11
|
||||||
|
Font.Name = 'Tahoma'
|
||||||
|
Font.Style = []
|
||||||
|
OldCreateOrder = False
|
||||||
|
OnCreate = FormCreate
|
||||||
|
PixelsPerInch = 96
|
||||||
|
TextHeight = 13
|
||||||
|
object PortComboBox: TComboBox
|
||||||
|
Left = 24
|
||||||
|
Top = 24
|
||||||
|
Width = 201
|
||||||
|
Height = 21
|
||||||
|
Style = csDropDownList
|
||||||
|
TabOrder = 0
|
||||||
|
end
|
||||||
|
object RefreshPortsButton: TButton
|
||||||
|
Left = 231
|
||||||
|
Top = 23
|
||||||
|
Width = 75
|
||||||
|
Height = 23
|
||||||
|
Caption = 'Refresh'
|
||||||
|
TabOrder = 1
|
||||||
|
OnClick = RefreshPortsButtonClick
|
||||||
|
end
|
||||||
|
object Button1: TButton
|
||||||
|
Left = 192
|
||||||
|
Top = 176
|
||||||
|
Width = 75
|
||||||
|
Height = 25
|
||||||
|
Caption = 'Connect'
|
||||||
|
TabOrder = 2
|
||||||
|
OnClick = Button1Click
|
||||||
|
end
|
||||||
|
object Button2: TButton
|
||||||
|
Left = 288
|
||||||
|
Top = 176
|
||||||
|
Width = 75
|
||||||
|
Height = 25
|
||||||
|
Caption = 'Fan 1 full'
|
||||||
|
TabOrder = 3
|
||||||
|
OnClick = Button2Click
|
||||||
|
end
|
||||||
|
object Button3: TButton
|
||||||
|
Left = 384
|
||||||
|
Top = 176
|
||||||
|
Width = 75
|
||||||
|
Height = 25
|
||||||
|
Caption = 'Fan 2 full'
|
||||||
|
TabOrder = 4
|
||||||
|
OnClick = Button3Click
|
||||||
|
end
|
||||||
|
object Button4: TButton
|
||||||
|
Left = 480
|
||||||
|
Top = 176
|
||||||
|
Width = 75
|
||||||
|
Height = 25
|
||||||
|
Caption = 'Off'
|
||||||
|
TabOrder = 5
|
||||||
|
OnClick = Button4Click
|
||||||
|
end
|
||||||
|
object Button5: TButton
|
||||||
|
Left = 288
|
||||||
|
Top = 207
|
||||||
|
Width = 75
|
||||||
|
Height = 25
|
||||||
|
Caption = 'Fan 1 half'
|
||||||
|
TabOrder = 6
|
||||||
|
OnClick = Button5Click
|
||||||
|
end
|
||||||
|
object Button6: TButton
|
||||||
|
Left = 384
|
||||||
|
Top = 207
|
||||||
|
Width = 75
|
||||||
|
Height = 25
|
||||||
|
Caption = 'Fan 2 half'
|
||||||
|
TabOrder = 7
|
||||||
|
OnClick = Button6Click
|
||||||
|
end
|
||||||
|
end
|
187
AssettoCorsa/source/MainFrm.pas
Normal file
187
AssettoCorsa/source/MainFrm.pas
Normal file
@ -0,0 +1,187 @@
|
|||||||
|
unit MainFrm;
|
||||||
|
|
||||||
|
interface
|
||||||
|
uses
|
||||||
|
System.Classes,
|
||||||
|
System.SysUtils,
|
||||||
|
Vcl.Controls,
|
||||||
|
Vcl.ExtCtrls,
|
||||||
|
Vcl.Forms,
|
||||||
|
Vcl.StdCtrls,
|
||||||
|
|
||||||
|
CPort;
|
||||||
|
|
||||||
|
|
||||||
|
type
|
||||||
|
TMainForm = class(TForm)
|
||||||
|
PortComboBox: TComboBox;
|
||||||
|
RefreshPortsButton: TButton;
|
||||||
|
Button1: TButton;
|
||||||
|
Button2: TButton;
|
||||||
|
Button3: TButton;
|
||||||
|
Button4: TButton;
|
||||||
|
Button5: TButton;
|
||||||
|
Button6: TButton;
|
||||||
|
|
||||||
|
procedure FormCreate(Sender: TObject);
|
||||||
|
procedure RefreshPortsButtonClick(Sender: TObject);
|
||||||
|
procedure Button1Click(Sender: TObject);
|
||||||
|
procedure Button2Click(Sender: TObject);
|
||||||
|
procedure Button3Click(Sender: TObject);
|
||||||
|
procedure Button4Click(Sender: TObject);
|
||||||
|
procedure Button5Click(Sender: TObject);
|
||||||
|
procedure Button6Click(Sender: TObject);
|
||||||
|
private
|
||||||
|
FComPort: TComPort;
|
||||||
|
FReceived: string;
|
||||||
|
FOnResponse: TProc<string>;
|
||||||
|
|
||||||
|
procedure OnReceiveChar(Sender: TObject; Count: Integer);
|
||||||
|
|
||||||
|
procedure RefreshPorts;
|
||||||
|
procedure SendCommand(const ACommand: string; AOnResponse: TProc<string>);
|
||||||
|
|
||||||
|
property ComPort: TComPort read FComPort;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
uses
|
||||||
|
System.RegularExpressions, Vcl.Dialogs;
|
||||||
|
|
||||||
|
{$R *.dfm}
|
||||||
|
|
||||||
|
procedure TMainForm.Button1Click(Sender: TObject);
|
||||||
|
begin
|
||||||
|
SendCommand('>Info',
|
||||||
|
procedure(Response: string)
|
||||||
|
var
|
||||||
|
match: TMatch;
|
||||||
|
|
||||||
|
begin
|
||||||
|
match := TRegEx.Match(Response, '<Info:Fans=(\d+)', [roSingleLine]);
|
||||||
|
if match.Success then
|
||||||
|
ShowMessage('Connected, got ' + match.Groups[1].Value + ' fan(s)')
|
||||||
|
else
|
||||||
|
ShowMessage('Invalid response: ' + Response);
|
||||||
|
end);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TMainForm.Button2Click(Sender: TObject);
|
||||||
|
begin
|
||||||
|
SendCommand('>SetFans:255,0',
|
||||||
|
procedure(Response: string)
|
||||||
|
begin
|
||||||
|
if Response <> '<SetFans' then
|
||||||
|
ShowMessage('Invalid response: ' + Response);
|
||||||
|
end);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TMainForm.Button3Click(Sender: TObject);
|
||||||
|
begin
|
||||||
|
SendCommand('>SetFans:0,255',
|
||||||
|
procedure(Response: string)
|
||||||
|
begin
|
||||||
|
if Response <> '<SetFans' then
|
||||||
|
ShowMessage('Invalid response: ' + Response);
|
||||||
|
end);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TMainForm.Button4Click(Sender: TObject);
|
||||||
|
begin
|
||||||
|
SendCommand('>SetFans:0,0',
|
||||||
|
procedure(Response: string)
|
||||||
|
begin
|
||||||
|
if Response <> '<SetFans' then
|
||||||
|
ShowMessage('Invalid response: ' + Response);
|
||||||
|
end);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TMainForm.Button5Click(Sender: TObject);
|
||||||
|
begin
|
||||||
|
SendCommand('>SetFans:128,0',
|
||||||
|
procedure(Response: string)
|
||||||
|
begin
|
||||||
|
if Response <> '<SetFans' then
|
||||||
|
ShowMessage('Invalid response: ' + Response);
|
||||||
|
end);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TMainForm.Button6Click(Sender: TObject);
|
||||||
|
begin
|
||||||
|
SendCommand('>SetFans:0,128',
|
||||||
|
procedure(Response: string)
|
||||||
|
begin
|
||||||
|
if Response <> '<SetFans' then
|
||||||
|
ShowMessage('Invalid response: ' + Response);
|
||||||
|
end);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TMainForm.FormCreate(Sender: TObject);
|
||||||
|
begin
|
||||||
|
RefreshPorts;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
procedure TMainForm.RefreshPortsButtonClick(Sender: TObject);
|
||||||
|
begin
|
||||||
|
RefreshPorts;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
procedure TMainForm.RefreshPorts;
|
||||||
|
var
|
||||||
|
currentPort: string;
|
||||||
|
|
||||||
|
begin
|
||||||
|
currentPort := '';
|
||||||
|
if PortComboBox.ItemIndex > -1 then
|
||||||
|
currentPort := PortComboBox.Items[PortComboBox.ItemIndex];
|
||||||
|
|
||||||
|
EnumComPorts(PortComboBox.Items);
|
||||||
|
|
||||||
|
if Length(currentPort) > 0 then
|
||||||
|
PortComboBox.ItemIndex := PortComboBox.Items.IndexOf(currentPort);
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
procedure TMainForm.OnReceiveChar(Sender: TObject; Count: Integer);
|
||||||
|
var
|
||||||
|
data: string;
|
||||||
|
terminatorPos: Integer;
|
||||||
|
|
||||||
|
begin
|
||||||
|
(Sender as TComPort).ReadStr(data, Count);
|
||||||
|
FReceived := FReceived + data;
|
||||||
|
|
||||||
|
terminatorPos := AnsiPos(#10, FReceived);
|
||||||
|
if terminatorPos > 0 then
|
||||||
|
begin
|
||||||
|
// Since the protocol is quite synchronous, this is good enough for now
|
||||||
|
SetLength(FReceived, terminatorPos - 1);
|
||||||
|
if Assigned(FOnResponse) then
|
||||||
|
FOnResponse(FReceived);
|
||||||
|
|
||||||
|
FReceived := '';
|
||||||
|
FOnResponse := nil;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
procedure TMainForm.SendCommand(const ACommand: string; AOnResponse: TProc<string>);
|
||||||
|
begin
|
||||||
|
if not Assigned(FComPort) then
|
||||||
|
begin
|
||||||
|
FComPort := TComPort.Create(Self);
|
||||||
|
FComPort.Port := PortComboBox.Items[PortComboBox.ItemIndex];
|
||||||
|
FComPort.BaudRate := br19200;
|
||||||
|
FComPort.OnRxChar := OnReceiveChar;
|
||||||
|
FComPort.Open;
|
||||||
|
end;
|
||||||
|
|
||||||
|
FOnResponse := AOnResponse;
|
||||||
|
ComPort.WriteStr(ACommand + #10);
|
||||||
|
end;
|
||||||
|
|
||||||
|
end.
|
Loading…
Reference in New Issue
Block a user