#ifndef PLATMACRO_DEF_H__
#define PLATMACRO_DEF_H__

/************************************************************************************************
            !!!!!!!!!该文件不可以自定义/类型定义前缀需要加上Std!!!!!!!!!!!!
**************************************************************************************************/
#include <stdio.h>
#include <stdint.h>
#ifndef WIN32
#ifndef UNIT_TEST
#include <stdbool.h>
#endif
#endif

#define BIG_ENDIAN_TYPE    0
#define LITTLE_ENDIAN_TYPE 1

#define HOST_ENDIAN_TYPE  LITTLE_ENDIAN_TYPE
#ifdef UNIT_TEST
#ifdef HOST_ENDIAN_TYPE
#define HOST_ENDIAN_TYPE  LITTLE_ENDIAN_TYPE
#else
#define HOST_ENDIAN_TYPE  LITTLE_ENDIAN_TYPE
#endif
#endif


#ifndef NULL
#define NULL (void *)0
#endif

typedef void *              QueSet_Handle;
typedef signed int          Std_Base_Type;
typedef signed int          Std_Param_Type;
typedef signed int          Std_HighVInfor_Type;
typedef signed int          Std_Bat_Infor_Type;
typedef signed int          Std_Alarm_State_Type;
typedef signed int          Std_Fault_State_Type;
typedef unsigned short      Std_State_Type;
typedef unsigned short      Std_DrvCfg_Type;
typedef signed int          Std_Swc_Para_Type;
typedef signed short        Std_Sample_Type;
typedef unsigned short      Std_Io_Type;
typedef signed int          Std_Ret_Type;
typedef signed int          Std_Swc_State_Type;
typedef signed short        Std_Bat_Temp_Type;
typedef unsigned short      Std_Bat_Vol_Type;
typedef unsigned int        Std_Addr_Type;
typedef unsigned int        Std_Size_Type;
typedef unsigned int        Rte_Component;
typedef unsigned int        Std_Env_Para_Type;
typedef unsigned char       Std_Buf_Type;
typedef void*               Event_Handle;
typedef void*               Mux_Handle;
typedef void*               Semaphore_Handle;
typedef signed int          Tick_Type;
typedef void *              Timer_Handle;
typedef Std_Io_Type          Std_IOSignal_Type;
typedef signed short        Std_Alarm_Limit_Type;
typedef unsigned int        Std_Error_Code_Type;
typedef unsigned int        ComIf_Handle_Type;
typedef void *              Fifo;


typedef struct
{
    Std_Base_Type evId;
    Std_Base_Type evSubId;
    Std_Base_Type evPara1;
}Std_Event_Type;


typedef struct
{
    unsigned char status;
    unsigned char trgCnt;
    Std_HighVInfor_Type value;
}Std_HighVInfor_Status_Type;


typedef struct
{
    unsigned char status;
    unsigned char trgCnt;
    Std_Sample_Type value;
}Std_Sample_Status_Type;

typedef struct _ComIf_Infor  ComIf_Infor;
typedef struct _tag_ComIfData ComIfData;

typedef enum
{
    ComIf_Can,
    ComIf_Uart
}ComIf_Type;

#define COMIF_INFOR_IDE_ORDER_MASK        0x01
#define COMIF_INFOR_IDE_ORDER_SHIFT       8
#define COMIF_INFOR_IDE_IDE_MASK          0xFF
#define COMIF_INFOR_IDE_IDE_SHIFT         0

struct _ComIf_Infor
{
    Std_Base_Type id;
    Std_Base_Type type;
	Std_Base_Type ide;                  /*bit0~7:ide   bit8:标识是否需要按照顺序发送CAN消息 0:不需要 1:需要*/
};
struct _tag_ComIfData
{
    ComIf_Handle_Type retHandle;
    /*
        *用来携带CANID或者其他必要的信息
    */
    ComIf_Infor infor;
    Std_Size_Type retSize;
    Std_Size_Type bufSize;
    Std_Buf_Type *buffer;
};

typedef enum
{
    Std_Status_Invalid = 0,
    Std_Status_Valid   = 1
}Std_Status_Enum;

typedef enum
{
    Std_False = 0,
    Std_True  = 1
}Std_Bool_Enum;

typedef enum
{
    Std_Low = 0,
    Std_High  = 1
}Std_Level_Enum;

typedef enum
{
    NORMAL_STATE,
    ALARM_STATE,
    UNKNOWN_STATE
}ALARM_STATE_ENUM;


