#pragma once

#include "main.h"

#pragma pack(push, 1)

// Статус
// статус подключения к автомобилю

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_ERR_AC_FAULT = 6, // Нет напряжения сети
	CONN_ERR_CONTACTOR = 7, // Контактор неисправен
	CONN_ERR_HOTPLUG = 8, // Коннектор неожиданно отключился
	CONN_ERR_EV_COMM = 9, // Ошибка протокола связи с электромобилем
	CONN_ERR_PSU_FAULT = 10, // Ошибка PSU
	CONN_ERR_FIRE_ALARM = 11, // Пожарная тревога (до перезагрузки)

}CONN_Error_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
	uint32_t RequestedPower; //1W/bit
	uint16_t RequestedVoltage; //1V/bit
	uint16_t RequestedCurrent; //0.1A/bit
	uint16_t MeasuredVoltage;  //1V/bit
	uint16_t MeasuredCurrent;  //0.1A/bit
	uint8_t  EnableOutput;
	uint8_t  outputEnabled;
    int16_t  UnmetDemand;
	uint16_t WantedCurrent; //0.1A/bit
	CONN_Error_t chargingError; // 0 if okay
	uint8_t EvConnected;

} ChargingConnector_t;


#pragma pack(pop)

extern ChargingConnector_t CONN;


void CONN_Init();
void CONN_Loop();
