#ifndef UART_PROTOCOL_H
#define UART_PROTOCOL_H

typedef unsigned int uint32_t;
typedef int int32_t;
typedef unsigned short uint16_t;
typedef short int16_t;
typedef unsigned char uint8_t;


#define UART_UPDATE_ACK_NONE 0
#define UART_UPDATE_ACK_OK 1
#define UART_UPDATE_ACK_WAIT 2
#define UART_UPDATE_ACK_FAIL 3
#define UART_UPDATE_ACK_TIMEOUT 4

#define GROUP_PIC_DIR_LEFT      0x80
#define GROUP_PIC_DIR_RIGHT     0x00
#define GROUP_PIC_USE_PSD_Y_POS -1

typedef enum {
    ALIVE_COUNTER_COMM,
    ALIVE_COUNTER_LCD0,
    ALIVE_COUNTER_LCD1,
    ALIVE_COUNTER_TOTAL,
}ALIVE_COUNTER_TYPE;

/* Generate Function */
extern void ResetInitedState(void); /* Called every time the AMT630 is powered on or the MCU wake up */
extern uint8_t GetAliveCounter(ALIVE_COUNTER_TYPE n); /* 0:ALIVE_COUNTER_COMM, 1:ALIVE_COUNTER_LCD0, 2:ALIVE_COUNTER_LCD1 */
extern uint32_t GetCrcErrCnts(void);
extern uint32_t GetRecvLenErrCnts(void);
extern uint8_t GetLcdInitSt(void);
extern uint8_t GetCameraSignalSt(void);
extern uint8_t GetVideoCaptureSt(void);
extern uint8_t GetAmt630InBoot(void); 
extern uint8_t GetLcdInitStB(void);
extern uint8_t *GetUartRecvData(uint32_t *UartRecvBufLen, uint32_t *UartRecvPos);
extern void UartSendData(uint8_t *data, uint32_t len);
extern void AnalysisUartData(void);
/* Generate Function end */

/* Sound */
#define SOUND_STATE_FREE 0
#define SOUND_STATE_BUSY 1
#define WAV_TEST_NUM_TIC 0xfd
#define WAV_TEST_NUM_TOC 0xfe
enum {
    AUDIO_FREQ_NONE,
    AUDIO_FREQ_8K,
    AUDIO_FREQ_11K,
    AUDIO_FREQ_16K,
    AUDIO_FREQ_22K,
    AUDIO_FREQ_32K,
    AUDIO_FREQ_44K,
    AUDIO_FREQ_48K,
    AUDIO_FREQ_96K,
    AUDIO_FREQ_128K,
    AUDIO_FREQ_160K,
    AUDIO_FREQ_172K,
    AUDIO_FREQ_192K,
    AUDIO_FREQ_TOTAL,
};
extern void PackedTransfer_SoundPlay(uint8_t Channel, uint8_t WavNum, uint16_t PlayTimes, uint16_t MinTimes, uint8_t Volume);
extern void PackedTransfer_SoundStop(uint8_t Channel);
extern void PackedTransfer_SoundChangeVolume(uint8_t Channel, uint8_t Volume);
extern uint8_t GetSoundChannelSta(uint8_t Channel);
/* Sound end */

/* Lcd Parameter */
#define LCD_WIRING_MODE_RGB 0
#define LCD_WIRING_MODE_RBG 1
#define LCD_WIRING_MODE_GRB 2
#define LCD_WIRING_MODE_GBR 3
#define LCD_WIRING_MODE_BRG 4
#define LCD_WIRING_MODE_BGR 5

#define LCD_INTERFACE_TTL 0
#define LCD_INTERFACE_LVDS 1

#define LCD_WIRING_BIT_ORDER_MSB 0
#define LCD_WIRING_BIT_ORDER_LSB 1

#define LVDS_PANEL_FORMAT_TI 0
#define LVDS_PANEL_FORMAT_NS 1

#define LVDS_PANEL_DATA_8BIT 0
#define LVDS_PANEL_DATA_6BIT 1

#define VIDEO_IN_NONE 0
#define VIDEO_IN_NTSC 1
#define VIDEO_IN_PAL 2

