#ifndef _MCU_CORE_PROTOCOL_H_
#define _MCU_CORE_PROTOCOL_H_

#include "stdint.h"

#define CORE_Timeout_CNT       1000u    //单位20ms,20超时
#define TEL_DATA_PROTOCOL_ID   0x01     //指示灯、菜单
#define WIN_DATA_PROTOCOL_ID   0x02     //行车电脑显示信息 
#define TPMS_PROTOCOL_ID       0x03     //胎压显示信息
#define CHECK_CODE_ID          0x06     //校验字符串

#define SOC_START_PROTOCOL_ID  0x10     // SOC启动后,发送此报文,需MCU回复0x20
#define SOC_HEART_PROTOCOL_ID  0x12
#define MCU_SOC_PROTOCOL_ID    0x20    //收到SOC发送的0x10后,回复此ID

// #define WIN_LEFT_SWITCH_ID     (0x04) 
// #define WIN_LEFT_MUSIC_ID      (0x05) 
// #define WIN_LEFT_RADIO_ID      (0x06) 
// #define WIN_LEFT_BLUETOOTH_ID  (0x07) 
// #define WIN_LEFT_NAVI_ID       (0x08) 

typedef enum
{
    CheckON,
    CheckOFF,    
} enSelfCheck_t;

typedef enum
{
    Soc_Startup = 0u, /**<启动中...*/
    Soc_Run,          /**<运行中...*/
    Soc_Timeout,      /**<启动超时*/
} SOC_Status;

typedef enum
{
    Win_IGNON,
    Win_IGNOFF,
    Win_Debug,
} enWinType_t;

typedef enum
{
    Anim_None,
    Anim_Startup,
    Anim_Shutdown,
} enAnimType_t;

/****************************************************
0x01 报警灯或指示符号 菜单信息(50ms)
****************************************************/
typedef struct 
{
    uint8_t u8Interface     : 2; /**< 显示界面 */
    uint8_t u8SelfCheck     : 1; /**< 自检 (0-自检开始 1-自检结束) */
    uint8_t u8Language      : 1; /**< 语言 (0-中文 1-英文) */
    uint8_t u8Theme         : 2; /**< 主题 */
    uint8_t u8ThemeColour   : 2; /**< 颜色 */

    uint8_t u8LowFuel       : 1; /**< 燃油低指示灯 */
    uint8_t u8ABS           : 1; /**< ABS/HBB故障 */
    uint8_t u8SmartLock     : 1; /**< 智能锁指示灯 */
    uint8_t u8EfiFault      : 1; /**< 电喷故障指示灯 */
    uint8_t u8HiBeam        : 1; /**< 远光灯 */
    uint8_t u8Position      : 1; /**< 位置灯 */
    uint8_t u8Right         : 1; /**< 右转灯 */
    uint8_t u8Left          : 1; /**< 左转灯 */

    uint8_t u8AutoStartStop : 1; /**< 自动启停 */
    uint8_t u8LowPower      : 1; /**< 电池电压低报警灯 */
    uint8_t u8TCS           : 1; /**< TCS指示灯 */
    uint8_t u8TPMS          : 1; /**< 胎压报警灯 */    
    uint8_t u8BlueTooth     : 1; /**< 蓝牙显示*/
    uint8_t u8Gears         : 1; /**< 1~6挡位指示灯*/
    uint8_t u8NeutralLight  : 1; /**< 空挡指示灯*/
    uint8_t u8HiTemp        : 1; /**< 水温指示灯 */
    
    uint8_t u8SentryKey     : 1; /**< 钥匙防盗 */
    uint8_t u8WIFI          : 7; /**< WIFI */

    uint8_t u8BlueControl   : 8; /**<  蓝牙控制 */
    uint8_t u8ZoneB_B       : 8; /**<  指示灯B区位置B预留 */
    uint8_t u8ZoneB_C       : 8; /**<  指示灯B区位置C预留 */
}Protoco_Telltales_st_t;

