Optimize CAN handler for faster execution

This commit is contained in:
Daniel Öster 2025-10-01 21:46:08 +03:00
parent f9109d0348
commit 163af330d7
2 changed files with 36 additions and 78 deletions

View file

@ -1813,31 +1813,26 @@ void TeslaBattery::transmit_can(unsigned long currentMillis) {
switch (muxNumber_TESLA_2E1) { switch (muxNumber_TESLA_2E1) {
case 0: case 0:
transmit_can_frame(&TESLA_2E1_VEHICLE_AND_RAILS); transmit_can_frame(&TESLA_2E1_VEHICLE_AND_RAILS);
muxNumber_TESLA_2E1++;
break; break;
case 1: case 1:
transmit_can_frame(&TESLA_2E1_HOMELINK); transmit_can_frame(&TESLA_2E1_HOMELINK);
muxNumber_TESLA_2E1++;
break; break;
case 2: case 2:
transmit_can_frame(&TESLA_2E1_REFRIGERANT_SYSTEM); transmit_can_frame(&TESLA_2E1_REFRIGERANT_SYSTEM);
muxNumber_TESLA_2E1++;
break; break;
case 3: case 3:
transmit_can_frame(&TESLA_2E1_LV_BATTERY_DEBUG); transmit_can_frame(&TESLA_2E1_LV_BATTERY_DEBUG);
muxNumber_TESLA_2E1++;
break; break;
case 4: case 4:
transmit_can_frame(&TESLA_2E1_MUX_5); transmit_can_frame(&TESLA_2E1_MUX_5);
muxNumber_TESLA_2E1++;
break; break;
case 5: case 5:
transmit_can_frame(&TESLA_2E1_BODY_CONTROLS); transmit_can_frame(&TESLA_2E1_BODY_CONTROLS);
muxNumber_TESLA_2E1 = 0;
break; break;
default: default:
break; break;
} }
muxNumber_TESLA_2E1 = (muxNumber_TESLA_2E1 + 1) % 6; //Cycle betweeen 0-1-2-3-4-5-0...
//Generate next frames //Generate next frames
generateFrameCounterChecksum(TESLA_118, 8, 4, 0, 8); generateFrameCounterChecksum(TESLA_118, 8, 4, 0, 8);
} }
@ -1848,75 +1843,45 @@ void TeslaBattery::transmit_can(unsigned long currentMillis) {
//0x221 VCFRONT_LVPowerState //0x221 VCFRONT_LVPowerState
if (vehicleState == CAR_DRIVE) { if (vehicleState == CAR_DRIVE) {
switch (muxNumber_TESLA_221) { if (alternateMux) {
case 0: generateMuxFrameCounterChecksum(TESLA_221_DRIVE_Mux0, frameCounter_TESLA_221, 52, 4, 56, 8);
generateMuxFrameCounterChecksum(TESLA_221_DRIVE_Mux0, frameCounter_TESLA_221, 52, 4, 56, 8); transmit_can_frame(&TESLA_221_DRIVE_Mux0);
transmit_can_frame(&TESLA_221_DRIVE_Mux0); } else {
muxNumber_TESLA_221++; generateMuxFrameCounterChecksum(TESLA_221_DRIVE_Mux1, frameCounter_TESLA_221, 52, 4, 56, 8);
break; transmit_can_frame(&TESLA_221_DRIVE_Mux1);
case 1: }
generateMuxFrameCounterChecksum(TESLA_221_DRIVE_Mux1, frameCounter_TESLA_221, 52, 4, 56, 8); } else if (vehicleState == ACCESSORY) {
transmit_can_frame(&TESLA_221_DRIVE_Mux1); if (alternateMux) {
muxNumber_TESLA_221 = 0; generateMuxFrameCounterChecksum(TESLA_221_ACCESSORY_Mux0, frameCounter_TESLA_221, 52, 4, 56, 8);
break; transmit_can_frame(&TESLA_221_ACCESSORY_Mux0);
default: } else {
break; generateMuxFrameCounterChecksum(TESLA_221_ACCESSORY_Mux1, frameCounter_TESLA_221, 52, 4, 56, 8);
} transmit_can_frame(&TESLA_221_ACCESSORY_Mux1);
} }
if (vehicleState == ACCESSORY) { } else if (vehicleState == GOING_DOWN) {
switch (muxNumber_TESLA_221) { if (alternateMux) {
case 0: generateMuxFrameCounterChecksum(TESLA_221_GOING_DOWN_Mux0, frameCounter_TESLA_221, 52, 4, 56, 8);
generateMuxFrameCounterChecksum(TESLA_221_ACCESSORY_Mux0, frameCounter_TESLA_221, 52, 4, 56, 8); transmit_can_frame(&TESLA_221_GOING_DOWN_Mux0);
transmit_can_frame(&TESLA_221_ACCESSORY_Mux0); } else {
muxNumber_TESLA_221++; generateMuxFrameCounterChecksum(TESLA_221_GOING_DOWN_Mux1, frameCounter_TESLA_221, 52, 4, 56, 8);
break; transmit_can_frame(&TESLA_221_GOING_DOWN_Mux1);
case 1: }
generateMuxFrameCounterChecksum(TESLA_221_ACCESSORY_Mux1, frameCounter_TESLA_221, 52, 4, 56, 8); } else if (vehicleState == CAR_OFF) {
transmit_can_frame(&TESLA_221_ACCESSORY_Mux1); if (alternateMux) {
muxNumber_TESLA_221 = 0; generateMuxFrameCounterChecksum(TESLA_221_OFF_Mux0, frameCounter_TESLA_221, 52, 4, 56, 8);
break; transmit_can_frame(&TESLA_221_OFF_Mux0);
default: } else {
break; generateMuxFrameCounterChecksum(TESLA_221_OFF_Mux1, frameCounter_TESLA_221, 52, 4, 56, 8);
} transmit_can_frame(&TESLA_221_OFF_Mux1);
}
if (vehicleState == GOING_DOWN) {
switch (muxNumber_TESLA_221) {
case 0:
generateMuxFrameCounterChecksum(TESLA_221_GOING_DOWN_Mux0, frameCounter_TESLA_221, 52, 4, 56, 8);
transmit_can_frame(&TESLA_221_GOING_DOWN_Mux0);
muxNumber_TESLA_221++;
break;
case 1:
generateMuxFrameCounterChecksum(TESLA_221_GOING_DOWN_Mux1, frameCounter_TESLA_221, 52, 4, 56, 8);
transmit_can_frame(&TESLA_221_GOING_DOWN_Mux1);
muxNumber_TESLA_221 = 0;
break;
default:
break;
}
}
if (vehicleState == CAR_OFF) {
switch (muxNumber_TESLA_221) {
case 0:
generateMuxFrameCounterChecksum(TESLA_221_OFF_Mux0, frameCounter_TESLA_221, 52, 4, 56, 8);
transmit_can_frame(&TESLA_221_OFF_Mux0);
muxNumber_TESLA_221++;
break;
case 1:
generateMuxFrameCounterChecksum(TESLA_221_OFF_Mux1, frameCounter_TESLA_221, 52, 4, 56, 8);
transmit_can_frame(&TESLA_221_OFF_Mux1);
muxNumber_TESLA_221 = 0;
break;
default:
break;
} }
} }
alternateMux ^= 1; // Flips between 0 and 1. Used to Flip between sending Mux0 and Mux1 on each pass
//Generate next new frame //Generate next new frame
frameCounter_TESLA_221 = (frameCounter_TESLA_221 + 1) % 16; frameCounter_TESLA_221 = (frameCounter_TESLA_221 + 1) % 16;
//0x3C2 VCLEFT_switchStatus //0x3C2 VCLEFT_switchStatus
transmit_can_frame(muxNumber_TESLA_3C2 == 0 ? &TESLA_3C2_Mux0 : &TESLA_3C2_Mux1); transmit_can_frame(alternateMux == 0 ? &TESLA_3C2_Mux0 : &TESLA_3C2_Mux1);
muxNumber_TESLA_3C2 = !muxNumber_TESLA_3C2; // Flip between sending Mux0 and Mux1 on each pass
//0x39D IBST_status //0x39D IBST_status
transmit_can_frame(&TESLA_39D); transmit_can_frame(&TESLA_39D);
@ -1956,28 +1921,23 @@ void TeslaBattery::transmit_can(unsigned long currentMillis) {
switch (muxNumber_TESLA_7FF) { switch (muxNumber_TESLA_7FF) {
case 0: case 0:
transmit_can_frame(&TESLA_7FF_Mux1); transmit_can_frame(&TESLA_7FF_Mux1);
muxNumber_TESLA_7FF++;
break; break;
case 1: case 1:
transmit_can_frame(&TESLA_7FF_Mux2); transmit_can_frame(&TESLA_7FF_Mux2);
muxNumber_TESLA_7FF++;
break; break;
case 2: case 2:
transmit_can_frame(&TESLA_7FF_Mux3); transmit_can_frame(&TESLA_7FF_Mux3);
muxNumber_TESLA_7FF++;
break; break;
case 3: case 3:
transmit_can_frame(&TESLA_7FF_Mux4); transmit_can_frame(&TESLA_7FF_Mux4);
muxNumber_TESLA_7FF++;
break; break;
case 4: case 4:
transmit_can_frame(&TESLA_7FF_Mux5); transmit_can_frame(&TESLA_7FF_Mux5);
muxNumber_TESLA_7FF = 0;
break; break;
default: default:
break; break;
} }
muxNumber_TESLA_7FF = (muxNumber_TESLA_7FF + 1) % 5; //Cycle betweeen 0-1-2-3-4-0...
//Generate next frames //Generate next frames
generateTESLA_229(TESLA_229); generateTESLA_229(TESLA_229);
generateFrameCounterChecksum(TESLA_2A8, 52, 4, 56, 8); generateFrameCounterChecksum(TESLA_2A8, 52, 4, 56, 8);

View file

@ -75,7 +75,7 @@ class TeslaBattery : public CanBattery {
//UDS session tracker //UDS session tracker
//static bool uds_SessionInProgress = false; // Future use //static bool uds_SessionInProgress = false; // Future use
//0x221 VCFRONT_LVPowerState //0x221 VCFRONT_LVPowerState
uint8_t muxNumber_TESLA_221 = 0; uint8_t alternateMux = 0;
uint8_t frameCounter_TESLA_221 = 15; // Start at 15 for Mux 0 uint8_t frameCounter_TESLA_221 = 15; // Start at 15 for Mux 0
uint8_t vehicleState = 1; // "OFF": 0, "DRIVE": 1, "ACCESSORY": 2, "GOING_DOWN": 3 uint8_t vehicleState = 1; // "OFF": 0, "DRIVE": 1, "ACCESSORY": 2, "GOING_DOWN": 3
static const uint8_t CAR_OFF = 0; static const uint8_t CAR_OFF = 0;
@ -89,8 +89,6 @@ class TeslaBattery : public CanBattery {
bool TESLA_334_INITIAL_SENT = false; bool TESLA_334_INITIAL_SENT = false;
//0x3A1 VCFRONT_vehicleStatus, 15 frame counter (temporary) //0x3A1 VCFRONT_vehicleStatus, 15 frame counter (temporary)
uint8_t frameCounter_TESLA_3A1 = 0; uint8_t frameCounter_TESLA_3A1 = 0;
//0x3C2 VCLEFT_switchStatus
uint8_t muxNumber_TESLA_3C2 = 0;
//0x504 TWC_status //0x504 TWC_status
bool TESLA_504_INITIAL_SENT = false; bool TESLA_504_INITIAL_SENT = false;
//0x7FF GTW_carConfig, 5 mux tracker //0x7FF GTW_carConfig, 5 mux tracker