/*
 * Config.h
 *
 *  Created on: 2019年4月23日
 *      Author: foluswen
 */
#ifndef CONFIG_H_
#define CONFIG_H_

//------------------------------------------------------------------------------
#include <stdint.h>

//------------------------------------------------------------------------------
//Dispenser simulation ev signal
//------------------------------------------------------------------------------
#define SIMULATION 0
//------------------------------------------------------------------------------
//independent common share memory key
//------------------------------------------------------------------------------
#define ShmCsuMeterKey                          2001
#define ShmCommonKey                            2002

//------------------------------------------------------------------------------
#define TOTAL_QUANTITY_GUN                      4               //Max Count

//------------------------------------------------------------------------------
//system  runtime state
//------------------------------------------------------------------------------
#define MODE_BOOT                               (0)
#define MODE_IDLE                               (1)
#define MODE_AUTHORIZING                        (2)
#define MODE_REASSIGN_CHECK                     (3)
#define MODE_REASSIGN                           (4)
#define MODE_PRECHARGE                          (5)
#define MODE_PREPARE_FOR_EV                     (6)
#define MODE_PREPARE_FOR_EVSE                   (7)
#define MODE_CHARGING                           (8)
#define MODE_TERMINATING                        (9)
#define MODE_COMPLETE                           (10)
#define MODE_ALARM                              (11)
#define MODE_FAULT                              (12)
#define MODE_RESERVATION                        (13)
#define MODE_BOOKING                            (14)
#define MODE_MAINTAIN                           (15)
#define MODE_DEBUG                              (16)
#define MODE_CCS_PRECHARGE_STEP0                (17)  // ready for ccs precharge processing, For D+ relay to precharge relay
#define MODE_CCS_PRECHARGE_STEP1                (18)  // waitting for ev board inform to enter to charging, For precharge relay to D+ relay
#define MODE_UPDATE                             (19)

#define GFD_WAIT                                (0)
#define GFD_PASS                                (1)
#define GFD_FAIL                                (2)
#define GFD_WARNING                             (3)

#define PRECHARGE_WAIT                          (0)
#define PRECHARGE_READY                         (1)
#define PRECHARGE_PRERELAY_PASS                 (2)
#define PRECHARGE_CHARELAY_PASS                 (3)

#define BOOTTING                                (0)
#define BOOT_COMPLETE                           (1)

//------------------------------------------------------------------------------
//common define
//------------------------------------------------------------------------------
#define ARRAY_SIZE(A)                           (sizeof(A) / sizeof(A[0]))

#define PASS                                    (1)
#define FAIL                                    (-1)

#define START                                   (1)
#define STOP                                    (0)

#define YES                                     (1)
#define NO                                      (0)

#define NORMAL                                  (0)
#define ABNORMAL                                (1)

#define EQUAL                                   (0)

#define NO_DEFINE                               (255)

#define MtdBlockSize                            (0x300000) //(0x600000)

//------------------------------------------------------------------------------
//gun temperatures
//------------------------------------------------------------------------------
#define GUN_OTP_VALUE                           (150)
#define GUN_OTP_RECOVERY                        (140)
#define UNDEFINED_TEMP                          (255)
#define TEMP_BOUNDARY                           (200)

#define WARN_LV_NL                              (0) //normal state
#define WARN_LV_WARN                            (1)
#define WARN_LV_ER                              (2) //emergency state

//------------------------------------------------------------------------------
enum _SYSTEM_STATUS {
    S_BOOTING = 0,
    S_IDLE,
    S_AUTHORIZING,
    S_REASSIGN_CHECK,
    S_REASSIGN,
    S_PREPARNING,
    S_PREPARING_FOR_EV,
    S_PREPARING_FOR_EVSE,
    S_CHARGING,
    S_TERMINATING,
    S_COMPLETE,
    S_ALARM,
    S_FAULT,
    S_RESERVATION,
    S_BOOKING,
    S_MAINTAIN,
    S_DEBUG,
    S_CCS_PRECHARGE_ST0,
    S_CCS_PRECHARGE_ST1,
    S_UPDATE,
    S_NONE,
};

enum _AC_SYSTEM_STATUS {
    AC_SYS_NONE = 0,
    AC_SYS_A,
    AC_SYS_B,
    AC_SYS_C,
    AC_SYS_D,
    AC_SYS_E
};

enum _GUN_TYPE {
    _Type_Chademo = 0,
    _Type_CCS_2,
    _Type_GB,
    _Type_AC,
};
enum _CCS_GUN_TYPE {
    _TYPE_CCS_NONE  = 0,
    _TYPE_CCS1_Natural,
    _TYPE_CCS1_Liquid,
    _TYPE_CCS2_Natural,
    _TYPE_CCS2_Liquid,
};
enum _LCM_INDEX {
    _LCM_INIT = 0x00,
    _LCM_IDLE = 0x01,
    _LCM_AUTHORIZING = 0x02,
    _LCM_AUTHORIZ_COMP = 0x03,
    _LCM_AUTHORIZ_FAIL = 0x04,
    _LCM_WAIT_FOR_PLUG = 0x05,
    _LCM_PRE_CHARGE    = 0x06,
    _LCM_CHARGING      = 0x07,
    _LCM_COMPLETE      = 0x08,
    _LCM_FIX           = 0x09,
#ifdef DD360Audi
    _LCM_SELECT_GUN    = 0x0A,
    _LCM_EMERGENCY     = 0x0B,
    _LCM_DISCONNECT    = 0x0C,
#else
    _LCM_EMERGENCY     = 0x0A,
#endif
    _LCM_NONE          = 0xFF,
};

enum _SELF_TEST_SEQ {
    _STEST_VERSION      = 0x00,
    _STEST_AC_CONTACTOR = 0x01,
    _STEST_PSU_DETECT   = 0x02,
    _STEST_PSU_CAP      = 0x03,
    _STEST_FAIL         = 0x04,
    _STEST_COMPLETE     = 0xEE,
};

enum _MODULE_PSU_WORK_STEP {
    INITIAL_START    = 0,
    GET_PSU_COUNT    = 1,
    GET_SYS_CAP      = 2,
    BOOTING_COMPLETE = 3,

    _WORK_CHARGING   = 10,

    _TEST_MODE       = 20,

    _NO_WORKING      = 254,
    _INIT_PSU_STATUS = 255,
};

enum _OFFLINE_POLICY {
    _OFFLINE_POLICY_LOCAL_LIST       = 0x00,
    _OFFLINE_POLICY_PHIHONG_RFID_TAG = 0x01,
    _OFFLINE_POLICY_FREE_CHARGING    = 0x02,
    _OFFLINE_POLICY_NO_CHARGING      = 0x03,
};

enum _REASSIGNED_RESOURCE_STEP {
    _REASSIGNED_NONE           = 0,  //
    _REASSIGNED_PREPARE_M_TO_A = 1,  // 系統收到需要降載需求 (輸出總電流降低),PSU Task 收到將狀態切換至下個狀態
    _REASSIGNED_GET_NEW_CAP    = 2,  // 充電中的重新取得屬於自己火線上的總能量並透過小板通知車端 - 超過10秒直接跳下一步
    _REASSIGNED_ADJUST_M_TO_A  = 3,  // 模塊重新分配完成
    _REASSIGNED_RELAY_M_TO_A   = 4,  // 切斷橋接的 Relay

    _REASSIGNED_PREPARE_A_TO_M = 11,
    _REASSIGNED_ADJUST_A_TO_M  = 12, // 模塊升壓
    _REASSIGNED_RELAY_A_TO_M   = 13, // 搭接橋接的 Relay
    _REASSIGNED_WAITING        = 14,
    _REASSIGNED_COMP           = 15,
};

enum _MAIN_CHARGING_MODE {
    _MAIN_CHARGING_MODE_MAX  = 0,
    _MAIN_CHARGING_MODE_AVER = 1,
};

enum _EXTRA_ERR_PROCESS {
    _EXTRA_ERR_PROCESS_NONE  = 0,
    _EXTRA_ERR_PROCESS_INUVP = 1,
    _EXTRA_ERR_PROCESS_INOVP = 2,
};

enum _CHARGER_TYPE {
    _CHARGER_TYPE_IEC = 0,
    _CHARGER_TYPE_UL  = 1,
};

enum _SYS_WIFI_MODE {
    _SYS_WIFI_MODE_DISABLE = 0,
    _SYS_WIFI_MODE_STATION = 1,
    _SYS_WIFI_MODE_AP      = 2,
};

enum _LED_INTENSITY_LV {
    _LED_INTENSITY_DARKEST   = 0,
    _LED_INTENSITY_MEDIUM    = 1,
    _LED_INTENSITY_BRIGHTEST = 2,
};

enum _CCS_COMM_PROTOCOL {
    _CCS_COMM_V2GMessage_DIN70121      = 0x01,
    _CCS_COMM_V2GMessage_ISO15118_2014 = 0x02,
    _CCS_COMM_V2GMessage_ISO15118_2018 = 0x03
};

enum _ETHERNET_USAGE {
    _ETHERNET_USAGE_NONE = 0,
    _ETHERNET_USAGE_LAN,
    _ETHERNET_USAGE_WIFI,
    _ETHERNET_USAGE_3G_4g,
};

enum _PRIMARY_CHECK_TAG {
    _PRIMARY_CHECK_TAG_AC_CONTACT   = 0,
    _PRIMARY_CHECK_TAG_MAIN_BREAKER = 1,
};

enum _CCS_VERSION_CHECK_TAG {
    _CCS_VERSION_CHECK_TAG_V015S0 = 0,
    _CCS_VERSION_CHECK_TAG_V013S0 = 1,
};

enum RELAY_STATUS_ERROR_INDEX {
    RELAY_SMR1_P_STATUS = 0,
    RELAY_SMR1_N_STATUS = 1,
    RELAY_SMR2_P_STATUS = 2,
    RELAY_SMR2_N_STATUS = 3,
    RELAY_PARA_P_STATUS = 4,
    RELAY_PARA_N_STATUS = 5,
};

enum RELAY_STATUS_ERROR_TYPE {
    RELAY_STATUS_ERROR_NONE    = 0,
    RELAY_STATUS_ERROR_WELDING = 10,
    RELAY_STATUS_ERROR_DRIVING = 11,
};

enum _CCS_TYPE {
    _CCS_TYPE_CCS1 = 0,
    _CCS_TYPE_CCS2 = 1,
};
enum _WEATHER_TYPE {
	_WEATHER_TYPE_SUN = 1,
	_WEATHER_TYPE_CLOUDY,
	_WEATHER_TYPE_RAIN,
	_WEATHER_TYPE_THUNDER,
	_WEATHER_TYPE_SNOW,
	_WEATHER_TYPE_FOG,
};
enum _CREDITCARD_STATUS {
	_CREDITCARD_IDLE,
	_CREDITCARD_PREAUTH,
	_CREDITCARD_PREAUTHCOMPLETE,
	_CREDITCARD_CANCEL,
	_CREDITCARD_SETTLEMENT,
	_CREDITCARD_START,
};
//------------------------------------------------------------------------------
//struct StructMeter {
//    float curMeterValue;
//    float newMeterValue;
//    uint8_t isCalculation;
//    float _chargingValue;
//    float _curTotalCharging;
//};

//struct MeterInformation {
//    struct StructMeter _meter[2];
//    uint8_t isWorking;
//};

//struct DcCommonInformation {
//    // check if the guns are of the same type
//    uint8_t SysGunAreSameType;
//    // to check the ccs version
//    uint8_t CcsVersion;
//    // for relay welding/driving check
//    char RelayCheckStatus[6];
//    char GunRelayWeldingOccur[2];
//    char GunRelayDrivingOccur[2];
//};

typedef union {
    uint32_t GunErrMessage;
    struct {
        // Chademo
        uint8_t ChaGfdTrip: 1;
        uint8_t ChaUvpFail: 1;
        uint8_t ChaConnectOTP: 1;
        uint8_t ChaConnectOVP: 1;
        uint8_t ChaGfdWarning: 1;
        uint8_t ChaRelayWeldingFault: 1;
        uint8_t ChaRelayDrivingFault: 1;
        uint8_t ChaConnectTempSensorFail: 1;

        // CCS
        uint8_t CCSGfdTrip : 1;
        uint8_t CCSUvpFail : 1;
        uint8_t CCSConnectOTP : 1;
        uint8_t CCSConnectOVP : 1;
        uint8_t CCSGfdWarning : 1;
        uint8_t CCSRelayWeldingFault : 1;
        uint8_t CCSRelayDrivingFault : 1;
        uint8_t CCSConnectTempSensorFail : 1;

        // GBT
        uint8_t GBTGfdTrip : 1;
        uint8_t GBTUvpFail : 1;
        uint8_t GBTConnectOTP : 1;
        uint8_t GBTConnectOVP : 1;
        uint8_t GBTGfdWarning : 1;
        uint8_t GBTRelayWeldingFault : 1;
        uint8_t GBTRelayDrivingFault : 1;
        uint8_t GBTConnectTempSensorFail : 1;
    } GunBits;
} EvBoardErrMsg;

typedef union {
    uint8_t AlarmState;
    struct {
        uint8_t EmergencyStop: 1;    //Power cabinet emergency stop
        uint8_t DoorOpen: 1;         //Power cabinet emergency door open
        uint8_t DcInputOVP: 1;
        uint8_t DcInputUVP: 1;
        uint8_t SystemL1InputOVP: 1; //Power cabinet system L1 input OVP
        uint8_t SystemL2InputOVP: 1; //Power cabinet System L2 input OVP
        uint8_t SystemL3InputOVP: 1; //Power cabinet System L3 input OVP
        uint8_t PsuFailure: 1;       //Power cabinet PSU Failure Alarm
    } StatusBit;
} PowerAlarmState;

typedef union {
    uint8_t TempErrMsg;
    struct {
        uint8_t ChillerOTP: 1;            //chiller Temperature OVP
        uint8_t ChillerTempSensorFail: 1; //Chiller temperature sensor failure
        uint8_t ChillerTubeOTP : 1;
        uint8_t Reserved: 5;
    } StatusBit;
} ChillerTempErr;

