#ifndef __BSP_H
#define __BSP_H

#include "includes.h"

#define GD32F10X_ID_ADDR  0x1FFFF7E8
#define GD32F30X_ID_ADDR  0x1FFFF7E8
extern uint32_t mcuID[3];
void cpuidGetId(void);

#define WATCHDOG_RESET_MAX_TIMES 		5
typedef struct _sys_eeprom_info {
	uint32_t DevType;
	uint32_t DevId;
	uint32_t NewVerFlag;		//0: normal; 1: update, has new version.
	uint32_t WdgRestCnt;
	uint32_t SftRestCnt;
	uint32_t PorRestCnt;
	uint32_t APP1Ver;
	uint32_t APP2Ver;
	uint32_t APP3Ver;
} sys_eeprom_info_t;


/**********************************************/
typedef enum AIR_STATE_ENUM {
	air_state_rcv,
	air_state_send
} AIR_STATE_ENUM;

extern uint8_t air_state;
//extern uint8_t lora_rcv[128];
extern uint8_t lora_flag;
extern uint16_t lora_rcv_len;
/**********************************************/

#define GATEWAY_ALRD  01
#define GATEWAY_INFO_ADDR 0x300


//#define RS485_RX()  {GPIO_ResetBits(GPIOB, GPIO_Pin_9);}
//#define RS485_TX()  {GPIO_SetBits(GPIOB, GPIO_Pin_9);}
#define RS485_RX()  {GPIO_ResetBits(GPIOA, GPIO_Pin_1);}
#define RS485_TX()  {GPIO_SetBits(GPIOA, GPIO_Pin_1);}

#define LED_RUN_ON()    {GPIO_ResetBits(GPIOC, GPIO_Pin_2);}
#define LED_RUN_OFF()   {GPIO_SetBits(GPIOC, GPIO_Pin_2);}

#define LED_MOD_ON()    {GPIO_ResetBits(GPIOC, GPIO_Pin_1);}
#define LED_MOD_OFF()   {GPIO_SetBits(GPIOC, GPIO_Pin_1);}

#define LED_RUN  PCout(2)
#define LED_MOD  PCout(1)

#define KEY2  GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_12)//读取按键0
#define KEY1  GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_13)//读取按键1
#define KEY0  GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_14)//读取按键2

#define KEY0_PRES 	1	//KEY0按下
#define KEY1_PRES	2	//KEY1按下
#define KEY2_PRES	3	//KEY2按下
#define WKUP_PRES   4	//KEY_UP按下(即WK_UP/KEY_UP)

#define USIM0_H()  {GPIO_SetBits(GPIOC, GPIO_Pin_9);}
#define USIM0_L()  {GPIO_ResetBits(GPIOC, GPIO_Pin_9);}

#define USIM1_H()  {GPIO_SetBits(GPIOA, GPIO_Pin_8);}
#define USIM1_L()  {GPIO_ResetBits(GPIOA, GPIO_Pin_8);}

#define USIM3_CD  GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_3)//读取USIM3_CD
#define USIM2_CD  GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_4)//读取USIM2_CD
#define USIM1_CD  GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_5)//读取USIM1_CD

#define USIM3_PWR_ON()   {GPIO_SetBits(GPIOC, GPIO_Pin_6);}
#define USIM3_PWR_OFF()  {GPIO_ResetBits(GPIOC, GPIO_Pin_6);}

#define USIM2_PWR_ON()   {GPIO_SetBits(GPIOC, GPIO_Pin_7);}
#define USIM2_PWR_OFF()  {GPIO_ResetBits(GPIOC, GPIO_Pin_7);}

#define USIM1_PWR_ON()   {GPIO_SetBits(GPIOC, GPIO_Pin_8);}
#define USIM1_PWR_OFF()  {GPIO_ResetBits(GPIOC, GPIO_Pin_8);}


enum _RESET_FLAG_{
    RESET_PINRST = 0x01, // NRST 引脚复位
    RESET_PORRSTF = 0x02, // 上电掉电复位
    RESET_SFTRSTF = 0x04, // 软件复位
    RESET_IWDGRSTF = 0x08, //独立看门狗复位
    RESET_WWDGRSTF = 0x10, // 窗口看门狗复位
    RESET_LPWRRSTF    = 0x20, // 低功耗复位
};





//#define LED_ON()      {GPIO_SetBits(GPIOE, GPIO_Pin_14);}
//#define LED_OFF()     {GPIO_ResetBits(GPIOE, GPIO_Pin_14);}
//#define LED_RUN  PEout(14)