typedef struct 
{
    uint8_t u8Subject       :8; /**<  主题选择光标位置 */
    uint8_t u8Mode          :8; /**<  黑天白天模式选择 */
}Subject_Mode;

typedef struct 
{
    uint8_t u8Option        :8; /**<  二级菜单光标位置 */
    uint8_t u8Link          :4; /**<  蓝牙链接状态显示 */
    uint8_t u8LinkName      :4; /**<  蓝牙名称是否显示 */
}Blue_Tooth_Setting;

typedef struct 
{
    uint8_t u8TPMSPosition  :4; /**<  胎压二级菜单光标位置 */
    uint8_t u8TPMSUnit      :4; /**<  胎压单位 */

    uint8_t u8FrontStudyStatus :4; /**<  胎压学习前轮学习状态 */
    uint8_t u8BackStudyStatus  :4; /**<  胎压学习后轮学习状态 */

    uint8_t u8FrontHPressure :8; /**<  前轮胎压数值高字节 */
    uint8_t u8FrontLPressure :8; /**<  前轮胎压数值低字节 */
    uint8_t u8BackHPressure  :8; /**<  后轮胎压数值高字节 */
    uint8_t u8BackLPressure  :8; /**<  后轮胎压数值低字节 */
    uint8_t u8SensorHID      :8; /**<  传感器ID高字节 */
    uint8_t u8SensorHCID     :8; /**<  传感器ID中高字节 */
    uint8_t u8SensorLCID     :8; /**<  传感器ID低高字节 */
    uint8_t u8SensorLID      :8; /**<  传感器ID低字节 */
}TPMS_Study;

typedef struct 
{
    uint8_t u8Code           :8; /**<  二维码显示类型 */
}QR_Code;

typedef struct 
{
    uint8_t u8Backlight      :8; /**<  背光等级 */
}Backlight_Class;

typedef struct 
{
    uint8_t u8Version            :8; /**<  二级菜单光标位置 */

    uint8_t u8SoftYearH          :8; /**<  软件版本年高字节 */
    uint8_t u8SoftYearL          :8; /**<  软件版本年低字节 */
    uint8_t u8SoftMonth          :8; /**<  软件版本月字节 */

    uint8_t u8SoftDay            :6; /**<  软件版本日字节 */
    uint8_t u8SoftVDisplay       :2; /**<  软件字母V显示 */

    uint8_t u8SoftVersionH       :7; /**<  软件高版本号 */
    uint8_t u8SoftDotHDisplay    :1; /**<  软件“.”显示(高版本号之后的) */

    uint8_t u8SoftVersionC       :7; /**<  软件中版本号 */
    uint8_t u8SoftDotCDisplay    :1; /**<  软件“.”显示(中版本号之后的) */

    uint8_t u8SoftVersionL       :8; /**<  软件低版本号 */

    uint8_t u8HardYearH          :8; /**<  硬件版本年高字节 */
    uint8_t u8HardYearL          :8; /**<  硬件版本年低字节 */
    uint8_t u8HardMonth          :8; /**<  硬件版本月字节 */

    uint8_t u8HardDay            :6; /**<  硬件版本日字节 */
    uint8_t u8HardVDisplay       :2; /**<  硬件字母V显示 */

    uint8_t u8HardVersionH       :7; /**<  硬件高版本号 */
    uint8_t u8HardDotHDisplay    :1; /**<  硬件“.”显示(高版本号之后的) */

    uint8_t u8HardVersionC       :7; /**<  硬件中版本号 */
    uint8_t u8HardDotCDisplay    :1; /**<  硬件“.”显示(中版本号之后的) */

    uint8_t u8HardVersionL       :8; /**<  硬件低版本号 */

    uint8_t u8BlueYearH          :8; /**<  蓝牙版本年高字节 */
    uint8_t u8BlueYearL          :8; /**<  蓝牙版本年低字节 */
    uint8_t u8BlueMonth          :8; /**<  蓝牙版本月字节 */

    uint8_t u8BlueDay            :6; /**<  蓝牙版本日字节 */
    uint8_t u8BlueVDisplay       :2; /**<  蓝牙字母V显示 */

    uint8_t u8BlueVersionH       :7; /**<  蓝牙高版本号 */
    uint8_t u8BlueDotHDisplay    :1; /**<  蓝牙“.”显示(高版本号之后的) */

    uint8_t u8BlueVersionC       :7; /**<  蓝牙中版本号 */
    uint8_t u8BlueDotCDisplay    :1; /**<  蓝牙“.”显示(中版本号之后的) */

    uint8_t u8BlueVersionL       :8; /**<  蓝牙低版本号 */
}Version;

