mirror of
https://github.com/dalathegreat/Battery-Emulator.git
synced 2025-10-05 10:49:42 +02:00
Split up pairing sending into batches
This commit is contained in:
parent
8de143d72a
commit
f488cceeab
2 changed files with 49 additions and 26 deletions
|
@ -153,15 +153,6 @@ void SmaBydHvsInverter::map_can_frame_to_variable(CAN_frame rx_frame) {
|
||||||
break;
|
break;
|
||||||
case 0x420: //Message originating from SMA inverter - Timestamp
|
case 0x420: //Message originating from SMA inverter - Timestamp
|
||||||
datalayer.system.status.CAN_inverter_still_alive = CAN_STILL_ALIVE;
|
datalayer.system.status.CAN_inverter_still_alive = CAN_STILL_ALIVE;
|
||||||
//Frame0-3 Timestamp
|
|
||||||
/*
|
|
||||||
transmit_can_frame(&SMA_158, can_config.inverter);
|
|
||||||
transmit_can_frame(&SMA_358, can_config.inverter);
|
|
||||||
transmit_can_frame(&SMA_3D8, can_config.inverter);
|
|
||||||
transmit_can_frame(&SMA_458, can_config.inverter);
|
|
||||||
transmit_can_frame(&SMA_518, can_config.inverter);
|
|
||||||
transmit_can_frame(&SMA_4D8, can_config.inverter);
|
|
||||||
*/
|
|
||||||
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];
|
||||||
break;
|
break;
|
||||||
|
@ -216,7 +207,7 @@ void SmaBydHvsInverter::map_can_frame_to_variable(CAN_frame rx_frame) {
|
||||||
logging.println("Received 0x5E7: SMA pairing request");
|
logging.println("Received 0x5E7: SMA pairing request");
|
||||||
#endif // DEBUG_LOG
|
#endif // DEBUG_LOG
|
||||||
datalayer.system.status.CAN_inverter_still_alive = CAN_STILL_ALIVE;
|
datalayer.system.status.CAN_inverter_still_alive = CAN_STILL_ALIVE;
|
||||||
transmit_can_init();
|
transmit_can_init = true;
|
||||||
break;
|
break;
|
||||||
case 0x62C:
|
case 0x62C:
|
||||||
datalayer.system.status.CAN_inverter_still_alive = CAN_STILL_ALIVE;
|
datalayer.system.status.CAN_inverter_still_alive = CAN_STILL_ALIVE;
|
||||||
|
@ -227,6 +218,49 @@ void SmaBydHvsInverter::map_can_frame_to_variable(CAN_frame rx_frame) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void SmaBydHvsInverter::transmit_can(unsigned long currentMillis) {
|
void SmaBydHvsInverter::transmit_can(unsigned long currentMillis) {
|
||||||
|
|
||||||
|
if (transmit_can_init) {
|
||||||
|
|
||||||
|
// Check if enough time has passed since the last batch
|
||||||
|
if (currentMillis - previousMillisBatch >= delay_between_batches_ms) {
|
||||||
|
previousMillisBatch = currentMillis; // Update the time of the last message batch
|
||||||
|
|
||||||
|
// Send a subset of messages per iteration to avoid overloading the CAN bus / transmit buffer
|
||||||
|
switch (batch_send_index) {
|
||||||
|
case 0:
|
||||||
|
transmit_can_frame(&SMA_558, can_config.inverter);
|
||||||
|
transmit_can_frame(&SMA_598, can_config.inverter);
|
||||||
|
transmit_can_frame(&SMA_5D8, can_config.inverter);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
transmit_can_frame(&SMA_618_1, can_config.inverter);
|
||||||
|
transmit_can_frame(&SMA_618_2, can_config.inverter);
|
||||||
|
transmit_can_frame(&SMA_618_3, can_config.inverter);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
transmit_can_frame(&SMA_158, can_config.inverter);
|
||||||
|
transmit_can_frame(&SMA_358, can_config.inverter);
|
||||||
|
transmit_can_frame(&SMA_3D8, can_config.inverter);
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
transmit_can_frame(&SMA_458, can_config.inverter);
|
||||||
|
transmit_can_frame(&SMA_518, can_config.inverter);
|
||||||
|
transmit_can_frame(&SMA_4D8, can_config.inverter);
|
||||||
|
transmit_can_init = false;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Increment message index and wrap around if needed
|
||||||
|
batch_send_index++;
|
||||||
|
|
||||||
|
if (transmit_can_init == false) {
|
||||||
|
batch_send_index = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Send CAN Message every 100ms if inverter allows contactor closing
|
// Send CAN Message every 100ms if inverter allows contactor closing
|
||||||
if (datalayer.system.status.inverter_allows_contactor_closing) {
|
if (datalayer.system.status.inverter_allows_contactor_closing) {
|
||||||
if (currentMillis - previousMillis100ms >= 100) {
|
if (currentMillis - previousMillis100ms >= 100) {
|
||||||
|
@ -241,21 +275,6 @@ void SmaBydHvsInverter::transmit_can(unsigned long currentMillis) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SmaBydHvsInverter::transmit_can_init() {
|
|
||||||
transmit_can_frame(&SMA_558, can_config.inverter);
|
|
||||||
transmit_can_frame(&SMA_598, can_config.inverter);
|
|
||||||
transmit_can_frame(&SMA_5D8, can_config.inverter);
|
|
||||||
transmit_can_frame(&SMA_618_1, can_config.inverter);
|
|
||||||
transmit_can_frame(&SMA_618_2, can_config.inverter);
|
|
||||||
transmit_can_frame(&SMA_618_3, can_config.inverter);
|
|
||||||
transmit_can_frame(&SMA_158, can_config.inverter);
|
|
||||||
transmit_can_frame(&SMA_358, can_config.inverter);
|
|
||||||
transmit_can_frame(&SMA_3D8, can_config.inverter);
|
|
||||||
transmit_can_frame(&SMA_458, can_config.inverter);
|
|
||||||
transmit_can_frame(&SMA_518, can_config.inverter);
|
|
||||||
transmit_can_frame(&SMA_4D8, can_config.inverter);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SmaBydHvsInverter::setup(void) { // Performs one time setup at startup over CAN bus
|
void SmaBydHvsInverter::setup(void) { // Performs one time setup at startup over CAN bus
|
||||||
strncpy(datalayer.system.info.inverter_protocol, "BYD Battery-Box HVS over SMA CAN", 63);
|
strncpy(datalayer.system.info.inverter_protocol, "BYD Battery-Box HVS over SMA CAN", 63);
|
||||||
datalayer.system.info.inverter_protocol[63] = '\0';
|
datalayer.system.info.inverter_protocol[63] = '\0';
|
||||||
|
|
|
@ -21,8 +21,12 @@ class SmaBydHvsInverter : public CanInverterProtocol {
|
||||||
static const int STOP_STATE = 0x02;
|
static const int STOP_STATE = 0x02;
|
||||||
static const int THIRTY_MINUTES = 1200;
|
static const int THIRTY_MINUTES = 1200;
|
||||||
|
|
||||||
void transmit_can_init();
|
|
||||||
unsigned long previousMillis100ms = 0;
|
unsigned long previousMillis100ms = 0;
|
||||||
|
unsigned long previousMillisBatch = 0;
|
||||||
|
uint8_t batch_send_index = 0;
|
||||||
|
const uint8_t delay_between_batches_ms =
|
||||||
|
7; //TODO, tweak to as low as possible before performance issues/crashes appear
|
||||||
|
bool transmit_can_init = false;
|
||||||
|
|
||||||
uint32_t inverter_time = 0;
|
uint32_t inverter_time = 0;
|
||||||
uint16_t inverter_voltage = 0;
|
uint16_t inverter_voltage = 0;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue