From 059893190bb890aa2f1afb168e7a44c209286c25 Mon Sep 17 00:00:00 2001 From: tcfshcrw <48719709+tcfshcrw@users.noreply.github.com> Date: Sun, 31 Dec 2023 17:17:07 +0800 Subject: [PATCH] Normalized RPM value 1. Normalized RPM value 2. Add update flag to reduce the frenquency of update --- SimHubPlugin/DataPluginDemo.cs | 129 +++++++++++++--------------- SimHubPlugin/bin/DiyActivePedal.dll | Bin 70656 -> 70656 bytes 2 files changed, 62 insertions(+), 67 deletions(-) diff --git a/SimHubPlugin/DataPluginDemo.cs b/SimHubPlugin/DataPluginDemo.cs index c51440cd..fa38f85d 100644 --- a/SimHubPlugin/DataPluginDemo.cs +++ b/SimHubPlugin/DataPluginDemo.cs @@ -258,7 +258,8 @@ unsafe public void DataUpdate(PluginManager pluginManager, ref GameData data) bool sendAbsSignal_local_b = false; bool sendTcSignal_local_b = false; - Byte RPM_value =0; + double RPM_value =0; + double RPM_MAX = 0; // Send ABS signal when triggered by the game @@ -275,8 +276,15 @@ unsafe public void DataUpdate(PluginManager pluginManager, ref GameData data) { sendTcSignal_local_b = true; } - - RPM_value = (Byte)(data.NewData.Rpms / 1000); + if (data.NewData.CarSettings_MaxRPM == 0) + { + RPM_MAX = 10000; + } + else + { + RPM_MAX = data.NewData.CarSettings_MaxRPM; + } + RPM_value = (data.NewData.Rpms / RPM_MAX*100); game_running_index = 1; } @@ -309,6 +317,7 @@ unsafe public void DataUpdate(PluginManager pluginManager, ref GameData data) + bool update_flag = false; if (data.GameRunning) { @@ -320,68 +329,27 @@ unsafe public void DataUpdate(PluginManager pluginManager, ref GameData data) tmp.payloadHeader_.version = (byte)Constants.pedalConfigPayload_version; tmp.payloadHeader_.payloadType = (byte)Constants.pedalActionPayload_type; tmp.payloadPedalAction_.triggerAbs_u8 = 0; - tmp.payloadPedalAction_.RPM_u8 = rpm_last_value; - if (RPM_value != rpm_last_value) + tmp.payloadPedalAction_.RPM_u8 = (Byte)rpm_last_value; + if ((RPM_value - rpm_last_value>10) || (RPM_value-rpm_last_value<-10)) { - tmp.payloadPedalAction_.RPM_u8 = RPM_value; - DAP_action_st* v = &tmp; - byte* p = (byte*)v; - tmp.payloadFooter_.checkSum = checksumCalc(p, sizeof(payloadHeader) + sizeof(payloadPedalAction)); - - - int length = sizeof(DAP_action_st); - byte[] newBuffer = new byte[length]; - newBuffer = getBytes_Action(tmp); - - - // clear inbuffer - _serialPort[1].DiscardInBuffer(); - - // send query command - _serialPort[1].Write(newBuffer, 0, newBuffer.Length); + tmp.payloadPedalAction_.RPM_u8 = (Byte)RPM_value; + update_flag = true; + rpm_last_value = (Byte)RPM_value; + } - rpm_last_value = RPM_value; - } - if (sendAbsSignal_local_b) - { - //_serialPort[1].Write("2"); - - // compute checksum - tmp.payloadPedalAction_.triggerAbs_u8 = 1; - DAP_action_st* v = &tmp; - byte* p = (byte*)v; - tmp.payloadFooter_.checkSum = checksumCalc(p, sizeof(payloadHeader) + sizeof(payloadPedalAction)); - - - int length = sizeof(DAP_action_st); - byte[] newBuffer = new byte[length]; - newBuffer = getBytes_Action(tmp); - - - // clear inbuffer - _serialPort[1].DiscardInBuffer(); - - // send query command - _serialPort[1].Write(newBuffer, 0, newBuffer.Length); - - } + if (sendAbsSignal_local_b) + { + //_serialPort[1].Write("2"); + // compute checksum + tmp.payloadPedalAction_.triggerAbs_u8 = 1; + update_flag = true; - } - - // Send TC trigger signal via serial - if (_serialPort[2].IsOpen) - { - DAP_action_st tmp; + } - tmp.payloadHeader_.version = (byte)Constants.pedalConfigPayload_version; - tmp.payloadHeader_.payloadType = (byte)Constants.pedalActionPayload_type; - tmp.payloadPedalAction_.triggerAbs_u8 = 0; - tmp.payloadPedalAction_.RPM_u8 = rpm_last_value; - if (RPM_value != rpm_last_value) + if (update_flag) { - tmp.payloadPedalAction_.RPM_u8 = RPM_value; DAP_action_st* v = &tmp; byte* p = (byte*)v; tmp.payloadFooter_.checkSum = checksumCalc(p, sizeof(payloadHeader) + sizeof(payloadPedalAction)); @@ -393,18 +361,45 @@ unsafe public void DataUpdate(PluginManager pluginManager, ref GameData data) // clear inbuffer - _serialPort[2].DiscardInBuffer(); + _serialPort[1].DiscardInBuffer(); // send query command - _serialPort[2].Write(newBuffer, 0, newBuffer.Length); - rpm_last_value = RPM_value; + _serialPort[1].Write(newBuffer, 0, newBuffer.Length); + } - if (sendTcSignal_local_b) - { - // compute checksum - + + + + + } + + // Send TC trigger signal via serial + if (_serialPort[2].IsOpen) + { + DAP_action_st tmp; + + tmp.payloadHeader_.version = (byte)Constants.pedalConfigPayload_version; + tmp.payloadHeader_.payloadType = (byte)Constants.pedalActionPayload_type; + tmp.payloadPedalAction_.triggerAbs_u8 = 0; + tmp.payloadPedalAction_.RPM_u8 = rpm_last_value; + + if ((RPM_value - rpm_last_value > 10) || (RPM_value - rpm_last_value < -10)) + { + tmp.payloadPedalAction_.RPM_u8 = (Byte)RPM_value; + update_flag = true; + rpm_last_value = (Byte)RPM_value; + } + if (sendTcSignal_local_b) + { + // compute checksum + tmp.payloadPedalAction_.triggerAbs_u8 = 1; + update_flag = true; + + } + if (update_flag) + { DAP_action_st* v = &tmp; byte* p = (byte*)v; tmp.payloadFooter_.checkSum = checksumCalc(p, sizeof(payloadHeader) + sizeof(payloadPedalAction)); @@ -420,9 +415,9 @@ unsafe public void DataUpdate(PluginManager pluginManager, ref GameData data) // send query command _serialPort[2].Write(newBuffer, 0, newBuffer.Length); - rpm_last_value = RPM_value; - + rpm_last_value = (Byte)RPM_value; } + } diff --git a/SimHubPlugin/bin/DiyActivePedal.dll b/SimHubPlugin/bin/DiyActivePedal.dll index a81ecb8522a77687ac37371ebfeec43f8338dde7..182efe641475bbf2255507122c56521789c75fdd 100644 GIT binary patch delta 20888 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 R@_R#{cDbcbq|Q3){{n?GmEQmW delta 20716 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