typedef struct 
{
    uint8_t u8Clock              :8; /**<  光标位置 */
    uint8_t u8TimeAM_PM          :2; /**<  AM/PM显示 */
    uint8_t u8TimeFormat         :6; /**<  时钟亮灭 */
    uint8_t u8Hour               :8; /**<  小时数字 */
    uint8_t u8Minute             :8; /**<  分钟数字 */
    uint8_t u8Colon              :8; /**<  “:”亮灭 */
}Clock;

typedef struct 
{
    uint8_t u8UnitsSetup         :8; /**<  光标位置 */
}Units_Setup;

typedef struct 
{
    uint8_t u8Language           :8; /**<  光标位置 */
}Language;

typedef struct 
{
    uint8_t u8DVRSetTowLevel     :8; /**<  二级菜单光标位置 */
    uint8_t u8DVRSetThreeLevel   :8; /**<  三级菜单光标位置 */
    uint8_t u8DVRSet             :2; /**<  DVR是否可以设置 */
    uint8_t u8DVRSetStatus       :2; /**<  DVR是否可以设置 */
    uint8_t u8DVRSetFourLevel    :8; /**<  四级菜单光标位置以及选择 */
}DVRSet;

typedef struct 
{
    uint8_t u8Factory_Reset     :8; /**<  二级菜单光标位置以及选择 */
}Factory_Reset;

typedef struct 
{
    uint8_t u8MenuGrade      : 4; /**<  菜单级别 */
    uint8_t u8MenuStair      : 4; /**<  一级菜单 */
 
    Subject_Mode         stSubject_Mode ;   /**<  主题模式 */
    Units_Setup          stUnits_Setup;     /**<  单位设置 */
    Clock                stClock;           /**<  时钟信息 */
    Backlight_Class      stBacklight_Class; /**<  亮度设置 */
    TPMS_Study           stTPMS_Study;      /**<  胎压学习 */
    Language             stLanguage;        /**<  语言设置 */
    Blue_Tooth_Setting   stBlue_Tooth ;     /**<  蓝牙设置 */
    DVRSet               stDVR;             /**<  DVR */
    Version              stVersion;         /**<  版本信息 */
    Factory_Reset        stFactory_Reset;    /**<  恢复出厂设置 */
    QR_Code              stQR_Code;         /**<  手机互联 */
    
}Menu_Setting;

typedef union
{
    uint8_t                u8Msg[30];
    Protoco_Telltales_st_t stSig;
    Menu_Setting           stMenu;
}Protoco_Telltales_un_t;

/****************************************************
0x02 界面控制逻辑 (20ms)
****************************************************/

typedef union
{
    uint8_t      u8Msg[20];
    uint8_t      u8Speed          : 8; /**< 显示车速 */
 
    uint8_t      u8ESpeedH        : 6; /**< 转速高字节 */
    uint8_t      u8ESpeedColore   : 1; /**< 转速显示颜色 */
    uint8_t      u8SpeedUnit      : 1; /**< 车速单位 */
 
    uint8_t      u8ESpeedL        : 8; /**< 转速低字节 */
    uint8_t      u8CoolantSeg     : 6; /**< 水温段 */
    uint8_t      u8CoolantSegSign : 2; /**< 水温段开短路标志 */
    uint8_t      u8FuelSeg        : 6; /**< 燃油段 */
    uint8_t      u8FuelSegSign    : 2; /**< 燃油段开短路标志 */
    uint8_t      u8Resv1          : 8; /**< 占位 */
    uint8_t      u8Resv2          : 8; /**< 占位 */
 
    uint8_t      u8MileageH       : 4; /**< TOTAL里程高4位 */ 
    uint8_t      u8MileageUnit    : 2; /**< 里程单位 */ 
    uint8_t      u8MileageMode    : 2; /**< 里程显示 */ 
 
    uint8_t      u8MileageC       : 8; /**< TOTAL里程中8位 */ 
    uint8_t      u8MileageL       : 8; /**< TOTAL里程低8位 */ 
    uint8_t      u8TripAH         : 8; /**< 小计里程A高字节 */ 
    uint8_t      u8TripAL         : 8; /**< 小计里程A低字节 */ 
    uint8_t      u8TripBH         : 8; /**< 小计里程B高字节 */ 
    uint8_t      u8TripBL         : 8; /**< 小计里程B低字节 */ 
    uint8_t      u8PhoneH         : 8; /**< 来电号码高字节 */ 
    uint8_t      u8PhoneC         : 8; /**< 来电号码中字节 */ 
 
    uint8_t      u8EasyNavigation : 1; /**< 简易导航是否显示 */ 
    uint8_t      u8BlueDisplay    : 3; /**< 蓝牙电话控制显示 */ 
    uint8_t      u8PhoneL         : 4; /**< 来电号码低字节 */ 

    uint8_t      u8TimeFormat     : 2; /**< 时间制式 */ 
    uint8_t      u8TimeAM_PM      : 2; /**< AM/PM */ 
    uint8_t      u8Colon          : 4; /**<  “:”亮灭 */

    uint8_t      u8Hour           : 8; /**<  小时数字 */
    uint8_t      u8Minute         : 8; /**<  分钟数字 */
}Protoco_Display_Info_un_t;

/****************************************************
0x03 胎压控制逻辑 (20ms)
****************************************************/

typedef union
{
    uint8_t      u8Msg[8];
    uint8_t u8TPMSDisplay   : 8;      /**< 是否显示 */
    uint8_t u8PressUnit     : 4;      /**< 胎压单位 (0-psi 1-kPa 2-bar) */
    uint8_t u8PressPopup    : 4;      /**< 胎压单位 (0-psi 1-kPa 2-bar) */
    uint8_t u8PressureFH    : 8;      /**< 前轮胎压高字节 */
    uint8_t u8PressureFL    : 8;      /**< 前轮胎压低字节 */
    uint8_t u8PressureRH    : 8;      /**< 后轮胎压高字节 */
    uint8_t u8PressureRL    : 8;      /**< 后轮胎压低字节 */
    uint8_t u8TemperatureF  : 8;      /**< 前轮胎温 */
    uint8_t u8TemperatureR  : 8;      /**< 后轮胎温 */
}TPMS_Display_Info_un_t;

/****************************************************
0x06 事件型信息,底板向核心板发送字符串,核心板校验成功以后,回复ID0x16,回复内容为ID+字符串类型+2个字节的CRC校验值
****************************************************/

typedef union
{
    uint8_t      u8Msg[3];
    uint8_t      u8UUID    : 8;
    uint8_t      u8data    : 8;
    uint8_t      u8ASCII    : 8;
}Check_Code_un_t;