typedef enum
{
    ERROR_CODE_SEND_DISABLE,
    ERROR_CODE_SEND_ENABLE,
}Error_Code_Enable_Enum;

typedef unsigned int    Rte_Event;
typedef void (*TaskEntry)(void *param);
typedef int32_t (*BUF_CALLBACK_FUNC)(uint8_t *buf, uint32_t length);		/*传输层回调注册*/
typedef int32_t (*UPDATE_CALLBACK_FUNC)(uint16_t *buf, uint32_t length);	/*BSW层update数据到rte层*/
typedef Std_Bool_Enum (*PREPARE_CHECK)(void);						/*采样之前的检测步骤1*/
typedef Std_Bool_Enum (*START_CHECK)(uint16_t *sampleValue);	/*启动采样时的检测步骤2*/
typedef Std_Bool_Enum (*READ_CHECK)(void);							/*读取采样时的检测步骤3*/

typedef enum
{
    EEPROM_STATE_INIT,
    EEPROM_STATE_OK,
    EEPROM_STATE_ERR
}EEPROM_STATE_ENUM;

typedef enum{
    EEPROM_RECORD_TYPE_ALARM,     /*报警数据存储*/
    EEPROM_RECORD_TYPE_TIMING,   /*定时存储,目前被RCM记录占用 */
    EEPROM_RECORD_TYPE_RESET,    /*复位存储*/
    EEPROM_RECORD_TYPE_ABNORMAL, /*异常存储*/
    EEPROM_RECORD_TYPE_OCV,      /*OCV存储*/
    EEPROM_RECORD_TYPE_BAT_INFO, /*电池信息*/
    EEPROM_RECORD_TYPE_ERRCODE,  /*电池故障码*/
    EEPROM_RECORD_TYPE_BUTT
}EEPROM_RECORD_TYPE_ENUM; /*data[1] for eeprom record*/


#define CAN_SEND_BY_ORDER_ENABLE 0x5A
typedef struct
{
  uint32_t CanId;  /*!< Specifies the extended identifier.
                        This parameter can be a value between 0 to 0x1FFFFFFF. */

  uint8_t IDE;     /*!< Specifies the type of identifier for the message that will be transmitted.
                        This parameter can be a value of @ref CAN_identifier_type */

  uint8_t RTR;     /*!< Specifies the type of frame for the message that will be transmitted.
                        This parameter can be a value of @ref CAN_remote_transmission_request */

  uint8_t DLC;     /*!< Specifies the length of the frame that will be transmitted.
                        This parameter can be a value between 0 to 8 */
#if 0
  uint8_t reserve; /*for pack*/
#else
  uint8_t order;        /*该CAN消息是否为保序的消息 5A 表示保序号*/
#endif
  uint8_t Data[8]; /*!< Contains the data to be transmitted. It ranges from 0 to 0xFF. */
}CanMsg;

#define Std_Ret_OK     0
#define Std_Ret_ERR   -1
#define Ptr_Null        (void *)0
#define VIRTUAL_PTR     (void *)0

typedef enum {Std_RESET = 0, Std_SET = 1} Std_FlagStatus, Std_ITStatus;
typedef enum {Std_DISABLE = 0, Std_ENABLE = 1} Std_State;

#if (defined(CPU_S32K148) || defined(CPU_S32K144))
#define CAN_ID_STD                 ((uint32_t)0x00000000)  /*!< Standard Id */
#define CAN_ID_EXT                 ((uint32_t)0x00000008)  /*!< Extended Id */
#else
#define CAN_ID_STD                  (0x00000000U)  /*!< Standard Id */
#define CAN_ID_EXT                  (0x00000004U)  /*!< Extended Id */
#endif

typedef enum
{
    REG_OPERA_READ = 0,
    REG_OPERA_WRITE = 1
}REG_OPERA_TYPE_ENUM;

typedef enum
{
    GATHER_INVALID_FLAG = 0,
    GATHER_VALID_FLAG = 1
}GATHER_FLAG_ENUM;

typedef enum
{
    BMS_CTRL_RELAY_ON_OFF = 0,  /*BMS自身控制接触器通断*/
    VCU_CTRL_RELAY_ON = 1,      /*VCU控制接触器闭合*/
    VCU_CTRL_RELAY_OFF = 2,     /*VCU控制接触器断开*/
    VCU_CTRL_RELAY_INIT = 3     /*VCU控制接触器初始化模式*/
}RELAY_CTRL_STATE_ENUM;