typedef struct StChillerValve {
    uint8_t MultiChillerGun; //0x80, 0: 沒有水冷槍, 1: 有水冷槍, 0x7F: 紀錄水冷槍數
    uint8_t LeftTemp;  //左槍最高溫度
    uint8_t RightTemp; //右槍最高溫度
    uint8_t Reserved;
} ChillerValve;

typedef struct StPcPsuOutput { //from power cabinet PSU output
    uint16_t Voltage;
    uint16_t Current;
} PcPsuOutput;

typedef struct StPowerConsumptionInfo {
    float Gun1_Consumption;
    float Gun2_Consumption;
    float Gun3_Consumption;
    float Gun4_Consumption;
} PowerConsumptionValue;

typedef struct StPowConsumValue {
    uint32_t Gun1_Consumption;
    uint32_t Gun2_Consumption;
    uint32_t Gun3_Consumption;
    uint32_t Gun4_Consumption;
} PowConsumValue;

typedef struct StGunInfo {
    int ConnectorID;
    char ReceiptInfo[255];
    int finalcost_flag;
    time_t EVLoseTimer;
    uint8_t EVLoseFlag;
    char ReservationID[32];
    uint8_t ReservationStatus;
    char UserPriceString[255];
    float PowerConsumption;
    time_t RecordEnergyTime;
    char ChargeStartTime[32];
    char ChargeStopTime[32];
    char ChargeDuration[32];
    uint8_t withChiller;      //是否有水冷機
} GunInfo;

typedef struct Psu_VersionInfo{
	uint8_t n_PSU;
	uint8_t DCVersion[32];
	uint8_t FPCVersion[32];
}PsuVerInfo;

enum _LCM_UPGRADE_RESULT {
    _LCM_UPGRADE_RESULT_WAIT = 0,
    _LCM_UPGRADE_RESULT_PASS,
    _LCM_UPGRADE_RESULT_FAIL,
};

typedef struct stTransInfo
{
	unsigned char TransDate[6];	//交易日期
	unsigned char TransTime[6];	//交易時間
	unsigned char ROC[12];		//EDC簽單調閱編號 (左靠右補空白)
	unsigned char ApprovalNo[9];		//授權碼[信用卡退貨交易] (左靠右補空白)
	unsigned char StoreId[18];		//櫃號,機號,發票號碼(左靠右補空白)
	unsigned char RRN[12];		//信用卡交易序號
	unsigned char CardNo[20];		//卡號(左靠右補空白),卡號部份隱藏
	unsigned char TransAmount[12];		//交易金額
	unsigned char VemData[64];		//無人自助設備交易資訊 交易別31/32 (預授權完成/預授權取消) 必要欄位 資訊來源為交易別13 (預授權)的回傳
}TransInfo;

typedef struct stRecordTransactionInfo
{
	int TransactionId;
    unsigned char DeductResult;                     // 0: Fail, 1: Pass
    unsigned char IsDonateInvoice;                  // 0: Do not donate, 1: Donate
    unsigned char ApprovalNo[9];
    unsigned char CardNo[20];		//卡號(左靠右補空白),卡號部份隱藏
    unsigned char VemData[64];
    float Amount;
    unsigned char IsUpload; // 0: not upload, 1: uploaded
    unsigned char res;
}RecordTransactionInfo;

typedef struct StDcCommonInfo {
    uint8_t RebootCount;
    uint8_t CcsVersion;
    EvBoardErrMsg ConnectErrList[2]; //connector error list, 0: left gun, 1: right gun
    uint8_t CheckRelayStatus[6]; //check Relay welding or driving fault
    uint8_t GunRelayWeldingOccur[2];
    uint8_t GunRelayDrivingOccur[2];
    uint8_t ConnectorTemp[2][2];
    uint8_t SystemTemp[4];
    uint8_t SystemModeChange[2]; //for Module_EvRxComm
    PowerAlarmState PowerAlarmState;
    ChillerTempErr ChillerTempErr[2];
    ChillerValve ChillerValve;
    uint8_t TestTemperature; //ReadCmdline test, manual input value
    uint8_t CcsTypeSaved[2];
    PcPsuOutput PcPsuOutput[2];
    uint8_t chillerCtrl;
    uint8_t debugflag;
    uint8_t LcmFwVersion;
    int TZOffset;
    uint8_t AuthroizeType; // 0: Central   1: eMAID    2: ISO14443 3: ISO15693 4: KeyCode  5: Local    6: MacAddress   7: NoAuthorization
    char QRCodeString[255];
    char DefaultPriceString[255];
    PowerConsumptionValue pConsumption;
    int WeatherID;
    float Temperature;
    int Location;
    GunInfo pGunInfo[2];
    uint8_t showNetPackage;
    uint8_t showCanPackage;
} DcCommonInfo;

#endif /* CONFIG_H_ */