From e5e46b1d73fef6c77be3f0a6839b9d7eb3ea0740 Mon Sep 17 00:00:00 2001 From: Josh Stewart Date: Thu, 23 Mar 2023 11:05:10 +1100 Subject: [PATCH] Add serial compatibility mode option --- reference/speeduino.ini | 25 +++++++++++++++++++++---- speeduino/comms.cpp | 9 +++++++++ speeduino/comms_legacy.cpp | 18 ++++++++++++------ speeduino/globals.h | 2 +- speeduino/storage.cpp | 3 ++- 5 files changed, 45 insertions(+), 12 deletions(-) diff --git a/reference/speeduino.ini b/reference/speeduino.ini index 6c8bd7fa..b408b1a3 100644 --- a/reference/speeduino.ini +++ b/reference/speeduino.ini @@ -25,6 +25,7 @@ ;settingGroup = boostUnits, "Boost table units" ;settingOption = DEFAULT, "kPa" ;settingOption = BOOSTPSI, "PSI" + settingGroup = pressure_units, "Pressure Display" settingOption = DEFAULT, "PSI" @@ -43,6 +44,10 @@ settingGroup = NEW_COMMS, "Use new comms protocol" + settingGroup = COMMS_COMPAT_GROUP, "Serial Mode" + settingOption = COMMS_COMPAT, "Compatibility Mode" + settingOption = DEFAULT, "Normal" + [PcVariables] ; valid types: boolean, double, int, list ; @@ -232,16 +237,25 @@ ; New commands pageIdentifier = "\$tsCanId\x01", "\$tsCanId\x02", "\$tsCanId\x03", "\$tsCanId\x04", "\$tsCanId\x05", "\$tsCanId\x06", "\$tsCanId\x07", "\$tsCanId\x08", "\$tsCanId\x09", "\$tsCanId\x0A", "\$tsCanId\x0B", "\$tsCanId\x0C", "\$tsCanId\x0D", "\$tsCanId\x0E", "\$tsCanId\x0F" - burnCommand = "b%2i", "b%2i", "b%2i", "b%2i", "b%2i", "b%2i", "b%2i", "b%2i", "b%2i", "b%2i", "b%2i", "b%2i", "b%2i", "b%2i", "b%2i" pageReadCommand = "p%2i%2o%2c", "p%2i%2o%2c", "p%2i%2o%2c", "p%2i%2o%2c", "p%2i%2o%2c", "p%2i%2o%2c", "p%2i%2o%2c", "p%2i%2o%2c", "p%2i%2o%2c", "p%2i%2o%2c", "p%2i%2o%2c", "p%2i%2o%2c", "p%2i%2o%2c", "p%2i%2o%2c", "p%2i%2o%2c" pageValueWrite = "M%2i%2o%2c%v", "M%2i%2o%2c%v", "M%2i%2o%2c%v", "M%2i%2o%2c%v", "M%2i%2o%2c%v", "M%2i%2o%2c%v", "M%2i%2o%2c%v", "M%2i%2o%2c%v", "M%2i%2o%2c%v", "M%2i%2o%2c%v", "M%2i%2o%2c%v", "M%2i%2o%2c%v", "M%2i%2o%2c%v", "M%2i%2o%2c%v", "M%2i%2o%2c%v" pageChunkWrite = "M%2i%2o%2c%v", "M%2i%2o%2c%v", "M%2i%2o%2c%v", "M%2i%2o%2c%v", "M%2i%2o%2c%v", "M%2i%2o%2c%v", "M%2i%2o%2c%v", "M%2i%2o%2c%v", "M%2i%2o%2c%v", "M%2i%2o%2c%v", "M%2i%2o%2c%v", "M%2i%2o%2c%v", "M%2i%2o%2c%v", "M%2i%2o%2c%v", "M%2i%2o%2c%v" crc32CheckCommand = "d%2i", "d%2i", "d%2i", "d%2i", "d%2i", "d%2i", "d%2i", "d%2i", "d%2i", "d%2i", "d%2i", "d%2i", "d%2i", "d%2i", "d%2i" +#if COMMS_COMPAT + ;Comms compat mode uses a different burn command in order to slow down the EEPROM burn rate + burnCommand = "B%2i", "B%2i", "B%2i", "B%2i", "B%2i", "B%2i", "B%2i", "B%2i", "B%2i", "B%2i", "B%2i", "B%2i", "B%2i", "B%2i", "B%2i" +#else + burnCommand = "b%2i", "b%2i", "b%2i", "b%2i", "b%2i", "b%2i", "b%2i", "b%2i", "b%2i", "b%2i", "b%2i", "b%2i", "b%2i", "b%2i", "b%2i" +#endif + #if mcu_stm32 blockingFactor = 121 #else blockingFactor = 251 ; Serial buffer is 257 bytes and there are 6 bytes of overhead (2 for the size and 4 for the CRC). Total payload is therefore 257-6=251. +#endif +#if COMMS_COMPAT + blockingFactor = 121 #endif tableBlockingFactor = 244 ; Serial buffer is 257 bytes. There are 7 bytes overhead for the M command + 2 bytes for the size + 4 bytes for the CRC. 257 - 7 - 2 - 4 = 244 bytes. delayAfterPortOpen=1000 @@ -372,8 +386,8 @@ page = 1 aeTaperMin = scalar, U08, 59, "RPM", 100, 0.0, 1000, 10000, 0 aeTaperMax = scalar, U08, 60, "RPM", 100, 0.0, 2000, 10000, 0 - iacCLminValue = scalar, U08, 61, "% / Steps", idleRes, 0.0, 0.0, idleResMax, 0 ; Minimum and maximum duty cycles when using closed loop idle - iacCLmaxValue = scalar, U08, 62, "% / Steps", idleRes, 0.0, 0.0, idleResMax, 0 + iacCLminValue = scalar, U08, 61, "% / Steps", idleRes, 0.0, 0.0, idleResMax, 0 ; Minimum and maximum duty cycles when using closed loop idle + iacCLmaxValue = scalar, U08, 62, "% / Steps", idleRes, 0.0, 0.0, idleResMax, 0 boostMinDuty = scalar, U08, 63, "%", 1.0, 0.0, 0.0, 100.0, 0 ; Minimum and maximum duty cycles for boost control baroMin = scalar, S08, 64, "kpa", 1.0, 0.0, -100, 127.0, 0 @@ -1034,7 +1048,7 @@ page = 9 boostByGearEnabled = bits, U08, 153, [4:5], "Off", "Multiplied %", "Constant limit", "INVALID" blankfield = bits, U08, 153, [6:6], "","" - unused10_153 = bits, U08, 153, [7:7], "", "" + unused9_153 = bits, U08, 153, [7:7], "Off", "On" iacMaxSteps = scalar, U08, 154, "Steps", 3, 0, 0, {iacStepHome-3}, 0 idleAdvStartDelay = scalar, U08, 155, "S", 0.1, 0.0, 0.0, 25.5, 1 @@ -5585,6 +5599,9 @@ cmdVSSratio6 = "E\x99\x06" #else tableBlockingFactor = 256 #endif + #if COMMS_COMPAT + tableBlockingFactor = 64 + #endif #endif referenceTable = std_ms2gentherm, "Calibrate Thermistor Tables." topicHelp = "https://wiki.speeduino.com/en/configuration/Sensor_Calibration" diff --git a/speeduino/comms.cpp b/speeduino/comms.cpp index 0b8b5374..cde3a322 100644 --- a/speeduino/comms.cpp +++ b/speeduino/comms.cpp @@ -564,6 +564,15 @@ void processSerialCommand(void) sendReturnCodeMsg(SERIAL_RC_BURN_OK); break; + case 'B': // Same as above, but for the comms compat mode. Slows down the burn rate and increases the defer time + BIT_SET(currentStatus.status4, BIT_STATUS4_COMMS_COMPAT); //Force the compat mode + deferEEPROMWritesUntil += (EEPROM_DEFER_DELAY/4); //Add 25% more to the EEPROM defer time + if( (micros() > deferEEPROMWritesUntil)) { writeConfig(serialPayload[2]); } //Read the table number and perform burn. Note that byte 1 in the array is unused + else { BIT_SET(currentStatus.status4, BIT_STATUS4_BURNPENDING); } + + sendReturnCodeMsg(SERIAL_RC_BURN_OK); + break; + case 'C': // test communications. This is used by Tunerstudio to see whether there is an ECU on a given serial port (void)memcpy_P(serialPayload, testCommsResponse, sizeof(testCommsResponse) ); sendSerialPayloadNonBlocking(sizeof(testCommsResponse)); diff --git a/speeduino/comms_legacy.cpp b/speeduino/comms_legacy.cpp index 90a33925..bc879f13 100644 --- a/speeduino/comms_legacy.cpp +++ b/speeduino/comms_legacy.cpp @@ -69,12 +69,6 @@ void legacySerialCommand(void) sendValues(0, LOG_ENTRY_SIZE, 0x31, 0); //send values to serial0 break; - case 'B': // Burn current values to eeprom - serialStatusFlag = SERIAL_COMMAND_INPROGRESS_LEGACY; - writeAllConfig(); - serialStatusFlag = SERIAL_INACTIVE; - break; - case 'b': // New EEPROM burn command to only burn a single page at a time serialStatusFlag = SERIAL_COMMAND_INPROGRESS_LEGACY; @@ -86,6 +80,18 @@ void legacySerialCommand(void) } break; + case 'B': // AS above but for the serial compatibility mode. + serialStatusFlag = SERIAL_COMMAND_INPROGRESS_LEGACY; + BIT_SET(currentStatus.status4, BIT_STATUS4_COMMS_COMPAT); //Force the compat mode + + if (Serial.available() >= 2) + { + Serial.read(); //Ignore the first table value, it's always 0 + writeConfig(Serial.read()); + serialStatusFlag = SERIAL_INACTIVE; + } + break; + case 'C': // test communications. This is used by Tunerstudio to see whether there is an ECU on a given serial port testComm(); break; diff --git a/speeduino/globals.h b/speeduino/globals.h index 424066c0..12bae9ac 100644 --- a/speeduino/globals.h +++ b/speeduino/globals.h @@ -227,7 +227,7 @@ #define BIT_STATUS4_FAN 3 //Fan Status #define BIT_STATUS4_BURNPENDING 4 #define BIT_STATUS4_STAGING_ACTIVE 5 -#define BIT_STATUS4_UNUSED7 6 +#define BIT_STATUS4_COMMS_COMPAT 6 #define BIT_STATUS4_UNUSED8 7 #define BIT_AIRCON_REQUEST 0 //Indicates whether the A/C button is pressed diff --git a/speeduino/storage.cpp b/speeduino/storage.cpp index 923a1085..7034a86a 100644 --- a/speeduino/storage.cpp +++ b/speeduino/storage.cpp @@ -160,7 +160,8 @@ void writeConfig(uint8_t pageNum) #elif defined(CORE_STM32) || defined(CORE_TEENSY) uint8_t EEPROM_MAX_WRITE_BLOCK = 64; #else - uint8_t EEPROM_MAX_WRITE_BLOCK = 20; + uint8_t EEPROM_MAX_WRITE_BLOCK = 18; + if(BIT_CHECK(currentStatus.status4, BIT_STATUS4_COMMS_COMPAT)) { EEPROM_MAX_WRITE_BLOCK = 8; } //If comms compatibility mode is on, slow the burn rate down even further #ifdef CORE_AVR //In order to prevent missed pulses during EEPROM writes on AVR, scale the