#ifndef _MODULE_INTERNAL_COMM_H_
#define _MODULE_INTERNAL_COMM_H_

//------------------------------------------------------------------------------
#define RELAY_CHECK_TIME                        (5)       // s
#define OUTPUT_VOL_CHK_TIME                     (200)     // ms
#define TEN_MINUTES                             (600)     // s
#define FORCE_STOP_TIME                         (30)
//#define TEN_MINUTES                             5
#define ENV_TEMP_MIN                            (45)
#define ENV_TEMP_MAX                            (50)
#define DEFAULT_AC_INDEX                        (2)
#define COLOR_MAX_LV                            (100)
#define COLOR_MIN_LV                            (0)

#define AC_DEFAULT_VOL                          (220)

#define NDEFAULT_AC_INDEX                       (2)

#define OVP_UVP_CHK_COUNT                       (3)

#define VIN_MAX_VOLTAGE_IEC                     (285) // 大於該值 : OVP
#define VIN_MAX_REV_VOLTAGE_IEC                 (275) // 小於賦歸 OVP
#define VIN_MIN_VOLTAGE_IEC                     (160) // 小於該值 : UVP
#define VIN_MIN_REV_VOLTAGE_IEC                 (170) // 大於賦歸 UVP

#define VIN_MAX_VOLTAGE_UL                      (315) // 大於該值 : OVP // 美規 (W)
#define VIN_MAX_REV_VOLTAGE_UL                  (305) // 小於賦歸 OVP
#define VIN_MIN_VOLTAGE_UL                      (210) // 小於該值 : UVP
#define VIN_MIN_REV_VOLTAGE_UL                  (220) // 大於賦歸 UVP

#define VIN_DROP_VOLTAGE                        (150) // 小於該值 : ac drop

#define VOUT_MAX_VOLTAGE                        (995)
#define VOUT_MIN_VOLTAGE                        (150)
#define IOUT_MAX_CURRENT                        (50)

#define MAX_FAN_SPEED                           (14000)
#define MIN_FAN_SPEED                           (3000)
#define NORMAL_FAN_SPEED                        (7000)

// GFD Status
#define GFD_IDLE                                (0)
#define GFD_CABLECHK                            (1)
#define GFD_PRECHARGE                           (2)
#define GFD_CHARGING                            (3)

// LED Intensity (rate)
#define LED_INTENSITY_DARKEST                   (0.2)
#define LED_INTENSITY_MEDIUM                    (0.6)
#define LED_INTENSITY_BRIGHTEST                 (1)

// EE Spec
#define LED_BRIGHTNESS_LV_HIGH                  (1)
#define LED_BRIGHTNESS_LV_MID                   (0.5)
#define LED_BRIGHTNESS_LV_LOW                   (0.2)

// 最小切換 Relay 電壓
#define SELF_TO_CHANGE_RELAY_STATUS             (600)
// 透過電壓確認 Relay 是否搭上的依據電壓
#define CHECK_RELAY_STATUS                      (300)
#define CHECK_RELAY_STATUS_GAP                  (100)
// 安全在停止充電程序中斷開 Relay 的電流
#define SEFETY_SWITCH_RELAY_CUR                 (50)//20 DS60-120 modify
// 確認 Relay Welding 電壓
#define RELAY_WELDING_DET                       (300)

#define AC_OVP                                  (1)
#define AC_UVP                                  (2)
#define AC_OCP                                  (4)
#define AC_OTP                                  (8)
#define AC_GMI_FAULT                            (16)
#define AC_CP_ERROR                             (32)
#define AC_AC_LEAKAGE                           (64)
#define AC_DC_LEAKAGE                           (128)
#define AC_SYSTEM_SELFTEST_FAULT                (256)
#define AC_HANDSHAKE_TIMEOUT                    (512)
#define AC_EMC_STOP                             (1024)
#define AC_RELAY_WELDING                        (2048)
#define AC_GF_MODULE_FAULT                      (4096)
#define AC_SHUTTER_FAULT                        (8192)
#define AC_LOCKER_FAULT                         (16384)
#define AC_POWER_DROP                           (32768)
#define AC_CIRCUIT_SHORT                        (65536)
#define AC_ROTARY_SWITCH_FAULT                  (131072)
#define AC_RELAY_DRIVE_FAULT                    (262144)

#define log_info(format, args...) StoreLogMsg("[%s:%d][%s][Info] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
#define log_warn(format, args...) StoreLogMsg("[%s:%d][%s][Warn] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
#define log_error(format, args...) StoreLogMsg("[%s:%d][%s][Error] "format, __FILE__, __LINE__, __FUNCTION__, ##args)

//------------------------------------------------------------------------------

typedef struct StGunPNState {
    uint8_t GunP: 1;
    uint8_t GunN: 1;
    uint8_t Reserved: 6;
} GunPNState;

typedef struct StPreCharginState {
    uint8_t AcContactor : 1;     //bit 0
    uint8_t CcsPrecharge : 1;    //bit 1
    uint8_t Reserved: 6;
} PreChargingState;

//------------------------------------------------------------------------------
unsigned long GetTimeoutValue(struct timespec _start_time);
void GetClockTime(struct timespec* _now_time, void* null);
int DiffTimeb(struct timeb ST, struct timeb ET);

#endif /* _MODULE_INTERNAL_COMM_H_ */