latest version
This commit is contained in:
@@ -5,139 +5,137 @@
|
||||
*/
|
||||
|
||||
#include "connector.h"
|
||||
#include "lock.h"
|
||||
#include "board.h"
|
||||
#include "edcan.h"
|
||||
#include <string.h>
|
||||
#include <charger_gbt.h>
|
||||
|
||||
|
||||
CONN_State_t connectorState;
|
||||
extern GBT_EDCAN_Output_t GBT_EDCAN_Output;
|
||||
extern GBT_EDCAN_Input_t GBT_EDCAN_Input;
|
||||
CONN_t CONN;
|
||||
|
||||
uint8_t CC_STATE_FILTERED;
|
||||
|
||||
static void CONN_UpdateEdcanOutput(void);
|
||||
|
||||
void CONN_Init(){
|
||||
CONN_SetState(CONN_Initializing);
|
||||
memset(&CONN, 0, sizeof(CONN));
|
||||
CONN.connControl = CMD_NONE;
|
||||
CONN_SetState(Unknown);
|
||||
}
|
||||
|
||||
void CONN_Task(){
|
||||
|
||||
switch (connectorState){
|
||||
case CONN_Initializing: // unlocked
|
||||
GBT_Lock(0);
|
||||
CONN_SetState(CONN_Available);
|
||||
case Unknown:
|
||||
CONN_SetState(Unplugged);
|
||||
break;
|
||||
|
||||
case CONN_Faulted: //unlocked
|
||||
GBT_Lock(0);
|
||||
if(GBT_EDCAN_Input.chargingError == 0) CONN_SetState(CONN_Available);
|
||||
if(GBT_EDCAN_Input.chargeControl == FORCE_UNLOCK) GBT_ForceLock(0);
|
||||
|
||||
break;
|
||||
case CONN_Available: //unlocked, waiting to connect
|
||||
GBT_Lock(0);
|
||||
if(GBT_EDCAN_Input.chargingError != 0) CONN_SetState(CONN_Faulted);
|
||||
if(GBT_EDCAN_Input.chargeControl == FORCE_UNLOCK) GBT_ForceLock(0);
|
||||
|
||||
if((CONN_CC_GetState()==GBT_CC_4V) && (GBT_EDCAN_Input.chargeControl != FORCE_UNLOCK)){ // Исправить
|
||||
CONN_SetState(CONN_Preparing);
|
||||
GBT_Lock(1);
|
||||
case Disabled:
|
||||
if(CONN.chargingError == 0) {
|
||||
CONN_SetState(Unplugged);
|
||||
}
|
||||
break;
|
||||
|
||||
// Выйти из двух состояний в Finished если force unlock
|
||||
case CONN_Preparing: //unlocked, waiting to charge
|
||||
GBT_Lock(0);
|
||||
if(GBT_EDCAN_Input.chargeControl == FORCE_UNLOCK) GBT_ForceLock(0);
|
||||
if(CONN_CC_GetState()==GBT_CC_4V){
|
||||
if(GBT_EDCAN_Input.chargeControl == CHARGING_ALLOWED){
|
||||
// RELAY_Write(RELAY_AUX, 1);
|
||||
// GBT_Start();
|
||||
CONN_SetState(CONN_Charging);
|
||||
}
|
||||
if(GBT_EDCAN_Input.chargeControl == FORCE_UNLOCK){
|
||||
CONN_SetState(CONN_Available);//TODO: CONN_Occupied_complete
|
||||
}
|
||||
//if (CHARGING_NOT_ALLOWED) stay here
|
||||
case Unplugged: // Ожидание подключения и начала сессии
|
||||
{
|
||||
// Обновляем признак физического подключения разъёма по уровню CC
|
||||
if(CONN_CC_GetState() == GBT_CC_4V){
|
||||
CONN.EvseConnected = 1;
|
||||
CONN_SetState(AuthRequired);
|
||||
}else{
|
||||
CONN_SetState(CONN_Available);
|
||||
CONN.EvseConnected = 0;
|
||||
}
|
||||
break;
|
||||
case CONN_Charging://charging, locked
|
||||
GBT_Lock(1);
|
||||
}
|
||||
|
||||
case AuthRequired:
|
||||
{
|
||||
// Если уровень CC вернулся к 6/12В – считаем, что коннектор выдернули
|
||||
if(CONN_CC_GetState() != GBT_CC_4V){
|
||||
CONN_SetState(Unplugged);
|
||||
GBT_Reset();
|
||||
break;
|
||||
}
|
||||
|
||||
// Как только появляется 12V AUX от станции – переходим в Preparing (инициализация протокола)
|
||||
if(IN_ReadInput(IN_0) == 1){
|
||||
CONN_SetState(Preparing);
|
||||
GBT_SwitchState(GBT_EV_CONNECTING);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case Preparing:
|
||||
// Ожидаем переход стейт-машины GB/T в режим зарядки.
|
||||
// Как только GBT_State уходит в режим CHARGING – считаем, что начался заряд.
|
||||
if(GBT_State == GBT_EV_CHARGING){
|
||||
CONN_SetState(Charging);
|
||||
}
|
||||
if(IN_ReadInput(IN_0) == 0){
|
||||
CONN_SetState(Unplugged);
|
||||
GBT_Reset();
|
||||
}
|
||||
break;
|
||||
|
||||
case Charging: // Активная зарядка
|
||||
// Завершение по окончанию GB/T-сессии или при падении тока/отключении AUX можно
|
||||
// добавить позже. Пока ориентируемся только на завершение GB/T.
|
||||
if(GBT_State == GBT_COMPLETE){
|
||||
if(GBT_StopSource == GBT_STOP_EVSE){
|
||||
CONN_SetState(CONN_Suspended_EVSE);
|
||||
}else if(GBT_StopSource == GBT_STOP_EV){
|
||||
CONN_SetState(CONN_Suspended_EV);
|
||||
}else if(GBT_StopSource == GBT_STOP_OCPP){
|
||||
CONN_SetState(CONN_Finishing);
|
||||
}else{
|
||||
CONN_SetState(CONN_Suspended_EVSE);
|
||||
}
|
||||
|
||||
}//FIXME
|
||||
//
|
||||
break;
|
||||
|
||||
case CONN_Suspended_EV://charging completed by EV, waiting to transaction stop
|
||||
GBT_Lock(0);
|
||||
if(GBT_EDCAN_Input.chargeControl == CHARGING_NOT_ALLOWED) CONN_SetState(CONN_Finishing);
|
||||
if(GBT_EDCAN_Input.chargeControl == FORCE_UNLOCK) CONN_SetState(CONN_Finishing); // --> Finished
|
||||
break;
|
||||
|
||||
case CONN_Suspended_EVSE://charging completed by EVSE, waiting to transaction stop
|
||||
GBT_Lock(0);
|
||||
if(GBT_EDCAN_Input.chargeControl == CHARGING_NOT_ALLOWED) CONN_SetState(CONN_Finishing);
|
||||
if(GBT_EDCAN_Input.chargeControl == FORCE_UNLOCK) CONN_SetState(CONN_Finishing); // --> Finished
|
||||
|
||||
break;
|
||||
|
||||
case CONN_Finishing://charging completed, waiting to disconnect, unlocked
|
||||
GBT_Lock(0);
|
||||
|
||||
//TODO Force unlock time limit
|
||||
if(GBT_EDCAN_Input.chargeControl == FORCE_UNLOCK) GBT_ForceLock(0);
|
||||
|
||||
if(CONN_CC_GetState()==GBT_CC_6V){
|
||||
GBT_Lock(0);
|
||||
CONN_SetState(CONN_Available);
|
||||
CONN_SetState(Finished);
|
||||
}
|
||||
if(IN_ReadInput(IN_0) == 0){
|
||||
CONN_SetState(Finished);
|
||||
}
|
||||
break;
|
||||
|
||||
case Finished: // Сессия завершена, ждём окончания и возможного переподключения
|
||||
// Когда GB/T стейт-машина полностью вернулась в исходное состояние,
|
||||
// можно считать сессию закрытой и вернуться в Unplugged.
|
||||
if(CONN_CC_GetState() != GBT_CC_4V){
|
||||
CONN_SetState(Unplugged);
|
||||
GBT_Reset();
|
||||
}
|
||||
break;
|
||||
|
||||
case FinishedEV:
|
||||
case FinishedEVSE:
|
||||
CONN_SetState(Finished);
|
||||
break;
|
||||
default:
|
||||
CONN_SetState(CONN_Initializing);
|
||||
CONN_SetState(Unknown);
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
//external
|
||||
//CONN_SetState(CONN_Error);
|
||||
//CONN_SetState(CONN_Occupied_charging);
|
||||
//CONN_SetState(CONN_Occupied_Complete);
|
||||
|
||||
|
||||
void CONN_SetState(CONN_State_t state){
|
||||
connectorState = state;
|
||||
if(connectorState == CONN_Initializing) EDCAN_printf(LOG_INFO,"CONN_Initializing\n");
|
||||
if(connectorState == CONN_Faulted) EDCAN_printf(LOG_INFO,"CONN_Faulted\n");
|
||||
if(connectorState == CONN_Available) EDCAN_printf(LOG_INFO,"CONN_Available\n");
|
||||
if(connectorState == CONN_Preparing) EDCAN_printf(LOG_INFO,"CONN_Preparing\n");
|
||||
if(connectorState == CONN_Charging) EDCAN_printf(LOG_INFO,"CONN_Charging\n");
|
||||
if(connectorState == CONN_Finishing) EDCAN_printf(LOG_INFO,"CONN_Finishing\n");
|
||||
if(connectorState == CONN_Suspended_EV) EDCAN_printf(LOG_INFO,"CONN_Suspended_EV\n");
|
||||
if(connectorState == CONN_Suspended_EVSE) EDCAN_printf(LOG_INFO,"CONN_Suspended_EVSE\n");
|
||||
CONN.connState = state;
|
||||
|
||||
if(connectorState == Unknown) EDCAN_printf(LOG_INFO,"Unknown\n");
|
||||
if(connectorState == Unplugged) EDCAN_printf(LOG_INFO,"Unplugged\n");
|
||||
if(connectorState == Disabled) EDCAN_printf(LOG_INFO,"Disabled\n");
|
||||
if(connectorState == Preparing) EDCAN_printf(LOG_INFO,"Preparing\n");
|
||||
if(connectorState == AuthRequired) EDCAN_printf(LOG_INFO,"AuthRequired\n");
|
||||
if(connectorState == WaitingForEnergy) EDCAN_printf(LOG_INFO,"WaitingForEnergy\n");
|
||||
if(connectorState == ChargingPausedEV) EDCAN_printf(LOG_INFO,"ChargingPausedEV\n");
|
||||
if(connectorState == ChargingPausedEVSE) EDCAN_printf(LOG_INFO,"ChargingPausedEVSE\n");
|
||||
if(connectorState == Charging) EDCAN_printf(LOG_INFO,"Charging\n");
|
||||
if(connectorState == AuthTimeout) EDCAN_printf(LOG_INFO,"AuthTimeout\n");
|
||||
if(connectorState == Finished) EDCAN_printf(LOG_INFO,"Finished\n");
|
||||
if(connectorState == FinishedEVSE) EDCAN_printf(LOG_INFO,"FinishedEVSE\n");
|
||||
if(connectorState == FinishedEV) EDCAN_printf(LOG_INFO,"FinishedEV\n");
|
||||
if(connectorState == Replugging) EDCAN_printf(LOG_INFO,"Replugging\n");
|
||||
|
||||
GBT_EDCAN_Output.connectorState = state;
|
||||
}
|
||||
|
||||
|
||||
void CONN_CC_ReadStateFiltered() {
|
||||
static uint32_t last_change_time;
|
||||
static uint32_t last_check_time;
|
||||
static uint8_t prev_state;
|
||||
|
||||
// if((last_check_time+100)>HAL_GetTick()) return;
|
||||
if((HAL_GetTick()-last_check_time)<100) return;
|
||||
|
||||
last_check_time = HAL_GetTick();
|
||||
@@ -150,43 +148,6 @@ void CONN_CC_ReadStateFiltered() {
|
||||
} else if ((HAL_GetTick() - last_change_time) >= 300) {
|
||||
CC_STATE_FILTERED = prev_state;
|
||||
}
|
||||
|
||||
// switch(new_state){
|
||||
// case GBT_CC_UNKNOWN:
|
||||
// printf("GBT_CC_UNKNOWN\n");
|
||||
// break;
|
||||
// case GBT_CC_12V:
|
||||
// printf("GBT_CC_12V\n");
|
||||
// break;
|
||||
// case GBT_CC_6V:
|
||||
// printf("GBT_CC_6V\n");
|
||||
// break;
|
||||
// case GBT_CC_4V:
|
||||
// printf("GBT_CC_4V\n");
|
||||
// break;
|
||||
// case GBT_CC_2V:
|
||||
// printf("GBT_CC_2V\n");
|
||||
// break;
|
||||
//
|
||||
// }
|
||||
// switch(CONN_CC_GetState()){
|
||||
// case GBT_CC_UNKNOWN:
|
||||
// printf("FGBT_CC_UNKNOWN\n");
|
||||
// break;
|
||||
// case GBT_CC_12V:
|
||||
// printf("FGBT_CC_12V\n");
|
||||
// break;
|
||||
// case GBT_CC_6V:
|
||||
// printf("FGBT_CC_6V\n");
|
||||
// break;
|
||||
// case GBT_CC_4V:
|
||||
// printf("FGBT_CC_4V\n");
|
||||
// break;
|
||||
// case GBT_CC_2V:
|
||||
// printf("FGBT_CC_2V\n");
|
||||
// break;
|
||||
//
|
||||
// }
|
||||
}
|
||||
|
||||
uint8_t CONN_CC_GetState(){
|
||||
@@ -201,7 +162,7 @@ uint8_t CONN_CC_GetStateRaw(){
|
||||
//TODO: Filter 100ms
|
||||
uint32_t adc;
|
||||
float volt;
|
||||
ADC_Select_Channel(ADC_CHANNEL_6);
|
||||
ADC_Select_Channel(ADC_CHANNEL_3);
|
||||
HAL_ADC_Start(&hadc1);
|
||||
HAL_ADC_PollForConversion(&hadc1, 100);
|
||||
adc = HAL_ADC_GetValue(&hadc1);
|
||||
@@ -229,7 +190,7 @@ float CONN_CC_GetAdc(){
|
||||
|
||||
uint32_t adc;
|
||||
float volt;
|
||||
ADC_Select_Channel(ADC_CHANNEL_6);
|
||||
ADC_Select_Channel(ADC_CHANNEL_3);
|
||||
HAL_ADC_Start(&hadc1);
|
||||
HAL_ADC_PollForConversion(&hadc1, 100);
|
||||
adc = HAL_ADC_GetValue(&hadc1);
|
||||
|
||||
Reference in New Issue
Block a user