/*
 * charger_gbt.h
 *
 *  Created on: Apr 18, 2024
 *      Author: colorbass
 */

#ifndef INC_CHARGER_GBT_H_
#define INC_CHARGER_GBT_H_

#include "main.h"
#include "connector.h"

#define GBT_CST_NO_REASON             0x0000F0F0 // Без причины
#define GBT_CST_CONDITION_REACHED     0x0100F0F0 // Заряд завершен
#define GBT_CST_SUSPENDS_ARTIFICIALLY 0x0400F0F0 // Искуственная остановка
#define GBT_CST_FAULT_SUSPENSION      0x1000F0F0 // Приостановка из за неисправности
#define GBT_CST_BMS_ACTIVELY_SUSPENDS 0x4000F0F0 // завершение по инициативе BMS
#define GBT_CST_CONNECTOR_OVER_TEMP   0x0001F0F0 // Перегрев коннектора
#define GBT_CST_INT_PART_OVER_TEMP    0x0010F0F0 // Перегрев внутренних частей
#define GBT_CST_CANNOT_SUPPLY_REQ_ELQ 0x0040F0F0 // Неполучится обеспечить столько энергии
#define GBT_CST_SUDDENSTOP            0x0000F1F0 // Внезапная остановка
#define GBT_CST_OTHERFALUT            0x0000F4F0 // Прочая ошибка
#define GBT_CST_CURRENT_MISMATCH      0x0000F0F1 // Неправильный ток
#define GBT_CST_ABNORMALVOLTAGEERROR  0x0000F0F4 // Ненормальное напряжение

typedef enum {
	GBT_STOP_EVSE = 0,
	GBT_STOP_EV   = 1,
	GBT_STOP_OCPP = 2,

}GBT_StopSource_t;


typedef enum{
	GBT_CC_UNKNOWN,
	GBT_CC_12V,
	GBT_CC_6V,
	GBT_CC_4V,
	GBT_CC_2V,

}gbtCcState_t;

/* Стейты GB/T со стороны EV: постоянно шлём свой пакет, ждём ответ → переход, шлём другой пакет */
typedef enum{
	GBT_DISABLED = 0x10,                  // сессия выключена
	GBT_EV_CONNECTING = 0x13,               // ждём CHM (ничего не шлём), получили → шлём BHM, переход
	GBT_EV_SEND_BHM_WAIT_CRM = 0x14,      // шлём BHM, ждём CRM(0x00)
	GBT_EV_HANDSHAKE = 0x15,           // изотест на EV не делаем → сразу дальше
	GBT_EV_RECOGNITION = 0x16,      // шлём BRM, ждём CRM(0xAA)
	GBT_EV_CHARGING_PARAMETERS = 0x17,      // шлём BCP, ждём CML → шлём BRO(0x00), BRO(0xAA)
	GBT_EV_BMS_INIT = 0x18,      // пауза 1.5 с (инициализация зарядника)
	GBT_EV_WAIT_CHARGER_READY = 0x19,     // ждём CRO(0xAA) или 500 мс → шлём BCL
	GBT_EV_CHARGING = 0x20,               // шлём BCL (запрос U/I) → зарядка
	GBT_STOP = 0x30,                      // остановка: EV/EVSE запросили стоп
	GBT_STOP_CSD = 0x31,                  // ожидание CSD от EVSE
	GBT_ERROR = 0x32,                     // ошибка
	GBT_COMPLETE = 0x33,                  // сессия завершена

}gbtState_t;

#pragma pack(push, 1)

typedef struct {
	uint16_t maxOutputVoltage;

}GBT_BHM_t;

typedef struct {
	uint8_t bmsIdentified;
	uint32_t chargerNumber;
	char chargerLocation[3];
}GBT_CRM_t;

typedef struct {
	uint16_t maxOutputVoltage;
	uint16_t minOutputVoltage;
	uint16_t maxOutputCurrent;
	uint16_t minOutputCurrent;

}GBT_CML_t;

typedef struct{
	uint8_t version[3]; 		//GB/T version
	uint8_t batteryType;		//battery type
	uint16_t batteryCapacity; 	// 0.1Ah/bit
	uint16_t batteryVoltage;  	// 0.1V/bit
	uint8_t batteryVendor[4]; 	// Battery vendor (ASCII string)
	uint32_t batterySN;			// int
	uint8_t batteryManuY;		// year (offset 1985)
	uint8_t batteryManuM;		// month
	uint8_t batteryManuD;		// day
	uint32_t batteryCycleCount:24; //uint24_t
	uint8_t ownAuto;			// 0 = lizing, 1 = own auto
	uint8_t rsvd0;
	uint8_t EVIN[17];			//EVIN
	uint8_t EV_SW_VER[8];

}GBT_BRM_t;

typedef struct {
	uint16_t maxCellVoltage; 		// 0.01v/bit
	uint16_t maxChargingCurrent; 	// 0.1A/bit
	uint16_t totalEnergy; 			// 0.1kWh
	uint16_t maxChargingVoltage; 	// 0.1V/ bit
	uint8_t  maxTemp; 				// 1C/bit, -50C offset
	uint16_t SOC; 					// 0.1%/bit , 0..100%
	uint16_t measVoltage; 			// 0.1V/bit
}GBT_BCP_t;

typedef struct {
	uint16_t requestedVoltage; 		// 0.1V/bit
	uint16_t requestedCurrent; 		// 0.1A/bit
	uint8_t chargingMode; 			// 0x01 - CV, 0x02 - CC

}GBT_BCL_t;

