Add GBT_ApplyShortPacket function for immediate processing of single-frame messages from EVSE to EV. Refactor GBT_Init and GBT_ChargerTask for improved readability and functionality. Update connector initialization to set default requested limits and SOC for both connectors. Enhance logging for load enable changes.
This commit is contained in:
+92
-72
@@ -64,11 +64,95 @@ static uint32_t GBT_EVSE_last_rx_tick;
|
||||
#define GBT_EV_HANDSHAKE_TIMEOUT_MS 10000U
|
||||
#define GBT_EV_WAIT_READY_TIMEOUT_MS 10000U
|
||||
#define GBT_EV_CHARGING_RX_TIMEOUT_MS 3000U
|
||||
#define GBT_EV_ENABLE_LOAD_DELAY_MS 10000U
|
||||
|
||||
static void GBT_HandleEvseRxPacket(const j_receive_t *rx){
|
||||
GBT_EVSE_last_rx_tick = HAL_GetTick();
|
||||
switch (rx->PGN){
|
||||
case 0x2600: // CHM EVSE->EV (старт/версия GB/T)
|
||||
GBT_CHM_recv = 1;
|
||||
break;
|
||||
|
||||
case 0x0100: // CRM EVSE->EV (идентификация зарядника, 0x00 или 0xAA)
|
||||
memcpy(&GBT_ChargerInfo, rx->data, sizeof(GBT_ChargerInfo));
|
||||
GBT_CRM_recv = 1;
|
||||
break;
|
||||
|
||||
case 0x0800: // CML EVSE->EV (макс. параметры зарядника)
|
||||
memcpy(&GBT_MaxLoad, rx->data, sizeof(GBT_MaxLoad));
|
||||
GBT_CML_recv = 1;
|
||||
break;
|
||||
|
||||
case 0x0700: // CTS EVSE->EV (time sync)
|
||||
break;
|
||||
|
||||
case 0x0A00: // CRO EVSE->EV (0x00 = инициализация, 0xAA = готов к зарядке)
|
||||
GBT_CRO_val = (rx->data[0] & 0xFF);
|
||||
break;
|
||||
|
||||
case 0x1200: // CCS EVSE->EV (текущий статус зарядника)
|
||||
memcpy(&GBT_ChargerCurrentStatus, rx->data, sizeof(GBT_ChargerCurrentStatus));
|
||||
CONN[0].ChargingTime = GBT_ChargerCurrentStatus.chargingTime;
|
||||
CONN[0].MeasuredVoltageSE = GBT_ChargerCurrentStatus.outputVoltage / 10;
|
||||
CONN[0].MeasuredCurrentSE = 4000 - GBT_ChargerCurrentStatus.outputCurrent;
|
||||
break;
|
||||
|
||||
case 0x1A00: // CST EVSE->EV (остановка зарядки по инициативе EVSE)
|
||||
GBT_CST_recv = 1;
|
||||
break;
|
||||
|
||||
case 0x1D00: // CSD EVSE->EV (финальный отчёт зарядника)
|
||||
memcpy(&GBT_ChargerStop, rx->data, sizeof(GBT_ChargerStop));
|
||||
GBT_CSD_recv = 1;
|
||||
break;
|
||||
|
||||
case 0x1F00: // CEM EVSE->EV (сообщение об ошибке)
|
||||
memcpy(&GBT_ErrorCode, rx->data, sizeof(GBT_ErrorCode));
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void GBT_ApplyShortPacket(uint32_t pgn, const uint8_t *data, uint8_t dlc){
|
||||
j_receive_t rx;
|
||||
memset(&rx, 0, sizeof(rx));
|
||||
rx.PGN = pgn;
|
||||
rx.size = dlc;
|
||||
if(data != NULL){
|
||||
uint8_t n = (dlc > 8U) ? 8U : dlc;
|
||||
memcpy(rx.data, data, n);
|
||||
}
|
||||
GBT_HandleEvseRxPacket(&rx);
|
||||
}
|
||||
|
||||
void GBT_Init(){
|
||||
GBT_State = GBT_DISABLED;
|
||||
CONN[0].connControl = CMD_NONE;
|
||||
cc_enable = 0U;
|
||||
/* BRM defaults are initialized once after boot and kept unchanged. */
|
||||
GBT_EVInfo.version[0] = 2;
|
||||
GBT_EVInfo.version[1] = 0;
|
||||
GBT_EVInfo.version[2] = 0;
|
||||
GBT_EVInfo.batteryType = 1;
|
||||
GBT_EVInfo.batteryCapacity = 700;
|
||||
GBT_EVInfo.batteryVoltage = 3990;
|
||||
memcpy(GBT_EVInfo.batteryVendor, "TEST", 4);
|
||||
GBT_EVInfo.batterySN = 666666;
|
||||
GBT_EVInfo.batteryManuY = 30;
|
||||
GBT_EVInfo.batteryManuM = 2;
|
||||
GBT_EVInfo.batteryManuD = 20;
|
||||
GBT_EVInfo.batteryCycleCount = 666;
|
||||
GBT_EVInfo.ownAuto = 1;
|
||||
GBT_EVInfo.rsvd0 = 0;
|
||||
GBT_BATStat.maxCellVoltage = 320;
|
||||
GBT_BATStat.maxChargingCurrent = 40;
|
||||
GBT_BATStat.totalEnergy = 6;
|
||||
GBT_BATStat.maxChargingVoltage = 500;
|
||||
GBT_BATStat.maxTemp = 70;
|
||||
GBT_BATStat.SOC = CONN[0].SOC;
|
||||
GBT_BATStat.measVoltage = CONN[0].MeasuredVoltage;
|
||||
memcpy(GBT_EVInfo.EVIN, "EDISON_TEST_EVIN_", 17);
|
||||
memcpy(GBT_EVInfo.EV_SW_VER, "1.0.0", 8);
|
||||
GBT_Reset();
|
||||
@@ -80,53 +164,7 @@ void GBT_ChargerTask(){
|
||||
|
||||
//GBT_LockTask();
|
||||
if(j_rx.state == 2){
|
||||
GBT_EVSE_last_rx_tick = HAL_GetTick();
|
||||
switch (j_rx.PGN){
|
||||
case 0x2600: // CHM EVSE->EV (старт/версия GB/T)
|
||||
GBT_CHM_recv = 1;
|
||||
break;
|
||||
|
||||
case 0x0100: // CRM EVSE->EV (идентификация зарядника, 0x00 или 0xAA)
|
||||
memcpy(&GBT_ChargerInfo, j_rx.data, sizeof(GBT_ChargerInfo));
|
||||
GBT_CRM_recv = 1;
|
||||
break;
|
||||
|
||||
case 0x0800: // CML EVSE->EV (макс. параметры зарядника)
|
||||
memcpy(&GBT_MaxLoad, j_rx.data, sizeof(GBT_MaxLoad));
|
||||
GBT_CML_recv = 1;
|
||||
break;
|
||||
|
||||
case 0x0700: // CTS EVSE->EV (time sync)
|
||||
// Пока не используем, но можем сохранить время при необходимости
|
||||
break;
|
||||
|
||||
case 0x0A00: // CRO EVSE->EV (0x00 = инициализация, 0xAA = готов к зарядке)
|
||||
GBT_CRO_val = (j_rx.data[0] & 0xFF);
|
||||
break;
|
||||
|
||||
case 0x1200: // CCS EVSE->EV (текущий статус зарядника)
|
||||
memcpy(&GBT_ChargerCurrentStatus, j_rx.data, sizeof(GBT_ChargerCurrentStatus));
|
||||
if(GBT_State == GBT_EV_CHARGING) {
|
||||
CONN[0].enableLoad = GBT_ChargerCurrentStatus.chargingPermissible;
|
||||
}
|
||||
CONN[0].ChargingTime = GBT_ChargerCurrentStatus.chargingTime;
|
||||
CONN[0].MeasuredVoltageSE = GBT_ChargerCurrentStatus.outputVoltage / 10;
|
||||
CONN[0].MeasuredCurrentSE = 4000 - GBT_ChargerCurrentStatus.outputCurrent;
|
||||
break;
|
||||
|
||||
case 0x1A00: // CST EVSE->EV (остановка зарядки по инициативе EVSE)
|
||||
GBT_CST_recv = 1;
|
||||
break;
|
||||
|
||||
case 0x1D00: // CSD EVSE->EV (финальный отчёт зарядника)
|
||||
memcpy(&GBT_ChargerStop, j_rx.data, sizeof(GBT_ChargerStop));
|
||||
GBT_CSD_recv = 1;
|
||||
break;
|
||||
|
||||
case 0x1F00: // CEM EVSE->EV (сообщение об ошибке)
|
||||
memcpy(&GBT_ErrorCode, j_rx.data, sizeof(GBT_ErrorCode));
|
||||
break;
|
||||
}
|
||||
GBT_HandleEvseRxPacket(&j_rx);
|
||||
j_rx.state = 0;
|
||||
}
|
||||
|
||||
@@ -185,21 +223,6 @@ void GBT_ChargerTask(){
|
||||
|
||||
case GBT_EV_RECOGNITION:
|
||||
// 3) Постоянно шлём BRM, ждём CRM (0x0100, 0xAA)
|
||||
GBT_EVInfo.version[0] = 2;
|
||||
GBT_EVInfo.version[1] = 0;
|
||||
GBT_EVInfo.version[2] = 0;
|
||||
GBT_EVInfo.batteryType = 1;
|
||||
GBT_EVInfo.batteryCapacity = 700;
|
||||
GBT_EVInfo.batteryVoltage = 3990;
|
||||
memcpy(GBT_EVInfo.batteryVendor, "TEST", 4);
|
||||
GBT_EVInfo.batterySN = 666666;
|
||||
GBT_EVInfo.batteryManuY = 30;
|
||||
GBT_EVInfo.batteryManuM = 2;
|
||||
GBT_EVInfo.batteryManuD = 20;
|
||||
GBT_EVInfo.batteryCycleCount = 666;
|
||||
GBT_EVInfo.ownAuto = 1;
|
||||
GBT_EVInfo.rsvd0 = 0;
|
||||
|
||||
if (j_rx.state == 0) GBT_SendBRM(); // TODO CHUNKED SEND
|
||||
GBT_Delay(250);
|
||||
|
||||
@@ -267,13 +290,15 @@ void GBT_ChargerTask(){
|
||||
GBT_ReqPower.requestedCurrent = 4000 - CONN[0].RequestedCurrent;
|
||||
GBT_ReqPower.chargingMode = 1;
|
||||
|
||||
GBT_BATStat.maxCellVoltage = 320;
|
||||
GBT_BATStat.maxChargingCurrent = 40;
|
||||
GBT_BATStat.totalEnergy = 6;
|
||||
GBT_BATStat.maxChargingVoltage = 500;
|
||||
GBT_BATStat.maxTemp = 70;
|
||||
GBT_BATStat.SOC = CONN[0].SOC;
|
||||
GBT_BATStat.measVoltage = CONN[0].MeasuredVoltage;
|
||||
|
||||
/* Enable load only after delayed start in charging state. */
|
||||
if (GBT_StateTick() >= GBT_EV_ENABLE_LOAD_DELAY_MS) {
|
||||
CONN[0].enableLoad = GBT_ChargerCurrentStatus.chargingPermissible;
|
||||
} else {
|
||||
CONN[0].enableLoad = 0;
|
||||
}
|
||||
|
||||
// Стоп по инициативе EVSE (получили CST)
|
||||
if (GBT_CST_recv) {
|
||||
@@ -435,13 +460,8 @@ void GBT_Reset(){
|
||||
GBT_CST_recv = 0;
|
||||
GBT_CSD_recv = 0;
|
||||
GBT_CRO_val = 0x00;
|
||||
CONN[0].SOC = 0;
|
||||
CONN[0].enableLoad = 0;
|
||||
CONN[0].RequestedCurrent = 1000;
|
||||
CONN[0].RequestedVoltage = 400;
|
||||
CONN[0].chargingError = 0;
|
||||
memset(&GBT_EVInfo, 0, sizeof (GBT_EVInfo));
|
||||
memset(&GBT_BATStat, 0, sizeof (GBT_BATStat));
|
||||
memset(&GBT_ReqPower, 0, sizeof (GBT_ReqPower));
|
||||
memset(&GBT_CurrPower, 0, sizeof (GBT_CurrPower));
|
||||
memset(&GBT_MaxVoltage, 0, sizeof (GBT_MaxVoltage));
|
||||
|
||||
Reference in New Issue
Block a user