/*
 * connector.h
 *
 *  Created on: Jul 31, 2024
 *      Author: colorbass
 */

#ifndef INC_CONNECTOR_H_
#define INC_CONNECTOR_H_

#include "main.h"
#include <stdint.h>

typedef enum __attribute__((packed)) {
	Unknown,
    Unplugged,
    Disabled,
    Preparing,
    AuthRequired,
    WaitingForEnergy,
    ChargingPausedEV,
    ChargingPausedEVSE,
    Charging,
    AuthTimeout,
    Finished,
    FinishedEVSE,
    FinishedEV,
	Replugging
} CONN_State_t;

typedef enum __attribute__((packed)){
	CMD_NONE = 0,
	CMD_STOP = 1,
	CMD_START = 2,
	CMD_FORCE_UNLOCK = 3,
	CMD_REPLUG = 4,
} CONN_Control_t;

typedef enum __attribute__((packed)){
	CONN_NO_ERROR = 0,
	CONN_ERR_INSULATION = 1,
	CONN_ERR_EMERGENCY = 2,
	CONN_ERR_DOOR_OPEN = 3,
	CONN_ERR_LOCK = 4,
	CONN_ERR_CONN_TEMP = 5,
} CONN_Error_t;

extern CONN_State_t connectorState;

// Глобальная структура состояния коннектора и зарядки со стороны тачки (EV),
// по возможности совместимая по именам полей с ChargingConnector_t на стороне станции.
typedef struct {
	CONN_Control_t connControl;   // 0
	CONN_State_t   connState;     // 1

	uint8_t  SOC;                 // State of charge [%]               // 2
	uint32_t Power;               // Power [W]                         // 3..6
	uint32_t Energy;              // Energy [Wh]                       // 7..10

	uint16_t RequestedVoltage;    // 1V/bit
	uint16_t RequestedCurrent;    // 0.1A/bit

	uint16_t MeasuredVoltage;     // 1V/bit
	uint16_t MeasuredCurrent;     // 0.1A/bit

	uint16_t MeasuredVoltageSE;     // 1V/bit
	uint16_t MeasuredCurrentSE;     // 0.1A/bit

	uint8_t  ContactorEnabled;        // 1 - enabled, 0 - disabled (команда на замыкание контактора)

	CONN_Error_t chargingError;   // 0 если ок
	uint8_t  EvseConnected;
	uint32_t ChargingTime;        // seconds
	uint8_t  enableLoad;          // 1 - enabled, 0 - disabled (команда на включение контактора)

	uint8_t  connectorType;       // 0 - NONE, 1 - GBT, 2 - CCS (для EV всегда GBT)
} CONN_t;

extern CONN_t CONN[2];

void CONN_Init();
void CONN_Task();
void CONN_SetState(CONN_State_t state);
void CONN_CC_ReadStateFiltered(void);
uint8_t CONN_CC_GetStateRaw();
uint8_t CONN_CC_GetState();
float CONN_CC_GetAdc();

// STM32(EV) -> EVerest (EVSE)
// uint8_t  SOC;                 // State of charge [%]               // 2
// uint16_t RequestedVoltage;    // 1V/bit
// uint16_t RequestedCurrent;    // 0.1A/bit
// uint16_t MeasuredVoltage;     // 1V/bit
// uint16_t MeasuredCurrent;     // 0.1A/bit
// uint8_t  ContactorEnabled;        // 1 - enabled, 0 - disabled (команда на замыкание контактора)

// cp_state 
// stop ????


// EVerest (EVSE) -> STM32(EV)
// uint16_t MeasuredVoltageSE;     // 1V/bit
// uint16_t MeasuredCurrentSE;     // 0.1A/bit
// uint8_t  enableLoad;          // 1 - enabled, 0 - disabled (команда на включение контактора)

// cp_state
// pwm_value


#endif /* INC_CONNECTOR_H_ */