typedef struct {
	uint16_t measuredChargingVoltage;
	uint16_t measuredChargingCurrent;
	uint16_t highestVoltageOfBatteryCell;
	//uint8_t  groupNrOfCellWithHighestVoltage;
	uint8_t currentChargeState;
	uint16_t estimatedRemainingChargingTime;

}GBT_BCS_t;

typedef struct {

	uint8_t singleBatteryHighestVoltageSerNo;// SINGLE_BATTERY_HIGHEST_VOLTAGE_SER_NO
	uint8_t batteryHighestTemp; //BATTERY_HIGHEST_TEMP
	uint8_t batteryHighestTempSerNo;//BATTERY_HIGHEST_TEMP_SER_NO
	uint8_t batteryLowestTemp;//BATTERY_LOWEST_TEMP
	uint8_t batteryLowestTempSerNo;//BATTERY_LOWEST_TEMP_SER_NO
	uint8_t batteryCellVoltageState;//BATTERY_CELL_VOLTAGE_STATE
	uint8_t batteryStatus;//BATTERY_STATUS[bit-mask];

}GBT_BSM_t;

typedef struct {

	uint16_t outputVoltage;
	uint16_t outputCurrent;
	uint16_t chargingTime;
	uint16_t chargingPermissible;

}GBT_CCS_t;

typedef struct {
	uint16_t chargingTime;
	uint16_t outputEnergy;
	uint32_t chargerNumber;
}GBT_CSD_t;


// typedef struct {
// 	uint8_t enablePSU;
// 	uint16_t requestedVoltage; 		// 0.1V/bit
// 	uint16_t requestedCurrent; 		// 0.1A/bit
// 	uint8_t chargingMode; 			// 0x01 - CV, 0x02 - CC
// 	uint8_t chargingPercentage; 			//
// 	uint16_t chargingRemainingTimeMin; 			//
// 	uint16_t chargingElapsedTimeMin; 			//
// 	uint8_t chargingElapsedTimeSec; 			//

// 	CONN_State_t connectorState;
// 	CONN_Error_t outputError; // 0 if okay
// 	uint8_t EvConnected;


// }GBT_EDCAN_Output_t;

// typedef struct {
// 	uint8_t PSU_Status;
// 	uint16_t measuredVoltage; 		// 0.1V/bit
// 	uint16_t measuredCurrent; 		// 0.1A/bit

// 	CONN_Control_t chargeControl;
// 	CONN_Error_t chargingError; // 0 if okay

// }GBT_EDCAN_Input_t;


/*	500 - Power Supply
TX
* PSU_ENABLE
* BMS_STATUS
* BMS_ERRORS
* PSU_REQUESTED_VOLTAGE[2]
* PSU_REQUESTED_CURRENT[2]
* BMS_CHARGE_PERCENTAGE
// BMS_MIN_CURRENT
* CHARGE_REMAINING_TIME_MIN
* CHARGE_REMAINING_TIME_SEC
* CHARGE_ELAPSED_TIME[1]

RX
* MEASURED_VOLTAGE[2]
* MEASURED_CURRENT[2]
// MAX_VOLTAGE[2]
// MAX_CURRENT[2]
// MAX_POWER[2]
* PSU_STATUS
*
*/

#pragma pack(pop)

extern gbtState_t GBT_State;

extern ADC_HandleTypeDef hadc1;

extern GBT_BHM_t GBT_MaxVoltage;
extern GBT_BRM_t GBT_EVInfo;
extern GBT_BCP_t GBT_BATStat;
extern GBT_BCS_t GBT_ChargingStatus;
extern GBT_BCL_t GBT_ReqPower;
extern GBT_CML_t GBT_MaxLoad;
extern GBT_CCS_t GBT_ChargerCurrentStatus;
extern GBT_CRM_t GBT_ChargerInfo;
extern GBT_BSM_t GBT_BatteryStatus;
extern GBT_CSD_t GBT_ChargerStop;

extern uint8_t GBT_BRO;
extern uint8_t cc_enable;

extern uint8_t GBT_Charger_Enable;

extern GBT_StopSource_t GBT_StopSource;

void GBT_Init();
void GBT_Reset();

/** Немедленная обработка однокадровых сообщений EVSE→EV (не через j_rx TP). */
void GBT_ApplyShortPacket(uint32_t pgn, const uint8_t *data, uint8_t dlc);
//void GBT_Stop(uint32_t causecode);
void GBT_StopEV(uint32_t causecode);
void GBT_StopEVSE(uint32_t causecode);
void GBT_StopOCPP(uint32_t causecode);
void GBT_ForceStop();
void GBT_ChargerTask();
void GBT_Error(uint32_t errorcode);

//float GBT_CC_GetAdc();

//uint8_t GBT_CC_GetState();

void GBT_SwitchState(gbtState_t state);
void GBT_Delay(uint32_t delay);
uint32_t GBT_StateTick();
void J_SendPacket(uint32_t PGN, uint8_t pri, uint8_t DLC, uint8_t *data);

// EV-side GB/T packets (EV->EVSE)
void GBT_SendBHM(void);
void GBT_SendBRM(void);
void GBT_SendBCP(void);
void GBT_SendBRO(uint8_t state);
void GBT_SendBCL(void);
void GBT_SendBCS(void);
void GBT_SendBSM(void);
void GBT_SendBST(uint32_t causeCode);
void GBT_SendBSD(void);


#endif /* INC_CHARGER_GBT_H_ */