/*****************************************************************/
/*-------------------------核心板心跳数据------------------------*/
/*****************************************************************/
typedef union
{
    uint8_t Msg [ 7u ];
    struct
    {
        /*Byte4*/
        uint8_t MessageID : 6;
        uint8_t PowerMode : 2;
        /*Byte5*/
        uint8_t Data0;
        /*Byte6*/
        uint8_t Data1;
        /*Byte7*/
        uint8_t Animation_Status : 4;
        uint8_t TD_Status        : 1;
        uint8_t APP_Status       : 2;
        uint8_t Lap_Status       : 1;

        /*Byte8*/
        uint8_t DataType    : 2;
        uint8_t SnapShot_FB : 3u;    //截屏提示 0无 1仪表截屏成功 2仪表截屏失败 3仪表截屏传输失败,可稍后重试
        uint8_t Tell_Req    : 1u;
        uint8_t Media_Req   : 2u;
        /*Byte8*/
        uint8_t MediaSource;
        /*Byte9*/
        uint8_t Boot_Req;

    } Sig;
} Rec_ID_12_Struct;

extern Rec_ID_12_Struct Rec_Dat_12;


typedef union
{
    uint8_t u8Msg[22];
    struct
    {
        uint8_t u8BlueStatus       : 8; /* 蓝牙电话状态 */
        uint8_t u8Resv1            : 8; /**< 占位 */
  
        uint8_t u8PhoneType        : 4; /* 手机类型 */
        uint8_t u8NetworkState     : 4; /* 核心板配网状态 */
  
        uint8_t u8Resv2            : 8; /**< 占位 */
  
        uint8_t u8BlueLink         : 4; /**< 蓝牙连接状态 */
        uint8_t u8WifiLink         : 4; /**< 蓝牙连接状态 */
  
        uint8_t u8AnimStatus       : 8; /* 显示状态 */
  
        uint8_t u8Hour             : 8; /**<  小时数字 */
        uint8_t u8Minute           : 8; /**<  分钟数字 */
        uint8_t u8Seconds          : 8; /**<  秒数字 */
  
        uint8_t u8Updatestatus     : 8; /**<  核心板升级状态 */
  
        uint8_t u8SignalStrength   : 4; /**<  手机信号强度 */
        uint8_t u8SocDesVal        : 4; /**<  手机电量 */
  
        uint8_t u8WifiSignal       : 8; /**<  WIFI信号强度 */
        uint8_t MenuInit           : 8; /**<  菜单初始化完成标志 */
        uint8_t u8Resv3            : 8; /**<  升级预留占位 */

        uint8_t u8FrontStudyStatus : 4; /**<  胎压学习前轮学习状态 */
        uint8_t u8BackStudyStatus  : 4; /**<  胎压学习后轮学习状态 */

        uint8_t u8TemperatureF     : 8; /**< 前轮胎温 */
        uint8_t u8TemperatureR     : 8; /**< 后轮胎温 */
        uint8_t u8PressureFH       : 8; /**< 前轮胎压高字节 */
        uint8_t u8PressureFL       : 8; /**< 前轮胎压低字节 */
        uint8_t u8PressureRH       : 8; /**< 后轮胎压高字节 */
        uint8_t u8PressureRL       : 8; /**< 后轮胎压低字节 */
        uint8_t u8SensorHID        : 8; /**<  传感器ID高字节 */
        uint8_t u8SensorHCID       : 8; /**<  传感器ID中高字节 */
        uint8_t u8SensorLCID       : 8; /**<  传感器ID低高字节 */
        uint8_t u8SensorLID        : 8; /**<  传感器ID低字节 */

    }Sig;
    
}Rec_0x012_un_t;

extern Rec_0x012_un_t g_unRec_0x012;

extern uint8_t Get_Core_StartStatus(void);
extern uint8_t Get_Animation_Status(void);

void MCU_SOC_Commnuication(void);
void Core_Startup_Handle(uint8_t status);
void Core_Heart_Handle(const uint8_t *pData, uint8_t len);
void Core_WinData_Service(void);
void Core_TelltalesData_Service(void);

extern void WinLeft_Data_Service(void);
extern void WinLeft_Disp_Service(void);
extern uint8_t Navi_FULL_Get(void);
extern uint8_t Mcu_BlueTooth_Get(void);
extern void Mcu_Disp_Priority(void);
extern uint8_t SOC_Online_Status_Get(void);
extern uint8_t SOC_Online_Valid(void);


#endif