typedef struct {
    uint16_t LcdWidth;
    uint16_t LcdHeight;
    uint8_t LcdVideoInputValid : 2;
    uint8_t LcdBpp : 6;
	uint8_t Ark7116ResetPin;
    uint8_t LcdInterfaceType : 4;
    uint8_t LcdWiringMode : 4;
    uint8_t LcdWiringBitOrder : 2;
    uint8_t LcdDotClkReverse : 2;
    uint8_t LvdsPanelFormat : 2;
    uint8_t LvdsPanelData : 2;
    uint16_t LcdTimingVBP;
    uint16_t LcdTimingVFP;
    uint16_t LcdTimingVSW;
    uint16_t LcdTimingHBP;
    uint16_t LcdTimingHFP;
    uint16_t LcdTimingHSW;
    uint32_t LcdClkFreq;
    uint8_t SoundFreq;
    uint8_t SoundChannelNum;
} LCD_TFT_SOUND_PARA_ST;




extern void SetLcdSoundParameter(LCD_TFT_SOUND_PARA_ST *pData);
/* Lcd Parameter end */

/* Amt Software */
typedef struct {
    uint8_t AmtLdrVer[8];
    uint8_t StepLdrVer[8];
    uint8_t AmtAppVer[8];
    uint8_t UiVer[8];
    uint8_t SoundVer[8];
    uint8_t FontVer[8];
} SOFTWARE_VERSION_ST;
extern void SetSwVerBuf(uint8_t *buf);
extern void PackedTransfer_GetSwVer(void);
/* Amt Software end */

/* Pic Index */
extern void SetPicIndexData(uint8_t *data, uint32_t len, uint32_t crc);
/* Pic Index end */

/* Sequence Frame */
#define SE_FRAME_PIC_MAX 100
enum {
    SE_TYPE_NONE,
    SE_TYPE_ONE_SHOT,
    SE_TYPE_CONTINUOUS,
};
typedef struct {
    uint16_t Pic;
} SEQUENCE_FRAME_PIC_ST;
typedef struct {
    uint8_t SeFrameType;
    uint8_t SeFrameNumTotal;
    uint16_t SeFrameTotalTime;
    uint16_t SeFrameValidTime;
    SEQUENCE_FRAME_PIC_ST SeFramePicList[SE_FRAME_PIC_MAX];
} SEQUENCE_FRAME_ST;
extern SEQUENCE_FRAME_ST SeFrameData;
extern void PackedTransfer_SequenceFrame(uint8_t *SeData, uint16_t SeLen);
extern void PackedTransfer_SequenceFrameOff(void);
/* Sequence Frame end */

/* Pointer Move Type */
typedef enum {
    POINTER_TYPE_SPEED,
    POINTER_TYPE_ENGINE,
    POINTER_TYPE_COOLANT_FUEL,
    POINTER_TYPE_CUSTOMIZE,
    POINTER_TYPE_MAX,
} POINTER_MOVE_TYPE_ENUM;
typedef enum {
    POINTER_RENDER_TYPE_POINTER,
    POINTER_RENDER_TYPE_SEQUENCE_PIC,
} POINTER_RENDER_TYPE_ENUM;
typedef struct {
    uint32_t PointerAngleP;     /* 10:0.1, 15:0.15, 100:1 .... POINTER_TYPE_SPEED default:30 */
    uint32_t PointerAngleD;     /* 10:0.1, 15:0.15, 100:1 .... POINTER_TYPE_SPEED default:18 */
    uint32_t PointerAngleSlowP; /* 10:0.1, 15:0.15, 100:1 .... POINTER_TYPE_SPEED default:10 */
    uint32_t PointerAngleSlowD; /* 10:0.1, 15:0.15, 100:1 .... POINTER_TYPE_SPEED default:18 */
    uint32_t MaxInterval;       /* 10:0.1, 15:0.15, 100:1 .... POINTER_TYPE_SPEED default:340 */
} POINTER_MOVE_PARA;
extern void PackedTransfer_SetPointerMoveType(POINTER_MOVE_PARA *Data, POINTER_MOVE_TYPE_ENUM MoveType);
/* Pointer Move Type end */

/* Pointer */
typedef enum {
    POINTER_0,
    POINTER_1,
    POINTER_2,
    POINTER_3,
    POINTER_MAX,
} POINTER_ENUM;
extern void PackedTransfer_InitPointer(POINTER_ENUM PointerN, uint8_t *data, uint16_t len, POINTER_MOVE_TYPE_ENUM MoveType, POINTER_RENDER_TYPE_ENUM RenderType);
extern uint8_t GetPointerInitSt(POINTER_ENUM PointerN);
extern void PackedTransfer_SetPointerDestVal(POINTER_ENUM PointerN, uint16_t DestVal, uint8_t NoDamping); /* DestVal:0~1000, NoDamping: 0-have damping, 1:no damping */
extern uint16_t GetPointerCurVal(POINTER_ENUM PointerN);                               /* CurVal:0~1000 */

#define POINTER_NUM_LIST_MAX 20
extern void SetPointerNumPic(POINTER_ENUM PointerN, uint8_t n, uint16_t PicIndex, uint16_t PointerVal);
extern void SetPointerNumZoomPara(POINTER_ENUM PointerN, uint16_t ZoomRange, float ZoomMax);
extern void PackedTransfer_PointerNumData(POINTER_ENUM PointerN);
/* Pointer end */

/* Page Data */
typedef enum {
    GRAPHICS_PAGE_0,
    GRAPHICS_PAGE_1,
    GRAPHICS_PAGE_2,
    GRAPHICS_PAGE_MAX,
} GRAPHICS_PAGE_ENUM;

typedef enum {
    SWITCH_EFFECT_NONE,
    SWITCH_EFFECT_ONLY_ALPHA,
    SWITCH_EFFECT_ONLY_OFFSET,
    SWITCH_EFFECT_ALPHA_OFFSET,
} EFFECT_VALID_ENUM;

typedef enum {
    SWITCH_EFFECT_OFFSET_FADE_IN_RIGHT_TO_LEFT,
    SWITCH_EFFECT_OFFSET_FADE_IN_LEFT_TO_RIGHT,
    SWITCH_EFFECT_OFFSET_FADE_IN_UP_TO_DOWN,
    SWITCH_EFFECT_OFFSET_FADE_IN_DOWN_TO_UP,
} OFFSET_EFFECT_ENUM;

typedef enum {
    ALIGN_LEFT,
    ALIGN_CENTER,
    ALIGN_RIGHT,
} TEXT_ALIGN_TYPE;

typedef enum {
    TFT_ROT_0,
    TFT_ROT_90,
    TFT_ROT_180,
    TFT_ROT_270,
} TFT_ROT_TYPE;

#define TEXT_ROT_SCALE (r, s) ((((r) & 0xffff) << 16) | ((s) & 0xffff))
#define TEXT_COLOR(r, g, b, a) ((((r) & 0xff) << 24) | (((g) & 0xff) << 16) | (((b) & 0xff) << 8) | ((a) & 0xff))
#define TEXT_LINE_OFFSET(x, y) ((((x) & 0xffff) << 16) | ((y) & 0xffff))

#define GROUP_ALIGN_LEFT 0x0
#define GROUP_ALIGN_CENTER 0x40
extern void SetPageGuid(GRAPHICS_PAGE_ENUM page, uint8_t h, uint8_t m, uint8_t l);
extern void SetPageBackground(GRAPHICS_PAGE_ENUM page, uint16_t PicIndex);
extern void SetPagePic(GRAPHICS_PAGE_ENUM page, uint16_t PicIndex);
extern void SetPagePicPointerNum(GRAPHICS_PAGE_ENUM page, POINTER_ENUM PointN, uint16_t PicIndex);
extern void SetPagePicFree(GRAPHICS_PAGE_ENUM page, uint16_t PicIndex, int16_t PosX, int16_t PosY);
extern void SetPagePicFreeAppend(GRAPHICS_PAGE_ENUM page, uint16_t pic, int16_t PosX, int16_t PosY);
extern void SetPagePicGroupExtParaOriCoor(GRAPHICS_PAGE_ENUM page, uint8_t PicNum, uint16_t NumZeroPic);
extern void SetPagePicGroup(GRAPHICS_PAGE_ENUM page, int16_t Interval, int16_t PosX, int16_t PosY, uint16_t *PicList, uint32_t Align_Num, uint16_t Dot_Itv, TFT_ROT_TYPE TftRot);
extern void SetPageText(GRAPHICS_PAGE_ENUM page, uint16_t LabelNum, int16_t PosX, int16_t PosY, int16_t MaxX, TEXT_ALIGN_TYPE AlginType, uint32_t RotScale, uint32_t Color, uint32_t LineOffset);	/* TEXT_ROT_SCALE:use TEXT_ROT_SCALE macro, (r:0~3600); (s:-1000 ~ 1000, 0:no scale, 1 ~ 1000:zoom in, -1 ~ -1000:zoom out); Color:use TEXT_COLOR macro; LineOffset:use TEXT_LINE_OFFSET macro */
extern void SetPagePointerPic(GRAPHICS_PAGE_ENUM page, POINTER_ENUM PointN, uint16_t PicIndex);
extern void SetPagePointerSePic(GRAPHICS_PAGE_ENUM page, POINTER_ENUM PointN);
extern void SetPagePointerTrackPic(GRAPHICS_PAGE_ENUM page, POINTER_ENUM PointN, uint16_t PicIndex);
extern void SetPageSliderNumPic(GRAPHICS_PAGE_ENUM page, uint8_t SliderNum);
extern void PackedTransfer_PicDirectDraw(uint32_t PicIndex, uint8_t Valid);

extern void PackedTransfer_BgJpg(uint32_t PicIndex);
extern void PackedTransfer_Page(void);
extern void PackedTransfer_PageEffect(GRAPHICS_PAGE_ENUM page, EFFECT_VALID_ENUM EffectValid, OFFSET_EFFECT_ENUM OffsetEffect);
extern void PackedTransfer_ClearPageData(GRAPHICS_PAGE_ENUM page);
/* Page Data end */

/* Compose Pic */
extern void PackedTransfer_ComposeData(uint8_t *data, uint8_t len);
/* Compose Pic end */

/* Label List */
extern uint8_t GetLanguageInitSt(void);
extern void PackedTransfer_InitLanguageFont(uint8_t Language, uint8_t Font);
extern void PackedTransfer_LabelsList(uint16_t LabelNum, uint8_t *LabelBuf, uint32_t LabelLen);
/* Label List end */

/* Flash Check */
typedef enum {
    DISPLAY_CHECKING,
    DISPLAY_CHECK_PASS,
    DISPLAY_CHECK_FAIL,
}FLASH_CHECK_FORCE_DISPLAY_TYPE;
extern void PackedTransfer_CheckFlash(void);
extern uint8_t PackedTransfer_CheckFlashGetResult(void);	/*return value 0xff:checking, 0:fail, 1:success */
extern void PackedTransfer_CheckFlashForceDisplay(FLASH_CHECK_FORCE_DISPLAY_TYPE type, uint16_t timerMs);
/* Flash Check end */

/* Video Input */
extern void PackedTransfer_VedioInputOn(uint32_t PosX, uint32_t PosY, uint32_t Wdith, uint32_t Height, uint32_t CutX, uint32_t CutY);
extern void PackedTransfer_VedioInputOff(void);
extern void PackedTransfer_VedioInputArk7116OutputOff(void);
extern void PackedTransfer_VedioInputArk7116OutputOn(void);
/* Video Input end */

/* Get Mcu or Backup Data */
typedef enum {
	REQ_DATA,
	GET_STATUS,
	GET_APP_DATA_OFFSET,
    GET_BACKUP_DATA_OFFSET,
    GET_BACKUP_DATA_CRC,
    WRITE_BACKUP_DATA,
} READ_ARK630_CMD;

typedef enum {
    RECV_TYPE_DATA,
    RECV_TYPE_OFFSET_LEN,
    RECV_TYPE_WRITE_BACKUP_RESP,
    RECV_TYPE_BACKUP_CRC,
}RECV_MCU_DATA_TYPE;
extern void GetDataBuf(uint32_t *pAddr, uint32_t *pLen);
extern void SetRecvDataSt(RECV_MCU_DATA_TYPE type, uint32_t addr, uint32_t len, uint32_t crc);
extern void PackedTransfer_GetMcuData(uint32_t addr, uint16_t len);
extern void PackedTransfer_GetDataOffsetLen(uint8_t type);
extern void PackedTransfer_GetBackupDataCrc(uint32_t addr, uint32_t len);
extern void PackedTransfer_WriteBackupData(uint32_t addr, uint8_t *data, uint16_t len);
/* Get Mcu or Backup Data end */

