Hi all,
I have the following setup:
E36 Cluster;
Arduino UNO;
Relay module 5v with 8 relays for the cluster symbol lights;
All working perfectly in combination with ETS2 (including the cluster turnindicators).
Issue:
With Assetto Corsa Competizione i can't get the turnidicators to work properly.
When activation the turnindicator (left or right) the RAW result shows a constant '1' instead of a blinking state like in ETS2.
With the blink formula i managed to get a blinking RAW result state with the formula:
blink('right',750,[DataCorePlugin.GameData.TurnRight])
RAW result is showing a False or True state instead of a '0' or '1'.
Unfortunately the relays don't react with this method.
I tried to change the shcustomprotocol with no luck:
if (left == true && right == false) { digitalWrite(leftPin,LOW); digitalWrite(rightPin,HIGH); } else if (left == false && right == true) { digitalWrite(leftPin,HIGH); digitalWrite(rightPin,LOW); } else if (left == true && right == true) { digitalWrite(leftPin,LOW); digitalWrite(rightPin,LOW);
Working ETS2/ACC SHCustomProtocol
#ifndef __SHCUSTOMPROTOCOL_H__ #define __SHCUSTOMPROTOCOL_H__ #include <Arduino.h> class SHCustomProtocol { private: public: /* CUSTOM PROTOCOL CLASS SEE https://github.com/zegreatclan/SimHub/wiki/Custom-Arduino-hardware-support GENERAL RULES : - ALWAYS BACKUP THIS FILE, reinstalling/updating SimHub would overwrite it with the default version. - Read data AS FAST AS POSSIBLE in the read function - NEVER block the arduino (using delay for instance) - Make sure the data read in "read()" function READS ALL THE DATA from the serial port matching the custom protocol definition - Idle function is called hundreds of times per second, never use it for slow code, arduino performances would fall - If you use library suspending interrupts make sure to use it only in the "read" function when ALL data has been read from the serial port. It is the only interrupt safe place COMMON FUNCTIONS : - FlowSerialReadStringUntil('\n') Read the incoming data up to the end (\n) won't be included - FlowSerialReadStringUntil(';') Read the incoming data up to the separator (;) separator won't be included - FlowSerialDebugPrintLn(string) Send a debug message to simhub which will display in the log panel and log file (only use it when debugging, it would slow down arduino in run conditions) */ int BeamLow; int BeamHigh; int park; int left; int right; int engine; int OilPressure; int RainLights; int lowbeam = 3; int HIGH_BEAM = 7; int parkPin = 8; int leftPin = 9; int rightPin = 10; int checkenginePin = 11; int OilPressurePin = 12; int RainLightsPin = 13; // Called when starting the arduino (setup method in main sketch) void setup() { pinMode(lowbeam,OUTPUT); pinMode(HIGH_BEAM,OUTPUT); pinMode(parkPin,OUTPUT); pinMode(leftPin,OUTPUT); pinMode(rightPin,OUTPUT); pinMode(checkenginePin,OUTPUT); pinMode(OilPressurePin,OUTPUT); pinMode(RainLightsPin,OUTPUT); digitalWrite(lowbeam,HIGH); digitalWrite(HIGH_BEAM,HIGH); digitalWrite(parkPin,HIGH); digitalWrite(leftPin,HIGH); digitalWrite(rightPin,HIGH); digitalWrite(checkenginePin,HIGH); digitalWrite(OilPressurePin,HIGH); digitalWrite(RainLightsPin,HIGH); } // Called when new data is coming from computer void read() { int BeamLow = FlowSerialReadStringUntil(';').toInt(); int BeamHigh = FlowSerialReadStringUntil(';').toInt(); int park = FlowSerialReadStringUntil(';').toInt(); int left = FlowSerialReadStringUntil(';').toInt(); int right = FlowSerialReadStringUntil(';').toInt(); int engine = FlowSerialReadStringUntil(';').toInt(); int OilPressure = FlowSerialReadStringUntil(';').toInt(); int RainLights = FlowSerialReadStringUntil(';').toInt(); /*if(lights == 0) { digitalWrite(lowbeam, LOW); } else { digitalWrite(lowbeam, HIGH); } */ if (BeamHigh == 1) { digitalWrite(HIGH_BEAM, LOW); } else { digitalWrite(HIGH_BEAM, HIGH); } if (BeamLow == 0) { digitalWrite(lowbeam, HIGH); } else { digitalWrite(lowbeam, LOW); } // parkbrake if(park == 1) { digitalWrite(parkPin, LOW); } else { digitalWrite(parkPin, HIGH); } // OilPressure if(OilPressure == 1) { digitalWrite(OilPressurePin, LOW); } else { digitalWrite(OilPressurePin, HIGH); } // RainLights if(RainLights == 1) { digitalWrite(RainLightsPin, LOW); } else { digitalWrite(RainLightsPin, HIGH); } // enginefailure if(engine == 1) { digitalWrite(checkenginePin, LOW); } else { digitalWrite(checkenginePin, HIGH); } if (left == 1 && right == 0) { digitalWrite(leftPin,LOW); digitalWrite(rightPin,HIGH); } else if (left == 0 && right == 1) { digitalWrite(leftPin,HIGH); digitalWrite(rightPin,LOW); } else if (left == 1 && right == 1) { digitalWrite(leftPin,LOW); digitalWrite(rightPin,LOW); } else { digitalWrite(leftPin,HIGH); digitalWrite(rightPin,HIGH); } } // Called once per arduino loop, timing can't be predicted, // but it's called between each command sent to the arduino void loop() { } // Called once between each byte read on arduino, // THIS IS A CRITICAL PATH : // AVOID ANY TIME CONSUMING ROUTINES !!! // PREFER READ OR LOOP METHOS AS MUCH AS POSSIBLE // AVOID ANY INTERRUPTS DISABLE (serial data would be lost!!!) void idle() { } }; #endif
I created a workarround for the turnindicators in ACC. A better solution would be the realtime data from the game)
#ifndef __SHCUSTOMPROTOCOL_H__ #define __SHCUSTOMPROTOCOL_H__ #include <Arduino.h> class SHCustomProtocol { private: public: /* CUSTOM PROTOCOL CLASS SEE https://github.com/zegreatclan/SimHub/wiki/Custom-Arduino-hardware-support GENERAL RULES : - ALWAYS BACKUP THIS FILE, reinstalling/updating SimHub would overwrite it with the default version. - Read data AS FAST AS POSSIBLE in the read function - NEVER block the arduino (using delay for instance) - Make sure the data read in "read()" function READS ALL THE DATA from the serial port matching the custom protocol definition - Idle function is called hundreds of times per second, never use it for slow code, arduino performances would fall - If you use library suspending interrupts make sure to use it only in the "read" function when ALL data has been read from the serial port. It is the only interrupt safe place COMMON FUNCTIONS : - FlowSerialReadStringUntil('\n') Read the incoming data up to the end (\n) won't be included - FlowSerialReadStringUntil(';') Read the incoming data up to the separator (;) separator won't be included - FlowSerialDebugPrintLn(string) Send a debug message to simhub which will display in the log panel and log file (only use it when debugging, it would slow down arduino in run conditions) */ int BeamLow; int BeamHigh; int park; int engine; int OilPressure; int RainLights; int lowbeam = 3; int HIGH_BEAM = 7; int parkPin = 8; int leftPin = 9; int rightPin = 10; int checkenginePin = 11; int OilPressurePin = 12; int RainLightsPin = 13; String left; String right; // Called when starting the arduino (setup method in main sketch) void setup() { pinMode(lowbeam,OUTPUT); pinMode(HIGH_BEAM,OUTPUT); pinMode(parkPin,OUTPUT); pinMode(leftPin,OUTPUT); pinMode(rightPin,OUTPUT); pinMode(checkenginePin,OUTPUT); pinMode(OilPressurePin,OUTPUT); pinMode(RainLightsPin,OUTPUT); digitalWrite(lowbeam,HIGH); digitalWrite(HIGH_BEAM,HIGH); digitalWrite(parkPin,HIGH); digitalWrite(leftPin,HIGH); digitalWrite(rightPin,HIGH); digitalWrite(checkenginePin,HIGH); digitalWrite(OilPressurePin,HIGH); digitalWrite(RainLightsPin,HIGH); } // Called when new data is coming from computer void read() { int BeamLow = FlowSerialReadStringUntil(';').toInt(); int BeamHigh = FlowSerialReadStringUntil(';').toInt(); int park = FlowSerialReadStringUntil(';').toInt(); left = FlowSerialReadStringUntil(';'); right = FlowSerialReadStringUntil(';'); int engine = FlowSerialReadStringUntil(';').toInt(); int OilPressure = FlowSerialReadStringUntil(';').toInt(); int RainLights = FlowSerialReadStringUntil(';').toInt(); /*if(lights == 0) { digitalWrite(lowbeam, LOW); } else { digitalWrite(lowbeam, HIGH); } */ if (BeamHigh == 1) { digitalWrite(HIGH_BEAM, LOW); } else { digitalWrite(HIGH_BEAM, HIGH); } if (BeamLow == 0) { digitalWrite(lowbeam, HIGH); } else { digitalWrite(lowbeam, LOW); } // parkbrake if(park == 1) { digitalWrite(parkPin, LOW); } else { digitalWrite(parkPin, HIGH); } // OilPressure if(OilPressure == 1) { digitalWrite(OilPressurePin, LOW); } else { digitalWrite(OilPressurePin, HIGH); } // RainLights if(RainLights == 1) { digitalWrite(RainLightsPin, LOW); } else { digitalWrite(RainLightsPin, HIGH); } // enginefailure if(engine == 1) { digitalWrite(checkenginePin, LOW); } else { digitalWrite(checkenginePin, HIGH); } // Turnindicators if (left.equalsIgnoreCase("True") && right.equalsIgnoreCase("False")) { digitalWrite(leftPin,LOW); digitalWrite(rightPin,HIGH); } else if (left.equalsIgnoreCase("False") && right.equalsIgnoreCase("True")) { digitalWrite(leftPin,HIGH); digitalWrite(rightPin,LOW); } else if (left.equalsIgnoreCase("True") && right.equalsIgnoreCase("True")) { digitalWrite(leftPin,LOW); digitalWrite(rightPin,LOW); } else { digitalWrite(leftPin,HIGH); digitalWrite(rightPin,HIGH); } } // Called once per arduino loop, timing can't be predicted, // but it's called between each command sent to the arduino void loop() { } // Called once between each byte read on arduino, // THIS IS A CRITICAL PATH : // AVOID ANY TIME CONSUMING ROUTINES !!! // PREFER READ OR LOOP METHOS AS MUCH AS POSSIBLE // AVOID ANY INTERRUPTS DISABLE (serial data would be lost!!!) void idle() { } }; #endif
if([DataCorePlugin.GameRawData.Graphics.LightsStage], '1', '0') + ';' + if([DataCorePlugin.GameRawData.Graphics.FlashingLights], '1', '0') + ';' + if([DataCorePlugin.GameData.Handbrake], '1', '0') + ';' + blink('links',500,[DataCorePlugin.GameData.TurnIndicatorLeft]) + ';' + blink('rechts',500,[DataCorePlugin.GameData.TurnIndicatorRight]) + ';' + if([DataCorePlugin.GameData.CarDamage1],'1', '0') + ';' + if([DataCorePlugin.GameData.CarDamage2], '1', '0') + ';' + if([DataCorePlugin.GameRawData.Graphics.RainLights], '1', '0')
I also had to change the NCALC formula for ETS2
if([DataCorePlugin.GameRawData.TruckValues.CurrentValues.LightsValues.BeamLow], '1', '0') + ';' + if([DataCorePlugin.GameRawData.TruckValues.CurrentValues.LightsValues.BeamHigh], '1', '0') + ';' + if([DataCorePlugin.GameRawData.TruckValues.CurrentValues.MotorValues.BrakeValues.ParkingBrake], '1', '0') + ';' + if([DataCorePlugin.GameRawData.TruckValues.CurrentValues.LightsValues.BlinkerLeftOn], 'True', 'False') + ';' + if([DataCorePlugin.GameRawData.TruckValues.CurrentValues.LightsValues.BlinkerRightOn], 'True', 'False') + ';' + if([DataCorePlugin.GameRawData.TruckValues.CurrentValues.DamageValues.Engine] > 0.7, '1', '0') + ';' + if([DataCorePlugin.GameRawData.TruckValues.CurrentValues.DashboardValues.WarningValues.OilPressure], '1', '0')
Greetings,
Henk