mirror of
https://github.com/dalathegreat/Battery-Emulator.git
synced 2025-10-03 17:59:27 +02:00
Reduce direct usage of can_config
This commit is contained in:
parent
3612e18452
commit
d30a35bd4f
56 changed files with 794 additions and 786 deletions
|
@ -235,7 +235,7 @@ void BmwI3Battery::handle_incoming_can_frame(CAN_frame rx_frame) {
|
||||||
case 0x607: //BMS - responses to message requests on 0x615
|
case 0x607: //BMS - responses to message requests on 0x615
|
||||||
if ((cmdState == CELL_VOLTAGE_CELLNO || cmdState == CELL_VOLTAGE_CELLNO_LAST) && (rx_frame.data.u8[0] == 0xF4)) {
|
if ((cmdState == CELL_VOLTAGE_CELLNO || cmdState == CELL_VOLTAGE_CELLNO_LAST) && (rx_frame.data.u8[0] == 0xF4)) {
|
||||||
if (rx_frame.DLC == 6) {
|
if (rx_frame.DLC == 6) {
|
||||||
transmit_can_frame(&BMW_6F4_CELL_CONTINUE, can_interface); // tell battery to send the cellvoltage
|
transmit_can_frame(&BMW_6F4_CELL_CONTINUE); // tell battery to send the cellvoltage
|
||||||
}
|
}
|
||||||
if (rx_frame.DLC == 8) { // We have the full value, map it
|
if (rx_frame.DLC == 8) { // We have the full value, map it
|
||||||
datalayer_battery->status.cell_voltages_mV[current_cell_polled - 1] =
|
datalayer_battery->status.cell_voltages_mV[current_cell_polled - 1] =
|
||||||
|
@ -248,7 +248,7 @@ void BmwI3Battery::handle_incoming_can_frame(CAN_frame rx_frame) {
|
||||||
while (count < rx_frame.DLC && next_data < 49) {
|
while (count < rx_frame.DLC && next_data < 49) {
|
||||||
message_data[next_data++] = rx_frame.data.u8[count++];
|
message_data[next_data++] = rx_frame.data.u8[count++];
|
||||||
}
|
}
|
||||||
transmit_can_frame(&BMW_6F1_CONTINUE, can_interface); // tell battery to send additional messages
|
transmit_can_frame(&BMW_6F1_CONTINUE); // tell battery to send additional messages
|
||||||
|
|
||||||
} else if (rx_frame.DLC > 3 && next_data > 0 && rx_frame.data.u8[0] == 0xf1 &&
|
} else if (rx_frame.DLC > 3 && next_data > 0 && rx_frame.data.u8[0] == 0xf1 &&
|
||||||
((rx_frame.data.u8[1] & 0xF0) == 0x20)) {
|
((rx_frame.data.u8[1] & 0xF0) == 0x20)) {
|
||||||
|
@ -316,9 +316,9 @@ void BmwI3Battery::transmit_can(unsigned long currentMillis) {
|
||||||
} else if (allows_contactor_closing) {
|
} else if (allows_contactor_closing) {
|
||||||
//If battery is not in Fault mode, and we are allowed to control contactors, we allow contactor to close by sending 10B
|
//If battery is not in Fault mode, and we are allowed to control contactors, we allow contactor to close by sending 10B
|
||||||
*allows_contactor_closing = true;
|
*allows_contactor_closing = true;
|
||||||
transmit_can_frame(&BMW_10B, can_interface);
|
transmit_can_frame(&BMW_10B);
|
||||||
} else if (contactor_closing_allowed && *contactor_closing_allowed) {
|
} else if (contactor_closing_allowed && *contactor_closing_allowed) {
|
||||||
transmit_can_frame(&BMW_10B, can_interface);
|
transmit_can_frame(&BMW_10B);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -331,7 +331,7 @@ void BmwI3Battery::transmit_can(unsigned long currentMillis) {
|
||||||
|
|
||||||
alive_counter_100ms = increment_alive_counter(alive_counter_100ms);
|
alive_counter_100ms = increment_alive_counter(alive_counter_100ms);
|
||||||
|
|
||||||
transmit_can_frame(&BMW_12F, can_interface);
|
transmit_can_frame(&BMW_12F);
|
||||||
}
|
}
|
||||||
// Send 200ms CAN Message
|
// Send 200ms CAN Message
|
||||||
if (currentMillis - previousMillis200 >= INTERVAL_200_MS) {
|
if (currentMillis - previousMillis200 >= INTERVAL_200_MS) {
|
||||||
|
@ -342,7 +342,7 @@ void BmwI3Battery::transmit_can(unsigned long currentMillis) {
|
||||||
|
|
||||||
alive_counter_200ms = increment_alive_counter(alive_counter_200ms);
|
alive_counter_200ms = increment_alive_counter(alive_counter_200ms);
|
||||||
|
|
||||||
transmit_can_frame(&BMW_19B, can_interface);
|
transmit_can_frame(&BMW_19B);
|
||||||
}
|
}
|
||||||
// Send 500ms CAN Message
|
// Send 500ms CAN Message
|
||||||
if (currentMillis - previousMillis500 >= INTERVAL_500_MS) {
|
if (currentMillis - previousMillis500 >= INTERVAL_500_MS) {
|
||||||
|
@ -353,14 +353,14 @@ void BmwI3Battery::transmit_can(unsigned long currentMillis) {
|
||||||
|
|
||||||
alive_counter_500ms = increment_alive_counter(alive_counter_500ms);
|
alive_counter_500ms = increment_alive_counter(alive_counter_500ms);
|
||||||
|
|
||||||
transmit_can_frame(&BMW_30B, can_interface);
|
transmit_can_frame(&BMW_30B);
|
||||||
}
|
}
|
||||||
// Send 640ms CAN Message
|
// Send 640ms CAN Message
|
||||||
if (currentMillis - previousMillis640 >= INTERVAL_640_MS) {
|
if (currentMillis - previousMillis640 >= INTERVAL_640_MS) {
|
||||||
previousMillis640 = currentMillis;
|
previousMillis640 = currentMillis;
|
||||||
|
|
||||||
transmit_can_frame(&BMW_512, can_interface); // Keep BMS alive
|
transmit_can_frame(&BMW_512); // Keep BMS alive
|
||||||
transmit_can_frame(&BMW_5F8, can_interface);
|
transmit_can_frame(&BMW_5F8);
|
||||||
}
|
}
|
||||||
// Send 1000ms CAN Message
|
// Send 1000ms CAN Message
|
||||||
if (currentMillis - previousMillis1000 >= INTERVAL_1_S) {
|
if (currentMillis - previousMillis1000 >= INTERVAL_1_S) {
|
||||||
|
@ -397,22 +397,22 @@ void BmwI3Battery::transmit_can(unsigned long currentMillis) {
|
||||||
|
|
||||||
alive_counter_1000ms = increment_alive_counter(alive_counter_1000ms);
|
alive_counter_1000ms = increment_alive_counter(alive_counter_1000ms);
|
||||||
|
|
||||||
transmit_can_frame(&BMW_3E8, can_interface); //Order comes from CAN logs
|
transmit_can_frame(&BMW_3E8); //Order comes from CAN logs
|
||||||
transmit_can_frame(&BMW_328, can_interface);
|
transmit_can_frame(&BMW_328);
|
||||||
transmit_can_frame(&BMW_3F9, can_interface);
|
transmit_can_frame(&BMW_3F9);
|
||||||
transmit_can_frame(&BMW_2E2, can_interface);
|
transmit_can_frame(&BMW_2E2);
|
||||||
transmit_can_frame(&BMW_41D, can_interface);
|
transmit_can_frame(&BMW_41D);
|
||||||
transmit_can_frame(&BMW_3D0, can_interface);
|
transmit_can_frame(&BMW_3D0);
|
||||||
transmit_can_frame(&BMW_3CA, can_interface);
|
transmit_can_frame(&BMW_3CA);
|
||||||
transmit_can_frame(&BMW_3A7, can_interface);
|
transmit_can_frame(&BMW_3A7);
|
||||||
transmit_can_frame(&BMW_2CA, can_interface);
|
transmit_can_frame(&BMW_2CA);
|
||||||
transmit_can_frame(&BMW_3FB, can_interface);
|
transmit_can_frame(&BMW_3FB);
|
||||||
transmit_can_frame(&BMW_418, can_interface);
|
transmit_can_frame(&BMW_418);
|
||||||
transmit_can_frame(&BMW_1D0, can_interface);
|
transmit_can_frame(&BMW_1D0);
|
||||||
transmit_can_frame(&BMW_3EC, can_interface);
|
transmit_can_frame(&BMW_3EC);
|
||||||
transmit_can_frame(&BMW_192, can_interface);
|
transmit_can_frame(&BMW_192);
|
||||||
transmit_can_frame(&BMW_13E, can_interface);
|
transmit_can_frame(&BMW_13E);
|
||||||
transmit_can_frame(&BMW_433, can_interface);
|
transmit_can_frame(&BMW_433);
|
||||||
|
|
||||||
BMW_433.data.u8[1] = 0x01; // First 433 message byte1 we send is unique, once we sent initial value send this
|
BMW_433.data.u8[1] = 0x01; // First 433 message byte1 we send is unique, once we sent initial value send this
|
||||||
BMW_3E8.data.u8[0] = 0xF1; // First 3E8 message byte0 we send is unique, once we sent initial value send this
|
BMW_3E8.data.u8[0] = 0xF1; // First 3E8 message byte0 we send is unique, once we sent initial value send this
|
||||||
|
@ -420,15 +420,15 @@ void BmwI3Battery::transmit_can(unsigned long currentMillis) {
|
||||||
next_data = 0;
|
next_data = 0;
|
||||||
switch (cmdState) {
|
switch (cmdState) {
|
||||||
case SOC:
|
case SOC:
|
||||||
transmit_can_frame(&BMW_6F1_CELL, can_interface);
|
transmit_can_frame(&BMW_6F1_CELL);
|
||||||
cmdState = CELL_VOLTAGE_MINMAX;
|
cmdState = CELL_VOLTAGE_MINMAX;
|
||||||
break;
|
break;
|
||||||
case CELL_VOLTAGE_MINMAX:
|
case CELL_VOLTAGE_MINMAX:
|
||||||
transmit_can_frame(&BMW_6F1_SOH, can_interface);
|
transmit_can_frame(&BMW_6F1_SOH);
|
||||||
cmdState = SOH;
|
cmdState = SOH;
|
||||||
break;
|
break;
|
||||||
case SOH:
|
case SOH:
|
||||||
transmit_can_frame(&BMW_6F1_CELL_VOLTAGE_AVG, can_interface);
|
transmit_can_frame(&BMW_6F1_CELL_VOLTAGE_AVG);
|
||||||
cmdState = CELL_VOLTAGE_CELLNO;
|
cmdState = CELL_VOLTAGE_CELLNO;
|
||||||
current_cell_polled = 0;
|
current_cell_polled = 0;
|
||||||
|
|
||||||
|
@ -441,11 +441,11 @@ void BmwI3Battery::transmit_can(unsigned long currentMillis) {
|
||||||
cmdState = CELL_VOLTAGE_CELLNO;
|
cmdState = CELL_VOLTAGE_CELLNO;
|
||||||
|
|
||||||
BMW_6F4_CELL_VOLTAGE_CELLNO.data.u8[6] = current_cell_polled;
|
BMW_6F4_CELL_VOLTAGE_CELLNO.data.u8[6] = current_cell_polled;
|
||||||
transmit_can_frame(&BMW_6F4_CELL_VOLTAGE_CELLNO, can_interface);
|
transmit_can_frame(&BMW_6F4_CELL_VOLTAGE_CELLNO);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case CELL_VOLTAGE_CELLNO_LAST:
|
case CELL_VOLTAGE_CELLNO_LAST:
|
||||||
transmit_can_frame(&BMW_6F1_SOC, can_interface);
|
transmit_can_frame(&BMW_6F1_SOC);
|
||||||
cmdState = SOC;
|
cmdState = SOC;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -457,16 +457,16 @@ void BmwI3Battery::transmit_can(unsigned long currentMillis) {
|
||||||
BMW_3FC.data.u8[1] = ((BMW_3FC.data.u8[1] & 0xF0) + alive_counter_5000ms);
|
BMW_3FC.data.u8[1] = ((BMW_3FC.data.u8[1] & 0xF0) + alive_counter_5000ms);
|
||||||
BMW_3C5.data.u8[0] = ((BMW_3C5.data.u8[0] & 0xF0) + alive_counter_5000ms);
|
BMW_3C5.data.u8[0] = ((BMW_3C5.data.u8[0] & 0xF0) + alive_counter_5000ms);
|
||||||
|
|
||||||
transmit_can_frame(&BMW_3FC, can_interface); //Order comes from CAN logs
|
transmit_can_frame(&BMW_3FC); //Order comes from CAN logs
|
||||||
transmit_can_frame(&BMW_3C5, can_interface);
|
transmit_can_frame(&BMW_3C5);
|
||||||
transmit_can_frame(&BMW_3A0, can_interface);
|
transmit_can_frame(&BMW_3A0);
|
||||||
transmit_can_frame(&BMW_592_0, can_interface);
|
transmit_can_frame(&BMW_592_0);
|
||||||
transmit_can_frame(&BMW_592_1, can_interface);
|
transmit_can_frame(&BMW_592_1);
|
||||||
|
|
||||||
alive_counter_5000ms = increment_alive_counter(alive_counter_5000ms);
|
alive_counter_5000ms = increment_alive_counter(alive_counter_5000ms);
|
||||||
|
|
||||||
if (BMW_380_counter < 3) {
|
if (BMW_380_counter < 3) {
|
||||||
transmit_can_frame(&BMW_380, can_interface); // This message stops after 3 times on startup
|
transmit_can_frame(&BMW_380); // This message stops after 3 times on startup
|
||||||
BMW_380_counter++;
|
BMW_380_counter++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -474,9 +474,9 @@ void BmwI3Battery::transmit_can(unsigned long currentMillis) {
|
||||||
if (currentMillis - previousMillis10000 >= INTERVAL_10_S) {
|
if (currentMillis - previousMillis10000 >= INTERVAL_10_S) {
|
||||||
previousMillis10000 = currentMillis;
|
previousMillis10000 = currentMillis;
|
||||||
|
|
||||||
transmit_can_frame(&BMW_3E5, can_interface); //Order comes from CAN logs
|
transmit_can_frame(&BMW_3E5); //Order comes from CAN logs
|
||||||
transmit_can_frame(&BMW_3E4, can_interface);
|
transmit_can_frame(&BMW_3E4);
|
||||||
transmit_can_frame(&BMW_37B, can_interface);
|
transmit_can_frame(&BMW_37B);
|
||||||
|
|
||||||
BMW_3E5.data.u8[0] = 0xFD; // First 3E5 message byte0 we send is unique, once we sent initial value send this
|
BMW_3E5.data.u8[0] = 0xFD; // First 3E5 message byte0 we send is unique, once we sent initial value send this
|
||||||
}
|
}
|
||||||
|
|
|
@ -173,7 +173,7 @@ void BmwIXBattery::handle_incoming_can_frame(CAN_frame rx_frame) {
|
||||||
}
|
}
|
||||||
|
|
||||||
//Frame has continued data - so request it
|
//Frame has continued data - so request it
|
||||||
transmit_can_frame(&BMWiX_6F4_CONTINUE_DATA, can_config.battery);
|
transmit_can_frame(&BMWiX_6F4_CONTINUE_DATA);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rx_frame.DLC = 64 && rx_frame.data.u8[0] == 0xF4 &&
|
if (rx_frame.DLC = 64 && rx_frame.data.u8[0] == 0xF4 &&
|
||||||
|
@ -307,7 +307,7 @@ void BmwIXBattery::handle_incoming_can_frame(CAN_frame rx_frame) {
|
||||||
logging.println("Cell MinMax Qualifier Invalid - Requesting BMS Reset");
|
logging.println("Cell MinMax Qualifier Invalid - Requesting BMS Reset");
|
||||||
#endif // DEBUG_LOG
|
#endif // DEBUG_LOG
|
||||||
//set_event(EVENT_BATTERY_VALUE_UNAVAILABLE, (millis())); //Eventually need new Info level event type
|
//set_event(EVENT_BATTERY_VALUE_UNAVAILABLE, (millis())); //Eventually need new Info level event type
|
||||||
transmit_can_frame(&BMWiX_6F4_REQUEST_HARD_RESET, can_config.battery);
|
transmit_can_frame(&BMWiX_6F4_REQUEST_HARD_RESET);
|
||||||
} else { //Only ingest values if they are not the 10V Error state
|
} else { //Only ingest values if they are not the 10V Error state
|
||||||
min_cell_voltage = (rx_frame.data.u8[6] << 8 | rx_frame.data.u8[7]);
|
min_cell_voltage = (rx_frame.data.u8[6] << 8 | rx_frame.data.u8[7]);
|
||||||
max_cell_voltage = (rx_frame.data.u8[8] << 8 | rx_frame.data.u8[9]);
|
max_cell_voltage = (rx_frame.data.u8[8] << 8 | rx_frame.data.u8[9]);
|
||||||
|
@ -405,8 +405,8 @@ void BmwIXBattery::transmit_can(unsigned long currentMillis) {
|
||||||
ContactorState.closed ==
|
ContactorState.closed ==
|
||||||
true) { // Do not send unless the contactors are requested to be closed and are closed, as sending these does not allow the contactors to close
|
true) { // Do not send unless the contactors are requested to be closed and are closed, as sending these does not allow the contactors to close
|
||||||
uds_req_id_counter = increment_uds_req_id_counter(uds_req_id_counter);
|
uds_req_id_counter = increment_uds_req_id_counter(uds_req_id_counter);
|
||||||
transmit_can_frame(UDS_REQUESTS100MS[uds_req_id_counter],
|
transmit_can_frame(
|
||||||
can_config.battery); // FIXME: sending these does not allow the contactors to close
|
UDS_REQUESTS100MS[uds_req_id_counter]); // FIXME: sending these does not allow the contactors to close
|
||||||
} else { // FIXME: hotfix: If contactors are not requested to be closed, ensure the battery is reported as alive, even if no CAN messages are received
|
} else { // FIXME: hotfix: If contactors are not requested to be closed, ensure the battery is reported as alive, even if no CAN messages are received
|
||||||
datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE;
|
datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE;
|
||||||
}
|
}
|
||||||
|
@ -419,7 +419,7 @@ void BmwIXBattery::transmit_can(unsigned long currentMillis) {
|
||||||
}
|
}
|
||||||
|
|
||||||
//Send SME Keep alive values 100ms
|
//Send SME Keep alive values 100ms
|
||||||
//transmit_can_frame(&BMWiX_510, can_config.battery);
|
//transmit_can_frame(&BMWiX_510);
|
||||||
}
|
}
|
||||||
// Send 200ms CAN Message
|
// Send 200ms CAN Message
|
||||||
if (currentMillis - previousMillis200 >= INTERVAL_200_MS) {
|
if (currentMillis - previousMillis200 >= INTERVAL_200_MS) {
|
||||||
|
@ -427,7 +427,7 @@ void BmwIXBattery::transmit_can(unsigned long currentMillis) {
|
||||||
|
|
||||||
//Send SME Keep alive values 200ms
|
//Send SME Keep alive values 200ms
|
||||||
//BMWiX_C0.data.u8[0] = increment_C0_counter(BMWiX_C0.data.u8[0]); //Keep Alive 1
|
//BMWiX_C0.data.u8[0] = increment_C0_counter(BMWiX_C0.data.u8[0]); //Keep Alive 1
|
||||||
//transmit_can_frame(&BMWiX_C0, can_config.battery);
|
//transmit_can_frame(&BMWiX_C0);
|
||||||
}
|
}
|
||||||
// Send 1000ms CAN Message
|
// Send 1000ms CAN Message
|
||||||
if (currentMillis - previousMillis1000 >= INTERVAL_1_S) {
|
if (currentMillis - previousMillis1000 >= INTERVAL_1_S) {
|
||||||
|
@ -438,8 +438,8 @@ void BmwIXBattery::transmit_can(unsigned long currentMillis) {
|
||||||
// Send 10000ms CAN Message
|
// Send 10000ms CAN Message
|
||||||
if (currentMillis - previousMillis10000 >= INTERVAL_10_S) {
|
if (currentMillis - previousMillis10000 >= INTERVAL_10_S) {
|
||||||
previousMillis10000 = currentMillis;
|
previousMillis10000 = currentMillis;
|
||||||
//transmit_can_frame(&BMWiX_6F4_REQUEST_BALANCING_START2, can_config.battery);
|
//transmit_can_frame(&BMWiX_6F4_REQUEST_BALANCING_START2);
|
||||||
//transmit_can_frame(&BMWiX_6F4_REQUEST_BALANCING_START, can_config.battery);
|
//transmit_can_frame(&BMWiX_6F4_REQUEST_BALANCING_START);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -448,7 +448,7 @@ void BmwIXBattery::setup(void) { // Performs one time setup at startup
|
||||||
datalayer.system.info.battery_protocol[63] = '\0';
|
datalayer.system.info.battery_protocol[63] = '\0';
|
||||||
|
|
||||||
//Reset Battery at bootup
|
//Reset Battery at bootup
|
||||||
//transmit_can_frame(&BMWiX_6F4_REQUEST_HARD_RESET, can_config.battery);
|
//transmit_can_frame(&BMWiX_6F4_REQUEST_HARD_RESET);
|
||||||
|
|
||||||
//Before we have started up and detected which battery is in use, use 108S values
|
//Before we have started up and detected which battery is in use, use 108S values
|
||||||
datalayer.battery.info.max_design_voltage_dV = MAX_PACK_VOLTAGE_DV;
|
datalayer.battery.info.max_design_voltage_dV = MAX_PACK_VOLTAGE_DV;
|
||||||
|
@ -547,20 +547,20 @@ void BmwIXBattery::HandleBmwIxCloseContactorsRequest(uint16_t counter_10ms) {
|
||||||
|
|
||||||
if (counter_10ms == 0) {
|
if (counter_10ms == 0) {
|
||||||
// @0 ms
|
// @0 ms
|
||||||
transmit_can_frame(&BMWiX_510, can_config.battery);
|
transmit_can_frame(&BMWiX_510);
|
||||||
#ifdef DEBUG_LOG
|
#ifdef DEBUG_LOG
|
||||||
logging.println("Transmitted 0x510 - 1/6");
|
logging.println("Transmitted 0x510 - 1/6");
|
||||||
#endif // DEBUG_LOG
|
#endif // DEBUG_LOG
|
||||||
} else if (counter_10ms == 5) {
|
} else if (counter_10ms == 5) {
|
||||||
// @50 ms
|
// @50 ms
|
||||||
transmit_can_frame(&BMWiX_276, can_config.battery);
|
transmit_can_frame(&BMWiX_276);
|
||||||
#ifdef DEBUG_LOG
|
#ifdef DEBUG_LOG
|
||||||
logging.println("Transmitted 0x276 - 2/6");
|
logging.println("Transmitted 0x276 - 2/6");
|
||||||
#endif // DEBUG_LOG
|
#endif // DEBUG_LOG
|
||||||
} else if (counter_10ms == 10) {
|
} else if (counter_10ms == 10) {
|
||||||
// @100 ms
|
// @100 ms
|
||||||
BMWiX_510.data.u8[2] = 0x04; // TODO: check if needed
|
BMWiX_510.data.u8[2] = 0x04; // TODO: check if needed
|
||||||
transmit_can_frame(&BMWiX_510, can_config.battery);
|
transmit_can_frame(&BMWiX_510);
|
||||||
#ifdef DEBUG_LOG
|
#ifdef DEBUG_LOG
|
||||||
logging.println("Transmitted 0x510 - 3/6");
|
logging.println("Transmitted 0x510 - 3/6");
|
||||||
#endif // DEBUG_LOG
|
#endif // DEBUG_LOG
|
||||||
|
@ -568,7 +568,7 @@ void BmwIXBattery::HandleBmwIxCloseContactorsRequest(uint16_t counter_10ms) {
|
||||||
// @200 ms
|
// @200 ms
|
||||||
BMWiX_510.data.u8[2] = 0x10; // TODO: check if needed
|
BMWiX_510.data.u8[2] = 0x10; // TODO: check if needed
|
||||||
BMWiX_510.data.u8[5] = 0x80; // needed to close contactors
|
BMWiX_510.data.u8[5] = 0x80; // needed to close contactors
|
||||||
transmit_can_frame(&BMWiX_510, can_config.battery);
|
transmit_can_frame(&BMWiX_510);
|
||||||
#ifdef DEBUG_LOG
|
#ifdef DEBUG_LOG
|
||||||
logging.println("Transmitted 0x510 - 4/6");
|
logging.println("Transmitted 0x510 - 4/6");
|
||||||
#endif // DEBUG_LOG
|
#endif // DEBUG_LOG
|
||||||
|
@ -576,7 +576,7 @@ void BmwIXBattery::HandleBmwIxCloseContactorsRequest(uint16_t counter_10ms) {
|
||||||
// @300 ms
|
// @300 ms
|
||||||
BMWiX_16E.data.u8[0] = 0x6A;
|
BMWiX_16E.data.u8[0] = 0x6A;
|
||||||
BMWiX_16E.data.u8[1] = 0xAD;
|
BMWiX_16E.data.u8[1] = 0xAD;
|
||||||
transmit_can_frame(&BMWiX_16E, can_config.battery);
|
transmit_can_frame(&BMWiX_16E);
|
||||||
#ifdef DEBUG_LOG
|
#ifdef DEBUG_LOG
|
||||||
logging.println("Transmitted 0x16E - 5/6");
|
logging.println("Transmitted 0x16E - 5/6");
|
||||||
#endif // DEBUG_LOG
|
#endif // DEBUG_LOG
|
||||||
|
@ -584,7 +584,7 @@ void BmwIXBattery::HandleBmwIxCloseContactorsRequest(uint16_t counter_10ms) {
|
||||||
// @500 ms
|
// @500 ms
|
||||||
BMWiX_16E.data.u8[0] = 0x03;
|
BMWiX_16E.data.u8[0] = 0x03;
|
||||||
BMWiX_16E.data.u8[1] = 0xA9;
|
BMWiX_16E.data.u8[1] = 0xA9;
|
||||||
transmit_can_frame(&BMWiX_16E, can_config.battery);
|
transmit_can_frame(&BMWiX_16E);
|
||||||
#ifdef DEBUG_LOG
|
#ifdef DEBUG_LOG
|
||||||
logging.println("Transmitted 0x16E - 6/6");
|
logging.println("Transmitted 0x16E - 6/6");
|
||||||
#endif // DEBUG_LOG
|
#endif // DEBUG_LOG
|
||||||
|
@ -613,20 +613,20 @@ void BmwIXBattery::BmwIxKeepContactorsClosed(uint8_t counter_100ms) {
|
||||||
logging.println("Sending keep contactors closed messages started");
|
logging.println("Sending keep contactors closed messages started");
|
||||||
#endif // DEBUG_LOG
|
#endif // DEBUG_LOG
|
||||||
// @0 ms
|
// @0 ms
|
||||||
transmit_can_frame(&BMWiX_510, can_config.battery);
|
transmit_can_frame(&BMWiX_510);
|
||||||
} else if (counter_100ms == 7) {
|
} else if (counter_100ms == 7) {
|
||||||
// @ 730 ms
|
// @ 730 ms
|
||||||
BMWiX_16E.data.u8[0] = 0x8C;
|
BMWiX_16E.data.u8[0] = 0x8C;
|
||||||
BMWiX_16E.data.u8[1] = 0xA0;
|
BMWiX_16E.data.u8[1] = 0xA0;
|
||||||
transmit_can_frame(&BMWiX_16E, can_config.battery);
|
transmit_can_frame(&BMWiX_16E);
|
||||||
} else if (counter_100ms == 24) {
|
} else if (counter_100ms == 24) {
|
||||||
// @2380 ms
|
// @2380 ms
|
||||||
transmit_can_frame(&BMWiX_510, can_config.battery);
|
transmit_can_frame(&BMWiX_510);
|
||||||
} else if (counter_100ms == 29) {
|
} else if (counter_100ms == 29) {
|
||||||
// @ 2900 ms
|
// @ 2900 ms
|
||||||
BMWiX_16E.data.u8[0] = 0x02;
|
BMWiX_16E.data.u8[0] = 0x02;
|
||||||
BMWiX_16E.data.u8[1] = 0xA7;
|
BMWiX_16E.data.u8[1] = 0xA7;
|
||||||
transmit_can_frame(&BMWiX_16E, can_config.battery);
|
transmit_can_frame(&BMWiX_16E);
|
||||||
#ifdef DEBUG_LOG
|
#ifdef DEBUG_LOG
|
||||||
logging.println("Sending keep contactors closed messages finished");
|
logging.println("Sending keep contactors closed messages finished");
|
||||||
#endif // DEBUG_LOG
|
#endif // DEBUG_LOG
|
||||||
|
@ -645,14 +645,14 @@ void BmwIXBattery::HandleBmwIxOpenContactorsRequest(uint16_t counter_10ms) {
|
||||||
// @0 ms (0.00) RX0 510 [8] 40 10 00 00 00 80 00 00
|
// @0 ms (0.00) RX0 510 [8] 40 10 00 00 00 80 00 00
|
||||||
BMWiX_510.data = {0x40, 0x10, 0x00, 0x00,
|
BMWiX_510.data = {0x40, 0x10, 0x00, 0x00,
|
||||||
0x00, 0x80, 0x00, 0x00}; // Explicit declaration, to prevent modification by other functions
|
0x00, 0x80, 0x00, 0x00}; // Explicit declaration, to prevent modification by other functions
|
||||||
transmit_can_frame(&BMWiX_510, can_config.battery);
|
transmit_can_frame(&BMWiX_510);
|
||||||
// set back to default values
|
// set back to default values
|
||||||
BMWiX_510.data = {0x40, 0x10, 0x04, 0x00, 0x00, 0x80, 0x01, 0x00}; // default values
|
BMWiX_510.data = {0x40, 0x10, 0x04, 0x00, 0x00, 0x80, 0x01, 0x00}; // default values
|
||||||
} else if (counter_10ms == 6) {
|
} else if (counter_10ms == 6) {
|
||||||
// @60 ms (0.06) RX0 16E [8] E6 A4 C8 FF 60 C9 33 F0
|
// @60 ms (0.06) RX0 16E [8] E6 A4 C8 FF 60 C9 33 F0
|
||||||
BMWiX_16E.data = {0xE6, 0xA4, 0xC8, 0xFF,
|
BMWiX_16E.data = {0xE6, 0xA4, 0xC8, 0xFF,
|
||||||
0x60, 0xC9, 0x33, 0xF0}; // Explicit declaration, to prevent modification by other functions
|
0x60, 0xC9, 0x33, 0xF0}; // Explicit declaration, to prevent modification by other functions
|
||||||
transmit_can_frame(&BMWiX_16E, can_config.battery);
|
transmit_can_frame(&BMWiX_16E);
|
||||||
// set back to default values
|
// set back to default values
|
||||||
BMWiX_16E.data = {0x00, 0xA0, 0xC9, 0xFF, 0x60, 0xC9, 0x3A, 0xF7}; // default values
|
BMWiX_16E.data = {0x00, 0xA0, 0xC9, 0xFF, 0x60, 0xC9, 0x3A, 0xF7}; // default values
|
||||||
ContactorState.closed = false;
|
ContactorState.closed = false;
|
||||||
|
|
|
@ -190,8 +190,8 @@ void BmwPhevBattery::wake_battery_via_canbus() {
|
||||||
|
|
||||||
auto original_speed = change_can_speed(CAN_Speed::CAN_SPEED_100KBPS);
|
auto original_speed = change_can_speed(CAN_Speed::CAN_SPEED_100KBPS);
|
||||||
|
|
||||||
transmit_can_frame(&BMW_PHEV_BUS_WAKEUP_REQUEST, can_config.battery);
|
transmit_can_frame(&BMW_PHEV_BUS_WAKEUP_REQUEST);
|
||||||
transmit_can_frame(&BMW_PHEV_BUS_WAKEUP_REQUEST, can_config.battery);
|
transmit_can_frame(&BMW_PHEV_BUS_WAKEUP_REQUEST);
|
||||||
|
|
||||||
change_can_speed(original_speed);
|
change_can_speed(original_speed);
|
||||||
|
|
||||||
|
@ -432,7 +432,7 @@ void BmwPhevBattery::handle_incoming_can_frame(CAN_frame rx_frame) {
|
||||||
#if defined(DEBUG_LOG) && defined(UDS_LOG)
|
#if defined(DEBUG_LOG) && defined(UDS_LOG)
|
||||||
logging.println("Requesting continue frame...");
|
logging.println("Requesting continue frame...");
|
||||||
#endif // DEBUG_LOG && UDS_LOG
|
#endif // DEBUG_LOG && UDS_LOG
|
||||||
transmit_can_frame(&BMW_6F1_REQUEST_CONTINUE_MULTIFRAME, can_config.battery);
|
transmit_can_frame(&BMW_6F1_REQUEST_CONTINUE_MULTIFRAME);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -478,7 +478,7 @@ void BmwPhevBattery::handle_incoming_can_frame(CAN_frame rx_frame) {
|
||||||
#if defined(DEBUG_LOG) && defined(UDS_LOG)
|
#if defined(DEBUG_LOG) && defined(UDS_LOG)
|
||||||
logging.println("Batch Complete - Requesting continue frame...");
|
logging.println("Batch Complete - Requesting continue frame...");
|
||||||
#endif // DEBUG_LOG && UDS_LOG
|
#endif // DEBUG_LOG && UDS_LOG
|
||||||
transmit_can_frame(&BMW_6F1_REQUEST_CONTINUE_MULTIFRAME, can_config.battery);
|
transmit_can_frame(&BMW_6F1_REQUEST_CONTINUE_MULTIFRAME);
|
||||||
gUDSContext.receivedInBatch = 0; // Reset batch count
|
gUDSContext.receivedInBatch = 0; // Reset batch count
|
||||||
Serial.println("Sent FC for next batch of 3 frames.");
|
Serial.println("Sent FC for next batch of 3 frames.");
|
||||||
}
|
}
|
||||||
|
@ -659,7 +659,7 @@ void BmwPhevBattery::transmit_can(unsigned long currentMillis) {
|
||||||
//if (datalayer.battery.status.bms_status == FAULT) { //ALLOW ANY TIME - TEST ONLY
|
//if (datalayer.battery.status.bms_status == FAULT) { //ALLOW ANY TIME - TEST ONLY
|
||||||
//} //If battery is not in Fault mode, allow contactor to close by sending 10B
|
//} //If battery is not in Fault mode, allow contactor to close by sending 10B
|
||||||
//else {
|
//else {
|
||||||
transmit_can_frame(&BMW_10B, can_config.battery);
|
transmit_can_frame(&BMW_10B);
|
||||||
//}
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -672,7 +672,7 @@ void BmwPhevBattery::transmit_can(unsigned long currentMillis) {
|
||||||
previousMillis200 = currentMillis;
|
previousMillis200 = currentMillis;
|
||||||
uds_fast_req_id_counter = increment_uds_req_id_counter(
|
uds_fast_req_id_counter = increment_uds_req_id_counter(
|
||||||
uds_fast_req_id_counter, numFastUDSreqs); //Loop through and send a different UDS request each cycle
|
uds_fast_req_id_counter, numFastUDSreqs); //Loop through and send a different UDS request each cycle
|
||||||
transmit_can_frame(UDS_REQUESTS_FAST[uds_fast_req_id_counter], can_config.battery);
|
transmit_can_frame(UDS_REQUESTS_FAST[uds_fast_req_id_counter]);
|
||||||
}
|
}
|
||||||
// Send 1000ms CAN Message
|
// Send 1000ms CAN Message
|
||||||
if (currentMillis - previousMillis1000 >= INTERVAL_1_S) {
|
if (currentMillis - previousMillis1000 >= INTERVAL_1_S) {
|
||||||
|
@ -680,7 +680,7 @@ void BmwPhevBattery::transmit_can(unsigned long currentMillis) {
|
||||||
|
|
||||||
uds_slow_req_id_counter = increment_uds_req_id_counter(
|
uds_slow_req_id_counter = increment_uds_req_id_counter(
|
||||||
uds_slow_req_id_counter, numSlowUDSreqs); //Loop through and send a different UDS request each cycle
|
uds_slow_req_id_counter, numSlowUDSreqs); //Loop through and send a different UDS request each cycle
|
||||||
transmit_can_frame(UDS_REQUESTS_SLOW[uds_slow_req_id_counter], can_config.battery);
|
transmit_can_frame(UDS_REQUESTS_SLOW[uds_slow_req_id_counter]);
|
||||||
}
|
}
|
||||||
// Send 5000ms CAN Message
|
// Send 5000ms CAN Message
|
||||||
if (currentMillis - previousMillis5000 >= INTERVAL_5_S) {
|
if (currentMillis - previousMillis5000 >= INTERVAL_5_S) {
|
||||||
|
@ -692,8 +692,7 @@ void BmwPhevBattery::transmit_can(unsigned long currentMillis) {
|
||||||
// Send 10000ms CAN Message
|
// Send 10000ms CAN Message
|
||||||
if (currentMillis - previousMillis10000 >= INTERVAL_10_S) {
|
if (currentMillis - previousMillis10000 >= INTERVAL_10_S) {
|
||||||
previousMillis10000 = currentMillis;
|
previousMillis10000 = currentMillis;
|
||||||
transmit_can_frame(&BMWPHEV_6F1_REQUEST_BALANCING_START,
|
transmit_can_frame(&BMWPHEV_6F1_REQUEST_BALANCING_START); // Enable Balancing
|
||||||
can_config.battery); // Enable Balancing
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -703,8 +702,7 @@ void BmwPhevBattery::setup(void) { // Performs one time setup at startup
|
||||||
//Wakeup the SME
|
//Wakeup the SME
|
||||||
wake_battery_via_canbus();
|
wake_battery_via_canbus();
|
||||||
|
|
||||||
transmit_can_frame(&BMWPHEV_6F1_REQUEST_ISOLATION_TEST,
|
transmit_can_frame(&BMWPHEV_6F1_REQUEST_ISOLATION_TEST); // Run Internal Isolation Test at startup
|
||||||
can_config.battery); // Run Internal Isolation Test at startup
|
|
||||||
|
|
||||||
datalayer.battery.info.max_design_voltage_dV = MAX_PACK_VOLTAGE_DV;
|
datalayer.battery.info.max_design_voltage_dV = MAX_PACK_VOLTAGE_DV;
|
||||||
datalayer.battery.info.min_design_voltage_dV = MIN_PACK_VOLTAGE_DV;
|
datalayer.battery.info.min_design_voltage_dV = MIN_PACK_VOLTAGE_DV;
|
||||||
|
|
|
@ -172,8 +172,8 @@ void BmwSbox::transmit_can(unsigned long currentMillis) {
|
||||||
SBOX_100.data.u8[1] = CAN100_cnt << 4 | 0x01;
|
SBOX_100.data.u8[1] = CAN100_cnt << 4 | 0x01;
|
||||||
SBOX_100.data.u8[3] = 0x00;
|
SBOX_100.data.u8[3] = 0x00;
|
||||||
SBOX_100.data.u8[3] = calculateCRC(SBOX_100);
|
SBOX_100.data.u8[3] = calculateCRC(SBOX_100);
|
||||||
transmit_can_frame(&SBOX_100, can_config.shunt);
|
transmit_can_frame(&SBOX_100);
|
||||||
transmit_can_frame(&SBOX_300, can_config.shunt);
|
transmit_can_frame(&SBOX_300);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -421,7 +421,7 @@ void BoltAmperaBattery::handle_incoming_can_frame(CAN_frame rx_frame) {
|
||||||
case 0x7EC: //When polling 7E4 BMS replies with 7EC (This is not working for some reason)
|
case 0x7EC: //When polling 7E4 BMS replies with 7EC (This is not working for some reason)
|
||||||
|
|
||||||
if (rx_frame.data.u8[0] == 0x10) { //"PID Header"
|
if (rx_frame.data.u8[0] == 0x10) { //"PID Header"
|
||||||
transmit_can_frame(&BOLT_ACK_7E4, can_config.battery);
|
transmit_can_frame(&BOLT_ACK_7E4);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Frame 2 & 3 contains reply
|
//Frame 2 & 3 contains reply
|
||||||
|
@ -493,7 +493,7 @@ void BoltAmperaBattery::handle_incoming_can_frame(CAN_frame rx_frame) {
|
||||||
case 0x7EF: //When polling 7E7 BMS replies with 7EF
|
case 0x7EF: //When polling 7E7 BMS replies with 7EF
|
||||||
|
|
||||||
if (rx_frame.data.u8[0] == 0x10) { //"PID Header"
|
if (rx_frame.data.u8[0] == 0x10) { //"PID Header"
|
||||||
transmit_can_frame(&BOLT_ACK_7E7, can_config.battery);
|
transmit_can_frame(&BOLT_ACK_7E7);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Frame 2 & 3 contains reply
|
//Frame 2 & 3 contains reply
|
||||||
|
@ -837,7 +837,7 @@ void BoltAmperaBattery::transmit_can(unsigned long currentMillis) {
|
||||||
//Send 20ms message
|
//Send 20ms message
|
||||||
if (currentMillis - previousMillis20ms >= INTERVAL_20_MS) {
|
if (currentMillis - previousMillis20ms >= INTERVAL_20_MS) {
|
||||||
previousMillis20ms = currentMillis;
|
previousMillis20ms = currentMillis;
|
||||||
transmit_can_frame(&BOLT_778, can_config.battery);
|
transmit_can_frame(&BOLT_778);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Send 100ms message
|
//Send 100ms message
|
||||||
|
@ -851,7 +851,7 @@ void BoltAmperaBattery::transmit_can(unsigned long currentMillis) {
|
||||||
BOLT_POLL_7E7.data.u8[2] = (uint8_t)((currentpoll_7E7 & 0xFF00) >> 8);
|
BOLT_POLL_7E7.data.u8[2] = (uint8_t)((currentpoll_7E7 & 0xFF00) >> 8);
|
||||||
BOLT_POLL_7E7.data.u8[3] = (uint8_t)(currentpoll_7E7 & 0x00FF);
|
BOLT_POLL_7E7.data.u8[3] = (uint8_t)(currentpoll_7E7 & 0x00FF);
|
||||||
|
|
||||||
transmit_can_frame(&BOLT_POLL_7E7, can_config.battery);
|
transmit_can_frame(&BOLT_POLL_7E7);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Send 120ms message
|
//Send 120ms message
|
||||||
|
@ -865,7 +865,7 @@ void BoltAmperaBattery::transmit_can(unsigned long currentMillis) {
|
||||||
BOLT_POLL_7E4.data.u8[2] = (uint8_t)((currentpoll_7E4 & 0xFF00) >> 8);
|
BOLT_POLL_7E4.data.u8[2] = (uint8_t)((currentpoll_7E4 & 0xFF00) >> 8);
|
||||||
BOLT_POLL_7E4.data.u8[3] = (uint8_t)(currentpoll_7E4 & 0x00FF);
|
BOLT_POLL_7E4.data.u8[3] = (uint8_t)(currentpoll_7E4 & 0x00FF);
|
||||||
|
|
||||||
//transmit_can_frame(&BOLT_POLL_7E4, can_config.battery); //TODO: Battery does not seem to reply on this poll
|
//transmit_can_frame(&BOLT_POLL_7E4); //TODO: Battery does not seem to reply on this poll
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -411,7 +411,7 @@ void BydAttoBattery::handle_incoming_can_frame(CAN_frame rx_frame) {
|
||||||
break;
|
break;
|
||||||
case 0x7EF: //OBD2 PID reply from battery
|
case 0x7EF: //OBD2 PID reply from battery
|
||||||
if (rx_frame.data.u8[0] == 0x10) {
|
if (rx_frame.data.u8[0] == 0x10) {
|
||||||
transmit_can_frame(&ATTO_3_7E7_ACK, can_interface); //Send next line request
|
transmit_can_frame(&ATTO_3_7E7_ACK); //Send next line request
|
||||||
}
|
}
|
||||||
pid_reply = ((rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3]);
|
pid_reply = ((rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3]);
|
||||||
switch (pid_reply) {
|
switch (pid_reply) {
|
||||||
|
@ -528,7 +528,7 @@ void BydAttoBattery::transmit_can(unsigned long currentMillis) {
|
||||||
ATTO_3_12D.data.u8[6] = (0x0F | (frame6_counter << 4));
|
ATTO_3_12D.data.u8[6] = (0x0F | (frame6_counter << 4));
|
||||||
ATTO_3_12D.data.u8[7] = (0x09 | (frame7_counter << 4));
|
ATTO_3_12D.data.u8[7] = (0x09 | (frame7_counter << 4));
|
||||||
|
|
||||||
transmit_can_frame(&ATTO_3_12D, can_interface);
|
transmit_can_frame(&ATTO_3_12D);
|
||||||
}
|
}
|
||||||
// Send 100ms CAN Message
|
// Send 100ms CAN Message
|
||||||
if (currentMillis - previousMillis100 >= INTERVAL_100_MS) {
|
if (currentMillis - previousMillis100 >= INTERVAL_100_MS) {
|
||||||
|
@ -545,21 +545,21 @@ void BydAttoBattery::transmit_can(unsigned long currentMillis) {
|
||||||
ATTO_3_441.data.u8[7] = 0xF5;
|
ATTO_3_441.data.u8[7] = 0xF5;
|
||||||
}
|
}
|
||||||
|
|
||||||
transmit_can_frame(&ATTO_3_441, can_interface);
|
transmit_can_frame(&ATTO_3_441);
|
||||||
switch (stateMachineClearCrash) {
|
switch (stateMachineClearCrash) {
|
||||||
case STARTED:
|
case STARTED:
|
||||||
ATTO_3_7E7_CLEAR_CRASH.data = {0x02, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00};
|
ATTO_3_7E7_CLEAR_CRASH.data = {0x02, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00};
|
||||||
transmit_can_frame(&ATTO_3_7E7_CLEAR_CRASH, can_interface);
|
transmit_can_frame(&ATTO_3_7E7_CLEAR_CRASH);
|
||||||
stateMachineClearCrash = RUNNING_STEP_1;
|
stateMachineClearCrash = RUNNING_STEP_1;
|
||||||
break;
|
break;
|
||||||
case RUNNING_STEP_1:
|
case RUNNING_STEP_1:
|
||||||
ATTO_3_7E7_CLEAR_CRASH.data = {0x04, 0x14, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00};
|
ATTO_3_7E7_CLEAR_CRASH.data = {0x04, 0x14, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00};
|
||||||
transmit_can_frame(&ATTO_3_7E7_CLEAR_CRASH, can_interface);
|
transmit_can_frame(&ATTO_3_7E7_CLEAR_CRASH);
|
||||||
stateMachineClearCrash = RUNNING_STEP_2;
|
stateMachineClearCrash = RUNNING_STEP_2;
|
||||||
break;
|
break;
|
||||||
case RUNNING_STEP_2:
|
case RUNNING_STEP_2:
|
||||||
ATTO_3_7E7_CLEAR_CRASH.data = {0x03, 0x19, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00};
|
ATTO_3_7E7_CLEAR_CRASH.data = {0x03, 0x19, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00};
|
||||||
transmit_can_frame(&ATTO_3_7E7_CLEAR_CRASH, can_interface);
|
transmit_can_frame(&ATTO_3_7E7_CLEAR_CRASH);
|
||||||
stateMachineClearCrash = NOT_RUNNING;
|
stateMachineClearCrash = NOT_RUNNING;
|
||||||
break;
|
break;
|
||||||
case NOT_RUNNING:
|
case NOT_RUNNING:
|
||||||
|
@ -689,7 +689,7 @@ void BydAttoBattery::transmit_can(unsigned long currentMillis) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (stateMachineClearCrash == NOT_RUNNING) { //Don't poll battery for data if clear crash running
|
if (stateMachineClearCrash == NOT_RUNNING) { //Don't poll battery for data if clear crash running
|
||||||
transmit_can_frame(&ATTO_3_7E7_POLL, can_interface);
|
transmit_can_frame(&ATTO_3_7E7_POLL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -220,10 +220,10 @@ void CellPowerBms::transmit_can(unsigned long currentMillis) {
|
||||||
previousMillis1s = currentMillis;
|
previousMillis1s = currentMillis;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
transmit_can_frame(&CELLPOWER_18FF50E9, can_config.battery);
|
transmit_can_frame(&CELLPOWER_18FF50E9);
|
||||||
transmit_can_frame(&CELLPOWER_18FF50E8, can_config.battery);
|
transmit_can_frame(&CELLPOWER_18FF50E8);
|
||||||
transmit_can_frame(&CELLPOWER_18FF50E7, can_config.battery);
|
transmit_can_frame(&CELLPOWER_18FF50E7);
|
||||||
transmit_can_frame(&CELLPOWER_18FF50E5, can_config.battery);
|
transmit_can_frame(&CELLPOWER_18FF50E5);
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -596,8 +596,8 @@ void ChademoBattery::transmit_can(unsigned long currentMillis) {
|
||||||
* that is the limiting factor. Therefore, we
|
* that is the limiting factor. Therefore, we
|
||||||
* can generally send as is without tweaks here.
|
* can generally send as is without tweaks here.
|
||||||
*/
|
*/
|
||||||
transmit_can_frame(&CHADEMO_108, can_config.battery);
|
transmit_can_frame(&CHADEMO_108);
|
||||||
transmit_can_frame(&CHADEMO_109, can_config.battery);
|
transmit_can_frame(&CHADEMO_109);
|
||||||
|
|
||||||
/* TODO for dynamic control: can send x118 with byte 6 bit 0 set to 0 for 1s (before flipping back to 1) as a way of giving vehicle a chance to update 101.1 and 101.2
|
/* TODO for dynamic control: can send x118 with byte 6 bit 0 set to 0 for 1s (before flipping back to 1) as a way of giving vehicle a chance to update 101.1 and 101.2
|
||||||
* within 6 seconds of x118 toggle.
|
* within 6 seconds of x118 toggle.
|
||||||
|
@ -606,9 +606,9 @@ void ChademoBattery::transmit_can(unsigned long currentMillis) {
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (EVSE_mode == CHADEMO_DISCHARGE || EVSE_mode == CHADEMO_BIDIRECTIONAL) {
|
if (EVSE_mode == CHADEMO_DISCHARGE || EVSE_mode == CHADEMO_BIDIRECTIONAL) {
|
||||||
transmit_can_frame(&CHADEMO_208, can_config.battery);
|
transmit_can_frame(&CHADEMO_208);
|
||||||
if (x201_received) {
|
if (x201_received) {
|
||||||
transmit_can_frame(&CHADEMO_209, can_config.battery);
|
transmit_can_frame(&CHADEMO_209);
|
||||||
x209_sent = true;
|
x209_sent = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -620,7 +620,7 @@ void ChademoBattery::transmit_can(unsigned long currentMillis) {
|
||||||
//FIXME REMOVE
|
//FIXME REMOVE
|
||||||
logging.println("REMOVE: proto 2.0");
|
logging.println("REMOVE: proto 2.0");
|
||||||
#endif
|
#endif
|
||||||
transmit_can_frame(&CHADEMO_118, can_config.battery);
|
transmit_can_frame(&CHADEMO_118);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -236,6 +236,10 @@ inline void ISA_handle528(CAN_frame* frame) {
|
||||||
lastWh = wh;
|
lastWh = wh;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void transmit_can_frame(CAN_frame* frame, CAN_Interface can_interface) {
|
||||||
|
transmit_can_frame_to_interface(frame, can_interface);
|
||||||
|
}
|
||||||
|
|
||||||
void ISA_initialize() {
|
void ISA_initialize() {
|
||||||
firstframe = false;
|
firstframe = false;
|
||||||
ISA_STOP();
|
ISA_STOP();
|
||||||
|
|
|
@ -128,7 +128,7 @@ void CmfaEvBattery::handle_incoming_can_frame(CAN_frame rx_frame) {
|
||||||
break;
|
break;
|
||||||
case 0x7BB: // Reply from battery
|
case 0x7BB: // Reply from battery
|
||||||
if (rx_frame.data.u8[0] == 0x10) { //PID header
|
if (rx_frame.data.u8[0] == 0x10) { //PID header
|
||||||
transmit_can_frame(&CMFA_ACK, can_config.battery);
|
transmit_can_frame(&CMFA_ACK);
|
||||||
}
|
}
|
||||||
|
|
||||||
pid_reply = (rx_frame.data.u8[2] << 8) + rx_frame.data.u8[3];
|
pid_reply = (rx_frame.data.u8[2] << 8) + rx_frame.data.u8[3];
|
||||||
|
@ -440,10 +440,10 @@ void CmfaEvBattery::transmit_can(unsigned long currentMillis) {
|
||||||
// Send 10ms CAN Message
|
// Send 10ms CAN Message
|
||||||
if (currentMillis - previousMillis10ms >= INTERVAL_10_MS) {
|
if (currentMillis - previousMillis10ms >= INTERVAL_10_MS) {
|
||||||
previousMillis10ms = currentMillis;
|
previousMillis10ms = currentMillis;
|
||||||
transmit_can_frame(&CMFA_1EA, can_config.battery);
|
transmit_can_frame(&CMFA_1EA);
|
||||||
transmit_can_frame(&CMFA_135, can_config.battery);
|
transmit_can_frame(&CMFA_135);
|
||||||
transmit_can_frame(&CMFA_134, can_config.battery);
|
transmit_can_frame(&CMFA_134);
|
||||||
transmit_can_frame(&CMFA_125, can_config.battery);
|
transmit_can_frame(&CMFA_125);
|
||||||
|
|
||||||
CMFA_135.data.u8[1] = content_135[counter_10ms];
|
CMFA_135.data.u8[1] = content_135[counter_10ms];
|
||||||
CMFA_125.data.u8[3] = content_125[counter_10ms];
|
CMFA_125.data.u8[3] = content_125[counter_10ms];
|
||||||
|
@ -453,8 +453,8 @@ void CmfaEvBattery::transmit_can(unsigned long currentMillis) {
|
||||||
if (currentMillis - previousMillis100ms >= INTERVAL_100_MS) {
|
if (currentMillis - previousMillis100ms >= INTERVAL_100_MS) {
|
||||||
previousMillis100ms = currentMillis;
|
previousMillis100ms = currentMillis;
|
||||||
|
|
||||||
transmit_can_frame(&CMFA_59B, can_config.battery);
|
transmit_can_frame(&CMFA_59B);
|
||||||
transmit_can_frame(&CMFA_3D3, can_config.battery);
|
transmit_can_frame(&CMFA_3D3);
|
||||||
}
|
}
|
||||||
//Send 200ms message
|
//Send 200ms message
|
||||||
if (currentMillis - previousMillis200ms >= INTERVAL_200_MS) {
|
if (currentMillis - previousMillis200ms >= INTERVAL_200_MS) {
|
||||||
|
@ -935,7 +935,7 @@ void CmfaEvBattery::transmit_can(unsigned long currentMillis) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
transmit_can_frame(&CMFA_POLLING_FRAME, can_config.battery);
|
transmit_can_frame(&CMFA_POLLING_FRAME);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -32,6 +32,8 @@ class CanBattery : public Battery, Transmitter, CanReceiver {
|
||||||
}
|
}
|
||||||
|
|
||||||
CAN_Speed change_can_speed(CAN_Speed speed);
|
CAN_Speed change_can_speed(CAN_Speed speed);
|
||||||
|
|
||||||
|
void transmit_can_frame(CAN_frame* frame) { transmit_can_frame_to_interface(frame, can_interface); }
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -466,7 +466,7 @@ void EcmpBattery::handle_incoming_can_frame(CAN_frame rx_frame) {
|
||||||
} else { //Normal PID polling ongoing
|
} else { //Normal PID polling ongoing
|
||||||
|
|
||||||
if (rx_frame.data.u8[0] == 0x10) { //Multiframe response, send ACK
|
if (rx_frame.data.u8[0] == 0x10) { //Multiframe response, send ACK
|
||||||
transmit_can_frame(&ECMP_ACK, can_config.battery);
|
transmit_can_frame(&ECMP_ACK);
|
||||||
//Multiframe has the poll reply slightly different location
|
//Multiframe has the poll reply slightly different location
|
||||||
incoming_poll = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
|
incoming_poll = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
|
||||||
}
|
}
|
||||||
|
@ -852,19 +852,19 @@ void EcmpBattery::transmit_can(unsigned long currentMillis) {
|
||||||
//Failure to do this results in the contactors opening after 30 seconds with load
|
//Failure to do this results in the contactors opening after 30 seconds with load
|
||||||
if (datalayer_extended.stellantisECMP.UserRequestDisableIsoMonitoring) {
|
if (datalayer_extended.stellantisECMP.UserRequestDisableIsoMonitoring) {
|
||||||
if (DisableIsoMonitoringStatemachine == 0) {
|
if (DisableIsoMonitoringStatemachine == 0) {
|
||||||
transmit_can_frame(&ECMP_DIAG_START, can_config.battery);
|
transmit_can_frame(&ECMP_DIAG_START);
|
||||||
DisableIsoMonitoringStatemachine = 1;
|
DisableIsoMonitoringStatemachine = 1;
|
||||||
}
|
}
|
||||||
if (DisableIsoMonitoringStatemachine == 2) {
|
if (DisableIsoMonitoringStatemachine == 2) {
|
||||||
transmit_can_frame(&ECMP_ACK_MESSAGE, can_config.battery);
|
transmit_can_frame(&ECMP_ACK_MESSAGE);
|
||||||
DisableIsoMonitoringStatemachine = 3;
|
DisableIsoMonitoringStatemachine = 3;
|
||||||
}
|
}
|
||||||
if (DisableIsoMonitoringStatemachine == 4) {
|
if (DisableIsoMonitoringStatemachine == 4) {
|
||||||
transmit_can_frame(&ECMP_FACTORY_MODE_ACTIVATION, can_config.battery);
|
transmit_can_frame(&ECMP_FACTORY_MODE_ACTIVATION);
|
||||||
DisableIsoMonitoringStatemachine = 5;
|
DisableIsoMonitoringStatemachine = 5;
|
||||||
}
|
}
|
||||||
if (DisableIsoMonitoringStatemachine == 6) {
|
if (DisableIsoMonitoringStatemachine == 6) {
|
||||||
transmit_can_frame(&ECMP_DISABLE_ISOLATION_REQ, can_config.battery);
|
transmit_can_frame(&ECMP_DISABLE_ISOLATION_REQ);
|
||||||
DisableIsoMonitoringStatemachine = 7;
|
DisableIsoMonitoringStatemachine = 7;
|
||||||
}
|
}
|
||||||
timeSpentDisableIsoMonitoring++;
|
timeSpentDisableIsoMonitoring++;
|
||||||
|
@ -875,15 +875,15 @@ void EcmpBattery::transmit_can(unsigned long currentMillis) {
|
||||||
}
|
}
|
||||||
} else if (datalayer_extended.stellantisECMP.UserRequestContactorReset) {
|
} else if (datalayer_extended.stellantisECMP.UserRequestContactorReset) {
|
||||||
if (ContactorResetStatemachine == 0) {
|
if (ContactorResetStatemachine == 0) {
|
||||||
transmit_can_frame(&ECMP_DIAG_START, can_config.battery);
|
transmit_can_frame(&ECMP_DIAG_START);
|
||||||
ContactorResetStatemachine = 1;
|
ContactorResetStatemachine = 1;
|
||||||
}
|
}
|
||||||
if (ContactorResetStatemachine == 2) {
|
if (ContactorResetStatemachine == 2) {
|
||||||
transmit_can_frame(&ECMP_CONTACTOR_RESET_START, can_config.battery);
|
transmit_can_frame(&ECMP_CONTACTOR_RESET_START);
|
||||||
ContactorResetStatemachine = 3;
|
ContactorResetStatemachine = 3;
|
||||||
}
|
}
|
||||||
if (ContactorResetStatemachine == 4) {
|
if (ContactorResetStatemachine == 4) {
|
||||||
transmit_can_frame(&ECMP_CONTACTOR_RESET_PROGRESS, can_config.battery);
|
transmit_can_frame(&ECMP_CONTACTOR_RESET_PROGRESS);
|
||||||
ContactorResetStatemachine = 5;
|
ContactorResetStatemachine = 5;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -897,15 +897,15 @@ void EcmpBattery::transmit_can(unsigned long currentMillis) {
|
||||||
} else if (datalayer_extended.stellantisECMP.UserRequestCollisionReset) {
|
} else if (datalayer_extended.stellantisECMP.UserRequestCollisionReset) {
|
||||||
|
|
||||||
if (CollisionResetStatemachine == 0) {
|
if (CollisionResetStatemachine == 0) {
|
||||||
transmit_can_frame(&ECMP_DIAG_START, can_config.battery);
|
transmit_can_frame(&ECMP_DIAG_START);
|
||||||
CollisionResetStatemachine = 1;
|
CollisionResetStatemachine = 1;
|
||||||
}
|
}
|
||||||
if (CollisionResetStatemachine == 2) {
|
if (CollisionResetStatemachine == 2) {
|
||||||
transmit_can_frame(&ECMP_COLLISION_RESET_START, can_config.battery);
|
transmit_can_frame(&ECMP_COLLISION_RESET_START);
|
||||||
CollisionResetStatemachine = 3;
|
CollisionResetStatemachine = 3;
|
||||||
}
|
}
|
||||||
if (CollisionResetStatemachine == 4) {
|
if (CollisionResetStatemachine == 4) {
|
||||||
transmit_can_frame(&ECMP_COLLISION_RESET_PROGRESS, can_config.battery);
|
transmit_can_frame(&ECMP_COLLISION_RESET_PROGRESS);
|
||||||
CollisionResetStatemachine = 5;
|
CollisionResetStatemachine = 5;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -919,15 +919,15 @@ void EcmpBattery::transmit_can(unsigned long currentMillis) {
|
||||||
} else if (datalayer_extended.stellantisECMP.UserRequestIsolationReset) {
|
} else if (datalayer_extended.stellantisECMP.UserRequestIsolationReset) {
|
||||||
|
|
||||||
if (IsolationResetStatemachine == 0) {
|
if (IsolationResetStatemachine == 0) {
|
||||||
transmit_can_frame(&ECMP_DIAG_START, can_config.battery);
|
transmit_can_frame(&ECMP_DIAG_START);
|
||||||
IsolationResetStatemachine = 1;
|
IsolationResetStatemachine = 1;
|
||||||
}
|
}
|
||||||
if (IsolationResetStatemachine == 2) {
|
if (IsolationResetStatemachine == 2) {
|
||||||
transmit_can_frame(&ECMP_ISOLATION_RESET_START, can_config.battery);
|
transmit_can_frame(&ECMP_ISOLATION_RESET_START);
|
||||||
IsolationResetStatemachine = 3;
|
IsolationResetStatemachine = 3;
|
||||||
}
|
}
|
||||||
if (IsolationResetStatemachine == 4) {
|
if (IsolationResetStatemachine == 4) {
|
||||||
transmit_can_frame(&ECMP_ISOLATION_RESET_PROGRESS, can_config.battery);
|
transmit_can_frame(&ECMP_ISOLATION_RESET_PROGRESS);
|
||||||
IsolationResetStatemachine = 5;
|
IsolationResetStatemachine = 5;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1299,7 +1299,7 @@ void EcmpBattery::transmit_can(unsigned long currentMillis) {
|
||||||
poll_state = PID_WELD_CHECK;
|
poll_state = PID_WELD_CHECK;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
transmit_can_frame(&ECMP_POLL, can_config.battery);
|
transmit_can_frame(&ECMP_POLL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1328,14 +1328,14 @@ void EcmpBattery::transmit_can(unsigned long currentMillis) {
|
||||||
ECMP_17B.data.u8[7] = counter_10ms << 4 | checksum_calc(counter_10ms, ECMP_17B);
|
ECMP_17B.data.u8[7] = counter_10ms << 4 | checksum_calc(counter_10ms, ECMP_17B);
|
||||||
ECMP_112.data.u8[7] = counter_10ms << 4 | checksum_calc(counter_10ms, ECMP_112);
|
ECMP_112.data.u8[7] = counter_10ms << 4 | checksum_calc(counter_10ms, ECMP_112);
|
||||||
|
|
||||||
transmit_can_frame(&ECMP_112, can_config.battery); //MCU1_112
|
transmit_can_frame(&ECMP_112); //MCU1_112
|
||||||
transmit_can_frame(&ECMP_0C5, can_config.battery); //DC2_0C5
|
transmit_can_frame(&ECMP_0C5); //DC2_0C5
|
||||||
transmit_can_frame(&ECMP_17B, can_config.battery); //VCU_PCANInfo_17B
|
transmit_can_frame(&ECMP_17B); //VCU_PCANInfo_17B
|
||||||
transmit_can_frame(&ECMP_0F2, can_config.battery); //CtrlMCU1_0F2
|
transmit_can_frame(&ECMP_0F2); //CtrlMCU1_0F2
|
||||||
if (simulateEntireCar) {
|
if (simulateEntireCar) {
|
||||||
transmit_can_frame(&ECMP_111, can_config.battery);
|
transmit_can_frame(&ECMP_111);
|
||||||
transmit_can_frame(&ECMP_110, can_config.battery);
|
transmit_can_frame(&ECMP_110);
|
||||||
transmit_can_frame(&ECMP_114, can_config.battery);
|
transmit_can_frame(&ECMP_114);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1354,7 +1354,7 @@ void EcmpBattery::transmit_can(unsigned long currentMillis) {
|
||||||
|
|
||||||
ECMP_0F0.data.u8[7] = counter_20ms << 4 | checksum_calc(counter_20ms, ECMP_0F0);
|
ECMP_0F0.data.u8[7] = counter_20ms << 4 | checksum_calc(counter_20ms, ECMP_0F0);
|
||||||
|
|
||||||
transmit_can_frame(&ECMP_0F0, can_config.battery); //VCU2_0F0
|
transmit_can_frame(&ECMP_0F0); //VCU2_0F0
|
||||||
}
|
}
|
||||||
// Send 50ms periodic CAN Message simulating the car still being attached
|
// Send 50ms periodic CAN Message simulating the car still being attached
|
||||||
if (currentMillis - previousMillis50 >= INTERVAL_50_MS) {
|
if (currentMillis - previousMillis50 >= INTERVAL_50_MS) {
|
||||||
|
@ -1367,8 +1367,8 @@ void EcmpBattery::transmit_can(unsigned long currentMillis) {
|
||||||
//Normal operation for contactor closing
|
//Normal operation for contactor closing
|
||||||
ECMP_27A.data = {0x4F, 0x58, 0x00, 0x02, 0x24, 0x00, 0x00, 0x00};
|
ECMP_27A.data = {0x4F, 0x58, 0x00, 0x02, 0x24, 0x00, 0x00, 0x00};
|
||||||
}
|
}
|
||||||
transmit_can_frame(&ECMP_230, can_config.battery); //OBC3_230
|
transmit_can_frame(&ECMP_230); //OBC3_230
|
||||||
transmit_can_frame(&ECMP_27A, can_config.battery); //VCU_BSI_Wakeup_27A
|
transmit_can_frame(&ECMP_27A); //VCU_BSI_Wakeup_27A
|
||||||
}
|
}
|
||||||
// Send 100ms periodic CAN Message simulating the car still being attached
|
// Send 100ms periodic CAN Message simulating the car still being attached
|
||||||
if (currentMillis - previousMillis100 >= INTERVAL_100_MS) {
|
if (currentMillis - previousMillis100 >= INTERVAL_100_MS) {
|
||||||
|
@ -1418,7 +1418,7 @@ void EcmpBattery::transmit_can(unsigned long currentMillis) {
|
||||||
data_3A2_CRC[13] = 0xDF;
|
data_3A2_CRC[13] = 0xDF;
|
||||||
data_3A2_CRC[14] = 0xEE;
|
data_3A2_CRC[14] = 0xEE;
|
||||||
data_3A2_CRC[15] = 0xFD;
|
data_3A2_CRC[15] = 0xFD;
|
||||||
transmit_can_frame(&ECMP_3D0, can_config.battery); //Not in logs, but makes speed go to 0km/h
|
transmit_can_frame(&ECMP_3D0); //Not in logs, but makes speed go to 0km/h
|
||||||
} else {
|
} else {
|
||||||
//Normal operation for contactor closing
|
//Normal operation for contactor closing
|
||||||
ECMP_31E.data.u8[0] = 0x50;
|
ECMP_31E.data.u8[0] = 0x50;
|
||||||
|
@ -1472,26 +1472,26 @@ void EcmpBattery::transmit_can(unsigned long currentMillis) {
|
||||||
ECMP_31D.data.u8[7] = counter_100ms << 4 | checksum_calc(counter_100ms, ECMP_31D);
|
ECMP_31D.data.u8[7] = counter_100ms << 4 | checksum_calc(counter_100ms, ECMP_31D);
|
||||||
ECMP_3D0.data.u8[7] = counter_100ms << 4 | checksum_calc(counter_100ms, ECMP_3D0);
|
ECMP_3D0.data.u8[7] = counter_100ms << 4 | checksum_calc(counter_100ms, ECMP_3D0);
|
||||||
|
|
||||||
transmit_can_frame(&ECMP_382, can_config.battery); //PSA Specific VCU (BSIInfo_382)
|
transmit_can_frame(&ECMP_382); //PSA Specific VCU (BSIInfo_382)
|
||||||
transmit_can_frame(&ECMP_345, can_config.battery); //DC1_345
|
transmit_can_frame(&ECMP_345); //DC1_345
|
||||||
transmit_can_frame(&ECMP_3A2, can_config.battery); //OBC2_3A2
|
transmit_can_frame(&ECMP_3A2); //OBC2_3A2
|
||||||
transmit_can_frame(&ECMP_3A3, can_config.battery); //OBC1_3A3
|
transmit_can_frame(&ECMP_3A3); //OBC1_3A3
|
||||||
transmit_can_frame(&ECMP_010, can_config.battery); //VCU_BCM_Crash
|
transmit_can_frame(&ECMP_010); //VCU_BCM_Crash
|
||||||
if (simulateEntireCar) {
|
if (simulateEntireCar) {
|
||||||
transmit_can_frame(&ECMP_31E, can_config.battery);
|
transmit_can_frame(&ECMP_31E);
|
||||||
transmit_can_frame(&ECMP_383, can_config.battery);
|
transmit_can_frame(&ECMP_383);
|
||||||
transmit_can_frame(&ECMP_0A6, can_config.battery); //Not in all logs
|
transmit_can_frame(&ECMP_0A6); //Not in all logs
|
||||||
transmit_can_frame(&ECMP_37F, can_config.battery); //Seems to be temperatures of some sort
|
transmit_can_frame(&ECMP_37F); //Seems to be temperatures of some sort
|
||||||
transmit_can_frame(&ECMP_372, can_config.battery);
|
transmit_can_frame(&ECMP_372);
|
||||||
transmit_can_frame(&ECMP_351, can_config.battery);
|
transmit_can_frame(&ECMP_351);
|
||||||
transmit_can_frame(&ECMP_31D, can_config.battery);
|
transmit_can_frame(&ECMP_31D);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Send 500ms periodic CAN Message simulating the car still being attached
|
// Send 500ms periodic CAN Message simulating the car still being attached
|
||||||
if (currentMillis - previousMillis500 >= INTERVAL_500_MS) {
|
if (currentMillis - previousMillis500 >= INTERVAL_500_MS) {
|
||||||
previousMillis500 = currentMillis;
|
previousMillis500 = currentMillis;
|
||||||
if (simulateEntireCar) {
|
if (simulateEntireCar) {
|
||||||
transmit_can_frame(&ECMP_0AE, can_config.battery);
|
transmit_can_frame(&ECMP_0AE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Send 1s CAN Message
|
// Send 1s CAN Message
|
||||||
|
@ -1515,21 +1515,21 @@ void EcmpBattery::transmit_can(unsigned long currentMillis) {
|
||||||
ECMP_552.data.u8[2] = ((ticks_552 & 0x0000FF00) >> 8);
|
ECMP_552.data.u8[2] = ((ticks_552 & 0x0000FF00) >> 8);
|
||||||
ECMP_552.data.u8[3] = (ticks_552 & 0x000000FF);
|
ECMP_552.data.u8[3] = (ticks_552 & 0x000000FF);
|
||||||
|
|
||||||
transmit_can_frame(&ECMP_439, can_config.battery); //OBC4
|
transmit_can_frame(&ECMP_439); //OBC4
|
||||||
transmit_can_frame(&ECMP_552, can_config.battery); //VCU_552 timetracking
|
transmit_can_frame(&ECMP_552); //VCU_552 timetracking
|
||||||
if (simulateEntireCar) {
|
if (simulateEntireCar) {
|
||||||
transmit_can_frame(&ECMP_486, can_config.battery); //Not in all logs
|
transmit_can_frame(&ECMP_486); //Not in all logs
|
||||||
transmit_can_frame(&ECMP_041, can_config.battery); //Not in all logs
|
transmit_can_frame(&ECMP_041); //Not in all logs
|
||||||
transmit_can_frame(&ECMP_786, can_config.battery); //Not in all logs
|
transmit_can_frame(&ECMP_786); //Not in all logs
|
||||||
transmit_can_frame(&ECMP_591, can_config.battery); //Not in all logs
|
transmit_can_frame(&ECMP_591); //Not in all logs
|
||||||
transmit_can_frame(&ECMP_794, can_config.battery); //Not in all logs
|
transmit_can_frame(&ECMP_794); //Not in all logs
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Send 5s periodic CAN Message simulating the car still being attached
|
// Send 5s periodic CAN Message simulating the car still being attached
|
||||||
if (currentMillis - previousMillis5000 >= INTERVAL_5_S) {
|
if (currentMillis - previousMillis5000 >= INTERVAL_5_S) {
|
||||||
previousMillis5000 = currentMillis;
|
previousMillis5000 = currentMillis;
|
||||||
if (simulateEntireCar) {
|
if (simulateEntireCar) {
|
||||||
transmit_can_frame(&ECMP_55F, can_config.battery);
|
transmit_can_frame(&ECMP_55F);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -417,7 +417,7 @@ void FoxessBattery::transmit_can(unsigned long currentMillis) {
|
||||||
FOX_1871.data.u8[5] = 0x00;
|
FOX_1871.data.u8[5] = 0x00;
|
||||||
FOX_1871.data.u8[6] = 0x00;
|
FOX_1871.data.u8[6] = 0x00;
|
||||||
FOX_1871.data.u8[7] = 0x00;
|
FOX_1871.data.u8[7] = 0x00;
|
||||||
transmit_can_frame(&FOX_1871, can_config.battery); //bms_send_pack_statistics
|
transmit_can_frame(&FOX_1871); //bms_send_pack_statistics
|
||||||
break;
|
break;
|
||||||
case 1: //1s
|
case 1: //1s
|
||||||
FOX_1871.data.u8[0] = 0x02;
|
FOX_1871.data.u8[0] = 0x02;
|
||||||
|
@ -428,7 +428,7 @@ void FoxessBattery::transmit_can(unsigned long currentMillis) {
|
||||||
FOX_1871.data.u8[5] = 0x00;
|
FOX_1871.data.u8[5] = 0x00;
|
||||||
FOX_1871.data.u8[6] = 0x00;
|
FOX_1871.data.u8[6] = 0x00;
|
||||||
FOX_1871.data.u8[7] = 0x00;
|
FOX_1871.data.u8[7] = 0x00;
|
||||||
transmit_can_frame(&FOX_1871, can_config.battery); //bms_stop_sending
|
transmit_can_frame(&FOX_1871); //bms_stop_sending
|
||||||
break;
|
break;
|
||||||
case 2: //1.5s
|
case 2: //1.5s
|
||||||
FOX_1871.data.u8[0] = 0x05;
|
FOX_1871.data.u8[0] = 0x05;
|
||||||
|
@ -439,7 +439,7 @@ void FoxessBattery::transmit_can(unsigned long currentMillis) {
|
||||||
FOX_1871.data.u8[5] = 0x00;
|
FOX_1871.data.u8[5] = 0x00;
|
||||||
FOX_1871.data.u8[6] = 0x00;
|
FOX_1871.data.u8[6] = 0x00;
|
||||||
FOX_1871.data.u8[7] = 0x00;
|
FOX_1871.data.u8[7] = 0x00;
|
||||||
transmit_can_frame(&FOX_1871, can_config.battery); //bms_serial_request
|
transmit_can_frame(&FOX_1871); //bms_serial_request
|
||||||
break;
|
break;
|
||||||
case 3: //2.0s
|
case 3: //2.0s
|
||||||
FOX_1871.data.u8[0] = 0x01;
|
FOX_1871.data.u8[0] = 0x01;
|
||||||
|
@ -450,7 +450,7 @@ void FoxessBattery::transmit_can(unsigned long currentMillis) {
|
||||||
FOX_1871.data.u8[5] = 0x00;
|
FOX_1871.data.u8[5] = 0x00;
|
||||||
FOX_1871.data.u8[6] = 0x00;
|
FOX_1871.data.u8[6] = 0x00;
|
||||||
FOX_1871.data.u8[7] = 0x00;
|
FOX_1871.data.u8[7] = 0x00;
|
||||||
transmit_can_frame(&FOX_1871, can_config.battery); //bms_send_pack_statistics
|
transmit_can_frame(&FOX_1871); //bms_send_pack_statistics
|
||||||
break;
|
break;
|
||||||
case 4: //2.5s
|
case 4: //2.5s
|
||||||
FOX_1871.data.u8[0] = 0x02;
|
FOX_1871.data.u8[0] = 0x02;
|
||||||
|
@ -461,7 +461,7 @@ void FoxessBattery::transmit_can(unsigned long currentMillis) {
|
||||||
FOX_1871.data.u8[5] = 0x00;
|
FOX_1871.data.u8[5] = 0x00;
|
||||||
FOX_1871.data.u8[6] = 0x00;
|
FOX_1871.data.u8[6] = 0x00;
|
||||||
FOX_1871.data.u8[7] = 0x00;
|
FOX_1871.data.u8[7] = 0x00;
|
||||||
transmit_can_frame(&FOX_1871, can_config.battery); //bms_stop_sending
|
transmit_can_frame(&FOX_1871); //bms_stop_sending
|
||||||
break;
|
break;
|
||||||
case 5: //3.0s cell temp and voltages
|
case 5: //3.0s cell temp and voltages
|
||||||
//0x1871 [0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00]
|
//0x1871 [0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00]
|
||||||
|
@ -473,7 +473,7 @@ void FoxessBattery::transmit_can(unsigned long currentMillis) {
|
||||||
FOX_1871.data.u8[5] = 0x00;
|
FOX_1871.data.u8[5] = 0x00;
|
||||||
FOX_1871.data.u8[6] = 0x00;
|
FOX_1871.data.u8[6] = 0x00;
|
||||||
FOX_1871.data.u8[7] = 0x00;
|
FOX_1871.data.u8[7] = 0x00;
|
||||||
transmit_can_frame(&FOX_1871, can_config.battery); //bms_send_pack_cell_volts
|
transmit_can_frame(&FOX_1871); //bms_send_pack_cell_volts
|
||||||
//0x1871 [0x01, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00]
|
//0x1871 [0x01, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00]
|
||||||
FOX_1871.data.u8[0] = 0x01;
|
FOX_1871.data.u8[0] = 0x01;
|
||||||
FOX_1871.data.u8[1] = 0x00;
|
FOX_1871.data.u8[1] = 0x00;
|
||||||
|
@ -483,7 +483,7 @@ void FoxessBattery::transmit_can(unsigned long currentMillis) {
|
||||||
FOX_1871.data.u8[5] = 0x00;
|
FOX_1871.data.u8[5] = 0x00;
|
||||||
FOX_1871.data.u8[6] = 0x00;
|
FOX_1871.data.u8[6] = 0x00;
|
||||||
FOX_1871.data.u8[7] = 0x00;
|
FOX_1871.data.u8[7] = 0x00;
|
||||||
transmit_can_frame(&FOX_1871, can_config.battery); //bms_send_pack_cell_temps
|
transmit_can_frame(&FOX_1871); //bms_send_pack_cell_temps
|
||||||
break;
|
break;
|
||||||
case 6: //3.5s
|
case 6: //3.5s
|
||||||
FOX_1871.data.u8[0] = 0x01;
|
FOX_1871.data.u8[0] = 0x01;
|
||||||
|
@ -494,7 +494,7 @@ void FoxessBattery::transmit_can(unsigned long currentMillis) {
|
||||||
FOX_1871.data.u8[5] = 0x00;
|
FOX_1871.data.u8[5] = 0x00;
|
||||||
FOX_1871.data.u8[6] = 0x00;
|
FOX_1871.data.u8[6] = 0x00;
|
||||||
FOX_1871.data.u8[7] = 0x00;
|
FOX_1871.data.u8[7] = 0x00;
|
||||||
transmit_can_frame(&FOX_1871, can_config.battery); //bms_send_pack_statistics
|
transmit_can_frame(&FOX_1871); //bms_send_pack_statistics
|
||||||
break;
|
break;
|
||||||
case 7: //4.0s
|
case 7: //4.0s
|
||||||
FOX_1871.data.u8[0] = 0x02;
|
FOX_1871.data.u8[0] = 0x02;
|
||||||
|
@ -505,7 +505,7 @@ void FoxessBattery::transmit_can(unsigned long currentMillis) {
|
||||||
FOX_1871.data.u8[5] = 0x00;
|
FOX_1871.data.u8[5] = 0x00;
|
||||||
FOX_1871.data.u8[6] = 0x00;
|
FOX_1871.data.u8[6] = 0x00;
|
||||||
FOX_1871.data.u8[7] = 0x00;
|
FOX_1871.data.u8[7] = 0x00;
|
||||||
transmit_can_frame(&FOX_1871, can_config.battery); //bms_stop_sending
|
transmit_can_frame(&FOX_1871); //bms_stop_sending
|
||||||
break;
|
break;
|
||||||
case 8: //4.5s
|
case 8: //4.5s
|
||||||
FOX_1871.data.u8[0] = 0x01;
|
FOX_1871.data.u8[0] = 0x01;
|
||||||
|
@ -516,7 +516,7 @@ void FoxessBattery::transmit_can(unsigned long currentMillis) {
|
||||||
FOX_1871.data.u8[5] = 0x00;
|
FOX_1871.data.u8[5] = 0x00;
|
||||||
FOX_1871.data.u8[6] = 0x00;
|
FOX_1871.data.u8[6] = 0x00;
|
||||||
FOX_1871.data.u8[7] = 0x00;
|
FOX_1871.data.u8[7] = 0x00;
|
||||||
transmit_can_frame(&FOX_1871, can_config.battery); //bms_send_pack_statistics
|
transmit_can_frame(&FOX_1871); //bms_send_pack_statistics
|
||||||
break;
|
break;
|
||||||
case 9: //5.0s
|
case 9: //5.0s
|
||||||
FOX_1871.data.u8[0] = 0x02;
|
FOX_1871.data.u8[0] = 0x02;
|
||||||
|
@ -527,7 +527,7 @@ void FoxessBattery::transmit_can(unsigned long currentMillis) {
|
||||||
FOX_1871.data.u8[5] = 0x00;
|
FOX_1871.data.u8[5] = 0x00;
|
||||||
FOX_1871.data.u8[6] = 0x00;
|
FOX_1871.data.u8[6] = 0x00;
|
||||||
FOX_1871.data.u8[7] = 0x00;
|
FOX_1871.data.u8[7] = 0x00;
|
||||||
transmit_can_frame(&FOX_1871, can_config.battery); //bms_stop_sending
|
transmit_can_frame(&FOX_1871); //bms_stop_sending
|
||||||
break;
|
break;
|
||||||
case 10: //5.5s
|
case 10: //5.5s
|
||||||
//0x1871 [0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00]
|
//0x1871 [0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00]
|
||||||
|
@ -539,7 +539,7 @@ void FoxessBattery::transmit_can(unsigned long currentMillis) {
|
||||||
FOX_1871.data.u8[5] = 0x00;
|
FOX_1871.data.u8[5] = 0x00;
|
||||||
FOX_1871.data.u8[6] = 0x00;
|
FOX_1871.data.u8[6] = 0x00;
|
||||||
FOX_1871.data.u8[7] = 0x00;
|
FOX_1871.data.u8[7] = 0x00;
|
||||||
transmit_can_frame(&FOX_1871, can_config.battery); //bms_send_pack_cell_volts
|
transmit_can_frame(&FOX_1871); //bms_send_pack_cell_volts
|
||||||
//0x1871 [0x01, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00]
|
//0x1871 [0x01, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00]
|
||||||
FOX_1871.data.u8[0] = 0x01;
|
FOX_1871.data.u8[0] = 0x01;
|
||||||
FOX_1871.data.u8[1] = 0x00;
|
FOX_1871.data.u8[1] = 0x00;
|
||||||
|
@ -549,7 +549,7 @@ void FoxessBattery::transmit_can(unsigned long currentMillis) {
|
||||||
FOX_1871.data.u8[5] = 0x00;
|
FOX_1871.data.u8[5] = 0x00;
|
||||||
FOX_1871.data.u8[6] = 0x00;
|
FOX_1871.data.u8[6] = 0x00;
|
||||||
FOX_1871.data.u8[7] = 0x00;
|
FOX_1871.data.u8[7] = 0x00;
|
||||||
transmit_can_frame(&FOX_1871, can_config.battery); //bms_send_pack_cell_temps
|
transmit_can_frame(&FOX_1871); //bms_send_pack_cell_temps
|
||||||
break;
|
break;
|
||||||
case 11: //6.0s 0x1871 [0x03, 0x06, 0x17, 0x05, 0x09, 0x09, 0x28, 0x22]
|
case 11: //6.0s 0x1871 [0x03, 0x06, 0x17, 0x05, 0x09, 0x09, 0x28, 0x22]
|
||||||
FOX_1871.data.u8[0] = 0x03;
|
FOX_1871.data.u8[0] = 0x03;
|
||||||
|
@ -560,7 +560,7 @@ void FoxessBattery::transmit_can(unsigned long currentMillis) {
|
||||||
FOX_1871.data.u8[5] = 0x09;
|
FOX_1871.data.u8[5] = 0x09;
|
||||||
FOX_1871.data.u8[6] = 0x28;
|
FOX_1871.data.u8[6] = 0x28;
|
||||||
FOX_1871.data.u8[7] = 0x22;
|
FOX_1871.data.u8[7] = 0x22;
|
||||||
transmit_can_frame(&FOX_1871, can_config.battery); //timestamp
|
transmit_can_frame(&FOX_1871); //timestamp
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
statemachine_polling = 0;
|
statemachine_polling = 0;
|
||||||
|
|
|
@ -309,7 +309,7 @@ void GeelyGeometryCBattery::handle_incoming_can_frame(CAN_frame rx_frame) {
|
||||||
break;
|
break;
|
||||||
case 0x7EA:
|
case 0x7EA:
|
||||||
if (rx_frame.data.u8[0] == 0x10) { //Multiframe response, send ACK
|
if (rx_frame.data.u8[0] == 0x10) { //Multiframe response, send ACK
|
||||||
transmit_can_frame(&GEELY_ACK, can_config.battery);
|
transmit_can_frame(&GEELY_ACK);
|
||||||
//Multiframe has the poll reply slightly different location
|
//Multiframe has the poll reply slightly different location
|
||||||
incoming_poll = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
|
incoming_poll = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
|
||||||
}
|
}
|
||||||
|
@ -488,15 +488,15 @@ void GeelyGeometryCBattery::transmit_can(unsigned long currentMillis) {
|
||||||
|
|
||||||
counter_10ms = (counter_10ms + 1) % 17; // 0-1-...F-0-1 etc.
|
counter_10ms = (counter_10ms + 1) % 17; // 0-1-...F-0-1 etc.
|
||||||
|
|
||||||
transmit_can_frame(&GEELY_191, can_config.battery);
|
transmit_can_frame(&GEELY_191);
|
||||||
transmit_can_frame(&GEELY_0A6, can_config.battery);
|
transmit_can_frame(&GEELY_0A6);
|
||||||
transmit_can_frame(&GEELY_160, can_config.battery);
|
transmit_can_frame(&GEELY_160);
|
||||||
transmit_can_frame(&GEELY_165, can_config.battery);
|
transmit_can_frame(&GEELY_165);
|
||||||
transmit_can_frame(&GEELY_1A4, can_config.battery);
|
transmit_can_frame(&GEELY_1A4);
|
||||||
transmit_can_frame(&GEELY_162, can_config.battery); //CONFIRMED MANDATORY! VCU message
|
transmit_can_frame(&GEELY_162); //CONFIRMED MANDATORY! VCU message
|
||||||
transmit_can_frame(&GEELY_1A5, can_config.battery);
|
transmit_can_frame(&GEELY_1A5);
|
||||||
transmit_can_frame(&GEELY_220, can_config.battery); //CONFIRMED MANDATORY! OBC message
|
transmit_can_frame(&GEELY_220); //CONFIRMED MANDATORY! OBC message
|
||||||
transmit_can_frame(&GEELY_0E0, can_config.battery);
|
transmit_can_frame(&GEELY_0E0);
|
||||||
}
|
}
|
||||||
if (currentMillis - previousMillis20 >= INTERVAL_20_MS) {
|
if (currentMillis - previousMillis20 >= INTERVAL_20_MS) {
|
||||||
previousMillis20 = currentMillis;
|
previousMillis20 = currentMillis;
|
||||||
|
@ -508,11 +508,11 @@ void GeelyGeometryCBattery::transmit_can(unsigned long currentMillis) {
|
||||||
|
|
||||||
counter_20ms = (counter_20ms + 1) % 17; // 0-1-...F-0-1 etc.
|
counter_20ms = (counter_20ms + 1) % 17; // 0-1-...F-0-1 etc.
|
||||||
|
|
||||||
transmit_can_frame(&GEELY_145, can_config.battery); //CONFIRMED MANDATORY! shifter
|
transmit_can_frame(&GEELY_145); //CONFIRMED MANDATORY! shifter
|
||||||
transmit_can_frame(&GEELY_0F9, can_config.battery); //CONFIRMED MANDATORY! shifter
|
transmit_can_frame(&GEELY_0F9); //CONFIRMED MANDATORY! shifter
|
||||||
transmit_can_frame(&GEELY_0FA, can_config.battery); //Might be unnecessary, not in workshop manual
|
transmit_can_frame(&GEELY_0FA); //Might be unnecessary, not in workshop manual
|
||||||
transmit_can_frame(&GEELY_197, can_config.battery); //Might be unnecessary, not in workshop manual
|
transmit_can_frame(&GEELY_197); //Might be unnecessary, not in workshop manual
|
||||||
transmit_can_frame(&GEELY_150, can_config.battery);
|
transmit_can_frame(&GEELY_150);
|
||||||
}
|
}
|
||||||
if (currentMillis - previousMillis50 >= INTERVAL_50_MS) {
|
if (currentMillis - previousMillis50 >= INTERVAL_50_MS) {
|
||||||
previousMillis50 = currentMillis;
|
previousMillis50 = currentMillis;
|
||||||
|
@ -524,13 +524,13 @@ void GeelyGeometryCBattery::transmit_can(unsigned long currentMillis) {
|
||||||
|
|
||||||
counter_50ms = (counter_50ms + 1) % 17; // 0-1-...F-0-1 etc.
|
counter_50ms = (counter_50ms + 1) % 17; // 0-1-...F-0-1 etc.
|
||||||
|
|
||||||
transmit_can_frame(&GEELY_1B2, can_config.battery);
|
transmit_can_frame(&GEELY_1B2);
|
||||||
transmit_can_frame(&GEELY_221, can_config.battery); //CONFIRMED MANDATORY! OBC message
|
transmit_can_frame(&GEELY_221); //CONFIRMED MANDATORY! OBC message
|
||||||
//transmit_can_frame(&GEELY_1A3, can_config.battery); //Might be unnecessary, radar info
|
//transmit_can_frame(&GEELY_1A3); //Might be unnecessary, radar info
|
||||||
transmit_can_frame(&GEELY_1A7, can_config.battery); //Might be unnecessary
|
transmit_can_frame(&GEELY_1A7); //Might be unnecessary
|
||||||
transmit_can_frame(&GEELY_0A8, can_config.battery); //CONFIRMED MANDATORY! IPU message
|
transmit_can_frame(&GEELY_0A8); //CONFIRMED MANDATORY! IPU message
|
||||||
transmit_can_frame(&GEELY_1F2, can_config.battery); //Might be unnecessary, not in manual
|
transmit_can_frame(&GEELY_1F2); //Might be unnecessary, not in manual
|
||||||
transmit_can_frame(&GEELY_1A6, can_config.battery); //Might be unnecessary, not in manual
|
transmit_can_frame(&GEELY_1A6); //Might be unnecessary, not in manual
|
||||||
}
|
}
|
||||||
// Send 100ms CAN Message
|
// Send 100ms CAN Message
|
||||||
if (currentMillis - previousMillis100 >= INTERVAL_100_MS) {
|
if (currentMillis - previousMillis100 >= INTERVAL_100_MS) {
|
||||||
|
@ -541,9 +541,9 @@ void GeelyGeometryCBattery::transmit_can(unsigned long currentMillis) {
|
||||||
|
|
||||||
counter_100ms = (counter_100ms + 1) % 17; // 0-1-...F-0-1 etc.
|
counter_100ms = (counter_100ms + 1) % 17; // 0-1-...F-0-1 etc.
|
||||||
|
|
||||||
transmit_can_frame(&GEELY_222, can_config.battery); //CONFIRMED MANDATORY! OBC message
|
transmit_can_frame(&GEELY_222); //CONFIRMED MANDATORY! OBC message
|
||||||
//transmit_can_frame(&GEELY_2D2, can_config.battery); //Might be unnecessary, seat info
|
//transmit_can_frame(&GEELY_2D2); //Might be unnecessary, seat info
|
||||||
transmit_can_frame(&GEELY_292, can_config.battery); //CONFIRMED MANDATORY! T-BOX
|
transmit_can_frame(&GEELY_292); //CONFIRMED MANDATORY! T-BOX
|
||||||
}
|
}
|
||||||
// Send 200ms CAN Message
|
// Send 200ms CAN Message
|
||||||
if (currentMillis - previousMillis200 >= INTERVAL_200_MS) {
|
if (currentMillis - previousMillis200 >= INTERVAL_200_MS) {
|
||||||
|
@ -655,7 +655,7 @@ void GeelyGeometryCBattery::transmit_can(unsigned long currentMillis) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
transmit_can_frame(&GEELY_POLL, can_config.battery);
|
transmit_can_frame(&GEELY_POLL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -221,7 +221,7 @@ void JaguarIpaceBattery::transmit_can(unsigned long currentMillis) {
|
||||||
/* Send keep-alive every 200ms */
|
/* Send keep-alive every 200ms */
|
||||||
if (currentMillis - previousMillisKeepAlive >= INTERVAL_200_MS) {
|
if (currentMillis - previousMillisKeepAlive >= INTERVAL_200_MS) {
|
||||||
previousMillisKeepAlive = currentMillis;
|
previousMillisKeepAlive = currentMillis;
|
||||||
transmit_can_frame(&ipace_keep_alive, can_config.battery);
|
transmit_can_frame(&ipace_keep_alive);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -871,7 +871,7 @@ void KiaEGmpBattery::handle_incoming_can_frame(CAN_frame rx_frame) {
|
||||||
// logging.println ("Send ack");
|
// logging.println ("Send ack");
|
||||||
poll_data_pid = rx_frame.data.u8[4];
|
poll_data_pid = rx_frame.data.u8[4];
|
||||||
// if (rx_frame.data.u8[4] == poll_data_pid) {
|
// if (rx_frame.data.u8[4] == poll_data_pid) {
|
||||||
transmit_can_frame(&EGMP_7E4_ack, can_config.battery); //Send ack to BMS if the same frame is sent as polled
|
transmit_can_frame(&EGMP_7E4_ack); //Send ack to BMS if the same frame is sent as polled
|
||||||
// }
|
// }
|
||||||
break;
|
break;
|
||||||
case 0x21: //First frame in PID group
|
case 0x21: //First frame in PID group
|
||||||
|
@ -1052,7 +1052,7 @@ void KiaEGmpBattery::transmit_can(unsigned long currentMillis) {
|
||||||
if (currentMillis - startMillis >= messageDelays[messageIndex]) {
|
if (currentMillis - startMillis >= messageDelays[messageIndex]) {
|
||||||
|
|
||||||
// Transmit the current message
|
// Transmit the current message
|
||||||
transmit_can_frame(messages[messageIndex], can_config.battery);
|
transmit_can_frame(messages[messageIndex]);
|
||||||
|
|
||||||
// Move to the next message
|
// Move to the next message
|
||||||
messageIndex++;
|
messageIndex++;
|
||||||
|
@ -1071,7 +1071,7 @@ void KiaEGmpBattery::transmit_can(unsigned long currentMillis) {
|
||||||
EGMP_7E4.data.u8[3] = KIA_7E4_COUNTER;
|
EGMP_7E4.data.u8[3] = KIA_7E4_COUNTER;
|
||||||
|
|
||||||
if (ok_start_polling_battery) {
|
if (ok_start_polling_battery) {
|
||||||
transmit_can_frame(&EGMP_7E4, can_config.battery);
|
transmit_can_frame(&EGMP_7E4);
|
||||||
}
|
}
|
||||||
|
|
||||||
KIA_7E4_COUNTER++;
|
KIA_7E4_COUNTER++;
|
||||||
|
|
|
@ -178,17 +178,17 @@ void KiaHyundai64Battery::handle_incoming_can_frame(CAN_frame rx_frame) {
|
||||||
}
|
}
|
||||||
poll_data_pid++;
|
poll_data_pid++;
|
||||||
if (poll_data_pid == 1) {
|
if (poll_data_pid == 1) {
|
||||||
transmit_can_frame(&KIA64_7E4_id1, can_interface);
|
transmit_can_frame(&KIA64_7E4_id1);
|
||||||
} else if (poll_data_pid == 2) {
|
} else if (poll_data_pid == 2) {
|
||||||
transmit_can_frame(&KIA64_7E4_id2, can_interface);
|
transmit_can_frame(&KIA64_7E4_id2);
|
||||||
} else if (poll_data_pid == 3) {
|
} else if (poll_data_pid == 3) {
|
||||||
transmit_can_frame(&KIA64_7E4_id3, can_interface);
|
transmit_can_frame(&KIA64_7E4_id3);
|
||||||
} else if (poll_data_pid == 4) {
|
} else if (poll_data_pid == 4) {
|
||||||
transmit_can_frame(&KIA64_7E4_id4, can_interface);
|
transmit_can_frame(&KIA64_7E4_id4);
|
||||||
} else if (poll_data_pid == 5) {
|
} else if (poll_data_pid == 5) {
|
||||||
transmit_can_frame(&KIA64_7E4_id5, can_interface);
|
transmit_can_frame(&KIA64_7E4_id5);
|
||||||
} else if (poll_data_pid == 6) {
|
} else if (poll_data_pid == 6) {
|
||||||
transmit_can_frame(&KIA64_7E4_id6, can_interface);
|
transmit_can_frame(&KIA64_7E4_id6);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -196,8 +196,7 @@ void KiaHyundai64Battery::handle_incoming_can_frame(CAN_frame rx_frame) {
|
||||||
switch (rx_frame.data.u8[0]) {
|
switch (rx_frame.data.u8[0]) {
|
||||||
case 0x10: //"PID Header"
|
case 0x10: //"PID Header"
|
||||||
if (rx_frame.data.u8[4] == poll_data_pid) {
|
if (rx_frame.data.u8[4] == poll_data_pid) {
|
||||||
transmit_can_frame(&KIA64_7E4_ack,
|
transmit_can_frame(&KIA64_7E4_ack); //Send ack to BMS if the same frame is sent as polled
|
||||||
can_interface); //Send ack to BMS if the same frame is sent as polled
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 0x21: //First frame in PID group
|
case 0x21: //First frame in PID group
|
||||||
|
@ -403,9 +402,9 @@ void KiaHyundai64Battery::transmit_can(unsigned long currentMillis) {
|
||||||
previousMillis100 = currentMillis;
|
previousMillis100 = currentMillis;
|
||||||
|
|
||||||
if (contactor_closing_allowed == nullptr || *contactor_closing_allowed) {
|
if (contactor_closing_allowed == nullptr || *contactor_closing_allowed) {
|
||||||
transmit_can_frame(&KIA64_553, can_interface);
|
transmit_can_frame(&KIA64_553);
|
||||||
transmit_can_frame(&KIA64_57F, can_interface);
|
transmit_can_frame(&KIA64_57F);
|
||||||
transmit_can_frame(&KIA64_2A1, can_interface);
|
transmit_can_frame(&KIA64_2A1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -455,9 +454,9 @@ void KiaHyundai64Battery::transmit_can(unsigned long currentMillis) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
transmit_can_frame(&KIA_HYUNDAI_200, can_interface);
|
transmit_can_frame(&KIA_HYUNDAI_200);
|
||||||
transmit_can_frame(&KIA_HYUNDAI_523, can_interface);
|
transmit_can_frame(&KIA_HYUNDAI_523);
|
||||||
transmit_can_frame(&KIA_HYUNDAI_524, can_interface);
|
transmit_can_frame(&KIA_HYUNDAI_524);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -65,7 +65,7 @@ void KiaHyundaiHybridBattery::handle_incoming_can_frame(CAN_frame rx_frame) {
|
||||||
switch (rx_frame.data.u8[0]) {
|
switch (rx_frame.data.u8[0]) {
|
||||||
case 0x10: //"PID Header"
|
case 0x10: //"PID Header"
|
||||||
if (rx_frame.data.u8[3] == poll_data_pid) {
|
if (rx_frame.data.u8[3] == poll_data_pid) {
|
||||||
transmit_can_frame(&KIA_7E4_ack, can_config.battery); //Send ack to BMS if the same frame is sent as polled
|
transmit_can_frame(&KIA_7E4_ack); //Send ack to BMS if the same frame is sent as polled
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 0x21: //First frame in PID group
|
case 0x21: //First frame in PID group
|
||||||
|
@ -200,15 +200,15 @@ void KiaHyundaiHybridBattery::transmit_can(unsigned long currentMillis) {
|
||||||
}
|
}
|
||||||
poll_data_pid++;
|
poll_data_pid++;
|
||||||
if (poll_data_pid == 1) {
|
if (poll_data_pid == 1) {
|
||||||
transmit_can_frame(&KIA_7E4_id1, can_config.battery);
|
transmit_can_frame(&KIA_7E4_id1);
|
||||||
} else if (poll_data_pid == 2) {
|
} else if (poll_data_pid == 2) {
|
||||||
transmit_can_frame(&KIA_7E4_id2, can_config.battery);
|
transmit_can_frame(&KIA_7E4_id2);
|
||||||
} else if (poll_data_pid == 3) {
|
} else if (poll_data_pid == 3) {
|
||||||
transmit_can_frame(&KIA_7E4_id3, can_config.battery);
|
transmit_can_frame(&KIA_7E4_id3);
|
||||||
} else if (poll_data_pid == 4) {
|
} else if (poll_data_pid == 4) {
|
||||||
|
|
||||||
} else if (poll_data_pid == 5) {
|
} else if (poll_data_pid == 5) {
|
||||||
transmit_can_frame(&KIA_7E4_id5, can_config.battery);
|
transmit_can_frame(&KIA_7E4_id5);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -750,7 +750,7 @@ void MebBattery::handle_incoming_can_frame(CAN_frame rx_frame) {
|
||||||
break;
|
break;
|
||||||
case 0x1C42007B: // Reply from battery
|
case 0x1C42007B: // Reply from battery
|
||||||
if (rx_frame.data.u8[0] == 0x10) { //PID header
|
if (rx_frame.data.u8[0] == 0x10) { //PID header
|
||||||
transmit_can_frame(&MEB_ACK_FRAME, can_config.battery);
|
transmit_can_frame(&MEB_ACK_FRAME);
|
||||||
}
|
}
|
||||||
if (rx_frame.DLC == 8) {
|
if (rx_frame.DLC == 8) {
|
||||||
pid_reply = (rx_frame.data.u8[2] << 8) + rx_frame.data.u8[3];
|
pid_reply = (rx_frame.data.u8[2] << 8) + rx_frame.data.u8[3];
|
||||||
|
@ -1311,7 +1311,7 @@ void MebBattery::transmit_can(unsigned long currentMillis) {
|
||||||
|
|
||||||
counter_10ms = (counter_10ms + 1) % 16; //Goes from 0-1-2-3...15-0-1-2-3..
|
counter_10ms = (counter_10ms + 1) % 16; //Goes from 0-1-2-3...15-0-1-2-3..
|
||||||
|
|
||||||
transmit_can_frame(&MEB_0FC, can_config.battery); // Required for contactor closing
|
transmit_can_frame(&MEB_0FC); // Required for contactor closing
|
||||||
}
|
}
|
||||||
// Send 20ms CAN Message
|
// Send 20ms CAN Message
|
||||||
if (currentMillis - previousMillis20ms >= INTERVAL_20_MS) {
|
if (currentMillis - previousMillis20ms >= INTERVAL_20_MS) {
|
||||||
|
@ -1322,7 +1322,7 @@ void MebBattery::transmit_can(unsigned long currentMillis) {
|
||||||
|
|
||||||
counter_20ms = (counter_20ms + 1) % 16; //Goes from 0-1-2-3...15-0-1-2-3..
|
counter_20ms = (counter_20ms + 1) % 16; //Goes from 0-1-2-3...15-0-1-2-3..
|
||||||
|
|
||||||
transmit_can_frame(&MEB_0FD, can_config.battery); // Required for contactor closing
|
transmit_can_frame(&MEB_0FD); // Required for contactor closing
|
||||||
}
|
}
|
||||||
// Send 40ms CAN Message
|
// Send 40ms CAN Message
|
||||||
if (currentMillis - previousMillis40ms >= INTERVAL_40_MS) {
|
if (currentMillis - previousMillis40ms >= INTERVAL_40_MS) {
|
||||||
|
@ -1339,7 +1339,7 @@ void MebBattery::transmit_can(unsigned long currentMillis) {
|
||||||
}
|
}
|
||||||
toggle = !toggle; // Flip the toggle each time the code block is executed
|
toggle = !toggle; // Flip the toggle each time the code block is executed
|
||||||
|
|
||||||
transmit_can_frame(&MEB_040, can_config.battery); // Airbag message - Needed for contactor closing
|
transmit_can_frame(&MEB_040); // Airbag message - Needed for contactor closing
|
||||||
}
|
}
|
||||||
// Send 50ms CAN Message
|
// Send 50ms CAN Message
|
||||||
if (currentMillis - previousMillis50ms >= INTERVAL_50_MS) {
|
if (currentMillis - previousMillis50ms >= INTERVAL_50_MS) {
|
||||||
|
@ -1355,7 +1355,7 @@ void MebBattery::transmit_can(unsigned long currentMillis) {
|
||||||
MEB_0C0.data.u8[0] = vw_crc_calc(MEB_0C0.data.u8, MEB_0C0.DLC, MEB_0C0.ID);
|
MEB_0C0.data.u8[0] = vw_crc_calc(MEB_0C0.data.u8, MEB_0C0.DLC, MEB_0C0.ID);
|
||||||
counter_50ms = (counter_50ms + 1) % 16; //Goes from 0-1-2-3...15-0-1-2-3..
|
counter_50ms = (counter_50ms + 1) % 16; //Goes from 0-1-2-3...15-0-1-2-3..
|
||||||
|
|
||||||
transmit_can_frame(&MEB_0C0, can_config.battery); // Needed for contactor closing
|
transmit_can_frame(&MEB_0C0); // Needed for contactor closing
|
||||||
}
|
}
|
||||||
// Send 100ms CAN Message
|
// Send 100ms CAN Message
|
||||||
if (currentMillis - previousMillis100ms >= INTERVAL_100_MS) {
|
if (currentMillis - previousMillis100ms >= INTERVAL_100_MS) {
|
||||||
|
@ -1443,11 +1443,11 @@ void MebBattery::transmit_can(unsigned long currentMillis) {
|
||||||
MEB_14C.data.u8[0] = vw_crc_calc(MEB_14C.data.u8, MEB_14C.DLC, MEB_14C.ID);
|
MEB_14C.data.u8[0] = vw_crc_calc(MEB_14C.data.u8, MEB_14C.DLC, MEB_14C.ID);
|
||||||
|
|
||||||
counter_100ms = (counter_100ms + 1) % 16; //Goes from 0-1-2-3...15-0-1-2-3..
|
counter_100ms = (counter_100ms + 1) % 16; //Goes from 0-1-2-3...15-0-1-2-3..
|
||||||
transmit_can_frame(&MEB_503, can_config.battery);
|
transmit_can_frame(&MEB_503);
|
||||||
transmit_can_frame(&MEB_272, can_config.battery);
|
transmit_can_frame(&MEB_272);
|
||||||
transmit_can_frame(&MEB_3C0, can_config.battery);
|
transmit_can_frame(&MEB_3C0);
|
||||||
transmit_can_frame(&MEB_3BE, can_config.battery);
|
transmit_can_frame(&MEB_3BE);
|
||||||
transmit_can_frame(&MEB_14C, can_config.battery);
|
transmit_can_frame(&MEB_14C);
|
||||||
}
|
}
|
||||||
//Send 200ms message
|
//Send 200ms message
|
||||||
if (currentMillis - previousMillis200ms >= INTERVAL_200_MS) {
|
if (currentMillis - previousMillis200ms >= INTERVAL_200_MS) {
|
||||||
|
@ -1457,11 +1457,11 @@ void MebBattery::transmit_can(unsigned long currentMillis) {
|
||||||
|
|
||||||
//TODO: MEB_1B0000B9 & MEB_1B000010 & MEB_1B000046 has CAN sleep commands. May be removed?
|
//TODO: MEB_1B0000B9 & MEB_1B000010 & MEB_1B000046 has CAN sleep commands. May be removed?
|
||||||
|
|
||||||
transmit_can_frame(&MEB_5E1, can_config.battery);
|
transmit_can_frame(&MEB_5E1);
|
||||||
transmit_can_frame(&MEB_153, can_config.battery);
|
transmit_can_frame(&MEB_153);
|
||||||
transmit_can_frame(&MEB_1B0000B9, can_config.battery);
|
transmit_can_frame(&MEB_1B0000B9);
|
||||||
transmit_can_frame(&MEB_1B000010, can_config.battery);
|
transmit_can_frame(&MEB_1B000010);
|
||||||
transmit_can_frame(&MEB_1B000046, can_config.battery);
|
transmit_can_frame(&MEB_1B000046);
|
||||||
|
|
||||||
switch (poll_pid) {
|
switch (poll_pid) {
|
||||||
case PID_SOC:
|
case PID_SOC:
|
||||||
|
@ -1990,7 +1990,7 @@ void MebBattery::transmit_can(unsigned long currentMillis) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (first_can_msg > 0 && currentMillis > first_can_msg + 1000) {
|
if (first_can_msg > 0 && currentMillis > first_can_msg + 1000) {
|
||||||
transmit_can_frame(&MEB_POLLING_FRAME, can_config.battery);
|
transmit_can_frame(&MEB_POLLING_FRAME);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1998,11 +1998,11 @@ void MebBattery::transmit_can(unsigned long currentMillis) {
|
||||||
if (currentMillis - previousMillis500ms >= INTERVAL_500_MS) {
|
if (currentMillis - previousMillis500ms >= INTERVAL_500_MS) {
|
||||||
previousMillis500ms = currentMillis;
|
previousMillis500ms = currentMillis;
|
||||||
|
|
||||||
transmit_can_frame(&MEB_16A954B4, can_config.battery); //eTM, Cooling valves and pumps for BMS
|
transmit_can_frame(&MEB_16A954B4); //eTM, Cooling valves and pumps for BMS
|
||||||
transmit_can_frame(&MEB_569, can_config.battery); // Battery heating requests
|
transmit_can_frame(&MEB_569); // Battery heating requests
|
||||||
transmit_can_frame(&MEB_1A55552B, can_config.battery); //Climate, heatpump and priorities
|
transmit_can_frame(&MEB_1A55552B); //Climate, heatpump and priorities
|
||||||
transmit_can_frame(&MEB_1A555548, can_config.battery); //ORU, OTA update message for reserving battery
|
transmit_can_frame(&MEB_1A555548); //ORU, OTA update message for reserving battery
|
||||||
transmit_can_frame(&MEB_16A954FB, can_config.battery); //Climate, request to BMS for starting preconditioning
|
transmit_can_frame(&MEB_16A954FB); //Climate, request to BMS for starting preconditioning
|
||||||
}
|
}
|
||||||
|
|
||||||
//Send 1s CANFD message
|
//Send 1s CANFD message
|
||||||
|
@ -2024,11 +2024,11 @@ void MebBattery::transmit_can(unsigned long currentMillis) {
|
||||||
seconds = (seconds + 1) % 60;
|
seconds = (seconds + 1) % 60;
|
||||||
|
|
||||||
counter_1000ms = (counter_1000ms + 1) % 16; //Goes from 0-1-2-3...15-0-1-2-3..
|
counter_1000ms = (counter_1000ms + 1) % 16; //Goes from 0-1-2-3...15-0-1-2-3..
|
||||||
transmit_can_frame(&MEB_6B2, can_config.battery); // Diagnostics - Needed for contactor closing
|
transmit_can_frame(&MEB_6B2); // Diagnostics - Needed for contactor closing
|
||||||
transmit_can_frame(&MEB_641, can_config.battery); // Motor - OBD
|
transmit_can_frame(&MEB_641); // Motor - OBD
|
||||||
transmit_can_frame(&MEB_5F5, can_config.battery); // Loading profile
|
transmit_can_frame(&MEB_5F5); // Loading profile
|
||||||
transmit_can_frame(&MEB_585, can_config.battery); // Systeminfo
|
transmit_can_frame(&MEB_585); // Systeminfo
|
||||||
transmit_can_frame(&MEB_1A5555A6, can_config.battery); // Temperature QBit
|
transmit_can_frame(&MEB_1A5555A6); // Temperature QBit
|
||||||
|
|
||||||
transmit_obd_can_frame(0x18DA05F1, can_config.battery, true);
|
transmit_obd_can_frame(0x18DA05F1, can_config.battery, true);
|
||||||
}
|
}
|
||||||
|
|
|
@ -102,13 +102,13 @@ void Mg5Battery::transmit_can(unsigned long currentMillis) {
|
||||||
if (currentMillis - previousMillis10 >= INTERVAL_10_MS) {
|
if (currentMillis - previousMillis10 >= INTERVAL_10_MS) {
|
||||||
previousMillis10 = currentMillis;
|
previousMillis10 = currentMillis;
|
||||||
|
|
||||||
transmit_can_frame(&MG_5_100, can_config.battery);
|
transmit_can_frame(&MG_5_100);
|
||||||
}
|
}
|
||||||
// Send 100ms CAN Message
|
// Send 100ms CAN Message
|
||||||
if (currentMillis - previousMillis100 >= INTERVAL_100_MS) {
|
if (currentMillis - previousMillis100 >= INTERVAL_100_MS) {
|
||||||
previousMillis100 = currentMillis;
|
previousMillis100 = currentMillis;
|
||||||
|
|
||||||
//transmit_can_frame(&MG_5_100, can_config.battery);
|
//transmit_can_frame(&MG_5_100);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -346,8 +346,8 @@ void MgHsPHEVBattery::transmit_can(unsigned long currentMillis) {
|
||||||
}
|
}
|
||||||
#endif // MG_HS_PHEV_DISABLE_CONTACTORS
|
#endif // MG_HS_PHEV_DISABLE_CONTACTORS
|
||||||
|
|
||||||
transmit_can_frame(&MG_HS_8A, can_config.battery);
|
transmit_can_frame(&MG_HS_8A);
|
||||||
transmit_can_frame(&MG_HS_1F1, can_config.battery);
|
transmit_can_frame(&MG_HS_1F1);
|
||||||
}
|
}
|
||||||
// Send 200ms CAN Message
|
// Send 200ms CAN Message
|
||||||
if (currentMillis - previousMillis200 >= INTERVAL_200_MS) {
|
if (currentMillis - previousMillis200 >= INTERVAL_200_MS) {
|
||||||
|
@ -355,10 +355,10 @@ void MgHsPHEVBattery::transmit_can(unsigned long currentMillis) {
|
||||||
|
|
||||||
switch (transmitIndex) {
|
switch (transmitIndex) {
|
||||||
case 1:
|
case 1:
|
||||||
transmit_can_frame(&MG_HS_7E5_B0_42, can_config.battery); //Battery voltage
|
transmit_can_frame(&MG_HS_7E5_B0_42); //Battery voltage
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
transmit_can_frame(&MG_HS_7E5_B0_61, can_config.battery); //Battery SoH
|
transmit_can_frame(&MG_HS_7E5_B0_61); //Battery SoH
|
||||||
transmitIndex = 0; //Return to the first message index. This goes in the last message entry
|
transmitIndex = 0; //Return to the first message index. This goes in the last message entry
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -331,7 +331,7 @@ void NissanLeafBattery::handle_incoming_can_frame(CAN_frame rx_frame) {
|
||||||
group_7bb = rx_frame.data.u8[3];
|
group_7bb = rx_frame.data.u8[3];
|
||||||
}
|
}
|
||||||
|
|
||||||
transmit_can_frame(&LEAF_NEXT_LINE_REQUEST, can_interface); //Request the next frame for the group
|
transmit_can_frame(&LEAF_NEXT_LINE_REQUEST); //Request the next frame for the group
|
||||||
|
|
||||||
if (group_7bb == 0x01) //High precision SOC, Current, voltages etc.
|
if (group_7bb == 0x01) //High precision SOC, Current, voltages etc.
|
||||||
{
|
{
|
||||||
|
@ -581,7 +581,7 @@ void NissanLeafBattery::transmit_can(unsigned long currentMillis) {
|
||||||
LEAF_1D4.data.u8[7] = 0xDE;
|
LEAF_1D4.data.u8[7] = 0xDE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
transmit_can_frame(&LEAF_1D4, can_interface);
|
transmit_can_frame(&LEAF_1D4);
|
||||||
|
|
||||||
switch (mprun10r) {
|
switch (mprun10r) {
|
||||||
case (0):
|
case (0):
|
||||||
|
@ -674,7 +674,7 @@ void NissanLeafBattery::transmit_can(unsigned long currentMillis) {
|
||||||
|
|
||||||
//Only send this message when NISSANLEAF_CHARGER is not defined (otherwise it will collide!)
|
//Only send this message when NISSANLEAF_CHARGER is not defined (otherwise it will collide!)
|
||||||
if (!charger || charger->type() != ChargerType::NissanLeaf) {
|
if (!charger || charger->type() != ChargerType::NissanLeaf) {
|
||||||
transmit_can_frame(&LEAF_1F2, can_interface);
|
transmit_can_frame(&LEAF_1F2);
|
||||||
}
|
}
|
||||||
|
|
||||||
mprun10r = (mprun10r + 1) % 20; // 0x1F2 patter repeats after 20 messages. 0-1..19-0
|
mprun10r = (mprun10r + 1) % 20; // 0x1F2 patter repeats after 20 messages. 0-1..19-0
|
||||||
|
@ -698,7 +698,7 @@ void NissanLeafBattery::transmit_can(unsigned long currentMillis) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// VCM message, containing info if battery should sleep or stay awake
|
// VCM message, containing info if battery should sleep or stay awake
|
||||||
transmit_can_frame(&LEAF_50B, can_interface); // HCM_WakeUpSleepCommand == 11b == WakeUp, and CANMASK = 1
|
transmit_can_frame(&LEAF_50B); // HCM_WakeUpSleepCommand == 11b == WakeUp, and CANMASK = 1
|
||||||
|
|
||||||
LEAF_50C.data.u8[3] = mprun100;
|
LEAF_50C.data.u8[3] = mprun100;
|
||||||
switch (mprun100) {
|
switch (mprun100) {
|
||||||
|
@ -719,7 +719,7 @@ void NissanLeafBattery::transmit_can(unsigned long currentMillis) {
|
||||||
LEAF_50C.data.u8[5] = 0x9A;
|
LEAF_50C.data.u8[5] = 0x9A;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
transmit_can_frame(&LEAF_50C, can_interface);
|
transmit_can_frame(&LEAF_50C);
|
||||||
|
|
||||||
mprun100 = (mprun100 + 1) % 4; // mprun100 cycles between 0-1-2-3-0-1...
|
mprun100 = (mprun100 + 1) % 4; // mprun100 cycles between 0-1-2-3-0-1...
|
||||||
}
|
}
|
||||||
|
@ -735,7 +735,7 @@ void NissanLeafBattery::transmit_can(unsigned long currentMillis) {
|
||||||
PIDindex = (PIDindex + 1) % 7; // 7 = amount of elements in the PIDgroups[]
|
PIDindex = (PIDindex + 1) % 7; // 7 = amount of elements in the PIDgroups[]
|
||||||
LEAF_GROUP_REQUEST.data.u8[2] = PIDgroups[PIDindex];
|
LEAF_GROUP_REQUEST.data.u8[2] = PIDgroups[PIDindex];
|
||||||
|
|
||||||
transmit_can_frame(&LEAF_GROUP_REQUEST, can_interface);
|
transmit_can_frame(&LEAF_GROUP_REQUEST);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hold_off_with_polling_10seconds > 0) {
|
if (hold_off_with_polling_10seconds > 0) {
|
||||||
|
@ -797,19 +797,19 @@ void NissanLeafBattery::clearSOH(void) {
|
||||||
break;
|
break;
|
||||||
case 1: // Set CAN_PROCESS_FLAG to 0xC0
|
case 1: // Set CAN_PROCESS_FLAG to 0xC0
|
||||||
LEAF_CLEAR_SOH.data = {0x02, 0x10, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00};
|
LEAF_CLEAR_SOH.data = {0x02, 0x10, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00};
|
||||||
transmit_can_frame(&LEAF_CLEAR_SOH, can_interface);
|
transmit_can_frame(&LEAF_CLEAR_SOH);
|
||||||
// BMS should reply 02 50 C0 FF FF FF FF FF
|
// BMS should reply 02 50 C0 FF FF FF FF FF
|
||||||
stateMachineClearSOH = 2;
|
stateMachineClearSOH = 2;
|
||||||
break;
|
break;
|
||||||
case 2: // Set something ?
|
case 2: // Set something ?
|
||||||
LEAF_CLEAR_SOH.data = {0x02, 0x3E, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00};
|
LEAF_CLEAR_SOH.data = {0x02, 0x3E, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00};
|
||||||
transmit_can_frame(&LEAF_CLEAR_SOH, can_interface);
|
transmit_can_frame(&LEAF_CLEAR_SOH);
|
||||||
// BMS should reply 7E FF FF FF FF FF FF
|
// BMS should reply 7E FF FF FF FF FF FF
|
||||||
stateMachineClearSOH = 3;
|
stateMachineClearSOH = 3;
|
||||||
break;
|
break;
|
||||||
case 3: // Request challenge to solve
|
case 3: // Request challenge to solve
|
||||||
LEAF_CLEAR_SOH.data = {0x02, 0x27, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00};
|
LEAF_CLEAR_SOH.data = {0x02, 0x27, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00};
|
||||||
transmit_can_frame(&LEAF_CLEAR_SOH, can_interface);
|
transmit_can_frame(&LEAF_CLEAR_SOH);
|
||||||
// BMS should reply with (challenge) 06 67 65 (02 DD 86 43) FF
|
// BMS should reply with (challenge) 06 67 65 (02 DD 86 43) FF
|
||||||
stateMachineClearSOH = 4;
|
stateMachineClearSOH = 4;
|
||||||
break;
|
break;
|
||||||
|
@ -817,34 +817,34 @@ void NissanLeafBattery::clearSOH(void) {
|
||||||
decodeChallengeData(incomingChallenge, solvedChallenge);
|
decodeChallengeData(incomingChallenge, solvedChallenge);
|
||||||
LEAF_CLEAR_SOH.data = {
|
LEAF_CLEAR_SOH.data = {
|
||||||
0x10, 0x0A, 0x27, 0x66, solvedChallenge[0], solvedChallenge[1], solvedChallenge[2], solvedChallenge[3]};
|
0x10, 0x0A, 0x27, 0x66, solvedChallenge[0], solvedChallenge[1], solvedChallenge[2], solvedChallenge[3]};
|
||||||
transmit_can_frame(&LEAF_CLEAR_SOH, can_interface);
|
transmit_can_frame(&LEAF_CLEAR_SOH);
|
||||||
// BMS should reply 7BB 8 30 01 00 FF FF FF FF FF // Proceed with more data (PID ACK)
|
// BMS should reply 7BB 8 30 01 00 FF FF FF FF FF // Proceed with more data (PID ACK)
|
||||||
stateMachineClearSOH = 5;
|
stateMachineClearSOH = 5;
|
||||||
break;
|
break;
|
||||||
case 5: // Reply with even more decoded challenge data
|
case 5: // Reply with even more decoded challenge data
|
||||||
LEAF_CLEAR_SOH.data = {
|
LEAF_CLEAR_SOH.data = {
|
||||||
0x21, solvedChallenge[4], solvedChallenge[5], solvedChallenge[6], solvedChallenge[7], 0x00, 0x00, 0x00};
|
0x21, solvedChallenge[4], solvedChallenge[5], solvedChallenge[6], solvedChallenge[7], 0x00, 0x00, 0x00};
|
||||||
transmit_can_frame(&LEAF_CLEAR_SOH, can_interface);
|
transmit_can_frame(&LEAF_CLEAR_SOH);
|
||||||
// BMS should reply 02 67 66 FF FF FF FF FF // Thank you for the data
|
// BMS should reply 02 67 66 FF FF FF FF FF // Thank you for the data
|
||||||
stateMachineClearSOH = 6;
|
stateMachineClearSOH = 6;
|
||||||
break;
|
break;
|
||||||
case 6: // Check if solved data was OK
|
case 6: // Check if solved data was OK
|
||||||
LEAF_CLEAR_SOH.data = {0x03, 0x31, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00};
|
LEAF_CLEAR_SOH.data = {0x03, 0x31, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00};
|
||||||
transmit_can_frame(&LEAF_CLEAR_SOH, can_interface);
|
transmit_can_frame(&LEAF_CLEAR_SOH);
|
||||||
//7BB 8 03 71 03 01 FF FF FF FF // If all is well, BMS replies with 03 71 03 01.
|
//7BB 8 03 71 03 01 FF FF FF FF // If all is well, BMS replies with 03 71 03 01.
|
||||||
//Incase you sent wrong challenge, you get 03 7f 31 12
|
//Incase you sent wrong challenge, you get 03 7f 31 12
|
||||||
stateMachineClearSOH = 7;
|
stateMachineClearSOH = 7;
|
||||||
break;
|
break;
|
||||||
case 7: // Reset SOH% request
|
case 7: // Reset SOH% request
|
||||||
LEAF_CLEAR_SOH.data = {0x03, 0x31, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00};
|
LEAF_CLEAR_SOH.data = {0x03, 0x31, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00};
|
||||||
transmit_can_frame(&LEAF_CLEAR_SOH, can_interface);
|
transmit_can_frame(&LEAF_CLEAR_SOH);
|
||||||
//7BB 8 03 71 03 02 FF FF FF FF // 03 71 03 02 means that BMS accepted command.
|
//7BB 8 03 71 03 02 FF FF FF FF // 03 71 03 02 means that BMS accepted command.
|
||||||
//7BB 03 7f 31 12 means your challenge was wrong, so command ignored
|
//7BB 03 7f 31 12 means your challenge was wrong, so command ignored
|
||||||
stateMachineClearSOH = 8;
|
stateMachineClearSOH = 8;
|
||||||
break;
|
break;
|
||||||
case 8: // Please proceed with resetting SOH
|
case 8: // Please proceed with resetting SOH
|
||||||
LEAF_CLEAR_SOH.data = {0x02, 0x10, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00};
|
LEAF_CLEAR_SOH.data = {0x02, 0x10, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00};
|
||||||
transmit_can_frame(&LEAF_CLEAR_SOH, can_interface);
|
transmit_can_frame(&LEAF_CLEAR_SOH);
|
||||||
// 7BB 8 02 50 81 FF FF FF FF FF // SOH reset OK
|
// 7BB 8 02 50 81 FF FF FF FF FF // SOH reset OK
|
||||||
stateMachineClearSOH = 255;
|
stateMachineClearSOH = 255;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -117,10 +117,10 @@ void PylonBattery::transmit_can(unsigned long currentMillis) {
|
||||||
if (currentMillis - previousMillis1000 >= INTERVAL_1_S) {
|
if (currentMillis - previousMillis1000 >= INTERVAL_1_S) {
|
||||||
previousMillis1000 = currentMillis;
|
previousMillis1000 = currentMillis;
|
||||||
|
|
||||||
transmit_can_frame(&PYLON_3010, can_config.battery); // Heartbeat
|
transmit_can_frame(&PYLON_3010); // Heartbeat
|
||||||
transmit_can_frame(&PYLON_4200, can_config.battery); // Ensemble OR System equipment info, depends on frame0
|
transmit_can_frame(&PYLON_4200); // Ensemble OR System equipment info, depends on frame0
|
||||||
transmit_can_frame(&PYLON_8200, can_config.battery); // Control device quit sleep status
|
transmit_can_frame(&PYLON_8200); // Control device quit sleep status
|
||||||
transmit_can_frame(&PYLON_8210, can_config.battery); // Charge command
|
transmit_can_frame(&PYLON_8210); // Charge command
|
||||||
|
|
||||||
if (ensemble_info_ack) {
|
if (ensemble_info_ack) {
|
||||||
PYLON_4200.data.u8[0] = 0x00; //Request system equipment info
|
PYLON_4200.data.u8[0] = 0x00; //Request system equipment info
|
||||||
|
|
|
@ -202,7 +202,7 @@ void RangeRoverPhevBattery::transmit_can(unsigned long currentMillis) {
|
||||||
if (currentMillis - previousMillis50ms >= INTERVAL_50_MS) {
|
if (currentMillis - previousMillis50ms >= INTERVAL_50_MS) {
|
||||||
previousMillis50ms = currentMillis;
|
previousMillis50ms = currentMillis;
|
||||||
|
|
||||||
transmit_can_frame(&RANGE_ROVER_18B, can_config.battery);
|
transmit_can_frame(&RANGE_ROVER_18B);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -162,7 +162,7 @@ void RenaultKangooBattery::transmit_can(unsigned long currentMillis) {
|
||||||
// Send 100ms CAN Message (for 2.4s, then pause 10s)
|
// Send 100ms CAN Message (for 2.4s, then pause 10s)
|
||||||
if ((currentMillis - previousMillis100) >= (INTERVAL_100_MS + GVL_pause)) {
|
if ((currentMillis - previousMillis100) >= (INTERVAL_100_MS + GVL_pause)) {
|
||||||
previousMillis100 = currentMillis;
|
previousMillis100 = currentMillis;
|
||||||
transmit_can_frame(&KANGOO_423, can_config.battery);
|
transmit_can_frame(&KANGOO_423);
|
||||||
GVI_Pollcounter++;
|
GVI_Pollcounter++;
|
||||||
GVL_pause = 0;
|
GVL_pause = 0;
|
||||||
if (GVI_Pollcounter >= 24) {
|
if (GVI_Pollcounter >= 24) {
|
||||||
|
@ -174,9 +174,9 @@ void RenaultKangooBattery::transmit_can(unsigned long currentMillis) {
|
||||||
if (currentMillis - previousMillis1000 >= INTERVAL_1_S) {
|
if (currentMillis - previousMillis1000 >= INTERVAL_1_S) {
|
||||||
previousMillis1000 = currentMillis;
|
previousMillis1000 = currentMillis;
|
||||||
if (GVB_79B_Continue)
|
if (GVB_79B_Continue)
|
||||||
transmit_can_frame(&KANGOO_79B_Continue, can_config.battery);
|
transmit_can_frame(&KANGOO_79B_Continue);
|
||||||
} else {
|
} else {
|
||||||
transmit_can_frame(&KANGOO_79B, can_config.battery);
|
transmit_can_frame(&KANGOO_79B);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -166,7 +166,7 @@ void RenaultZoeGen1Battery::handle_incoming_can_frame(CAN_frame rx_frame) {
|
||||||
switch (frame0) {
|
switch (frame0) {
|
||||||
case 0x10: //PID HEADER, datarow 0
|
case 0x10: //PID HEADER, datarow 0
|
||||||
requested_poll = rx_frame.data.u8[3];
|
requested_poll = rx_frame.data.u8[3];
|
||||||
transmit_can_frame(&ZOE_ACK_79B, can_interface);
|
transmit_can_frame(&ZOE_ACK_79B);
|
||||||
|
|
||||||
if (requested_poll == GROUP1_CELLVOLTAGES_1_POLL) {
|
if (requested_poll == GROUP1_CELLVOLTAGES_1_POLL) {
|
||||||
cellvoltages[0] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
cellvoltages[0] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
||||||
|
@ -469,7 +469,7 @@ void RenaultZoeGen1Battery::transmit_can(unsigned long currentMillis) {
|
||||||
// Send 100ms CAN Message
|
// Send 100ms CAN Message
|
||||||
if (currentMillis - previousMillis100 >= INTERVAL_100_MS) {
|
if (currentMillis - previousMillis100 >= INTERVAL_100_MS) {
|
||||||
previousMillis100 = currentMillis;
|
previousMillis100 = currentMillis;
|
||||||
transmit_can_frame(&ZOE_423, can_interface);
|
transmit_can_frame(&ZOE_423);
|
||||||
|
|
||||||
if ((counter_423 / 5) % 2 == 0) { // Alternate every 5 messages between these two
|
if ((counter_423 / 5) % 2 == 0) { // Alternate every 5 messages between these two
|
||||||
ZOE_423.data.u8[4] = 0xB2;
|
ZOE_423.data.u8[4] = 0xB2;
|
||||||
|
@ -508,7 +508,7 @@ void RenaultZoeGen1Battery::transmit_can(unsigned long currentMillis) {
|
||||||
|
|
||||||
ZOE_POLL_79B.data.u8[2] = current_poll;
|
ZOE_POLL_79B.data.u8[2] = current_poll;
|
||||||
|
|
||||||
transmit_can_frame(&ZOE_POLL_79B, can_interface);
|
transmit_can_frame(&ZOE_POLL_79B);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -108,7 +108,7 @@ void RenaultZoeGen2Battery::handle_incoming_can_frame(CAN_frame rx_frame) {
|
||||||
case 0x18DAF1DB: // LBC Reply from active polling
|
case 0x18DAF1DB: // LBC Reply from active polling
|
||||||
|
|
||||||
if (rx_frame.data.u8[0] == 0x10) { //First frame of a group
|
if (rx_frame.data.u8[0] == 0x10) { //First frame of a group
|
||||||
transmit_can_frame(&ZOE_POLL_FLOW_CONTROL, can_interface);
|
transmit_can_frame(&ZOE_POLL_FLOW_CONTROL);
|
||||||
//frame 2 & 3 contains which PID is sent
|
//frame 2 & 3 contains which PID is sent
|
||||||
reply_poll = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
|
reply_poll = (rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4];
|
||||||
}
|
}
|
||||||
|
@ -676,7 +676,7 @@ void RenaultZoeGen2Battery::transmit_can(unsigned long currentMillis) {
|
||||||
counter_373 = (counter_373 + 1) % 10;
|
counter_373 = (counter_373 + 1) % 10;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
transmit_can_frame(&ZOE_373, can_interface);
|
transmit_can_frame(&ZOE_373);
|
||||||
transmit_can_frame_376();
|
transmit_can_frame_376();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -691,7 +691,7 @@ void RenaultZoeGen2Battery::transmit_can(unsigned long currentMillis) {
|
||||||
ZOE_POLL_18DADBF1.data.u8[2] = (uint8_t)((currentpoll & 0xFF00) >> 8);
|
ZOE_POLL_18DADBF1.data.u8[2] = (uint8_t)((currentpoll & 0xFF00) >> 8);
|
||||||
ZOE_POLL_18DADBF1.data.u8[3] = (uint8_t)(currentpoll & 0x00FF);
|
ZOE_POLL_18DADBF1.data.u8[3] = (uint8_t)(currentpoll & 0x00FF);
|
||||||
|
|
||||||
transmit_can_frame(&ZOE_POLL_18DADBF1, can_interface);
|
transmit_can_frame(&ZOE_POLL_18DADBF1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (currentMillis - previousMillis1000 >= INTERVAL_1_S) {
|
if (currentMillis - previousMillis1000 >= INTERVAL_1_S) {
|
||||||
|
@ -733,7 +733,7 @@ void RenaultZoeGen2Battery::transmit_can_frame_376(void) {
|
||||||
ZOE_376.data.u8[4] = hourSeg;
|
ZOE_376.data.u8[4] = hourSeg;
|
||||||
ZOE_376.data.u8[5] = minuteSeg;
|
ZOE_376.data.u8[5] = minuteSeg;
|
||||||
|
|
||||||
transmit_can_frame(&ZOE_376, can_interface);
|
transmit_can_frame(&ZOE_376);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RenaultZoeGen2Battery::transmit_reset_nvrol_frames(void) {
|
void RenaultZoeGen2Battery::transmit_reset_nvrol_frames(void) {
|
||||||
|
@ -742,14 +742,14 @@ void RenaultZoeGen2Battery::transmit_reset_nvrol_frames(void) {
|
||||||
startTimeNVROL = millis();
|
startTimeNVROL = millis();
|
||||||
// NVROL reset, part 1: send 0x021003AAAAAAAAAA
|
// NVROL reset, part 1: send 0x021003AAAAAAAAAA
|
||||||
ZOE_POLL_18DADBF1.data = {0x02, 0x10, 0x03, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA};
|
ZOE_POLL_18DADBF1.data = {0x02, 0x10, 0x03, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA};
|
||||||
transmit_can_frame(&ZOE_POLL_18DADBF1, can_interface);
|
transmit_can_frame(&ZOE_POLL_18DADBF1);
|
||||||
NVROLstateMachine = 1;
|
NVROLstateMachine = 1;
|
||||||
break;
|
break;
|
||||||
case 1: // wait 100 ms
|
case 1: // wait 100 ms
|
||||||
if ((millis() - startTimeNVROL) > INTERVAL_100_MS) {
|
if ((millis() - startTimeNVROL) > INTERVAL_100_MS) {
|
||||||
// NVROL reset, part 2: send 0x043101B00900AAAA
|
// NVROL reset, part 2: send 0x043101B00900AAAA
|
||||||
ZOE_POLL_18DADBF1.data = {0x04, 0x31, 0x01, 0xB0, 0x09, 0x00, 0xAA, 0xAA};
|
ZOE_POLL_18DADBF1.data = {0x04, 0x31, 0x01, 0xB0, 0x09, 0x00, 0xAA, 0xAA};
|
||||||
transmit_can_frame(&ZOE_POLL_18DADBF1, can_interface);
|
transmit_can_frame(&ZOE_POLL_18DADBF1);
|
||||||
startTimeNVROL = millis(); //Reset time start, so we can check time for next step
|
startTimeNVROL = millis(); //Reset time start, so we can check time for next step
|
||||||
NVROLstateMachine = 2;
|
NVROLstateMachine = 2;
|
||||||
}
|
}
|
||||||
|
@ -758,7 +758,7 @@ void RenaultZoeGen2Battery::transmit_reset_nvrol_frames(void) {
|
||||||
if ((millis() - startTimeNVROL) > INTERVAL_1_S) {
|
if ((millis() - startTimeNVROL) > INTERVAL_1_S) {
|
||||||
// Enable temporisation before sleep, part 1: send 0x021003AAAAAAAAAA
|
// Enable temporisation before sleep, part 1: send 0x021003AAAAAAAAAA
|
||||||
ZOE_POLL_18DADBF1.data = {0x02, 0x10, 0x03, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA};
|
ZOE_POLL_18DADBF1.data = {0x02, 0x10, 0x03, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA};
|
||||||
transmit_can_frame(&ZOE_POLL_18DADBF1, can_interface);
|
transmit_can_frame(&ZOE_POLL_18DADBF1);
|
||||||
startTimeNVROL = millis(); //Reset time start, so we can check time for next step
|
startTimeNVROL = millis(); //Reset time start, so we can check time for next step
|
||||||
NVROLstateMachine = 3;
|
NVROLstateMachine = 3;
|
||||||
}
|
}
|
||||||
|
@ -767,7 +767,7 @@ void RenaultZoeGen2Battery::transmit_reset_nvrol_frames(void) {
|
||||||
if ((millis() - startTimeNVROL) > INTERVAL_100_MS) {
|
if ((millis() - startTimeNVROL) > INTERVAL_100_MS) {
|
||||||
// Enable temporisation before sleep, part 2: send 0x042E928101AAAAAA
|
// Enable temporisation before sleep, part 2: send 0x042E928101AAAAAA
|
||||||
ZOE_POLL_18DADBF1.data = {0x04, 0x2E, 0x92, 0x81, 0x01, 0xAA, 0xAA, 0xAA};
|
ZOE_POLL_18DADBF1.data = {0x04, 0x2E, 0x92, 0x81, 0x01, 0xAA, 0xAA, 0xAA};
|
||||||
transmit_can_frame(&ZOE_POLL_18DADBF1, can_interface);
|
transmit_can_frame(&ZOE_POLL_18DADBF1);
|
||||||
// Set data back to init values, we are done with the ZOE_POLL_18DADBF1 frame
|
// Set data back to init values, we are done with the ZOE_POLL_18DADBF1 frame
|
||||||
ZOE_POLL_18DADBF1.data = {0x03, 0x22, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00};
|
ZOE_POLL_18DADBF1.data = {0x03, 0x22, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00};
|
||||||
poll_index = 0;
|
poll_index = 0;
|
||||||
|
|
|
@ -509,8 +509,8 @@ void RjxzsBms::transmit_can(unsigned long currentMillis) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!setup_completed) {
|
if (!setup_completed) {
|
||||||
transmit_can_frame(&RJXZS_10, can_config.battery); // Communication connected flag
|
transmit_can_frame(&RJXZS_10); // Communication connected flag
|
||||||
transmit_can_frame(&RJXZS_1C, can_config.battery); // CAN OK
|
transmit_can_frame(&RJXZS_1C); // CAN OK
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -116,8 +116,7 @@ void SantaFePhevBattery::handle_incoming_can_frame(CAN_frame rx_frame) {
|
||||||
switch (rx_frame.data.u8[0]) {
|
switch (rx_frame.data.u8[0]) {
|
||||||
case 0x10: //"PID Header"
|
case 0x10: //"PID Header"
|
||||||
if (rx_frame.data.u8[4] == poll_data_pid) {
|
if (rx_frame.data.u8[4] == poll_data_pid) {
|
||||||
transmit_can_frame(&SANTAFE_7E4_ack,
|
transmit_can_frame(&SANTAFE_7E4_ack); //Send ack to BMS if the same frame is sent as polled
|
||||||
can_interface); //Send ack to BMS if the same frame is sent as polled
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 0x21: //First frame in PID group
|
case 0x21: //First frame in PID group
|
||||||
|
@ -290,9 +289,9 @@ void SantaFePhevBattery::transmit_can(unsigned long currentMillis) {
|
||||||
|
|
||||||
SANTAFE_200.data.u8[7] = checksum_200;
|
SANTAFE_200.data.u8[7] = checksum_200;
|
||||||
|
|
||||||
transmit_can_frame(&SANTAFE_200, can_interface);
|
transmit_can_frame(&SANTAFE_200);
|
||||||
transmit_can_frame(&SANTAFE_2A1, can_interface);
|
transmit_can_frame(&SANTAFE_2A1);
|
||||||
transmit_can_frame(&SANTAFE_2F0, can_interface);
|
transmit_can_frame(&SANTAFE_2F0);
|
||||||
|
|
||||||
counter_200++;
|
counter_200++;
|
||||||
if (counter_200 > 0xF) {
|
if (counter_200 > 0xF) {
|
||||||
|
@ -304,7 +303,7 @@ void SantaFePhevBattery::transmit_can(unsigned long currentMillis) {
|
||||||
if (currentMillis - previousMillis100 >= INTERVAL_100_MS) {
|
if (currentMillis - previousMillis100 >= INTERVAL_100_MS) {
|
||||||
previousMillis100 = currentMillis;
|
previousMillis100 = currentMillis;
|
||||||
|
|
||||||
transmit_can_frame(&SANTAFE_523, can_interface);
|
transmit_can_frame(&SANTAFE_523);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Send 500ms CAN Message
|
// Send 500ms CAN Message
|
||||||
|
@ -314,7 +313,7 @@ void SantaFePhevBattery::transmit_can(unsigned long currentMillis) {
|
||||||
// PID data is polled after last message sent from battery:
|
// PID data is polled after last message sent from battery:
|
||||||
poll_data_pid = (poll_data_pid % 5) + 1;
|
poll_data_pid = (poll_data_pid % 5) + 1;
|
||||||
SANTAFE_7E4_poll.data.u8[3] = (uint8_t)poll_data_pid;
|
SANTAFE_7E4_poll.data.u8[3] = (uint8_t)poll_data_pid;
|
||||||
transmit_can_frame(&SANTAFE_7E4_poll, can_interface);
|
transmit_can_frame(&SANTAFE_7E4_poll);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -120,7 +120,7 @@ void SonoBattery::transmit_can(unsigned long currentMillis) {
|
||||||
if (datalayer.battery.status.bms_status == FAULT) {
|
if (datalayer.battery.status.bms_status == FAULT) {
|
||||||
SONO_400.data.u8[0] = 0x14; //Charging DISABLED
|
SONO_400.data.u8[0] = 0x14; //Charging DISABLED
|
||||||
}
|
}
|
||||||
transmit_can_frame(&SONO_400, can_config.battery);
|
transmit_can_frame(&SONO_400);
|
||||||
}
|
}
|
||||||
// Send 1000ms CAN Message
|
// Send 1000ms CAN Message
|
||||||
if (currentMillis - previousMillis1000 >= INTERVAL_1_S) {
|
if (currentMillis - previousMillis1000 >= INTERVAL_1_S) {
|
||||||
|
@ -135,7 +135,7 @@ void SonoBattery::transmit_can(unsigned long currentMillis) {
|
||||||
SONO_401.data.u8[4] = 15; //Minute
|
SONO_401.data.u8[4] = 15; //Minute
|
||||||
SONO_401.data.u8[5] = seconds; //Second
|
SONO_401.data.u8[5] = seconds; //Second
|
||||||
seconds = (seconds + 1) % 61;
|
seconds = (seconds + 1) % 61;
|
||||||
transmit_can_frame(&SONO_401, can_config.battery);
|
transmit_can_frame(&SONO_401);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -29,10 +29,12 @@ class CanShunt : public Transmitter, CanReceiver {
|
||||||
CAN_Interface can_interface;
|
CAN_Interface can_interface;
|
||||||
|
|
||||||
CanShunt() {
|
CanShunt() {
|
||||||
can_interface = can_config.battery;
|
can_interface = can_config.shunt;
|
||||||
register_transmitter(this);
|
register_transmitter(this);
|
||||||
register_can_receiver(this, can_interface);
|
register_can_receiver(this, can_interface);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void transmit_can_frame(CAN_frame* frame) { transmit_can_frame_to_interface(frame, can_interface); }
|
||||||
};
|
};
|
||||||
|
|
||||||
extern CanShunt* shunt;
|
extern CanShunt* shunt;
|
||||||
|
|
|
@ -2002,14 +2002,14 @@ void TeslaBattery::transmit_can(unsigned long currentMillis) {
|
||||||
if (operate_contactors) { //Special S/X mode
|
if (operate_contactors) { //Special S/X mode
|
||||||
if ((datalayer.system.status.inverter_allows_contactor_closing) && (datalayer.battery.status.bms_status != FAULT)) {
|
if ((datalayer.system.status.inverter_allows_contactor_closing) && (datalayer.battery.status.bms_status != FAULT)) {
|
||||||
if (currentMillis - lastSend1CF >= 10) {
|
if (currentMillis - lastSend1CF >= 10) {
|
||||||
transmit_can_frame(&can_msg_1CF[index_1CF], can_config.battery);
|
transmit_can_frame(&can_msg_1CF[index_1CF]);
|
||||||
|
|
||||||
index_1CF = (index_1CF + 1) % 8;
|
index_1CF = (index_1CF + 1) % 8;
|
||||||
lastSend1CF = currentMillis;
|
lastSend1CF = currentMillis;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (currentMillis - lastSend118 >= 10) {
|
if (currentMillis - lastSend118 >= 10) {
|
||||||
transmit_can_frame(&can_msg_118[index_118], can_config.battery);
|
transmit_can_frame(&can_msg_118[index_118]);
|
||||||
|
|
||||||
index_118 = (index_118 + 1) % 16;
|
index_118 = (index_118 + 1) % 16;
|
||||||
lastSend118 = currentMillis;
|
lastSend118 = currentMillis;
|
||||||
|
@ -2025,32 +2025,32 @@ void TeslaBattery::transmit_can(unsigned long currentMillis) {
|
||||||
previousMillis10 = currentMillis;
|
previousMillis10 = currentMillis;
|
||||||
|
|
||||||
//0x118 DI_systemStatus
|
//0x118 DI_systemStatus
|
||||||
transmit_can_frame(&TESLA_118, can_config.battery);
|
transmit_can_frame(&TESLA_118);
|
||||||
|
|
||||||
//0x2E1 VCFRONT_status
|
//0x2E1 VCFRONT_status
|
||||||
switch (muxNumber_TESLA_2E1) {
|
switch (muxNumber_TESLA_2E1) {
|
||||||
case 0:
|
case 0:
|
||||||
transmit_can_frame(&TESLA_2E1_VEHICLE_AND_RAILS, can_config.battery);
|
transmit_can_frame(&TESLA_2E1_VEHICLE_AND_RAILS);
|
||||||
muxNumber_TESLA_2E1++;
|
muxNumber_TESLA_2E1++;
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
transmit_can_frame(&TESLA_2E1_HOMELINK, can_config.battery);
|
transmit_can_frame(&TESLA_2E1_HOMELINK);
|
||||||
muxNumber_TESLA_2E1++;
|
muxNumber_TESLA_2E1++;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
transmit_can_frame(&TESLA_2E1_REFRIGERANT_SYSTEM, can_config.battery);
|
transmit_can_frame(&TESLA_2E1_REFRIGERANT_SYSTEM);
|
||||||
muxNumber_TESLA_2E1++;
|
muxNumber_TESLA_2E1++;
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
transmit_can_frame(&TESLA_2E1_LV_BATTERY_DEBUG, can_config.battery);
|
transmit_can_frame(&TESLA_2E1_LV_BATTERY_DEBUG);
|
||||||
muxNumber_TESLA_2E1++;
|
muxNumber_TESLA_2E1++;
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
transmit_can_frame(&TESLA_2E1_MUX_5, can_config.battery);
|
transmit_can_frame(&TESLA_2E1_MUX_5);
|
||||||
muxNumber_TESLA_2E1++;
|
muxNumber_TESLA_2E1++;
|
||||||
break;
|
break;
|
||||||
case 5:
|
case 5:
|
||||||
transmit_can_frame(&TESLA_2E1_BODY_CONTROLS, can_config.battery);
|
transmit_can_frame(&TESLA_2E1_BODY_CONTROLS);
|
||||||
muxNumber_TESLA_2E1 = 0;
|
muxNumber_TESLA_2E1 = 0;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -2069,12 +2069,12 @@ void TeslaBattery::transmit_can(unsigned long currentMillis) {
|
||||||
switch (muxNumber_TESLA_221) {
|
switch (muxNumber_TESLA_221) {
|
||||||
case 0:
|
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, can_config.battery);
|
transmit_can_frame(&TESLA_221_DRIVE_Mux0);
|
||||||
muxNumber_TESLA_221++;
|
muxNumber_TESLA_221++;
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
generateMuxFrameCounterChecksum(TESLA_221_DRIVE_Mux1, frameCounter_TESLA_221, 52, 4, 56, 8);
|
generateMuxFrameCounterChecksum(TESLA_221_DRIVE_Mux1, frameCounter_TESLA_221, 52, 4, 56, 8);
|
||||||
transmit_can_frame(&TESLA_221_DRIVE_Mux1, can_config.battery);
|
transmit_can_frame(&TESLA_221_DRIVE_Mux1);
|
||||||
muxNumber_TESLA_221 = 0;
|
muxNumber_TESLA_221 = 0;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -2087,12 +2087,12 @@ void TeslaBattery::transmit_can(unsigned long currentMillis) {
|
||||||
switch (muxNumber_TESLA_221) {
|
switch (muxNumber_TESLA_221) {
|
||||||
case 0:
|
case 0:
|
||||||
generateMuxFrameCounterChecksum(TESLA_221_ACCESSORY_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_ACCESSORY_Mux0, can_config.battery);
|
transmit_can_frame(&TESLA_221_ACCESSORY_Mux0);
|
||||||
muxNumber_TESLA_221++;
|
muxNumber_TESLA_221++;
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
generateMuxFrameCounterChecksum(TESLA_221_ACCESSORY_Mux1, frameCounter_TESLA_221, 52, 4, 56, 8);
|
generateMuxFrameCounterChecksum(TESLA_221_ACCESSORY_Mux1, frameCounter_TESLA_221, 52, 4, 56, 8);
|
||||||
transmit_can_frame(&TESLA_221_ACCESSORY_Mux1, can_config.battery);
|
transmit_can_frame(&TESLA_221_ACCESSORY_Mux1);
|
||||||
muxNumber_TESLA_221 = 0;
|
muxNumber_TESLA_221 = 0;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -2105,12 +2105,12 @@ void TeslaBattery::transmit_can(unsigned long currentMillis) {
|
||||||
switch (muxNumber_TESLA_221) {
|
switch (muxNumber_TESLA_221) {
|
||||||
case 0:
|
case 0:
|
||||||
generateMuxFrameCounterChecksum(TESLA_221_GOING_DOWN_Mux0, frameCounter_TESLA_221, 52, 4, 56, 8);
|
generateMuxFrameCounterChecksum(TESLA_221_GOING_DOWN_Mux0, frameCounter_TESLA_221, 52, 4, 56, 8);
|
||||||
transmit_can_frame(&TESLA_221_GOING_DOWN_Mux0, can_config.battery);
|
transmit_can_frame(&TESLA_221_GOING_DOWN_Mux0);
|
||||||
muxNumber_TESLA_221++;
|
muxNumber_TESLA_221++;
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
generateMuxFrameCounterChecksum(TESLA_221_GOING_DOWN_Mux1, frameCounter_TESLA_221, 52, 4, 56, 8);
|
generateMuxFrameCounterChecksum(TESLA_221_GOING_DOWN_Mux1, frameCounter_TESLA_221, 52, 4, 56, 8);
|
||||||
transmit_can_frame(&TESLA_221_GOING_DOWN_Mux1, can_config.battery);
|
transmit_can_frame(&TESLA_221_GOING_DOWN_Mux1);
|
||||||
muxNumber_TESLA_221 = 0;
|
muxNumber_TESLA_221 = 0;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -2123,12 +2123,12 @@ void TeslaBattery::transmit_can(unsigned long currentMillis) {
|
||||||
switch (muxNumber_TESLA_221) {
|
switch (muxNumber_TESLA_221) {
|
||||||
case 0:
|
case 0:
|
||||||
generateMuxFrameCounterChecksum(TESLA_221_OFF_Mux0, frameCounter_TESLA_221, 52, 4, 56, 8);
|
generateMuxFrameCounterChecksum(TESLA_221_OFF_Mux0, frameCounter_TESLA_221, 52, 4, 56, 8);
|
||||||
transmit_can_frame(&TESLA_221_OFF_Mux0, can_config.battery);
|
transmit_can_frame(&TESLA_221_OFF_Mux0);
|
||||||
muxNumber_TESLA_221++;
|
muxNumber_TESLA_221++;
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
generateMuxFrameCounterChecksum(TESLA_221_OFF_Mux1, frameCounter_TESLA_221, 52, 4, 56, 8);
|
generateMuxFrameCounterChecksum(TESLA_221_OFF_Mux1, frameCounter_TESLA_221, 52, 4, 56, 8);
|
||||||
transmit_can_frame(&TESLA_221_OFF_Mux1, can_config.battery);
|
transmit_can_frame(&TESLA_221_OFF_Mux1);
|
||||||
muxNumber_TESLA_221 = 0;
|
muxNumber_TESLA_221 = 0;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -2141,11 +2141,11 @@ void TeslaBattery::transmit_can(unsigned long currentMillis) {
|
||||||
//0x3C2 VCLEFT_switchStatus
|
//0x3C2 VCLEFT_switchStatus
|
||||||
switch (muxNumber_TESLA_3C2) {
|
switch (muxNumber_TESLA_3C2) {
|
||||||
case 0:
|
case 0:
|
||||||
transmit_can_frame(&TESLA_3C2_Mux0, can_config.battery);
|
transmit_can_frame(&TESLA_3C2_Mux0);
|
||||||
muxNumber_TESLA_3C2++;
|
muxNumber_TESLA_3C2++;
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
transmit_can_frame(&TESLA_3C2_Mux1, can_config.battery);
|
transmit_can_frame(&TESLA_3C2_Mux1);
|
||||||
muxNumber_TESLA_3C2 = 0;
|
muxNumber_TESLA_3C2 = 0;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -2153,14 +2153,14 @@ void TeslaBattery::transmit_can(unsigned long currentMillis) {
|
||||||
}
|
}
|
||||||
|
|
||||||
//0x39D IBST_status
|
//0x39D IBST_status
|
||||||
transmit_can_frame(&TESLA_39D, can_config.battery);
|
transmit_can_frame(&TESLA_39D);
|
||||||
|
|
||||||
if (battery_contactor == 4) { // Contactors closed
|
if (battery_contactor == 4) { // Contactors closed
|
||||||
|
|
||||||
// Frames to be sent only when contactors closed
|
// Frames to be sent only when contactors closed
|
||||||
|
|
||||||
//0x3A1 VCFRONT_vehicleStatus, critical otherwise VCFRONT_MIA triggered
|
//0x3A1 VCFRONT_vehicleStatus, critical otherwise VCFRONT_MIA triggered
|
||||||
transmit_can_frame(&TESLA_3A1[frameCounter_TESLA_3A1], can_config.battery);
|
transmit_can_frame(&TESLA_3A1[frameCounter_TESLA_3A1]);
|
||||||
frameCounter_TESLA_3A1 = (frameCounter_TESLA_3A1 + 1) % 16;
|
frameCounter_TESLA_3A1 = (frameCounter_TESLA_3A1 + 1) % 16;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2173,39 +2173,39 @@ void TeslaBattery::transmit_can(unsigned long currentMillis) {
|
||||||
previousMillis100 = currentMillis;
|
previousMillis100 = currentMillis;
|
||||||
|
|
||||||
//0x102 VCLEFT_doorStatus, static
|
//0x102 VCLEFT_doorStatus, static
|
||||||
transmit_can_frame(&TESLA_102, can_config.battery);
|
transmit_can_frame(&TESLA_102);
|
||||||
//0x103 VCRIGHT_doorStatus, static
|
//0x103 VCRIGHT_doorStatus, static
|
||||||
transmit_can_frame(&TESLA_103, can_config.battery);
|
transmit_can_frame(&TESLA_103);
|
||||||
//0x229 SCCM_rightStalk
|
//0x229 SCCM_rightStalk
|
||||||
transmit_can_frame(&TESLA_229, can_config.battery);
|
transmit_can_frame(&TESLA_229);
|
||||||
//0x241 VCFRONT_coolant, static
|
//0x241 VCFRONT_coolant, static
|
||||||
transmit_can_frame(&TESLA_241, can_config.battery);
|
transmit_can_frame(&TESLA_241);
|
||||||
//0x2D1 VCFRONT_okToUseHighPower, static
|
//0x2D1 VCFRONT_okToUseHighPower, static
|
||||||
transmit_can_frame(&TESLA_2D1, can_config.battery);
|
transmit_can_frame(&TESLA_2D1);
|
||||||
//0x2A8 CMPD_state
|
//0x2A8 CMPD_state
|
||||||
transmit_can_frame(&TESLA_2A8, can_config.battery);
|
transmit_can_frame(&TESLA_2A8);
|
||||||
//0x2E8 EPBR_status
|
//0x2E8 EPBR_status
|
||||||
transmit_can_frame(&TESLA_2E8, can_config.battery);
|
transmit_can_frame(&TESLA_2E8);
|
||||||
//0x7FF GTW_carConfig
|
//0x7FF GTW_carConfig
|
||||||
switch (muxNumber_TESLA_7FF) {
|
switch (muxNumber_TESLA_7FF) {
|
||||||
case 0:
|
case 0:
|
||||||
transmit_can_frame(&TESLA_7FF_Mux1, can_config.battery);
|
transmit_can_frame(&TESLA_7FF_Mux1);
|
||||||
muxNumber_TESLA_7FF++;
|
muxNumber_TESLA_7FF++;
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
transmit_can_frame(&TESLA_7FF_Mux2, can_config.battery);
|
transmit_can_frame(&TESLA_7FF_Mux2);
|
||||||
muxNumber_TESLA_7FF++;
|
muxNumber_TESLA_7FF++;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
transmit_can_frame(&TESLA_7FF_Mux3, can_config.battery);
|
transmit_can_frame(&TESLA_7FF_Mux3);
|
||||||
muxNumber_TESLA_7FF++;
|
muxNumber_TESLA_7FF++;
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
transmit_can_frame(&TESLA_7FF_Mux4, can_config.battery);
|
transmit_can_frame(&TESLA_7FF_Mux4);
|
||||||
muxNumber_TESLA_7FF++;
|
muxNumber_TESLA_7FF++;
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
transmit_can_frame(&TESLA_7FF_Mux5, can_config.battery);
|
transmit_can_frame(&TESLA_7FF_Mux5);
|
||||||
muxNumber_TESLA_7FF = 0;
|
muxNumber_TESLA_7FF = 0;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -2223,35 +2223,35 @@ void TeslaBattery::transmit_can(unsigned long currentMillis) {
|
||||||
switch (stateMachineClearIsolationFault) {
|
switch (stateMachineClearIsolationFault) {
|
||||||
case 0:
|
case 0:
|
||||||
TESLA_602.data = {0x02, 0x27, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00};
|
TESLA_602.data = {0x02, 0x27, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00};
|
||||||
transmit_can_frame(&TESLA_602, can_config.battery);
|
transmit_can_frame(&TESLA_602);
|
||||||
stateMachineClearIsolationFault = 1;
|
stateMachineClearIsolationFault = 1;
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
TESLA_602.data = {0x30, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00};
|
TESLA_602.data = {0x30, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00};
|
||||||
transmit_can_frame(&TESLA_602, can_config.battery);
|
transmit_can_frame(&TESLA_602);
|
||||||
// BMS should reply 02 50 C0 FF FF FF FF FF
|
// BMS should reply 02 50 C0 FF FF FF FF FF
|
||||||
stateMachineClearIsolationFault = 2;
|
stateMachineClearIsolationFault = 2;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
TESLA_602.data = {0x10, 0x12, 0x27, 0x06, 0x35, 0x34, 0x37, 0x36};
|
TESLA_602.data = {0x10, 0x12, 0x27, 0x06, 0x35, 0x34, 0x37, 0x36};
|
||||||
transmit_can_frame(&TESLA_602, can_config.battery);
|
transmit_can_frame(&TESLA_602);
|
||||||
// BMS should reply 7E FF FF FF FF FF FF
|
// BMS should reply 7E FF FF FF FF FF FF
|
||||||
stateMachineClearIsolationFault = 3;
|
stateMachineClearIsolationFault = 3;
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
TESLA_602.data = {0x21, 0x31, 0x30, 0x33, 0x32, 0x3D, 0x3C, 0x3F};
|
TESLA_602.data = {0x21, 0x31, 0x30, 0x33, 0x32, 0x3D, 0x3C, 0x3F};
|
||||||
transmit_can_frame(&TESLA_602, can_config.battery);
|
transmit_can_frame(&TESLA_602);
|
||||||
stateMachineClearIsolationFault = 4;
|
stateMachineClearIsolationFault = 4;
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
TESLA_602.data = {0x22, 0x3E, 0x39, 0x38, 0x3B, 0x3A, 0x00, 0x00};
|
TESLA_602.data = {0x22, 0x3E, 0x39, 0x38, 0x3B, 0x3A, 0x00, 0x00};
|
||||||
transmit_can_frame(&TESLA_602, can_config.battery);
|
transmit_can_frame(&TESLA_602);
|
||||||
//Should generate a CAN UDS log message indicating ECU unlocked
|
//Should generate a CAN UDS log message indicating ECU unlocked
|
||||||
stateMachineClearIsolationFault = 5;
|
stateMachineClearIsolationFault = 5;
|
||||||
break;
|
break;
|
||||||
case 5:
|
case 5:
|
||||||
TESLA_602.data = {0x04, 0x31, 0x01, 0x04, 0x0A, 0x00, 0x00, 0x00};
|
TESLA_602.data = {0x04, 0x31, 0x01, 0x04, 0x0A, 0x00, 0x00, 0x00};
|
||||||
transmit_can_frame(&TESLA_602, can_config.battery);
|
transmit_can_frame(&TESLA_602);
|
||||||
stateMachineClearIsolationFault = 0xFF;
|
stateMachineClearIsolationFault = 0xFF;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -2266,43 +2266,43 @@ void TeslaBattery::transmit_can(unsigned long currentMillis) {
|
||||||
switch (stateMachineBMSReset) {
|
switch (stateMachineBMSReset) {
|
||||||
case 0:
|
case 0:
|
||||||
TESLA_602.data = {0x02, 0x27, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00};
|
TESLA_602.data = {0x02, 0x27, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00};
|
||||||
transmit_can_frame(&TESLA_602, can_config.battery);
|
transmit_can_frame(&TESLA_602);
|
||||||
stateMachineBMSReset = 1;
|
stateMachineBMSReset = 1;
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
TESLA_602.data = {0x30, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00};
|
TESLA_602.data = {0x30, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00};
|
||||||
transmit_can_frame(&TESLA_602, can_config.battery);
|
transmit_can_frame(&TESLA_602);
|
||||||
stateMachineBMSReset = 2;
|
stateMachineBMSReset = 2;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
TESLA_602.data = {0x10, 0x12, 0x27, 0x06, 0x35, 0x34, 0x37, 0x36};
|
TESLA_602.data = {0x10, 0x12, 0x27, 0x06, 0x35, 0x34, 0x37, 0x36};
|
||||||
transmit_can_frame(&TESLA_602, can_config.battery);
|
transmit_can_frame(&TESLA_602);
|
||||||
stateMachineBMSReset = 3;
|
stateMachineBMSReset = 3;
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
TESLA_602.data = {0x21, 0x31, 0x30, 0x33, 0x32, 0x3D, 0x3C, 0x3F};
|
TESLA_602.data = {0x21, 0x31, 0x30, 0x33, 0x32, 0x3D, 0x3C, 0x3F};
|
||||||
transmit_can_frame(&TESLA_602, can_config.battery);
|
transmit_can_frame(&TESLA_602);
|
||||||
stateMachineBMSReset = 4;
|
stateMachineBMSReset = 4;
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
TESLA_602.data = {0x22, 0x3E, 0x39, 0x38, 0x3B, 0x3A, 0x00, 0x00};
|
TESLA_602.data = {0x22, 0x3E, 0x39, 0x38, 0x3B, 0x3A, 0x00, 0x00};
|
||||||
transmit_can_frame(&TESLA_602, can_config.battery);
|
transmit_can_frame(&TESLA_602);
|
||||||
//Should generate a CAN UDS log message indicating ECU unlocked
|
//Should generate a CAN UDS log message indicating ECU unlocked
|
||||||
stateMachineBMSReset = 5;
|
stateMachineBMSReset = 5;
|
||||||
break;
|
break;
|
||||||
case 5:
|
case 5:
|
||||||
TESLA_602.data = {0x02, 0x10, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00};
|
TESLA_602.data = {0x02, 0x10, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00};
|
||||||
transmit_can_frame(&TESLA_602, can_config.battery);
|
transmit_can_frame(&TESLA_602);
|
||||||
stateMachineBMSReset = 6;
|
stateMachineBMSReset = 6;
|
||||||
break;
|
break;
|
||||||
case 6:
|
case 6:
|
||||||
TESLA_602.data = {0x02, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00};
|
TESLA_602.data = {0x02, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00};
|
||||||
transmit_can_frame(&TESLA_602, can_config.battery);
|
transmit_can_frame(&TESLA_602);
|
||||||
stateMachineBMSReset = 7;
|
stateMachineBMSReset = 7;
|
||||||
break;
|
break;
|
||||||
case 7:
|
case 7:
|
||||||
TESLA_602.data = {0x02, 0x11, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00};
|
TESLA_602.data = {0x02, 0x11, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00};
|
||||||
transmit_can_frame(&TESLA_602, can_config.battery);
|
transmit_can_frame(&TESLA_602);
|
||||||
//Should generate a CAN UDS log message(s) indicating ECU has reset
|
//Should generate a CAN UDS log message(s) indicating ECU has reset
|
||||||
stateMachineBMSReset = 0xFF;
|
stateMachineBMSReset = 0xFF;
|
||||||
break;
|
break;
|
||||||
|
@ -2322,7 +2322,7 @@ void TeslaBattery::transmit_can(unsigned long currentMillis) {
|
||||||
logging.println("CAN UDS: Sending BMS query initial handshake");
|
logging.println("CAN UDS: Sending BMS query initial handshake");
|
||||||
#endif //DEBUG_LOG
|
#endif //DEBUG_LOG
|
||||||
TESLA_602.data = {0x02, 0x10, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00};
|
TESLA_602.data = {0x02, 0x10, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00};
|
||||||
transmit_can_frame(&TESLA_602, can_config.battery);
|
transmit_can_frame(&TESLA_602);
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
//Send query
|
//Send query
|
||||||
|
@ -2330,7 +2330,7 @@ void TeslaBattery::transmit_can(unsigned long currentMillis) {
|
||||||
logging.println("CAN UDS: Sending BMS query for pack part number");
|
logging.println("CAN UDS: Sending BMS query for pack part number");
|
||||||
#endif //DEBUG_LOG
|
#endif //DEBUG_LOG
|
||||||
TESLA_602.data = {0x03, 0x22, 0xF0, 0x14, 0x00, 0x00, 0x00, 0x00};
|
TESLA_602.data = {0x03, 0x22, 0xF0, 0x14, 0x00, 0x00, 0x00, 0x00};
|
||||||
transmit_can_frame(&TESLA_602, can_config.battery);
|
transmit_can_frame(&TESLA_602);
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
//Flow control
|
//Flow control
|
||||||
|
@ -2338,7 +2338,7 @@ void TeslaBattery::transmit_can(unsigned long currentMillis) {
|
||||||
logging.println("CAN UDS: Sending BMS query flow control");
|
logging.println("CAN UDS: Sending BMS query flow control");
|
||||||
#endif //DEBUG_LOG
|
#endif //DEBUG_LOG
|
||||||
TESLA_602.data = {0x30, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00};
|
TESLA_602.data = {0x30, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00};
|
||||||
transmit_can_frame(&TESLA_602, can_config.battery);
|
transmit_can_frame(&TESLA_602);
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
break;
|
break;
|
||||||
|
@ -2356,19 +2356,19 @@ void TeslaBattery::transmit_can(unsigned long currentMillis) {
|
||||||
if (currentMillis - previousMillis500 >= INTERVAL_500_MS) {
|
if (currentMillis - previousMillis500 >= INTERVAL_500_MS) {
|
||||||
previousMillis500 = currentMillis;
|
previousMillis500 = currentMillis;
|
||||||
|
|
||||||
transmit_can_frame(&TESLA_213, can_config.battery);
|
transmit_can_frame(&TESLA_213);
|
||||||
transmit_can_frame(&TESLA_284, can_config.battery);
|
transmit_can_frame(&TESLA_284);
|
||||||
transmit_can_frame(&TESLA_293, can_config.battery);
|
transmit_can_frame(&TESLA_293);
|
||||||
transmit_can_frame(&TESLA_313, can_config.battery);
|
transmit_can_frame(&TESLA_313);
|
||||||
transmit_can_frame(&TESLA_333, can_config.battery);
|
transmit_can_frame(&TESLA_333);
|
||||||
if (TESLA_334_INITIAL_SENT == false) {
|
if (TESLA_334_INITIAL_SENT == false) {
|
||||||
transmit_can_frame(&TESLA_334_INITIAL, can_config.battery);
|
transmit_can_frame(&TESLA_334_INITIAL);
|
||||||
TESLA_334_INITIAL_SENT = true;
|
TESLA_334_INITIAL_SENT = true;
|
||||||
} else {
|
} else {
|
||||||
transmit_can_frame(&TESLA_334, can_config.battery);
|
transmit_can_frame(&TESLA_334);
|
||||||
}
|
}
|
||||||
transmit_can_frame(&TESLA_3B3, can_config.battery);
|
transmit_can_frame(&TESLA_3B3);
|
||||||
transmit_can_frame(&TESLA_55A, can_config.battery);
|
transmit_can_frame(&TESLA_55A);
|
||||||
|
|
||||||
//Generate next frames
|
//Generate next frames
|
||||||
generateTESLA_213(TESLA_213);
|
generateTESLA_213(TESLA_213);
|
||||||
|
@ -2381,8 +2381,8 @@ void TeslaBattery::transmit_can(unsigned long currentMillis) {
|
||||||
if (currentMillis - previousMillis1000 >= INTERVAL_1_S) {
|
if (currentMillis - previousMillis1000 >= INTERVAL_1_S) {
|
||||||
previousMillis1000 = currentMillis;
|
previousMillis1000 = currentMillis;
|
||||||
|
|
||||||
transmit_can_frame(&TESLA_082, can_config.battery);
|
transmit_can_frame(&TESLA_082);
|
||||||
transmit_can_frame(&TESLA_321, can_config.battery);
|
transmit_can_frame(&TESLA_321);
|
||||||
|
|
||||||
//Generate next frames
|
//Generate next frames
|
||||||
generateFrameCounterChecksum(TESLA_321, 52, 4, 56, 8);
|
generateFrameCounterChecksum(TESLA_321, 52, 4, 56, 8);
|
||||||
|
|
|
@ -67,7 +67,7 @@ void TestFakeBattery::transmit_can(unsigned long currentMillis) {
|
||||||
if (currentMillis - previousMillis100 >= INTERVAL_100_MS) {
|
if (currentMillis - previousMillis100 >= INTERVAL_100_MS) {
|
||||||
previousMillis100 = currentMillis;
|
previousMillis100 = currentMillis;
|
||||||
// Put fake messages here incase you want to test sending CAN
|
// Put fake messages here incase you want to test sending CAN
|
||||||
//transmit_can_frame(&TEST, can_interface);
|
//transmit_can_frame(&TEST);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -27,15 +27,15 @@ void VolvoSpaBattery::
|
||||||
|
|
||||||
// Update requests from webserver datalayer
|
// Update requests from webserver datalayer
|
||||||
if (datalayer_extended.VolvoPolestar.UserRequestDTCreset) {
|
if (datalayer_extended.VolvoPolestar.UserRequestDTCreset) {
|
||||||
transmit_can_frame(&VOLVO_DTC_Erase, can_config.battery); //Send global DTC erase command
|
transmit_can_frame(&VOLVO_DTC_Erase); //Send global DTC erase command
|
||||||
datalayer_extended.VolvoPolestar.UserRequestDTCreset = false;
|
datalayer_extended.VolvoPolestar.UserRequestDTCreset = false;
|
||||||
}
|
}
|
||||||
if (datalayer_extended.VolvoPolestar.UserRequestBECMecuReset) {
|
if (datalayer_extended.VolvoPolestar.UserRequestBECMecuReset) {
|
||||||
transmit_can_frame(&VOLVO_BECM_ECUreset, can_config.battery); //Send BECM ecu reset command
|
transmit_can_frame(&VOLVO_BECM_ECUreset); //Send BECM ecu reset command
|
||||||
datalayer_extended.VolvoPolestar.UserRequestBECMecuReset = false;
|
datalayer_extended.VolvoPolestar.UserRequestBECMecuReset = false;
|
||||||
}
|
}
|
||||||
if (datalayer_extended.VolvoPolestar.UserRequestDTCreadout) {
|
if (datalayer_extended.VolvoPolestar.UserRequestDTCreadout) {
|
||||||
transmit_can_frame(&VOLVO_DTCreadout, can_config.battery); //Send DTC readout command
|
transmit_can_frame(&VOLVO_DTCreadout); //Send DTC readout command
|
||||||
datalayer_extended.VolvoPolestar.UserRequestDTCreadout = false;
|
datalayer_extended.VolvoPolestar.UserRequestDTCreadout = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -287,7 +287,7 @@ void VolvoSpaBattery::handle_incoming_can_frame(CAN_frame rx_frame) {
|
||||||
(rx_frame.data.u8[3] == 0x6D)) // SOH response frame
|
(rx_frame.data.u8[3] == 0x6D)) // SOH response frame
|
||||||
{
|
{
|
||||||
datalayer.battery.status.soh_pptt = ((rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7]);
|
datalayer.battery.status.soh_pptt = ((rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7]);
|
||||||
transmit_can_frame(&VOLVO_BECMsupplyVoltage_Req, can_config.battery); //Send BECM supply voltage req
|
transmit_can_frame(&VOLVO_BECMsupplyVoltage_Req); //Send BECM supply voltage req
|
||||||
} else if ((rx_frame.data.u8[0] == 0x05) && (rx_frame.data.u8[1] == 0x62) && (rx_frame.data.u8[2] == 0xF4) &&
|
} else if ((rx_frame.data.u8[0] == 0x05) && (rx_frame.data.u8[1] == 0x62) && (rx_frame.data.u8[2] == 0xF4) &&
|
||||||
(rx_frame.data.u8[3] == 0x42)) // BECM module voltage supply
|
(rx_frame.data.u8[3] == 0x42)) // BECM module voltage supply
|
||||||
{
|
{
|
||||||
|
@ -297,12 +297,12 @@ void VolvoSpaBattery::handle_incoming_can_frame(CAN_frame rx_frame) {
|
||||||
{
|
{
|
||||||
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6]);
|
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6]);
|
||||||
cell_voltages[battery_request_idx] = (rx_frame.data.u8[7] << 8);
|
cell_voltages[battery_request_idx] = (rx_frame.data.u8[7] << 8);
|
||||||
transmit_can_frame(&VOLVO_FlowControl, can_config.battery); // Send flow control
|
transmit_can_frame(&VOLVO_FlowControl); // Send flow control
|
||||||
rxConsecutiveFrames = 1;
|
rxConsecutiveFrames = 1;
|
||||||
} else if ((rx_frame.data.u8[0] == 0x10) && (rx_frame.data.u8[2] == 0x59) &&
|
} else if ((rx_frame.data.u8[0] == 0x10) && (rx_frame.data.u8[2] == 0x59) &&
|
||||||
(rx_frame.data.u8[3] == 0x03)) // First response frame for DTC with more than one code
|
(rx_frame.data.u8[3] == 0x03)) // First response frame for DTC with more than one code
|
||||||
{
|
{
|
||||||
transmit_can_frame(&VOLVO_FlowControl, can_config.battery); // Send flow control
|
transmit_can_frame(&VOLVO_FlowControl); // Send flow control
|
||||||
} else if ((rx_frame.data.u8[0] == 0x21) && (rxConsecutiveFrames == 1)) {
|
} else if ((rx_frame.data.u8[0] == 0x21) && (rxConsecutiveFrames == 1)) {
|
||||||
cell_voltages[battery_request_idx++] = cell_voltages[battery_request_idx] | rx_frame.data.u8[1];
|
cell_voltages[battery_request_idx++] = cell_voltages[battery_request_idx] | rx_frame.data.u8[1];
|
||||||
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
||||||
|
@ -311,7 +311,7 @@ void VolvoSpaBattery::handle_incoming_can_frame(CAN_frame rx_frame) {
|
||||||
if (batteryModuleNumber <= 0x2A) // Run until last pack is read
|
if (batteryModuleNumber <= 0x2A) // Run until last pack is read
|
||||||
{
|
{
|
||||||
VOLVO_CELL_U_Req.data.u8[3] = batteryModuleNumber++;
|
VOLVO_CELL_U_Req.data.u8[3] = batteryModuleNumber++;
|
||||||
transmit_can_frame(&VOLVO_CELL_U_Req, can_config.battery); //Send cell voltage read request for next module
|
transmit_can_frame(&VOLVO_CELL_U_Req); //Send cell voltage read request for next module
|
||||||
} else {
|
} else {
|
||||||
min_max_voltage[0] = 9999;
|
min_max_voltage[0] = 9999;
|
||||||
min_max_voltage[1] = 0;
|
min_max_voltage[1] = 0;
|
||||||
|
@ -321,7 +321,7 @@ void VolvoSpaBattery::handle_incoming_can_frame(CAN_frame rx_frame) {
|
||||||
if (min_max_voltage[1] < cell_voltages[cellcounter])
|
if (min_max_voltage[1] < cell_voltages[cellcounter])
|
||||||
min_max_voltage[1] = cell_voltages[cellcounter];
|
min_max_voltage[1] = cell_voltages[cellcounter];
|
||||||
}
|
}
|
||||||
transmit_can_frame(&VOLVO_SOH_Req, can_config.battery); //Send SOH read request
|
transmit_can_frame(&VOLVO_SOH_Req); //Send SOH read request
|
||||||
}
|
}
|
||||||
rxConsecutiveFrames = 0;
|
rxConsecutiveFrames = 0;
|
||||||
}
|
}
|
||||||
|
@ -336,7 +336,7 @@ void VolvoSpaBattery::readCellVoltages() {
|
||||||
batteryModuleNumber = 0x10;
|
batteryModuleNumber = 0x10;
|
||||||
rxConsecutiveFrames = 0;
|
rxConsecutiveFrames = 0;
|
||||||
VOLVO_CELL_U_Req.data.u8[3] = batteryModuleNumber++;
|
VOLVO_CELL_U_Req.data.u8[3] = batteryModuleNumber++;
|
||||||
transmit_can_frame(&VOLVO_CELL_U_Req, can_config.battery); //Send cell voltage read request for first module
|
transmit_can_frame(&VOLVO_CELL_U_Req); //Send cell voltage read request for first module
|
||||||
}
|
}
|
||||||
|
|
||||||
void VolvoSpaBattery::transmit_can(unsigned long currentMillis) {
|
void VolvoSpaBattery::transmit_can(unsigned long currentMillis) {
|
||||||
|
@ -344,22 +344,22 @@ void VolvoSpaBattery::transmit_can(unsigned long currentMillis) {
|
||||||
if (currentMillis - previousMillis100 >= INTERVAL_100_MS) {
|
if (currentMillis - previousMillis100 >= INTERVAL_100_MS) {
|
||||||
previousMillis100 = currentMillis;
|
previousMillis100 = currentMillis;
|
||||||
|
|
||||||
transmit_can_frame(&VOLVO_536, can_config.battery); //Send 0x536 Network managing frame to keep BMS alive
|
transmit_can_frame(&VOLVO_536); //Send 0x536 Network managing frame to keep BMS alive
|
||||||
transmit_can_frame(&VOLVO_372, can_config.battery); //Send 0x372 ECMAmbientTempCalculated
|
transmit_can_frame(&VOLVO_372); //Send 0x372 ECMAmbientTempCalculated
|
||||||
|
|
||||||
if ((datalayer.battery.status.bms_status == ACTIVE) && startedUp) {
|
if ((datalayer.battery.status.bms_status == ACTIVE) && startedUp) {
|
||||||
datalayer.system.status.battery_allows_contactor_closing = true;
|
datalayer.system.status.battery_allows_contactor_closing = true;
|
||||||
transmit_can_frame(&VOLVO_140_CLOSE, can_config.battery); //Send 0x140 Close contactors message
|
transmit_can_frame(&VOLVO_140_CLOSE); //Send 0x140 Close contactors message
|
||||||
} else { //datalayer.battery.status.bms_status == FAULT , OR inverter requested opening contactors, OR system not started yet
|
} else { //datalayer.battery.status.bms_status == FAULT , OR inverter requested opening contactors, OR system not started yet
|
||||||
datalayer.system.status.battery_allows_contactor_closing = false;
|
datalayer.system.status.battery_allows_contactor_closing = false;
|
||||||
transmit_can_frame(&VOLVO_140_OPEN, can_config.battery); //Send 0x140 Open contactors message
|
transmit_can_frame(&VOLVO_140_OPEN); //Send 0x140 Open contactors message
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (currentMillis - previousMillis1s >= INTERVAL_1_S) {
|
if (currentMillis - previousMillis1s >= INTERVAL_1_S) {
|
||||||
previousMillis1s = currentMillis;
|
previousMillis1s = currentMillis;
|
||||||
|
|
||||||
if (!startedUp) {
|
if (!startedUp) {
|
||||||
transmit_can_frame(&VOLVO_DTC_Erase, can_config.battery); //Erase any DTCs preventing startup
|
transmit_can_frame(&VOLVO_DTC_Erase); //Erase any DTCs preventing startup
|
||||||
DTC_reset_counter++;
|
DTC_reset_counter++;
|
||||||
if (DTC_reset_counter > 1) { // Performed twice before starting
|
if (DTC_reset_counter > 1) { // Performed twice before starting
|
||||||
startedUp = true;
|
startedUp = true;
|
||||||
|
|
|
@ -27,15 +27,15 @@ void VolvoSpaHybridBattery::
|
||||||
|
|
||||||
// Update requests from webserver datalayer
|
// Update requests from webserver datalayer
|
||||||
if (datalayer_extended.VolvoHybrid.UserRequestDTCreset) {
|
if (datalayer_extended.VolvoHybrid.UserRequestDTCreset) {
|
||||||
transmit_can_frame(&VOLVO_DTC_Erase, can_config.battery); //Send global DTC erase command
|
transmit_can_frame(&VOLVO_DTC_Erase); //Send global DTC erase command
|
||||||
datalayer_extended.VolvoHybrid.UserRequestDTCreset = false;
|
datalayer_extended.VolvoHybrid.UserRequestDTCreset = false;
|
||||||
}
|
}
|
||||||
if (datalayer_extended.VolvoHybrid.UserRequestBECMecuReset) {
|
if (datalayer_extended.VolvoHybrid.UserRequestBECMecuReset) {
|
||||||
transmit_can_frame(&VOLVO_BECM_ECUreset, can_config.battery); //Send BECM ecu reset command
|
transmit_can_frame(&VOLVO_BECM_ECUreset); //Send BECM ecu reset command
|
||||||
datalayer_extended.VolvoHybrid.UserRequestBECMecuReset = false;
|
datalayer_extended.VolvoHybrid.UserRequestBECMecuReset = false;
|
||||||
}
|
}
|
||||||
if (datalayer_extended.VolvoHybrid.UserRequestDTCreadout) {
|
if (datalayer_extended.VolvoHybrid.UserRequestDTCreadout) {
|
||||||
transmit_can_frame(&VOLVO_DTCreadout, can_config.battery); //Send DTC readout command
|
transmit_can_frame(&VOLVO_DTCreadout); //Send DTC readout command
|
||||||
datalayer_extended.VolvoHybrid.UserRequestDTCreadout = false;
|
datalayer_extended.VolvoHybrid.UserRequestDTCreadout = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -283,7 +283,7 @@ void VolvoSpaHybridBattery::handle_incoming_can_frame(CAN_frame rx_frame) {
|
||||||
(rx_frame.data.u8[3] == 0x6D)) // SOH response frame
|
(rx_frame.data.u8[3] == 0x6D)) // SOH response frame
|
||||||
{
|
{
|
||||||
datalayer.battery.status.soh_pptt = ((rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7]);
|
datalayer.battery.status.soh_pptt = ((rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7]);
|
||||||
transmit_can_frame(&VOLVO_BECMsupplyVoltage_Req, can_config.battery); //Send BECM supply voltage req
|
transmit_can_frame(&VOLVO_BECMsupplyVoltage_Req); //Send BECM supply voltage req
|
||||||
} else if ((rx_frame.data.u8[0] == 0x05) && (rx_frame.data.u8[1] == 0x62) && (rx_frame.data.u8[2] == 0xF4) &&
|
} else if ((rx_frame.data.u8[0] == 0x05) && (rx_frame.data.u8[1] == 0x62) && (rx_frame.data.u8[2] == 0xF4) &&
|
||||||
(rx_frame.data.u8[3] == 0x42)) // BECM module voltage supply
|
(rx_frame.data.u8[3] == 0x42)) // BECM module voltage supply
|
||||||
{
|
{
|
||||||
|
@ -294,193 +294,193 @@ void VolvoSpaHybridBattery::handle_incoming_can_frame(CAN_frame rx_frame) {
|
||||||
{
|
{
|
||||||
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6]);
|
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6]);
|
||||||
cell_voltages[battery_request_idx] = (rx_frame.data.u8[7] << 8);
|
cell_voltages[battery_request_idx] = (rx_frame.data.u8[7] << 8);
|
||||||
transmit_can_frame(&VOLVO_FlowControl, can_config.battery); // Send flow control
|
transmit_can_frame(&VOLVO_FlowControl); // Send flow control
|
||||||
rxConsecutiveFrames = 1;
|
rxConsecutiveFrames = 1;
|
||||||
} else if ((rx_frame.data.u8[0] == 0x10) && (rx_frame.data.u8[2] == 0x59) &&
|
} else if ((rx_frame.data.u8[0] == 0x10) && (rx_frame.data.u8[2] == 0x59) &&
|
||||||
(rx_frame.data.u8[3] == 0x03)) // First response frame for DTC with more than one code
|
(rx_frame.data.u8[3] == 0x03)) // First response frame for DTC with more than one code
|
||||||
{
|
{
|
||||||
transmit_can_frame(&VOLVO_FlowControl, can_config.battery); // Send flow control
|
transmit_can_frame(&VOLVO_FlowControl); // Send flow control
|
||||||
} else if ((rx_frame.data.u8[0] == 0x21) && (rxConsecutiveFrames == 1)) {
|
} else if ((rx_frame.data.u8[0] == 0x21) && (rxConsecutiveFrames == 1)) {
|
||||||
cell_voltages[battery_request_idx++] = cell_voltages[battery_request_idx] | rx_frame.data.u8[1];
|
cell_voltages[battery_request_idx++] = cell_voltages[battery_request_idx] | rx_frame.data.u8[1];
|
||||||
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
||||||
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
||||||
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7];
|
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7];
|
||||||
//transmit_can_frame(&VOLVO_FlowControl, can_config.battery); // Send flow control
|
//transmit_can_frame(&VOLVO_FlowControl); // Send flow control
|
||||||
} else if ((rx_frame.data.u8[0] == 0x22) && (rxConsecutiveFrames == 1)) {
|
} else if ((rx_frame.data.u8[0] == 0x22) && (rxConsecutiveFrames == 1)) {
|
||||||
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2]);
|
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2]);
|
||||||
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4]);
|
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4]);
|
||||||
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
|
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
|
||||||
cell_voltages[battery_request_idx] = (rx_frame.data.u8[7] << 8);
|
cell_voltages[battery_request_idx] = (rx_frame.data.u8[7] << 8);
|
||||||
//transmit_can_frame(&VOLVO_FlowControl, can_config.battery); // Send flow control
|
//transmit_can_frame(&VOLVO_FlowControl); // Send flow control
|
||||||
} else if ((rx_frame.data.u8[0] == 0x23) && (rxConsecutiveFrames == 1)) {
|
} else if ((rx_frame.data.u8[0] == 0x23) && (rxConsecutiveFrames == 1)) {
|
||||||
cell_voltages[battery_request_idx++] = cell_voltages[battery_request_idx] | rx_frame.data.u8[1];
|
cell_voltages[battery_request_idx++] = cell_voltages[battery_request_idx] | rx_frame.data.u8[1];
|
||||||
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
||||||
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
||||||
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7];
|
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7];
|
||||||
//transmit_can_frame(&VOLVO_FlowControl, can_config.battery); // Send flow control
|
//transmit_can_frame(&VOLVO_FlowControl); // Send flow control
|
||||||
} else if ((rx_frame.data.u8[0] == 0x24) && (rxConsecutiveFrames == 1)) {
|
} else if ((rx_frame.data.u8[0] == 0x24) && (rxConsecutiveFrames == 1)) {
|
||||||
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2]);
|
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2]);
|
||||||
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4]);
|
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4]);
|
||||||
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
|
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
|
||||||
cell_voltages[battery_request_idx] = (rx_frame.data.u8[7] << 8);
|
cell_voltages[battery_request_idx] = (rx_frame.data.u8[7] << 8);
|
||||||
//transmit_can_frame(&VOLVO_FlowControl, can_config.battery); // Send flow control
|
//transmit_can_frame(&VOLVO_FlowControl); // Send flow control
|
||||||
} else if ((rx_frame.data.u8[0] == 0x25) && (rxConsecutiveFrames == 1)) {
|
} else if ((rx_frame.data.u8[0] == 0x25) && (rxConsecutiveFrames == 1)) {
|
||||||
cell_voltages[battery_request_idx++] = cell_voltages[battery_request_idx] | rx_frame.data.u8[1];
|
cell_voltages[battery_request_idx++] = cell_voltages[battery_request_idx] | rx_frame.data.u8[1];
|
||||||
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
||||||
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
||||||
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7];
|
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7];
|
||||||
//transmit_can_frame(&VOLVO_FlowControl, can_config.battery); // Send flow control
|
//transmit_can_frame(&VOLVO_FlowControl); // Send flow control
|
||||||
} else if ((rx_frame.data.u8[0] == 0x26) && (rxConsecutiveFrames == 1)) {
|
} else if ((rx_frame.data.u8[0] == 0x26) && (rxConsecutiveFrames == 1)) {
|
||||||
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2]);
|
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2]);
|
||||||
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4]);
|
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4]);
|
||||||
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
|
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
|
||||||
cell_voltages[battery_request_idx] = (rx_frame.data.u8[7] << 8);
|
cell_voltages[battery_request_idx] = (rx_frame.data.u8[7] << 8);
|
||||||
//transmit_can_frame(&VOLVO_FlowControl, can_config.battery); // Send flow control
|
//transmit_can_frame(&VOLVO_FlowControl); // Send flow control
|
||||||
} else if ((rx_frame.data.u8[0] == 0x27) && (rxConsecutiveFrames == 1)) {
|
} else if ((rx_frame.data.u8[0] == 0x27) && (rxConsecutiveFrames == 1)) {
|
||||||
cell_voltages[battery_request_idx++] = cell_voltages[battery_request_idx] | rx_frame.data.u8[1];
|
cell_voltages[battery_request_idx++] = cell_voltages[battery_request_idx] | rx_frame.data.u8[1];
|
||||||
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
||||||
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
||||||
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7];
|
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7];
|
||||||
//transmit_can_frame(&VOLVO_FlowControl, can_config.battery); // Send flow control
|
//transmit_can_frame(&VOLVO_FlowControl); // Send flow control
|
||||||
} else if ((rx_frame.data.u8[0] == 0x28) && (rxConsecutiveFrames == 1)) {
|
} else if ((rx_frame.data.u8[0] == 0x28) && (rxConsecutiveFrames == 1)) {
|
||||||
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2]);
|
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2]);
|
||||||
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4]);
|
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4]);
|
||||||
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
|
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
|
||||||
cell_voltages[battery_request_idx] = (rx_frame.data.u8[7] << 8);
|
cell_voltages[battery_request_idx] = (rx_frame.data.u8[7] << 8);
|
||||||
//transmit_can_frame(&VOLVO_FlowControl, can_config.battery); // Send flow control
|
//transmit_can_frame(&VOLVO_FlowControl); // Send flow control
|
||||||
} else if ((rx_frame.data.u8[0] == 0x29) && (rxConsecutiveFrames == 1)) {
|
} else if ((rx_frame.data.u8[0] == 0x29) && (rxConsecutiveFrames == 1)) {
|
||||||
cell_voltages[battery_request_idx++] = cell_voltages[battery_request_idx] | rx_frame.data.u8[1];
|
cell_voltages[battery_request_idx++] = cell_voltages[battery_request_idx] | rx_frame.data.u8[1];
|
||||||
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
||||||
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
||||||
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7];
|
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7];
|
||||||
//transmit_can_frame(&VOLVO_FlowControl, can_config.battery); // Send flow control
|
//transmit_can_frame(&VOLVO_FlowControl); // Send flow control
|
||||||
} else if ((rx_frame.data.u8[0] == 0x2A) && (rxConsecutiveFrames == 1)) {
|
} else if ((rx_frame.data.u8[0] == 0x2A) && (rxConsecutiveFrames == 1)) {
|
||||||
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2]);
|
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2]);
|
||||||
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4]);
|
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4]);
|
||||||
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
|
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
|
||||||
cell_voltages[battery_request_idx] = (rx_frame.data.u8[7] << 8);
|
cell_voltages[battery_request_idx] = (rx_frame.data.u8[7] << 8);
|
||||||
//transmit_can_frame(&VOLVO_FlowControl, can_config.battery); // Send flow control
|
//transmit_can_frame(&VOLVO_FlowControl); // Send flow control
|
||||||
} else if ((rx_frame.data.u8[0] == 0x2B) && (rxConsecutiveFrames == 1)) {
|
} else if ((rx_frame.data.u8[0] == 0x2B) && (rxConsecutiveFrames == 1)) {
|
||||||
cell_voltages[battery_request_idx++] = cell_voltages[battery_request_idx] | rx_frame.data.u8[1];
|
cell_voltages[battery_request_idx++] = cell_voltages[battery_request_idx] | rx_frame.data.u8[1];
|
||||||
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
||||||
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
||||||
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7];
|
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7];
|
||||||
//transmit_can_frame(&VOLVO_FlowControl, can_config.battery); // Send flow control
|
//transmit_can_frame(&VOLVO_FlowControl); // Send flow control
|
||||||
} else if ((rx_frame.data.u8[0] == 0x2C) && (rxConsecutiveFrames == 1)) {
|
} else if ((rx_frame.data.u8[0] == 0x2C) && (rxConsecutiveFrames == 1)) {
|
||||||
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2]);
|
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2]);
|
||||||
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4]);
|
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4]);
|
||||||
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
|
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
|
||||||
cell_voltages[battery_request_idx] = (rx_frame.data.u8[7] << 8);
|
cell_voltages[battery_request_idx] = (rx_frame.data.u8[7] << 8);
|
||||||
//transmit_can_frame(&VOLVO_FlowControl, can_config.battery); // Send flow control
|
//transmit_can_frame(&VOLVO_FlowControl); // Send flow control
|
||||||
} else if ((rx_frame.data.u8[0] == 0x2D) && (rxConsecutiveFrames == 1)) {
|
} else if ((rx_frame.data.u8[0] == 0x2D) && (rxConsecutiveFrames == 1)) {
|
||||||
cell_voltages[battery_request_idx++] = cell_voltages[battery_request_idx] | rx_frame.data.u8[1];
|
cell_voltages[battery_request_idx++] = cell_voltages[battery_request_idx] | rx_frame.data.u8[1];
|
||||||
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
||||||
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
||||||
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7];
|
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7];
|
||||||
//transmit_can_frame(&VOLVO_FlowControl, can_config.battery); // Send flow control
|
//transmit_can_frame(&VOLVO_FlowControl); // Send flow control
|
||||||
} else if ((rx_frame.data.u8[0] == 0x2E) && (rxConsecutiveFrames == 1)) {
|
} else if ((rx_frame.data.u8[0] == 0x2E) && (rxConsecutiveFrames == 1)) {
|
||||||
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2]);
|
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2]);
|
||||||
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4]);
|
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4]);
|
||||||
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
|
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
|
||||||
cell_voltages[battery_request_idx] = (rx_frame.data.u8[7] << 8);
|
cell_voltages[battery_request_idx] = (rx_frame.data.u8[7] << 8);
|
||||||
//transmit_can_frame(&VOLVO_FlowControl, can_config.battery); // Send flow control
|
//transmit_can_frame(&VOLVO_FlowControl); // Send flow control
|
||||||
} else if ((rx_frame.data.u8[0] == 0x2F) && (rxConsecutiveFrames == 1)) {
|
} else if ((rx_frame.data.u8[0] == 0x2F) && (rxConsecutiveFrames == 1)) {
|
||||||
cell_voltages[battery_request_idx++] = cell_voltages[battery_request_idx] | rx_frame.data.u8[1];
|
cell_voltages[battery_request_idx++] = cell_voltages[battery_request_idx] | rx_frame.data.u8[1];
|
||||||
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
||||||
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
||||||
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7];
|
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7];
|
||||||
//transmit_can_frame(&VOLVO_FlowControl, can_config.battery); // Send flow control
|
//transmit_can_frame(&VOLVO_FlowControl); // Send flow control
|
||||||
rxConsecutiveFrames = 2;
|
rxConsecutiveFrames = 2;
|
||||||
} else if ((rx_frame.data.u8[0] == 0x20) && (rxConsecutiveFrames == 2)) {
|
} else if ((rx_frame.data.u8[0] == 0x20) && (rxConsecutiveFrames == 2)) {
|
||||||
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2]);
|
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2]);
|
||||||
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4]);
|
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4]);
|
||||||
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
|
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
|
||||||
cell_voltages[battery_request_idx] = (rx_frame.data.u8[7] << 8);
|
cell_voltages[battery_request_idx] = (rx_frame.data.u8[7] << 8);
|
||||||
//transmit_can_frame(&VOLVO_FlowControl, can_config.battery); // Send flow control
|
//transmit_can_frame(&VOLVO_FlowControl); // Send flow control
|
||||||
} else if ((rx_frame.data.u8[0] == 0x21) && (rxConsecutiveFrames == 2)) {
|
} else if ((rx_frame.data.u8[0] == 0x21) && (rxConsecutiveFrames == 2)) {
|
||||||
cell_voltages[battery_request_idx++] = cell_voltages[battery_request_idx] | rx_frame.data.u8[1];
|
cell_voltages[battery_request_idx++] = cell_voltages[battery_request_idx] | rx_frame.data.u8[1];
|
||||||
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
||||||
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
||||||
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7];
|
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7];
|
||||||
//transmit_can_frame(&VOLVO_FlowControl, can_config.battery); // Send flow control
|
//transmit_can_frame(&VOLVO_FlowControl); // Send flow control
|
||||||
} else if ((rx_frame.data.u8[0] == 0x22) && (rxConsecutiveFrames == 2)) {
|
} else if ((rx_frame.data.u8[0] == 0x22) && (rxConsecutiveFrames == 2)) {
|
||||||
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2]);
|
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2]);
|
||||||
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4]);
|
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4]);
|
||||||
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
|
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
|
||||||
cell_voltages[battery_request_idx] = (rx_frame.data.u8[7] << 8);
|
cell_voltages[battery_request_idx] = (rx_frame.data.u8[7] << 8);
|
||||||
//transmit_can_frame(&VOLVO_FlowControl, can_config.battery); // Send flow control
|
//transmit_can_frame(&VOLVO_FlowControl); // Send flow control
|
||||||
} else if ((rx_frame.data.u8[0] == 0x23) && (rxConsecutiveFrames == 2)) {
|
} else if ((rx_frame.data.u8[0] == 0x23) && (rxConsecutiveFrames == 2)) {
|
||||||
cell_voltages[battery_request_idx++] = cell_voltages[battery_request_idx] | rx_frame.data.u8[1];
|
cell_voltages[battery_request_idx++] = cell_voltages[battery_request_idx] | rx_frame.data.u8[1];
|
||||||
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
||||||
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
||||||
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7];
|
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7];
|
||||||
//transmit_can_frame(&VOLVO_FlowControl, can_config.battery); // Send flow control
|
//transmit_can_frame(&VOLVO_FlowControl); // Send flow control
|
||||||
} else if ((rx_frame.data.u8[0] == 0x24) && (rxConsecutiveFrames == 2)) {
|
} else if ((rx_frame.data.u8[0] == 0x24) && (rxConsecutiveFrames == 2)) {
|
||||||
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2]);
|
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2]);
|
||||||
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4]);
|
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4]);
|
||||||
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
|
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
|
||||||
cell_voltages[battery_request_idx] = (rx_frame.data.u8[7] << 8);
|
cell_voltages[battery_request_idx] = (rx_frame.data.u8[7] << 8);
|
||||||
//transmit_can_frame(&VOLVO_FlowControl, can_config.battery); // Send flow control
|
//transmit_can_frame(&VOLVO_FlowControl); // Send flow control
|
||||||
} else if ((rx_frame.data.u8[0] == 0x25) && (rxConsecutiveFrames == 2)) {
|
} else if ((rx_frame.data.u8[0] == 0x25) && (rxConsecutiveFrames == 2)) {
|
||||||
cell_voltages[battery_request_idx++] = cell_voltages[battery_request_idx] | rx_frame.data.u8[1];
|
cell_voltages[battery_request_idx++] = cell_voltages[battery_request_idx] | rx_frame.data.u8[1];
|
||||||
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
||||||
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
||||||
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7];
|
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7];
|
||||||
//transmit_can_frame(&VOLVO_FlowControl, can_config.battery); // Send flow control
|
//transmit_can_frame(&VOLVO_FlowControl); // Send flow control
|
||||||
} else if ((rx_frame.data.u8[0] == 0x26) && (rxConsecutiveFrames == 2)) {
|
} else if ((rx_frame.data.u8[0] == 0x26) && (rxConsecutiveFrames == 2)) {
|
||||||
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2]);
|
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2]);
|
||||||
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4]);
|
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4]);
|
||||||
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
|
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
|
||||||
cell_voltages[battery_request_idx] = (rx_frame.data.u8[7] << 8);
|
cell_voltages[battery_request_idx] = (rx_frame.data.u8[7] << 8);
|
||||||
//transmit_can_frame(&VOLVO_FlowControl, can_config.battery); // Send flow control
|
//transmit_can_frame(&VOLVO_FlowControl); // Send flow control
|
||||||
} else if ((rx_frame.data.u8[0] == 0x27) && (rxConsecutiveFrames == 2)) {
|
} else if ((rx_frame.data.u8[0] == 0x27) && (rxConsecutiveFrames == 2)) {
|
||||||
cell_voltages[battery_request_idx++] = cell_voltages[battery_request_idx] | rx_frame.data.u8[1];
|
cell_voltages[battery_request_idx++] = cell_voltages[battery_request_idx] | rx_frame.data.u8[1];
|
||||||
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
||||||
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
||||||
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7];
|
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7];
|
||||||
//transmit_can_frame(&VOLVO_FlowControl, can_config.battery); // Send flow control
|
//transmit_can_frame(&VOLVO_FlowControl); // Send flow control
|
||||||
} else if ((rx_frame.data.u8[0] == 0x28) && (rxConsecutiveFrames == 2)) {
|
} else if ((rx_frame.data.u8[0] == 0x28) && (rxConsecutiveFrames == 2)) {
|
||||||
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2]);
|
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2]);
|
||||||
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4]);
|
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4]);
|
||||||
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
|
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
|
||||||
cell_voltages[battery_request_idx] = (rx_frame.data.u8[7] << 8);
|
cell_voltages[battery_request_idx] = (rx_frame.data.u8[7] << 8);
|
||||||
//transmit_can_frame(&VOLVO_FlowControl, can_config.battery); // Send flow control
|
//transmit_can_frame(&VOLVO_FlowControl); // Send flow control
|
||||||
} else if ((rx_frame.data.u8[0] == 0x29) && (rxConsecutiveFrames == 2)) {
|
} else if ((rx_frame.data.u8[0] == 0x29) && (rxConsecutiveFrames == 2)) {
|
||||||
cell_voltages[battery_request_idx++] = cell_voltages[battery_request_idx] | rx_frame.data.u8[1];
|
cell_voltages[battery_request_idx++] = cell_voltages[battery_request_idx] | rx_frame.data.u8[1];
|
||||||
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
||||||
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
||||||
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7];
|
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7];
|
||||||
//transmit_can_frame(&VOLVO_FlowControl, can_config.battery); // Send flow control
|
//transmit_can_frame(&VOLVO_FlowControl); // Send flow control
|
||||||
} else if ((rx_frame.data.u8[0] == 0x2A) && (rxConsecutiveFrames == 2)) {
|
} else if ((rx_frame.data.u8[0] == 0x2A) && (rxConsecutiveFrames == 2)) {
|
||||||
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2]);
|
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2]);
|
||||||
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4]);
|
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4]);
|
||||||
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
|
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
|
||||||
cell_voltages[battery_request_idx] = (rx_frame.data.u8[7] << 8);
|
cell_voltages[battery_request_idx] = (rx_frame.data.u8[7] << 8);
|
||||||
//transmit_can_frame(&VOLVO_FlowControl, can_config.battery); // Send flow control
|
//transmit_can_frame(&VOLVO_FlowControl); // Send flow control
|
||||||
} else if ((rx_frame.data.u8[0] == 0x2B) && (rxConsecutiveFrames == 2)) {
|
} else if ((rx_frame.data.u8[0] == 0x2B) && (rxConsecutiveFrames == 2)) {
|
||||||
cell_voltages[battery_request_idx++] = cell_voltages[battery_request_idx] | rx_frame.data.u8[1];
|
cell_voltages[battery_request_idx++] = cell_voltages[battery_request_idx] | rx_frame.data.u8[1];
|
||||||
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
||||||
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
||||||
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7];
|
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7];
|
||||||
//transmit_can_frame(&VOLVO_FlowControl, can_config.battery); // Send flow control
|
//transmit_can_frame(&VOLVO_FlowControl); // Send flow control
|
||||||
} else if ((rx_frame.data.u8[0] == 0x2C) && (rxConsecutiveFrames == 2)) {
|
} else if ((rx_frame.data.u8[0] == 0x2C) && (rxConsecutiveFrames == 2)) {
|
||||||
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2]);
|
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[1] << 8) | rx_frame.data.u8[2]);
|
||||||
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4]);
|
cell_voltages[battery_request_idx++] = ((rx_frame.data.u8[3] << 8) | rx_frame.data.u8[4]);
|
||||||
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
|
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[5] << 8) | rx_frame.data.u8[6];
|
||||||
cell_voltages[battery_request_idx] = (rx_frame.data.u8[7] << 8);
|
cell_voltages[battery_request_idx] = (rx_frame.data.u8[7] << 8);
|
||||||
//transmit_can_frame(&VOLVO_FlowControl, can_config.battery); // Send flow control
|
//transmit_can_frame(&VOLVO_FlowControl); // Send flow control
|
||||||
} else if ((rx_frame.data.u8[0] == 0x2D) && (rxConsecutiveFrames == 2)) {
|
} else if ((rx_frame.data.u8[0] == 0x2D) && (rxConsecutiveFrames == 2)) {
|
||||||
cell_voltages[battery_request_idx++] = cell_voltages[battery_request_idx] | rx_frame.data.u8[1];
|
cell_voltages[battery_request_idx++] = cell_voltages[battery_request_idx] | rx_frame.data.u8[1];
|
||||||
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
||||||
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
cell_voltages[battery_request_idx++] = (rx_frame.data.u8[4] << 8) | rx_frame.data.u8[5];
|
||||||
//cell_voltages[battery_request_idx++] = (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7];
|
//cell_voltages[battery_request_idx++] = (rx_frame.data.u8[6] << 8) | rx_frame.data.u8[7];
|
||||||
//transmit_can_frame(&VOLVO_FlowControl, can_config.battery); // Send flow control
|
//transmit_can_frame(&VOLVO_FlowControl); // Send flow control
|
||||||
//transmit_can_frame(&VOLVO_FlowControl, can_config.battery); // Send flow control
|
//transmit_can_frame(&VOLVO_FlowControl); // Send flow control
|
||||||
|
|
||||||
if (false) // Run until last pack is read
|
if (false) // Run until last pack is read
|
||||||
{
|
{
|
||||||
//VOLVO_CELL_U_Req.data.u8[3] = batteryModuleNumber++;
|
//VOLVO_CELL_U_Req.data.u8[3] = batteryModuleNumber++;
|
||||||
//transmit_can_frame(&VOLVO_CELL_U_Req, can_config.battery); //Send cell voltage read request for next module
|
//transmit_can_frame(&VOLVO_CELL_U_Req); //Send cell voltage read request for next module
|
||||||
;
|
;
|
||||||
} else {
|
} else {
|
||||||
min_max_voltage[0] = 9999;
|
min_max_voltage[0] = 9999;
|
||||||
|
@ -496,7 +496,7 @@ void VolvoSpaHybridBattery::handle_incoming_can_frame(CAN_frame rx_frame) {
|
||||||
CELL_U_MAX = min_max_voltage[1];
|
CELL_U_MAX = min_max_voltage[1];
|
||||||
CELL_U_MIN = min_max_voltage[0];
|
CELL_U_MIN = min_max_voltage[0];
|
||||||
|
|
||||||
transmit_can_frame(&VOLVO_SOH_Req, can_config.battery); //Send SOH read request
|
transmit_can_frame(&VOLVO_SOH_Req); //Send SOH read request
|
||||||
}
|
}
|
||||||
rxConsecutiveFrames = 0;
|
rxConsecutiveFrames = 0;
|
||||||
}
|
}
|
||||||
|
@ -511,7 +511,7 @@ void VolvoSpaHybridBattery::readCellVoltages() {
|
||||||
//batteryModuleNumber = 0x10;
|
//batteryModuleNumber = 0x10;
|
||||||
rxConsecutiveFrames = 0;
|
rxConsecutiveFrames = 0;
|
||||||
//VOLVO_CELL_U_Req.data.u8[3] = batteryModuleNumber++;
|
//VOLVO_CELL_U_Req.data.u8[3] = batteryModuleNumber++;
|
||||||
transmit_can_frame(&VOLVO_CELL_U_Req, can_config.battery); //Send cell voltage read request for first module
|
transmit_can_frame(&VOLVO_CELL_U_Req); //Send cell voltage read request for first module
|
||||||
}
|
}
|
||||||
|
|
||||||
void VolvoSpaHybridBattery::transmit_can(unsigned long currentMillis) {
|
void VolvoSpaHybridBattery::transmit_can(unsigned long currentMillis) {
|
||||||
|
@ -519,22 +519,22 @@ void VolvoSpaHybridBattery::transmit_can(unsigned long currentMillis) {
|
||||||
if (currentMillis - previousMillis100 >= INTERVAL_100_MS) {
|
if (currentMillis - previousMillis100 >= INTERVAL_100_MS) {
|
||||||
previousMillis100 = currentMillis;
|
previousMillis100 = currentMillis;
|
||||||
|
|
||||||
transmit_can_frame(&VOLVO_536, can_config.battery); //Send 0x536 Network managing frame to keep BMS alive
|
transmit_can_frame(&VOLVO_536); //Send 0x536 Network managing frame to keep BMS alive
|
||||||
transmit_can_frame(&VOLVO_372, can_config.battery); //Send 0x372 ECMAmbientTempCalculated
|
transmit_can_frame(&VOLVO_372); //Send 0x372 ECMAmbientTempCalculated
|
||||||
|
|
||||||
if ((datalayer.battery.status.bms_status == ACTIVE) && startedUp) {
|
if ((datalayer.battery.status.bms_status == ACTIVE) && startedUp) {
|
||||||
datalayer.system.status.battery_allows_contactor_closing = true;
|
datalayer.system.status.battery_allows_contactor_closing = true;
|
||||||
//transmit_can_frame(&VOLVO_140_CLOSE, can_config.battery); //Send 0x140 Close contactors message
|
//transmit_can_frame(&VOLVO_140_CLOSE); //Send 0x140 Close contactors message
|
||||||
} else { //datalayer.battery.status.bms_status == FAULT , OR inverter requested opening contactors, OR system not started yet
|
} else { //datalayer.battery.status.bms_status == FAULT , OR inverter requested opening contactors, OR system not started yet
|
||||||
datalayer.system.status.battery_allows_contactor_closing = false;
|
datalayer.system.status.battery_allows_contactor_closing = false;
|
||||||
transmit_can_frame(&VOLVO_140_OPEN, can_config.battery); //Send 0x140 Open contactors message
|
transmit_can_frame(&VOLVO_140_OPEN); //Send 0x140 Open contactors message
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (currentMillis - previousMillis1s >= INTERVAL_1_S) {
|
if (currentMillis - previousMillis1s >= INTERVAL_1_S) {
|
||||||
previousMillis1s = currentMillis;
|
previousMillis1s = currentMillis;
|
||||||
|
|
||||||
if (!startedUp) {
|
if (!startedUp) {
|
||||||
transmit_can_frame(&VOLVO_DTC_Erase, can_config.battery); //Erase any DTCs preventing startup
|
transmit_can_frame(&VOLVO_DTC_Erase); //Erase any DTCs preventing startup
|
||||||
DTC_reset_counter++;
|
DTC_reset_counter++;
|
||||||
if (DTC_reset_counter > 1) { // Performed twice before starting
|
if (DTC_reset_counter > 1) { // Performed twice before starting
|
||||||
startedUp = true;
|
startedUp = true;
|
||||||
|
|
|
@ -190,7 +190,7 @@ bool init_CAN() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void transmit_can_frame(CAN_frame* tx_frame, int interface) {
|
void transmit_can_frame_to_interface(CAN_frame* tx_frame, int interface) {
|
||||||
if (!allowed_to_send_CAN) {
|
if (!allowed_to_send_CAN) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
extern bool use_canfd_as_can;
|
extern bool use_canfd_as_can;
|
||||||
|
|
||||||
void dump_can_frame(CAN_frame& frame, frameDirection msgDir);
|
void dump_can_frame(CAN_frame& frame, frameDirection msgDir);
|
||||||
void transmit_can_frame(CAN_frame* tx_frame, int interface);
|
void transmit_can_frame_to_interface(CAN_frame* tx_frame, int interface);
|
||||||
|
|
||||||
class CanReceiver;
|
class CanReceiver;
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
#include "../../../USER_SECRETS.h"
|
#include "../../../USER_SECRETS.h"
|
||||||
#include "../../battery/BATTERIES.h"
|
#include "../../battery/BATTERIES.h"
|
||||||
#include "../../battery/Battery.h"
|
#include "../../battery/Battery.h"
|
||||||
|
#include "../../communication/can/comm_can.h"
|
||||||
#include "../../communication/contactorcontrol/comm_contactorcontrol.h"
|
#include "../../communication/contactorcontrol/comm_contactorcontrol.h"
|
||||||
#include "../../communication/nvm/comm_nvm.h"
|
#include "../../communication/nvm/comm_nvm.h"
|
||||||
#include "../../datalayer/datalayer.h"
|
#include "../../datalayer/datalayer.h"
|
||||||
|
@ -20,8 +21,6 @@
|
||||||
extern std::string http_username;
|
extern std::string http_username;
|
||||||
extern std::string http_password;
|
extern std::string http_password;
|
||||||
|
|
||||||
void transmit_can_frame(CAN_frame* tx_frame, int interface);
|
|
||||||
|
|
||||||
#ifdef WEBSERVER
|
#ifdef WEBSERVER
|
||||||
const bool webserver_enabled_default = true;
|
const bool webserver_enabled_default = true;
|
||||||
#else
|
#else
|
||||||
|
@ -167,7 +166,7 @@ void canReplayTask(void* param) {
|
||||||
(datalayer.system.info.can_replay_interface == CANFD_ADDON_MCP2518);
|
(datalayer.system.info.can_replay_interface == CANFD_ADDON_MCP2518);
|
||||||
currentFrame.ext_ID = (currentFrame.ID > 0x7F0);
|
currentFrame.ext_ID = (currentFrame.ID > 0x7F0);
|
||||||
|
|
||||||
transmit_can_frame(¤tFrame, datalayer.system.info.can_replay_interface);
|
transmit_can_frame_to_interface(¤tFrame, datalayer.system.info.can_replay_interface);
|
||||||
}
|
}
|
||||||
} while (datalayer.system.info.loop_playback);
|
} while (datalayer.system.info.loop_playback);
|
||||||
|
|
||||||
|
|
|
@ -155,17 +155,17 @@ void AforeCanInverter::map_can_frame_to_variable(CAN_frame rx_frame) {
|
||||||
|
|
||||||
void AforeCanInverter::transmit_can(unsigned long currentMillis) {
|
void AforeCanInverter::transmit_can(unsigned long currentMillis) {
|
||||||
if (time_to_send_info) { // Set every 1s if we get message from inverter
|
if (time_to_send_info) { // Set every 1s if we get message from inverter
|
||||||
transmit_can_frame(&AFORE_350, can_config.inverter);
|
transmit_can_frame(&AFORE_350);
|
||||||
transmit_can_frame(&AFORE_351, can_config.inverter);
|
transmit_can_frame(&AFORE_351);
|
||||||
transmit_can_frame(&AFORE_352, can_config.inverter);
|
transmit_can_frame(&AFORE_352);
|
||||||
transmit_can_frame(&AFORE_353, can_config.inverter);
|
transmit_can_frame(&AFORE_353);
|
||||||
transmit_can_frame(&AFORE_354, can_config.inverter);
|
transmit_can_frame(&AFORE_354);
|
||||||
transmit_can_frame(&AFORE_355, can_config.inverter);
|
transmit_can_frame(&AFORE_355);
|
||||||
transmit_can_frame(&AFORE_356, can_config.inverter);
|
transmit_can_frame(&AFORE_356);
|
||||||
transmit_can_frame(&AFORE_357, can_config.inverter);
|
transmit_can_frame(&AFORE_357);
|
||||||
transmit_can_frame(&AFORE_358, can_config.inverter);
|
transmit_can_frame(&AFORE_358);
|
||||||
transmit_can_frame(&AFORE_359, can_config.inverter);
|
transmit_can_frame(&AFORE_359);
|
||||||
transmit_can_frame(&AFORE_35A, can_config.inverter);
|
transmit_can_frame(&AFORE_35A);
|
||||||
time_to_send_info = false;
|
time_to_send_info = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -142,30 +142,30 @@ void BydCanInverter::transmit_can(unsigned long currentMillis) {
|
||||||
if (currentMillis - previousMillis2s >= INTERVAL_2_S) {
|
if (currentMillis - previousMillis2s >= INTERVAL_2_S) {
|
||||||
previousMillis2s = currentMillis;
|
previousMillis2s = currentMillis;
|
||||||
|
|
||||||
transmit_can_frame(&BYD_110, can_config.inverter);
|
transmit_can_frame(&BYD_110);
|
||||||
}
|
}
|
||||||
// Send 10s CAN Message
|
// Send 10s CAN Message
|
||||||
if (currentMillis - previousMillis10s >= INTERVAL_10_S) {
|
if (currentMillis - previousMillis10s >= INTERVAL_10_S) {
|
||||||
previousMillis10s = currentMillis;
|
previousMillis10s = currentMillis;
|
||||||
|
|
||||||
transmit_can_frame(&BYD_150, can_config.inverter);
|
transmit_can_frame(&BYD_150);
|
||||||
transmit_can_frame(&BYD_1D0, can_config.inverter);
|
transmit_can_frame(&BYD_1D0);
|
||||||
transmit_can_frame(&BYD_210, can_config.inverter);
|
transmit_can_frame(&BYD_210);
|
||||||
}
|
}
|
||||||
//Send 60s message
|
//Send 60s message
|
||||||
if (currentMillis - previousMillis60s >= INTERVAL_60_S) {
|
if (currentMillis - previousMillis60s >= INTERVAL_60_S) {
|
||||||
previousMillis60s = currentMillis;
|
previousMillis60s = currentMillis;
|
||||||
|
|
||||||
transmit_can_frame(&BYD_190, can_config.inverter);
|
transmit_can_frame(&BYD_190);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void BydCanInverter::send_initial_data() {
|
void BydCanInverter::send_initial_data() {
|
||||||
transmit_can_frame(&BYD_250, can_config.inverter);
|
transmit_can_frame(&BYD_250);
|
||||||
transmit_can_frame(&BYD_290, can_config.inverter);
|
transmit_can_frame(&BYD_290);
|
||||||
transmit_can_frame(&BYD_2D0, can_config.inverter);
|
transmit_can_frame(&BYD_2D0);
|
||||||
transmit_can_frame(&BYD_3D0_0, can_config.inverter);
|
transmit_can_frame(&BYD_3D0_0);
|
||||||
transmit_can_frame(&BYD_3D0_1, can_config.inverter);
|
transmit_can_frame(&BYD_3D0_1);
|
||||||
transmit_can_frame(&BYD_3D0_2, can_config.inverter);
|
transmit_can_frame(&BYD_3D0_2);
|
||||||
transmit_can_frame(&BYD_3D0_3, can_config.inverter);
|
transmit_can_frame(&BYD_3D0_3);
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
|
|
||||||
class CanInverterProtocol : public InverterProtocol, Transmitter, CanReceiver {
|
class CanInverterProtocol : public InverterProtocol, Transmitter, CanReceiver {
|
||||||
public:
|
public:
|
||||||
virtual const char* interface_name() { return getCANInterfaceName(can_config.inverter); }
|
virtual const char* interface_name() { return getCANInterfaceName(can_interface); }
|
||||||
InverterInterfaceType interface_type() { return InverterInterfaceType::Can; }
|
InverterInterfaceType interface_type() { return InverterInterfaceType::Can; }
|
||||||
|
|
||||||
virtual void transmit_can(unsigned long currentMillis) = 0;
|
virtual void transmit_can(unsigned long currentMillis) = 0;
|
||||||
|
@ -24,10 +24,15 @@ class CanInverterProtocol : public InverterProtocol, Transmitter, CanReceiver {
|
||||||
void receive_can_frame(CAN_frame* frame) { map_can_frame_to_variable(*frame); }
|
void receive_can_frame(CAN_frame* frame) { map_can_frame_to_variable(*frame); }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
CAN_Interface can_interface;
|
||||||
|
|
||||||
CanInverterProtocol() {
|
CanInverterProtocol() {
|
||||||
|
can_interface = can_config.inverter;
|
||||||
register_transmitter(this);
|
register_transmitter(this);
|
||||||
register_can_receiver(this, can_config.inverter);
|
register_can_receiver(this, can_interface);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void transmit_can_frame(CAN_frame* frame) { transmit_can_frame_to_interface(frame, can_interface); }
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -332,36 +332,36 @@ void FerroampCanInverter::transmit_can(unsigned long currentMillis) {
|
||||||
|
|
||||||
void FerroampCanInverter::send_setup_info() { //Ensemble information
|
void FerroampCanInverter::send_setup_info() { //Ensemble information
|
||||||
#ifdef SEND_0
|
#ifdef SEND_0
|
||||||
transmit_can_frame(&PYLON_7310, can_config.inverter);
|
transmit_can_frame(&PYLON_7310);
|
||||||
transmit_can_frame(&PYLON_7320, can_config.inverter);
|
transmit_can_frame(&PYLON_7320);
|
||||||
#endif
|
#endif
|
||||||
#ifdef SEND_1
|
#ifdef SEND_1
|
||||||
transmit_can_frame(&PYLON_7311, can_config.inverter);
|
transmit_can_frame(&PYLON_7311);
|
||||||
transmit_can_frame(&PYLON_7321, can_config.inverter);
|
transmit_can_frame(&PYLON_7321);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void FerroampCanInverter::send_system_data() { //System equipment information
|
void FerroampCanInverter::send_system_data() { //System equipment information
|
||||||
#ifdef SEND_0
|
#ifdef SEND_0
|
||||||
transmit_can_frame(&PYLON_4210, can_config.inverter);
|
transmit_can_frame(&PYLON_4210);
|
||||||
transmit_can_frame(&PYLON_4220, can_config.inverter);
|
transmit_can_frame(&PYLON_4220);
|
||||||
transmit_can_frame(&PYLON_4230, can_config.inverter);
|
transmit_can_frame(&PYLON_4230);
|
||||||
transmit_can_frame(&PYLON_4240, can_config.inverter);
|
transmit_can_frame(&PYLON_4240);
|
||||||
transmit_can_frame(&PYLON_4250, can_config.inverter);
|
transmit_can_frame(&PYLON_4250);
|
||||||
transmit_can_frame(&PYLON_4260, can_config.inverter);
|
transmit_can_frame(&PYLON_4260);
|
||||||
transmit_can_frame(&PYLON_4270, can_config.inverter);
|
transmit_can_frame(&PYLON_4270);
|
||||||
transmit_can_frame(&PYLON_4280, can_config.inverter);
|
transmit_can_frame(&PYLON_4280);
|
||||||
transmit_can_frame(&PYLON_4290, can_config.inverter);
|
transmit_can_frame(&PYLON_4290);
|
||||||
#endif
|
#endif
|
||||||
#ifdef SEND_1
|
#ifdef SEND_1
|
||||||
transmit_can_frame(&PYLON_4211, can_config.inverter);
|
transmit_can_frame(&PYLON_4211);
|
||||||
transmit_can_frame(&PYLON_4221, can_config.inverter);
|
transmit_can_frame(&PYLON_4221);
|
||||||
transmit_can_frame(&PYLON_4231, can_config.inverter);
|
transmit_can_frame(&PYLON_4231);
|
||||||
transmit_can_frame(&PYLON_4241, can_config.inverter);
|
transmit_can_frame(&PYLON_4241);
|
||||||
transmit_can_frame(&PYLON_4251, can_config.inverter);
|
transmit_can_frame(&PYLON_4251);
|
||||||
transmit_can_frame(&PYLON_4261, can_config.inverter);
|
transmit_can_frame(&PYLON_4261);
|
||||||
transmit_can_frame(&PYLON_4271, can_config.inverter);
|
transmit_can_frame(&PYLON_4271);
|
||||||
transmit_can_frame(&PYLON_4281, can_config.inverter);
|
transmit_can_frame(&PYLON_4281);
|
||||||
transmit_can_frame(&PYLON_4291, can_config.inverter);
|
transmit_can_frame(&PYLON_4291);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
@ -264,16 +264,16 @@ void FoxessCanInverter::transmit_can(unsigned long currentMillis) {
|
||||||
switch (can_message_bms_index) {
|
switch (can_message_bms_index) {
|
||||||
case 0:
|
case 0:
|
||||||
//TODO, should we limit this incase NUMBER_OF_PACKS =! 8?
|
//TODO, should we limit this incase NUMBER_OF_PACKS =! 8?
|
||||||
transmit_can_frame(&FOXESS_1872, can_config.inverter);
|
transmit_can_frame(&FOXESS_1872);
|
||||||
transmit_can_frame(&FOXESS_1873, can_config.inverter);
|
transmit_can_frame(&FOXESS_1873);
|
||||||
transmit_can_frame(&FOXESS_1874, can_config.inverter);
|
transmit_can_frame(&FOXESS_1874);
|
||||||
transmit_can_frame(&FOXESS_1875, can_config.inverter);
|
transmit_can_frame(&FOXESS_1875);
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
transmit_can_frame(&FOXESS_1876, can_config.inverter);
|
transmit_can_frame(&FOXESS_1876);
|
||||||
transmit_can_frame(&FOXESS_1877, can_config.inverter);
|
transmit_can_frame(&FOXESS_1877);
|
||||||
transmit_can_frame(&FOXESS_1878, can_config.inverter);
|
transmit_can_frame(&FOXESS_1878);
|
||||||
transmit_can_frame(&FOXESS_1879, can_config.inverter);
|
transmit_can_frame(&FOXESS_1879);
|
||||||
send_bms_info = false;
|
send_bms_info = false;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -299,16 +299,16 @@ void FoxessCanInverter::transmit_can(unsigned long currentMillis) {
|
||||||
switch (can_message_individualpack_index) {
|
switch (can_message_individualpack_index) {
|
||||||
case 0:
|
case 0:
|
||||||
//TODO, should we limit this incase NUMBER_OF_PACKS =! 8?
|
//TODO, should we limit this incase NUMBER_OF_PACKS =! 8?
|
||||||
transmit_can_frame(&FOXESS_0C05, can_config.inverter);
|
transmit_can_frame(&FOXESS_0C05);
|
||||||
transmit_can_frame(&FOXESS_0C06, can_config.inverter);
|
transmit_can_frame(&FOXESS_0C06);
|
||||||
transmit_can_frame(&FOXESS_0C07, can_config.inverter);
|
transmit_can_frame(&FOXESS_0C07);
|
||||||
transmit_can_frame(&FOXESS_0C08, can_config.inverter);
|
transmit_can_frame(&FOXESS_0C08);
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
transmit_can_frame(&FOXESS_0C09, can_config.inverter);
|
transmit_can_frame(&FOXESS_0C09);
|
||||||
transmit_can_frame(&FOXESS_0C0A, can_config.inverter);
|
transmit_can_frame(&FOXESS_0C0A);
|
||||||
transmit_can_frame(&FOXESS_0C0B, can_config.inverter);
|
transmit_can_frame(&FOXESS_0C0B);
|
||||||
transmit_can_frame(&FOXESS_0C0C, can_config.inverter);
|
transmit_can_frame(&FOXESS_0C0C);
|
||||||
send_individual_pack_status = false;
|
send_individual_pack_status = false;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -336,18 +336,18 @@ void FoxessCanInverter::transmit_can(unsigned long currentMillis) {
|
||||||
FOXESS_1881.data.u8[0] = 0;
|
FOXESS_1881.data.u8[0] = 0;
|
||||||
FOXESS_1882.data.u8[0] = 0;
|
FOXESS_1882.data.u8[0] = 0;
|
||||||
FOXESS_1883.data.u8[0] = 0;
|
FOXESS_1883.data.u8[0] = 0;
|
||||||
transmit_can_frame(&FOXESS_1881, can_config.inverter);
|
transmit_can_frame(&FOXESS_1881);
|
||||||
transmit_can_frame(&FOXESS_1882, can_config.inverter);
|
transmit_can_frame(&FOXESS_1882);
|
||||||
transmit_can_frame(&FOXESS_1883, can_config.inverter);
|
transmit_can_frame(&FOXESS_1883);
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
if (NUMBER_OF_PACKS > 0) {
|
if (NUMBER_OF_PACKS > 0) {
|
||||||
FOXESS_1881.data.u8[0] = 1;
|
FOXESS_1881.data.u8[0] = 1;
|
||||||
FOXESS_1882.data.u8[0] = 1;
|
FOXESS_1882.data.u8[0] = 1;
|
||||||
FOXESS_1883.data.u8[0] = 1;
|
FOXESS_1883.data.u8[0] = 1;
|
||||||
transmit_can_frame(&FOXESS_1881, can_config.inverter);
|
transmit_can_frame(&FOXESS_1881);
|
||||||
transmit_can_frame(&FOXESS_1882, can_config.inverter);
|
transmit_can_frame(&FOXESS_1882);
|
||||||
transmit_can_frame(&FOXESS_1883, can_config.inverter);
|
transmit_can_frame(&FOXESS_1883);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
|
@ -355,9 +355,9 @@ void FoxessCanInverter::transmit_can(unsigned long currentMillis) {
|
||||||
FOXESS_1881.data.u8[0] = 2;
|
FOXESS_1881.data.u8[0] = 2;
|
||||||
FOXESS_1882.data.u8[0] = 2;
|
FOXESS_1882.data.u8[0] = 2;
|
||||||
FOXESS_1883.data.u8[0] = 2;
|
FOXESS_1883.data.u8[0] = 2;
|
||||||
transmit_can_frame(&FOXESS_1881, can_config.inverter);
|
transmit_can_frame(&FOXESS_1881);
|
||||||
transmit_can_frame(&FOXESS_1882, can_config.inverter);
|
transmit_can_frame(&FOXESS_1882);
|
||||||
transmit_can_frame(&FOXESS_1883, can_config.inverter);
|
transmit_can_frame(&FOXESS_1883);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
|
@ -365,9 +365,9 @@ void FoxessCanInverter::transmit_can(unsigned long currentMillis) {
|
||||||
FOXESS_1881.data.u8[0] = 3;
|
FOXESS_1881.data.u8[0] = 3;
|
||||||
FOXESS_1882.data.u8[0] = 3;
|
FOXESS_1882.data.u8[0] = 3;
|
||||||
FOXESS_1883.data.u8[0] = 3;
|
FOXESS_1883.data.u8[0] = 3;
|
||||||
transmit_can_frame(&FOXESS_1881, can_config.inverter);
|
transmit_can_frame(&FOXESS_1881);
|
||||||
transmit_can_frame(&FOXESS_1882, can_config.inverter);
|
transmit_can_frame(&FOXESS_1882);
|
||||||
transmit_can_frame(&FOXESS_1883, can_config.inverter);
|
transmit_can_frame(&FOXESS_1883);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
|
@ -375,9 +375,9 @@ void FoxessCanInverter::transmit_can(unsigned long currentMillis) {
|
||||||
FOXESS_1881.data.u8[0] = 4;
|
FOXESS_1881.data.u8[0] = 4;
|
||||||
FOXESS_1882.data.u8[0] = 4;
|
FOXESS_1882.data.u8[0] = 4;
|
||||||
FOXESS_1883.data.u8[0] = 4;
|
FOXESS_1883.data.u8[0] = 4;
|
||||||
transmit_can_frame(&FOXESS_1881, can_config.inverter);
|
transmit_can_frame(&FOXESS_1881);
|
||||||
transmit_can_frame(&FOXESS_1882, can_config.inverter);
|
transmit_can_frame(&FOXESS_1882);
|
||||||
transmit_can_frame(&FOXESS_1883, can_config.inverter);
|
transmit_can_frame(&FOXESS_1883);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 5:
|
case 5:
|
||||||
|
@ -385,9 +385,9 @@ void FoxessCanInverter::transmit_can(unsigned long currentMillis) {
|
||||||
FOXESS_1881.data.u8[0] = 5;
|
FOXESS_1881.data.u8[0] = 5;
|
||||||
FOXESS_1882.data.u8[0] = 5;
|
FOXESS_1882.data.u8[0] = 5;
|
||||||
FOXESS_1883.data.u8[0] = 5;
|
FOXESS_1883.data.u8[0] = 5;
|
||||||
transmit_can_frame(&FOXESS_1881, can_config.inverter);
|
transmit_can_frame(&FOXESS_1881);
|
||||||
transmit_can_frame(&FOXESS_1882, can_config.inverter);
|
transmit_can_frame(&FOXESS_1882);
|
||||||
transmit_can_frame(&FOXESS_1883, can_config.inverter);
|
transmit_can_frame(&FOXESS_1883);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 6:
|
case 6:
|
||||||
|
@ -395,9 +395,9 @@ void FoxessCanInverter::transmit_can(unsigned long currentMillis) {
|
||||||
FOXESS_1881.data.u8[0] = 6;
|
FOXESS_1881.data.u8[0] = 6;
|
||||||
FOXESS_1882.data.u8[0] = 6;
|
FOXESS_1882.data.u8[0] = 6;
|
||||||
FOXESS_1883.data.u8[0] = 6;
|
FOXESS_1883.data.u8[0] = 6;
|
||||||
transmit_can_frame(&FOXESS_1881, can_config.inverter);
|
transmit_can_frame(&FOXESS_1881);
|
||||||
transmit_can_frame(&FOXESS_1882, can_config.inverter);
|
transmit_can_frame(&FOXESS_1882);
|
||||||
transmit_can_frame(&FOXESS_1883, can_config.inverter);
|
transmit_can_frame(&FOXESS_1883);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 7:
|
case 7:
|
||||||
|
@ -405,9 +405,9 @@ void FoxessCanInverter::transmit_can(unsigned long currentMillis) {
|
||||||
FOXESS_1881.data.u8[0] = 7;
|
FOXESS_1881.data.u8[0] = 7;
|
||||||
FOXESS_1882.data.u8[0] = 7;
|
FOXESS_1882.data.u8[0] = 7;
|
||||||
FOXESS_1883.data.u8[0] = 7;
|
FOXESS_1883.data.u8[0] = 7;
|
||||||
transmit_can_frame(&FOXESS_1881, can_config.inverter);
|
transmit_can_frame(&FOXESS_1881);
|
||||||
transmit_can_frame(&FOXESS_1882, can_config.inverter);
|
transmit_can_frame(&FOXESS_1882);
|
||||||
transmit_can_frame(&FOXESS_1883, can_config.inverter);
|
transmit_can_frame(&FOXESS_1883);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 8:
|
case 8:
|
||||||
|
@ -415,9 +415,9 @@ void FoxessCanInverter::transmit_can(unsigned long currentMillis) {
|
||||||
FOXESS_1881.data.u8[0] = 8;
|
FOXESS_1881.data.u8[0] = 8;
|
||||||
FOXESS_1882.data.u8[0] = 8;
|
FOXESS_1882.data.u8[0] = 8;
|
||||||
FOXESS_1883.data.u8[0] = 8;
|
FOXESS_1883.data.u8[0] = 8;
|
||||||
transmit_can_frame(&FOXESS_1881, can_config.inverter);
|
transmit_can_frame(&FOXESS_1881);
|
||||||
transmit_can_frame(&FOXESS_1882, can_config.inverter);
|
transmit_can_frame(&FOXESS_1882);
|
||||||
transmit_can_frame(&FOXESS_1883, can_config.inverter);
|
transmit_can_frame(&FOXESS_1883);
|
||||||
}
|
}
|
||||||
send_serial_numbers = false;
|
send_serial_numbers = false;
|
||||||
break;
|
break;
|
||||||
|
@ -443,65 +443,65 @@ void FoxessCanInverter::transmit_can(unsigned long currentMillis) {
|
||||||
// Send a subset of messages per iteration to avoid overloading the CAN bus / transmit buffer
|
// Send a subset of messages per iteration to avoid overloading the CAN bus / transmit buffer
|
||||||
switch (can_message_cellvolt_index) {
|
switch (can_message_cellvolt_index) {
|
||||||
case 0:
|
case 0:
|
||||||
transmit_can_frame(&FOXESS_0C1D, can_config.inverter);
|
transmit_can_frame(&FOXESS_0C1D);
|
||||||
transmit_can_frame(&FOXESS_0C21, can_config.inverter);
|
transmit_can_frame(&FOXESS_0C21);
|
||||||
transmit_can_frame(&FOXESS_0C29, can_config.inverter);
|
transmit_can_frame(&FOXESS_0C29);
|
||||||
transmit_can_frame(&FOXESS_0C2D, can_config.inverter);
|
transmit_can_frame(&FOXESS_0C2D);
|
||||||
transmit_can_frame(&FOXESS_0C31, can_config.inverter);
|
transmit_can_frame(&FOXESS_0C31);
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
transmit_can_frame(&FOXESS_0C35, can_config.inverter);
|
transmit_can_frame(&FOXESS_0C35);
|
||||||
transmit_can_frame(&FOXESS_0C39, can_config.inverter);
|
transmit_can_frame(&FOXESS_0C39);
|
||||||
transmit_can_frame(&FOXESS_0C3D, can_config.inverter);
|
transmit_can_frame(&FOXESS_0C3D);
|
||||||
transmit_can_frame(&FOXESS_0C41, can_config.inverter);
|
transmit_can_frame(&FOXESS_0C41);
|
||||||
transmit_can_frame(&FOXESS_0C45, can_config.inverter);
|
transmit_can_frame(&FOXESS_0C45);
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
transmit_can_frame(&FOXESS_0C49, can_config.inverter);
|
transmit_can_frame(&FOXESS_0C49);
|
||||||
transmit_can_frame(&FOXESS_0C4D, can_config.inverter);
|
transmit_can_frame(&FOXESS_0C4D);
|
||||||
transmit_can_frame(&FOXESS_0C51, can_config.inverter);
|
transmit_can_frame(&FOXESS_0C51);
|
||||||
transmit_can_frame(&FOXESS_0C55, can_config.inverter);
|
transmit_can_frame(&FOXESS_0C55);
|
||||||
transmit_can_frame(&FOXESS_0C59, can_config.inverter);
|
transmit_can_frame(&FOXESS_0C59);
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
transmit_can_frame(&FOXESS_0C5D, can_config.inverter);
|
transmit_can_frame(&FOXESS_0C5D);
|
||||||
transmit_can_frame(&FOXESS_0C61, can_config.inverter);
|
transmit_can_frame(&FOXESS_0C61);
|
||||||
transmit_can_frame(&FOXESS_0C65, can_config.inverter);
|
transmit_can_frame(&FOXESS_0C65);
|
||||||
transmit_can_frame(&FOXESS_0C69, can_config.inverter);
|
transmit_can_frame(&FOXESS_0C69);
|
||||||
transmit_can_frame(&FOXESS_0C6D, can_config.inverter);
|
transmit_can_frame(&FOXESS_0C6D);
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
transmit_can_frame(&FOXESS_0C71, can_config.inverter);
|
transmit_can_frame(&FOXESS_0C71);
|
||||||
transmit_can_frame(&FOXESS_0C75, can_config.inverter);
|
transmit_can_frame(&FOXESS_0C75);
|
||||||
transmit_can_frame(&FOXESS_0C79, can_config.inverter);
|
transmit_can_frame(&FOXESS_0C79);
|
||||||
transmit_can_frame(&FOXESS_0C7D, can_config.inverter);
|
transmit_can_frame(&FOXESS_0C7D);
|
||||||
transmit_can_frame(&FOXESS_0C81, can_config.inverter);
|
transmit_can_frame(&FOXESS_0C81);
|
||||||
break;
|
break;
|
||||||
case 5:
|
case 5:
|
||||||
transmit_can_frame(&FOXESS_0C85, can_config.inverter);
|
transmit_can_frame(&FOXESS_0C85);
|
||||||
transmit_can_frame(&FOXESS_0C89, can_config.inverter);
|
transmit_can_frame(&FOXESS_0C89);
|
||||||
transmit_can_frame(&FOXESS_0C8D, can_config.inverter);
|
transmit_can_frame(&FOXESS_0C8D);
|
||||||
transmit_can_frame(&FOXESS_0C91, can_config.inverter);
|
transmit_can_frame(&FOXESS_0C91);
|
||||||
transmit_can_frame(&FOXESS_0C95, can_config.inverter);
|
transmit_can_frame(&FOXESS_0C95);
|
||||||
break;
|
break;
|
||||||
case 6:
|
case 6:
|
||||||
transmit_can_frame(&FOXESS_0C99, can_config.inverter);
|
transmit_can_frame(&FOXESS_0C99);
|
||||||
transmit_can_frame(&FOXESS_0C9D, can_config.inverter);
|
transmit_can_frame(&FOXESS_0C9D);
|
||||||
transmit_can_frame(&FOXESS_0CA1, can_config.inverter);
|
transmit_can_frame(&FOXESS_0CA1);
|
||||||
transmit_can_frame(&FOXESS_0CA5, can_config.inverter);
|
transmit_can_frame(&FOXESS_0CA5);
|
||||||
transmit_can_frame(&FOXESS_0CA9, can_config.inverter);
|
transmit_can_frame(&FOXESS_0CA9);
|
||||||
break;
|
break;
|
||||||
case 7: //Celltemperatures
|
case 7: //Celltemperatures
|
||||||
transmit_can_frame(&FOXESS_0D21, can_config.inverter);
|
transmit_can_frame(&FOXESS_0D21);
|
||||||
transmit_can_frame(&FOXESS_0D29, can_config.inverter);
|
transmit_can_frame(&FOXESS_0D29);
|
||||||
transmit_can_frame(&FOXESS_0D31, can_config.inverter);
|
transmit_can_frame(&FOXESS_0D31);
|
||||||
transmit_can_frame(&FOXESS_0D39, can_config.inverter);
|
transmit_can_frame(&FOXESS_0D39);
|
||||||
break;
|
break;
|
||||||
case 8: //Celltemperatures
|
case 8: //Celltemperatures
|
||||||
transmit_can_frame(&FOXESS_0D41, can_config.inverter);
|
transmit_can_frame(&FOXESS_0D41);
|
||||||
transmit_can_frame(&FOXESS_0D49, can_config.inverter);
|
transmit_can_frame(&FOXESS_0D49);
|
||||||
transmit_can_frame(&FOXESS_0D51, can_config.inverter);
|
transmit_can_frame(&FOXESS_0D51);
|
||||||
transmit_can_frame(&FOXESS_0D59, can_config.inverter);
|
transmit_can_frame(&FOXESS_0D59);
|
||||||
send_cellvoltages = false;
|
send_cellvoltages = false;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -407,34 +407,34 @@ void GrowattHvInverter::transmit_can(unsigned long currentMillis) {
|
||||||
// Send a subset of messages per iteration to avoid overloading the CAN bus / transmit buffer
|
// Send a subset of messages per iteration to avoid overloading the CAN bus / transmit buffer
|
||||||
switch (can_message_batch_index) {
|
switch (can_message_batch_index) {
|
||||||
case 0:
|
case 0:
|
||||||
transmit_can_frame(&GROWATT_3110, can_config.inverter);
|
transmit_can_frame(&GROWATT_3110);
|
||||||
transmit_can_frame(&GROWATT_3120, can_config.inverter);
|
transmit_can_frame(&GROWATT_3120);
|
||||||
transmit_can_frame(&GROWATT_3130, can_config.inverter);
|
transmit_can_frame(&GROWATT_3130);
|
||||||
transmit_can_frame(&GROWATT_3140, can_config.inverter);
|
transmit_can_frame(&GROWATT_3140);
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
transmit_can_frame(&GROWATT_3150, can_config.inverter);
|
transmit_can_frame(&GROWATT_3150);
|
||||||
transmit_can_frame(&GROWATT_3160, can_config.inverter);
|
transmit_can_frame(&GROWATT_3160);
|
||||||
transmit_can_frame(&GROWATT_3170, can_config.inverter);
|
transmit_can_frame(&GROWATT_3170);
|
||||||
transmit_can_frame(&GROWATT_3180, can_config.inverter);
|
transmit_can_frame(&GROWATT_3180);
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
transmit_can_frame(&GROWATT_3190, can_config.inverter);
|
transmit_can_frame(&GROWATT_3190);
|
||||||
transmit_can_frame(&GROWATT_3200, can_config.inverter);
|
transmit_can_frame(&GROWATT_3200);
|
||||||
transmit_can_frame(&GROWATT_3210, can_config.inverter);
|
transmit_can_frame(&GROWATT_3210);
|
||||||
transmit_can_frame(&GROWATT_3220, can_config.inverter);
|
transmit_can_frame(&GROWATT_3220);
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
transmit_can_frame(&GROWATT_3230, can_config.inverter);
|
transmit_can_frame(&GROWATT_3230);
|
||||||
transmit_can_frame(&GROWATT_3240, can_config.inverter);
|
transmit_can_frame(&GROWATT_3240);
|
||||||
transmit_can_frame(&GROWATT_3250, can_config.inverter);
|
transmit_can_frame(&GROWATT_3250);
|
||||||
transmit_can_frame(&GROWATT_3260, can_config.inverter);
|
transmit_can_frame(&GROWATT_3260);
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
transmit_can_frame(&GROWATT_3270, can_config.inverter);
|
transmit_can_frame(&GROWATT_3270);
|
||||||
transmit_can_frame(&GROWATT_3280, can_config.inverter);
|
transmit_can_frame(&GROWATT_3280);
|
||||||
transmit_can_frame(&GROWATT_3290, can_config.inverter);
|
transmit_can_frame(&GROWATT_3290);
|
||||||
transmit_can_frame(&GROWATT_3F00, can_config.inverter);
|
transmit_can_frame(&GROWATT_3F00);
|
||||||
time_to_send_1s_data = false;
|
time_to_send_1s_data = false;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -182,17 +182,17 @@ void GrowattLvInverter::map_can_frame_to_variable(CAN_frame rx_frame) {
|
||||||
switch (rx_frame.ID) {
|
switch (rx_frame.ID) {
|
||||||
case 0x301:
|
case 0x301:
|
||||||
datalayer.system.status.CAN_inverter_still_alive = CAN_STILL_ALIVE;
|
datalayer.system.status.CAN_inverter_still_alive = CAN_STILL_ALIVE;
|
||||||
transmit_can_frame(&GROWATT_311, can_config.inverter);
|
transmit_can_frame(&GROWATT_311);
|
||||||
transmit_can_frame(&GROWATT_312, can_config.inverter);
|
transmit_can_frame(&GROWATT_312);
|
||||||
transmit_can_frame(&GROWATT_313, can_config.inverter);
|
transmit_can_frame(&GROWATT_313);
|
||||||
transmit_can_frame(&GROWATT_314, can_config.inverter);
|
transmit_can_frame(&GROWATT_314);
|
||||||
transmit_can_frame(&GROWATT_315, can_config.inverter);
|
transmit_can_frame(&GROWATT_315);
|
||||||
transmit_can_frame(&GROWATT_316, can_config.inverter);
|
transmit_can_frame(&GROWATT_316);
|
||||||
transmit_can_frame(&GROWATT_317, can_config.inverter);
|
transmit_can_frame(&GROWATT_317);
|
||||||
transmit_can_frame(&GROWATT_318, can_config.inverter);
|
transmit_can_frame(&GROWATT_318);
|
||||||
transmit_can_frame(&GROWATT_319, can_config.inverter);
|
transmit_can_frame(&GROWATT_319);
|
||||||
transmit_can_frame(&GROWATT_320, can_config.inverter);
|
transmit_can_frame(&GROWATT_320);
|
||||||
transmit_can_frame(&GROWATT_321, can_config.inverter);
|
transmit_can_frame(&GROWATT_321);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -319,36 +319,36 @@ void PylonInverter::transmit_can(unsigned long currentMillis) {
|
||||||
|
|
||||||
void PylonInverter::send_setup_info() { //Ensemble information
|
void PylonInverter::send_setup_info() { //Ensemble information
|
||||||
#ifdef SEND_0
|
#ifdef SEND_0
|
||||||
transmit_can_frame(&PYLON_7310, can_config.inverter);
|
transmit_can_frame(&PYLON_7310);
|
||||||
transmit_can_frame(&PYLON_7320, can_config.inverter);
|
transmit_can_frame(&PYLON_7320);
|
||||||
#endif
|
#endif
|
||||||
#ifdef SEND_1
|
#ifdef SEND_1
|
||||||
transmit_can_frame(&PYLON_7311, can_config.inverter);
|
transmit_can_frame(&PYLON_7311);
|
||||||
transmit_can_frame(&PYLON_7321, can_config.inverter);
|
transmit_can_frame(&PYLON_7321);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void PylonInverter::send_system_data() { //System equipment information
|
void PylonInverter::send_system_data() { //System equipment information
|
||||||
#ifdef SEND_0
|
#ifdef SEND_0
|
||||||
transmit_can_frame(&PYLON_4210, can_config.inverter);
|
transmit_can_frame(&PYLON_4210);
|
||||||
transmit_can_frame(&PYLON_4220, can_config.inverter);
|
transmit_can_frame(&PYLON_4220);
|
||||||
transmit_can_frame(&PYLON_4230, can_config.inverter);
|
transmit_can_frame(&PYLON_4230);
|
||||||
transmit_can_frame(&PYLON_4240, can_config.inverter);
|
transmit_can_frame(&PYLON_4240);
|
||||||
transmit_can_frame(&PYLON_4250, can_config.inverter);
|
transmit_can_frame(&PYLON_4250);
|
||||||
transmit_can_frame(&PYLON_4260, can_config.inverter);
|
transmit_can_frame(&PYLON_4260);
|
||||||
transmit_can_frame(&PYLON_4270, can_config.inverter);
|
transmit_can_frame(&PYLON_4270);
|
||||||
transmit_can_frame(&PYLON_4280, can_config.inverter);
|
transmit_can_frame(&PYLON_4280);
|
||||||
transmit_can_frame(&PYLON_4290, can_config.inverter);
|
transmit_can_frame(&PYLON_4290);
|
||||||
#endif
|
#endif
|
||||||
#ifdef SEND_1
|
#ifdef SEND_1
|
||||||
transmit_can_frame(&PYLON_4211, can_config.inverter);
|
transmit_can_frame(&PYLON_4211);
|
||||||
transmit_can_frame(&PYLON_4221, can_config.inverter);
|
transmit_can_frame(&PYLON_4221);
|
||||||
transmit_can_frame(&PYLON_4231, can_config.inverter);
|
transmit_can_frame(&PYLON_4231);
|
||||||
transmit_can_frame(&PYLON_4241, can_config.inverter);
|
transmit_can_frame(&PYLON_4241);
|
||||||
transmit_can_frame(&PYLON_4251, can_config.inverter);
|
transmit_can_frame(&PYLON_4251);
|
||||||
transmit_can_frame(&PYLON_4261, can_config.inverter);
|
transmit_can_frame(&PYLON_4261);
|
||||||
transmit_can_frame(&PYLON_4271, can_config.inverter);
|
transmit_can_frame(&PYLON_4271);
|
||||||
transmit_can_frame(&PYLON_4281, can_config.inverter);
|
transmit_can_frame(&PYLON_4281);
|
||||||
transmit_can_frame(&PYLON_4291, can_config.inverter);
|
transmit_can_frame(&PYLON_4291);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
@ -136,11 +136,11 @@ void PylonLvInverter::transmit_can(unsigned long currentMillis) {
|
||||||
dump_frame(&PYLON_35E);
|
dump_frame(&PYLON_35E);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
transmit_can_frame(&PYLON_351, can_config.inverter);
|
transmit_can_frame(&PYLON_351);
|
||||||
transmit_can_frame(&PYLON_355, can_config.inverter);
|
transmit_can_frame(&PYLON_355);
|
||||||
transmit_can_frame(&PYLON_356, can_config.inverter);
|
transmit_can_frame(&PYLON_356);
|
||||||
transmit_can_frame(&PYLON_359, can_config.inverter);
|
transmit_can_frame(&PYLON_359);
|
||||||
transmit_can_frame(&PYLON_35C, can_config.inverter);
|
transmit_can_frame(&PYLON_35C);
|
||||||
transmit_can_frame(&PYLON_35E, can_config.inverter);
|
transmit_can_frame(&PYLON_35E);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -201,27 +201,27 @@ void SchneiderInverter::transmit_can(unsigned long currentMillis) {
|
||||||
if (currentMillis - previousMillis500ms >= INTERVAL_500_MS) {
|
if (currentMillis - previousMillis500ms >= INTERVAL_500_MS) {
|
||||||
previousMillis500ms = currentMillis;
|
previousMillis500ms = currentMillis;
|
||||||
|
|
||||||
transmit_can_frame(&SE_321, can_config.inverter);
|
transmit_can_frame(&SE_321);
|
||||||
transmit_can_frame(&SE_322, can_config.inverter);
|
transmit_can_frame(&SE_322);
|
||||||
transmit_can_frame(&SE_323, can_config.inverter);
|
transmit_can_frame(&SE_323);
|
||||||
transmit_can_frame(&SE_324, can_config.inverter);
|
transmit_can_frame(&SE_324);
|
||||||
transmit_can_frame(&SE_325, can_config.inverter);
|
transmit_can_frame(&SE_325);
|
||||||
}
|
}
|
||||||
// Send 2s CAN Message
|
// Send 2s CAN Message
|
||||||
if (currentMillis - previousMillis2s >= INTERVAL_2_S) {
|
if (currentMillis - previousMillis2s >= INTERVAL_2_S) {
|
||||||
previousMillis2s = currentMillis;
|
previousMillis2s = currentMillis;
|
||||||
|
|
||||||
transmit_can_frame(&SE_320, can_config.inverter);
|
transmit_can_frame(&SE_320);
|
||||||
transmit_can_frame(&SE_326, can_config.inverter);
|
transmit_can_frame(&SE_326);
|
||||||
transmit_can_frame(&SE_327, can_config.inverter);
|
transmit_can_frame(&SE_327);
|
||||||
}
|
}
|
||||||
// Send 10s CAN Message
|
// Send 10s CAN Message
|
||||||
if (currentMillis - previousMillis10s >= INTERVAL_10_S) {
|
if (currentMillis - previousMillis10s >= INTERVAL_10_S) {
|
||||||
previousMillis10s = currentMillis;
|
previousMillis10s = currentMillis;
|
||||||
transmit_can_frame(&SE_328, can_config.inverter);
|
transmit_can_frame(&SE_328);
|
||||||
transmit_can_frame(&SE_330, can_config.inverter);
|
transmit_can_frame(&SE_330);
|
||||||
transmit_can_frame(&SE_331, can_config.inverter);
|
transmit_can_frame(&SE_331);
|
||||||
transmit_can_frame(&SE_332, can_config.inverter);
|
transmit_can_frame(&SE_332);
|
||||||
transmit_can_frame(&SE_333, can_config.inverter);
|
transmit_can_frame(&SE_333);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -147,12 +147,12 @@ void SmaBydHInverter::map_can_frame_to_variable(CAN_frame rx_frame) {
|
||||||
datalayer.system.status.CAN_inverter_still_alive = CAN_STILL_ALIVE;
|
datalayer.system.status.CAN_inverter_still_alive = CAN_STILL_ALIVE;
|
||||||
//Frame0-3 Timestamp
|
//Frame0-3 Timestamp
|
||||||
/*
|
/*
|
||||||
transmit_can_frame(&SMA_158, can_config.inverter);
|
transmit_can_frame(&SMA_158);
|
||||||
transmit_can_frame(&SMA_358, can_config.inverter);
|
transmit_can_frame(&SMA_358);
|
||||||
transmit_can_frame(&SMA_3D8, can_config.inverter);
|
transmit_can_frame(&SMA_3D8);
|
||||||
transmit_can_frame(&SMA_458, can_config.inverter);
|
transmit_can_frame(&SMA_458);
|
||||||
transmit_can_frame(&SMA_518, can_config.inverter);
|
transmit_can_frame(&SMA_518);
|
||||||
transmit_can_frame(&SMA_4D8, can_config.inverter);
|
transmit_can_frame(&SMA_4D8);
|
||||||
*/
|
*/
|
||||||
inverter_time =
|
inverter_time =
|
||||||
(rx_frame.data.u8[0] << 24) | (rx_frame.data.u8[1] << 16) | (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
(rx_frame.data.u8[0] << 24) | (rx_frame.data.u8[1] << 16) | (rx_frame.data.u8[2] << 8) | rx_frame.data.u8[3];
|
||||||
|
@ -225,27 +225,27 @@ void SmaBydHInverter::transmit_can(unsigned long currentMillis) {
|
||||||
if (datalayer.system.status.inverter_allows_contactor_closing) {
|
if (datalayer.system.status.inverter_allows_contactor_closing) {
|
||||||
if (currentMillis - previousMillis100ms >= 100) {
|
if (currentMillis - previousMillis100ms >= 100) {
|
||||||
previousMillis100ms = currentMillis;
|
previousMillis100ms = currentMillis;
|
||||||
transmit_can_frame(&SMA_158, can_config.inverter);
|
transmit_can_frame(&SMA_158);
|
||||||
transmit_can_frame(&SMA_358, can_config.inverter);
|
transmit_can_frame(&SMA_358);
|
||||||
transmit_can_frame(&SMA_3D8, can_config.inverter);
|
transmit_can_frame(&SMA_3D8);
|
||||||
transmit_can_frame(&SMA_458, can_config.inverter);
|
transmit_can_frame(&SMA_458);
|
||||||
transmit_can_frame(&SMA_518, can_config.inverter);
|
transmit_can_frame(&SMA_518);
|
||||||
transmit_can_frame(&SMA_4D8, can_config.inverter);
|
transmit_can_frame(&SMA_4D8);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SmaBydHInverter::transmit_can_init() {
|
void SmaBydHInverter::transmit_can_init() {
|
||||||
transmit_can_frame(&SMA_558, can_config.inverter);
|
transmit_can_frame(&SMA_558);
|
||||||
transmit_can_frame(&SMA_598, can_config.inverter);
|
transmit_can_frame(&SMA_598);
|
||||||
transmit_can_frame(&SMA_5D8, can_config.inverter);
|
transmit_can_frame(&SMA_5D8);
|
||||||
transmit_can_frame(&SMA_618_1, can_config.inverter);
|
transmit_can_frame(&SMA_618_1);
|
||||||
transmit_can_frame(&SMA_618_2, can_config.inverter);
|
transmit_can_frame(&SMA_618_2);
|
||||||
transmit_can_frame(&SMA_618_3, can_config.inverter);
|
transmit_can_frame(&SMA_618_3);
|
||||||
transmit_can_frame(&SMA_158, can_config.inverter);
|
transmit_can_frame(&SMA_158);
|
||||||
transmit_can_frame(&SMA_358, can_config.inverter);
|
transmit_can_frame(&SMA_358);
|
||||||
transmit_can_frame(&SMA_3D8, can_config.inverter);
|
transmit_can_frame(&SMA_3D8);
|
||||||
transmit_can_frame(&SMA_458, can_config.inverter);
|
transmit_can_frame(&SMA_458);
|
||||||
transmit_can_frame(&SMA_518, can_config.inverter);
|
transmit_can_frame(&SMA_518);
|
||||||
transmit_can_frame(&SMA_4D8, can_config.inverter);
|
transmit_can_frame(&SMA_4D8);
|
||||||
}
|
}
|
||||||
|
|
|
@ -221,24 +221,24 @@ void SmaBydHvsInverter::transmit_can(unsigned long currentMillis) {
|
||||||
// Send a subset of messages per iteration to avoid overloading the CAN bus / transmit buffer
|
// Send a subset of messages per iteration to avoid overloading the CAN bus / transmit buffer
|
||||||
switch (batch_send_index) {
|
switch (batch_send_index) {
|
||||||
case 0:
|
case 0:
|
||||||
transmit_can_frame(&SMA_558, can_config.inverter);
|
transmit_can_frame(&SMA_558);
|
||||||
transmit_can_frame(&SMA_598, can_config.inverter);
|
transmit_can_frame(&SMA_598);
|
||||||
transmit_can_frame(&SMA_5D8, can_config.inverter);
|
transmit_can_frame(&SMA_5D8);
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
transmit_can_frame(&SMA_618_1, can_config.inverter);
|
transmit_can_frame(&SMA_618_1);
|
||||||
transmit_can_frame(&SMA_618_2, can_config.inverter);
|
transmit_can_frame(&SMA_618_2);
|
||||||
transmit_can_frame(&SMA_618_3, can_config.inverter);
|
transmit_can_frame(&SMA_618_3);
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
transmit_can_frame(&SMA_158, can_config.inverter);
|
transmit_can_frame(&SMA_158);
|
||||||
transmit_can_frame(&SMA_358, can_config.inverter);
|
transmit_can_frame(&SMA_358);
|
||||||
transmit_can_frame(&SMA_3D8, can_config.inverter);
|
transmit_can_frame(&SMA_3D8);
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
transmit_can_frame(&SMA_458, can_config.inverter);
|
transmit_can_frame(&SMA_458);
|
||||||
transmit_can_frame(&SMA_518, can_config.inverter);
|
transmit_can_frame(&SMA_518);
|
||||||
transmit_can_frame(&SMA_4D8, can_config.inverter);
|
transmit_can_frame(&SMA_4D8);
|
||||||
transmit_can_init = false;
|
transmit_can_init = false;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -258,12 +258,12 @@ void SmaBydHvsInverter::transmit_can(unsigned long currentMillis) {
|
||||||
if (datalayer.system.status.inverter_allows_contactor_closing) {
|
if (datalayer.system.status.inverter_allows_contactor_closing) {
|
||||||
if (currentMillis - previousMillis100ms >= 100) {
|
if (currentMillis - previousMillis100ms >= 100) {
|
||||||
previousMillis100ms = currentMillis;
|
previousMillis100ms = currentMillis;
|
||||||
transmit_can_frame(&SMA_158, can_config.inverter);
|
transmit_can_frame(&SMA_158);
|
||||||
transmit_can_frame(&SMA_358, can_config.inverter);
|
transmit_can_frame(&SMA_358);
|
||||||
transmit_can_frame(&SMA_3D8, can_config.inverter);
|
transmit_can_frame(&SMA_3D8);
|
||||||
transmit_can_frame(&SMA_458, can_config.inverter);
|
transmit_can_frame(&SMA_458);
|
||||||
transmit_can_frame(&SMA_518, can_config.inverter);
|
transmit_can_frame(&SMA_518);
|
||||||
transmit_can_frame(&SMA_4D8, can_config.inverter);
|
transmit_can_frame(&SMA_4D8);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -91,17 +91,17 @@ void SmaLvInverter::transmit_can(unsigned long currentMillis) {
|
||||||
if (currentMillis - previousMillis100ms >= INTERVAL_100_MS) {
|
if (currentMillis - previousMillis100ms >= INTERVAL_100_MS) {
|
||||||
previousMillis100ms = currentMillis;
|
previousMillis100ms = currentMillis;
|
||||||
|
|
||||||
transmit_can_frame(&SMA_351, can_config.inverter);
|
transmit_can_frame(&SMA_351);
|
||||||
transmit_can_frame(&SMA_355, can_config.inverter);
|
transmit_can_frame(&SMA_355);
|
||||||
transmit_can_frame(&SMA_356, can_config.inverter);
|
transmit_can_frame(&SMA_356);
|
||||||
transmit_can_frame(&SMA_35A, can_config.inverter);
|
transmit_can_frame(&SMA_35A);
|
||||||
transmit_can_frame(&SMA_35B, can_config.inverter);
|
transmit_can_frame(&SMA_35B);
|
||||||
transmit_can_frame(&SMA_35E, can_config.inverter);
|
transmit_can_frame(&SMA_35E);
|
||||||
transmit_can_frame(&SMA_35F, can_config.inverter);
|
transmit_can_frame(&SMA_35F);
|
||||||
|
|
||||||
//Remote quick stop (optional)
|
//Remote quick stop (optional)
|
||||||
if (datalayer.battery.status.bms_status == FAULT) {
|
if (datalayer.battery.status.bms_status == FAULT) {
|
||||||
transmit_can_frame(&SMA_00F, can_config.inverter);
|
transmit_can_frame(&SMA_00F);
|
||||||
//After receiving this message, Sunny Island will immediately go into standby.
|
//After receiving this message, Sunny Island will immediately go into standby.
|
||||||
//Please send start command, to start again. Manual start is also possible.
|
//Please send start command, to start again. Manual start is also possible.
|
||||||
}
|
}
|
||||||
|
|
|
@ -137,7 +137,7 @@ void SmaTripowerInverter::transmit_can(unsigned long currentMillis) {
|
||||||
previousMillis250ms = currentMillis;
|
previousMillis250ms = currentMillis;
|
||||||
// Send next frame.
|
// Send next frame.
|
||||||
Frame frame = framesToSend[0];
|
Frame frame = framesToSend[0];
|
||||||
transmit_can_frame(frame.frame, can_config.inverter);
|
transmit_can_frame(frame.frame);
|
||||||
frame.callback();
|
frame.callback();
|
||||||
for (int i = 0; i < listLength - 1; i++) {
|
for (int i = 0; i < listLength - 1; i++) {
|
||||||
framesToSend[i] = framesToSend[i + 1];
|
framesToSend[i] = framesToSend[i + 1];
|
||||||
|
|
|
@ -79,16 +79,16 @@ void SofarInverter::map_can_frame_to_variable(CAN_frame rx_frame) {
|
||||||
datalayer.system.status.CAN_inverter_still_alive = CAN_STILL_ALIVE;
|
datalayer.system.status.CAN_inverter_still_alive = CAN_STILL_ALIVE;
|
||||||
switch (rx_frame.data.u8[0]) {
|
switch (rx_frame.data.u8[0]) {
|
||||||
case 0x00:
|
case 0x00:
|
||||||
transmit_can_frame(&SOFAR_683, can_config.inverter);
|
transmit_can_frame(&SOFAR_683);
|
||||||
break;
|
break;
|
||||||
case 0x01:
|
case 0x01:
|
||||||
transmit_can_frame(&SOFAR_684, can_config.inverter);
|
transmit_can_frame(&SOFAR_684);
|
||||||
break;
|
break;
|
||||||
case 0x02:
|
case 0x02:
|
||||||
transmit_can_frame(&SOFAR_685, can_config.inverter);
|
transmit_can_frame(&SOFAR_685);
|
||||||
break;
|
break;
|
||||||
case 0x03:
|
case 0x03:
|
||||||
transmit_can_frame(&SOFAR_690, can_config.inverter);
|
transmit_can_frame(&SOFAR_690);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -104,14 +104,14 @@ void SofarInverter::transmit_can(unsigned long currentMillis) {
|
||||||
if (currentMillis - previousMillis100 >= INTERVAL_100_MS) {
|
if (currentMillis - previousMillis100 >= INTERVAL_100_MS) {
|
||||||
previousMillis100 = currentMillis;
|
previousMillis100 = currentMillis;
|
||||||
//Frames actively reported by BMS
|
//Frames actively reported by BMS
|
||||||
transmit_can_frame(&SOFAR_351, can_config.inverter);
|
transmit_can_frame(&SOFAR_351);
|
||||||
transmit_can_frame(&SOFAR_355, can_config.inverter);
|
transmit_can_frame(&SOFAR_355);
|
||||||
transmit_can_frame(&SOFAR_356, can_config.inverter);
|
transmit_can_frame(&SOFAR_356);
|
||||||
transmit_can_frame(&SOFAR_30F, can_config.inverter);
|
transmit_can_frame(&SOFAR_30F);
|
||||||
transmit_can_frame(&SOFAR_359, can_config.inverter);
|
transmit_can_frame(&SOFAR_359);
|
||||||
transmit_can_frame(&SOFAR_35E, can_config.inverter);
|
transmit_can_frame(&SOFAR_35E);
|
||||||
transmit_can_frame(&SOFAR_35F, can_config.inverter);
|
transmit_can_frame(&SOFAR_35F);
|
||||||
transmit_can_frame(&SOFAR_35A, can_config.inverter);
|
transmit_can_frame(&SOFAR_35A);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -136,17 +136,17 @@ void SolaxInverter::map_can_frame_to_variable(CAN_frame rx_frame) {
|
||||||
datalayer.system.status.inverter_allows_contactor_closing = false;
|
datalayer.system.status.inverter_allows_contactor_closing = false;
|
||||||
SOLAX_1875.data.u8[4] = (0x00); // Inform Inverter: Contactor 0=off, 1=on.
|
SOLAX_1875.data.u8[4] = (0x00); // Inform Inverter: Contactor 0=off, 1=on.
|
||||||
for (uint8_t i = 0; i <= number_of_batteries; i++) {
|
for (uint8_t i = 0; i <= number_of_batteries; i++) {
|
||||||
transmit_can_frame(&SOLAX_187E, can_config.inverter);
|
transmit_can_frame(&SOLAX_187E);
|
||||||
transmit_can_frame(&SOLAX_187A, can_config.inverter);
|
transmit_can_frame(&SOLAX_187A);
|
||||||
transmit_can_frame(&SOLAX_1872, can_config.inverter);
|
transmit_can_frame(&SOLAX_1872);
|
||||||
transmit_can_frame(&SOLAX_1873, can_config.inverter);
|
transmit_can_frame(&SOLAX_1873);
|
||||||
transmit_can_frame(&SOLAX_1874, can_config.inverter);
|
transmit_can_frame(&SOLAX_1874);
|
||||||
transmit_can_frame(&SOLAX_1875, can_config.inverter);
|
transmit_can_frame(&SOLAX_1875);
|
||||||
transmit_can_frame(&SOLAX_1876, can_config.inverter);
|
transmit_can_frame(&SOLAX_1876);
|
||||||
transmit_can_frame(&SOLAX_1877, can_config.inverter);
|
transmit_can_frame(&SOLAX_1877);
|
||||||
transmit_can_frame(&SOLAX_1878, can_config.inverter);
|
transmit_can_frame(&SOLAX_1878);
|
||||||
}
|
}
|
||||||
transmit_can_frame(&SOLAX_100A001, can_config.inverter); //BMS Announce
|
transmit_can_frame(&SOLAX_100A001); //BMS Announce
|
||||||
// Message from the inverter to proceed to contactor closing
|
// Message from the inverter to proceed to contactor closing
|
||||||
// Byte 4 changes from 0 to 1
|
// Byte 4 changes from 0 to 1
|
||||||
if (rx_frame.data.u64 == Contactor_Close_Payload)
|
if (rx_frame.data.u64 == Contactor_Close_Payload)
|
||||||
|
@ -155,16 +155,16 @@ void SolaxInverter::map_can_frame_to_variable(CAN_frame rx_frame) {
|
||||||
|
|
||||||
case (WAITING_FOR_CONTACTOR):
|
case (WAITING_FOR_CONTACTOR):
|
||||||
SOLAX_1875.data.u8[4] = (0x00); // Inform Inverter: Contactor 0=off, 1=on.
|
SOLAX_1875.data.u8[4] = (0x00); // Inform Inverter: Contactor 0=off, 1=on.
|
||||||
transmit_can_frame(&SOLAX_187E, can_config.inverter);
|
transmit_can_frame(&SOLAX_187E);
|
||||||
transmit_can_frame(&SOLAX_187A, can_config.inverter);
|
transmit_can_frame(&SOLAX_187A);
|
||||||
transmit_can_frame(&SOLAX_1872, can_config.inverter);
|
transmit_can_frame(&SOLAX_1872);
|
||||||
transmit_can_frame(&SOLAX_1873, can_config.inverter);
|
transmit_can_frame(&SOLAX_1873);
|
||||||
transmit_can_frame(&SOLAX_1874, can_config.inverter);
|
transmit_can_frame(&SOLAX_1874);
|
||||||
transmit_can_frame(&SOLAX_1875, can_config.inverter);
|
transmit_can_frame(&SOLAX_1875);
|
||||||
transmit_can_frame(&SOLAX_1876, can_config.inverter);
|
transmit_can_frame(&SOLAX_1876);
|
||||||
transmit_can_frame(&SOLAX_1877, can_config.inverter);
|
transmit_can_frame(&SOLAX_1877);
|
||||||
transmit_can_frame(&SOLAX_1878, can_config.inverter);
|
transmit_can_frame(&SOLAX_1878);
|
||||||
transmit_can_frame(&SOLAX_1801, can_config.inverter); // Announce that the battery will be connected
|
transmit_can_frame(&SOLAX_1801); // Announce that the battery will be connected
|
||||||
STATE = CONTACTOR_CLOSED; // Jump to Contactor Closed State
|
STATE = CONTACTOR_CLOSED; // Jump to Contactor Closed State
|
||||||
#ifdef DEBUG_LOG
|
#ifdef DEBUG_LOG
|
||||||
logging.println("Solax Battery State: Contactor Closed");
|
logging.println("Solax Battery State: Contactor Closed");
|
||||||
|
@ -174,15 +174,15 @@ void SolaxInverter::map_can_frame_to_variable(CAN_frame rx_frame) {
|
||||||
case (CONTACTOR_CLOSED):
|
case (CONTACTOR_CLOSED):
|
||||||
datalayer.system.status.inverter_allows_contactor_closing = true;
|
datalayer.system.status.inverter_allows_contactor_closing = true;
|
||||||
SOLAX_1875.data.u8[4] = (0x01); // Inform Inverter: Contactor 0=off, 1=on.
|
SOLAX_1875.data.u8[4] = (0x01); // Inform Inverter: Contactor 0=off, 1=on.
|
||||||
transmit_can_frame(&SOLAX_187E, can_config.inverter);
|
transmit_can_frame(&SOLAX_187E);
|
||||||
transmit_can_frame(&SOLAX_187A, can_config.inverter);
|
transmit_can_frame(&SOLAX_187A);
|
||||||
transmit_can_frame(&SOLAX_1872, can_config.inverter);
|
transmit_can_frame(&SOLAX_1872);
|
||||||
transmit_can_frame(&SOLAX_1873, can_config.inverter);
|
transmit_can_frame(&SOLAX_1873);
|
||||||
transmit_can_frame(&SOLAX_1874, can_config.inverter);
|
transmit_can_frame(&SOLAX_1874);
|
||||||
transmit_can_frame(&SOLAX_1875, can_config.inverter);
|
transmit_can_frame(&SOLAX_1875);
|
||||||
transmit_can_frame(&SOLAX_1876, can_config.inverter);
|
transmit_can_frame(&SOLAX_1876);
|
||||||
transmit_can_frame(&SOLAX_1877, can_config.inverter);
|
transmit_can_frame(&SOLAX_1877);
|
||||||
transmit_can_frame(&SOLAX_1878, can_config.inverter);
|
transmit_can_frame(&SOLAX_1878);
|
||||||
// Message from the inverter to open contactor
|
// Message from the inverter to open contactor
|
||||||
// Byte 4 changes from 1 to 0
|
// Byte 4 changes from 1 to 0
|
||||||
if (rx_frame.data.u64 == Contactor_Open_Payload) {
|
if (rx_frame.data.u64 == Contactor_Open_Payload) {
|
||||||
|
@ -194,8 +194,8 @@ void SolaxInverter::map_can_frame_to_variable(CAN_frame rx_frame) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rx_frame.ID == 0x1871 && rx_frame.data.u64 == __builtin_bswap64(0x0500010000000000)) {
|
if (rx_frame.ID == 0x1871 && rx_frame.data.u64 == __builtin_bswap64(0x0500010000000000)) {
|
||||||
transmit_can_frame(&SOLAX_1881, can_config.inverter);
|
transmit_can_frame(&SOLAX_1881);
|
||||||
transmit_can_frame(&SOLAX_1882, can_config.inverter);
|
transmit_can_frame(&SOLAX_1882);
|
||||||
#ifdef DEBUG_LOG
|
#ifdef DEBUG_LOG
|
||||||
logging.println("1871 05-frame received from inverter");
|
logging.println("1871 05-frame received from inverter");
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -319,38 +319,38 @@ void SolxpowInverter::transmit_can(unsigned long currentMillis) {
|
||||||
|
|
||||||
void SolxpowInverter::send_setup_info() { //Ensemble information
|
void SolxpowInverter::send_setup_info() { //Ensemble information
|
||||||
#ifdef SEND_0
|
#ifdef SEND_0
|
||||||
transmit_can_frame(&SOLXPOW_7310, can_config.inverter);
|
transmit_can_frame(&SOLXPOW_7310);
|
||||||
transmit_can_frame(&SOLXPOW_7320, can_config.inverter);
|
transmit_can_frame(&SOLXPOW_7320);
|
||||||
transmit_can_frame(&SOLXPOW_7330, can_config.inverter);
|
transmit_can_frame(&SOLXPOW_7330);
|
||||||
transmit_can_frame(&SOLXPOW_7340, can_config.inverter);
|
transmit_can_frame(&SOLXPOW_7340);
|
||||||
#endif
|
#endif
|
||||||
#ifdef SEND_1
|
#ifdef SEND_1
|
||||||
transmit_can_frame(&SOLXPOW_7311, can_config.inverter);
|
transmit_can_frame(&SOLXPOW_7311);
|
||||||
transmit_can_frame(&SOLXPOW_7321, can_config.inverter);
|
transmit_can_frame(&SOLXPOW_7321);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void SolxpowInverter::send_system_data() { //System equipment information
|
void SolxpowInverter::send_system_data() { //System equipment information
|
||||||
#ifdef SEND_0
|
#ifdef SEND_0
|
||||||
transmit_can_frame(&SOLXPOW_4210, can_config.inverter);
|
transmit_can_frame(&SOLXPOW_4210);
|
||||||
transmit_can_frame(&SOLXPOW_4220, can_config.inverter);
|
transmit_can_frame(&SOLXPOW_4220);
|
||||||
transmit_can_frame(&SOLXPOW_4230, can_config.inverter);
|
transmit_can_frame(&SOLXPOW_4230);
|
||||||
transmit_can_frame(&SOLXPOW_4240, can_config.inverter);
|
transmit_can_frame(&SOLXPOW_4240);
|
||||||
transmit_can_frame(&SOLXPOW_4250, can_config.inverter);
|
transmit_can_frame(&SOLXPOW_4250);
|
||||||
transmit_can_frame(&SOLXPOW_4260, can_config.inverter);
|
transmit_can_frame(&SOLXPOW_4260);
|
||||||
transmit_can_frame(&SOLXPOW_4270, can_config.inverter);
|
transmit_can_frame(&SOLXPOW_4270);
|
||||||
transmit_can_frame(&SOLXPOW_4280, can_config.inverter);
|
transmit_can_frame(&SOLXPOW_4280);
|
||||||
transmit_can_frame(&SOLXPOW_4290, can_config.inverter);
|
transmit_can_frame(&SOLXPOW_4290);
|
||||||
#endif
|
#endif
|
||||||
#ifdef SEND_1
|
#ifdef SEND_1
|
||||||
transmit_can_frame(&SOLXPOW_4211, can_config.inverter);
|
transmit_can_frame(&SOLXPOW_4211);
|
||||||
transmit_can_frame(&SOLXPOW_4221, can_config.inverter);
|
transmit_can_frame(&SOLXPOW_4221);
|
||||||
transmit_can_frame(&SOLXPOW_4231, can_config.inverter);
|
transmit_can_frame(&SOLXPOW_4231);
|
||||||
transmit_can_frame(&SOLXPOW_4241, can_config.inverter);
|
transmit_can_frame(&SOLXPOW_4241);
|
||||||
transmit_can_frame(&SOLXPOW_4251, can_config.inverter);
|
transmit_can_frame(&SOLXPOW_4251);
|
||||||
transmit_can_frame(&SOLXPOW_4261, can_config.inverter);
|
transmit_can_frame(&SOLXPOW_4261);
|
||||||
transmit_can_frame(&SOLXPOW_4271, can_config.inverter);
|
transmit_can_frame(&SOLXPOW_4271);
|
||||||
transmit_can_frame(&SOLXPOW_4281, can_config.inverter);
|
transmit_can_frame(&SOLXPOW_4281);
|
||||||
transmit_can_frame(&SOLXPOW_4291, can_config.inverter);
|
transmit_can_frame(&SOLXPOW_4291);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
@ -171,24 +171,24 @@ void SungrowInverter::map_can_frame_to_variable(CAN_frame rx_frame) {
|
||||||
case 0x000:
|
case 0x000:
|
||||||
datalayer.system.status.CAN_inverter_still_alive = CAN_STILL_ALIVE;
|
datalayer.system.status.CAN_inverter_still_alive = CAN_STILL_ALIVE;
|
||||||
inverter_sends_000 = true;
|
inverter_sends_000 = true;
|
||||||
transmit_can_frame(&SUNGROW_001, can_config.inverter);
|
transmit_can_frame(&SUNGROW_001);
|
||||||
transmit_can_frame(&SUNGROW_002, can_config.inverter);
|
transmit_can_frame(&SUNGROW_002);
|
||||||
transmit_can_frame(&SUNGROW_003, can_config.inverter);
|
transmit_can_frame(&SUNGROW_003);
|
||||||
transmit_can_frame(&SUNGROW_004, can_config.inverter);
|
transmit_can_frame(&SUNGROW_004);
|
||||||
transmit_can_frame(&SUNGROW_005, can_config.inverter);
|
transmit_can_frame(&SUNGROW_005);
|
||||||
transmit_can_frame(&SUNGROW_006, can_config.inverter);
|
transmit_can_frame(&SUNGROW_006);
|
||||||
transmit_can_frame(&SUNGROW_013, can_config.inverter);
|
transmit_can_frame(&SUNGROW_013);
|
||||||
transmit_can_frame(&SUNGROW_014, can_config.inverter);
|
transmit_can_frame(&SUNGROW_014);
|
||||||
transmit_can_frame(&SUNGROW_015, can_config.inverter);
|
transmit_can_frame(&SUNGROW_015);
|
||||||
transmit_can_frame(&SUNGROW_016, can_config.inverter);
|
transmit_can_frame(&SUNGROW_016);
|
||||||
transmit_can_frame(&SUNGROW_017, can_config.inverter);
|
transmit_can_frame(&SUNGROW_017);
|
||||||
transmit_can_frame(&SUNGROW_018, can_config.inverter);
|
transmit_can_frame(&SUNGROW_018);
|
||||||
transmit_can_frame(&SUNGROW_019, can_config.inverter);
|
transmit_can_frame(&SUNGROW_019);
|
||||||
transmit_can_frame(&SUNGROW_01A, can_config.inverter);
|
transmit_can_frame(&SUNGROW_01A);
|
||||||
transmit_can_frame(&SUNGROW_01B, can_config.inverter);
|
transmit_can_frame(&SUNGROW_01B);
|
||||||
transmit_can_frame(&SUNGROW_01C, can_config.inverter);
|
transmit_can_frame(&SUNGROW_01C);
|
||||||
transmit_can_frame(&SUNGROW_01D, can_config.inverter);
|
transmit_can_frame(&SUNGROW_01D);
|
||||||
transmit_can_frame(&SUNGROW_01E, can_config.inverter);
|
transmit_can_frame(&SUNGROW_01E);
|
||||||
break;
|
break;
|
||||||
case 0x100: // SH10RS RUN
|
case 0x100: // SH10RS RUN
|
||||||
datalayer.system.status.CAN_inverter_still_alive = CAN_STILL_ALIVE;
|
datalayer.system.status.CAN_inverter_still_alive = CAN_STILL_ALIVE;
|
||||||
|
@ -318,36 +318,36 @@ void SungrowInverter::transmit_can(unsigned long currentMillis) {
|
||||||
previousMillis500ms = currentMillis;
|
previousMillis500ms = currentMillis;
|
||||||
//Flip flop between two sets, end result is 1s periodic rate
|
//Flip flop between two sets, end result is 1s periodic rate
|
||||||
if (alternate) {
|
if (alternate) {
|
||||||
transmit_can_frame(&SUNGROW_512, can_config.inverter);
|
transmit_can_frame(&SUNGROW_512);
|
||||||
transmit_can_frame(&SUNGROW_501, can_config.inverter);
|
transmit_can_frame(&SUNGROW_501);
|
||||||
transmit_can_frame(&SUNGROW_502, can_config.inverter);
|
transmit_can_frame(&SUNGROW_502);
|
||||||
transmit_can_frame(&SUNGROW_503, can_config.inverter);
|
transmit_can_frame(&SUNGROW_503);
|
||||||
transmit_can_frame(&SUNGROW_504, can_config.inverter);
|
transmit_can_frame(&SUNGROW_504);
|
||||||
transmit_can_frame(&SUNGROW_505, can_config.inverter);
|
transmit_can_frame(&SUNGROW_505);
|
||||||
transmit_can_frame(&SUNGROW_506, can_config.inverter);
|
transmit_can_frame(&SUNGROW_506);
|
||||||
transmit_can_frame(&SUNGROW_500, can_config.inverter);
|
transmit_can_frame(&SUNGROW_500);
|
||||||
transmit_can_frame(&SUNGROW_400, can_config.inverter);
|
transmit_can_frame(&SUNGROW_400);
|
||||||
alternate = false;
|
alternate = false;
|
||||||
} else {
|
} else {
|
||||||
transmit_can_frame(&SUNGROW_700, can_config.inverter);
|
transmit_can_frame(&SUNGROW_700);
|
||||||
transmit_can_frame(&SUNGROW_701, can_config.inverter);
|
transmit_can_frame(&SUNGROW_701);
|
||||||
transmit_can_frame(&SUNGROW_702, can_config.inverter);
|
transmit_can_frame(&SUNGROW_702);
|
||||||
transmit_can_frame(&SUNGROW_703, can_config.inverter);
|
transmit_can_frame(&SUNGROW_703);
|
||||||
transmit_can_frame(&SUNGROW_704, can_config.inverter);
|
transmit_can_frame(&SUNGROW_704);
|
||||||
transmit_can_frame(&SUNGROW_705, can_config.inverter);
|
transmit_can_frame(&SUNGROW_705);
|
||||||
transmit_can_frame(&SUNGROW_706, can_config.inverter);
|
transmit_can_frame(&SUNGROW_706);
|
||||||
transmit_can_frame(&SUNGROW_713, can_config.inverter);
|
transmit_can_frame(&SUNGROW_713);
|
||||||
transmit_can_frame(&SUNGROW_714, can_config.inverter);
|
transmit_can_frame(&SUNGROW_714);
|
||||||
transmit_can_frame(&SUNGROW_715, can_config.inverter);
|
transmit_can_frame(&SUNGROW_715);
|
||||||
transmit_can_frame(&SUNGROW_716, can_config.inverter);
|
transmit_can_frame(&SUNGROW_716);
|
||||||
transmit_can_frame(&SUNGROW_717, can_config.inverter);
|
transmit_can_frame(&SUNGROW_717);
|
||||||
transmit_can_frame(&SUNGROW_718, can_config.inverter);
|
transmit_can_frame(&SUNGROW_718);
|
||||||
transmit_can_frame(&SUNGROW_719, can_config.inverter);
|
transmit_can_frame(&SUNGROW_719);
|
||||||
transmit_can_frame(&SUNGROW_71A, can_config.inverter);
|
transmit_can_frame(&SUNGROW_71A);
|
||||||
transmit_can_frame(&SUNGROW_71B, can_config.inverter);
|
transmit_can_frame(&SUNGROW_71B);
|
||||||
transmit_can_frame(&SUNGROW_71C, can_config.inverter);
|
transmit_can_frame(&SUNGROW_71C);
|
||||||
transmit_can_frame(&SUNGROW_71D, can_config.inverter);
|
transmit_can_frame(&SUNGROW_71D);
|
||||||
transmit_can_frame(&SUNGROW_71E, can_config.inverter);
|
transmit_can_frame(&SUNGROW_71E);
|
||||||
alternate = true;
|
alternate = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue