
#ifndef _IO_MANAGER_H_
#define _IO_MANAGER_H_

#include "Data_Processor.h"
#include "System_Status_Monitor.h"
#include "Key.h"
#include "Communication_Over_CAN.h"
#include "CRG.h"

/*************************************************************************
显示功能列表
*************************************************************************/
#define   IO_DISP_FUNC_NONE                 0x00
#define   IO_DISP_FUNC_DRIVE_INFO           0x01
#define   IO_DISP_FUNC_MENUS                0x02
#define   IO_DISP_FUNC_TIME_SETTING         0x04
#define   IO_DISP_FUNC_POPUPS               0x08
//#define   IO_DISP_FUNC_RADAR                0x10

/*************************************************************************
显示功能使能
*************************************************************************/
//extern volatile uint8_t IODispFuncEnable;
extern volatile uint8_t IODispFuncSwitch;
//#define   IO_DISP_FUNC_DRIVE_INFO_EN        (IODispFuncEnable == IO_DISP_FUNC_DRIVE_INFO)
//#define   IO_DISP_FUNC_MENUS_EN             (IODispFuncEnable == IO_DISP_FUNC_MENUS)
//#define   IO_DISP_FUNC_TIME_SETTING_EN      (IODispFuncEnable == IO_DISP_FUNC_TIME_SETTING)
//#define   IO_DISP_FUNC_POPUPS_EN            (IODispFuncEnable == IO_DISP_FUNC_POPUPS)
//#define   IO_DISP_FUNC_RADAR_EN             (IODispFuncEnable == IO_DISP_FUNC_RADAR)

#define     IO_DISP_FUNC_SWITCH_FLAG          IODispFuncSwitch

/*************************************************************************
弹出信息请求
*************************************************************************/
extern volatile uint8_t IOPopupMenuTipRunning;
extern volatile uint8_t IOPopupMenuTipWarning;

#define   IO_POPUP_REQ_MENU_TIP_RUNNING     IOPopupMenuTipRunning
#define   IO_POPUP_REQ_MENU_TIP_WARNING     IOPopupMenuTipWarning

/*************************************************************************
按键输入重定向结构
*************************************************************************/
typedef union
{
  uint8_t     Byte;
  struct
  {
    uint8_t   Key0  : 2;
    uint8_t   Key1  : 2;
    uint8_t   Key2  : 2;
    uint8_t   Key3  : 2;
  } Sig;
} IOKeysRedirUnion;

/*************************************************************************
按键状态
*************************************************************************/
#define   IO_KEY_IDLE                       0x00
#define   IO_KEY_PRESS                      0x01
#define   IO_KEY_HOLD                       0x02
#define   IO_KEY_LONG                       0x03

/************************************************************************
按键重定向
************************************************************************/
extern volatile IOKeysRedirUnion IOICUKeys;
extern volatile IOKeysRedirUnion IOCANKeys;

#define   IO_ICU_KEYS                       IOICUKeys.Byte
#define   IO_CAN_KEYS                       IOCANKeys.Byte

#define   IO_ICU_KEY_LEFT                   IOICUKeys.Sig.Key0
#define   IO_ICU_KEY_RIGHT                  IOICUKeys.Sig.Key1
//#define   IO_ICU_KEY_TRIP                   IOICUKeys.Sig.Key2

#define   IO_CAN_KEY_LEFT                   IOCANKeys.Sig.Key0
#define   IO_CAN_KEY_RIGHT                  IOCANKeys.Sig.Key1
#define   IO_CAN_KEY_ENTER                  IOCANKeys.Sig.Key2

extern volatile uint8_t IODispMode;
extern volatile uint8_t IOTFTLCDAccessRight;
#define   IO_DISPLAY_MODE    IODispMode

/******************************************************************************
TFT LCD 显示使能
******************************************************************************/
#define   IO_ANIMATION_DISPLAY_ENABLE       (IOTFTLCDAccessRight & IO_ANIMATION_BIT)      //动画            1
#define   IO_BG_INFO_DISPLAY_ENABLE         (IOTFTLCDAccessRight & IO_BG_INFO_BIT)        //常显            2
#define   IO_TELLTALE_DISPLAY_ENABLE        (IOTFTLCDAccessRight & IO_TELLTALE_BIT)       //屏幕指示灯      4
#define   IO_DRIVE_INFO_DISPLAY_ENABLE      (IOTFTLCDAccessRight & IO_DRIVE_INFO_BIT)     //行车电脑        8
#define   IO_POPUP_DISPLAY_ENABLE           (IOTFTLCDAccessRight & IO_POPUP_BIT)          //报警            10
#define   IO_TIME_DISPLAY_ENABLE            (IOTFTLCDAccessRight & IO_TIME_BIT)           //时间显示        20
#define   IO_TRAP_DISPLAY_ENABLE            (IOTFTLCDAccessRight & IO_TRAP_BIT)           //小G显示模式     40
#define   IO_TPMS_DISPLAY_ENABLE            (IOTFTLCDAccessRight & IO_TPMS_BIT)
/******************************************************************************
显示模式列表
******************************************************************************/
#define   SYS_IGN_OFF_DISP_MODE             (IODispMode == IO_DISP_MODE_IGN_OFF)
#define   SYS_SELF_TEST_DISP_MODE           (IODispMode == IO_DISP_MODE_SELF_TEST)
#define   SYS_IGN_ON_DISP_MODE              (IODispMode == IO_DISP_MODE_IGN_ON)

/******************************************************************************
显示状态定义
******************************************************************************/
#define   IO_DISP_MODE_IGN_OFF              0x00
#define   IO_DISP_MODE_SELF_TEST            0x01
#define   IO_DISP_MODE_IGN_ON               0x02
#define   IO_DISP_MODE_BLANK                0x03

/******************************************************************************
TFT LCD访问控制位
******************************************************************************/
#define   IO_ANIMATION_BIT                  0x01       //动画            1
#define   IO_BG_INFO_BIT                    0x02       //常显            2
#define   IO_TELLTALE_BIT                   0x04       //屏幕指示灯      4
#define   IO_DRIVE_INFO_BIT                 0x08       //行车电脑        8
#define   IO_POPUP_BIT                      0x10       //报警            10
#define   IO_TIME_BIT                       0x20       //时间显示        20
#define   IO_TRAP_BIT                       0x40       //小G显示模式     40
#define   IO_TPMS_BIT                       0x80
/******************************************************************************
自检设置
******************************************************************************/
#define   IO_SELF_TEST_TIME                 3000      //自检时间,单位ms
//#define   IO_SELF_TEST_TIME                 1500      //自检时间,单位ms
#define   IO_DRIVE_INFO_AUTO_SWITCH_TIME    300       //自检完成后,自动切换到行车电脑的时间,单位ms  300

typedef struct
{
  uint8_t   IGNStatusBackup;
  uint8_t   SelfTestComplete;
  uint16_t  SelfTestTimer;
} IODispModeCtrlStruct;

typedef struct
{
  uint8_t           TripEnable;
  IOKeysRedirUnion  ICUKeysBackup;
  IOKeysRedirUnion  CANKeysBackup;
} IOManageStruct;

/************************************************************************
函数声明
************************************************************************/
void IO_Management_Init(void);
void IO_Management_Service(void);
void IO_Popups_Display_Request(void);
void IO_Popups_Display_Release(void);
void IO_Menus_Display_Release(void);
void IO_Trip_Key_Mask(uint8_t Mask);

#endif
