diff --git a/ets2-client/C#/Ets2SdkClient.Demo/Ets2SdkClient.Demo.csproj b/ets2-client/C#/Ets2SdkClient.Demo/Ets2SdkClient.Demo.csproj index 464fa55..639b7ef 100644 --- a/ets2-client/C#/Ets2SdkClient.Demo/Ets2SdkClient.Demo.csproj +++ b/ets2-client/C#/Ets2SdkClient.Demo/Ets2SdkClient.Demo.csproj @@ -49,16 +49,16 @@ Component - + Form - - Form1.cs + + Ets2SdkClientDemo.cs - - Form1.cs + + Ets2SdkClientDemo.cs ResXFileCodeGenerator diff --git a/ets2-client/C#/Ets2SdkClient.Demo/Form1.Designer.cs b/ets2-client/C#/Ets2SdkClient.Demo/Ets2SdkClientDemo.Designer.cs similarity index 96% rename from ets2-client/C#/Ets2SdkClient.Demo/Form1.Designer.cs rename to ets2-client/C#/Ets2SdkClient.Demo/Ets2SdkClientDemo.Designer.cs index 9d38813..624a4d0 100644 --- a/ets2-client/C#/Ets2SdkClient.Demo/Form1.Designer.cs +++ b/ets2-client/C#/Ets2SdkClient.Demo/Ets2SdkClientDemo.Designer.cs @@ -1,6 +1,6 @@ namespace Ets2SdkClient.Demo { - partial class Form1 + partial class Ets2SdkClientDemo { /// /// Required designer variable. @@ -28,12 +28,12 @@ protected override void Dispose(bool disposing) /// private void InitializeComponent() { - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1)); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Ets2SdkClientDemo)); this.telemetryInfo = new System.Windows.Forms.TabControl(); this.tabAbout = new System.Windows.Forms.TabPage(); - this.lblDemo = new System.Windows.Forms.Label(); - this.richTextBox1 = new System.Windows.Forms.RichTextBox(); this.lbGeneral = new System.Windows.Forms.RichTextBox(); + this.richTextBox1 = new System.Windows.Forms.RichTextBox(); + this.lblDemo = new System.Windows.Forms.Label(); this.telemetryInfo.SuspendLayout(); this.tabAbout.SuspendLayout(); this.SuspendLayout(); @@ -61,15 +61,13 @@ private void InitializeComponent() this.tabAbout.Text = "About"; this.tabAbout.UseVisualStyleBackColor = true; // - // lblDemo + // lbGeneral // - this.lblDemo.AutoSize = true; - this.lblDemo.Font = new System.Drawing.Font("Microsoft Sans Serif", 15.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.lblDemo.Location = new System.Drawing.Point(132, 33); - this.lblDemo.Name = "lblDemo"; - this.lblDemo.Size = new System.Drawing.Size(336, 25); - this.lblDemo.TabIndex = 0; - this.lblDemo.Text = "ETS2 SDK Telemetry C# Demo"; + this.lbGeneral.Location = new System.Drawing.Point(20, 210); + this.lbGeneral.Name = "lbGeneral"; + this.lbGeneral.Size = new System.Drawing.Size(549, 243); + this.lbGeneral.TabIndex = 2; + this.lbGeneral.Text = ""; // // richTextBox1 // @@ -79,22 +77,24 @@ private void InitializeComponent() this.richTextBox1.TabIndex = 1; this.richTextBox1.Text = resources.GetString("richTextBox1.Text"); // - // lbGeneral + // lblDemo // - this.lbGeneral.Location = new System.Drawing.Point(20, 210); - this.lbGeneral.Name = "lbGeneral"; - this.lbGeneral.Size = new System.Drawing.Size(549, 243); - this.lbGeneral.TabIndex = 2; - this.lbGeneral.Text = ""; + this.lblDemo.AutoSize = true; + this.lblDemo.Font = new System.Drawing.Font("Microsoft Sans Serif", 15.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblDemo.Location = new System.Drawing.Point(132, 33); + this.lblDemo.Name = "lblDemo"; + this.lblDemo.Size = new System.Drawing.Size(336, 25); + this.lblDemo.TabIndex = 0; + this.lblDemo.Text = "ETS2 SDK Telemetry C# Demo"; // - // Form1 + // Ets2SdkClientDemo // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(595, 621); this.Controls.Add(this.telemetryInfo); - this.Name = "Form1"; - this.Text = "Form1"; + this.Name = "Ets2SdkClientDemo"; + this.Text = "Ets2SdkClientDemo 1.4.0"; this.telemetryInfo.ResumeLayout(false); this.tabAbout.ResumeLayout(false); this.tabAbout.PerformLayout(); diff --git a/ets2-client/C#/Ets2SdkClient.Demo/Form1.cs b/ets2-client/C#/Ets2SdkClient.Demo/Ets2SdkClientDemo.cs similarity index 88% rename from ets2-client/C#/Ets2SdkClient.Demo/Form1.cs rename to ets2-client/C#/Ets2SdkClient.Demo/Ets2SdkClientDemo.cs index 07ce575..45c8f78 100644 --- a/ets2-client/C#/Ets2SdkClient.Demo/Form1.cs +++ b/ets2-client/C#/Ets2SdkClient.Demo/Ets2SdkClientDemo.cs @@ -6,17 +6,20 @@ namespace Ets2SdkClient.Demo { - public partial class Form1 : Form + public partial class Ets2SdkClientDemo : Form { public Ets2SdkTelemetry Telemetry; - public Form1() + public Ets2SdkClientDemo() { InitializeComponent(); Telemetry = new Ets2SdkTelemetry(); Telemetry.Data += Telemetry_Data; + Telemetry.JobFinished += TelemetryOnJobFinished; + Telemetry.JobStarted += TelemetryOnJobStarted; + if (Telemetry.Error != null) { lbGeneral.Text = @@ -26,6 +29,16 @@ public Form1() } } + private void TelemetryOnJobFinished(object sender, EventArgs args) + { + MessageBox.Show("Job finished, or at least unloaded nearby cargo destination."); + } + + private void TelemetryOnJobStarted(object sender, EventArgs e) + { + MessageBox.Show("Just started job OR loaded game with active."); + } + private void Telemetry_Data(Ets2Telemetry data, bool updated) { try diff --git a/ets2-client/C#/Ets2SdkClient.Demo/Form1.resx b/ets2-client/C#/Ets2SdkClient.Demo/Ets2SdkClientDemo.resx similarity index 100% rename from ets2-client/C#/Ets2SdkClient.Demo/Form1.resx rename to ets2-client/C#/Ets2SdkClient.Demo/Ets2SdkClientDemo.resx diff --git a/ets2-client/C#/Ets2SdkClient.Demo/Program.cs b/ets2-client/C#/Ets2SdkClient.Demo/Program.cs index 4d05c62..b3c689a 100644 --- a/ets2-client/C#/Ets2SdkClient.Demo/Program.cs +++ b/ets2-client/C#/Ets2SdkClient.Demo/Program.cs @@ -1,6 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; using System.Windows.Forms; namespace Ets2SdkClient.Demo @@ -15,7 +13,7 @@ static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); - Application.Run(new Form1()); + Application.Run(new Ets2SdkClientDemo()); } } } diff --git a/ets2-client/C#/Ets2SdkClient/Ets2SdkData.cs b/ets2-client/C#/Ets2SdkClient/Ets2SdkData.cs index d553cc3..89c2add 100644 --- a/ets2-client/C#/Ets2SdkClient/Ets2SdkData.cs +++ b/ets2-client/C#/Ets2SdkClient/Ets2SdkData.cs @@ -234,7 +234,9 @@ public struct Ets2SdkData [FieldOffset(1016)] public int gearDashboard; - + + [FieldOffset(1020)] public byte onJob; + [FieldOffset(1021)] public byte jobFinished; public bool GetBool(Ets2SdkBoolean i) { diff --git a/ets2-client/C#/Ets2SdkClient/Ets2SdkTelemetry.cs b/ets2-client/C#/Ets2SdkClient/Ets2SdkTelemetry.cs index 42da831..c934256 100644 --- a/ets2-client/C#/Ets2SdkClient/Ets2SdkTelemetry.cs +++ b/ets2-client/C#/Ets2SdkClient/Ets2SdkTelemetry.cs @@ -1,9 +1,4 @@ using System; -using System.Collections.Generic; -using System.Dynamic; -using System.IO; -using System.Linq; -using System.Runtime.InteropServices; using System.Text; using System.Timers; @@ -27,6 +22,12 @@ public class Ets2SdkTelemetry public event TelemetryData Data; + public event EventHandler JobStarted; + public event EventHandler JobFinished; + + private bool wasOnJob; + private bool wasFinishingJob; + public Ets2SdkTelemetry() { Setup(DefaultSharedMemoryMap, DefaultUpdateInterval); @@ -85,6 +86,22 @@ void _updateTimer_Elapsed(object sender, ElapsedEventArgs e) if (Data != null) Data(ets2telemetry, ets2RawData.time != lastTime); + // Job close & start events + if (wasFinishingJob != ets2telemetry.Job.JobFinished) + { + wasFinishingJob = ets2telemetry.Job.JobFinished; + if (ets2telemetry.Job.JobFinished) + JobFinished(this, new EventArgs()); + + } + if (wasOnJob != ets2telemetry.Job.OnJob) + { + wasOnJob = ets2telemetry.Job.OnJob; + if (ets2telemetry.Job.OnJob) + JobStarted(this, new EventArgs()); + + } + lastTime = ets2RawData.time; } diff --git a/ets2-client/C#/Ets2SdkClient/Ets2Telemetry.cs b/ets2-client/C#/Ets2SdkClient/Ets2Telemetry.cs index 0e14de3..4a04956 100644 --- a/ets2-client/C#/Ets2SdkClient/Ets2Telemetry.cs +++ b/ets2-client/C#/Ets2SdkClient/Ets2Telemetry.cs @@ -1,6 +1,4 @@ using System; -using System.ComponentModel; -using System.Dynamic; using System.Text; namespace Ets2SdkClient @@ -108,6 +106,9 @@ public class _Controls public class _Job { + public bool OnJob { get; internal set; } + public bool JobFinished { get; internal set; } + public bool TrailerAttached { get; internal set; } public float Mass { get; internal set; } public string TrailerId { get; internal set; } @@ -298,12 +299,15 @@ public Ets2Telemetry(Ets2SdkData raw, Ets2SdkUnmanaged rawUnmanaged) Job.TrailerAttached = raw.GetBool(Ets2SdkBoolean.TrailerAttached);//TODO Job.TrailerId = Encoding.UTF8.GetString(raw.trailerId).Replace('\0', ' ').Trim(); Job.TrailerName = Encoding.UTF8.GetString(raw.trailerName).Replace('\0', ' ').Trim(); - Job.Cargo = rawUnmanaged.TrailerModel.Replace('\0', ' ').Trim(); + Job.Cargo = Job.TrailerName; // trailerModel is actually deprecated Job.NavigationDistanceLeft = raw.routeDistance; Job.NavigationTimeLeft = raw.routeTime; Job.SpeedLimit = raw.speedLimit; + Job.OnJob = raw.onJob != 0; + Job.JobFinished = raw.jobFinished != 0; + // Axilliary flags Axilliary.AdblueWarning = raw.GetBool(Ets2SdkBoolean.AdblueWarning); Axilliary.AirPressureEmergency = raw.GetBool(Ets2SdkBoolean.AirPressureEmergency); diff --git a/ets2-client/C#/Ets2SdkClient/SharedMemory.cs b/ets2-client/C#/Ets2SdkClient/SharedMemory.cs index 834bfd5..eed1d5b 100644 --- a/ets2-client/C#/Ets2SdkClient/SharedMemory.cs +++ b/ets2-client/C#/Ets2SdkClient/SharedMemory.cs @@ -1,7 +1,5 @@ using System; -using System.Data.Common; using System.IO.MemoryMappedFiles; -using System.Net.Mail; using System.Runtime.InteropServices; namespace Ets2SdkClient diff --git a/ets2-telemetry/inc/ets2-telemetry-common.hpp b/ets2-telemetry/inc/ets2-telemetry-common.hpp index 166198c..b22661f 100644 --- a/ets2-telemetry/inc/ets2-telemetry-common.hpp +++ b/ets2-telemetry/inc/ets2-telemetry-common.hpp @@ -7,10 +7,10 @@ // - Shared memory map struct layout // - [..] -#define ETS2_PLUGIN_REVID 4 +#define ETS2_PLUGIN_REVID 5 #define ETS2_PLUGIN_LOGGING_ON 0 -#define ETS2_PLUGIN_LOGGING_SHAREDMEMORY 1 +#define ETS2_PLUGIN_LOGGING_SHAREDMEMORY 0 #define ETS2_PLUGIN_FILENAME_PREFIX "C:\ets2telem_" #if ETS2_PLUGIN_LOGGING_ON == 1 @@ -189,6 +189,12 @@ typedef struct ets2TelemetryMap_s int gearDashboard; } tel_rev4; // added in sdk1.5 + struct + { + bool onJob; + bool jobFinished; + } tel_rev5; + } ets2TelemetryMap_t; #endif \ No newline at end of file diff --git a/ets2-telemetry/src/ets2-telemetry.cpp b/ets2-telemetry/src/ets2-telemetry.cpp index d7f8c1d..de12bbb 100644 --- a/ets2-telemetry/src/ets2-telemetry.cpp +++ b/ets2-telemetry/src/ets2-telemetry.cpp @@ -42,6 +42,8 @@ SharedMemory *telemMem; ets2TelemetryMap_t *telemPtr; const wchar_t* ets2MmfName = ETS2_PLUGIN_MMF_NAME; +static bool onJob; + /** * @brief Last timestamp we received. */ @@ -56,6 +58,7 @@ FILE *log_file = NULL; SCSAPI_VOID telemetry_frame_start(const scs_event_t UNUSED(event), const void *const event_info, const scs_context_t UNUSED(context)) { + static int clearJobTicker = 0; const struct scs_telemetry_frame_start_t *const info = static_cast(event_info); // The following processing of the timestamps is done so the output @@ -88,6 +91,46 @@ SCSAPI_VOID telemetry_frame_start(const scs_event_t UNUSED(event), const void *c // Do a non-convential periodic update of this field: telemPtr->tel_rev3.cruiseControl = (telemPtr->tel_rev3.cruiseControlSpeed > 0) ? true : false; + // Check if job could be finished ; if so empty the job field info + if (telemPtr->tel_rev5.onJob == true && telemPtr->tel_rev1.trailer_attached == false && telemPtr->tel_rev4.routeDistance <= 0.1f && telemPtr->tel_rev4.routeDistance >= 0.0f) + { + // if was carrying cargo and not anymore with navigation distance close to zero; + // then we assume the job has finished + // we allow some frames (see ticker) for the client to retrieve data + telemPtr->tel_rev5.onJob = false; + + telemPtr->tel_rev5.jobFinished = true; + clearJobTicker = 0; + } + else if (telemPtr->tel_rev5.jobFinished) + { + clearJobTicker ++; + + if (clearJobTicker > 10) + { + telemPtr->tel_rev2.jobIncome = 0; + telemPtr->tel_rev2.time_abs_delivery = 0; + telemPtr->tel_rev2.trailerMass = 0; + + memset(telemPtr->tel_rev2.trailerId, 0, 64); + memset(telemPtr->tel_rev2.trailerName, 0, 64); + + memset(telemPtr->tel_rev2.citySrc, 0, 64); // TODO: put 64-byte into global define + memset(telemPtr->tel_rev2.cityDst, 0, 64); + memset(telemPtr->tel_rev2.compSrc, 0, 64); + memset(telemPtr->tel_rev2.compDst, 0, 64); + + telemPtr->tel_rev5.jobFinished = false; + } + } + else + { + if (telemPtr->tel_rev2.jobIncome != 0 && telemPtr->tel_rev1.trailer_attached) + { + telemPtr->tel_rev5.onJob = true; + } + } + } }