From ab3d63ab1851fab55452f7000211b0afaef124bd Mon Sep 17 00:00:00 2001 From: Jonny Date: Thu, 7 Aug 2025 21:24:40 +0100 Subject: [PATCH] Add static constexpr to lots of static battery CAN_frames to save RAM --- Software/src/battery/BMW-I3-BATTERY.h | 187 +++++++------- Software/src/battery/BMW-IX-BATTERY.h | 235 +++++++++--------- Software/src/battery/CanBattery.h | 2 +- Software/src/battery/ECMP-BATTERY.h | 220 +++++++++-------- Software/src/battery/KIA-E-GMP-BATTERY.cpp | 146 +++++------ Software/src/battery/MEB-BATTERY.h | 132 +++++----- Software/src/battery/TESLA-BATTERY.h | 261 ++++++++++---------- Software/src/communication/can/comm_can.cpp | 2 +- Software/src/communication/can/comm_can.h | 2 +- test/emul/can.cpp | 2 +- 10 files changed, 618 insertions(+), 571 deletions(-) diff --git a/Software/src/battery/BMW-I3-BATTERY.h b/Software/src/battery/BMW-I3-BATTERY.h index 455c10ac..436c2604 100644 --- a/Software/src/battery/BMW-I3-BATTERY.h +++ b/Software/src/battery/BMW-I3-BATTERY.h @@ -137,11 +137,11 @@ class BmwI3Battery : public CanBattery { .DLC = 8, .ID = 0x13E, .data = {0xFF, 0x31, 0xFA, 0xFA, 0xFA, 0xFA, 0x0C, 0x00}}; - CAN_frame BMW_192 = {.FD = false, - .ext_ID = false, - .DLC = 8, - .ID = 0x192, - .data = {0xFF, 0xFF, 0xA3, 0x8F, 0x93, 0xFF, 0xFF, 0xFF}}; + static constexpr CAN_frame BMW_192 = {.FD = false, + .ext_ID = false, + .DLC = 8, + .ID = 0x192, + .data = {0xFF, 0xFF, 0xA3, 0x8F, 0x93, 0xFF, 0xFF, 0xFF}}; CAN_frame BMW_19B = {.FD = false, .ext_ID = false, .DLC = 8, @@ -152,12 +152,12 @@ class BmwI3Battery : public CanBattery { .DLC = 8, .ID = 0x1D0, .data = {0x4D, 0xF0, 0xAE, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF}}; - CAN_frame BMW_2CA = {.FD = false, .ext_ID = false, .DLC = 2, .ID = 0x2CA, .data = {0x57, 0x57}}; - CAN_frame BMW_2E2 = {.FD = false, - .ext_ID = false, - .DLC = 8, - .ID = 0x2E2, - .data = {0x4F, 0xDB, 0x7F, 0xB9, 0x07, 0x51, 0xff, 0x00}}; + static constexpr CAN_frame BMW_2CA = {.FD = false, .ext_ID = false, .DLC = 2, .ID = 0x2CA, .data = {0x57, 0x57}}; + static constexpr CAN_frame BMW_2E2 = {.FD = false, + .ext_ID = false, + .DLC = 8, + .ID = 0x2E2, + .data = {0x4F, 0xDB, 0x7F, 0xB9, 0x07, 0x51, 0xff, 0x00}}; CAN_frame BMW_30B = {.FD = false, .ext_ID = false, .DLC = 8, @@ -168,21 +168,21 @@ class BmwI3Battery : public CanBattery { .DLC = 6, .ID = 0x328, .data = {0xB0, 0xE4, 0x87, 0x0E, 0x30, 0x22}}; - CAN_frame BMW_37B = {.FD = false, - .ext_ID = false, - .DLC = 6, - .ID = 0x37B, - .data = {0x40, 0x00, 0x00, 0xFF, 0xFF, 0x00}}; - CAN_frame BMW_380 = {.FD = false, - .ext_ID = false, - .DLC = 7, - .ID = 0x380, - .data = {0x56, 0x5A, 0x37, 0x39, 0x34, 0x34, 0x34}}; - CAN_frame BMW_3A0 = {.FD = false, - .ext_ID = false, - .DLC = 8, - .ID = 0x3A0, - .data = {0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC}}; + static constexpr CAN_frame BMW_37B = {.FD = false, + .ext_ID = false, + .DLC = 6, + .ID = 0x37B, + .data = {0x40, 0x00, 0x00, 0xFF, 0xFF, 0x00}}; + static constexpr CAN_frame BMW_380 = {.FD = false, + .ext_ID = false, + .DLC = 7, + .ID = 0x380, + .data = {0x56, 0x5A, 0x37, 0x39, 0x34, 0x34, 0x34}}; + static constexpr CAN_frame BMW_3A0 = {.FD = false, + .ext_ID = false, + .DLC = 8, + .ID = 0x3A0, + .data = {0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC}}; CAN_frame BMW_3A7 = {.FD = false, .ext_ID = false, .DLC = 7, @@ -193,17 +193,17 @@ class BmwI3Battery : public CanBattery { .DLC = 8, .ID = 0x3C5, .data = {0x30, 0x05, 0x47, 0x70, 0x2c, 0xce, 0xc3, 0x34}}; - CAN_frame BMW_3CA = {.FD = false, - .ext_ID = false, - .DLC = 8, - .ID = 0x3CA, - .data = {0x87, 0x80, 0x30, 0x0C, 0x0C, 0x81, 0xFF, 0xFF}}; - CAN_frame BMW_3D0 = {.FD = false, .ext_ID = false, .DLC = 2, .ID = 0x3D0, .data = {0xFD, 0xFF}}; - CAN_frame BMW_3E4 = {.FD = false, - .ext_ID = false, - .DLC = 6, - .ID = 0x3E4, - .data = {0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF}}; + static constexpr CAN_frame BMW_3CA = {.FD = false, + .ext_ID = false, + .DLC = 8, + .ID = 0x3CA, + .data = {0x87, 0x80, 0x30, 0x0C, 0x0C, 0x81, 0xFF, 0xFF}}; + static constexpr CAN_frame BMW_3D0 = {.FD = false, .ext_ID = false, .DLC = 2, .ID = 0x3D0, .data = {0xFD, 0xFF}}; + static constexpr CAN_frame BMW_3E4 = {.FD = false, + .ext_ID = false, + .DLC = 6, + .ID = 0x3E4, + .data = {0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF}}; CAN_frame BMW_3E5 = {.FD = false, .ext_ID = false, .DLC = 3, .ID = 0x3E5, .data = {0xFC, 0xFF, 0xFF}}; CAN_frame BMW_3E8 = {.FD = false, .ext_ID = false, .DLC = 2, .ID = 0x3E8, .data = {0xF0, 0xFF}}; //1000ms OBD reset CAN_frame BMW_3EC = {.FD = false, @@ -216,66 +216,83 @@ class BmwI3Battery : public CanBattery { .DLC = 8, .ID = 0x3F9, .data = {0xA7, 0x2A, 0x00, 0xE2, 0xA6, 0x30, 0xC3, 0xFF}}; - CAN_frame BMW_3FB = {.FD = false, - .ext_ID = false, - .DLC = 6, - .ID = 0x3FB, - .data = {0xFF, 0xFF, 0xFF, 0xFF, 0x5F, 0x00}}; + static constexpr CAN_frame BMW_3FB = {.FD = false, + .ext_ID = false, + .DLC = 6, + .ID = 0x3FB, + .data = {0xFF, 0xFF, 0xFF, 0xFF, 0x5F, 0x00}}; CAN_frame BMW_3FC = {.FD = false, .ext_ID = false, .DLC = 3, .ID = 0x3FC, .data = {0xC0, 0xF9, 0x0F}}; - CAN_frame BMW_418 = {.FD = false, - .ext_ID = false, - .DLC = 8, - .ID = 0x418, - .data = {0xFF, 0x7C, 0xFF, 0x00, 0xC0, 0x3F, 0xFF, 0xFF}}; - CAN_frame BMW_41D = {.FD = false, .ext_ID = false, .DLC = 4, .ID = 0x41D, .data = {0xFF, 0xF7, 0x7F, 0xFF}}; + static constexpr CAN_frame BMW_418 = {.FD = false, + .ext_ID = false, + .DLC = 8, + .ID = 0x418, + .data = {0xFF, 0x7C, 0xFF, 0x00, 0xC0, 0x3F, 0xFF, 0xFF}}; + static constexpr CAN_frame BMW_41D = {.FD = false, + .ext_ID = false, + .DLC = 4, + .ID = 0x41D, + .data = {0xFF, 0xF7, 0x7F, 0xFF}}; CAN_frame BMW_433 = {.FD = false, .ext_ID = false, .DLC = 4, .ID = 0x433, .data = {0xFF, 0x00, 0x0F, 0xFF}}; // HV specification - CAN_frame BMW_512 = {.FD = false, - .ext_ID = false, - .DLC = 8, - .ID = 0x512, - .data = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12}}; // 0x512 Network management - CAN_frame BMW_592_0 = {.FD = false, - .ext_ID = false, - .DLC = 8, - .ID = 0x592, - .data = {0x86, 0x10, 0x07, 0x21, 0x6e, 0x35, 0x5e, 0x86}}; - CAN_frame BMW_592_1 = {.FD = false, - .ext_ID = false, - .DLC = 8, - .ID = 0x592, - .data = {0x86, 0x21, 0xb4, 0xdd, 0x00, 0x00, 0x00, 0x00}}; - CAN_frame BMW_5F8 = {.FD = false, - .ext_ID = false, - .DLC = 8, - .ID = 0x5F8, - .data = {0x64, 0x01, 0x00, 0x0B, 0x92, 0x03, 0x00, 0x05}}; - CAN_frame BMW_6F1_CELL = {.FD = false, - .ext_ID = false, - .DLC = 5, - .ID = 0x6F1, - .data = {0x07, 0x03, 0x22, 0xDD, 0xBF}}; - CAN_frame BMW_6F1_SOH = {.FD = false, .ext_ID = false, .DLC = 5, .ID = 0x6F1, .data = {0x07, 0x03, 0x22, 0x63, 0x35}}; - CAN_frame BMW_6F1_SOC = {.FD = false, .ext_ID = false, .DLC = 5, .ID = 0x6F1, .data = {0x07, 0x03, 0x22, 0xDD, 0xBC}}; - CAN_frame BMW_6F1_CELL_VOLTAGE_AVG = {.FD = false, + static constexpr CAN_frame BMW_512 = { + .FD = false, + .ext_ID = false, + .DLC = 8, + .ID = 0x512, + .data = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12}}; // 0x512 Network management + static constexpr CAN_frame BMW_592_0 = {.FD = false, + .ext_ID = false, + .DLC = 8, + .ID = 0x592, + .data = {0x86, 0x10, 0x07, 0x21, 0x6e, 0x35, 0x5e, 0x86}}; + static constexpr CAN_frame BMW_592_1 = {.FD = false, + .ext_ID = false, + .DLC = 8, + .ID = 0x592, + .data = {0x86, 0x21, 0xb4, 0xdd, 0x00, 0x00, 0x00, 0x00}}; + static constexpr CAN_frame BMW_5F8 = {.FD = false, .ext_ID = false, - .DLC = 5, - .ID = 0x6F1, - .data = {0x07, 0x03, 0x22, 0xDF, 0xA0}}; - CAN_frame BMW_6F1_CONTINUE = {.FD = false, .ext_ID = false, .DLC = 4, .ID = 0x6F1, .data = {0x07, 0x30, 0x00, 0x02}}; + .DLC = 8, + .ID = 0x5F8, + .data = {0x64, 0x01, 0x00, 0x0B, 0x92, 0x03, 0x00, 0x05}}; + static constexpr CAN_frame BMW_6F1_CELL = {.FD = false, + .ext_ID = false, + .DLC = 5, + .ID = 0x6F1, + .data = {0x07, 0x03, 0x22, 0xDD, 0xBF}}; + static constexpr CAN_frame BMW_6F1_SOH = {.FD = false, + .ext_ID = false, + .DLC = 5, + .ID = 0x6F1, + .data = {0x07, 0x03, 0x22, 0x63, 0x35}}; + static constexpr CAN_frame BMW_6F1_SOC = {.FD = false, + .ext_ID = false, + .DLC = 5, + .ID = 0x6F1, + .data = {0x07, 0x03, 0x22, 0xDD, 0xBC}}; + static constexpr CAN_frame BMW_6F1_CELL_VOLTAGE_AVG = {.FD = false, + .ext_ID = false, + .DLC = 5, + .ID = 0x6F1, + .data = {0x07, 0x03, 0x22, 0xDF, 0xA0}}; + static constexpr CAN_frame BMW_6F1_CONTINUE = {.FD = false, + .ext_ID = false, + .DLC = 4, + .ID = 0x6F1, + .data = {0x07, 0x30, 0x00, 0x02}}; CAN_frame BMW_6F4_CELL_VOLTAGE_CELLNO = {.FD = false, .ext_ID = false, .DLC = 7, .ID = 0x6F4, .data = {0x07, 0x05, 0x31, 0x01, 0xAD, 0x6E, 0x01}}; - CAN_frame BMW_6F4_CELL_CONTINUE = {.FD = false, - .ext_ID = false, - .DLC = 6, - .ID = 0x6F4, - .data = {0x07, 0x04, 0x31, 0x03, 0xAD, 0x6E}}; + static constexpr CAN_frame BMW_6F4_CELL_CONTINUE = {.FD = false, + .ext_ID = false, + .DLC = 6, + .ID = 0x6F4, + .data = {0x07, 0x04, 0x31, 0x03, 0xAD, 0x6E}}; //The above CAN messages need to be sent towards the battery to keep it alive diff --git a/Software/src/battery/BMW-IX-BATTERY.h b/Software/src/battery/BMW-IX-BATTERY.h index 5ac86cca..5f8d81c6 100644 --- a/Software/src/battery/BMW-IX-BATTERY.h +++ b/Software/src/battery/BMW-IX-BATTERY.h @@ -150,7 +150,7 @@ TODO: */ //Vehicle CAN START - CAN_frame BMWiX_125 = { + static constexpr CAN_frame BMWiX_125 = { .FD = true, .ext_ID = false, .DLC = 20, @@ -178,14 +178,14 @@ CAN_frame BMWiX_12B8D087 = {.FD = true, 0x3A, // 0x3A to close contactors, 0x33 to open contactors 0xF7}}; // 0xF7 to close contactors, 0xF0 to open contactors // CCU output. - CAN_frame BMWiX_188 = { + static constexpr CAN_frame BMWiX_188 = { .FD = true, .ext_ID = false, .DLC = 8, .ID = 0x188, .data = {0x00, 0x00, 0x00, 0x00, 0x3C, 0xFF, 0xFF, 0xFF}}; // CCU output - values while driving - CAN_frame BMWiX_1EA = { + static constexpr CAN_frame BMWiX_1EA = { .FD = true, .ext_ID = false, .DLC = 8, @@ -193,7 +193,7 @@ CAN_frame BMWiX_12B8D087 = {.FD = true, //.data = {TODO:km_least_significant, TODO:, TODO:, TODO:, TODO:km_most_significant, 0xFF, TODO:, TODO:} }; // KOMBI output - kilometerstand - CAN_frame BMWiX_1FC = { + static constexpr CAN_frame BMWiX_1FC = { .FD = true, .ext_ID = false, .DLC = 8, @@ -201,7 +201,7 @@ CAN_frame BMWiX_12B8D087 = {.FD = true, .data = {0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0xC0, 0x00}}; // FIXME:(add transmitter node) output - heat management engine control - values - CAN_frame BMWiX_21D = { + static constexpr CAN_frame BMWiX_21D = { .FD = true, .ext_ID = false, .DLC = 8, @@ -209,14 +209,15 @@ CAN_frame BMWiX_12B8D087 = {.FD = true, // .data = {TODO:, TODO:, TODO:, 0xFF, 0xFF, 0xFF, 0xFF, TODO:} }; // FIXME:(add transmitter node) output - request heating and air conditioning system 1 - CAN_frame BMWiX_276 = {.FD = true, - .ext_ID = false, - .DLC = 8, - .ID = 0x276, - .data = {0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFD}}; // BDC output - vehicle condition. Used for contactor closing + static constexpr CAN_frame BMWiX_276 = { + .FD = true, + .ext_ID = false, + .DLC = 8, + .ID = 0x276, + .data = {0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFD}}; // BDC output - vehicle condition. Used for contactor closing - CAN_frame BMWiX_2ED = { + static constexpr CAN_frame BMWiX_2ED = { .FD = true, .ext_ID = false, .DLC = 8, @@ -225,14 +226,14 @@ CAN_frame BMWiX_12B8D087 = {.FD = true, 0x75, 0x75}}; // FIXME:(add transmitter node) output - ambient temperature (values seen in logs vary between 0x72 and 0x79) - CAN_frame BMWiX_2F1 = { + static constexpr CAN_frame BMWiX_2F1 = { .FD = true, .ext_ID = false, .DLC = 8, .ID = 0x2F1, .data = {0xFF, 0xFF, 0xD0, 0x39, 0x94, 0x00, 0xF3, 0xFF}}; // 1000ms BDC output - values - varies at startup - CAN_frame BMWiX_340 = { + static constexpr CAN_frame BMWiX_340 = { .FD = true, .ext_ID = false, .DLC = 12, @@ -240,7 +241,7 @@ CAN_frame BMWiX_12B8D087 = {.FD = true, // .data = {TODO:, TODO:, TODO:, 0xFF, TODO:, TODO:, 0x00, 0x00, TODO:, TODO:, TODO:, 0xFF, 0xFF, } }; // CCU output - CAN_frame BMWiX_380 = { + static constexpr CAN_frame BMWiX_380 = { .FD = true, .ext_ID = false, .DLC = 7, @@ -256,7 +257,7 @@ CAN_frame BMWiX_439 = {.FD = true, .data = {0xFF, 0x3F, 0xFF, 0xF3}}; // 1000ms BDC output */ - CAN_frame BMWiX_442 = { + static constexpr CAN_frame BMWiX_442 = { .FD = true, .ext_ID = false, .DLC = 6, @@ -289,7 +290,7 @@ CAN_frame BMWiX_49C = {.FD = true, 0xFF}}; // 1000ms SME output - Suspected keep alive CONFIRM NEEDED */ - CAN_frame BMWiX_4EB = { + static constexpr CAN_frame BMWiX_4EB = { .FD = true, .ext_ID = false, .DLC = 8, @@ -297,7 +298,7 @@ CAN_frame BMWiX_49C = {.FD = true, // .data = {TODO:, TODO:, TODO: 0xE0 or 0xE5 (while driving), 0xFF, 0xFF, 0xFF, 0xFF, 0xFF} }; // BDC output - RSU condition - CAN_frame BMWiX_4F8 = { + static constexpr CAN_frame BMWiX_4F8 = { .FD = true, .ext_ID = false, .DLC = 8, @@ -318,7 +319,7 @@ CAN_frame BMWiX_49C = {.FD = true, 0x01, 0x00}}; // 100ms BDC output - Values change in car logs, these bytes are the most common. Used for contactor closing - CAN_frame BMWiX_6D = { + static constexpr CAN_frame BMWiX_6D = { .FD = true, .ext_ID = false, .DLC = 8, @@ -327,7 +328,7 @@ CAN_frame BMWiX_49C = {.FD = true, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xFF}}; // 1000ms BDC output - [0] [1,2][3,4] counter x2. 3,4 is 9 higher than 1,2 is needed? [5-7] static - CAN_frame BMWiX_C0 = { + static constexpr CAN_frame BMWiX_C0 = { .FD = true, .ext_ID = false, .DLC = 2, @@ -338,87 +339,91 @@ CAN_frame BMWiX_49C = {.FD = true, //Vehicle CAN END //Request Data CAN START - CAN_frame BMWiX_6F4 = { + static constexpr CAN_frame BMWiX_6F4 = { .FD = true, .ext_ID = false, .DLC = 5, .ID = 0x6F4, .data = {0x07, 0x03, 0x22, 0xE5, 0xC7}}; // Generic UDS Request data from SME. byte 4 selects requested value - CAN_frame BMWiX_6F4_REQUEST_SLEEPMODE = { + static constexpr CAN_frame BMWiX_6F4_REQUEST_SLEEPMODE = { .FD = true, .ext_ID = false, .DLC = 4, .ID = 0x6F4, .data = {0x07, 0x02, 0x11, 0x04}}; // UDS Request Request BMS/SME goes to Sleep Mode - CAN_frame BMWiX_6F4_REQUEST_HARD_RESET = {.FD = true, - .ext_ID = false, - .DLC = 4, - .ID = 0x6F4, - .data = {0x07, 0x02, 0x11, 0x01}}; // UDS Request Hard reset of BMS/SME - CAN_frame BMWiX_6F4_REQUEST_CELL_TEMP = {.FD = true, - .ext_ID = false, - .DLC = 5, - .ID = 0x6F4, - .data = {0x07, 0x03, 0x22, 0xDD, 0xC0}}; // UDS Request Cell Temperatures - CAN_frame BMWiX_6F4_REQUEST_SOC = {.FD = true, - .ext_ID = false, - .DLC = 5, - .ID = 0x6F4, - .data = {0x07, 0x03, 0x22, 0xE5, 0xCE}}; // Min/Avg/Max SOC% - CAN_frame BMWiX_6F4_REQUEST_CAPACITY = { + static constexpr CAN_frame BMWiX_6F4_REQUEST_HARD_RESET = { + .FD = true, + .ext_ID = false, + .DLC = 4, + .ID = 0x6F4, + .data = {0x07, 0x02, 0x11, 0x01}}; // UDS Request Hard reset of BMS/SME + static constexpr CAN_frame BMWiX_6F4_REQUEST_CELL_TEMP = { + .FD = true, + .ext_ID = false, + .DLC = 5, + .ID = 0x6F4, + .data = {0x07, 0x03, 0x22, 0xDD, 0xC0}}; // UDS Request Cell Temperatures + static constexpr CAN_frame BMWiX_6F4_REQUEST_SOC = {.FD = true, + .ext_ID = false, + .DLC = 5, + .ID = 0x6F4, + .data = {0x07, 0x03, 0x22, 0xE5, 0xCE}}; // Min/Avg/Max SOC% + static constexpr CAN_frame BMWiX_6F4_REQUEST_CAPACITY = { .FD = true, .ext_ID = false, .DLC = 5, .ID = 0x6F4, .data = {0x07, 0x03, 0x22, 0xE5, 0xC7}}; //Current and max capacity kWh. Stored in kWh as 0.01 scale with -50 bias - CAN_frame BMWiX_6F4_REQUEST_MINMAXCELLV = { + static constexpr CAN_frame BMWiX_6F4_REQUEST_MINMAXCELLV = { .FD = true, .ext_ID = false, .DLC = 5, .ID = 0x6F4, .data = {0x07, 0x03, 0x22, 0xE5, 0x53}}; //Min and max cell voltage 10V = Qualifier Invalid - CAN_frame BMWiX_6F4_REQUEST_MAINVOLTAGE_POSTCONTACTOR = { + static constexpr CAN_frame BMWiX_6F4_REQUEST_MAINVOLTAGE_POSTCONTACTOR = { .FD = true, .ext_ID = false, .DLC = 5, .ID = 0x6F4, .data = {0x07, 0x03, 0x22, 0xE5, 0x4A}}; //Main Battery Voltage (After Contactor) - CAN_frame BMWiX_6F4_REQUEST_MAINVOLTAGE_PRECONTACTOR = { + static constexpr CAN_frame BMWiX_6F4_REQUEST_MAINVOLTAGE_PRECONTACTOR = { .FD = true, .ext_ID = false, .DLC = 5, .ID = 0x6F4, .data = {0x07, 0x03, 0x22, 0xE5, 0x4D}}; //Main Battery Voltage (Pre Contactor) - CAN_frame BMWiX_6F4_REQUEST_BATTERYCURRENT = { + static constexpr CAN_frame BMWiX_6F4_REQUEST_BATTERYCURRENT = { .FD = true, .ext_ID = false, .DLC = 5, .ID = 0x6F4, .data = {0x07, 0x03, 0x22, 0xE5, 0x61}}; //Current amps 32bit signed MSB. dA . negative is discharge - CAN_frame BMWiX_6F4_REQUEST_CELL_VOLTAGE = { + static constexpr CAN_frame BMWiX_6F4_REQUEST_CELL_VOLTAGE = { .FD = true, .ext_ID = false, .DLC = 5, .ID = 0x6F4, .data = {0x07, 0x03, 0x22, 0xE5, 0x54}}; //MultiFrameIndividual Cell Voltages - CAN_frame BMWiX_6F4_REQUEST_T30VOLTAGE = { + static constexpr CAN_frame BMWiX_6F4_REQUEST_T30VOLTAGE = { .FD = true, .ext_ID = false, .DLC = 5, .ID = 0x6F4, .data = {0x07, 0x03, 0x22, 0xE5, 0xA7}}; //Terminal 30 Voltage (12V SME supply) - CAN_frame BMWiX_6F4_REQUEST_EOL_ISO = {.FD = true, - .ext_ID = false, - .DLC = 5, - .ID = 0x6F4, - .data = {0x07, 0x03, 0x22, 0xA8, 0x60}}; //Request EOL Reading including ISO - CAN_frame BMWiX_6F4_REQUEST_SOH = {.FD = true, - .ext_ID = false, - .DLC = 5, - .ID = 0x6F4, - .data = {0x07, 0x03, 0x22, 0xE5, 0x45}}; //SOH Max Min Mean Request - CAN_frame BMWiX_6F4_REQUEST_DATASUMMARY = { + static constexpr CAN_frame BMWiX_6F4_REQUEST_EOL_ISO = { + .FD = true, + .ext_ID = false, + .DLC = 5, + .ID = 0x6F4, + .data = {0x07, 0x03, 0x22, 0xA8, 0x60}}; //Request EOL Reading including ISO + static constexpr CAN_frame BMWiX_6F4_REQUEST_SOH = { + .FD = true, + .ext_ID = false, + .DLC = 5, + .ID = 0x6F4, + .data = {0x07, 0x03, 0x22, 0xE5, 0x45}}; //SOH Max Min Mean Request + static constexpr CAN_frame BMWiX_6F4_REQUEST_DATASUMMARY = { .FD = true, .ext_ID = false, .DLC = 5, @@ -426,106 +431,108 @@ CAN_frame BMWiX_49C = {.FD = true, .data = { 0x07, 0x03, 0x22, 0xE5, 0x45}}; //MultiFrame Summary Request, includes SOC/SOH/MinMax/MaxCapac/RemainCapac/max v and t at last charge. slow refreshrate - CAN_frame BMWiX_6F4_REQUEST_PYRO = {.FD = true, - .ext_ID = false, - .DLC = 5, - .ID = 0x6F4, - .data = {0x07, 0x03, 0x22, 0xAC, 0x93}}; //Pyro Status - CAN_frame BMWiX_6F4_REQUEST_UPTIME = {.FD = true, - .ext_ID = false, - .DLC = 5, - .ID = 0x6F4, - .data = {0x07, 0x03, 0x22, 0xE4, 0xC0}}; // Uptime and Vehicle Time Status - CAN_frame BMWiX_6F4_REQUEST_HVIL = {.FD = true, - .ext_ID = false, - .DLC = 5, - .ID = 0x6F4, - .data = {0x07, 0x03, 0x22, 0xE5, 0x69}}; // Request HVIL State - CAN_frame BMWiX_6F4_REQUEST_BALANCINGSTATUS = {.FD = true, - .ext_ID = false, - .DLC = 5, - .ID = 0x6F4, - .data = {0x07, 0x03, 0x22, 0xE4, 0xCA}}; // Request Balancing Data - CAN_frame BMWiX_6F4_REQUEST_MAX_CHARGE_DISCHARGE_AMPS = { + static constexpr CAN_frame BMWiX_6F4_REQUEST_PYRO = {.FD = true, + .ext_ID = false, + .DLC = 5, + .ID = 0x6F4, + .data = {0x07, 0x03, 0x22, 0xAC, 0x93}}; //Pyro Status + static constexpr CAN_frame BMWiX_6F4_REQUEST_UPTIME = { + .FD = true, + .ext_ID = false, + .DLC = 5, + .ID = 0x6F4, + .data = {0x07, 0x03, 0x22, 0xE4, 0xC0}}; // Uptime and Vehicle Time Status + static constexpr CAN_frame BMWiX_6F4_REQUEST_HVIL = {.FD = true, + .ext_ID = false, + .DLC = 5, + .ID = 0x6F4, + .data = {0x07, 0x03, 0x22, 0xE5, 0x69}}; // Request HVIL State + static constexpr CAN_frame BMWiX_6F4_REQUEST_BALANCINGSTATUS = { + .FD = true, + .ext_ID = false, + .DLC = 5, + .ID = 0x6F4, + .data = {0x07, 0x03, 0x22, 0xE4, 0xCA}}; // Request Balancing Data + static constexpr CAN_frame BMWiX_6F4_REQUEST_MAX_CHARGE_DISCHARGE_AMPS = { .FD = true, .ext_ID = false, .DLC = 5, .ID = 0x6F4, .data = {0x07, 0x03, 0x22, 0xE5, 0x62}}; // Request allowable charge discharge amps - CAN_frame BMWiX_6F4_REQUEST_VOLTAGE_QUALIFIER_CHECK = { + static constexpr CAN_frame BMWiX_6F4_REQUEST_VOLTAGE_QUALIFIER_CHECK = { .FD = true, .ext_ID = false, .DLC = 5, .ID = 0x6F4, .data = {0x07, 0x03, 0x22, 0xE5, 0x4B}}; // Request HV Voltage Qualifier - CAN_frame BMWiX_6F4_REQUEST_CONTACTORS_CLOSE = { + static constexpr CAN_frame BMWiX_6F4_REQUEST_CONTACTORS_CLOSE = { .FD = true, .ext_ID = false, .DLC = 6, .ID = 0x6F4, .data = {0x07, 0x03, 0x22, 0xE5, 0x51, 0x01}}; // Request Contactors Close - Unconfirmed - CAN_frame BMWiX_6F4_REQUEST_CONTACTORS_OPEN = { + static constexpr CAN_frame BMWiX_6F4_REQUEST_CONTACTORS_OPEN = { .FD = true, .ext_ID = false, .DLC = 6, .ID = 0x6F4, .data = {0x07, 0x03, 0x22, 0xE5, 0x51, 0x01}}; // Request Contactors Open - Unconfirmed - CAN_frame BMWiX_6F4_REQUEST_BALANCING_START = { + static constexpr CAN_frame BMWiX_6F4_REQUEST_BALANCING_START = { .FD = true, .ext_ID = false, .DLC = 6, .ID = 0x6F4, .data = {0xF4, 0x04, 0x71, 0x01, 0xAE, 0x77}}; // Request Balancing command? - CAN_frame BMWiX_6F4_REQUEST_BALANCING_START2 = { + static constexpr CAN_frame BMWiX_6F4_REQUEST_BALANCING_START2 = { .FD = true, .ext_ID = false, .DLC = 6, .ID = 0x6F4, .data = {0xF4, 0x04, 0x31, 0x01, 0xAE, 0x77}}; // Request Balancing command? - CAN_frame BMWiX_6F4_REQUEST_PACK_VOLTAGE_LIMITS = { + static constexpr CAN_frame BMWiX_6F4_REQUEST_PACK_VOLTAGE_LIMITS = { .FD = true, .ext_ID = false, .DLC = 5, .ID = 0x6F4, .data = {0x07, 0x03, 0x22, 0xE5, 0x4C}}; // Request pack voltage limits - CAN_frame BMWiX_6F4_CONTINUE_DATA = {.FD = true, - .ext_ID = false, - .DLC = 4, - .ID = 0x6F4, - .data = {0x07, 0x30, 0x00, 0x02}}; + static constexpr CAN_frame BMWiX_6F4_CONTINUE_DATA = {.FD = true, + .ext_ID = false, + .DLC = 4, + .ID = 0x6F4, + .data = {0x07, 0x30, 0x00, 0x02}}; //Action Requests: - CAN_frame BMWiX_6F4_CELL_SOC = {.FD = true, - .ext_ID = false, - .DLC = 5, - .ID = 0x6F4, - .data = {0x07, 0x03, 0x22, 0xE5, 0x9A}}; - CAN_frame BMWiX_6F4_CELL_TEMP = {.FD = true, - .ext_ID = false, - .DLC = 5, - .ID = 0x6F4, - .data = {0x07, 0x03, 0x22, 0xE5, 0xCA}}; + static constexpr CAN_frame BMWiX_6F4_CELL_SOC = {.FD = true, + .ext_ID = false, + .DLC = 5, + .ID = 0x6F4, + .data = {0x07, 0x03, 0x22, 0xE5, 0x9A}}; + static constexpr CAN_frame BMWiX_6F4_CELL_TEMP = {.FD = true, + .ext_ID = false, + .DLC = 5, + .ID = 0x6F4, + .data = {0x07, 0x03, 0x22, 0xE5, 0xCA}}; //Request Data CAN End //Setup UDS values to poll for - CAN_frame* UDS_REQUESTS100MS[17] = {&BMWiX_6F4_REQUEST_CELL_TEMP, - &BMWiX_6F4_REQUEST_SOC, - &BMWiX_6F4_REQUEST_CAPACITY, - &BMWiX_6F4_REQUEST_MINMAXCELLV, - &BMWiX_6F4_REQUEST_MAINVOLTAGE_POSTCONTACTOR, - &BMWiX_6F4_REQUEST_MAINVOLTAGE_PRECONTACTOR, - &BMWiX_6F4_REQUEST_BATTERYCURRENT, - &BMWiX_6F4_REQUEST_CELL_VOLTAGE, - &BMWiX_6F4_REQUEST_T30VOLTAGE, - &BMWiX_6F4_REQUEST_SOH, - &BMWiX_6F4_REQUEST_UPTIME, - &BMWiX_6F4_REQUEST_PYRO, - &BMWiX_6F4_REQUEST_EOL_ISO, - &BMWiX_6F4_REQUEST_HVIL, - &BMWiX_6F4_REQUEST_MAX_CHARGE_DISCHARGE_AMPS, - &BMWiX_6F4_REQUEST_BALANCINGSTATUS, - &BMWiX_6F4_REQUEST_PACK_VOLTAGE_LIMITS}; + static constexpr const CAN_frame* UDS_REQUESTS100MS[17] = {&BMWiX_6F4_REQUEST_CELL_TEMP, + &BMWiX_6F4_REQUEST_SOC, + &BMWiX_6F4_REQUEST_CAPACITY, + &BMWiX_6F4_REQUEST_MINMAXCELLV, + &BMWiX_6F4_REQUEST_MAINVOLTAGE_POSTCONTACTOR, + &BMWiX_6F4_REQUEST_MAINVOLTAGE_PRECONTACTOR, + &BMWiX_6F4_REQUEST_BATTERYCURRENT, + &BMWiX_6F4_REQUEST_CELL_VOLTAGE, + &BMWiX_6F4_REQUEST_T30VOLTAGE, + &BMWiX_6F4_REQUEST_SOH, + &BMWiX_6F4_REQUEST_UPTIME, + &BMWiX_6F4_REQUEST_PYRO, + &BMWiX_6F4_REQUEST_EOL_ISO, + &BMWiX_6F4_REQUEST_HVIL, + &BMWiX_6F4_REQUEST_MAX_CHARGE_DISCHARGE_AMPS, + &BMWiX_6F4_REQUEST_BALANCINGSTATUS, + &BMWiX_6F4_REQUEST_PACK_VOLTAGE_LIMITS}; int numUDSreqs = sizeof(UDS_REQUESTS100MS) / sizeof(UDS_REQUESTS100MS[0]); // Number of elements in the array //iX Intermediate vars diff --git a/Software/src/battery/CanBattery.h b/Software/src/battery/CanBattery.h index 4178a4b0..53d720d7 100644 --- a/Software/src/battery/CanBattery.h +++ b/Software/src/battery/CanBattery.h @@ -34,7 +34,7 @@ class CanBattery : public Battery, Transmitter, CanReceiver { CAN_Speed change_can_speed(CAN_Speed speed); - void transmit_can_frame(CAN_frame* frame) { transmit_can_frame_to_interface(frame, can_interface); } + void transmit_can_frame(const CAN_frame* frame) { transmit_can_frame_to_interface(frame, can_interface); } }; #endif diff --git a/Software/src/battery/ECMP-BATTERY.h b/Software/src/battery/ECMP-BATTERY.h index 31c929bc..63284818 100644 --- a/Software/src/battery/ECMP-BATTERY.h +++ b/Software/src/battery/ECMP-BATTERY.h @@ -220,12 +220,13 @@ class EcmpBattery : public CanBattery { uint16_t incoming_poll = 0; CAN_frame ECMP_010 = {.FD = false, .ext_ID = false, .DLC = 1, .ID = 0x010, .data = {0xB4}}; //VCU_BCM_Crash 100ms - CAN_frame ECMP_041 = {.FD = false, .ext_ID = false, .DLC = 1, .ID = 0x041, .data = {0x00}}; - CAN_frame ECMP_0A6 = {.FD = false, - .ext_ID = false, - .DLC = 2, - .ID = 0x0A6, - .data = {0x02, 0x00}}; //Content changes after 12minutes of runtime (not emulated) + static constexpr CAN_frame ECMP_041 = {.FD = false, .ext_ID = false, .DLC = 1, .ID = 0x041, .data = {0x00}}; + static constexpr CAN_frame ECMP_0A6 = { + .FD = false, + .ext_ID = false, + .DLC = 2, + .ID = 0x0A6, + .data = {0x02, 0x00}}; //Content changes after 12minutes of runtime (not emulated) CAN_frame ECMP_0F0 = {.FD = false, //VCU2_0F0 (Common) 20ms periodic (Perfectly emulated in Battery-Emulator) .ext_ID = false, .DLC = 8, @@ -236,42 +237,46 @@ class EcmpBattery : public CanBattery { .DLC = 8, .ID = 0x0F2, .data = {0x7D, 0x00, 0x4E, 0x20, 0x00, 0x00, 0x60, 0x0D}}; - CAN_frame ECMP_0AE = {.FD = false, .ext_ID = false, .DLC = 5, .ID = 0x0AE, .data = {0x04, 0x77, 0x7A, 0x5E, 0xDF}}; + static constexpr CAN_frame ECMP_0AE = {.FD = false, + .ext_ID = false, + .DLC = 5, + .ID = 0x0AE, + .data = {0x04, 0x77, 0x7A, 0x5E, 0xDF}}; CAN_frame ECMP_110 = {.FD = false, //??? 10ms periodic (Perfectly emulated in Battery-Emulator) .ext_ID = false, // NOTE. Changes on BMS state .DLC = 8, .ID = 0x110, .data = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x87, 0x05}}; - CAN_frame ECMP_111 = {.FD = false, //??? 10ms periodic (Perfectly emulated in Battery-Emulator) - .ext_ID = false, //Same content always, fully static - .DLC = 8, - .ID = 0x111, - .data = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; + static constexpr CAN_frame ECMP_111 = {.FD = false, //??? 10ms periodic (Perfectly emulated in Battery-Emulator) + .ext_ID = false, //Same content always, fully static + .DLC = 8, + .ID = 0x111, + .data = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; CAN_frame ECMP_112 = {.FD = false, //MCU1_112 10ms periodic (Perfectly emulated in Battery-Emulator) .ext_ID = false, //Same content always, only CRC changes at end .DLC = 8, .ID = 0x112, .data = {0x4E, 0x20, 0x00, 0x0F, 0xA0, 0x7D, 0x00, 0x0A}}; - CAN_frame ECMP_114 = {.FD = false, //??? 10ms periodic (Perfectly emulated in Battery-Emulator) - .ext_ID = false, //Same content always, fully static - .DLC = 8, - .ID = 0x114, - .data = {0x00, 0x00, 0x00, 0x7D, 0x07, 0xD0, 0x7D, 0x00}}; - CAN_frame ECMP_0C5 = {.FD = false, //DC2_0C5 10ms periodic (Perfectly emulated in Battery-Emulator) - .ext_ID = false, //Same content always, fully static - .DLC = 8, - .ID = 0x0C5, - .data = {0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00}}; + static constexpr CAN_frame ECMP_114 = {.FD = false, //??? 10ms periodic (Perfectly emulated in Battery-Emulator) + .ext_ID = false, //Same content always, fully static + .DLC = 8, + .ID = 0x114, + .data = {0x00, 0x00, 0x00, 0x7D, 0x07, 0xD0, 0x7D, 0x00}}; + static constexpr CAN_frame ECMP_0C5 = {.FD = false, //DC2_0C5 10ms periodic (Perfectly emulated in Battery-Emulator) + .ext_ID = false, //Same content always, fully static + .DLC = 8, + .ID = 0x0C5, + .data = {0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00}}; CAN_frame ECMP_17B = {.FD = false, //VCU_PCANInfo_17B 10ms periodic (Perfectly emulated in Battery-Emulator) .ext_ID = false, // NOTE. Changes on BMS state .DLC = 8, .ID = 0x17B, .data = {0x00, 0x00, 0x00, 0x7E, 0x78, 0x00, 0x00, 0x0F}}; // NOTE. Changes on BMS state - CAN_frame ECMP_230 = {.FD = false, //OBC3_230 50ms periodic (Perfectly emulated in Battery-Emulator) - .ext_ID = false, //Same content always, fully static - .DLC = 8, - .ID = 0x230, - .data = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; + static constexpr CAN_frame ECMP_230 = {.FD = false, //OBC3_230 50ms periodic (Perfectly emulated in Battery-Emulator) + .ext_ID = false, //Same content always, fully static + .DLC = 8, + .ID = 0x230, + .data = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; CAN_frame ECMP_27A = { .FD = false, //VCU_BSI_Wakeup_27A message 50ms periodic (Perfectly emulated in Battery-Emulator) .ext_ID = false, // NOTE. Changes on BMS state @@ -308,12 +313,13 @@ class EcmpBattery : public CanBattery { .DLC = 8, .ID = 0x372, .data = {0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; // NOTE. Changes on BMS state - CAN_frame ECMP_37F = {.FD = false, //??? 100ms periodic (Perfectly emulated in Battery-Emulator) - .ext_ID = false, // Seems to be a bunch of temperature measurements? Static for now - .DLC = 8, - .ID = 0x37F, - .data = {0x45, 0x49, 0x51, 0x45, 0x45, 0x00, 0x45, 0x45}}; - CAN_frame ECMP_382 = { + static constexpr CAN_frame ECMP_37F = { + .FD = false, //??? 100ms periodic (Perfectly emulated in Battery-Emulator) + .ext_ID = false, // Seems to be a bunch of temperature measurements? Static for now + .DLC = 8, + .ID = 0x37F, + .data = {0x45, 0x49, 0x51, 0x45, 0x45, 0x00, 0x45, 0x45}}; + static constexpr CAN_frame ECMP_382 = { //BSIInfo_382 (VCU) PSA specific 100ms periodic (Perfectly emulated in Battery-Emulator) .FD = false, //Same content always, fully static .ext_ID = false, @@ -335,11 +341,11 @@ class EcmpBattery : public CanBattery { .DLC = 8, .ID = 0x3A3, .data = {0x4A, 0x4A, 0x40, 0x00, 0x00, 0x08, 0x00, 0x0F}}; - CAN_frame ECMP_439 = {.FD = false, //OBC4 1s periodic (Perfectly emulated in Battery-Emulator) - .ext_ID = false, //Same content always, fully static - .DLC = 8, - .ID = 0x439, - .data = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; + static constexpr CAN_frame ECMP_439 = {.FD = false, //OBC4 1s periodic (Perfectly emulated in Battery-Emulator) + .ext_ID = false, //Same content always, fully static + .DLC = 8, + .ID = 0x439, + .data = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; CAN_frame ECMP_486 = {.FD = false, //??? 1s periodic (Perfectly emulated in Battery-Emulator) .ext_ID = false, // NOTE. Changes on BMS state .DLC = 8, @@ -350,76 +356,88 @@ class EcmpBattery : public CanBattery { .DLC = 8, //552 seems to be tracking time in byte 0-3 .ID = 0x552, // distance in km in byte 4-6, temporal reset counter in byte 7 .data = {0x00, 0x02, 0x95, 0x6D, 0x00, 0xD7, 0xB5, 0xFE}}; - CAN_frame ECMP_55F = {.FD = false, //5s periodic (Perfectly emulated in Battery-Emulator) - .ext_ID = false, //Same content always, fully static - .DLC = 1, - .ID = 0x55F, - .data = {0x82}}; - CAN_frame ECMP_591 = {.FD = false, //1s periodic - .ext_ID = false, //Always static in HV mode - .DLC = 8, - .ID = 0x591, - .data = {0x38, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}; - CAN_frame ECMP_786 = {.FD = false, //1s periodic - .ext_ID = false, //Always static in HV mode - .DLC = 8, - .ID = 0x786, - .data = {0x38, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}; + static constexpr CAN_frame ECMP_55F = {.FD = false, //5s periodic (Perfectly emulated in Battery-Emulator) + .ext_ID = false, //Same content always, fully static + .DLC = 1, + .ID = 0x55F, + .data = {0x82}}; + static constexpr CAN_frame ECMP_591 = {.FD = false, //1s periodic + .ext_ID = false, //Always static in HV mode + .DLC = 8, + .ID = 0x591, + .data = {0x38, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}; + static constexpr CAN_frame ECMP_786 = {.FD = false, //1s periodic + .ext_ID = false, //Always static in HV mode + .DLC = 8, + .ID = 0x786, + .data = {0x38, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}; CAN_frame ECMP_794 = {.FD = false, //Unsure who sends this. Could it be BMU? .ext_ID = false, .DLC = 8, .ID = 0x794, .data = {0xB8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}; // NOTE. Changes on BMS state CAN_frame ECMP_POLL = {.FD = false, .ext_ID = false, .DLC = 4, .ID = 0x6B4, .data = {0x03, 0x22, 0xD8, 0x66}}; - CAN_frame ECMP_ACK = {.FD = false, //Ack frame - .ext_ID = false, - .DLC = 3, - .ID = 0x6B4, - .data = {0x30, 0x00, 0x00}}; - CAN_frame ECMP_DIAG_START = {.FD = false, .ext_ID = false, .DLC = 3, .ID = 0x6B4, .data = {0x02, 0x10, 0x03}}; + static constexpr CAN_frame ECMP_ACK = {.FD = false, //Ack frame + .ext_ID = false, + .DLC = 3, + .ID = 0x6B4, + .data = {0x30, 0x00, 0x00}}; + static constexpr CAN_frame ECMP_DIAG_START = {.FD = false, + .ext_ID = false, + .DLC = 3, + .ID = 0x6B4, + .data = {0x02, 0x10, 0x03}}; //Start diagnostic session (extended diagnostic session, mode 0x10 with sub-mode 0x03) - CAN_frame ECMP_CONTACTOR_RESET_START = {.FD = false, - .ext_ID = false, - .DLC = 5, - .ID = 0x6B4, - .data = {0x04, 0x31, 0x01, 0xDD, 0x35}}; - CAN_frame ECMP_CONTACTOR_RESET_PROGRESS = {.FD = false, - .ext_ID = false, - .DLC = 5, - .ID = 0x6B4, - .data = {0x04, 0x31, 0x03, 0xDD, 0x35}}; - CAN_frame ECMP_COLLISION_RESET_START = {.FD = false, - .ext_ID = false, - .DLC = 5, - .ID = 0x6B4, - .data = {0x04, 0x31, 0x01, 0xDF, 0x60}}; - CAN_frame ECMP_COLLISION_RESET_PROGRESS = {.FD = false, - .ext_ID = false, - .DLC = 5, - .ID = 0x6B4, - .data = {0x04, 0x31, 0x03, 0xDF, 0x60}}; - CAN_frame ECMP_ISOLATION_RESET_START = {.FD = false, - .ext_ID = false, - .DLC = 5, - .ID = 0x6B4, - .data = {0x04, 0x31, 0x01, 0xDF, 0x46}}; - CAN_frame ECMP_ISOLATION_RESET_PROGRESS = {.FD = false, - .ext_ID = false, - .DLC = 8, - .ID = 0x6B4, - .data = {0x04, 0x31, 0x03, 0xDF, 0x46}}; - CAN_frame ECMP_RESET_DONE = {.FD = false, .ext_ID = false, .DLC = 3, .ID = 0x6B4, .data = {0x02, 0x3E, 0x00}}; - CAN_frame ECMP_FACTORY_MODE_ACTIVATION = {.FD = false, - .ext_ID = false, - .DLC = 5, - .ID = 0x6B4, - .data = {0x04, 0x2E, 0xD9, 0x00, 0x01}}; - CAN_frame ECMP_DISABLE_ISOLATION_REQ = {.FD = false, - .ext_ID = false, - .DLC = 5, - .ID = 0x6B4, - .data = {0x04, 0x31, 0x02, 0xDF, 0xE1}}; - CAN_frame ECMP_ACK_MESSAGE = {.FD = false, .ext_ID = false, .DLC = 3, .ID = 0x6B4, .data = {0x02, 0x3E, 0x00}}; + static constexpr CAN_frame ECMP_CONTACTOR_RESET_START = {.FD = false, + .ext_ID = false, + .DLC = 5, + .ID = 0x6B4, + .data = {0x04, 0x31, 0x01, 0xDD, 0x35}}; + static constexpr CAN_frame ECMP_CONTACTOR_RESET_PROGRESS = {.FD = false, + .ext_ID = false, + .DLC = 5, + .ID = 0x6B4, + .data = {0x04, 0x31, 0x03, 0xDD, 0x35}}; + static constexpr CAN_frame ECMP_COLLISION_RESET_START = {.FD = false, + .ext_ID = false, + .DLC = 5, + .ID = 0x6B4, + .data = {0x04, 0x31, 0x01, 0xDF, 0x60}}; + static constexpr CAN_frame ECMP_COLLISION_RESET_PROGRESS = {.FD = false, + .ext_ID = false, + .DLC = 5, + .ID = 0x6B4, + .data = {0x04, 0x31, 0x03, 0xDF, 0x60}}; + static constexpr CAN_frame ECMP_ISOLATION_RESET_START = {.FD = false, + .ext_ID = false, + .DLC = 5, + .ID = 0x6B4, + .data = {0x04, 0x31, 0x01, 0xDF, 0x46}}; + static constexpr CAN_frame ECMP_ISOLATION_RESET_PROGRESS = {.FD = false, + .ext_ID = false, + .DLC = 8, + .ID = 0x6B4, + .data = {0x04, 0x31, 0x03, 0xDF, 0x46}}; + static constexpr CAN_frame ECMP_RESET_DONE = {.FD = false, + .ext_ID = false, + .DLC = 3, + .ID = 0x6B4, + .data = {0x02, 0x3E, 0x00}}; + static constexpr CAN_frame ECMP_FACTORY_MODE_ACTIVATION = {.FD = false, + .ext_ID = false, + .DLC = 5, + .ID = 0x6B4, + .data = {0x04, 0x2E, 0xD9, 0x00, 0x01}}; + static constexpr CAN_frame ECMP_DISABLE_ISOLATION_REQ = {.FD = false, + .ext_ID = false, + .DLC = 5, + .ID = 0x6B4, + .data = {0x04, 0x31, 0x02, 0xDF, 0xE1}}; + static constexpr CAN_frame ECMP_ACK_MESSAGE = {.FD = false, + .ext_ID = false, + .DLC = 3, + .ID = 0x6B4, + .data = {0x02, 0x3E, 0x00}}; uint8_t data_010_CRC[8] = {0xB4, 0x96, 0x78, 0x5A, 0x3C, 0x1E, 0xF0, 0xD2}; uint8_t data_3A2_CRC[16] = {0x0C, 0x1B, 0x2A, 0x39, 0x48, 0x57, 0x66, 0x75, 0x84, 0x93, 0xA2, 0xB1}; // NOTE. Changes on BMS state diff --git a/Software/src/battery/KIA-E-GMP-BATTERY.cpp b/Software/src/battery/KIA-E-GMP-BATTERY.cpp index 197ceffe..9a91a760 100644 --- a/Software/src/battery/KIA-E-GMP-BATTERY.cpp +++ b/Software/src/battery/KIA-E-GMP-BATTERY.cpp @@ -128,7 +128,7 @@ uint8_t messageDelays[63] = {0, 0, 5, 10, 10, 15, 19, 19, 20, 20, 2 45, 49, 49, 50, 50, 52, 53, 53, 54, 55, 60, 60, 65, 67, 67, 70, 70, 75, 77, 77, 80, 80, 85, 90, 90, 95, 100, 100, 105, 110, 110, 115, 119, 119, 120, 120, 125, 130, 130, 135, 140, 140, 145, 149, 149, 150, 150}; -CAN_frame message_1 = { +static constexpr CAN_frame message_1 = { .FD = true, .ext_ID = false, .DLC = 32, @@ -136,7 +136,7 @@ CAN_frame message_1 = { .data = {0x62, 0x36, 0x8c, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x01, 0x00, 0x00, 0x36, 0x39, 0x35, 0x35, 0xc9, 0x02, 0x00, 0x00, 0x10, 0x00, 0x00, 0x35, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00}}; -CAN_frame message_2 = { +static constexpr CAN_frame message_2 = { .FD = true, .ext_ID = false, .DLC = 32, @@ -144,7 +144,7 @@ CAN_frame message_2 = { .data = {0xd4, 0x1b, 0x8c, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x01, 0x00, 0x00, 0x37, 0x35, 0x37, 0x37, 0xc9, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00}}; -CAN_frame message_3 = { +static constexpr CAN_frame message_3 = { .FD = true, .ext_ID = false, .DLC = 32, @@ -152,7 +152,7 @@ CAN_frame message_3 = { .data = {0x24, 0x9b, 0x7b, 0x55, 0x44, 0x64, 0xd8, 0x1b, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x11, 0x52, 0x00, 0x12, 0x02, 0x64, 0x00, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00}}; -CAN_frame message_4 = { +static constexpr CAN_frame message_4 = { .FD = true, .ext_ID = false, .DLC = 32, @@ -160,7 +160,7 @@ CAN_frame message_4 = { .data = {0x24, 0x6f, 0x8d, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x01, 0x00, 0x00, 0x36, 0x39, 0x35, 0x35, 0xc9, 0x02, 0x00, 0x00, 0x10, 0x00, 0x00, 0x35, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00}}; -CAN_frame message_5 = { +static constexpr CAN_frame message_5 = { .FD = true, .ext_ID = false, .DLC = 32, @@ -168,7 +168,7 @@ CAN_frame message_5 = { .data = {0x92, 0x42, 0x8d, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x01, 0x00, 0x00, 0x37, 0x35, 0x37, 0x37, 0xc9, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00}}; -CAN_frame message_6 = { +static constexpr CAN_frame message_6 = { .FD = true, .ext_ID = false, .DLC = 32, @@ -176,7 +176,7 @@ CAN_frame message_6 = { .data = {0xd7, 0x05, 0x7c, 0x55, 0x44, 0x64, 0xd8, 0x1b, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x11, 0x52, 0x00, 0x12, 0x02, 0x64, 0x00, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00}}; -CAN_frame message_7 = { +static constexpr CAN_frame message_7 = { .FD = true, .ext_ID = false, .DLC = 32, @@ -184,7 +184,7 @@ CAN_frame message_7 = { .data = {0xb1, 0xe0, 0x26, 0x08, 0x54, 0x01, 0x04, 0x15, 0x00, 0x1a, 0x76, 0x00, 0x25, 0x01, 0x10, 0x27, 0x4f, 0x06, 0x18, 0x04, 0x33, 0x15, 0x34, 0x28, 0x00, 0x00, 0x10, 0x06, 0x21, 0x00, 0x4b, 0x06}}; -CAN_frame message_8 = { +static constexpr CAN_frame message_8 = { .FD = true, .ext_ID = false, .DLC = 32, @@ -192,7 +192,7 @@ CAN_frame message_8 = { .data = {0xc6, 0xab, 0x26, 0x41, 0x00, 0x00, 0x01, 0x3c, 0xac, 0x0d, 0x40, 0x20, 0x05, 0xc8, 0xa0, 0x03, 0x40, 0x20, 0x2b, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; -CAN_frame message_9 = { +static constexpr CAN_frame message_9 = { .FD = true, .ext_ID = false, .DLC = 32, @@ -200,14 +200,14 @@ CAN_frame message_9 = { .data = {0xee, 0x84, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x01, 0x00, 0x00, 0x36, 0x39, 0x35, 0x35, 0xc9, 0x02, 0x00, 0x00, 0x10, 0x00, 0x00, 0x35, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00}}; -CAN_frame message_10 = { +static constexpr CAN_frame message_10 = { .FD = true, .ext_ID = false, .DLC = 32, .ID = 0x120, .data = {0x58, 0xa9, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x01, 0x00, 0x00, 0x37, 0x35, 0x37, 0x37, 0xc9, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00}}; -CAN_frame message_11 = { +static constexpr CAN_frame message_11 = { .FD = true, .ext_ID = false, .DLC = 32, @@ -215,7 +215,7 @@ CAN_frame message_11 = { .data = {0x91, 0x5c, 0x7d, 0x55, 0x44, 0x64, 0xd8, 0x1b, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x11, 0x52, 0x00, 0x12, 0x02, 0x64, 0x00, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00}}; -CAN_frame message_12 = { +static constexpr CAN_frame message_12 = { .FD = true, .ext_ID = false, .DLC = 32, @@ -223,7 +223,7 @@ CAN_frame message_12 = { .data = {0xa8, 0xdd, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x01, 0x00, 0x00, 0x36, 0x39, 0x35, 0x35, 0xc9, 0x02, 0x00, 0x00, 0x10, 0x00, 0x00, 0x35, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00}}; -CAN_frame message_13 = { +static constexpr CAN_frame message_13 = { .FD = true, .ext_ID = false, .DLC = 32, @@ -231,7 +231,7 @@ CAN_frame message_13 = { .data = {0x1e, 0xf0, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x01, 0x00, 0x00, 0x37, 0x35, 0x37, 0x37, 0xc9, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00}}; -CAN_frame message_14 = { +static constexpr CAN_frame message_14 = { .FD = true, .ext_ID = false, .DLC = 32, @@ -239,7 +239,7 @@ CAN_frame message_14 = { .data = {0x5b, 0xb7, 0x7e, 0x55, 0x44, 0x64, 0xd8, 0x1b, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x11, 0x52, 0x00, 0x12, 0x02, 0x64, 0x00, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00}}; -CAN_frame message_15 = { +static constexpr CAN_frame message_15 = { .FD = true, .ext_ID = false, .DLC = 32, @@ -247,7 +247,7 @@ CAN_frame message_15 = { .data = {0xec, 0x6d, 0x90, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x01, 0x00, 0x00, 0x36, 0x39, 0x35, 0x35, 0xc9, 0x02, 0x00, 0x00, 0x10, 0x00, 0x00, 0x35, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00}}; -CAN_frame message_16 = { +static constexpr CAN_frame message_16 = { .FD = true, .ext_ID = false, .DLC = 32, @@ -255,7 +255,7 @@ CAN_frame message_16 = { .data = {0x5a, 0x40, 0x90, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x01, 0x00, 0x00, 0x37, 0x35, 0x37, 0x37, 0xc9, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00}}; -CAN_frame message_17 = { +static constexpr CAN_frame message_17 = { .FD = true, .ext_ID = false, .DLC = 32, @@ -263,7 +263,7 @@ CAN_frame message_17 = { .data = {0x1d, 0xee, 0x7f, 0x55, 0x44, 0x64, 0xd8, 0x1b, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x11, 0x52, 0x00, 0x12, 0x02, 0x64, 0x00, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00}}; -CAN_frame message_18 = { +static constexpr CAN_frame message_18 = { .FD = true, .ext_ID = false, .DLC = 32, @@ -271,7 +271,7 @@ CAN_frame message_18 = { .data = {0xbd, 0xb2, 0x42, 0x00, 0x00, 0x00, 0x00, 0x80, 0x59, 0x00, 0x2b, 0x00, 0x00, 0x04, 0x00, 0x00, 0xfa, 0xd0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; -CAN_frame message_19 = { +static constexpr CAN_frame message_19 = { .FD = true, .ext_ID = false, .DLC = 32, @@ -279,14 +279,14 @@ CAN_frame message_19 = { .data = {0xc1, 0xf2, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x70, 0x01, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; -CAN_frame message_20 = { +static constexpr CAN_frame message_20 = { .FD = true, .ext_ID = false, .DLC = 32, .ID = 0x10A, .data = {0xaa, 0x34, 0x91, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x01, 0x00, 0x00, 0x36, 0x39, 0x35, 0x35, 0xc9, 0x02, 0x00, 0x00, 0x10, 0x00, 0x00, 0x35, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00}}; -CAN_frame message_21 = { +static constexpr CAN_frame message_21 = { .FD = true, .ext_ID = false, .DLC = 32, @@ -294,7 +294,7 @@ CAN_frame message_21 = { .data = {0x1c, 0x19, 0x91, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x01, 0x00, 0x00, 0x37, 0x35, 0x37, 0x37, 0xc9, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00}}; -CAN_frame message_22 = { +static constexpr CAN_frame message_22 = { .FD = true, .ext_ID = false, .DLC = 32, @@ -302,7 +302,7 @@ CAN_frame message_22 = { .data = {0x79, 0xfb, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; -CAN_frame message_23 = { +static constexpr CAN_frame message_23 = { .FD = true, .ext_ID = false, .DLC = 32, @@ -310,7 +310,7 @@ CAN_frame message_23 = { .data = {0x6e, 0xbb, 0xa0, 0x0d, 0x04, 0x01, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc7, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; -CAN_frame message_24 = { +static constexpr CAN_frame message_24 = { .FD = true, .ext_ID = false, .DLC = 32, @@ -318,7 +318,7 @@ CAN_frame message_24 = { .data = {0x00, 0x00, 0x00, 0xd2, 0x06, 0x92, 0x05, 0x34, 0x07, 0x8e, 0x08, 0x73, 0x05, 0x80, 0x05, 0x83, 0x05, 0x73, 0x05, 0x80, 0x05, 0xed, 0x01, 0xdd, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; -CAN_frame message_25 = { +static constexpr CAN_frame message_25 = { .FD = true, .ext_ID = false, .DLC = 32, @@ -326,7 +326,7 @@ CAN_frame message_25 = { .data = {0xbe, 0x84, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x75, 0x6c, 0x86, 0x0d, 0xfb, 0xdf, 0x03, 0x36, 0xc3, 0x86, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00}}; -CAN_frame message_26 = { +static constexpr CAN_frame message_26 = { .FD = true, .ext_ID = false, .DLC = 32, @@ -334,7 +334,7 @@ CAN_frame message_26 = { .data = {0x6b, 0xa2, 0x80, 0x55, 0x44, 0x64, 0xd8, 0x1b, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x11, 0x52, 0x00, 0x12, 0x02, 0x64, 0x00, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00}}; -CAN_frame message_27 = { +static constexpr CAN_frame message_27 = { .FD = true, .ext_ID = false, .DLC = 32, @@ -342,7 +342,7 @@ CAN_frame message_27 = { .data = {0x60, 0xdf, 0x92, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x01, 0x00, 0x00, 0x36, 0x39, 0x35, 0x35, 0xc9, 0x02, 0x00, 0x00, 0x10, 0x00, 0x00, 0x35, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00}}; -CAN_frame message_28 = { +static constexpr CAN_frame message_28 = { .FD = true, .ext_ID = false, .DLC = 32, @@ -350,7 +350,7 @@ CAN_frame message_28 = { .data = {0xd6, 0xf2, 0x92, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x01, 0x00, 0x00, 0x37, 0x35, 0x37, 0x37, 0xc9, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00}}; -CAN_frame message_29 = { +static constexpr CAN_frame message_29 = { .FD = true, .ext_ID = false, .DLC = 32, @@ -358,14 +358,14 @@ CAN_frame message_29 = { .data = {0x2d, 0xfb, 0x81, 0x55, 0x44, 0x64, 0xd8, 0x1b, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x11, 0x52, 0x00, 0x12, 0x02, 0x64, 0x00, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00}}; -CAN_frame message_30 = { +static constexpr CAN_frame message_30 = { .FD = true, .ext_ID = false, .DLC = 32, .ID = 0x33A, .data = {0x1a, 0x23, 0x26, 0x10, 0x27, 0x4f, 0x06, 0x00, 0xf8, 0x1b, 0x19, 0x04, 0x30, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x2e, 0x2d, 0x81, 0x25, 0x20, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; -CAN_frame message_31 = { +static constexpr CAN_frame message_31 = { .FD = true, .ext_ID = false, .DLC = 32, @@ -373,7 +373,7 @@ CAN_frame message_31 = { .data = {0x26, 0x82, 0x26, 0xf4, 0x01, 0x00, 0x00, 0x50, 0x90, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; -CAN_frame message_32 = { +static constexpr CAN_frame message_32 = { .FD = true, .ext_ID = false, .DLC = 32, @@ -381,7 +381,7 @@ CAN_frame message_32 = { .data = {0x26, 0x86, 0x93, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x01, 0x00, 0x00, 0x36, 0x39, 0x35, 0x35, 0xc9, 0x02, 0x00, 0x00, 0x10, 0x00, 0x00, 0x35, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00}}; -CAN_frame message_33 = { +static constexpr CAN_frame message_33 = { .FD = true, .ext_ID = false, .DLC = 32, @@ -389,7 +389,7 @@ CAN_frame message_33 = { .data = {0x90, 0xab, 0x93, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x01, 0x00, 0x00, 0x37, 0x35, 0x37, 0x37, 0xc9, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00}}; -CAN_frame message_34 = { +static constexpr CAN_frame message_34 = { .FD = true, .ext_ID = false, .DLC = 32, @@ -397,7 +397,7 @@ CAN_frame message_34 = { .data = {0xe7, 0x10, 0x82, 0x55, 0x44, 0x64, 0xd8, 0x1b, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x11, 0x52, 0x00, 0x12, 0x02, 0x64, 0x00, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00}}; -CAN_frame message_35 = { +static constexpr CAN_frame message_35 = { .FD = true, .ext_ID = false, .DLC = 32, @@ -405,7 +405,7 @@ CAN_frame message_35 = { .data = {0x69, 0x8a, 0x3f, 0x01, 0x00, 0x00, 0x00, 0x15, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; -CAN_frame message_36 = { +static constexpr CAN_frame message_36 = { .FD = true, .ext_ID = false, .DLC = 32, @@ -413,7 +413,7 @@ CAN_frame message_36 = { .data = {0xa3, 0xc8, 0x9f, 0x00, 0x00, 0x00, 0x00, 0x36, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc7, 0x02, 0x00, 0x00, 0x00, 0x00, 0x6a, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; -CAN_frame message_37 = { +static constexpr CAN_frame message_37 = { .FD = true, .ext_ID = false, .DLC = 32, @@ -421,7 +421,7 @@ CAN_frame message_37 = { .data = {0xd5, 0x18, 0x94, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x01, 0x00, 0x00, 0x36, 0x39, 0x35, 0x35, 0xc9, 0x02, 0x00, 0x00, 0x10, 0x00, 0x00, 0x35, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00}}; -CAN_frame message_38 = { +static constexpr CAN_frame message_38 = { .FD = true, .ext_ID = false, .DLC = 32, @@ -429,7 +429,7 @@ CAN_frame message_38 = { .data = {0x63, 0x35, 0x94, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x01, 0x00, 0x00, 0x37, 0x35, 0x37, 0x37, 0xc9, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00}}; -CAN_frame message_39 = { +static constexpr CAN_frame message_39 = { .FD = true, .ext_ID = false, .DLC = 32, @@ -437,14 +437,14 @@ CAN_frame message_39 = { .data = {0xa1, 0x49, 0x83, 0x55, 0x44, 0x64, 0xd8, 0x1b, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x11, 0x52, 0x00, 0x12, 0x02, 0x64, 0x00, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00}}; -CAN_frame message_40 = { +static constexpr CAN_frame message_40 = { .FD = true, .ext_ID = false, .DLC = 32, .ID = 0x10A, .data = {0x93, 0x41, 0x95, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x01, 0x00, 0x00, 0x36, 0x39, 0x35, 0x35, 0xc9, 0x02, 0x00, 0x00, 0x10, 0x00, 0x00, 0x35, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00}}; -CAN_frame message_41 = { +static constexpr CAN_frame message_41 = { .FD = true, .ext_ID = false, .DLC = 32, @@ -452,7 +452,7 @@ CAN_frame message_41 = { .data = {0x25, 0x6c, 0x95, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x01, 0x00, 0x00, 0x37, 0x35, 0x37, 0x37, 0xc9, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00}}; -CAN_frame message_42 = { +static constexpr CAN_frame message_42 = { .FD = true, .ext_ID = false, .DLC = 32, @@ -460,7 +460,7 @@ CAN_frame message_42 = { .data = {0x52, 0xd7, 0x84, 0x55, 0x44, 0x64, 0xd8, 0x1b, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x11, 0x52, 0x00, 0x12, 0x02, 0x64, 0x00, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00}}; -CAN_frame message_43 = { +static constexpr CAN_frame message_43 = { .FD = true, .ext_ID = false, .DLC = 32, @@ -468,7 +468,7 @@ CAN_frame message_43 = { .data = {0x59, 0xaa, 0x96, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x01, 0x00, 0x00, 0x36, 0x39, 0x35, 0x35, 0xc9, 0x02, 0x00, 0x00, 0x10, 0x00, 0x00, 0x35, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00}}; -CAN_frame message_44 = { +static constexpr CAN_frame message_44 = { .FD = true, .ext_ID = false, .DLC = 32, @@ -476,7 +476,7 @@ CAN_frame message_44 = { .data = {0xef, 0x87, 0x96, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x01, 0x00, 0x00, 0x37, 0x35, 0x37, 0x37, 0xc9, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00}}; -CAN_frame message_45 = { +static constexpr CAN_frame message_45 = { .FD = true, .ext_ID = false, .DLC = 32, @@ -484,7 +484,7 @@ CAN_frame message_45 = { .data = {0x14, 0x8e, 0x85, 0x55, 0x44, 0x64, 0xd8, 0x1b, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x11, 0x52, 0x00, 0x12, 0x02, 0x64, 0x00, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00}}; -CAN_frame message_46 = { +static constexpr CAN_frame message_46 = { .FD = true, .ext_ID = false, .DLC = 32, @@ -492,7 +492,7 @@ CAN_frame message_46 = { .data = {0x1f, 0xf3, 0x97, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x01, 0x00, 0x00, 0x36, 0x39, 0x35, 0x35, 0xc9, 0x02, 0x00, 0x00, 0x10, 0x00, 0x00, 0x35, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00}}; -CAN_frame message_47 = { +static constexpr CAN_frame message_47 = { .FD = true, .ext_ID = false, .DLC = 32, @@ -500,7 +500,7 @@ CAN_frame message_47 = { .data = {0xa9, 0xde, 0x97, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x01, 0x00, 0x00, 0x37, 0x35, 0x37, 0x37, 0xc9, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00}}; -CAN_frame message_48 = { +static constexpr CAN_frame message_48 = { .FD = true, .ext_ID = false, .DLC = 32, @@ -508,7 +508,7 @@ CAN_frame message_48 = { .data = {0xde, 0x65, 0x86, 0x55, 0x44, 0x64, 0xd8, 0x1b, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x11, 0x52, 0x00, 0x12, 0x02, 0x64, 0x00, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00}}; -CAN_frame message_49 = { +static constexpr CAN_frame message_49 = { .FD = true, .ext_ID = false, .DLC = 32, @@ -516,14 +516,14 @@ CAN_frame message_49 = { .data = {0xd3, 0x11, 0x27, 0x08, 0x54, 0x01, 0x04, 0x15, 0x00, 0x1a, 0x76, 0x00, 0x25, 0x01, 0x10, 0x27, 0x4f, 0x06, 0x19, 0x04, 0x33, 0x15, 0x34, 0x28, 0x00, 0x00, 0x10, 0x06, 0x21, 0x00, 0x4b, 0x06}}; -CAN_frame message_50 = { +static constexpr CAN_frame message_50 = { .FD = true, .ext_ID = false, .DLC = 32, .ID = 0x320, .data = {0x80, 0xf2, 0x27, 0x41, 0x00, 0x00, 0x01, 0x3c, 0xac, 0x0d, 0x40, 0x20, 0x05, 0xc8, 0xa0, 0x03, 0x40, 0x20, 0x2b, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; -CAN_frame message_51 = { +static constexpr CAN_frame message_51 = { .FD = true, .ext_ID = false, .DLC = 32, @@ -531,7 +531,7 @@ CAN_frame message_51 = { .data = {0x9e, 0x87, 0x98, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x01, 0x00, 0x00, 0x36, 0x39, 0x35, 0x35, 0xc9, 0x02, 0x00, 0x00, 0x10, 0x00, 0x00, 0x35, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00}}; -CAN_frame message_52 = { +static constexpr CAN_frame message_52 = { .FD = true, .ext_ID = false, .DLC = 32, @@ -539,7 +539,7 @@ CAN_frame message_52 = { .data = {0x28, 0xaa, 0x98, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x01, 0x00, 0x00, 0x37, 0x35, 0x37, 0x37, 0xc9, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00}}; -CAN_frame message_53 = { +static constexpr CAN_frame message_53 = { .FD = true, .ext_ID = false, .DLC = 32, @@ -547,7 +547,7 @@ CAN_frame message_53 = { .data = {0x98, 0x3c, 0x87, 0x55, 0x44, 0x64, 0xd8, 0x1b, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x11, 0x52, 0x00, 0x12, 0x02, 0x64, 0x00, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00}}; -CAN_frame message_54 = { +static constexpr CAN_frame message_54 = { .FD = true, .ext_ID = false, .DLC = 32, @@ -555,7 +555,7 @@ CAN_frame message_54 = { .data = {0xd8, 0xde, 0x99, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x01, 0x00, 0x00, 0x36, 0x39, 0x35, 0x35, 0xc9, 0x02, 0x00, 0x00, 0x10, 0x00, 0x00, 0x35, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00}}; -CAN_frame message_55 = { +static constexpr CAN_frame message_55 = { .FD = true, .ext_ID = false, .DLC = 32, @@ -563,7 +563,7 @@ CAN_frame message_55 = { .data = {0x6e, 0xf3, 0x99, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x01, 0x00, 0x00, 0x37, 0x35, 0x37, 0x37, 0xc9, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00}}; -CAN_frame message_56 = { +static constexpr CAN_frame message_56 = { .FD = true, .ext_ID = false, .DLC = 32, @@ -571,7 +571,7 @@ CAN_frame message_56 = { .data = {0x19, 0x48, 0x88, 0x55, 0x44, 0x64, 0xd8, 0x1b, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x11, 0x52, 0x00, 0x12, 0x02, 0x64, 0x00, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00}}; -CAN_frame message_57 = { +static constexpr CAN_frame message_57 = { .FD = true, .ext_ID = false, .DLC = 32, @@ -579,7 +579,7 @@ CAN_frame message_57 = { .data = {0x12, 0x35, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x01, 0x00, 0x00, 0x36, 0x39, 0x35, 0x35, 0xc9, 0x02, 0x00, 0x00, 0x10, 0x00, 0x00, 0x35, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00}}; -CAN_frame message_58 = { +static constexpr CAN_frame message_58 = { .FD = true, .ext_ID = false, .DLC = 32, @@ -587,7 +587,7 @@ CAN_frame message_58 = { .data = {0xa4, 0x18, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x01, 0x00, 0x00, 0x37, 0x35, 0x37, 0x37, 0xc9, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00}}; -CAN_frame message_59 = { +static constexpr CAN_frame message_59 = { .FD = true, .ext_ID = false, .DLC = 32, @@ -595,7 +595,7 @@ CAN_frame message_59 = { .data = {0x5f, 0x11, 0x89, 0x55, 0x44, 0x64, 0xd8, 0x1b, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x11, 0x52, 0x00, 0x12, 0x02, 0x64, 0x00, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00}}; -CAN_frame message_60 = { +static constexpr CAN_frame message_60 = { .FD = true, .ext_ID = false, .DLC = 32, @@ -603,7 +603,7 @@ CAN_frame message_60 = { .data = {0xfb, 0xeb, 0x43, 0x00, 0x00, 0x00, 0x00, 0x80, 0x59, 0x00, 0x2b, 0x00, 0x00, 0x04, 0x00, 0x00, 0xfa, 0xd0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; -CAN_frame message_61 = { +static constexpr CAN_frame message_61 = { .FD = true, .ext_ID = false, .DLC = 32, @@ -611,7 +611,7 @@ CAN_frame message_61 = { .data = {0xcc, 0xcd, 0xa2, 0x21, 0x00, 0xa1, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; -CAN_frame message_62 = { +static constexpr CAN_frame message_62 = { .FD = true, .ext_ID = false, .DLC = 32, @@ -619,29 +619,29 @@ CAN_frame message_62 = { .data = {0x87, 0xab, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x70, 0x01, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; -CAN_frame message_63 = { +static constexpr CAN_frame message_63 = { .FD = true, .ext_ID = false, .DLC = 32, .ID = 0x10A, .data = {0x54, 0x6c, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x01, 0x00, 0x00, 0x36, 0x39, 0x35, 0x35, 0xc9, 0x02, 0x00, 0x00, 0x10, 0x00, 0x00, 0x35, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00}}; -CAN_frame* messages[] = {&message_1, &message_2, &message_3, &message_4, &message_5, &message_6, &message_7, - &message_8, &message_9, &message_10, &message_11, &message_12, &message_13, &message_14, - &message_15, &message_16, &message_17, &message_18, &message_19, &message_20, &message_21, - &message_22, &message_23, &message_24, &message_25, &message_26, &message_27, &message_28, - &message_29, &message_30, &message_31, &message_32, &message_33, &message_34, &message_35, - &message_36, &message_37, &message_38, &message_39, &message_40, &message_41, &message_42, - &message_43, &message_44, &message_45, &message_46, &message_47, &message_48, &message_49, - &message_50, &message_51, &message_52, &message_53, &message_54, &message_55, &message_56, - &message_57, &message_58, &message_59, &message_60, &message_61, &message_62, &message_63}; +static const CAN_frame* messages[] = { + &message_1, &message_2, &message_3, &message_4, &message_5, &message_6, &message_7, &message_8, + &message_9, &message_10, &message_11, &message_12, &message_13, &message_14, &message_15, &message_16, + &message_17, &message_18, &message_19, &message_20, &message_21, &message_22, &message_23, &message_24, + &message_25, &message_26, &message_27, &message_28, &message_29, &message_30, &message_31, &message_32, + &message_33, &message_34, &message_35, &message_36, &message_37, &message_38, &message_39, &message_40, + &message_41, &message_42, &message_43, &message_44, &message_45, &message_46, &message_47, &message_48, + &message_49, &message_50, &message_51, &message_52, &message_53, &message_54, &message_55, &message_56, + &message_57, &message_58, &message_59, &message_60, &message_61, &message_62, &message_63}; /* PID polling messages */ CAN_frame EGMP_7E4 = {.FD = true, .ext_ID = false, .DLC = 8, .ID = 0x7E4, .data = {0x03, 0x22, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00}}; //Poll PID 03 22 01 01 -CAN_frame EGMP_7E4_ack = { +static constexpr CAN_frame EGMP_7E4_ack = { .FD = true, .ext_ID = false, .DLC = 8, diff --git a/Software/src/battery/MEB-BATTERY.h b/Software/src/battery/MEB-BATTERY.h index 18068981..ae484576 100644 --- a/Software/src/battery/MEB-BATTERY.h +++ b/Software/src/battery/MEB-BATTERY.h @@ -361,11 +361,11 @@ class MebBattery : public CanBattery { .DLC = 8, .ID = 0x1C40007B, // SOC 02 8C .data = {0x03, 0x22, 0x02, 0x8C, 0x55, 0x55, 0x55, 0x55}}; - CAN_frame MEB_ACK_FRAME = {.FD = true, - .ext_ID = true, - .DLC = 8, - .ID = 0x1C40007B, // Ack - .data = {0x30, 0x00, 0x00, 0x55, 0x55, 0x55, 0x55, 0x55}}; + static constexpr CAN_frame MEB_ACK_FRAME = {.FD = true, + .ext_ID = true, + .DLC = 8, + .ID = 0x1C40007B, // Ack + .data = {0x30, 0x00, 0x00, 0x55, 0x55, 0x55, 0x55, 0x55}}; //Messages needed for contactor closing CAN_frame MEB_040 = {.FD = true, // Airbag .ext_ID = false, @@ -392,28 +392,28 @@ class MebBattery : public CanBattery { .DLC = 8, .ID = 0x6B2, .data = {0x6A, 0xA7, 0x37, 0x80, 0xC9, 0xBD, 0xF6, 0xC2}}; - CAN_frame MEB_17FC007B_poll = {.FD = true, // Non period request - .ext_ID = true, - .DLC = 8, - .ID = 0x17FC007B, - .data = {0x03, 0x22, 0x1E, 0x3D, 0x55, 0x55, 0x55, 0x55}}; + static constexpr CAN_frame MEB_17FC007B_poll = {.FD = true, // Non period request + .ext_ID = true, + .DLC = 8, + .ID = 0x17FC007B, + .data = {0x03, 0x22, 0x1E, 0x3D, 0x55, 0x55, 0x55, 0x55}}; CAN_frame MEB_1A5555A6 = {.FD = true, .ext_ID = true, .DLC = 8, .ID = 0x1A5555A6, .data = {0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00}}; - CAN_frame MEB_585 = { + static constexpr CAN_frame MEB_585 = { .FD = true, .ext_ID = false, .DLC = 8, .ID = 0x585, .data = {0xCF, 0x38, 0xAF, 0x5B, 0x25, 0x00, 0x00, 0x00}}; // CF 38 AF 5B 25 00 00 00 in start4.log // .data = {0xCF, 0x38, 0x20, 0x02, 0x25, 0xF7, 0x30, 0x00}}; // CF 38 AF 5B 25 00 00 00 in start4.log - CAN_frame MEB_5F5 = {.FD = true, - .ext_ID = false, - .DLC = 8, - .ID = 0x5F5, - .data = {0x23, 0x02, 0x39, 0xC0, 0x1B, 0x8B, 0xC8, 0x1B}}; + static constexpr CAN_frame MEB_5F5 = {.FD = true, + .ext_ID = false, + .DLC = 8, + .ID = 0x5F5, + .data = {0x23, 0x02, 0x39, 0xC0, 0x1B, 0x8B, 0xC8, 0x1B}}; CAN_frame MEB_641 = {.FD = true, .ext_ID = false, .DLC = 8, @@ -429,56 +429,56 @@ class MebBattery : public CanBattery { .DLC = 8, .ID = 0x0FD, //CRC and counter, otherwise static .data = {0x5F, 0xD0, 0x1F, 0x81, 0x00, 0x00, 0x00, 0x00}}; - CAN_frame MEB_16A954FB = {.FD = true, - .ext_ID = true, - .DLC = 8, - .ID = 0x16A954FB, - .data = {0x00, 0xC0, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00}}; - CAN_frame MEB_1A555548 = {.FD = true, - .ext_ID = true, - .DLC = 8, - .ID = 0x1A555548, - .data = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; - CAN_frame MEB_1A55552B = {.FD = true, - .ext_ID = true, - .DLC = 8, - .ID = 0x1A55552B, - .data = {0x00, 0x00, 0x00, 0xA0, 0x02, 0x04, 0x00, 0x30}}; - CAN_frame MEB_569 = {.FD = true, - .ext_ID = false, - .DLC = 8, - .ID = 0x569, //HVEM - .data = {0x00, 0x00, 0x01, 0x3A, 0x00, 0x00, 0x00, 0x00}}; - CAN_frame MEB_16A954B4 = {.FD = true, - .ext_ID = true, - .DLC = 8, - .ID = 0x16A954B4, //eTM - .data = {0xFE, 0xB6, 0x0D, 0x00, 0x00, 0xD5, 0x48, 0xFD}}; - CAN_frame MEB_1B000046 = {.FD = false, // Not FD - .ext_ID = true, - .DLC = 8, - .ID = 0x1B000046, // Klima - .data = {0x00, 0x40, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00}}; - CAN_frame MEB_1B000010 = {.FD = false, // Not FD - .ext_ID = true, - .DLC = 8, - .ID = 0x1B000010, // Gateway - .data = {0x00, 0x50, 0x08, 0x50, 0x01, 0xFF, 0x30, 0x00}}; - CAN_frame MEB_1B0000B9 = {.FD = false, // Not FD - .ext_ID = true, - .DLC = 8, - .ID = 0x1B0000B9, //DC/DC converter - .data = {0x00, 0x40, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00}}; - CAN_frame MEB_153 = {.FD = true, - .ext_ID = false, - .DLC = 8, - .ID = 0x153, // content - .data = {0x00, 0x00, 0x00, 0xFF, 0xEF, 0xFE, 0xFF, 0xFF}}; - CAN_frame MEB_5E1 = {.FD = true, - .ext_ID = false, - .DLC = 8, - .ID = 0x5E1, // content - .data = {0x7F, 0x2A, 0x00, 0x60, 0xFE, 0x00, 0x00, 0x00}}; + static constexpr CAN_frame MEB_16A954FB = {.FD = true, + .ext_ID = true, + .DLC = 8, + .ID = 0x16A954FB, + .data = {0x00, 0xC0, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00}}; + static constexpr CAN_frame MEB_1A555548 = {.FD = true, + .ext_ID = true, + .DLC = 8, + .ID = 0x1A555548, + .data = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; + static constexpr CAN_frame MEB_1A55552B = {.FD = true, + .ext_ID = true, + .DLC = 8, + .ID = 0x1A55552B, + .data = {0x00, 0x00, 0x00, 0xA0, 0x02, 0x04, 0x00, 0x30}}; + static constexpr CAN_frame MEB_569 = {.FD = true, + .ext_ID = false, + .DLC = 8, + .ID = 0x569, //HVEM + .data = {0x00, 0x00, 0x01, 0x3A, 0x00, 0x00, 0x00, 0x00}}; + static constexpr CAN_frame MEB_16A954B4 = {.FD = true, + .ext_ID = true, + .DLC = 8, + .ID = 0x16A954B4, //eTM + .data = {0xFE, 0xB6, 0x0D, 0x00, 0x00, 0xD5, 0x48, 0xFD}}; + static constexpr CAN_frame MEB_1B000046 = {.FD = false, // Not FD + .ext_ID = true, + .DLC = 8, + .ID = 0x1B000046, // Klima + .data = {0x00, 0x40, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00}}; + static constexpr CAN_frame MEB_1B000010 = {.FD = false, // Not FD + .ext_ID = true, + .DLC = 8, + .ID = 0x1B000010, // Gateway + .data = {0x00, 0x50, 0x08, 0x50, 0x01, 0xFF, 0x30, 0x00}}; + static constexpr CAN_frame MEB_1B0000B9 = {.FD = false, // Not FD + .ext_ID = true, + .DLC = 8, + .ID = 0x1B0000B9, //DC/DC converter + .data = {0x00, 0x40, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00}}; + static constexpr CAN_frame MEB_153 = {.FD = true, + .ext_ID = false, + .DLC = 8, + .ID = 0x153, // content + .data = {0x00, 0x00, 0x00, 0xFF, 0xEF, 0xFE, 0xFF, 0xFF}}; + static constexpr CAN_frame MEB_5E1 = {.FD = true, + .ext_ID = false, + .DLC = 8, + .ID = 0x5E1, // content + .data = {0x7F, 0x2A, 0x00, 0x60, 0xFE, 0x00, 0x00, 0x00}}; CAN_frame MEB_3BE = {.FD = true, .ext_ID = false, .DLC = 8, diff --git a/Software/src/battery/TESLA-BATTERY.h b/Software/src/battery/TESLA-BATTERY.h index f3582594..bafdff3f 100644 --- a/Software/src/battery/TESLA-BATTERY.h +++ b/Software/src/battery/TESLA-BATTERY.h @@ -121,25 +121,25 @@ class TeslaBattery : public CanBattery { uint16_t previous_max_percentage = datalayer.battery.settings.max_percentage; //0x082 UI_tripPlanning: "cycle_time" 1000ms - CAN_frame TESLA_082 = {.FD = false, - .ext_ID = false, - .DLC = 8, - .ID = 0x082, - .data = {0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80}}; + static constexpr CAN_frame TESLA_082 = {.FD = false, + .ext_ID = false, + .DLC = 8, + .ID = 0x082, + .data = {0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80}}; //0x102 VCLEFT_doorStatus: "cycle_time" 100ms - CAN_frame TESLA_102 = {.FD = false, - .ext_ID = false, - .DLC = 8, - .ID = 0x102, - .data = {0x22, 0x33, 0x00, 0x00, 0xC0, 0x38, 0x21, 0x08}}; + static constexpr CAN_frame TESLA_102 = {.FD = false, + .ext_ID = false, + .DLC = 8, + .ID = 0x102, + .data = {0x22, 0x33, 0x00, 0x00, 0xC0, 0x38, 0x21, 0x08}}; //0x103 VCRIGHT_doorStatus: "cycle_time" 100ms - CAN_frame TESLA_103 = {.FD = false, - .ext_ID = false, - .DLC = 8, - .ID = 0x103, - .data = {0x22, 0x33, 0x00, 0x00, 0x30, 0xF2, 0x20, 0x02}}; + static constexpr CAN_frame TESLA_103 = {.FD = false, + .ext_ID = false, + .DLC = 8, + .ID = 0x103, + .data = {0x22, 0x33, 0x00, 0x00, 0x30, 0xF2, 0x20, 0x02}}; //0x118 DI_systemStatus: "cycle_time" 50ms, DI_systemStatusChecksum/DI_systemStatusCounter generated via generateFrameCounterChecksum CAN_frame TESLA_118 = {.FD = false, @@ -229,22 +229,22 @@ class TeslaBattery : public CanBattery { CAN_frame TESLA_229 = {.FD = false, .ext_ID = false, .DLC = 3, .ID = 0x229, .data = {0x46, 0x00, 0x00}}; //0x241 VCFRONT_coolant: "cycle_time" 100ms - CAN_frame TESLA_241 = {.FD = false, - .ext_ID = false, - .DLC = 7, - .ID = 0x241, - .data = {0x35, 0x34, 0x0C, 0x0F, 0x8F, 0x55, 0x00}}; + static constexpr CAN_frame TESLA_241 = {.FD = false, + .ext_ID = false, + .DLC = 7, + .ID = 0x241, + .data = {0x35, 0x34, 0x0C, 0x0F, 0x8F, 0x55, 0x00}}; //0x2D1 VCFRONT_okToUseHighPower: "cycle_time" 100ms - CAN_frame TESLA_2D1 = {.FD = false, .ext_ID = false, .DLC = 2, .ID = 0x2D1, .data = {0xFF, 0x01}}; + static constexpr CAN_frame TESLA_2D1 = {.FD = false, .ext_ID = false, .DLC = 2, .ID = 0x2D1, .data = {0xFF, 0x01}}; //0x2E1, 6 muxes //0x2E1 VCFRONT_status: "cycle_time" 10ms each mux/statusIndex - CAN_frame TESLA_2E1_VEHICLE_AND_RAILS = {.FD = false, - .ext_ID = false, - .DLC = 8, - .ID = 0x2E1, - .data = {0x29, 0x0A, 0x00, 0xFF, 0x0F, 0x00, 0x00, 0x00}}; + static constexpr CAN_frame TESLA_2E1_VEHICLE_AND_RAILS = {.FD = false, + .ext_ID = false, + .DLC = 8, + .ID = 0x2E1, + .data = {0x29, 0x0A, 0x00, 0xFF, 0x0F, 0x00, 0x00, 0x00}}; //{0x29, 0x0A, 0x00, 0xFF, 0x0F, 0x00, 0x00, 0x00} INIT //{0x29, 0x0A, 0x0D, 0xFF, 0x0F, 0x00, 0x00, 0x00} DRIVE @@ -253,39 +253,39 @@ class TeslaBattery : public CanBattery { //{0x29, 0x0A, 0x06, 0xFF, 0x0F, 0x00, 0x00, 0x00} SLEEP_STANDBY //0x2E1 VCFRONT_status: "cycle_time" 10ms each mux/statusIndex - CAN_frame TESLA_2E1_HOMELINK = {.FD = false, - .ext_ID = false, - .DLC = 8, - .ID = 0x2E1, - .data = {0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00}}; + static constexpr CAN_frame TESLA_2E1_HOMELINK = {.FD = false, + .ext_ID = false, + .DLC = 8, + .ID = 0x2E1, + .data = {0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00}}; //0x2E1 VCFRONT_status: "cycle_time" 10ms each mux/statusIndex - CAN_frame TESLA_2E1_REFRIGERANT_SYSTEM = {.FD = false, - .ext_ID = false, - .DLC = 8, - .ID = 0x2E1, - .data = {0x03, 0x6D, 0x99, 0x02, 0x1B, 0x57, 0x00, 0x00}}; + static constexpr CAN_frame TESLA_2E1_REFRIGERANT_SYSTEM = {.FD = false, + .ext_ID = false, + .DLC = 8, + .ID = 0x2E1, + .data = {0x03, 0x6D, 0x99, 0x02, 0x1B, 0x57, 0x00, 0x00}}; //0x2E1 VCFRONT_status: "cycle_time" 10ms each mux/statusIndex - CAN_frame TESLA_2E1_LV_BATTERY_DEBUG = {.FD = false, - .ext_ID = false, - .DLC = 8, - .ID = 0x2E1, - .data = {0xFC, 0x1B, 0xD1, 0x99, 0x9A, 0xD8, 0x09, 0x00}}; + static constexpr CAN_frame TESLA_2E1_LV_BATTERY_DEBUG = {.FD = false, + .ext_ID = false, + .DLC = 8, + .ID = 0x2E1, + .data = {0xFC, 0x1B, 0xD1, 0x99, 0x9A, 0xD8, 0x09, 0x00}}; //0x2E1 VCFRONT_status: "cycle_time" 10ms each mux/statusIndex - CAN_frame TESLA_2E1_MUX_5 = {.FD = false, - .ext_ID = false, - .DLC = 8, - .ID = 0x2E1, - .data = {0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; + static constexpr CAN_frame TESLA_2E1_MUX_5 = {.FD = false, + .ext_ID = false, + .DLC = 8, + .ID = 0x2E1, + .data = {0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; //0x2E1 VCFRONT_status: "cycle_time" 10ms each mux/statusIndex - CAN_frame TESLA_2E1_BODY_CONTROLS = {.FD = false, - .ext_ID = false, - .DLC = 8, - .ID = 0x2E1, - .data = {0x08, 0x21, 0x04, 0x6E, 0xA0, 0x88, 0x06, 0x04}}; + static constexpr CAN_frame TESLA_2E1_BODY_CONTROLS = {.FD = false, + .ext_ID = false, + .DLC = 8, + .ID = 0x2E1, + .data = {0x08, 0x21, 0x04, 0x6E, 0xA0, 0x88, 0x06, 0x04}}; //0x2E8 EPBR_status: "cycle_time" 100ms CAN_frame TESLA_2E8 = {.FD = false, @@ -295,7 +295,11 @@ class TeslaBattery : public CanBattery { .data = {0x02, 0x00, 0x10, 0x00, 0x00, 0x80, 0x00, 0x6C}}; //0x284 UI_vehicleModes: "cycle_time" 500ms - CAN_frame TESLA_284 = {.FD = false, .ext_ID = false, .DLC = 5, .ID = 0x284, .data = {0x10, 0x00, 0x00, 0x00, 0x00}}; + static constexpr CAN_frame TESLA_284 = {.FD = false, + .ext_ID = false, + .DLC = 5, + .ID = 0x284, + .data = {0x10, 0x00, 0x00, 0x00, 0x00}}; //0x293 UI_chassisControl: "cycle_time" 500ms, UI_chassisControlChecksum/UI_chassisControlCounter generated via generateFrameCounterChecksum CAN_frame TESLA_293 = {.FD = false, @@ -307,7 +311,7 @@ class TeslaBattery : public CanBattery { //0x3A1 VCFRONT_vehicleStatus: "cycle_time" 50ms, VCFRONT_vehicleStatusChecksum/VCFRONT_vehicleStatusCounter eventually need to be generated via generateMuxFrameCounterChecksum //Looks like 2 muxes, counter at bit 52 width 4 and checksum at bit 56 width 8? Need later software Model3_ETH.compact.json signal file or DBC. //Migrated to an array until figured out - CAN_frame TESLA_3A1[16] = { + static constexpr CAN_frame TESLA_3A1[16] = { {.FD = false, .ext_ID = false, .DLC = 8, .ID = 0x3A1, .data = {0xC3, 0xFF, 0xFF, 0xFF, 0x3D, 0x00, 0xD0, 0x01}}, {.FD = false, .ext_ID = false, .DLC = 8, .ID = 0x3A1, .data = {0x08, 0x62, 0x0B, 0x18, 0x00, 0x28, 0xE2, 0xCB}}, {.FD = false, .ext_ID = false, .DLC = 8, .ID = 0x3A1, .data = {0xC3, 0xFF, 0xFF, 0xFF, 0x3D, 0x00, 0xF0, 0x21}}, @@ -344,11 +348,11 @@ class TeslaBattery : public CanBattery { CAN_frame TESLA_333 = {.FD = false, .ext_ID = false, .DLC = 5, .ID = 0x333, .data = {0x84, 0x30, 0x84, 0x07, 0x02}}; //0x334 UI request: "cycle_time" 500ms, initial frame car sends - CAN_frame TESLA_334_INITIAL = {.FD = false, - .ext_ID = false, - .DLC = 8, - .ID = 0x334, - .data = {0x3F, 0x3F, 0xC8, 0x00, 0xE2, 0x3F, 0x80, 0x1E}}; + static constexpr CAN_frame TESLA_334_INITIAL = {.FD = false, + .ext_ID = false, + .DLC = 8, + .ID = 0x334, + .data = {0x3F, 0x3F, 0xC8, 0x00, 0xE2, 0x3F, 0x80, 0x1E}}; //0x334 UI request: "cycle_time" 500ms, generated via generateFrameCounterChecksum CAN_frame TESLA_334 = {.FD = false, @@ -358,49 +362,49 @@ class TeslaBattery : public CanBattery { .data = {0x3F, 0x3F, 0x00, 0x0F, 0xE2, 0x3F, 0x90, 0x75}}; //0x3B3 UI_vehicleControl2: "cycle_time" 500ms - CAN_frame TESLA_3B3 = {.FD = false, - .ext_ID = false, - .DLC = 8, - .ID = 0x3B3, - .data = {0x90, 0x80, 0x05, 0x08, 0x00, 0x00, 0x00, 0x01}}; + static constexpr CAN_frame TESLA_3B3 = {.FD = false, + .ext_ID = false, + .DLC = 8, + .ID = 0x3B3, + .data = {0x90, 0x80, 0x05, 0x08, 0x00, 0x00, 0x00, 0x01}}; //0x39D IBST_status: "cycle_time" 50ms, IBST_statusChecksum/IBST_statusCounter generated via generateFrameCounterChecksum CAN_frame TESLA_39D = {.FD = false, .ext_ID = false, .DLC = 5, .ID = 0x39D, .data = {0xE1, 0x59, 0xC1, 0x27, 0x00}}; //0x3C2 VCLEFT_switchStatus (Mux0, initial frame car sends): "cycle_time" 50ms, sent once - CAN_frame TESLA_3C2_INITIAL = {.FD = false, - .ext_ID = false, - .DLC = 8, - .ID = 0x3C2, - .data = {0x00, 0x55, 0x55, 0x55, 0x00, 0x00, 0x5A, 0x05}}; + static constexpr CAN_frame TESLA_3C2_INITIAL = {.FD = false, + .ext_ID = false, + .DLC = 8, + .ID = 0x3C2, + .data = {0x00, 0x55, 0x55, 0x55, 0x00, 0x00, 0x5A, 0x05}}; //0x3C2 VCLEFT_switchStatus (Mux0): "cycle_time" 50ms each mux/SwitchStatusIndex - CAN_frame TESLA_3C2_Mux0 = {.FD = false, - .ext_ID = false, - .DLC = 8, - .ID = 0x3C2, - .data = {0x00, 0x55, 0x55, 0x55, 0x00, 0x00, 0x5A, 0x45}}; + static constexpr CAN_frame TESLA_3C2_Mux0 = {.FD = false, + .ext_ID = false, + .DLC = 8, + .ID = 0x3C2, + .data = {0x00, 0x55, 0x55, 0x55, 0x00, 0x00, 0x5A, 0x45}}; //0x3C2 VCLEFT_switchStatus (Mux1): "cycle_time" 50ms each mux/SwitchStatusIndex - CAN_frame TESLA_3C2_Mux1 = {.FD = false, - .ext_ID = false, - .DLC = 8, - .ID = 0x3C2, - .data = {0x29, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; + static constexpr CAN_frame TESLA_3C2_Mux1 = {.FD = false, + .ext_ID = false, + .DLC = 8, + .ID = 0x3C2, + .data = {0x29, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; //0x504 Initially sent - CAN_frame TESLA_504_INITIAL = {.FD = false, - .ext_ID = false, - .DLC = 8, - .ID = 0x504, - .data = {0x00, 0x1B, 0x06, 0x03, 0x00, 0x01, 0x00, 0x01}}; + static constexpr CAN_frame TESLA_504_INITIAL = {.FD = false, + .ext_ID = false, + .DLC = 8, + .ID = 0x504, + .data = {0x00, 0x1B, 0x06, 0x03, 0x00, 0x01, 0x00, 0x01}}; //0x55A Unknown but always sent: "cycle_time" 500ms - CAN_frame TESLA_55A = {.FD = false, - .ext_ID = false, - .DLC = 8, - .ID = 0x55A, - .data = {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; + static constexpr CAN_frame TESLA_55A = {.FD = false, + .ext_ID = false, + .DLC = 8, + .ID = 0x55A, + .data = {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; //0x7FF GTW_carConfig: "cycle_time" 100ms each mux/carConfigMultiplexer (UK/RHD) CAN_frame TESLA_7FF_Mux1 = {.FD = false, @@ -410,11 +414,11 @@ class TeslaBattery : public CanBattery { .data = {0x01, 0x49, 0x42, 0x47, 0x00, 0x03, 0x15, 0x01}}; //0x7FF GTW_carConfig: "cycle_time" 100ms each mux/carConfigMultiplexer - CAN_frame TESLA_7FF_Mux2 = {.FD = false, - .ext_ID = false, - .DLC = 8, - .ID = 0x7FF, - .data = {0x02, 0x66, 0x32, 0x24, 0x04, 0x49, 0x95, 0x82}}; + static constexpr CAN_frame TESLA_7FF_Mux2 = {.FD = false, + .ext_ID = false, + .DLC = 8, + .ID = 0x7FF, + .data = {0x02, 0x66, 0x32, 0x24, 0x04, 0x49, 0x95, 0x82}}; //0x7FF GTW_carConfig: "cycle_time" 100ms each mux/carConfigMultiplexer (EU/Long Range) CAN_frame TESLA_7FF_Mux3 = {.FD = false, @@ -424,46 +428,46 @@ class TeslaBattery : public CanBattery { .data = {0x03, 0x01, 0x08, 0x48, 0x01, 0x00, 0x00, 0x12}}; //0x7FF GTW_carConfig: "cycle_time" 100ms each mux/carConfigMultiplexer - CAN_frame TESLA_7FF_Mux4 = {.FD = false, - .ext_ID = false, - .DLC = 8, - .ID = 0x7FF, - .data = {0x04, 0x73, 0x03, 0x67, 0x5C, 0x00, 0x00, 0x00}}; + static constexpr CAN_frame TESLA_7FF_Mux4 = {.FD = false, + .ext_ID = false, + .DLC = 8, + .ID = 0x7FF, + .data = {0x04, 0x73, 0x03, 0x67, 0x5C, 0x00, 0x00, 0x00}}; //0x7FF GTW_carConfig: "cycle_time" 100ms each mux/carConfigMultiplexer - CAN_frame TESLA_7FF_Mux5 = {.FD = false, - .ext_ID = false, - .DLC = 8, - .ID = 0x7FF, - .data = {0x05, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00}}; + static constexpr CAN_frame TESLA_7FF_Mux5 = {.FD = false, + .ext_ID = false, + .DLC = 8, + .ID = 0x7FF, + .data = {0x05, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00}}; //0x7FF GTW_carConfig: "cycle_time" 100ms each mux/carConfigMultiplexer - later firmware has muxes 6 & 7, needed? - CAN_frame TESLA_7FF_Mux6 = {.FD = false, - .ext_ID = false, - .DLC = 8, - .ID = 0x7FF, - .data = {0x06, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0xD0}}; + static constexpr CAN_frame TESLA_7FF_Mux6 = {.FD = false, + .ext_ID = false, + .DLC = 8, + .ID = 0x7FF, + .data = {0x06, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0xD0}}; //0x7FF GTW_carConfig: "cycle_time" 100ms each mux/carConfigMultiplexer - later firmware has muxes 6 & 7, needed? - CAN_frame TESLA_7FF_Mux7 = {.FD = false, - .ext_ID = false, - .DLC = 8, - .ID = 0x7FF, - .data = {0x07, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00}}; + static constexpr CAN_frame TESLA_7FF_Mux7 = {.FD = false, + .ext_ID = false, + .DLC = 8, + .ID = 0x7FF, + .data = {0x07, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00}}; //0x722 BMS_bmbKeepAlive: "cycle_time" 100ms, should only be sent when testing packs or diagnosing problems - CAN_frame TESLA_722 = {.FD = false, - .ext_ID = false, - .DLC = 8, - .ID = 0x722, - .data = {0x02, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}}; + static constexpr CAN_frame TESLA_722 = {.FD = false, + .ext_ID = false, + .DLC = 8, + .ID = 0x722, + .data = {0x02, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}}; //0x25D CP_status: "cycle_time" 100ms, stops some cpMia errors, but not necessary for standalone pack operation so not used/necessary. Note CP_type for different regions, the below has "IEC_CCS" - CAN_frame TESLA_25D = {.FD = false, - .ext_ID = false, - .DLC = 8, - .ID = 0x25D, - .data = {0x37, 0x41, 0x01, 0x16, 0x08, 0x00, 0x00, 0x00}}; + static constexpr CAN_frame TESLA_25D = {.FD = false, + .ext_ID = false, + .DLC = 8, + .ID = 0x25D, + .data = {0x37, 0x41, 0x01, 0x16, 0x08, 0x00, 0x00, 0x00}}; //0x602 BMS UDS diagnostic request: on demand CAN_frame TESLA_602 = {.FD = false, @@ -473,11 +477,12 @@ class TeslaBattery : public CanBattery { .data = {0x02, 0x27, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00}}; // Define initial UDS request //0x610 BMS Query UDS request: on demand - CAN_frame TESLA_610 = {.FD = false, - .ext_ID = false, - .DLC = 8, - .ID = 0x610, - .data = {0x02, 0x10, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00}}; // Define initial UDS request + static constexpr CAN_frame TESLA_610 = { + .FD = false, + .ext_ID = false, + .DLC = 8, + .ID = 0x610, + .data = {0x02, 0x10, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00}}; // Define initial UDS request uint8_t stateMachineClearIsolationFault = 0xFF; uint8_t stateMachineBMSReset = 0xFF; diff --git a/Software/src/communication/can/comm_can.cpp b/Software/src/communication/can/comm_can.cpp index 352bdb5e..4efec199 100644 --- a/Software/src/communication/can/comm_can.cpp +++ b/Software/src/communication/can/comm_can.cpp @@ -193,7 +193,7 @@ bool init_CAN() { return true; } -void transmit_can_frame_to_interface(CAN_frame* tx_frame, int interface) { +void transmit_can_frame_to_interface(const CAN_frame* tx_frame, int interface) { if (!allowed_to_send_CAN) { return; } diff --git a/Software/src/communication/can/comm_can.h b/Software/src/communication/can/comm_can.h index 16452260..6e8e6a4b 100644 --- a/Software/src/communication/can/comm_can.h +++ b/Software/src/communication/can/comm_can.h @@ -6,7 +6,7 @@ extern bool use_canfd_as_can; void dump_can_frame(CAN_frame& frame, frameDirection msgDir); -void transmit_can_frame_to_interface(CAN_frame* tx_frame, int interface); +void transmit_can_frame_to_interface(const CAN_frame* tx_frame, int interface); class CanReceiver; diff --git a/test/emul/can.cpp b/test/emul/can.cpp index 5f87be48..caabf015 100644 --- a/test/emul/can.cpp +++ b/test/emul/can.cpp @@ -1,7 +1,7 @@ #include "../../Software/src/communication/Transmitter.h" #include "../../Software/src/communication/can/comm_can.h" -void transmit_can_frame_to_interface(CAN_frame* tx_frame, int interface) {} +void transmit_can_frame_to_interface(const CAN_frame* tx_frame, int interface) {} void register_can_receiver(CanReceiver* receiver, CAN_Interface interface, CAN_Speed speed) {}