typedef enum
{
    SWITCH_STATE_ON = 1,        /*修改接触器控制默认状态，统一ON与Std_High，OFF与Std_Low，2018-04-28 zwq*/
    SWITCH_STATE_OFF = 0,
}SWITCH_STATE_ENUM;

typedef enum
{
    MAIN_SWITCH,
    MAIN_NEGETIVE_SWITCH,

    MAIN_SWITCH_BUTT,
}MAIN_SWITCH_ENUM;




typedef enum
{
    POWER_ON,
    POWER_OFF,
    POWER_MODE_BUF
}POWER_ON_OFF_MODE_ENUM;

typedef enum
{
    BMS_MODULE_IDLE_STATE,
    BMS_MODULE_WORK_STATE,
    BMS_MODULE_ERR_STATE,

    BMS_MODULE_STATE_BUTT
}BMS_MODULE_STATE_ENUM;

typedef enum
{
    PROCESS_MODE_NORAML,
    PROCESS_MODE_NUM_CONFIGURABLE,
    PROCESS_MODE_CHARGE_ONLY,
    PROCESS_MODE_DISCHARGE_ONLY
}ALG_RESULT_PROCESS_ENUM;/*主动组间算法处理模式*/

typedef enum
{
    KEY_LIB_CONFIG_DEV_ID,          /*设备id*/
    KEY_LIB_CONFIG_DEV_TYPE,        /*设备类型*/
    KEY_LIB_CONFIG_DEV_LEVEL,       /*设备所在网络中的层级*/
    KEY_LIB_CONFIG_HIGH_CAN_PORT,   /*设备向上转发CAN端口号*/
    KEY_LIB_CONFIG_LOW_CAN_PORT,    /*设备向下转发CAN端口号*/
    KEY_LIB_CONFIG_HIGH_UART_PORT,  /*设备向上转发UART端口号*/
    KEY_LIB_CONFIG_LOW_UART_PORT,   /*设备向下转发UART端口号*/
    KEY_LIB_CONFIG_BUTT
} KEY_LIB_CONFIG;


#ifdef WIN32
#define UartPrintf printf
#else
#define UartPrintf(...)
#endif


typedef enum
{
    Eeprom_Deft_Para_None = 0,
    Eeprom_Deft_Para_User = 1,      /*通用参数*/
    Eeprom_Deft_Para_Admin = 2,     /*通用参数 + 报警参数*/
    Eeprom_Deft_Para_Super = 3,     /*通用参数+报警参数*/
    Eeprom_Deft_Para_God = 4,       /*校准参数+存储容量+放置参数恢复+其他全部参数*/

    Eeprom_Deft_Para_Butt = 5
}Eeprom_Deft_Para_Level;

/* \brief the data informations.*/
typedef struct
{
    uint16_t did;                   /**< data did.*/
    uint16_t memId;                 /**< the memory id of data.*/
    Std_Base_Type level;            /**< param level*/
    Std_Addr_Type localAddr;        /**< the memory local offset of data.*/
    Std_Size_Type size;             /**< the size of data.*/
    Std_Param_Type  defData;         /**< the default data.*/
}Rte_Param_Infor_Stru;

/* \brief the list of the data informations.*/
typedef struct
{
    uint16_t number;          /**< the number of data managed by module.*/
    const Rte_Param_Infor_Stru *dataList;  /**< the data information list.*/
}Rte_Param_Infor_List;

typedef struct
{
    uint16_t did;                   /**< data did.*/
    uint16_t memId;                 /**< the memory id of data.*/
    Std_Base_Type level;            /**< param level*/
    Std_Addr_Type localAddr;        /**< the memory local offset of data.*/
    Std_Size_Type size;             /**< the size of data.*/
    Std_Param_Type  defData;         /**< the default data.*/
    Std_Bool_Enum isNeedRecord;
}Rte_SystemParam_Infor_Stru;

typedef struct
{
    uint16_t number;          /**< the number of data managed by module.*/
    const Rte_SystemParam_Infor_Stru *dataList;  /**< the data information list.*/
}Rte_SystemParam_Infor_List;

typedef Rte_Param_Infor_Stru  Ecu_Para_Infor_Stru;
typedef Rte_Param_Infor_List  Ecu_Para_Infor_List;


#include "toolkit.h"
#endif /*__PLATMACRO_DEF_H*/




