#include "IO_Manager.h"
#include "Menus.h"
#include "Drive_Info.h"
#include "Popup_Scheduler.h"

volatile uint8_t            IODispFuncEnable;
volatile uint8_t            IODispFuncSwitch;
uint8_t                     IODriveInfoAutoSwitchEnable;
uint8_t                     IODriveInfoTimer;

volatile uint8_t            IOPopupMenuTipRunning;
volatile uint8_t            IOPopupMenuTipWarning;

IOManageStruct              IOManage;
IODispModeCtrlStruct        IODispModeCtrl;

volatile IOKeysRedirUnion   IOICUKeys;
volatile IOKeysRedirUnion   IOCANKeys;
volatile uint8_t            IODispMode;
volatile uint8_t            IOTFTLCDAccessRight;
uint8_t                     IOTimeCalEnable;
uint8_t  IOKeyDetFlag;

void IO_Trip_Key_Mask(uint8_t Mask)
{
  if (Mask)
    IOManage.TripEnable = 0;
  else
    IOManage.TripEnable = 1;
}
//״̬��ʼ��
void IO_Management_Init(void)
{
  IODispModeCtrl.IGNStatusBackup  = 0;
  IODispModeCtrl.SelfTestComplete = 0;
  IODispModeCtrl.SelfTestTimer    = IO_SELF_TEST_TIME / 20;
  IODispMode                      = IO_DISP_MODE_BLANK;
  IOTFTLCDAccessRight             = 0x00;

  IODispFuncEnable = IO_DISP_FUNC_NONE;
  IOPopupMenuTipRunning = 0;
  IOPopupMenuTipWarning = 0;

  IO_ICU_KEYS = 0x00;
  IOManage.TripEnable         = 1;
  IOManage.ICUKeysBackup.Byte = 0x00;
  IOKeyDetFlag = 0;
  IODriveInfoAutoSwitchEnable = 0;
  IODriveInfoTimer = 0;
}

//uint8_t ClrOdoEn = 0;

void IO_Management_Service(void)
{
  uint8_t   KeyValue;
  //������ʾģʽ
  if (SYS_OPR_STAT_RUN)
  {
    if (SYS_OPR_STAT_IGN_ON)
    {
      if (IODispModeCtrl.IGNStatusBackup == 0)
      {
        IODispModeCtrl.SelfTestComplete = 0;
        IODispModeCtrl.SelfTestTimer    = IO_SELF_TEST_TIME / 20;
        IOTimeCalEnable                 = 1;
      }

      if (IODispModeCtrl.SelfTestComplete == 0)
      {
        if (IODispModeCtrl.SelfTestTimer)
          IODispModeCtrl.SelfTestTimer--;
        else
          IODispModeCtrl.SelfTestComplete = 1;
      }

      IODispModeCtrl.IGNStatusBackup = 1;
      if (IODispModeCtrl.SelfTestComplete) 
      {
        IODispMode = IO_DISP_MODE_IGN_ON;
        //TFT_LCD_Clear_Layer(LAYER_BEIJING);
        //TFT_LCD_Clear_Layer(LAYER_BEIJING1);
      }
      else
        IODispMode = IO_DISP_MODE_SELF_TEST;
    }
    else
    {
      IODispMode = IO_DISP_MODE_IGN_OFF;
      IODispModeCtrl.IGNStatusBackup = 0;
    }
  }
  else
  {
    IODispMode = IO_DISP_MODE_BLANK;
    IODispModeCtrl.IGNStatusBackup = 0;
  }

  if (IODispMode == IO_DISP_MODE_IGN_ON)
  { 
    if (IODriveInfoAutoSwitchEnable)
    {
      IODriveInfoTimer++;
      if (IODriveInfoTimer >= 14)
      {
        TFT_LCD_Clear_Layer(LAYER_BEIJING);
        TFT_LCD_Clear_Layer(LAYER_BEIJING1);
      }
      if (IODriveInfoTimer >= (uint8_t)(IO_DRIVE_INFO_AUTO_SWITCH_TIME / 20))
      {
        IODriveInfoAutoSwitchEnable = 0;
        IODriveInfoTimer = 0;
        IOTFTLCDAccessRight &= ~IO_ANIMATION_BIT; //IGN ON��ʾģʽ�²���ʾ��������,������Ϣ��ָʾ�Ƴ���
        IOTFTLCDAccessRight |= (IO_BG_INFO_BIT | IO_TELLTALE_BIT | IO_DRIVE_INFO_BIT );
      }
    }
/**********************************�����ɼ�********************************************/
    KeyValue = Key_Get_Status(KEY_LEFT);   
    if ( KeyValue == IO_KEY_PRESS )
    {
      //KeyDelaytimer1 = 0 ; 
      IO_CAN_KEY_LEFT = IO_KEY_PRESS;
    } 
    else if ( KeyValue == IO_KEY_HOLD )   
    { 
      IO_CAN_KEY_LEFT = IO_KEY_HOLD; 
    }
    else if ( KeyValue == KEY_LONG )   
    { 
      IO_CAN_KEY_LEFT = IO_KEY_LONG; 
    }
    else 
    {
      IO_CAN_KEY_LEFT = IO_KEY_IDLE;
    }
    
    KeyValue = Key_Get_Status(KEY_RIGHT);
    if ( KeyValue == IO_KEY_PRESS )
    {
      //KeyDelaytimer2 = 0 ; 
      IO_CAN_KEY_RIGHT = IO_KEY_PRESS; 
    }
    else if ( KeyValue == IO_KEY_HOLD )   
    { 
      IO_CAN_KEY_RIGHT = IO_KEY_HOLD; 
    }
    else if ( KeyValue == KEY_LONG )   
    { 
      IO_CAN_KEY_RIGHT = IO_KEY_LONG; 
    } 
    else 
    {   
      IO_CAN_KEY_RIGHT = IO_KEY_IDLE;
    }
    
    KeyValue = Key_Get_Status(KEY_ENTER);
    
    if ( KeyValue == IO_KEY_PRESS )
    { 
      IO_CAN_KEY_ENTER = IO_KEY_PRESS;
      //ClrOdoEn = 1;
    }
    else if ( KeyValue == IO_KEY_HOLD )   
    { 
      IO_CAN_KEY_ENTER = IO_KEY_HOLD; 
    }
    else if ( KeyValue == KEY_LONG )   
    { 
      IO_CAN_KEY_ENTER = IO_KEY_LONG; 
    }
    else 
    {   
      IO_CAN_KEY_ENTER = IO_KEY_IDLE;
    }
/**********************************��������********************************************/      
    //����ʱ���������
    // if (((DataVSpeedDisp < 160 )||(DataESpeedDisp < 4480))) 
    // {
    if (IO_POPUP_DISPLAY_ENABLE)
    {
      if (IO_CAN_KEY_ENTER == IO_KEY_PRESS)
      {
        IO_CAN_KEY_ENTER = IO_KEY_IDLE;
        Popup_Mask_Request();
      } 
    }
    
    if ((IO_DRIVE_INFO_DISPLAY_ENABLE) && (!IO_POPUP_DISPLAY_ENABLE) && (IO_CAN_KEY_ENTER == IO_KEY_LONG))
    {
      IO_CAN_KEY_ENTER = IO_KEY_IDLE;
      IOTFTLCDAccessRight = 0x00;  
      IOTFTLCDAccessRight = (IO_TIME_BIT | IO_BG_INFO_BIT);
    }
  #if 0  
    if ((IO_DRIVE_INFO_DISPLAY_ENABLE) && (!IO_POPUP_DISPLAY_ENABLE) && (IO_CAN_KEY_LEFT == IO_KEY_LONG))
    {
      IO_CAN_KEY_LEFT = IO_KEY_IDLE;
      IOTFTLCDAccessRight = 0x00;  
      IOTFTLCDAccessRight = (IO_TIME_BIT | IO_BG_INFO_BIT);
      SetMenu = 3;
    }
  #endif
    if ((IO_DRIVE_INFO_DISPLAY_ENABLE) && (!IO_POPUP_DISPLAY_ENABLE) && (IO_CAN_KEY_RIGHT == IO_KEY_LONG))
    {
      IO_CAN_KEY_RIGHT = IO_KEY_IDLE;
      IOTFTLCDAccessRight = 0x00;  
      IOTFTLCDAccessRight = (IO_TIME_BIT | IO_BG_INFO_BIT);
      SetMenu = 2;
    }
    if (IO_BG_INFO_DISPLAY_ENABLE)
    {
      Time_Seting(); //������Ϣ����
      /************************���ý���*************************************/
      //----hyq--20180602
      // Time_Seting(); //������Ϣ����
      if (IO_TIME_DISPLAY_ENABLE)
      { 
        /*********************************�˳���������************************************************/
        if ((!IO_POPUP_DISPLAY_ENABLE)) //�DZ�������
        {
          if ((IO_CAN_KEY_LEFT == IO_KEY_IDLE) || (IO_CAN_KEY_RIGHT == IO_KEY_IDLE) || (IO_CAN_KEY_ENTER == IO_KEY_IDLE))
          {
            if (keytime < 1500)
              keytime++;
            else
            {
              if (SetMenu == 6) //ʱ�����ý���
              {
                RTC_MINUTE = SetMinute_One + SetMinute_Ten * 10;
                RTC_HOUR   = SetHour_One + SetHour_Ten * 10 ;
              }
              keytime = 0;
              ClockPOS = 0;
              SetMenupage = 0;    
              SetMenu = 0;
              IODispFuncSwitch     = 1;
              IOTFTLCDAccessRight  = 0x00;
              IOTFTLCDAccessRight |= (IO_BG_INFO_BIT | IO_TELLTALE_BIT | IO_DRIVE_INFO_BIT);
              //TFT_LCD_Clear_Multi_Layer(LAYER_MENU01, LAYER_MENU16);
            }
          }
        }
      }
    }
  }
  else if (IODispMode == IO_DISP_MODE_IGN_OFF)
  {
    IODriveInfoAutoSwitchEnable = 0;
    IOTFTLCDAccessRight &= IO_POPUP_BIT; //ֻ�п�����ʾ������Ϣ
    if (!IO_POPUP_DISPLAY_ENABLE)
      IODispFuncSwitch = 1;
  }
  else if (IODispMode == IO_DISP_MODE_SELF_TEST)
  {
    IODriveInfoAutoSwitchEnable = 1;
    IODriveInfoTimer = 0;
    IODispFuncSwitch = 0;
    IOTFTLCDAccessRight = IO_ANIMATION_BIT; //ֻ������ʾ��������
    IO_ICU_KEYS      = 0x00;
  }
  else
  {
    IODriveInfoAutoSwitchEnable = 0;
    IOTFTLCDAccessRight = 0x00; //ʲô����������ʾ
  }
}