/* Set tft io mode */
extern void PackedTransfer_SetTftIoMode(uint8_t st);	/*st 0:normal gpio, 1:TFT io*/
/* Set tft io mode end */

/* Slider Num */
extern void PackedTransfer_SliderNumData(uint8_t n, uint8_t *data, uint32_t len);
extern void PackedTransfer_SliderNumDestVal(uint8_t n, uint16_t val, uint8_t ForceUpdate, uint8_t DisplayValid);
/* Slider Num end */

enum {NUM_0, NUM_1, NUM_2, NUM_3, NUM_4, NUM_5, NUM_6, NUM_7, NUM_8, NUM_9, NUM_POINT, NUM_LINE};
typedef struct {
    const uint16_t *NumList;
    int16_t NumInterval;
    int16_t x;
    int16_t y;
    uint8_t DecimalNum;
    uint8_t MinDigits;
} DISPLAY_NUM_ST;

extern void DisplayNum(uint8_t page, DISPLAY_NUM_ST *pNumData, int32_t NumVal);

/*
note:
Update630HBegin UDS 34 Seriver call and power on 630H and lcd by your self
Update630HWrite UDS 36 Seriver call
Update630HEnd   UDS 37 Seriver call

return 0 is wait, return 1 is success, return 2 is fail.
*/
extern uint8_t Update630HBegin(uint32_t TimerCnts);
extern uint8_t Update630HWrite(uint32_t TimerCnts, uint8_t *data, uint32_t len);
extern uint8_t Update630HEnd(uint32_t TimerCnts);

/*Mobile screen projection*/
enum PhoneStatus
{
	Phone_Undefine = 0u,
	Phone_Idle,
	Phone_Connecting,
	Phone_EndCall,
	Phone_Outgoing,
	Phone_Incoming,
	Phone_Talking,
};

enum PhoneConTrol
{
	PhoneConTrol_Undefine = 0u,
	Phone_Pick_Up,
	Phone_Hangup_Out
};
enum BlueToothStatus
{
	BlueTooth_Undefine = 0u,
	BlueTooth_DisConnect,
	BlueTooth_Connection
};

