big refactoring: J1939, log output, state machine bug fixes
This commit is contained in:
+98
-43
@@ -15,6 +15,7 @@
|
||||
#include "edcan.h"
|
||||
#include "connector.h"
|
||||
#include "soft_rtc.h"
|
||||
#include "debug.h"
|
||||
|
||||
uint8_t GBT_CC_GetStateRaw();
|
||||
|
||||
@@ -49,6 +50,7 @@ GBT_CCS_t GBT_ChargerCurrentStatus;
|
||||
GBT_CSD_t GBT_ChargerStop;
|
||||
|
||||
uint8_t GBT_BRO;
|
||||
uint8_t cc_enable;
|
||||
|
||||
uint32_t GBT_TimeChargingStarted;
|
||||
|
||||
@@ -57,17 +59,28 @@ uint32_t GBT_ErrorCode;
|
||||
|
||||
GBT_StopSource_t GBT_StopSource;
|
||||
|
||||
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
|
||||
|
||||
void GBT_Init(){
|
||||
GBT_State = GBT_DISABLED;
|
||||
CONN.connControl = CMD_NONE;
|
||||
CONN[0].connControl = CMD_NONE;
|
||||
cc_enable = 0U;
|
||||
memcpy(GBT_EVInfo.EVIN, "EDISON_TEST_EVIN_", 17);
|
||||
memcpy(GBT_EVInfo.EV_SW_VER, "1.0.0", 8);
|
||||
GBT_Reset();
|
||||
}
|
||||
|
||||
|
||||
void GBT_ChargerTask(){
|
||||
RELAY_Write(RELAY_CC, cc_enable);
|
||||
|
||||
//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;
|
||||
@@ -93,10 +106,12 @@ void GBT_ChargerTask(){
|
||||
|
||||
case 0x1200: // CCS EVSE->EV (текущий статус зарядника)
|
||||
memcpy(&GBT_ChargerCurrentStatus, j_rx.data, sizeof(GBT_ChargerCurrentStatus));
|
||||
CONN.enableLoad = GBT_ChargerCurrentStatus.chargingPermissible;
|
||||
CONN.ChargingTime = GBT_ChargerCurrentStatus.chargingTime;
|
||||
CONN.MeasuredVoltageSE = GBT_ChargerCurrentStatus.outputVoltage / 10;
|
||||
CONN.MeasuredCurrentSE = 4000 - GBT_ChargerCurrentStatus.outputCurrent;
|
||||
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)
|
||||
@@ -115,11 +130,18 @@ void GBT_ChargerTask(){
|
||||
j_rx.state = 0;
|
||||
}
|
||||
|
||||
if((connectorState == Unplugged) && (GBT_State != GBT_DISABLED)){
|
||||
log_printf(LOG_INFO, "Car unplugged, resetting charge session\n");
|
||||
CONN[0].enableLoad = 0;
|
||||
GBT_Reset();
|
||||
return;
|
||||
}
|
||||
|
||||
if((HAL_GetTick() - GBT_delay_start) < GBT_delay){
|
||||
//waiting
|
||||
}else switch (GBT_State){
|
||||
case GBT_DISABLED:
|
||||
CONN.enableLoad = 0;
|
||||
CONN[0].enableLoad = 0;
|
||||
// if(connectorState == Preparing){
|
||||
// GBT_Reset();
|
||||
// GBT_SwitchState(GBT_EV_CONNECTING);
|
||||
@@ -133,25 +155,31 @@ void GBT_ChargerTask(){
|
||||
GBT_Delay(250);
|
||||
|
||||
if (GBT_CHM_recv) {
|
||||
log_printf(LOG_INFO, "CHM received, starting EV handshake\n");
|
||||
GBT_SwitchState(GBT_EV_HANDSHAKE);
|
||||
break;
|
||||
}
|
||||
if (GBT_StateTick() > 10000) {
|
||||
GBT_Error(0xFCF0C0FC);
|
||||
EDCAN_printf(LOG_WARN, "CHM timeout\n");
|
||||
log_printf(LOG_WARN, "CHM timeout\n");
|
||||
}
|
||||
break;
|
||||
|
||||
case GBT_EV_HANDSHAKE:
|
||||
// 2) Постоянно шлём BHM, ждём CRM (0x0100, первый раз 0x00)
|
||||
GBT_MaxVoltage.maxOutputVoltage = 4500; // 450V
|
||||
GBT_MaxVoltage.maxOutputVoltage = CONN[0].RequestedVoltage * 10;
|
||||
if (j_rx.state == 0) GBT_SendBHM();
|
||||
GBT_Delay(250);
|
||||
|
||||
if (GBT_CRM_recv) {
|
||||
log_printf(LOG_INFO, "CRM received, sending BRM (EV identification)\n");
|
||||
GBT_SwitchState(GBT_EV_RECOGNITION);
|
||||
break;
|
||||
}
|
||||
if (GBT_StateTick() > GBT_EV_HANDSHAKE_TIMEOUT_MS) {
|
||||
GBT_Error(0xFCF0C0FD);
|
||||
log_printf(LOG_WARN, "CRM timeout in EV_HANDSHAKE\n");
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
@@ -171,19 +199,18 @@ void GBT_ChargerTask(){
|
||||
GBT_EVInfo.batteryCycleCount = 666;
|
||||
GBT_EVInfo.ownAuto = 1;
|
||||
GBT_EVInfo.rsvd0 = 0;
|
||||
memcpy(GBT_EVInfo.EVIN, "EDISON_TEST_EVIN_", 17);
|
||||
memcpy(GBT_EVInfo.EV_SW_VER, "1.0.0", 8);
|
||||
|
||||
if (j_rx.state == 0) GBT_SendBRM(); // TODO CHUNKED SEND
|
||||
GBT_Delay(250);
|
||||
|
||||
if ((GBT_CRM_recv) && (GBT_ChargerInfo.bmsIdentified == 0xAA)) {
|
||||
log_printf(LOG_INFO, "EV identified by charger, sending BCP\n");
|
||||
GBT_SwitchState(GBT_EV_CHARGING_PARAMETERS);
|
||||
break;
|
||||
}
|
||||
if (GBT_StateTick() > 5000) {
|
||||
GBT_Error(0xFCF1C0FC);
|
||||
EDCAN_printf(LOG_WARN, "CRM(0xAA) timeout (wait BCP)\n");
|
||||
log_printf(LOG_WARN, "CRM(0xAA) timeout (wait BCP)\n");
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -193,12 +220,13 @@ void GBT_ChargerTask(){
|
||||
GBT_Delay(250);
|
||||
|
||||
if (GBT_CML_recv) {
|
||||
log_printf(LOG_INFO, "CML received, starting BMS initialization\n");
|
||||
GBT_SwitchState(GBT_EV_BMS_INIT);
|
||||
break;
|
||||
}
|
||||
if (GBT_StateTick() > 5000) {
|
||||
GBT_Error(0xFCF4C0FC);
|
||||
EDCAN_printf(LOG_WARN, "CML timeout\n");
|
||||
log_printf(LOG_WARN, "CML timeout\n");
|
||||
}
|
||||
break;
|
||||
case GBT_EV_BMS_INIT:
|
||||
@@ -206,6 +234,7 @@ void GBT_ChargerTask(){
|
||||
if (j_rx.state == 0) GBT_SendBRO(0x00);
|
||||
GBT_Delay(250);
|
||||
if (GBT_StateTick() > 1500) {
|
||||
log_printf(LOG_INFO, "BMS initialized, waiting charger ready signal\n");
|
||||
GBT_SwitchState(GBT_EV_WAIT_CHARGER_READY);
|
||||
break;
|
||||
}
|
||||
@@ -219,17 +248,23 @@ void GBT_ChargerTask(){
|
||||
GBT_Delay(250);
|
||||
|
||||
if (GBT_CRO_val == 0xAA) {
|
||||
log_printf(LOG_INFO, "Charger ready, entering active charging\n");
|
||||
GBT_SwitchState(GBT_EV_CHARGING);
|
||||
GBT_TimeChargingStarted = get_Current_Time();
|
||||
GBT_EVSE_last_rx_tick = HAL_GetTick();
|
||||
break;
|
||||
}
|
||||
if (GBT_StateTick() > GBT_EV_WAIT_READY_TIMEOUT_MS) {
|
||||
GBT_Error(0xFCF2C0FD);
|
||||
log_printf(LOG_WARN, "CRO(0xAA) timeout in EV_WAIT_CHARGER_READY\n");
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case GBT_EV_CHARGING:
|
||||
// Основной режим зарядки: EV периодически шлёт BCS/BSM.
|
||||
GBT_ReqPower.requestedVoltage = CONN.RequestedVoltage * 10;
|
||||
GBT_ReqPower.requestedCurrent = 4000 - CONN.RequestedCurrent;
|
||||
GBT_ReqPower.requestedVoltage = CONN[0].RequestedVoltage * 10;
|
||||
GBT_ReqPower.requestedCurrent = 4000 - CONN[0].RequestedCurrent;
|
||||
GBT_ReqPower.chargingMode = 1;
|
||||
|
||||
GBT_BATStat.maxCellVoltage = 320;
|
||||
@@ -237,23 +272,32 @@ void GBT_ChargerTask(){
|
||||
GBT_BATStat.totalEnergy = 6;
|
||||
GBT_BATStat.maxChargingVoltage = 500;
|
||||
GBT_BATStat.maxTemp = 70;
|
||||
GBT_BATStat.SOC = CONN.SOC;
|
||||
GBT_BATStat.measVoltage = CONN.MeasuredVoltage;
|
||||
GBT_BATStat.SOC = CONN[0].SOC;
|
||||
GBT_BATStat.measVoltage = CONN[0].MeasuredVoltage;
|
||||
|
||||
// Стоп по инициативе EVSE (получили CST)
|
||||
if (GBT_CST_recv) {
|
||||
log_printf(LOG_INFO, "Charging stop requested by EVSE (CST)\n");
|
||||
GBT_StopEVSE(GBT_CST_SUDDENSTOP);
|
||||
break;
|
||||
}
|
||||
// Стоп по команде с машины (EDCAN)
|
||||
if (CONN.connControl == CMD_STOP) {
|
||||
if (CONN[0].connControl == CMD_STOP) {
|
||||
CONN[0].connControl = CMD_NONE;
|
||||
log_printf(LOG_INFO, "Charging stop requested by EV command\n");
|
||||
GBT_StopEV(GBT_CST_BMS_ACTIVELY_SUSPENDS);
|
||||
break;
|
||||
}
|
||||
if (IN_ReadInput(IN_ESTOP)) {
|
||||
log_printf(LOG_INFO, "Charging stop requested by emergency input\n");
|
||||
GBT_StopEV(GBT_CST_BMS_ACTIVELY_SUSPENDS);
|
||||
break;
|
||||
}
|
||||
if ((HAL_GetTick() - GBT_EVSE_last_rx_tick) > GBT_EV_CHARGING_RX_TIMEOUT_MS) {
|
||||
log_printf(LOG_WARN, "EVSE RX timeout in EV_CHARGING\n");
|
||||
GBT_StopEVSE(GBT_CST_SUDDENSTOP);
|
||||
break;
|
||||
}
|
||||
|
||||
GBT_SendBCS();
|
||||
GBT_SendBCL();
|
||||
@@ -263,14 +307,23 @@ void GBT_ChargerTask(){
|
||||
|
||||
case GBT_STOP:
|
||||
GBT_Delay(10);
|
||||
CONN.enableLoad = 0;
|
||||
// EV шлёт BSD (Battery Stop Data), не CST (CST шлёт EVSE)
|
||||
GBT_SendBSD();
|
||||
CONN[0].enableLoad = 0;
|
||||
if (GBT_StopSource == GBT_STOP_EV) {
|
||||
// EV-инициированный stop: сначала BST, ждём ответный CST, потом BSD.
|
||||
GBT_SendBST(GBT_StopCauseCode);
|
||||
if (GBT_CST_recv) {
|
||||
GBT_SendBSD();
|
||||
}
|
||||
} else {
|
||||
// EVSE-инициированный stop: EV сразу отвечает BSD.
|
||||
GBT_SendBSD();
|
||||
}
|
||||
if (GBT_StateTick() > 10000) {
|
||||
EDCAN_printf(LOG_WARN, "CSD Timeout\n");
|
||||
log_printf(LOG_WARN, "CSD Timeout\n");
|
||||
GBT_Error(0xFCF0C0FD); // CSD timeout
|
||||
}
|
||||
if (GBT_CSD_recv) {
|
||||
log_printf(LOG_INFO, "CSD received, finalizing charge session\n");
|
||||
GBT_SwitchState(GBT_STOP_CSD);
|
||||
}
|
||||
break;
|
||||
@@ -279,6 +332,7 @@ void GBT_ChargerTask(){
|
||||
// EV не шлёт CSD (финальный отчёт шлёт EVSE). Ждём 2.5 с и завершаем.
|
||||
GBT_Delay(250);
|
||||
if (GBT_StateTick() > 2500) {
|
||||
log_printf(LOG_INFO, "Charge session completed\n");
|
||||
GBT_SwitchState(GBT_COMPLETE);
|
||||
}
|
||||
break;
|
||||
@@ -301,8 +355,8 @@ void GBT_ChargerTask(){
|
||||
default:
|
||||
GBT_SwitchState(GBT_DISABLED);
|
||||
}
|
||||
if (CONN_CC_GetState()==GBT_CC_4V) CONN.EvseConnected = 1;
|
||||
else CONN.EvseConnected = 0;
|
||||
if (CONN_CC_GetState()==GBT_CC_4V) CONN[0].EvseConnected = 1;
|
||||
else CONN[0].EvseConnected = 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -311,18 +365,18 @@ void GBT_SwitchState(gbtState_t state){
|
||||
GBT_State = state;
|
||||
GBT_state_tick = HAL_GetTick();
|
||||
|
||||
if(GBT_State == GBT_DISABLED) EDCAN_printf(LOG_INFO, "GBT_DISABLED\n");
|
||||
if(GBT_State == GBT_EV_CONNECTING) EDCAN_printf(LOG_INFO, "GBT_EV_CONNECTING\n");
|
||||
if(GBT_State == GBT_EV_HANDSHAKE) EDCAN_printf(LOG_INFO, "GBT_EV_HANDSHAKE\n");
|
||||
if(GBT_State == GBT_EV_RECOGNITION) EDCAN_printf(LOG_INFO, "GBT_EV_RECOGNITION\n");
|
||||
if(GBT_State == GBT_EV_CHARGING_PARAMETERS) EDCAN_printf(LOG_INFO, "GBT_EV_CHARGING_PARAMETERS\n");
|
||||
if(GBT_State == GBT_EV_BMS_INIT) EDCAN_printf(LOG_INFO, "GBT_EV_BMS_INIT\n");
|
||||
if(GBT_State == GBT_EV_WAIT_CHARGER_READY) EDCAN_printf(LOG_INFO, "GBT_EV_WAIT_CHARGER_READY\n");
|
||||
if(GBT_State == GBT_EV_CHARGING) EDCAN_printf(LOG_INFO, "GBT_EV_CHARGING\n");
|
||||
if(GBT_State == GBT_STOP) EDCAN_printf(LOG_INFO, "GBT_STOP\n");
|
||||
if(GBT_State == GBT_STOP_CSD) EDCAN_printf(LOG_INFO, "GBT_STOP_CSD\n");
|
||||
if(GBT_State == GBT_ERROR) EDCAN_printf(LOG_WARN, "GBT_ERROR\n");
|
||||
if(GBT_State == GBT_COMPLETE) EDCAN_printf(LOG_INFO, "GBT_COMPLETE\n");
|
||||
if(GBT_State == GBT_DISABLED) log_printf(LOG_DEBUG, "DBG_STATE: GBT_DISABLED\n");
|
||||
if(GBT_State == GBT_EV_CONNECTING) log_printf(LOG_DEBUG, "DBG_STATE: GBT_EV_CONNECTING\n");
|
||||
if(GBT_State == GBT_EV_HANDSHAKE) log_printf(LOG_DEBUG, "DBG_STATE: GBT_EV_HANDSHAKE\n");
|
||||
if(GBT_State == GBT_EV_RECOGNITION) log_printf(LOG_DEBUG, "DBG_STATE: GBT_EV_RECOGNITION\n");
|
||||
if(GBT_State == GBT_EV_CHARGING_PARAMETERS) log_printf(LOG_DEBUG, "DBG_STATE: GBT_EV_CHARGING_PARAMETERS\n");
|
||||
if(GBT_State == GBT_EV_BMS_INIT) log_printf(LOG_DEBUG, "DBG_STATE: GBT_EV_BMS_INIT\n");
|
||||
if(GBT_State == GBT_EV_WAIT_CHARGER_READY) log_printf(LOG_DEBUG, "DBG_STATE: GBT_EV_WAIT_CHARGER_READY\n");
|
||||
if(GBT_State == GBT_EV_CHARGING) log_printf(LOG_DEBUG, "DBG_STATE: GBT_EV_CHARGING\n");
|
||||
if(GBT_State == GBT_STOP) log_printf(LOG_DEBUG, "DBG_STATE: GBT_STOP\n");
|
||||
if(GBT_State == GBT_STOP_CSD) log_printf(LOG_DEBUG, "DBG_STATE: GBT_STOP_CSD\n");
|
||||
if(GBT_State == GBT_COMPLETE) log_printf(LOG_DEBUG, "DBG_STATE: GBT_COMPLETE\n");
|
||||
if(GBT_State == GBT_ERROR) log_printf(LOG_WARN, "State machine entered ERROR state\n");
|
||||
|
||||
|
||||
}
|
||||
@@ -337,7 +391,7 @@ void GBT_Delay(uint32_t delay){
|
||||
}
|
||||
|
||||
void GBT_StopEV(uint32_t causecode){ // --> Suspend EV
|
||||
if (CONN.chargingError){
|
||||
if (CONN[0].chargingError){
|
||||
GBT_StopSource = GBT_STOP_EVSE;
|
||||
}else{
|
||||
GBT_StopSource = GBT_STOP_EV;
|
||||
@@ -361,13 +415,13 @@ void GBT_StopOCPP(uint32_t causecode){ // --> Finished
|
||||
void GBT_ForceStop(){ // --> Suspend EV
|
||||
GBT_StopSource = GBT_STOP_EV;
|
||||
// Отключаем силовой контактор батареи со стороны EV
|
||||
CONN.enableLoad = 0;
|
||||
CONN[0].enableLoad = 0;
|
||||
GBT_SwitchState(GBT_COMPLETE);
|
||||
}
|
||||
|
||||
void GBT_Error(uint32_t errorcode){ // --> Suspend EV
|
||||
GBT_StopSource = GBT_STOP_EV;
|
||||
EDCAN_printf(LOG_WARN, "GBT Error code: 0x%X\n", errorcode);
|
||||
log_printf(LOG_WARN, "GBT Error code: 0x%X\n", errorcode);
|
||||
GBT_ErrorCode = errorcode;
|
||||
GBT_SwitchState(GBT_ERROR);
|
||||
}
|
||||
@@ -381,11 +435,11 @@ void GBT_Reset(){
|
||||
GBT_CST_recv = 0;
|
||||
GBT_CSD_recv = 0;
|
||||
GBT_CRO_val = 0x00;
|
||||
CONN.SOC = 0;
|
||||
CONN.enableLoad = 0;
|
||||
CONN.RequestedCurrent = 1000;
|
||||
CONN.RequestedVoltage = 400;
|
||||
CONN.chargingError = 0;
|
||||
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));
|
||||
@@ -399,4 +453,5 @@ void GBT_Reset(){
|
||||
GBT_CurrPower.requestedVoltage = 500; //50V
|
||||
GBT_TimeChargingStarted = 0;
|
||||
GBT_BRO = 0x00;
|
||||
GBT_EVSE_last_rx_tick = HAL_GetTick();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user