void IO_Popups_Display_Request(void)
{
  if (IODispMode == IO_DISP_MODE_IGN_OFF)
  {
    if (!IO_POPUP_DISPLAY_ENABLE)
    {
      IODispFuncSwitch = 1;
      IOTFTLCDAccessRight  = 0x00;
      IOTFTLCDAccessRight |= IO_POPUP_BIT;
    }
  }
  else if (IODispMode == IO_DISP_MODE_IGN_ON)
  {
    if ((!IO_POPUP_DISPLAY_ENABLE))
    {
      IODispFuncSwitch = 1;
      IODriveInfoAutoSwitchEnable = 0;
      IOTFTLCDAccessRight  = 0x00;
      IOTFTLCDAccessRight |= (IO_BG_INFO_BIT | IO_TELLTALE_BIT | IO_POPUP_BIT);       
    }
  }
}

void IO_Popups_Display_Release(void)
{
  if (IODispMode == IO_DISP_MODE_IGN_OFF)
  {
    if (IO_POPUP_DISPLAY_ENABLE)
    {
      IODispFuncSwitch = 1;
      IOTFTLCDAccessRight = 0x00;
    }
  }
  else if (IODispMode == IO_DISP_MODE_IGN_ON)
  {
    if (IO_POPUP_DISPLAY_ENABLE)
    {
      IODispFuncSwitch     = 1;
      IOTFTLCDAccessRight  = 0x00;
      IOTFTLCDAccessRight |= (IO_BG_INFO_BIT | IO_TELLTALE_BIT | IO_DRIVE_INFO_BIT);  
    }
  }
}
void IO_Menus_Display_Release(void)
{
  if (IODispMode == IO_DISP_MODE_IGN_ON)
  {
    if (IO_TIME_DISPLAY_ENABLE)
    {
      IODispFuncSwitch     = 1;
      IOTFTLCDAccessRight  = 0x00;
      IOTFTLCDAccessRight |= (IO_BG_INFO_BIT | IO_TELLTALE_BIT | IO_DRIVE_INFO_BIT);
    }
  }
  
  //KEY_RIGHT_TURN = 0; 
  //KEY_LEFT_TURN  = 0;
  //IO_CAN_KEY_ENTER = IO_KEY_IDLE; 
  //IO_CAN_KEY_RIGHT = IO_KEY_IDLE;
  //IO_CAN_KEY_LEFT  = IO_KEY_IDLE;
}