enum ECNaviIcon
{
    EC_NAVI_ICON_NONE                          = 0,               ///< 收到此值,不显示导航图标
    EC_NAVI_ICON_DEFAULT                       = 1,               ///< 自车.请忽略这个元素,从左转图标开始
    EC_NAVI_ICON_LEFT                          = 2,               ///< 左转
    EC_NAVI_ICON_RIGHT                         = 3,               ///< 右转
    EC_NAVI_ICON_LEFT_FRONT                    = 4,               ///< 左前方
    EC_NAVI_ICON_RIGHT_FRONT                   = 5,               ///< 右前方
    EC_NAVI_ICON_LEFT_BACK                     = 6,               ///< 左后方
    EC_NAVI_ICON_RIGHT_BACK                    = 7,               ///< 右后方
    EC_NAVI_ICON_LEFT_TURN_AROUND              = 8,               ///< 左转掉头
    EC_NAVI_ICON_STRAIGHT                      = 9,               ///< 直行
    EC_NAVI_ICON_ARRIVED_WAYPOINT              = 10,              ///< 到达途经点
    EC_NAVI_ICON_ENTER_ROUNDABOUT              = 11,              ///< 进入环岛
    EC_NAVI_ICON_OUT_ROUNDABOUT                = 12,              ///< 驶出环岛
    EC_NAVI_ICON_ARRIVED_SERVICE_AREA          = 13,              ///< 到达服务区
    EC_NAVI_ICON_ARRIVED_TOLLGATE              = 14,              ///< 到达收费站
    EC_NAVI_ICON_ARRIVED_DESTINATION           = 15,              ///< 到达目的地
    EC_NAVI_ICON_ARRIVED_TUNNEL                = 16,              ///< 到达隧道
    EC_NAVI_ICON_CROSSWALK                     = 17,              ///< 通过人行横道
    EC_NAVI_ICON_OVERPASS                      = 18,              ///< 通过过街天桥
    EC_NAVI_ICON_UNDERPASS                     = 19,              ///< 通过地下通道
    EC_NAVI_ICON_SQUARE                        = 20,              ///< 通过广场
    EC_NAVI_ICON_PARK                          = 21,              ///< 通过公园
    EC_NAVI_ICON_STAIRCASE                     = 22,              ///< 通过扶梯
    EC_NAVI_ICON_LIFT                          = 23,              ///< 通过直梯
    EC_NAVI_ICON_CABLEWAY                      = 24,              ///< 通过索道
    EC_NAVI_ICON_SKY_CHANNEL                   = 25,              ///< 通过空中通道
    EC_NAVI_ICON_CHANNEL                       = 26,              ///< 通过通道、建筑物穿越通道
    EC_NAVI_ICON_WALK_ROAD                     = 27,              ///< 通过行人道路
    EC_NAVI_ICON_CRUISE_ROUTE                  = 28,              ///< 通过游船路线
    EC_NAVI_ICON_SIGHTSEEING_BUSLINE           = 29,              ///< 通过观光车路线
    EC_NAVI_ICON_SLIDEWAY                      = 30,              ///< 通过滑道
    EC_NAVI_ICON_LADDER                        = 31,              ///< 通过阶梯
    EC_NAVI_ICON_MERGE_LEFT                    = 51,              ///< 靠左行驶
    EC_NAVI_ICON_MERGE_RIGHT                   = 52,              ///< 靠右行驶
    EC_NAVI_ICON_SLOW                          = 53,              ///< 减速慢行
    EC_NAVI_ICON_ENTRY_RING_LEFT               = 54,              ///< 标准小环岛 绕环岛左转,右侧通行地区的逆时针环岛
    EC_NAVI_ICON_ENTRY_RING_RIGHT              = 55,              ///< 标准小环岛 绕环岛右转,右侧通行地区的逆时针环岛
    EC_NAVI_ICON_ENTRY_RING_CONTINUE           = 56,              ///< 标准小环岛 绕环岛直行,右侧通行地区的逆时针环岛
    EC_NAVI_ICON_ENTRY_RING_UTURN              = 57,              ///< 标准小环岛 绕环岛调头,右侧通行地区的逆时针环岛
    EC_NAVI_ICON_ENTRY_LEFT_RING               = 58,              ///< 进入环岛图标,左侧通行地区的顺时针环岛
    EC_NAVI_ICON_LEAVE_LEFT_RING               = 59,              ///< 驶出环岛图标,左侧通行地区的顺时针环岛
    EC_NAVI_ICON_UTURN_RIGHT                   = 60,              ///< 右转掉头图标,左侧通行地区的掉头
    EC_NAVI_ICON_SPECIAL_CONTINUE              = 61,              ///< 顺行图标(和直行有区别,顺行图标带有虚线)
    EC_NAVI_ICON_ENTRY_LEFT_RING_LEFT          = 62,              ///< 标准小环岛 绕环岛左转,左侧通行地区的顺时针环岛
    EC_NAVI_ICON_ENTRY_LEFT_RING_RIGHT         = 63,              ///< 标准小环岛 绕环岛右转,左侧通行地区的顺时针环岛
    EC_NAVI_ICON_ENTRY_LEFT_RING_CONTINUE      = 64,              ///< 标准小环岛 绕环岛直行,左侧通行地区的顺时针环岛
    EC_NAVI_ICON_ENTRY_LEFT_RING_UTURN         = 65,              ///< 标准小环岛 绕环岛调头,左侧通行地区的顺时针环岛
    EC_NAVI_ICON_SLOPE                         = 66,              ///< 通过斜坡图标
    EC_NAVI_ICON_BRIDGE                        = 67,              ///< 通过桥图标
    EC_NAVI_ICON_FERRYBOAT                     = 68,              ///< 通过渡轮图标
    EC_NAVI_ICON_SUBWAY                        = 69,              ///< 通过地铁图标
    EC_NAVI_ICON_ENTER_BUILDING                = 70,              ///< 进入建筑物图标
    EC_NAVI_ICON_LEAVE_BUILDING                = 71,              ///< 离开建筑物图标
    EC_NAVI_ICON_BY_ELEVATOR                   = 72,              ///< 电梯换层图标
    EC_NAVI_ICON_BY_STAIR                      = 73,              ///< 楼梯换层图标
    EC_NAVI_ICON_ESCALATOR                     = 74,              ///< 扶梯换层图标
    EC_NAVI_ICON_LOW_TRAFFIC_CROSS             = 75,              ///< 非导航段通过红绿灯路口图标
    EC_NAVI_ICON_LOW_CROSS                     = 76,              ///< 非导航段通过普通路口图标
    EC_NAVI_ICON_ROTARY_SHARP_LEFT             = 77,              ///< 环岛左后转,右侧通行地区的逆时针环岛
    EC_NAVI_ICON_ROTARY_SHARP_RIGHT            = 78,              ///< 环岛后右转,右侧通行地区的逆时针环岛
    EC_NAVI_ICON_ROTARY_SLIGHT_LEFT            = 79,              ///< 环岛左前转,右侧通行地区的逆时针环岛
    EC_NAVI_ICON_ROTARY_SLIGHT_RIGHT           = 80,              ///< 环岛右前转,右侧通行地区的逆时针环岛
    EC_NAVI_ICON_MAX
};

