mirror of
https://github.com/Artemis-RGB/Artemis
synced 2025-12-13 05:48:35 +00:00
1.3.1.0
Added K65 LUX RGB support Added K65 RGB RAPIDFIRE support Replaced ETS2 telemetry reader with a better one Fixed ETS2 plugin placement Cleaned up plugin-placing code on several modules
This commit is contained in:
parent
3256666f79
commit
3873c68518
@ -171,10 +171,6 @@
|
|||||||
<HintPath>..\packages\DynamicExpresso.Core.1.3.1.0\lib\net40\DynamicExpresso.Core.dll</HintPath>
|
<HintPath>..\packages\DynamicExpresso.Core.1.3.1.0\lib\net40\DynamicExpresso.Core.dll</HintPath>
|
||||||
<Private>True</Private>
|
<Private>True</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="Ets2SdkClient, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
|
||||||
<SpecificVersion>False</SpecificVersion>
|
|
||||||
<HintPath>lib\Ets2SdkClient.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="GongSolutions.Wpf.DragDrop, Version=0.1.4.3, Culture=neutral, PublicKeyToken=d19974ea350ccea1, processorArchitecture=MSIL">
|
<Reference Include="GongSolutions.Wpf.DragDrop, Version=0.1.4.3, Culture=neutral, PublicKeyToken=d19974ea350ccea1, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\gong-wpf-dragdrop.0.1.4.3\lib\net40\GongSolutions.Wpf.DragDrop.dll</HintPath>
|
<HintPath>..\packages\gong-wpf-dragdrop.0.1.4.3\lib\net40\GongSolutions.Wpf.DragDrop.dll</HintPath>
|
||||||
<Private>True</Private>
|
<Private>True</Private>
|
||||||
@ -370,6 +366,11 @@
|
|||||||
<Compile Include="Modules\Effects\AudioVisualizer\AudioVisualization.cs" />
|
<Compile Include="Modules\Effects\AudioVisualizer\AudioVisualization.cs" />
|
||||||
<Compile Include="Modules\Effects\Bubbles\Bubbles.cs" />
|
<Compile Include="Modules\Effects\Bubbles\Bubbles.cs" />
|
||||||
<Compile Include="Modules\Effects\WindowsProfile\PerformanceInfo.cs" />
|
<Compile Include="Modules\Effects\WindowsProfile\PerformanceInfo.cs" />
|
||||||
|
<Compile Include="Modules\Games\EurotruckSimulator2\Data\Ets2TelemetryData.cs" />
|
||||||
|
<Compile Include="Modules\Games\EurotruckSimulator2\Data\Ets2TelemetryDataReader.cs" />
|
||||||
|
<Compile Include="Modules\Games\EurotruckSimulator2\Data\IEts2TelemetryData.cs" />
|
||||||
|
<Compile Include="Modules\Games\EurotruckSimulator2\Data\Reader\Ets2TelemetryStructure.cs" />
|
||||||
|
<Compile Include="Modules\Games\EurotruckSimulator2\Data\Reader\SharedProcessMemory.cs" />
|
||||||
<Compile Include="Modules\Games\EurotruckSimulator2\EurotruckSimulator2DataModel.cs" />
|
<Compile Include="Modules\Games\EurotruckSimulator2\EurotruckSimulator2DataModel.cs" />
|
||||||
<Compile Include="Modules\Games\EurotruckSimulator2\EurotruckSimulator2Model.cs" />
|
<Compile Include="Modules\Games\EurotruckSimulator2\EurotruckSimulator2Model.cs" />
|
||||||
<Compile Include="Modules\Games\EurotruckSimulator2\EurotruckSimulator2Settings.cs" />
|
<Compile Include="Modules\Games\EurotruckSimulator2\EurotruckSimulator2Settings.cs" />
|
||||||
@ -838,6 +839,8 @@
|
|||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
</Content>
|
</Content>
|
||||||
<None Include="Modules\Games\UnrealTournament\Resources\redeemer.gif" />
|
<None Include="Modules\Games\UnrealTournament\Resources\redeemer.gif" />
|
||||||
|
<None Include="Modules\Games\EurotruckSimulator2\Resources\Win32\ets2-telemetry-server.dll" />
|
||||||
|
<None Include="Modules\Games\EurotruckSimulator2\Resources\Win64\ets2-telemetry-server.dll" />
|
||||||
<Content Include="Resources\CounterStrike\csgoGamestateConfiguration.txt" />
|
<Content Include="Resources\CounterStrike\csgoGamestateConfiguration.txt" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@ -65,6 +65,8 @@ namespace Artemis.DeviceProviders.Corsair
|
|||||||
break;
|
break;
|
||||||
case "K65 RGB":
|
case "K65 RGB":
|
||||||
case "CGK65 RGB":
|
case "CGK65 RGB":
|
||||||
|
case "K65 LUX RGB":
|
||||||
|
case "K65 RGB RAPIDFIRE":
|
||||||
Height = 7;
|
Height = 7;
|
||||||
Width = 18;
|
Width = 18;
|
||||||
Slug = "corsair-k65-rgb";
|
Slug = "corsair-k65-rgb";
|
||||||
|
|||||||
@ -0,0 +1,367 @@
|
|||||||
|
using System;
|
||||||
|
using System.Text;
|
||||||
|
using Artemis.Modules.Games.EurotruckSimulator2.Data.Reader;
|
||||||
|
|
||||||
|
namespace Artemis.Modules.Games.EurotruckSimulator2.Data
|
||||||
|
{
|
||||||
|
internal class Ets2TelemetryData : IEts2TelemetryData
|
||||||
|
{
|
||||||
|
private Box<Ets2TelemetryStructure> _rawData;
|
||||||
|
|
||||||
|
public IEts2Game Game => new Ets2Game(_rawData);
|
||||||
|
public IEts2Truck Truck => new Ets2Truck(_rawData);
|
||||||
|
public IEts2Trailer Trailer => new Ets2Trailer(_rawData);
|
||||||
|
public IEts2Job Job => new Ets2Job(_rawData);
|
||||||
|
public IEts2Navigation Navigation => new Ets2Navigation(_rawData);
|
||||||
|
|
||||||
|
public void Update(Ets2TelemetryStructure rawData)
|
||||||
|
{
|
||||||
|
_rawData = new Box<Ets2TelemetryStructure>(rawData);
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static DateTime SecondsToDate(int seconds)
|
||||||
|
{
|
||||||
|
if (seconds < 0) seconds = 0;
|
||||||
|
return new DateTime((long) seconds*10000000, DateTimeKind.Utc);
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static DateTime MinutesToDate(int minutes)
|
||||||
|
{
|
||||||
|
return SecondsToDate(minutes*60);
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static string BytesToString(byte[] bytes)
|
||||||
|
{
|
||||||
|
if (bytes == null)
|
||||||
|
return string.Empty;
|
||||||
|
return Encoding.UTF8.GetString(bytes, 0, Array.FindIndex(bytes, b => b == 0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal class Ets2Game : IEts2Game
|
||||||
|
{
|
||||||
|
private readonly Box<Ets2TelemetryStructure> _rawData;
|
||||||
|
|
||||||
|
public Ets2Game(Box<Ets2TelemetryStructure> rawData)
|
||||||
|
{
|
||||||
|
_rawData = rawData;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Paused => _rawData.Struct.paused != 0;
|
||||||
|
public DateTime Time => Ets2TelemetryData.MinutesToDate(_rawData.Struct.timeAbsolute);
|
||||||
|
public float TimeScale => _rawData.Struct.localScale;
|
||||||
|
public DateTime NextRestStopTime => Ets2TelemetryData.MinutesToDate(_rawData.Struct.nextRestStop);
|
||||||
|
public string Version => $"{_rawData.Struct.ets2_version_major}.{_rawData.Struct.ets2_version_minor}";
|
||||||
|
public string TelemetryPluginVersion => _rawData.Struct.ets2_telemetry_plugin_revision.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
internal class Ets2Vector : IEts2Vector
|
||||||
|
{
|
||||||
|
public Ets2Vector(float x, float y, float z)
|
||||||
|
{
|
||||||
|
X = x;
|
||||||
|
Y = y;
|
||||||
|
Z = z;
|
||||||
|
}
|
||||||
|
|
||||||
|
public float X { get; }
|
||||||
|
public float Y { get; }
|
||||||
|
public float Z { get; }
|
||||||
|
}
|
||||||
|
|
||||||
|
internal class Ets2Placement : IEts2Placement
|
||||||
|
{
|
||||||
|
public Ets2Placement(float x, float y, float z,
|
||||||
|
float heading, float pitch, float roll)
|
||||||
|
{
|
||||||
|
X = x;
|
||||||
|
Y = y;
|
||||||
|
Z = z;
|
||||||
|
Heading = heading;
|
||||||
|
Pitch = pitch;
|
||||||
|
Roll = roll;
|
||||||
|
}
|
||||||
|
|
||||||
|
public float X { get; }
|
||||||
|
public float Y { get; }
|
||||||
|
public float Z { get; }
|
||||||
|
public float Heading { get; }
|
||||||
|
public float Pitch { get; }
|
||||||
|
public float Roll { get; }
|
||||||
|
}
|
||||||
|
|
||||||
|
internal class Ets2Truck : IEts2Truck
|
||||||
|
{
|
||||||
|
private readonly Box<Ets2TelemetryStructure> _rawData;
|
||||||
|
|
||||||
|
public Ets2Truck(Box<Ets2TelemetryStructure> rawData)
|
||||||
|
{
|
||||||
|
_rawData = rawData;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string Id => Ets2TelemetryData.BytesToString(_rawData.Struct.truckMakeId);
|
||||||
|
public string Make => Ets2TelemetryData.BytesToString(_rawData.Struct.truckMake);
|
||||||
|
public string Model => Ets2TelemetryData.BytesToString(_rawData.Struct.truckModel);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Truck speed in km/h.
|
||||||
|
/// </summary>
|
||||||
|
public float Speed => _rawData.Struct.speed*3.6f;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Cruise control speed in km/h.
|
||||||
|
/// </summary>
|
||||||
|
public float CruiseControlSpeed => _rawData.Struct.cruiseControlSpeed*3.6f;
|
||||||
|
|
||||||
|
public bool CruiseControlOn => _rawData.Struct.cruiseControl != 0;
|
||||||
|
public float Odometer => _rawData.Struct.truckOdometer;
|
||||||
|
public int Gear => _rawData.Struct.gear;
|
||||||
|
public int DisplayedGear => _rawData.Struct.displayedGear;
|
||||||
|
public int ForwardGears => _rawData.Struct.gearsForward;
|
||||||
|
public int ReverseGears => _rawData.Struct.gearsReverse;
|
||||||
|
public string ShifterType => Ets2TelemetryData.BytesToString(_rawData.Struct.shifterType);
|
||||||
|
public float EngineRpm => _rawData.Struct.engineRpm;
|
||||||
|
public float EngineRpmMax => _rawData.Struct.engineRpmMax;
|
||||||
|
public float Fuel => _rawData.Struct.fuel;
|
||||||
|
public float FuelCapacity => _rawData.Struct.fuelCapacity;
|
||||||
|
public float FuelAverageConsumption => _rawData.Struct.fuelAvgConsumption;
|
||||||
|
public float FuelWarningFactor => _rawData.Struct.fuelWarningFactor;
|
||||||
|
public bool FuelWarningOn => _rawData.Struct.fuelWarning != 0;
|
||||||
|
public float WearEngine => _rawData.Struct.wearEngine;
|
||||||
|
public float WearTransmission => _rawData.Struct.wearTransmission;
|
||||||
|
public float WearCabin => _rawData.Struct.wearCabin;
|
||||||
|
public float WearChassis => _rawData.Struct.wearChassis;
|
||||||
|
public float WearWheels => _rawData.Struct.wearWheels;
|
||||||
|
public float UserSteer => _rawData.Struct.userSteer;
|
||||||
|
public float UserThrottle => _rawData.Struct.userThrottle;
|
||||||
|
public float UserBrake => _rawData.Struct.userBrake;
|
||||||
|
public float UserClutch => _rawData.Struct.userClutch;
|
||||||
|
public float GameSteer => _rawData.Struct.gameSteer;
|
||||||
|
public float GameThrottle => _rawData.Struct.gameThrottle;
|
||||||
|
public float GameBrake => _rawData.Struct.gameBrake;
|
||||||
|
public float GameClutch => _rawData.Struct.gameClutch;
|
||||||
|
public int ShifterSlot => _rawData.Struct.shifterSlot;
|
||||||
|
|
||||||
|
//public int ShifterToggle
|
||||||
|
//{
|
||||||
|
// get { return _rawData.Struct.shifterToggle; }
|
||||||
|
//}
|
||||||
|
|
||||||
|
public bool EngineOn => _rawData.Struct.engineEnabled != 0;
|
||||||
|
public bool ElectricOn => _rawData.Struct.electricEnabled != 0;
|
||||||
|
public bool WipersOn => _rawData.Struct.wipers != 0;
|
||||||
|
public int RetarderBrake => _rawData.Struct.retarderBrake;
|
||||||
|
public int RetarderStepCount => (int) _rawData.Struct.retarderStepCount;
|
||||||
|
public bool ParkBrakeOn => _rawData.Struct.parkBrake != 0;
|
||||||
|
public bool MotorBrakeOn => _rawData.Struct.motorBrake != 0;
|
||||||
|
public float BrakeTemperature => _rawData.Struct.brakeTemperature;
|
||||||
|
public float Adblue => _rawData.Struct.adblue;
|
||||||
|
public float AdblueCapacity => _rawData.Struct.adblueCapacity;
|
||||||
|
public float AdblueAverageConsumption => _rawData.Struct.adblueConsumption;
|
||||||
|
public bool AdblueWarningOn => _rawData.Struct.adblueWarning != 0;
|
||||||
|
public float AirPressure => _rawData.Struct.airPressure;
|
||||||
|
public bool AirPressureWarningOn => _rawData.Struct.airPressureWarning != 0;
|
||||||
|
public float AirPressureWarningValue => _rawData.Struct.airPressureWarningValue;
|
||||||
|
public bool AirPressureEmergencyOn => _rawData.Struct.airPressureEmergency != 0;
|
||||||
|
public float AirPressureEmergencyValue => _rawData.Struct.airPressureEmergencyValue;
|
||||||
|
public float OilTemperature => _rawData.Struct.oilTemperature;
|
||||||
|
public float OilPressure => _rawData.Struct.oilPressure;
|
||||||
|
public bool OilPressureWarningOn => _rawData.Struct.oilPressureWarning != 0;
|
||||||
|
public float OilPressureWarningValue => _rawData.Struct.oilPressureWarningValue;
|
||||||
|
public float WaterTemperature => _rawData.Struct.waterTemperature;
|
||||||
|
public bool WaterTemperatureWarningOn => _rawData.Struct.waterTemperatureWarning != 0;
|
||||||
|
public float WaterTemperatureWarningValue => _rawData.Struct.waterTemperatureWarningValue;
|
||||||
|
public float BatteryVoltage => _rawData.Struct.batteryVoltage;
|
||||||
|
public bool BatteryVoltageWarningOn => _rawData.Struct.batteryVoltageWarning != 0;
|
||||||
|
public float BatteryVoltageWarningValue => _rawData.Struct.batteryVoltageWarningValue;
|
||||||
|
public float LightsDashboardValue => _rawData.Struct.lightsDashboard;
|
||||||
|
public bool LightsDashboardOn => _rawData.Struct.lightsDashboard > 0;
|
||||||
|
public bool BlinkerLeftActive => _rawData.Struct.blinkerLeftActive != 0;
|
||||||
|
public bool BlinkerRightActive => _rawData.Struct.blinkerRightActive != 0;
|
||||||
|
public bool BlinkerLeftOn => _rawData.Struct.blinkerLeftOn != 0;
|
||||||
|
public bool BlinkerRightOn => _rawData.Struct.blinkerRightOn != 0;
|
||||||
|
public bool LightsParkingOn => _rawData.Struct.lightsParking != 0;
|
||||||
|
public bool LightsBeamLowOn => _rawData.Struct.lightsBeamLow != 0;
|
||||||
|
public bool LightsBeamHighOn => _rawData.Struct.lightsBeamHigh != 0;
|
||||||
|
public bool LightsAuxFrontOn => _rawData.Struct.lightsAuxFront != 0;
|
||||||
|
public bool LightsAuxRoofOn => _rawData.Struct.lightsAuxRoof != 0;
|
||||||
|
public bool LightsBeaconOn => _rawData.Struct.lightsBeacon != 0;
|
||||||
|
public bool LightsBrakeOn => _rawData.Struct.lightsBrake != 0;
|
||||||
|
public bool LightsReverseOn => _rawData.Struct.lightsReverse != 0;
|
||||||
|
|
||||||
|
public IEts2Placement Placement => new Ets2Placement(
|
||||||
|
_rawData.Struct.coordinateX,
|
||||||
|
_rawData.Struct.coordinateY,
|
||||||
|
_rawData.Struct.coordinateZ,
|
||||||
|
_rawData.Struct.rotationX,
|
||||||
|
_rawData.Struct.rotationY,
|
||||||
|
_rawData.Struct.rotationZ);
|
||||||
|
|
||||||
|
public IEts2Vector Acceleration => new Ets2Vector(
|
||||||
|
_rawData.Struct.accelerationX,
|
||||||
|
_rawData.Struct.accelerationY,
|
||||||
|
_rawData.Struct.accelerationZ);
|
||||||
|
|
||||||
|
public IEts2Vector Head => new Ets2Vector(
|
||||||
|
_rawData.Struct.headPositionX,
|
||||||
|
_rawData.Struct.headPositionY,
|
||||||
|
_rawData.Struct.headPositionZ);
|
||||||
|
|
||||||
|
public IEts2Vector Cabin => new Ets2Vector(
|
||||||
|
_rawData.Struct.cabinPositionX,
|
||||||
|
_rawData.Struct.cabinPositionY,
|
||||||
|
_rawData.Struct.cabinPositionZ);
|
||||||
|
|
||||||
|
public IEts2Vector Hook => new Ets2Vector(
|
||||||
|
_rawData.Struct.hookPositionX,
|
||||||
|
_rawData.Struct.hookPositionY,
|
||||||
|
_rawData.Struct.hookPositionZ);
|
||||||
|
|
||||||
|
/*
|
||||||
|
public IEts2GearSlot[] GearSlots
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
var array = new IEts2GearSlot[_rawData.Struct.selectorCount];
|
||||||
|
for (int i = 0; i < array.Length; i++)
|
||||||
|
array[i] = new Ets2GearSlot(_rawData, i);
|
||||||
|
return array;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public IEts2Wheel[] Wheels
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
var array = new IEts2Wheel[_rawData.Struct.wheelCount];
|
||||||
|
for (int i = 0; i < array.Length; i++)
|
||||||
|
array[i] = new Ets2Wheel(_rawData, i);
|
||||||
|
return array;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
internal class Ets2Trailer : IEts2Trailer
|
||||||
|
{
|
||||||
|
private readonly Box<Ets2TelemetryStructure> _rawData;
|
||||||
|
|
||||||
|
public Ets2Trailer(Box<Ets2TelemetryStructure> rawData)
|
||||||
|
{
|
||||||
|
_rawData = rawData;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Attached => _rawData.Struct.trailer_attached != 0;
|
||||||
|
public string Id => Ets2TelemetryData.BytesToString(_rawData.Struct.trailerId);
|
||||||
|
public string Name => Ets2TelemetryData.BytesToString(_rawData.Struct.trailerName);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Trailer mass in kilograms.
|
||||||
|
/// </summary>
|
||||||
|
public float Mass => _rawData.Struct.trailerMass;
|
||||||
|
|
||||||
|
public float Wear => _rawData.Struct.wearTrailer;
|
||||||
|
|
||||||
|
public IEts2Placement Placement => new Ets2Placement(
|
||||||
|
_rawData.Struct.trailerCoordinateX,
|
||||||
|
_rawData.Struct.trailerCoordinateY,
|
||||||
|
_rawData.Struct.trailerCoordinateZ,
|
||||||
|
_rawData.Struct.trailerRotationX,
|
||||||
|
_rawData.Struct.trailerRotationY,
|
||||||
|
_rawData.Struct.trailerRotationZ);
|
||||||
|
}
|
||||||
|
|
||||||
|
internal class Ets2Navigation : IEts2Navigation
|
||||||
|
{
|
||||||
|
private readonly Box<Ets2TelemetryStructure> _rawData;
|
||||||
|
|
||||||
|
public Ets2Navigation(Box<Ets2TelemetryStructure> rawData)
|
||||||
|
{
|
||||||
|
_rawData = rawData;
|
||||||
|
}
|
||||||
|
|
||||||
|
public DateTime EstimatedTime => Ets2TelemetryData.SecondsToDate((int) _rawData.Struct.navigationTime);
|
||||||
|
public int EstimatedDistance => (int) _rawData.Struct.navigationDistance;
|
||||||
|
|
||||||
|
public int SpeedLimit
|
||||||
|
=>
|
||||||
|
_rawData.Struct.navigationSpeedLimit > 0 ? (int) Math.Round(_rawData.Struct.navigationSpeedLimit*3.6f) : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
internal class Ets2Job : IEts2Job
|
||||||
|
{
|
||||||
|
private readonly Box<Ets2TelemetryStructure> _rawData;
|
||||||
|
|
||||||
|
public Ets2Job(Box<Ets2TelemetryStructure> rawData)
|
||||||
|
{
|
||||||
|
_rawData = rawData;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int Income => _rawData.Struct.jobIncome;
|
||||||
|
public DateTime DeadlineTime => Ets2TelemetryData.MinutesToDate(_rawData.Struct.jobDeadline);
|
||||||
|
|
||||||
|
public DateTime RemainingTime
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (_rawData.Struct.jobDeadline > 0)
|
||||||
|
return Ets2TelemetryData.MinutesToDate(_rawData.Struct.jobDeadline - _rawData.Struct.timeAbsolute);
|
||||||
|
return Ets2TelemetryData.MinutesToDate(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public string SourceCity => Ets2TelemetryData.BytesToString(_rawData.Struct.jobCitySource);
|
||||||
|
public string SourceCompany => Ets2TelemetryData.BytesToString(_rawData.Struct.jobCompanySource);
|
||||||
|
public string DestinationCity => Ets2TelemetryData.BytesToString(_rawData.Struct.jobCityDestination);
|
||||||
|
public string DestinationCompany => Ets2TelemetryData.BytesToString(_rawData.Struct.jobCompanyDestination);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
class Ets2Wheel : IEts2Wheel
|
||||||
|
{
|
||||||
|
public Ets2Wheel(Box<Ets2TelemetryStructure> rawData, int wheelIndex)
|
||||||
|
{
|
||||||
|
Simulated = rawData.Struct.wheelSimulated[wheelIndex] != 0;
|
||||||
|
Steerable = rawData.Struct.wheelSteerable[wheelIndex] != 0;
|
||||||
|
Radius = rawData.Struct.wheelRadius[wheelIndex];
|
||||||
|
Position = new Ets2Vector(
|
||||||
|
rawData.Struct.wheelPositionX[wheelIndex],
|
||||||
|
rawData.Struct.wheelPositionY[wheelIndex],
|
||||||
|
rawData.Struct.wheelPositionZ[wheelIndex]);
|
||||||
|
Powered = rawData.Struct.wheelPowered[wheelIndex] != 0;
|
||||||
|
Liftable = rawData.Struct.wheelLiftable[wheelIndex] != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Simulated { get; private set; }
|
||||||
|
public bool Steerable { get; private set; }
|
||||||
|
public bool Powered { get; private set; }
|
||||||
|
public bool Liftable { get; private set; }
|
||||||
|
public float Radius { get; private set; }
|
||||||
|
public IEts2Vector Position { get; private set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
class Ets2GearSlot : IEts2GearSlot
|
||||||
|
{
|
||||||
|
public Ets2GearSlot(Box<Ets2TelemetryStructure> rawData, int slotIndex)
|
||||||
|
{
|
||||||
|
Gear = rawData.Struct.slotGear[slotIndex];
|
||||||
|
HandlePosition = (int)rawData.Struct.slotHandlePosition[slotIndex];
|
||||||
|
SlotSelectors = (int)rawData.Struct.slotSelectors[slotIndex];
|
||||||
|
}
|
||||||
|
|
||||||
|
public int Gear { get; private set; }
|
||||||
|
public int HandlePosition { get; private set; }
|
||||||
|
public int SlotSelectors { get; private set; }
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
internal class Box<T> where T : struct
|
||||||
|
{
|
||||||
|
public Box(T @struct)
|
||||||
|
{
|
||||||
|
Struct = @struct;
|
||||||
|
}
|
||||||
|
|
||||||
|
public T Struct { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,44 @@
|
|||||||
|
using System;
|
||||||
|
using Artemis.Modules.Games.EurotruckSimulator2.Data.Reader;
|
||||||
|
|
||||||
|
namespace Artemis.Modules.Games.EurotruckSimulator2.Data
|
||||||
|
{
|
||||||
|
public class Ets2TelemetryDataReader : IDisposable
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// ETS2 telemetry plugin maps the data to this mapped file name.
|
||||||
|
/// </summary>
|
||||||
|
private const string Ets2TelemetryMappedFileName = "Local\\Ets2TelemetryServer";
|
||||||
|
|
||||||
|
// ReSharper disable once InconsistentNaming
|
||||||
|
private static readonly Lazy<Ets2TelemetryDataReader> instance = new Lazy<Ets2TelemetryDataReader>(
|
||||||
|
() => new Ets2TelemetryDataReader());
|
||||||
|
|
||||||
|
private readonly Ets2TelemetryData _data = new Ets2TelemetryData();
|
||||||
|
|
||||||
|
private readonly object _lock = new object();
|
||||||
|
|
||||||
|
private readonly SharedProcessMemory<Ets2TelemetryStructure> _sharedMemory =
|
||||||
|
new SharedProcessMemory<Ets2TelemetryStructure>(Ets2TelemetryMappedFileName);
|
||||||
|
|
||||||
|
public static Ets2TelemetryDataReader Instance => instance.Value;
|
||||||
|
|
||||||
|
public bool IsConnected => _sharedMemory.IsConnected;
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
_sharedMemory?.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
public IEts2TelemetryData Read()
|
||||||
|
{
|
||||||
|
lock (_lock)
|
||||||
|
{
|
||||||
|
_sharedMemory.Data = default(Ets2TelemetryStructure);
|
||||||
|
_sharedMemory.Read();
|
||||||
|
_data.Update(_sharedMemory.Data);
|
||||||
|
return _data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,763 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Artemis.Modules.Games.EurotruckSimulator2.Data
|
||||||
|
{
|
||||||
|
public interface IEts2TelemetryData
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Game information.
|
||||||
|
/// </summary>
|
||||||
|
IEts2Game Game { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Truck information.
|
||||||
|
/// </summary>
|
||||||
|
IEts2Truck Truck { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Trailer information.
|
||||||
|
/// </summary>
|
||||||
|
IEts2Trailer Trailer { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Job information.
|
||||||
|
/// </summary>
|
||||||
|
IEts2Job Job { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Navigation information.
|
||||||
|
/// </summary>
|
||||||
|
IEts2Navigation Navigation { get; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IEts2Game
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Current game time.
|
||||||
|
/// Serializes to ISO 8601 string in JSON.
|
||||||
|
/// Example: "0001-01-05T05:11:00Z"
|
||||||
|
/// </summary>
|
||||||
|
DateTime Time { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// True if game is currently paused, false otherwise.
|
||||||
|
/// </summary>
|
||||||
|
bool Paused { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Current version of the telemetry plugin DLL file.
|
||||||
|
/// Example: "4"
|
||||||
|
/// </summary>
|
||||||
|
string TelemetryPluginVersion { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Current version of the game.
|
||||||
|
/// Example: "1.10"
|
||||||
|
/// </summary>
|
||||||
|
string Version { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// When the fatigue simulation is disabled, the behavior of this channel
|
||||||
|
/// is implementation dependent. The game might provide the value which would
|
||||||
|
/// apply if it was enabled or provide no value at all.
|
||||||
|
/// Example: "0001-01-01T10:52:00Z"
|
||||||
|
/// </summary>
|
||||||
|
DateTime NextRestStopTime { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Scale applied to distance and time to compensate
|
||||||
|
/// for the scale of the map (e.g. 1s of real time corresponds
|
||||||
|
/// to local_scale seconds of simulated game time).
|
||||||
|
/// Example: 3
|
||||||
|
/// </summary>
|
||||||
|
float TimeScale { get; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IEts2Vector
|
||||||
|
{
|
||||||
|
float X { get; }
|
||||||
|
float Y { get; }
|
||||||
|
float Z { get; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IEts2Placement
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// X coordinate of the placement.
|
||||||
|
/// Example: 13723.7881
|
||||||
|
/// </summary>
|
||||||
|
float X { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Y coordinate of the placement.
|
||||||
|
/// Example: 65.22377
|
||||||
|
/// </summary>
|
||||||
|
float Y { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Z coordinate of the placement.
|
||||||
|
/// Example: 13738.8018
|
||||||
|
/// </summary>
|
||||||
|
float Z { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The angle is measured counterclockwise in horizontal plane when looking
|
||||||
|
/// from top where 0 corresponds to forward (north), 0.25 to left (west),
|
||||||
|
/// 0.5 to backward (south) and 0.75 to right (east).
|
||||||
|
/// Stored in unit range where (0,1) corresponds to (0,360).
|
||||||
|
/// Example: 0.13688866
|
||||||
|
/// </summary>
|
||||||
|
float Heading { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The pitch angle is zero when in horizontal direction,
|
||||||
|
/// with positive values pointing up (0.25 directly to zenith),
|
||||||
|
/// and negative values pointing down (-0.25 directly to nadir).
|
||||||
|
/// Stored in unit range where (-0.25,0.25) corresponds to (-90,90).
|
||||||
|
/// Example: 0.00005
|
||||||
|
/// </summary>
|
||||||
|
float Pitch { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The angle is measured in counterclockwise when looking in direction of the roll axis.
|
||||||
|
/// Stored in unit range where (-0.5,0.5) corresponds to (-180,180).
|
||||||
|
/// Example: -0.00009
|
||||||
|
/// </summary>
|
||||||
|
float Roll { get; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IEts2Truck
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Current truck speed in km/h.
|
||||||
|
/// Example: 50.411231
|
||||||
|
/// </summary>
|
||||||
|
float Speed { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Represents vehicle space linear acceleration of
|
||||||
|
/// the truck measured in meters per second^2.
|
||||||
|
/// Example: { "x": 0.046569, "y": -0.00116, "z": -1.03676 }
|
||||||
|
/// </summary>
|
||||||
|
IEts2Vector Acceleration { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Current truck placement in the game world.
|
||||||
|
/// </summary>
|
||||||
|
IEts2Placement Placement { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The value of the odometer in km.
|
||||||
|
/// Example: 105809.25
|
||||||
|
/// </summary>
|
||||||
|
float Odometer { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Speed selected for the cruise control in km/h.
|
||||||
|
/// Example: 75
|
||||||
|
/// </summary>
|
||||||
|
float CruiseControlSpeed { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Brand Id of the current truck.
|
||||||
|
/// Example: "man".
|
||||||
|
/// </summary>
|
||||||
|
string Id { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Localized brand name of the current truck for display purposes.
|
||||||
|
/// Example: "MAN".
|
||||||
|
/// </summary>
|
||||||
|
string Make { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Localized model name of the current truck.
|
||||||
|
/// Example: "TGX".
|
||||||
|
/// </summary>
|
||||||
|
string Model { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gear that is currently selected in the engine.
|
||||||
|
/// Positive values reflect forward gears, negative - reverse.
|
||||||
|
/// Example: 9
|
||||||
|
/// </summary>
|
||||||
|
int Gear { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gear that is currently displayed on the main dashboard.
|
||||||
|
/// Positive values reflect forward gears, negative - reverse.
|
||||||
|
/// Example: 4
|
||||||
|
/// </summary>
|
||||||
|
int DisplayedGear { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Number of forward gears on undamaged truck.
|
||||||
|
/// Example: 12
|
||||||
|
/// </summary>
|
||||||
|
int ForwardGears { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Number of reverse gears on undamaged truck.
|
||||||
|
/// Example: 2
|
||||||
|
/// </summary>
|
||||||
|
int ReverseGears { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Current RPM value of the truck's engine (rotates per minute).
|
||||||
|
/// Example: 1372.3175
|
||||||
|
/// </summary>
|
||||||
|
float EngineRpm { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Maximal RPM value of the truck's engine.
|
||||||
|
/// Example: 2500
|
||||||
|
/// </summary>
|
||||||
|
float EngineRpmMax { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Current amount of fuel in liters.
|
||||||
|
/// Example: 696.7544
|
||||||
|
/// </summary>
|
||||||
|
float Fuel { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Fuel tank capacity in litres.
|
||||||
|
/// Example: 700
|
||||||
|
/// </summary>
|
||||||
|
float FuelCapacity { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Average consumption of the fuel in liters/km.
|
||||||
|
/// Example: 0.4923077
|
||||||
|
/// </summary>
|
||||||
|
float FuelAverageConsumption { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Steering received from input (-1;1).
|
||||||
|
/// Note that it is interpreted counterclockwise.
|
||||||
|
/// If the user presses the steer right button on digital input
|
||||||
|
/// (e.g. keyboard) this value goes immediatelly to -1.0
|
||||||
|
/// Example: -1.0
|
||||||
|
/// </summary>
|
||||||
|
float UserSteer { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Throttle received from input (-1;1).
|
||||||
|
/// If the user presses the forward button on digital input
|
||||||
|
/// (e.g. keyboard) this value goes immediatelly to 1.0
|
||||||
|
/// Example: 0
|
||||||
|
/// </summary>
|
||||||
|
float UserThrottle { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Brake received from input (-1;1)
|
||||||
|
/// If the user presses the brake button on digital input
|
||||||
|
/// (e.g. keyboard) this value goes immediatelly to 1.0
|
||||||
|
/// Example: 0
|
||||||
|
/// </summary>
|
||||||
|
float UserBrake { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Clutch received from input (-1;1)
|
||||||
|
/// If the user presses the clutch button on digital input
|
||||||
|
/// (e.g. keyboard) this value goes immediatelly to 1.0
|
||||||
|
/// Example: 0
|
||||||
|
/// </summary>
|
||||||
|
float UserClutch { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Steering as used by the simulation (-1;1)
|
||||||
|
/// Note that it is interpreted counterclockwise.
|
||||||
|
/// Accounts for interpolation speeds and simulated
|
||||||
|
/// counterfoces for digital inputs.
|
||||||
|
/// Example: -0.423521
|
||||||
|
/// </summary>
|
||||||
|
float GameSteer { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Throttle pedal input as used by the simulation (0;1)
|
||||||
|
/// Accounts for the press attack curve for digital inputs
|
||||||
|
/// or cruise-control input.
|
||||||
|
/// Example: 0.17161
|
||||||
|
/// </summary>
|
||||||
|
float GameThrottle { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Brake pedal input as used by the simulation (0;1)
|
||||||
|
/// Accounts for the press attack curve for digital inputs.
|
||||||
|
/// Does not contain retarder, parking or motor brake.
|
||||||
|
/// Example: 0
|
||||||
|
/// </summary>
|
||||||
|
float GameBrake { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Clutch pedal input as used by the simulation (0;1)
|
||||||
|
/// Accounts for the automatic shifting or interpolation of
|
||||||
|
/// player input.
|
||||||
|
/// Example: 0
|
||||||
|
/// </summary>
|
||||||
|
float GameClutch { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Current level of the retarder brake.
|
||||||
|
/// Ranges from 0 to RetarderStepCount.
|
||||||
|
/// Example: 0
|
||||||
|
/// </summary>
|
||||||
|
int RetarderBrake { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Number of steps in the retarder.
|
||||||
|
/// Set to zero if retarder is not mounted to the truck.
|
||||||
|
/// Example: 3
|
||||||
|
/// </summary>
|
||||||
|
int RetarderStepCount { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gearbox slot the h-shifter handle is currently in.
|
||||||
|
/// 0 means that no slot is selected.
|
||||||
|
/// Example: 0
|
||||||
|
/// </summary>
|
||||||
|
int ShifterSlot { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// TODO: need to fix.
|
||||||
|
/// </summary>
|
||||||
|
/// <summary>
|
||||||
|
/// Pressure in the brake air tank in psi.
|
||||||
|
/// Example: 133.043961
|
||||||
|
/// </summary>
|
||||||
|
float AirPressure { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Temperature of the brakes in degrees celsius.
|
||||||
|
/// Example: 15.9377184
|
||||||
|
/// </summary>
|
||||||
|
float BrakeTemperature { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Amount of AdBlue in liters.
|
||||||
|
/// Example: 0
|
||||||
|
/// </summary>
|
||||||
|
float Adblue { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Average consumption of the adblue in liters/km.
|
||||||
|
/// Example: 0
|
||||||
|
/// </summary>
|
||||||
|
float AdblueAverageConsumption { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Pressure of the oil in psi.
|
||||||
|
/// Example: 36.4550362
|
||||||
|
/// </summary>
|
||||||
|
float OilPressure { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Temperature of the oil in degrees celsius.
|
||||||
|
/// Example: 16.2580566
|
||||||
|
/// </summary>
|
||||||
|
float OilTemperature { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Temperature of the water in degrees celsius.
|
||||||
|
/// Example: 16.1623955
|
||||||
|
/// </summary>
|
||||||
|
float WaterTemperature { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Voltage of the battery in volts.
|
||||||
|
/// Example: 23.4985161
|
||||||
|
/// </summary>
|
||||||
|
float BatteryVoltage { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// AdBlue tank capacity in litres.
|
||||||
|
/// Example: 0
|
||||||
|
/// </summary>
|
||||||
|
float AdblueCapacity { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Current level of truck's engine wear/damage between 0 (min) and 1 (max).
|
||||||
|
/// Example: 0.00675457
|
||||||
|
/// </summary>
|
||||||
|
float WearEngine { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Current level of truck's transmission wear/damage between 0 (min) and 1 (max).
|
||||||
|
/// </summary>
|
||||||
|
float WearTransmission { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Current level of truck's cabin wear/damage between 0 (min) and 1 (max).
|
||||||
|
/// </summary>
|
||||||
|
float WearCabin { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Current level of truck's chassis wear/damage between 0 (min) and 1 (max).
|
||||||
|
/// </summary>
|
||||||
|
float WearChassis { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Current level of truck's wheel wear/damage between 0 (min) and 1 (max).
|
||||||
|
/// </summary>
|
||||||
|
float WearWheels { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Default position of the head in the cabin space.
|
||||||
|
/// Example: { "x": -0.795116067, "y": 1.43522251, "z": -0.08483863 }
|
||||||
|
/// </summary>
|
||||||
|
IEts2Vector Head { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Position of the cabin in the vehicle space.
|
||||||
|
/// This is position of the joint around which the cabin rotates.
|
||||||
|
/// This attribute might be not present if the vehicle does not have a separate cabin.
|
||||||
|
/// Example: { "x": 0, "y": 1.36506855, "z": -1.70362806 }
|
||||||
|
/// </summary>
|
||||||
|
IEts2Vector Cabin { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Position of the trailer connection hook in vehicle space.
|
||||||
|
/// Example: { "x": 0, "y": 0.939669, "z": -6.17736959 }
|
||||||
|
/// </summary>
|
||||||
|
IEts2Vector Hook { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// All available selectors (e.g. range/splitter toggles). TODO: need to fix.
|
||||||
|
/// </summary>
|
||||||
|
/// <summary>
|
||||||
|
/// Type of the shifter.
|
||||||
|
/// One of the following values: "arcade", "automatic", "manual", "hshifter".
|
||||||
|
/// </summary>
|
||||||
|
string ShifterType { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Indicates whether cruise control is turned on or off.
|
||||||
|
/// </summary>
|
||||||
|
bool CruiseControlOn { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Indicates whether wipers are currently turned on or off.
|
||||||
|
/// </summary>
|
||||||
|
bool WipersOn { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Is the parking brake enabled or not.
|
||||||
|
/// </summary>
|
||||||
|
bool ParkBrakeOn { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Is the motor brake enabled or not.
|
||||||
|
/// </summary>
|
||||||
|
bool MotorBrakeOn { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Is the engine enabled or not.
|
||||||
|
/// </summary>
|
||||||
|
bool EngineOn { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Is the electric enabled or not.
|
||||||
|
/// </summary>
|
||||||
|
bool ElectricOn { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Is left blinker currently emits light or not.
|
||||||
|
/// </summary>
|
||||||
|
bool BlinkerLeftActive { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Is right blinker currently emits light or not.
|
||||||
|
/// </summary>
|
||||||
|
bool BlinkerRightActive { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Is left blinker currently turned on or off.
|
||||||
|
/// </summary>
|
||||||
|
bool BlinkerLeftOn { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Is right blinker currently turned on or off.
|
||||||
|
/// </summary>
|
||||||
|
bool BlinkerRightOn { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Are the parking lights enabled or not.
|
||||||
|
/// </summary>
|
||||||
|
bool LightsParkingOn { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Are the low beam lights enabled or not.
|
||||||
|
/// </summary>
|
||||||
|
bool LightsBeamLowOn { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Are the high beam lights enabled or not.
|
||||||
|
/// </summary>
|
||||||
|
bool LightsBeamHighOn { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Are the auxiliary front lights active or not.
|
||||||
|
/// </summary>
|
||||||
|
bool LightsAuxFrontOn { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Are the auxiliary roof lights active or not.
|
||||||
|
/// </summary>
|
||||||
|
bool LightsAuxRoofOn { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Are the beacon lights enabled or not.
|
||||||
|
/// </summary>
|
||||||
|
bool LightsBeaconOn { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Is the brake light active or not.
|
||||||
|
/// </summary>
|
||||||
|
bool LightsBrakeOn { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Is the reverse light active or not.
|
||||||
|
/// </summary>
|
||||||
|
bool LightsReverseOn { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Is the battery voltage/not charging warning active or not.
|
||||||
|
/// </summary>
|
||||||
|
bool BatteryVoltageWarningOn { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Is the air pressure warning active or not.
|
||||||
|
/// </summary>
|
||||||
|
bool AirPressureWarningOn { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Are the emergency brakes active as result of low air pressure or not.
|
||||||
|
/// </summary>
|
||||||
|
bool AirPressureEmergencyOn { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Is the low adblue warning active or not.
|
||||||
|
/// </summary>
|
||||||
|
bool AdblueWarningOn { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Is the oil pressure warning active or not.
|
||||||
|
/// </summary>
|
||||||
|
bool OilPressureWarningOn { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Is the water temperature warning active or not.
|
||||||
|
/// </summary>
|
||||||
|
bool WaterTemperatureWarningOn { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Intensity of the dashboard backlight between 0 (off) and 1 (max).
|
||||||
|
/// </summary>
|
||||||
|
float LightsDashboardValue { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Is the dashboard backlight currently turned on or off.
|
||||||
|
/// </summary>
|
||||||
|
bool LightsDashboardOn { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Is the low fuel warning active or not.
|
||||||
|
/// </summary>
|
||||||
|
bool FuelWarningOn { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Fraction of the fuel capacity bellow which is activated the fuel warning.
|
||||||
|
/// Example: 0.15
|
||||||
|
/// </summary>
|
||||||
|
float FuelWarningFactor { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Pressure of the air in the tank bellow which the warning activates.
|
||||||
|
/// Example: 65
|
||||||
|
/// </summary>
|
||||||
|
float AirPressureWarningValue { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Pressure of the air in the tank bellow which the emergency brakes activate.
|
||||||
|
/// Example: 30
|
||||||
|
/// </summary>
|
||||||
|
float AirPressureEmergencyValue { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Pressure of the oil bellow which the warning activates.
|
||||||
|
/// Example: 10
|
||||||
|
/// </summary>
|
||||||
|
float OilPressureWarningValue { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Temperature of the water above which the warning activates.
|
||||||
|
/// Example: 105
|
||||||
|
/// </summary>
|
||||||
|
float WaterTemperatureWarningValue { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Voltage of the battery bellow which the warning activates.
|
||||||
|
/// Example: 22
|
||||||
|
/// </summary>
|
||||||
|
float BatteryVoltageWarningValue { get; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IEts2Navigation
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Relative estimated time of arrival.
|
||||||
|
/// Example: "0001-01-01T02:05:00Z"
|
||||||
|
/// </summary>
|
||||||
|
DateTime EstimatedTime { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Estimated distance to the destination in meters.
|
||||||
|
/// Example: 1224
|
||||||
|
/// </summary>
|
||||||
|
int EstimatedDistance { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Current value of the "Route Advisor speed limit" in km/h.
|
||||||
|
/// Example: 50
|
||||||
|
/// </summary>
|
||||||
|
int SpeedLimit { get; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IEts2Job
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Reward in internal game-specific currency.
|
||||||
|
/// Example: 2316
|
||||||
|
/// </summary>
|
||||||
|
int Income { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Absolute in-game time of end of job delivery window.
|
||||||
|
/// Delivering the job after this time will cause it be late.
|
||||||
|
/// Example: "0001-01-09T03:34:00Z"
|
||||||
|
/// </summary>
|
||||||
|
DateTime DeadlineTime { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Relative remaining in-game time left before deadline.
|
||||||
|
/// Example: "0001-01-01T07:06:00Z"
|
||||||
|
/// </summary>
|
||||||
|
DateTime RemainingTime { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Localized name of the source city for display purposes.
|
||||||
|
/// Example: "Linz"
|
||||||
|
/// </summary>
|
||||||
|
string SourceCity { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Localized name of the destination city for display purposes.
|
||||||
|
/// Example: "Salzburg"
|
||||||
|
/// </summary>
|
||||||
|
string DestinationCity { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Localized name of the source company for display purposes.
|
||||||
|
/// Example: "DHL"
|
||||||
|
/// </summary>
|
||||||
|
string SourceCompany { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Localized name of the destination company for display purposes.
|
||||||
|
/// Example: "JCB"
|
||||||
|
/// </summary>
|
||||||
|
string DestinationCompany { get; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IEts2Trailer
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Id of the cargo for internal use by code.
|
||||||
|
/// Example: "derrick"
|
||||||
|
/// </summary>
|
||||||
|
string Id { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Localized name of the current trailer for display purposes.
|
||||||
|
/// Example: "Derrick"
|
||||||
|
/// </summary>
|
||||||
|
string Name { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Is the trailer attached to the truck or not.
|
||||||
|
/// </summary>
|
||||||
|
bool Attached { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Mass of the cargo in kilograms.
|
||||||
|
/// Example: 22000
|
||||||
|
/// </summary>
|
||||||
|
float Mass { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Current trailer placement in the game world.
|
||||||
|
/// </summary>
|
||||||
|
IEts2Placement Placement { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Current level of trailer wear/damage between 0 (min) and 1 (max).
|
||||||
|
/// Example: 0.0314717
|
||||||
|
/// </summary>
|
||||||
|
float Wear { get; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
public interface IEts2Wheel
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Is the wheel physically simulated or not.
|
||||||
|
/// </summary>
|
||||||
|
bool Simulated { get; }
|
||||||
|
/// <summary>
|
||||||
|
/// Is the wheel steerable or not.
|
||||||
|
/// </summary>
|
||||||
|
bool Steerable { get; }
|
||||||
|
/// <summary>
|
||||||
|
/// Radius of the wheel.
|
||||||
|
/// Example: 0.5120504
|
||||||
|
/// </summary>
|
||||||
|
float Radius { get; }
|
||||||
|
/// <summary>
|
||||||
|
/// Position of respective wheels in the vehicle space.
|
||||||
|
/// Example: { "x": -0.9, "y": 0.506898463, "z": 6.25029 }
|
||||||
|
/// </summary>
|
||||||
|
IEts2Vector Position { get; }
|
||||||
|
/// <summary>
|
||||||
|
/// Is the wheel powered or not.
|
||||||
|
/// </summary>
|
||||||
|
bool Powered { get; }
|
||||||
|
/// <summary>
|
||||||
|
/// Is the wheel liftable or not.
|
||||||
|
/// </summary>
|
||||||
|
bool Liftable { get; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IEts2GearSlot
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Gear selected when requirements for this h-shifter slot are meet.
|
||||||
|
/// Example: 0
|
||||||
|
/// </summary>
|
||||||
|
int Gear { get; }
|
||||||
|
/// <summary>
|
||||||
|
/// Position of h-shifter handle.
|
||||||
|
/// Zero corresponds to neutral position.
|
||||||
|
/// Mapping to physical position of the handle depends on input setup.
|
||||||
|
/// Example: 0
|
||||||
|
/// </summary>
|
||||||
|
int HandlePosition { get; }
|
||||||
|
/// <summary>
|
||||||
|
/// Bitmask of required on/off state of selectors.
|
||||||
|
/// Only first N number of bits are relevant (where N is the number of IEts2GearSlot objects).
|
||||||
|
/// Example: 0
|
||||||
|
/// </summary>
|
||||||
|
int SlotSelectors { get; }
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
@ -0,0 +1,214 @@
|
|||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
namespace Artemis.Modules.Games.EurotruckSimulator2.Data.Reader
|
||||||
|
{
|
||||||
|
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
|
||||||
|
internal struct Ets2TelemetryStructure
|
||||||
|
{
|
||||||
|
private const int GeneralStringSize = 64;
|
||||||
|
|
||||||
|
public uint time;
|
||||||
|
public uint paused;
|
||||||
|
|
||||||
|
public uint ets2_telemetry_plugin_revision;
|
||||||
|
public uint ets2_version_major;
|
||||||
|
public uint ets2_version_minor;
|
||||||
|
|
||||||
|
// ***** REVISION 1 ****** //
|
||||||
|
|
||||||
|
private readonly byte padding1;
|
||||||
|
public byte trailer_attached;
|
||||||
|
public byte padding2;
|
||||||
|
public byte padding3;
|
||||||
|
|
||||||
|
public float speed;
|
||||||
|
public float accelerationX;
|
||||||
|
public float accelerationY;
|
||||||
|
public float accelerationZ;
|
||||||
|
|
||||||
|
public float coordinateX;
|
||||||
|
public float coordinateY;
|
||||||
|
public float coordinateZ;
|
||||||
|
|
||||||
|
public float rotationX;
|
||||||
|
public float rotationY;
|
||||||
|
public float rotationZ;
|
||||||
|
|
||||||
|
public int gear;
|
||||||
|
public int gearsForward;
|
||||||
|
public int gearRanges;
|
||||||
|
public int gearRangeActive;
|
||||||
|
|
||||||
|
public float engineRpm;
|
||||||
|
public float engineRpmMax;
|
||||||
|
|
||||||
|
public float fuel;
|
||||||
|
public float fuelCapacity;
|
||||||
|
public float fuelRate;
|
||||||
|
public float fuelAvgConsumption;
|
||||||
|
|
||||||
|
public float userSteer;
|
||||||
|
public float userThrottle;
|
||||||
|
public float userBrake;
|
||||||
|
public float userClutch;
|
||||||
|
|
||||||
|
public float gameSteer;
|
||||||
|
public float gameThrottle;
|
||||||
|
public float gameBrake;
|
||||||
|
public float gameClutch;
|
||||||
|
|
||||||
|
public float truckWeight;
|
||||||
|
public float trailerWeight;
|
||||||
|
|
||||||
|
public int modelOffset;
|
||||||
|
public int modelLength;
|
||||||
|
|
||||||
|
public int trailerOffset;
|
||||||
|
public int trailerLength;
|
||||||
|
|
||||||
|
public int timeAbsolute;
|
||||||
|
public int gearsReverse;
|
||||||
|
|
||||||
|
public float trailerMass;
|
||||||
|
|
||||||
|
[MarshalAs(UnmanagedType.ByValArray, SizeConst = GeneralStringSize)] public byte[] trailerId;
|
||||||
|
|
||||||
|
[MarshalAs(UnmanagedType.ByValArray, SizeConst = GeneralStringSize)] public byte[] trailerName;
|
||||||
|
|
||||||
|
public int jobIncome;
|
||||||
|
public int jobDeadline;
|
||||||
|
|
||||||
|
[MarshalAs(UnmanagedType.ByValArray, SizeConst = GeneralStringSize)] public byte[] jobCitySource;
|
||||||
|
[MarshalAs(UnmanagedType.ByValArray, SizeConst = GeneralStringSize)] public byte[] jobCityDestination;
|
||||||
|
|
||||||
|
[MarshalAs(UnmanagedType.ByValArray, SizeConst = GeneralStringSize)] public byte[] jobCompanySource;
|
||||||
|
[MarshalAs(UnmanagedType.ByValArray, SizeConst = GeneralStringSize)] public byte[] jobCompanyDestination;
|
||||||
|
|
||||||
|
// ***** REVISION 3 ****** //
|
||||||
|
|
||||||
|
public int retarderBrake;
|
||||||
|
public int shifterSlot;
|
||||||
|
public int shifterToggle;
|
||||||
|
public int padding4;
|
||||||
|
|
||||||
|
public byte cruiseControl;
|
||||||
|
public byte wipers;
|
||||||
|
|
||||||
|
public byte parkBrake;
|
||||||
|
public byte motorBrake;
|
||||||
|
|
||||||
|
public byte electricEnabled;
|
||||||
|
public byte engineEnabled;
|
||||||
|
|
||||||
|
public byte blinkerLeftActive;
|
||||||
|
public byte blinkerRightActive;
|
||||||
|
public byte blinkerLeftOn;
|
||||||
|
public byte blinkerRightOn;
|
||||||
|
|
||||||
|
public byte lightsParking;
|
||||||
|
public byte lightsBeamLow;
|
||||||
|
public byte lightsBeamHigh;
|
||||||
|
public uint lightsAuxFront;
|
||||||
|
public uint lightsAuxRoof;
|
||||||
|
public byte lightsBeacon;
|
||||||
|
public byte lightsBrake;
|
||||||
|
public byte lightsReverse;
|
||||||
|
|
||||||
|
public byte batteryVoltageWarning;
|
||||||
|
public byte airPressureWarning;
|
||||||
|
public byte airPressureEmergency;
|
||||||
|
public byte adblueWarning;
|
||||||
|
public byte oilPressureWarning;
|
||||||
|
public byte waterTemperatureWarning;
|
||||||
|
|
||||||
|
public float airPressure;
|
||||||
|
public float brakeTemperature;
|
||||||
|
public int fuelWarning;
|
||||||
|
public float adblue;
|
||||||
|
public float adblueConsumption;
|
||||||
|
public float oilPressure;
|
||||||
|
public float oilTemperature;
|
||||||
|
public float waterTemperature;
|
||||||
|
public float batteryVoltage;
|
||||||
|
public float lightsDashboard;
|
||||||
|
public float wearEngine;
|
||||||
|
public float wearTransmission;
|
||||||
|
public float wearCabin;
|
||||||
|
public float wearChassis;
|
||||||
|
public float wearWheels;
|
||||||
|
public float wearTrailer;
|
||||||
|
public float truckOdometer;
|
||||||
|
public float cruiseControlSpeed;
|
||||||
|
|
||||||
|
[MarshalAs(UnmanagedType.ByValArray, SizeConst = GeneralStringSize)] public byte[] truckMake;
|
||||||
|
[MarshalAs(UnmanagedType.ByValArray, SizeConst = GeneralStringSize)] public byte[] truckMakeId;
|
||||||
|
[MarshalAs(UnmanagedType.ByValArray, SizeConst = GeneralStringSize)] public byte[] truckModel;
|
||||||
|
|
||||||
|
// ***** REVISION 4 ****** //
|
||||||
|
|
||||||
|
public float fuelWarningFactor;
|
||||||
|
public float adblueCapacity;
|
||||||
|
public float airPressureWarningValue;
|
||||||
|
public float airPressureEmergencyValue;
|
||||||
|
public float oilPressureWarningValue;
|
||||||
|
public float waterTemperatureWarningValue;
|
||||||
|
public float batteryVoltageWarningValue;
|
||||||
|
|
||||||
|
public uint retarderStepCount;
|
||||||
|
|
||||||
|
public float cabinPositionX;
|
||||||
|
public float cabinPositionY;
|
||||||
|
public float cabinPositionZ;
|
||||||
|
public float headPositionX;
|
||||||
|
public float headPositionY;
|
||||||
|
public float headPositionZ;
|
||||||
|
public float hookPositionX;
|
||||||
|
public float hookPositionY;
|
||||||
|
public float hookPositionZ;
|
||||||
|
|
||||||
|
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public byte[] shifterType;
|
||||||
|
|
||||||
|
public float localScale;
|
||||||
|
public int nextRestStop;
|
||||||
|
public float trailerCoordinateX;
|
||||||
|
public float trailerCoordinateY;
|
||||||
|
public float trailerCoordinateZ;
|
||||||
|
public float trailerRotationX;
|
||||||
|
public float trailerRotationY;
|
||||||
|
public float trailerRotationZ;
|
||||||
|
|
||||||
|
public int displayedGear;
|
||||||
|
public float navigationDistance;
|
||||||
|
public float navigationTime;
|
||||||
|
public float navigationSpeedLimit;
|
||||||
|
|
||||||
|
/*
|
||||||
|
const int MaxSlotCount = 32; // TODO: need to fix.
|
||||||
|
const int MaxWheelCount = 20;
|
||||||
|
public uint wheelCount;
|
||||||
|
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MaxWheelCount)]
|
||||||
|
public float[] wheelPositionX;
|
||||||
|
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MaxWheelCount)]
|
||||||
|
public float[] wheelPositionY;
|
||||||
|
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MaxWheelCount)]
|
||||||
|
public float[] wheelPositionZ;
|
||||||
|
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MaxWheelCount)]
|
||||||
|
public byte[] wheelSteerable;
|
||||||
|
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MaxWheelCount)]
|
||||||
|
public byte[] wheelSimulated;
|
||||||
|
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MaxWheelCount)]
|
||||||
|
public float[] wheelRadius;
|
||||||
|
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MaxWheelCount)]
|
||||||
|
public byte[] wheelPowered;
|
||||||
|
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MaxWheelCount)]
|
||||||
|
public byte[] wheelLiftable;
|
||||||
|
public uint selectorCount;
|
||||||
|
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MaxSlotCount)]
|
||||||
|
public int[] slotGear;
|
||||||
|
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MaxSlotCount)]
|
||||||
|
public uint[] slotHandlePosition;
|
||||||
|
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MaxSlotCount)]
|
||||||
|
public uint[] slotSelectors;
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,84 @@
|
|||||||
|
using System;
|
||||||
|
using System.IO.MemoryMappedFiles;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
namespace Artemis.Modules.Games.EurotruckSimulator2.Data.Reader
|
||||||
|
{
|
||||||
|
internal class SharedProcessMemory<T> : IDisposable
|
||||||
|
{
|
||||||
|
private readonly string _mapName;
|
||||||
|
private MemoryMappedViewAccessor _memoryMappedAccessor;
|
||||||
|
|
||||||
|
private MemoryMappedFile _memoryMappedFile;
|
||||||
|
|
||||||
|
public SharedProcessMemory(string mapName)
|
||||||
|
{
|
||||||
|
_mapName = mapName;
|
||||||
|
Data = default(T);
|
||||||
|
}
|
||||||
|
|
||||||
|
public T Data { get; set; }
|
||||||
|
|
||||||
|
public bool IsConnected
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
InitializeViewAccessor();
|
||||||
|
return _memoryMappedAccessor != null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
if (_memoryMappedAccessor != null)
|
||||||
|
{
|
||||||
|
_memoryMappedAccessor.Dispose();
|
||||||
|
_memoryMappedFile.Dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void InitializeViewAccessor()
|
||||||
|
{
|
||||||
|
if (_memoryMappedAccessor == null)
|
||||||
|
try
|
||||||
|
{
|
||||||
|
_memoryMappedFile = MemoryMappedFile.OpenExisting(_mapName, MemoryMappedFileRights.ReadWrite);
|
||||||
|
_memoryMappedAccessor = _memoryMappedFile.CreateViewAccessor(0, Marshal.SizeOf(typeof(T)),
|
||||||
|
MemoryMappedFileAccess.Read);
|
||||||
|
}
|
||||||
|
// ReSharper disable once EmptyGeneralCatchClause
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Read()
|
||||||
|
{
|
||||||
|
InitializeViewAccessor();
|
||||||
|
|
||||||
|
if (_memoryMappedAccessor == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var rawData = new byte[Marshal.SizeOf(typeof(T))];
|
||||||
|
|
||||||
|
_memoryMappedAccessor.ReadArray(0, rawData, 0, rawData.Length);
|
||||||
|
|
||||||
|
T createdObject;
|
||||||
|
|
||||||
|
var reservedMemPtr = IntPtr.Zero;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
reservedMemPtr = Marshal.AllocHGlobal(rawData.Length);
|
||||||
|
Marshal.Copy(rawData, 0, reservedMemPtr, rawData.Length);
|
||||||
|
createdObject = (T) Marshal.PtrToStructure(reservedMemPtr, typeof(T));
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
if (reservedMemPtr != IntPtr.Zero)
|
||||||
|
Marshal.FreeHGlobal(reservedMemPtr);
|
||||||
|
}
|
||||||
|
|
||||||
|
Data = createdObject;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,18 +1,14 @@
|
|||||||
using Artemis.Models.Interfaces;
|
using Artemis.Models.Interfaces;
|
||||||
using Ets2SdkClient;
|
using Artemis.Modules.Games.EurotruckSimulator2.Data;
|
||||||
|
|
||||||
namespace Artemis.Modules.Games.EurotruckSimulator2
|
namespace Artemis.Modules.Games.EurotruckSimulator2
|
||||||
{
|
{
|
||||||
public class EurotruckSimulator2DataModel : IDataModel
|
public class EurotruckSimulator2DataModel : IDataModel
|
||||||
{
|
{
|
||||||
public Ets2Telemetry._Axilliary Axilliary { get; set; }
|
public IEts2Game Game { get; set; }
|
||||||
public Ets2Telemetry._Controls Controls { get; set; }
|
public IEts2Job Job { get; set; }
|
||||||
public Ets2Telemetry._Damage Damage { get; set; }
|
public IEts2Navigation Navigation { get; set; }
|
||||||
public Ets2Telemetry._Drivetrain Drivetrain { get; set; }
|
public IEts2Trailer Trailer { get; set; }
|
||||||
public Ets2Telemetry._Job Job { get; set; }
|
public IEts2Truck Truck { get; set; }
|
||||||
public Ets2Telemetry._Lights Lights { get; set; }
|
|
||||||
public string Manufacturer { get; set; }
|
|
||||||
public string ManufacturerId { get; set; }
|
|
||||||
public Ets2Telemetry._Physics Physics { get; set; }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2,8 +2,8 @@
|
|||||||
using Artemis.DAL;
|
using Artemis.DAL;
|
||||||
using Artemis.Managers;
|
using Artemis.Managers;
|
||||||
using Artemis.Models;
|
using Artemis.Models;
|
||||||
|
using Artemis.Modules.Games.EurotruckSimulator2.Data;
|
||||||
using Artemis.Profiles.Layers.Models;
|
using Artemis.Profiles.Layers.Models;
|
||||||
using Ets2SdkClient;
|
|
||||||
using Ninject.Extensions.Logging;
|
using Ninject.Extensions.Logging;
|
||||||
|
|
||||||
namespace Artemis.Modules.Games.EurotruckSimulator2
|
namespace Artemis.Modules.Games.EurotruckSimulator2
|
||||||
@ -24,42 +24,26 @@ namespace Artemis.Modules.Games.EurotruckSimulator2
|
|||||||
public ILogger Logger { get; set; }
|
public ILogger Logger { get; set; }
|
||||||
public int Scale { get; set; }
|
public int Scale { get; set; }
|
||||||
|
|
||||||
public Ets2SdkTelemetry Telemetry { get; set; }
|
|
||||||
|
|
||||||
public override void Dispose()
|
public override void Dispose()
|
||||||
{
|
{
|
||||||
Initialized = false;
|
Initialized = false;
|
||||||
|
|
||||||
Telemetry.Data -= TelemetryOnData;
|
|
||||||
Telemetry = null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void Enable()
|
public override void Enable()
|
||||||
{
|
{
|
||||||
Telemetry = new Ets2SdkTelemetry();
|
|
||||||
Telemetry.Data += TelemetryOnData;
|
|
||||||
if (Telemetry.Error != null)
|
|
||||||
MainManager.Logger.Error(Telemetry.Error, "Exception in the Eurotruck SDK");
|
|
||||||
|
|
||||||
Initialized = true;
|
Initialized = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void TelemetryOnData(Ets2Telemetry data, bool newTimestamp)
|
|
||||||
{
|
|
||||||
((EurotruckSimulator2DataModel) DataModel).Axilliary = data.Axilliary;
|
|
||||||
((EurotruckSimulator2DataModel) DataModel).Controls = data.Controls;
|
|
||||||
((EurotruckSimulator2DataModel) DataModel).Damage = data.Damage;
|
|
||||||
((EurotruckSimulator2DataModel) DataModel).Drivetrain = data.Drivetrain;
|
|
||||||
((EurotruckSimulator2DataModel) DataModel).Job = data.Job;
|
|
||||||
((EurotruckSimulator2DataModel) DataModel).Lights = data.Lights;
|
|
||||||
((EurotruckSimulator2DataModel) DataModel).Manufacturer = data.Manufacturer;
|
|
||||||
((EurotruckSimulator2DataModel) DataModel).ManufacturerId = data.ManufacturerId;
|
|
||||||
((EurotruckSimulator2DataModel) DataModel).Physics = data.Physics;
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void Update()
|
public override void Update()
|
||||||
{
|
{
|
||||||
// Updating is handled in the TelemetryOnData event
|
var dataModel = (EurotruckSimulator2DataModel) DataModel;
|
||||||
|
var telemetryData = Ets2TelemetryDataReader.Instance.Read();
|
||||||
|
|
||||||
|
dataModel.Game = telemetryData.Game;
|
||||||
|
dataModel.Job = telemetryData.Job;
|
||||||
|
dataModel.Navigation = telemetryData.Navigation;
|
||||||
|
dataModel.Trailer = telemetryData.Trailer;
|
||||||
|
dataModel.Truck = telemetryData.Truck;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override List<LayerModel> GetRenderLayers(bool keyboardOnly)
|
public override List<LayerModel> GetRenderLayers(bool keyboardOnly)
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
xmlns:cal="http://www.caliburnproject.org"
|
xmlns:cal="http://www.caliburnproject.org"
|
||||||
mc:Ignorable="d"
|
mc:Ignorable="d"
|
||||||
d:DesignHeight="476.986" d:DesignWidth="538.772">
|
d:DesignHeight="559.725" d:DesignWidth="882.696">
|
||||||
<ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto">
|
<ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto">
|
||||||
<Grid Margin="15,5,5,5">
|
<Grid Margin="15,5,5,5">
|
||||||
<Grid.ColumnDefinitions>
|
<Grid.ColumnDefinitions>
|
||||||
@ -20,31 +20,50 @@
|
|||||||
<RowDefinition Height="*" />
|
<RowDefinition Height="*" />
|
||||||
</Grid.RowDefinitions>
|
</Grid.RowDefinitions>
|
||||||
|
|
||||||
<StackPanel Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" Margin="0,0,1,0">
|
<Grid Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" Margin="0,0,1,0">
|
||||||
<Label FontSize="20" HorizontalAlignment="Left">
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition />
|
||||||
|
<ColumnDefinition />
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
<Grid.RowDefinitions>
|
||||||
|
<RowDefinition />
|
||||||
|
<RowDefinition />
|
||||||
|
</Grid.RowDefinitions>
|
||||||
|
<Label Grid.Row="0" Grid.ColumnSpan="2" FontSize="20" HorizontalAlignment="Left">
|
||||||
<Label.Content>
|
<Label.Content>
|
||||||
<AccessText TextWrapping="Wrap"
|
<AccessText TextWrapping="Wrap"
|
||||||
Text="By default shows indicator lights, speed and engine RPM on the keyboard" />
|
Text="By default shows indicator lights, speed and engine RPM on the keyboard" />
|
||||||
</Label.Content>
|
</Label.Content>
|
||||||
</Label>
|
</Label>
|
||||||
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
|
|
||||||
|
<TextBlock Grid.Row="1" Grid.Column="0" VerticalAlignment="Bottom"
|
||||||
|
TextWrapping="Wrap" HorizontalAlignment="Left" FontFamily="Segoe UI Semibold"
|
||||||
|
TextAlignment="Justify" Margin="5,0,0,10">
|
||||||
|
The Euro Truck Simulator 2 module uses code from the
|
||||||
|
<Hyperlink RequestNavigate="Hyperlink_RequestNavigate"
|
||||||
|
NavigateUri="https://github.com/Funbit/ets2-telemetry-server">
|
||||||
|
ETS2 Telemetry Web Server
|
||||||
|
</Hyperlink>
|
||||||
|
project by Funbit
|
||||||
|
</TextBlock>
|
||||||
|
<StackPanel Orientation="Horizontal" Grid.Row="1" Grid.Column="1" HorizontalAlignment="Right">
|
||||||
<Label Content="Enable effect" Margin="0 3 0 0" HorizontalAlignment="Right" />
|
<Label Content="Enable effect" Margin="0 3 0 0" HorizontalAlignment="Right" />
|
||||||
<ToggleButton x:Name="EffectEnabled" Margin="0 3 0 0" Width="25" Height="25"
|
<ToggleButton x:Name="EffectEnabled" Margin="0 3 0 0" Width="25" Height="25"
|
||||||
IsChecked="{Binding Path=GameSettings.Enabled, Mode=TwoWay}"
|
IsChecked="{Binding Path=GameSettings.Enabled, Mode=TwoWay}"
|
||||||
Style="{DynamicResource MetroCircleToggleButtonStyle}"
|
Style="{DynamicResource MetroCircleToggleButtonStyle}"
|
||||||
cal:Message.Attach="[Event Click] = [Action ToggleEffect]" />
|
cal:Message.Attach="[Event Click] = [Action ToggleEffect]" />
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</StackPanel>
|
</Grid>
|
||||||
|
|
||||||
<StackPanel Grid.Row="1"
|
<StackPanel Grid.Row="2"
|
||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
Grid.ColumnSpan="2" Margin="0,0,1,0">
|
Grid.ColumnSpan="2" Margin="0,0,1,0">
|
||||||
|
|
||||||
<Label FontSize="20" HorizontalAlignment="Left" Content="Eurotruck Simulator 2 directory" />
|
<Label FontSize="20" HorizontalAlignment="Left" Content="Euro Truck Simulator 2 directory" />
|
||||||
<Grid>
|
<Grid>
|
||||||
<TextBox x:Name="GameDirectory" Height="23" TextWrapping="Wrap" Margin="5,0,30,0"
|
<TextBox x:Name="GameDirectory" Height="23" TextWrapping="Wrap" Margin="5,0,30,0"
|
||||||
Text="{Binding Path=GameSettings.GameDirectory, Mode=TwoWay}"
|
Text="{Binding Path=GameSettings.GameDirectory, Mode=TwoWay}"
|
||||||
cal:Message.Attach="[Event LostFocus] = [Action PlaceConfigFile]" />
|
cal:Message.Attach="[Event LostFocus] = [Action PlacePlugin]" />
|
||||||
<Button x:Name="BrowseDirectory" Content="..." RenderTransformOrigin="-0.039,-0.944"
|
<Button x:Name="BrowseDirectory" Content="..." RenderTransformOrigin="-0.039,-0.944"
|
||||||
HorizontalAlignment="Right" Width="25"
|
HorizontalAlignment="Right" Width="25"
|
||||||
Style="{DynamicResource SquareButtonStyle}" Height="26" Margin="0,-2,0,0" />
|
Style="{DynamicResource SquareButtonStyle}" Height="26" Margin="0,-2,0,0" />
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
using System.Windows.Controls;
|
using System.Windows.Controls;
|
||||||
|
using System.Windows.Navigation;
|
||||||
|
|
||||||
namespace Artemis.Modules.Games.EurotruckSimulator2
|
namespace Artemis.Modules.Games.EurotruckSimulator2
|
||||||
{
|
{
|
||||||
@ -11,5 +12,10 @@ namespace Artemis.Modules.Games.EurotruckSimulator2
|
|||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void Hyperlink_RequestNavigate(object sender, RequestNavigateEventArgs e)
|
||||||
|
{
|
||||||
|
System.Diagnostics.Process.Start(e.Uri.ToString());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1,7 +1,9 @@
|
|||||||
using System.IO;
|
using System;
|
||||||
|
using System.IO;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using Artemis.InjectionFactories;
|
using Artemis.InjectionFactories;
|
||||||
using Artemis.Managers;
|
using Artemis.Managers;
|
||||||
|
using Artemis.Properties;
|
||||||
using Artemis.Utilities;
|
using Artemis.Utilities;
|
||||||
using Artemis.ViewModels.Abstract;
|
using Artemis.ViewModels.Abstract;
|
||||||
|
|
||||||
@ -15,23 +17,24 @@ namespace Artemis.Modules.Games.EurotruckSimulator2
|
|||||||
DisplayName = "ETS 2";
|
DisplayName = "ETS 2";
|
||||||
|
|
||||||
FindGameDir();
|
FindGameDir();
|
||||||
PlacePlugin();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void FindGameDir()
|
public void FindGameDir()
|
||||||
{
|
{
|
||||||
var gameSettings = (EurotruckSimulator2Settings) GameSettings;
|
var gameSettings = (EurotruckSimulator2Settings) GameSettings;
|
||||||
// If already propertly set up, don't do anything
|
// Demo is also supported but resides in a different directory, the full game can also be 64-bits
|
||||||
//if (gameSettings.GameDirectory != null && File.Exists(gameSettings.GameDirectory + "csgo.exe") &&
|
var dir = GeneralHelpers.FindSteamGame(@"\Euro Truck Simulator 2\bin\win_x64\eurotrucks2.exe") ??
|
||||||
// File.Exists(gameSettings.GameDirectory + "/csgo/cfg/gamestate_integration_artemis.cfg"))
|
GeneralHelpers.FindSteamGame(@"\Euro Truck Simulator 2\bin\win_x86\eurotrucks2.exe") ??
|
||||||
// return;
|
|
||||||
|
|
||||||
// Demo is also supported but resides in a different directory
|
|
||||||
var dir = GeneralHelpers.FindSteamGame(@"\Euro Truck Simulator 2\bin\win_x86\eurotrucks2.exe") ??
|
|
||||||
GeneralHelpers.FindSteamGame(@"\Euro Truck Simulator 2 Demo\bin\win_x86\eurotrucks2.exe");
|
GeneralHelpers.FindSteamGame(@"\Euro Truck Simulator 2 Demo\bin\win_x86\eurotrucks2.exe");
|
||||||
|
|
||||||
gameSettings.GameDirectory = dir ?? string.Empty;
|
if (string.IsNullOrEmpty(dir))
|
||||||
|
return;
|
||||||
|
|
||||||
|
gameSettings.GameDirectory = dir;
|
||||||
gameSettings.Save();
|
gameSettings.Save();
|
||||||
|
|
||||||
|
if (!File.Exists(dir + "/plugins/ets2-telemetry-server.dll"))
|
||||||
|
PlacePlugin();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void BrowseDirectory()
|
public void BrowseDirectory()
|
||||||
@ -57,21 +60,40 @@ namespace Artemis.Modules.Games.EurotruckSimulator2
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
var path = ((EurotruckSimulator2Settings) GameSettings).GameDirectory;
|
var path = ((EurotruckSimulator2Settings) GameSettings).GameDirectory;
|
||||||
//if (Directory.Exists(path + "/csgo/cfg"))
|
|
||||||
//{
|
|
||||||
// var cfgFile = Resources.csgoGamestateConfiguration.Replace("{{port}}",
|
|
||||||
// MainManager.GameStateWebServer.Port.ToString());
|
|
||||||
// File.WriteAllText(path + "/csgo/cfg/gamestate_integration_artemis.cfg", cfgFile);
|
|
||||||
|
|
||||||
// return;
|
// Ensure the selected directory exists
|
||||||
//}
|
if (!Directory.Exists(path))
|
||||||
|
{
|
||||||
|
DialogService.ShowErrorMessageBox($"Directory '{path}' not found.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Ensure it's the ETS2 directory by looking for the executable
|
||||||
|
if (!File.Exists(path + "/eurotrucks2.exe"))
|
||||||
|
{
|
||||||
|
DialogService.ShowErrorMessageBox("Please select a valid Eurotruck Simulator 2 directory\n\n" +
|
||||||
|
@"By default ETS2 is in \SteamApps\common\Euro Truck Simulator 2\bin\win_x64");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
//DialogService.ShowErrorMessageBox("Please select a valid CS:GO directory\n\n" +
|
// Create the plugins folder if it's not already there
|
||||||
// @"By default CS:GO is in \SteamApps\common\Counter-Strike Global Offensive");
|
Directory.CreateDirectory(path + "/plugins");
|
||||||
|
|
||||||
//((EurotruckSimulator2Settings) GameSettings).GameDirectory = string.Empty;
|
// Place either the 64-bits or 32-bits DLL
|
||||||
//NotifyOfPropertyChange(() => GameSettings);
|
try
|
||||||
//GameSettings.Save();
|
{
|
||||||
|
if (path.Contains("win_x64"))
|
||||||
|
File.WriteAllBytes(path + "/plugins/ets2-telemetry-server.dll", Resources.ets2_telemetry_server_x64);
|
||||||
|
else
|
||||||
|
File.WriteAllBytes(path + "/plugins/ets2-telemetry-server.dll", Resources.ets2_telemetry_server_x86);
|
||||||
|
|
||||||
|
MainManager.Logger.Debug("Installed ETS2 plugin in {0}", path);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
MainManager.Logger.Error(e, "Failed to install ETS2 plugin in {0}", path);
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Binary file not shown.
Binary file not shown.
@ -96,11 +96,7 @@ namespace Artemis.Modules.Games.UnrealTournament
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Load the ZIP from resources
|
// Load the ZIP from resources
|
||||||
var stream = Assembly.GetExecutingAssembly()
|
var stream = new MemoryStream(Resources.ut_plugin);
|
||||||
.GetManifestResourceStream("Artemis.Modules.Games.UnrealTournament.Resources.ut-plugin.zip");
|
|
||||||
if (stream == null)
|
|
||||||
throw new FileNotFoundException("Couldn't load the UT plugin files from resources.");
|
|
||||||
|
|
||||||
var archive = new ZipArchive(stream);
|
var archive = new ZipArchive(stream);
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
|||||||
@ -7,6 +7,7 @@ using System.Reflection;
|
|||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using Artemis.InjectionFactories;
|
using Artemis.InjectionFactories;
|
||||||
using Artemis.Managers;
|
using Artemis.Managers;
|
||||||
|
using Artemis.Properties;
|
||||||
using Artemis.Utilities;
|
using Artemis.Utilities;
|
||||||
using Artemis.ViewModels.Abstract;
|
using Artemis.ViewModels.Abstract;
|
||||||
|
|
||||||
@ -47,10 +48,7 @@ namespace Artemis.Modules.Games.Witcher3
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Load the ZIP from resources
|
// Load the ZIP from resources
|
||||||
var stream = Assembly.GetExecutingAssembly()
|
var stream = new MemoryStream(Resources.witcher3_mod);
|
||||||
.GetManifestResourceStream("Artemis.Modules.Games.Witcher3.Resources.witcher3-mod.zip");
|
|
||||||
if (stream == null)
|
|
||||||
throw new FileNotFoundException("Couldn't load the Witcher 3 mod files from resources.");
|
|
||||||
var archive = new ZipArchive(stream);
|
var archive = new ZipArchive(stream);
|
||||||
|
|
||||||
// Look for any conflicting mods
|
// Look for any conflicting mods
|
||||||
|
|||||||
@ -52,5 +52,5 @@ using System.Windows;
|
|||||||
// by using the '*' as shown below:
|
// by using the '*' as shown below:
|
||||||
// [assembly: AssemblyVersion("1.0.*")]
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
|
|
||||||
[assembly: AssemblyVersion("1.3.0.0")]
|
[assembly: AssemblyVersion("1.3.1.0")]
|
||||||
[assembly: AssemblyFileVersion("1.3.0.0")]
|
[assembly: AssemblyFileVersion("1.3.1.0")]
|
||||||
20
Artemis/Artemis/Properties/Resources.Designer.cs
generated
20
Artemis/Artemis/Properties/Resources.Designer.cs
generated
@ -148,6 +148,26 @@ namespace Artemis.Properties {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized resource of type System.Byte[].
|
||||||
|
/// </summary>
|
||||||
|
internal static byte[] ets2_telemetry_server_x64 {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("ets2_telemetry_server_x64", resourceCulture);
|
||||||
|
return ((byte[])(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized resource of type System.Byte[].
|
||||||
|
/// </summary>
|
||||||
|
internal static byte[] ets2_telemetry_server_x86 {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("ets2_telemetry_server_x86", resourceCulture);
|
||||||
|
return ((byte[])(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@ -193,4 +193,10 @@
|
|||||||
<data name="redeemer" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
<data name="redeemer" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
<value>..\Modules\Games\UnrealTournament\Resources\redeemer.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
<value>..\Modules\Games\UnrealTournament\Resources\redeemer.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="ets2_telemetry_server_x64" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Modules\Games\EurotruckSimulator2\Resources\Win64\ets2-telemetry-server.dll;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
|
<data name="ets2_telemetry_server_x86" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Modules\Games\EurotruckSimulator2\Resources\Win32\ets2-telemetry-server.dll;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
||||||
@ -76,7 +76,7 @@ namespace Artemis.Utilities
|
|||||||
if (friendlyName != Empty)
|
if (friendlyName != Empty)
|
||||||
list.Add(parent);
|
list.Add(parent);
|
||||||
|
|
||||||
if (propertyInfo.PropertyType.Name != "String")
|
if (propertyInfo.PropertyType.Name != "String" && propertyInfo.PropertyType.Name != "DateTime")
|
||||||
list.AddRange(GenerateTypeMap(propertyInfo.PropertyType.GetProperties(),
|
list.AddRange(GenerateTypeMap(propertyInfo.PropertyType.GetProperties(),
|
||||||
path + $"{propertyInfo.Name}."));
|
path + $"{propertyInfo.Name}."));
|
||||||
}
|
}
|
||||||
|
|||||||
@ -40,11 +40,13 @@ namespace Artemis.Utilities
|
|||||||
{
|
{
|
||||||
await mgr.Result.UpdateApp();
|
await mgr.Result.UpdateApp();
|
||||||
Logger.Info("Update check complete");
|
Logger.Info("Update check complete");
|
||||||
mgr.Result.Dispose();
|
mgr.Result.Dispose(); // This seems odd but if it's not disposed and exception is thrown
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
|
// These exceptions should only really occur when running from VS
|
||||||
Logger.Error(e, "Update check failed");
|
Logger.Error(e, "Update check failed");
|
||||||
|
mgr.Result.Dispose();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -15,8 +15,7 @@ namespace Artemis.Views
|
|||||||
|
|
||||||
private void Hyperlink_RequestNavigate(object sender, RequestNavigateEventArgs e)
|
private void Hyperlink_RequestNavigate(object sender, RequestNavigateEventArgs e)
|
||||||
{
|
{
|
||||||
System.Diagnostics.Process.Start(
|
System.Diagnostics.Process.Start(e.Uri.ToString());
|
||||||
"https://github.com/SpoinkyNL/Artemis/wiki/Frequently-Asked-Questions-(FAQ)");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user