//#define SW_POS1_ON()    {GPIO_ResetBits(GPIOD, GPIO_Pin_3);}
//#define SW_POS1_OFF()   {GPIO_SetBits(GPIOD, GPIO_Pin_3);}

//#define SW_POS2_ON()    {GPIO_ResetBits(GPIOD, GPIO_Pin_4);}
//#define SW_POS2_OFF()   {GPIO_SetBits(GPIOD, GPIO_Pin_4);}

//#define SW_ITSY1_ON()   {GPIO_SetBits(GPIOD, GPIO_Pin_5);}
//#define SW_ITSY1_OFF()  {GPIO_ResetBits(GPIOD, GPIO_Pin_5);}

//#define SW_ITSY2_ON()   {GPIO_SetBits(GPIOD, GPIO_Pin_6);}
//#define SW_ITSY2_OFF()  {GPIO_ResetBits(GPIOD, GPIO_Pin_6);}

//#define LED_ON_ALL()  {GPIO_ResetBits(GPIOD, GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);\
//										   GPIO_ResetBits(GPIOC, GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9);}
//#define LED_OFF_ALL() {GPIO_SetBits(GPIOD, GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);\
//										   GPIO_SetBits(GPIOC, GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9);}

//#define LED0_ON()  {GPIO_ResetBits(GPIOD, GPIO_Pin_12);}
//#define LED0_OFF() {GPIO_SetBits(GPIOD, GPIO_Pin_12);}

//#define LED1_ON()  {GPIO_ResetBits(GPIOD, GPIO_Pin_13);}
//#define LED1_OFF() {GPIO_SetBits(GPIOD, GPIO_Pin_13);}

//#define LED2_ON()  {GPIO_ResetBits(GPIOD, GPIO_Pin_14);}
//#define LED2_OFF() {GPIO_SetBits(GPIOD, GPIO_Pin_14);}

//#define LED3_ON()  {GPIO_ResetBits(GPIOD, GPIO_Pin_15);}
//#define LED3_OFF() {GPIO_SetBits(GPIOD, GPIO_Pin_15);}

//#define LED4_ON()  {GPIO_ResetBits(GPIOC, GPIO_Pin_6);}
//#define LED4_OFF() {GPIO_SetBits(GPIOC, GPIO_Pin_6);}

//#define LED5_ON()  {GPIO_ResetBits(GPIOC, GPIO_Pin_7);}
//#define LED5_OFF() {GPIO_SetBits(GPIOC, GPIO_Pin_7);}

//#define LED6_ON()  {GPIO_ResetBits(GPIOC, GPIO_Pin_8);}
//#define LED6_OFF() {GPIO_SetBits(GPIOC, GPIO_Pin_8);}

//#define LED7_ON()  {GPIO_ResetBits(GPIOC, GPIO_Pin_9);}
//#define LED7_OFF() {GPIO_SetBits(GPIOC, GPIO_Pin_9);}

//#define KEY0  GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8)//读取按键0

//#define KEY0_PRES 	1	//KEY0按下
//#define KEY1_PRES	2	//KEY1按下
//#define KEY2_PRES	3	//KEY2按下
//#define WKUP_PRES   4	//KEY_UP按下(即WK_UP/KEY_UP)

#define OFFSET_OF(type, member) ((int)(size_t)&(((type *)0)->member))
#define CONTAINER_OF(ptr, type, member) \
		((type *)(void *)(((char *)(ptr)) - OFFSET_OF(type, member)))

#define BOOT_LOGO_INFO  \
	"\r\n"	\
	"********************************************************\r\n"	\
	"* Copyright (c) GoldenBean Technology Co.,Ltd.         *\r\n"	\
	"* All rights Reserved.                                 *\r\n"	\
	"********************************************************\r\n"
	
void BSP_Init(void);
void data_dump(const char *name, uint8_t *data, uint16_t length);
void SysTick_init(void);
void board_info_get(uint16_t *flash_size, uint16_t *ram_size, uint8_t * chip_id);
int adc_test(void);
void system_info_update_pos(uint32_t pos, uint32_t value);
void system_info_update(sys_eeprom_info_t *p_info);

void system_info_get(sys_eeprom_info_t *p_info);
uint8_t KEY_Scan(uint8_t mode);
extern uint8_t check_usim_status(uint8_t type);

void sim_switch(uint8_t code);
void gateway_power_info_get(void);

extern uint32_t system_reset_flag_get(void);
extern void getcpuTypeIdcode(void);
#endif