enum ScreenType
{
    Circular_Instrument = 1,
    Square_Instrument
};

typedef struct
{
    char ssid[20];
    char password[10];
}_update_info_stru;

typedef struct 
{
    uint8_t BlueToothSignalSate;
	uint8_t BlueToothPhoneSate;//incall、outcall
	uint8_t  BlueToothPhoneName[100];
	char PhoneNumber[20];
    uint16_t PhoneBookTotalCount;
	char  BlueToothName[20];
    
}_BlueToothPhoneData;
typedef struct 
{
	unsigned char Data;
	unsigned char Moth;
	unsigned int  Year;
	unsigned char Hour;
    unsigned char Ninutes;
	unsigned char Second;
}_GPS_TIME;

typedef struct 
{
  uint8_t  navigation_state;
  uint8_t  EasyNavigationData;
  uint8_t  RoadName[100];
  uint32_t distance;
}_NavigationData_struct;
typedef struct 
{
   uint16_t x;
   uint16_t y;
   uint16_t width;
   uint16_t height;
  
}_QRCODE_RECT;

typedef struct
{
   uint16_t qr_pic_id;
   uint16_t main_pic_id;
   uint16_t qr_logo_id ;
   uint16_t update_pic_id;
   uint16_t second_menu;
   uint16_t navigation_task_id;
}_PICID_Struct;

typedef struct{
	uint8_t blearn;
	uint8_t strmac[6];
	uint16_t PressureVal;
	int temperature;
}ec_stru_TirePressure;

extern ec_stru_TirePressure ec_stru_pressure;
extern _update_info_stru update_info;
extern uint8_t UUID_Received;
extern _BlueToothPhoneData BlueToothPhoneData;
extern _GPS_TIME GPS_Time;
extern _NavigationData_struct NavigationData_st;
extern void PackedTransfer_DisplayPhoneMirrorQRcode(uint8_t data,_PICID_Struct PICID_OBJ);
extern void PackedTransfer_BlueTooth_DataSet(uint8_t data);
extern void PackedTransfer_GetPhoneBookCmd(void);
extern uint8_t GetPhoneMirrorst(void) ;
extern void PackedTransfer_EasyNavigation(uint8_t data);

extern void GerProgramVer(uint8_t * bufdata);
extern uint8_t GetErrorInfo();
extern uint8_t GetBACKUUIDSTATE();
extern uint8_t GetBlueToothPowerSTATE();

extern void SetBluetoothTurnXX(uint8_t data);
extern void SetScreenType(uint8_t ntype,_QRCODE_RECT rect_st);
extern void SetUUIDData(char *data,uint8_t len);
extern void Set_UIFinishData(uint8_t data);
extern void SetQRCodeTypeData(uint8_t data);
extern void SetUpdateCtrl(uint8_t cmddata,_QRCODE_RECT qrcode_obj);
extern void SetBlueToothName(uint8_t *data,uint8_t len);
extern void SetTaskbarHeight(uint16_t height);
extern void Set_Pro_Unique_Identifier(uint8_t *data,uint8_t len);
extern uint8_t GetUpdate(void);

#endif