#ifndef _EV_COMM_H_
#define _EV_COMM_H_

#include <stdbool.h>
#include <stdint.h>

//------------------------------------------------------------------------------
//EV command address
//------------------------------------------------------------------------------
#define CMD_NONE                                (0)
#define CMD_ADDR_ASSIGNMENT                     (0x00000200)
#define CMD_GET_FW_VER                          (0x00000400)
#define CMD_GET_HW_VER                          (0x00000500)
#define CMD_CHARGING_PERMISSION                 (0x00000600)
#define CMD_PRESENT_OUTPUT_POWER                (0x00000700)
#define CMD_PRESENT_OUTPUT_CAPABILITIES         (0x00000800)
#define CMD_GET_OUTPUT_REQ                      (0x00000900)
#define CMD_GET_BATTERY_INFO                    (0x00000A00)
#define CMD_EVSE_STOP_CHARGING                  (0x00000C00)
#define CMD_GET_MISC_INFO                       (0x00000D00)

#define CMD_DOWNLOAD_REQ                        (0x00000E00)
#define CMD_START_BLOCK_TRANS                   (0x00000F00)
#define CMD_DATA_TRANS                          (0x00001000)
#define CMD_DOWNLOAD_FINISH                     (0x00001100)

#define CMD_ISOLATION_STATUS                    (0x00001200)
#define CMD_SYNC_RTC                            (0x00001400)
#define CMD_EVSE_PRECHARGE                      (0x00001500)
#define CMD_EVCCID_REQ                          (0x00001600)

// 車端主動
#define ADDRESS_REQ                             (0x080001FF)
#define NOTIFICATION_EV_STATUS                  (0x08000300)
#define NOTIFICATION_EV_STOP                    (0x08000B00)

// 車端回應
#define ACK_EV_FW_VERSION                       (0x08000400)
#define ACK_EV_HW_VERSION                       (0x08000500)
#define ACK_GET_OUTPUT_REQ                      (0x08000900)
#define ACK_GET_EV_BATTERY_INFO                 (0x08000A00)
#define ACK_GET_MISCELLANEOUS_INFO              (0x08000D00)
#define ACK_EVSE_ISOLATION_STATUS               (0x08001200)
#define ACK_EVSE_PRECHAGE_INFO                  (0x08001500)
#define ACK_EVCCID_REQ                          (0x08001600)

//------------------------------------------------------------------------------
// Send msg to can-bus
void SetTargetAddr(uint8_t *target_number, uint8_t index);

void GetFirmwareVersion(uint8_t gunIndex, uint8_t toId);
void GetHardwareVersion(uint8_t gunIndex, uint8_t toId);
void SyncRtcInfo(uint8_t gunIndex, uint8_t toId, int epoch);
void SetChargingPermission(uint8_t gunIndex, uint8_t permissionStatus, uint16_t aOutputPw, uint16_t aOutputVol, uint16_t aOutputCur, uint8_t toId);
void SetPresentOutputPower(uint16_t outputVol_b1, uint16_t outputCur_b1, uint16_t outputVol_b2, uint16_t outputCur_b2);
void SetPresentOutputCapacity(uint16_t aOutputPw_b1, uint16_t aOutputCur_b1, uint16_t aOutputPw_b2, uint16_t aOutputCur_b2);
void GetOutputReq(uint8_t gunIndex, uint8_t toId);
void GetEvBatteryInfo(uint8_t gunIndex, uint8_t toId);
void GetMiscellaneousInfo(uint8_t gunIndex, uint8_t relayStatus, float power, float voltage, uint8_t toId);
void SetIsolationStatus(uint8_t gunIndex, uint8_t result, uint8_t toId);
void SetEvsePrechargeInfo(uint8_t gunIndex, uint8_t result, uint8_t toId);
// 發送電樁主動停止充電結果及原因
void EvseStopChargingEvent(uint8_t stopResult, uint8_t *stopReason, uint8_t toId);
void GetEVCCIDReq(uint8_t gunIndex, uint8_t toId);

#endif /* _EV_COMM_H_ */