From 67ca69985af9109a0603a1cde71f21b940c059ff Mon Sep 17 00:00:00 2001 From: chen <15335560115@163.com> Date: 星期四, 15 五月 2025 09:12:53 +0800 Subject: [PATCH] 完全将免布线标签代码移植过来版本 --- keil/include/components/internet/inc/Socket.h | 355 + keil/include/drivers/mk_4G.h | 53 keil/include/components/hido/Include/HIDO_VLQueue.h | 40 keil/include/src/TCPClient.h | 59 keil/include/components/hido/Include/HIDO_TypeDef.h | 73 keil/include/components/hido/Include/HIDO_ArraryQueue.h | 22 keil/include/components/hido/Include/HIDO_Json.h | 132 keil/include/components/hido/hido.lib | 0 keil/include/components/hido/Include/HIDO_Shell.h | 32 keil/include/drivers/mk_4G.c | 53 keil/include/components/internet/inc/AIR780ECSQ.h | 30 keil/include/components/hido/Include/HIDO_Base64.h | 29 keil/include/components/internet/src/AIR780EFSM.c | 1598 ++++++++ keil/include/components/internet/src/AIR780EDriver.c | 637 +++ keil/include/main/main.c | 74 keil/include/components/hido/Include/HIDO_CRC16.h | 8 keil/include/components/internet/src/AIR780ECSQ.c | 148 keil/include/drivers/global_param.h | 6 keil/include/components/hido/Include/HIDO_Debug.h | 30 keil/include/components/internet/inc/AIR780EDriver.h | 58 keil/include/drivers/sn74hc595.h | 16 keil/include/drivers/PCA9555.c | 542 +++ keil/include/drivers/sn74hc595.c | 149 keil/include/components/internet/inc/ATConfig.h | 38 keil/include/drivers/PCA9555.h | 80 keil/include/drivers/mk_power.c | 8 keil/include/components/hal/UART.c | 472 ++ keil/include/components/internet/inc/Module.h | 368 ++ keil/include/components/internet/src/AIR780ESocket.c | 513 ++ keil/include/components/hido/Include/HIDO_Log.h | 38 keil/include/components/hido/Include/HIDO_Lock.h | 9 keil/include/drivers/dw_tag.h | 50 keil/include/components/internet/src/Internet.c | 128 keil/include/components/hido/Include/HIDO_Util.h | 48 keil/include/components/internet/src/Socket.c | 893 ++++ keil/include/drivers/dw_tag.c | 138 keil/include/components/hido/Include/HIDO_LWIPTimer.h | 6 keil/include/src/gps.c | 150 keil/include/components/hido/Include/HIDO_Bit.h | 31 keil/include/components/internet/inc/AIR780ESocket.h | 33 keil/include/components/internet/inc/Internet.h | 37 keil/uci_fira.uvprojx | 92 keil/include/components/hido/Include/HIDO_ModbusCRC16.h | 8 keil/include/drivers/uwb_app.c | 1137 ++++++ keil/include/drivers/mk_misc.c | 19 user_config.h | 3 keil/include/drivers/dw_app_anchor.c | 57 keil/include/components/hido/Include/HIDO_ModbusMaster.h | 15 keil/include/components/app/src/ranging_fira.c | 155 keil/include/components/hido/Include/HIDO_BaseQueue.h | 29 keil/include/components/hido/Include/HIDO_ATLite.h | 110 keil/include/components/internet/inc/AIR780EFSM.h | 121 keil/include/components/hido/Include/HIDO_Modbus.h | 128 keil/include/components/hido/Include/HIDO_CRC32.h | 10 keil/include/components/hido/Include/HIDO_FSM.h | 206 + keil/include/drivers/dw_app_anchor.h | 46 keil/include/components/hido/Include/HIDO_FIFO.h | 85 keil/include/components/hido/Include/HIDO_Input.h | 69 keil/include/src/TCPClient.c | 448 ++ keil/include/components/hido/Include/HIDO_ATLiteParse.h | 13 keil/include/components/internet/src/Module.c | 556 +++ keil/include/components/hido/Include/HIDO_ModbusSlave.h | 16 keil/include/components/hido/Include/HIDO_Timer.h | 35 keil/include/components/libc/libc.c | 52 keil/include/components/hal/UART.h | 80 keil/include/components/hido/Include/md5.h | 76 66 files changed, 10,680 insertions(+), 70 deletions(-) diff --git a/keil/include/components/app/src/ranging_fira.c b/keil/include/components/app/src/ranging_fira.c index 0502ed5..004015d 100644 --- a/keil/include/components/app/src/ranging_fira.c +++ b/keil/include/components/app/src/ranging_fira.c @@ -105,6 +105,10 @@ static void ranging_tx_process(struct MAC_HW_REPORT_T *tx_report); static void ranging_rx_process(struct MAC_HW_REPORT_T *rx_report); +void normal_uwb_change_to_fira(void); +void fira_uwb_change_to_normal(void); +void uwb_normal_init(void); +void uwb_fira_init(void); void app_session_init(void); //------------------------------------------------------------------------------ @@ -140,7 +144,8 @@ } void ranging_configure(void) -{ +{ + normal_uwb_change_to_fira();//变为fira配置的uwb fira_keys_generate(); aes_update_key(AES_ID0, &fira_key.devPayKey.ukey.keyByte[0]); @@ -236,7 +241,154 @@ LOG_INFO(TRACE_NO_REPORT_HOST | TRACE_MODULE_FIRA, "slot duration %d slots per round %d ranging interval %d\r\n", uwb_app_config.session_param.slot_duration, uwb_app_config.session_param.slots_per_round, uwb_app_config.session_param.ranging_interval); } +struct mk_uwb_configure +{ + uint8_t phy_work_mode; /* PHY_TX / PHY_RX / PHT_TX|PHY_RX */ + struct UWB_CONFIG_T phy_cfg; +}; +#ifdef DW1000 +/* Default communication configuration. */ +static struct mk_uwb_configure config = {//yuan + .phy_work_mode = (uint8_t)(PHY_TX | PHY_RX), + .phy_cfg.ch_num = UWB_CH_NUM, /* Channel number. */ + .phy_cfg.code_index = 9, /* TRX preamble code */ + .phy_cfg.mean_prf = MEAN_PRF_64M, /* Mean prf 64/128/256M */ + .phy_cfg.data_bit_rate = DATA_BR_6M8, /* Data rate 6.8M */ + .phy_cfg.sync_sym = PREAM_LEN_128, /* Preamble duration, length of preamble 128 */ + .phy_cfg.sfd_sym = NON_STD_NSFD5_8, /* Identifier for SFD sequence */ + .phy_cfg.ranging_bit = 1, /* ranging bit set 1 */ + .phy_cfg.trx_mode = TRX_MODE_15_4A, /* IEEE802.15.4z - BPRF mode */ + .phy_cfg.sts_pkt_cfg = STS_PKT_CFG_0, /* SP0 Frame */ + .phy_cfg.sts_segnum = STS_SEGNUM_BPRF_1, /* Number of STS segments in the frame */ + .phy_cfg.sts_seglen = STS_SEGLEN_BPRF_64, /* Number of symbols in an STS segment */ + .phy_cfg.rx_ant_id = UWB_RX_ANT_3, /* UWB RX antenna port */ +}; +#elif defined STS_MODE +static struct mk_uwb_configure config = { + .phy_work_mode = (uint8_t)(PHY_TX | PHY_RX), + .phy_cfg.ch_num = 5, /* Channel number. */ + .phy_cfg.code_index = 9, /* TRX preamble code */ + .phy_cfg.mean_prf = MEAN_PRF_64M, /* Mean prf 64/128/256M */ + .phy_cfg.data_bit_rate = DATA_BR_6M8, /* Data rate 6.8M */ + .phy_cfg.sync_sym = PREAM_LEN_128, /* Preamble duration, length of preamble 128 */ + .phy_cfg.sfd_sym = BPRF_NSFD2_8, /* Identifier for SFD sequence */ + .phy_cfg.ranging_bit = 1, /* ranging bit set 1 */ + .phy_cfg.trx_mode = TRX_MODE_15_4Z_BPRF, /* IEEE802.15.4z - BPRF mode */ + .phy_cfg.sts_pkt_cfg = STS_PKT_CFG_1, /* SP1 Frame */ + .phy_cfg.sts_segnum = STS_SEGNUM_BPRF_1, /* Number of STS segments in the frame */ + .phy_cfg.sts_seglen = STS_SEGLEN_BPRF_64, /* Number of symbols in an STS segment */ + .phy_cfg.rx_ant_id = UWB_RX_ANT_3, /* UWB RX antenna port */ +}; +/* Use the default key and IV specified in the IEEE 802.15.4z attachment */ +static struct UWB_STS_KEY_CONFIG_T sts_iv_key = { + .sts_vcounter = 0x1F9A3DE4, + .sts_vupper0 = 0xD37EC3CA, + .sts_vupper1 = 0xC44FA8FB, + .sts_vupper2 = 0x362EEB34, + .sts_key0 = 0x14EB220F, + .sts_key1 = 0xF86050A8, + .sts_key2 = 0xD1D336AA, + .sts_key3 = 0x14148674, +}; +#else //MKmode +/* Default communication configuration. */ +static struct mk_uwb_configure config = { + .phy_work_mode = (uint8_t)(PHY_TX | PHY_RX), + .phy_cfg.ch_num = 9, /* Channel number. */ + .phy_cfg.code_index = 9, /* TX preamble code. */ + .phy_cfg.mean_prf = MEAN_PRF_64M, /* Data rate 6.8M */ + .phy_cfg.data_bit_rate = DATA_BR_6M8, /* data rate 6.8M. */ + .phy_cfg.sync_sym = PREAM_LEN_128, /* Preamble duration, length of preamble 128 */ + .phy_cfg.sfd_sym = BPRF_NSFD2_8, /* Identifier for SFD sequence */ + .phy_cfg.ranging_bit = 1, /* ranging bit set. */ + .phy_cfg.trx_mode = TRX_MODE_15_4Z_BPRF, /* IEEE802.15.4z - BPRF mode */ + .phy_cfg.sts_pkt_cfg = STS_PKT_CFG_0, /* SP0 Frame */ + .phy_cfg.sts_segnum = STS_SEGNUM_BPRF_1, /* Number of STS segments in the frame */ + .phy_cfg.sts_seglen = STS_SEGLEN_BPRF_64, /* Number of symbols in an STS segment */ + .phy_cfg.rx_ant_id = UWB_RX_ANT_3, /* UWB RX antenna port */ +}; +#endif +uint8_t normal_flag; +void uwb_fira_init(void) +{ + uwb_open(); + // set advanced parameters + struct PHY_ADV_CONFIG_T adv_config = + { + // RPM0: 40, RPM3: 60 + .thres_fap_detect = 60, + // RPM0: 4, RPM3: 8 + .nth_scale_factor = 8, + // RFrame SP0: 0/1, Others: 0/1/2/3 + .ranging_performance_mode = 3, +#if RX_ANT_PORTS_NUM == 4 + .skip_weakest_port_en = 1, +#else + .skip_weakest_port_en = 0, +#endif + }; + phy_adv_params_configure(&adv_config); + + // which RX ports will be used for AoA/PDoA + phy_rx_ant_mode_set(RX_ANT_PORTS_COMBINATION); + + uwbs_init(); + uwb_app_config.ranging_flow_mode = (uint8_t)(RANGING_FLOW_FIRA); + uwb_app_config.filter_en = (uint8_t)(FILTER_EN); + uwb_app_config.session_param.tx_power_level = board_param.tx_power_fcc[CALIB_CH(uwb_app_config.ppdu_params.ch_num)]; + uwb_app_config.ppdu_params.rx_ant_id = (uint8_t)(RX_MAIN_ANT_PORT); +} +void uwb_normal_init(void) +{ + // The following peripherals will be initialized in the uwb_open function + // phy/mac/aes/lsp/phy timers initialized + uwb_open(); +#ifdef STS_MODE + // Set STS key and IV + phy_sts_key_configure(&sts_iv_key); +#endif + // Set calibration parameters + uwb_calibration_params_set(config.phy_cfg.ch_num); +#ifdef STS_MODE + + // set advanced parameters + struct PHY_ADV_CONFIG_T adv_config = { + .thres_fap_detect = 40, + .nth_scale_factor = 4, + .ranging_performance_mode = 3, + .skip_weakest_port_en = 0, + }; +#else + // set advanced parameters + struct PHY_ADV_CONFIG_T adv_config = { + .thres_fap_detect = 40, + .nth_scale_factor = 4, + .ranging_performance_mode = 0, + .skip_weakest_port_en = 0, + }; +#endif + phy_adv_params_configure(&adv_config); + + // uwb configure + uwb_configure(config.phy_work_mode, board_param.tx_power_fcc[CALIB_CH(config.phy_cfg.ch_num)], &config.phy_cfg); +#if (defined STS_MODE) || (defined MK_MODE) + ranging_lib_init(); +#endif + ranging_frame_type_set(config.phy_cfg.sts_pkt_cfg); +} +void fira_uwb_change_to_normal(void) +{ +uwb_close(); +uwb_normal_init(); +normal_flag=1; +} +void normal_uwb_change_to_fira(void) +{ +uwb_close(); +uwb_fira_init(); +normal_flag=0; +} void ranging_start(void) { ranging_env.enable = 1; @@ -281,6 +433,7 @@ void ranging_stop(void) { ranging_env.enable = 0; + fira_uwb_change_to_normal();//变为normal配置的uwb ranging_monitor_stop(); LOG_INFO(TRACE_NO_REPORT_HOST | TRACE_MODULE_APP, "Ranging stop\r\n"); } diff --git a/keil/include/components/hal/UART.c b/keil/include/components/hal/UART.c new file mode 100644 index 0000000..f8a7388 --- /dev/null +++ b/keil/include/components/hal/UART.c @@ -0,0 +1,472 @@ +/******************************************************************************* + * File Name : Uart.c + * Description : + * Created on : 2018年4月24日 + * Author : 杜键 + *******************************************************************************/ + +/******************************************************************************* + * Include Files * + *******************************************************************************/ +#include "string.h" +#ifdef _USE_OS_ +#include "cmsis_os.h" +#endif +#include <stdio.h> +#include "HIDO_Util.h" +#include "HIDO_VLQueue.h" +#include "HIDO_ArraryQueue.h" +#include "HIDO_Lock.h" +#include "HIDO_ATLite.h" + +#include "UART.h" + +/******************************************************************************* + * Macro * + *******************************************************************************/ + +/******************************************************************************* + * Type Definition * + *******************************************************************************/ +typedef struct +{ +#ifdef _USE_OS_ + osMutexId m_mutexLock; +#endif + E_UartID m_eUartID; + enum UART_DEV_T m_eUartPort; + + E_UartTxMode m_eTxMode; + E_UartRxMode m_eRxMode; + + HIDO_UINT8 *m_pu8RxBuf; + HIDO_UINT32 m_u32RxBufSize; + HIDO_UINT8 *m_pu8RxLastPos; + HIDO_UINT8 *m_pu8RxBufEnd; + HIDO_ArraryQueueStruct m_stRxArraryQueue; + + HIDO_UINT8 *m_pu8TxBuf; + HIDO_UINT32 m_u32TxBufSize; + HIDO_UINT32 m_u32TxQueueMemberCnt; + HIDO_VLQStruct m_stTxVLQueue; + + HIDO_UINT8 m_u8RxValue; + HIDO_UINT32 m_u32Flag; + FN_RxISR m_fnRxISR; +} ST_UartInfo; + +/******************************************************************************* + * Local Variable * + *******************************************************************************/ +static ST_UartInfo l_astUartInfo[UART_ID_LAST]; + +/******************************************************************************* + * Local Function Declaration * + *******************************************************************************/ +static void uart_receive_callback(void *dev, uint32_t err_code); + +const static struct baud_map +{ + enum UART_BAUD_T baud; + HIDO_UINT32 u32Baud; +} baud_map[] = +{ + {BAUD_1200, 1200}, + {BAUD_2400, 2400}, + {BAUD_4800, 4800}, + {BAUD_9600, 9600}, + {BAUD_19200, 19200}, + {BAUD_38400, 38400}, + {BAUD_57600, 57600}, + {BAUD_115200, 115200}, + {BAUD_230400, 230400}, + {BAUD_460800, 460800}, + {BAUD_921600, 921600}, + {BAUD_1843200, 1843200}, + {BAUD_1000000, 1000000}, + {BAUD_2000000, 2000000}, +}; + +/******************************************************************************* + * Local Function * + *******************************************************************************/ +static enum UART_BAUD_T get_baud(HIDO_UINT32 u32Baud) +{ + for(HIDO_UINT32 i = 0; i < HIDO_ARRARY_COUNT(baud_map); i++) + { + if(u32Baud == baud_map[i].u32Baud) + { + return baud_map[i].baud; + } + } + + return BAUD_115200; +} + +/******************************************************************************* + * Global Function * + *******************************************************************************/ + +/******************************************************************************* + * Function Name : + * Description : + * Input : + * Output : + * Return : + * Author : 杜键 + * Modified Date: : 2018年4月24日 + *******************************************************************************/ +HIDO_INT32 Uart_Register(E_UartID _eUartID, enum UART_DEV_T _ePort) +{ + /* 初始化参数 */ + HIDO_UtilBzero(&l_astUartInfo[_eUartID], sizeof(ST_UartInfo)); + + l_astUartInfo[_eUartID].m_eUartPort = _ePort; + + return HIDO_OK; +} + +/******************************************************************************* + * Function Name : + * Description : + * Input : + * Output : + * Return : + * Author : 杜键 + * Modified Date: : 2018年4月24日 + *******************************************************************************/ +HIDO_INT32 Uart_Init(E_UartID _eUartID, ST_UartInit *_pstInit) +{ + if((HIDO_NULL == _pstInit) || (_eUartID >= UART_ID_LAST)) + { + return HIDO_ERR; + } + +#ifdef _USE_OS_ + l_astUartInfo[_eUartID].m_mutexLock = osMutexCreate(HIDO_NULL); +#endif + + struct UART_CFG_T uart_cfg = + { + .parity = UART_PARITY_NONE, + .stop = UART_STOP_BITS_1, + .data = UART_DATA_BITS_8, + .flow = UART_FLOW_CONTROL_NONE, + .rx_level = UART_RXFIFO_CHAR_1, + .tx_level = UART_TXFIFO_EMPTY, + .baud = get_baud(_pstInit->m_u32BaudRate), + .dma_en = false, + .int_rx = true, + .int_tx = false, + }; + + l_astUartInfo[_eUartID].m_eUartID = _eUartID; + l_astUartInfo[_eUartID].m_eTxMode = _pstInit->m_eTxMode; + l_astUartInfo[_eUartID].m_eRxMode = _pstInit->m_eRxMode; + + l_astUartInfo[_eUartID].m_pu8RxBuf = _pstInit->m_pu8RxBuf; + l_astUartInfo[_eUartID].m_u32RxBufSize = _pstInit->m_u32RxBufSize; + if(UART_RX_MODE_DMA == _pstInit->m_eRxMode) + { + l_astUartInfo[_eUartID].m_pu8RxLastPos= l_astUartInfo[_eUartID].m_pu8RxBuf; + l_astUartInfo[_eUartID].m_pu8RxBufEnd = l_astUartInfo[_eUartID].m_pu8RxBuf + l_astUartInfo[_eUartID].m_u32RxBufSize - 1; + } + else if(UART_RX_MODE_INT == _pstInit->m_eRxMode) + { + HIDO_ArraryQueueInit( + &l_astUartInfo[_eUartID].m_stRxArraryQueue, + _pstInit->m_pu8RxBuf, + _pstInit->m_u32RxBufSize, + sizeof(HIDO_UINT8)); + } + + l_astUartInfo[_eUartID].m_pu8TxBuf = _pstInit->m_pu8TxBuf; + l_astUartInfo[_eUartID].m_u32TxBufSize = _pstInit->m_u32TxBufSize; + l_astUartInfo[_eUartID].m_fnRxISR = _pstInit->m_fnRxISR; + l_astUartInfo[_eUartID].m_u32TxQueueMemberCnt = _pstInit->m_u32TxQueueMemberCnt; + + uart_open(l_astUartInfo[_eUartID].m_eUartPort, &uart_cfg); + + if((UART_TX_MODE_DMA == _pstInit->m_eTxMode) || (UART_TX_MODE_INT == _pstInit->m_eTxMode)) + { + HIDO_VLQInit( + &(l_astUartInfo[_eUartID].m_stTxVLQueue), + _pstInit->m_pu8TxBuf, + _pstInit->m_u32TxBufSize, + _pstInit->m_u32TxQueueMemberCnt); + } + + if (UART_RX_MODE_INT == _pstInit->m_eRxMode) + { + uart_receive(l_astUartInfo[_eUartID].m_eUartPort, &l_astUartInfo[_eUartID].m_u8RxValue, 1, uart_receive_callback); + } + + return HIDO_OK; +} + + +/******************************************************************************* + * Function Name : + * Description : + * Input : + * Output : + * Return : + * Author : 杜键 + * Modified Date: : 2018年4月24日 + *******************************************************************************/ +HIDO_INT32 Uart_ReInit(E_UartID _eUartID) +{ + if(UART_RX_MODE_DMA == l_astUartInfo[_eUartID].m_eRxMode) + { + l_astUartInfo[_eUartID].m_pu8RxLastPos= l_astUartInfo[_eUartID].m_pu8RxBuf; + l_astUartInfo[_eUartID].m_pu8RxBufEnd = l_astUartInfo[_eUartID].m_pu8RxBuf + l_astUartInfo[_eUartID].m_u32RxBufSize - 1; + } + else if(UART_RX_MODE_INT == l_astUartInfo[_eUartID].m_eRxMode) + { + HIDO_ArraryQueueInit( + &l_astUartInfo[_eUartID].m_stRxArraryQueue, + l_astUartInfo[_eUartID].m_pu8RxBuf, + l_astUartInfo[_eUartID].m_u32RxBufSize, + sizeof(HIDO_UINT8)); + } + + if((UART_TX_MODE_DMA == l_astUartInfo[_eUartID].m_eTxMode) || (UART_TX_MODE_INT == l_astUartInfo[_eUartID].m_eTxMode)) + { + HIDO_VLQInit( + &(l_astUartInfo[_eUartID].m_stTxVLQueue), + l_astUartInfo[_eUartID].m_pu8TxBuf, + l_astUartInfo[_eUartID].m_u32TxBufSize, + l_astUartInfo[_eUartID].m_u32TxQueueMemberCnt); + } + + uart_receive(l_astUartInfo[_eUartID].m_eUartPort, &l_astUartInfo[_eUartID].m_u8RxValue, 1, uart_receive_callback); + + return HIDO_OK; +} + +/******************************************************************************* + * Function Name : + * Description : + * Input : + * Output : + * Return : + * Author : 杜键 + * Modified Date: : 2018年4月24日 + *******************************************************************************/ +HIDO_INT32 Uart_ReConfigBaudRate(E_UartID _eUartID, HIDO_UINT32 _u32BaudRate) +{ + uart_close(l_astUartInfo[_eUartID].m_eUartPort); + + struct UART_CFG_T uart_cfg = + { + .parity = UART_PARITY_NONE, + .stop = UART_STOP_BITS_1, + .data = UART_DATA_BITS_8, + .flow = UART_FLOW_CONTROL_NONE, + .rx_level = UART_RXFIFO_CHAR_1, + .tx_level = UART_TXFIFO_EMPTY, + .baud = get_baud(_u32BaudRate), + .dma_en = false, + .int_rx = true, + .int_tx = false, + }; + + uart_open(l_astUartInfo[_eUartID].m_eUartPort, &uart_cfg); + + return HIDO_OK; +} + +/******************************************************************************* + * Function Name : + * Description : + * Input : + * Output : + * Return : + * Author : 杜键 + * Modified Date: : 2018年4月24日 + *******************************************************************************/ +static void uart_send_callback(void *dev, uint32_t err_code) +{ + E_UartID eUartID = (E_UartID) 0; + + for (eUartID = (E_UartID) 0; eUartID < UART_ID_LAST; eUartID++) + { + if (l_astUartInfo[eUartID].m_eUartPort == *(enum UART_DEV_T *)dev) + { + if(UART_TX_MODE_DMA == l_astUartInfo[eUartID].m_eTxMode) + { + HIDO_VLQMemberStruct *pstMember = HIDO_NULL; + + pstMember = HIDO_VLQGetDequeueMember(&(l_astUartInfo[eUartID].m_stTxVLQueue)); + HIDO_VLQDequeue(&(l_astUartInfo[eUartID].m_stTxVLQueue), pstMember); + + pstMember = HIDO_VLQGetDequeueMember(&(l_astUartInfo[eUartID].m_stTxVLQueue)); + if (pstMember) + { + uart_send(l_astUartInfo[eUartID].m_eUartPort, pstMember->m_pDataAddr, pstMember->m_u32DataLen, uart_send_callback); + } + } + else if(UART_TX_MODE_INT == l_astUartInfo[eUartID].m_eTxMode) + { + HIDO_VLQMemberStruct *pstMember = HIDO_NULL; + + pstMember = HIDO_VLQGetDequeueMember(&(l_astUartInfo[eUartID].m_stTxVLQueue)); + HIDO_VLQDequeue(&(l_astUartInfo[eUartID].m_stTxVLQueue), pstMember); + + pstMember = HIDO_VLQGetDequeueMember(&(l_astUartInfo[eUartID].m_stTxVLQueue)); + if (pstMember) + { + uart_send(l_astUartInfo[eUartID].m_eUartPort, pstMember->m_pDataAddr, pstMember->m_u32DataLen, uart_send_callback); + } + } + + break; + } + } +} + + +/******************************************************************************* + * Function Name : Uart_RxOverFromISR + * Description : + * Input : + * Output : + * Return : + * Author : 杜键 + * Modified Date: : 2018年4月24日 + *******************************************************************************/ +static void uart_receive_callback(void *dev, uint32_t err_code) +{ + E_UartID eUartID = UART_ID_4G; + + HIDO_UINT8 u8RecvByte = l_astUartInfo[eUartID].m_u8RxValue; + + HIDO_ArraryQueueIn(&l_astUartInfo[eUartID].m_stRxArraryQueue, &u8RecvByte); + + /* 启动INT接收 */ + uart_receive(l_astUartInfo[eUartID].m_eUartPort, &l_astUartInfo[eUartID].m_u8RxValue, 1, uart_receive_callback); +} + +/******************************************************************************* + * Function Name : + * Description : + * Input : + * Output : + * Return : + * Author : 杜键 + * Modified Date: : 2018年4月24日 + *******************************************************************************/ +HIDO_INT32 Uart_GetChar(E_UartID _eUartID, HIDO_UINT8 *_pu8Char) +{ + HIDO_INT32 i32Result = HIDO_ERR; + + if (HIDO_NULL == _pu8Char || _eUartID >= UART_ID_LAST) + { + return HIDO_ERR; + } + +#ifdef _USE_OS_ + osMutexWait(l_astUartInfo[_eUartID].m_mutexLock, osWaitForever); +#endif + + if (UART_RX_MODE_INT == l_astUartInfo[_eUartID].m_eRxMode) + { + if (HIDO_ArraryQueueOut(&l_astUartInfo[_eUartID].m_stRxArraryQueue, _pu8Char) == HIDO_OK) + { + i32Result = HIDO_OK; + } + } + +#ifdef _USE_OS_ + osMutexRelease(l_astUartInfo[_eUartID].m_mutexLock); +#endif + + return i32Result; +} + +/******************************************************************************* + * Function Name : + * Description : + * Input : + * Output : + * Return : + * Author : 杜键 + * Modified Date: : 2018年4月24日 + *******************************************************************************/ +HIDO_INT32 Uart_Send(E_UartID _eUartID, HIDO_UINT8 *_pu8Data, HIDO_UINT32 _u32Len) +{ + HIDO_INT32 i32Result = HIDO_OK; + + if (HIDO_NULL == _pu8Data || 0 == _u32Len || _eUartID >= UART_ID_LAST) + { + return HIDO_ERR; + } + +#ifdef _USE_OS_ + osMutexWait(l_astUartInfo[_eUartID].m_mutexLock, osWaitForever); +#endif + + if (UART_TX_MODE_DMA == l_astUartInfo[_eUartID].m_eTxMode) + { + HIDO_VLQMemberStruct *pstMember = HIDO_NULL; + + HIDO_Lock(); + pstMember = HIDO_VLQGetEnqueueMember(&(l_astUartInfo[_eUartID].m_stTxVLQueue), _u32Len); + + if (HIDO_NULL == pstMember) + { + HIDO_UnLock(); + i32Result = HIDO_ERR; + } + else + { + HIDO_VLQEnqueue(&(l_astUartInfo[_eUartID].m_stTxVLQueue), pstMember); + memcpy(pstMember->m_pDataAddr, _pu8Data, _u32Len); + pstMember = HIDO_VLQGetDequeueMember(&(l_astUartInfo[_eUartID].m_stTxVLQueue)); + HIDO_UnLock(); + + uart_send(l_astUartInfo[_eUartID].m_eUartPort, pstMember->m_pDataAddr, pstMember->m_u32DataLen, uart_send_callback); + } + } + else if (UART_TX_MODE_INT == l_astUartInfo[_eUartID].m_eTxMode) + { + HIDO_VLQMemberStruct *pstMember = HIDO_NULL; + + HIDO_Lock(); + pstMember = HIDO_VLQGetEnqueueMember(&(l_astUartInfo[_eUartID].m_stTxVLQueue), _u32Len); + + if (HIDO_NULL == pstMember) + { + HIDO_UnLock(); + i32Result = HIDO_ERR; + } + else + { + HIDO_VLQEnqueue(&(l_astUartInfo[_eUartID].m_stTxVLQueue), pstMember); + memcpy(pstMember->m_pDataAddr, _pu8Data, _u32Len); + pstMember = HIDO_VLQGetDequeueMember(&(l_astUartInfo[_eUartID].m_stTxVLQueue)); + HIDO_UnLock(); + + uart_send(l_astUartInfo[_eUartID].m_eUartPort, pstMember->m_pDataAddr, pstMember->m_u32DataLen, uart_send_callback); + } + } + else if (UART_TX_MODE_POLL == l_astUartInfo[_eUartID].m_eTxMode) + { + uart_send(l_astUartInfo[_eUartID].m_eUartPort, _pu8Data, _u32Len, NULL); + } + +#ifdef _USE_OS_ + osMutexRelease(l_astUartInfo[_eUartID].m_mutexLock); +#endif + + return i32Result; +} +HIDO_VOID HIDO_Lock(void) +{ + int_lock(); +} +HIDO_VOID HIDO_UnLock(void) +{ + uint32_t lock = int_lock(); + int_unlock(lock); +} diff --git a/keil/include/components/hal/UART.h b/keil/include/components/hal/UART.h new file mode 100644 index 0000000..8b7d662 --- /dev/null +++ b/keil/include/components/hal/UART.h @@ -0,0 +1,80 @@ +/******************************************************************************* + * File Name : Uart.h + * Description : + * Created on : 2018年4月24日 + * Author : 杜键 + *******************************************************************************/ + +#ifndef HAL_UART_H_ +#define HAL_UART_H_ +/******************************************************************************* + * Include Files * + *******************************************************************************/ +#include "HIDO_TypeDef.h" +#include "mk_uart.h" + +/******************************************************************************* + * Macro * + *******************************************************************************/ + +/******************************************************************************* + * Type Definition * + *******************************************************************************/ +typedef HIDO_VOID (*FN_RxISR)(HIDO_UINT8 _u8Byte); + +typedef enum +{ + UART_TX_MODE_DMA = 0, + UART_TX_MODE_INT, + UART_TX_MODE_POLL, +}E_UartTxMode; + +typedef enum +{ + UART_RX_MODE_DMA = 0, + UART_RX_MODE_INT, + UART_RX_MODE_INT_ISR, +}E_UartRxMode; + +typedef enum +{ + UART_ID_DBG = 0, + UART_ID_LORA, + UART_ID_GPS, + UART_ID_4G, + + UART_ID_LAST, +}E_UartID; + +typedef struct +{ + E_UartTxMode m_eTxMode; + E_UartRxMode m_eRxMode; + + HIDO_UINT8 *m_pu8RxBuf; + HIDO_UINT32 m_u32RxBufSize; + + HIDO_UINT8 *m_pu8TxBuf; + HIDO_UINT32 m_u32TxBufSize; + HIDO_UINT32 m_u32TxQueueMemberCnt; + FN_RxISR m_fnRxISR; + + HIDO_UINT32 m_u32BaudRate; +} ST_UartInit; + +/******************************************************************************* + * Global Function * + *******************************************************************************/ +HIDO_INT32 Uart_GetHandle(E_UartID _eUartID, HIDO_VOID **_ppUart); +HIDO_INT32 Uart_Register(E_UartID _eUartID, enum UART_DEV_T _ePort); +HIDO_INT32 Uart_Init(E_UartID _eUartID, ST_UartInit *_pstInit); +HIDO_INT32 Uart_ReInit(E_UartID _eUartID); +HIDO_INT32 Uart_ReConfigBaudRate(E_UartID _eUartID, HIDO_UINT32 _u32BaudRate); +HIDO_VOID Uart_RxErrorFromISR(HIDO_VOID *_pUart); +HIDO_VOID Uart_TxOverFromISR(HIDO_VOID *_pUart); +HIDO_VOID Uart_RxOverFromISR(HIDO_VOID *_pUart); +HIDO_INT32 Uart_PutChar(E_UartID _eUartID, HIDO_UINT8 _u8Char); +HIDO_INT32 Uart_GetChar(E_UartID _eUartID, HIDO_UINT8 *_pu8Char); +HIDO_INT32 Uart_Send(E_UartID _eUartID, HIDO_UINT8 *_pu8Data, HIDO_UINT32 _u32Len); + +#endif /* HAL_UART_H_ */ diff --git a/keil/include/components/hido/Include/HIDO_ATLite.h b/keil/include/components/hido/Include/HIDO_ATLite.h new file mode 100644 index 0000000..99683c9 --- /dev/null +++ b/keil/include/components/hido/Include/HIDO_ATLite.h @@ -0,0 +1,110 @@ +/* + * HIDO_ATLite.h + * + * Created on: 2017年9月5日 + * Author: YIYI + */ + +#ifndef _HIDO_ATLITE_H_ +#define _HIDO_ATLITE_H_ + +#include "HIDO_TypeDef.h" +#include "HIDO_FSM.h" + +/* 执行结果描述 */ +typedef enum +{ + HIDO_AT_EVENT_OK = HIDO_EVENT_EXIT + 1, /* 执行成功 */ + HIDO_AT_EVENT_ERROR, /* 执行失败 */ + HIDO_AT_EVENT_TIMEOUT, /* 执行超时 */ + HIDO_AT_EVENT_SEND_ERROR, /* 发送失败 */ + HIDO_AT_EVENT_LAST, +}HIDO_ATEventEnum; + +typedef struct HIDO_ATLiteDevice HIDO_ATLiteDeviceStruct; +typedef struct HIDO_ATLiteDeviceInitStruct HIDO_ATLiteDeviceInitStruct; + +/* AT指令集描述 */ +typedef struct HIDO_ATLiteCmdSet +{ + const HIDO_CHAR *m_pcCmd; + HIDO_UINT32 m_u32CmdEvent; +}HIDO_ATLiteCmdSetStruct; + +typedef HIDO_INT32 (*HIDO_ATLiteGetcFunc)(HIDO_ATLiteDeviceStruct *, HIDO_CHAR *); +typedef HIDO_INT32 (*HIDO_ATLiteReadLineFunc)(HIDO_ATLiteDeviceStruct *); +typedef HIDO_INT32 (*HIDO_ATLiteOutputFunc)(HIDO_ATLiteDeviceStruct *, HIDO_UINT8 *, HIDO_UINT32 ); + +#define AT_READ_CHAR_LF 0x0A +#define AT_READ_CHAR_CR 0x0D + +typedef enum +{ + AT_RAED_FLAG_NONE = 0, + AT_RAED_FLAG_GET_CR, + AT_RAED_FLAG_GET_LF, +}HIDO_ATReadFlagEnum; + +/* 驱动初始化描述 */ +struct HIDO_ATLiteDeviceInitStruct +{ + HIDO_FSMStruct *m_pstFSM; + const HIDO_ATLiteCmdSetStruct *m_pstAtSets; /* 指令集首地址 */ + HIDO_UINT32 m_u32AtSetsCount; /* 指令集个数 */ + HIDO_ATLiteGetcFunc m_fnGetc; + HIDO_ATLiteReadLineFunc m_fnReadLine; + HIDO_ATLiteOutputFunc m_fnOutput; + HIDO_CHAR *m_pcSendBuf; + HIDO_UINT32 m_u32SendBufSize; + HIDO_CHAR *m_pcLineBuf; + HIDO_UINT32 m_u32LineBufSize; + + HIDO_VOID *m_pUserData; +}; + +/* 驱动方法描述 */ +struct HIDO_ATLiteDevice +{ + HIDO_ATLiteDeviceStruct *m_pstNext; + const HIDO_ATLiteCmdSetStruct *m_pstAtSets; /* 指令集首地址 */ + HIDO_UINT32 m_u32AtSetsCount; /* 指令集个数 */ + + HIDO_ATLiteGetcFunc m_fnGetc; + HIDO_ATLiteReadLineFunc m_fnReadLine; + HIDO_ATLiteOutputFunc m_fnOutput; + + HIDO_CHAR *m_pcSendBuf; + HIDO_UINT32 m_u32SendBufSize; + HIDO_UINT32 m_u32SendLen; + + HIDO_CHAR *m_pcLineBuf; + HIDO_UINT32 m_u32LineBufSize; + HIDO_UINT32 m_u32LineLen; + HIDO_ATReadFlagEnum m_eLineReadFlag; + + HIDO_VOID *m_pUserData; + HIDO_UINT32 m_u32TimerID; + HIDO_FSMStruct *m_pstFSM; + +#define HIDO_AT_LITE_MAX_CMD_COUNT 64 /* 最大AT指令个数 */ +#define HIDO_AT_LITE_MATCH_FLAG_SET 0x01 /* 匹配标记被设置 */ +#define HIDO_AT_LITE_MATCH_FLAG_CLEAR 0x00 /* 匹配标记被清空 */ +#define HIDO_AT_LITE_MATCH_END_CHAR '\0' /* 匹配结束字符 */ + + HIDO_UINT8 m_au8MatchFlag[HIDO_AT_LITE_MAX_CMD_COUNT]; +}; + +HIDO_VOID HIDO_ATLiteRecvReset(HIDO_ATLiteDeviceStruct *_pstATDevice); +HIDO_VOID HIDO_ATLiteEvent(HIDO_ATLiteDeviceStruct *_pstATDevice, HIDO_UINT32 _u32Event, HIDO_VOID *_pArg); +HIDO_INT32 HIDO_ATLiteCmdSend(HIDO_ATLiteDeviceStruct *_pstATDevice, HIDO_UINT32 _u32TimeoutMs, const HIDO_CHAR *_pcCmdFmt, ...); +HIDO_INT32 HIDO_ATLiteDataSend(HIDO_ATLiteDeviceStruct *_pstATDevice, HIDO_UINT32 _u32TimeoutMs, HIDO_UINT8 *_pu8Data, HIDO_UINT32 _u32Len); +HIDO_INT32 HIDO_ATLiteCmdSendOver(HIDO_ATLiteDeviceStruct *_pstATDevice); +HIDO_VOID HIDO_ATLitePoll(void); +HIDO_VOID HIDO_ATLiteClean(HIDO_ATLiteDeviceStruct *_pstATDevice); +HIDO_VOID HIDO_ATLiteDebugOn(void); +HIDO_VOID HIDO_ATLiteDebugOff(void); +HIDO_BOOL HIDO_ATLiteGetDebugFlag(void); +HIDO_INT32 HIDO_ATLiteDeviceInit(HIDO_ATLiteDeviceStruct *_pstDevice, HIDO_ATLiteDeviceInitStruct *_pstInit); +HIDO_INT32 HIDO_ATLiteDeviceRegister(HIDO_ATLiteDeviceStruct *_pstDevice); + +#endif /* _HIDO_ATLITE_H_ */ diff --git a/keil/include/components/hido/Include/HIDO_ATLiteParse.h b/keil/include/components/hido/Include/HIDO_ATLiteParse.h new file mode 100644 index 0000000..e35ad21 --- /dev/null +++ b/keil/include/components/hido/Include/HIDO_ATLiteParse.h @@ -0,0 +1,13 @@ +/* + * HIDO_ATLiteParse.h + * + * Created on: 2017年9月5日 + * Author: YIYI + */ + +#ifndef _HIDO_ATLITEPARSE_H_ +#define _HIDO_ATLITEPARSE_H_ + +HIDO_VOID HIDO_ATLiteCmdParse(HIDO_ATLiteDeviceStruct *_pstDevice); + +#endif /* _HIDO_ATLITEPARSE_H_ */ diff --git a/keil/include/components/hido/Include/HIDO_ArraryQueue.h b/keil/include/components/hido/Include/HIDO_ArraryQueue.h new file mode 100644 index 0000000..f35725f --- /dev/null +++ b/keil/include/components/hido/Include/HIDO_ArraryQueue.h @@ -0,0 +1,22 @@ +#ifndef _ARRARY_QUEUE_H_ +#define _ARRARY_QUEUE_H_ + +#include "HIDO_TypeDef.h" + +typedef struct +{ + HIDO_UINT32 m_u32Rear; + HIDO_UINT32 m_u32Front; + HIDO_VOID *m_pArraryBuf; + HIDO_UINT32 m_u32ArraryLen; + HIDO_UINT32 m_u32MemberSize; +} HIDO_ArraryQueueStruct; + +HIDO_VOID HIDO_ArraryQueueInit(HIDO_ArraryQueueStruct *_pstQueue, HIDO_VOID *_pArraryBuf, HIDO_UINT32 _u32ArraryLen, HIDO_UINT32 _u32MemberSize); +HIDO_INT32 HIDO_ArraryQueueIn(HIDO_ArraryQueueStruct *_pstQueue, HIDO_VOID *_pMember); +HIDO_INT32 HIDO_ArraryQueueOut(HIDO_ArraryQueueStruct *_pstQueue, HIDO_VOID *_pMember); +HIDO_BOOL HIDO_ArraryQueueIsEmpty(HIDO_ArraryQueueStruct *_pstQueue); +HIDO_BOOL HIDO_ArraryQueueIsInited(HIDO_ArraryQueueStruct *_pstQueue); +HIDO_BOOL HIDO_ArraryQueueIsFull(HIDO_ArraryQueueStruct *_pstQueue); + +#endif /* _HIDO_ARRARYQUEUE_H_ */ diff --git a/keil/include/components/hido/Include/HIDO_Base64.h b/keil/include/components/hido/Include/HIDO_Base64.h new file mode 100644 index 0000000..61c5977 --- /dev/null +++ b/keil/include/components/hido/Include/HIDO_Base64.h @@ -0,0 +1,29 @@ +/******************************************************************************* + * File Name : HIDO_Base64.h + * Description : + * Created on : 2018年6月1日 + * Author : www.hido-studio.com + *******************************************************************************/ + +#ifndef HIDOLIBRARY_UTIL_HIDO_BASE64_H_ +#define HIDOLIBRARY_UTIL_HIDO_BASE64_H_ +/******************************************************************************* + * Include Files * + *******************************************************************************/ +#include "HIDO_TypeDef.h" + +/******************************************************************************* + * Macro * + *******************************************************************************/ + +/******************************************************************************* + * Type Definition * + *******************************************************************************/ + +/******************************************************************************* + * Global Function * + *******************************************************************************/ +HIDO_INT32 HIDO_Base64Encode(HIDO_UINT8 *_pcSrc, HIDO_UINT32 _u32SrcLen, HIDO_CHAR *_pcDst, HIDO_UINT32 _u32DstSize); +HIDO_INT32 HIDO_Base64Decode(HIDO_CHAR *_pcSrc, HIDO_UINT8 *_pu8Dst, HIDO_UINT32 _u32DstSize, HIDO_UINT32 *_pu32DstLen); + +#endif /* HIDOLIBRARY_UTIL_HIDO_BASE64_H_ */ diff --git a/keil/include/components/hido/Include/HIDO_BaseQueue.h b/keil/include/components/hido/Include/HIDO_BaseQueue.h new file mode 100644 index 0000000..4e07224 --- /dev/null +++ b/keil/include/components/hido/Include/HIDO_BaseQueue.h @@ -0,0 +1,29 @@ +#ifndef _BASEQUEUE_H_ +#define _BASEQUEUE_H_ + +#include "HIDO_TypeDef.h" + +typedef struct +{ + HIDO_UINT32 m_u32UsedCnt; + HIDO_UINT32 m_u32Front; + HIDO_UINT32 m_u32Rear; + HIDO_UINT32 m_u32TotalCnt; +}HIDO_BaseQueueStruct; + +typedef struct +{ + HIDO_VOID *m_pAddr; + HIDO_UINT32 m_u32Len; +}HIDO_BaseQueueMemInfoStruct; + +HIDO_INT32 HIDO_BaseQueueInit(HIDO_BaseQueueStruct *_pstBaseQ, HIDO_UINT32 _u32TotalCnt); +HIDO_INT32 HIDO_BaseQueueEnqueue(HIDO_BaseQueueStruct *_pstBaseQ, HIDO_UINT32 _u32EnqueueCnt); +HIDO_INT32 HIDO_BaseQueueDequeue(HIDO_BaseQueueStruct *_pstBaseQ, HIDO_UINT32 _u32DequeueCnt); +HIDO_BOOL HIDO_BaseQueueIsEmpty(HIDO_BaseQueueStruct *_pstBaseQ); +HIDO_BOOL HIDO_BaseQueueIsFull(HIDO_BaseQueueStruct *_pstBaseQ); +HIDO_INT32 HIDO_BaseQueueGetContinuousSize(HIDO_BaseQueueStruct *_pstBaseQ, HIDO_UINT32 _u32Size, HIDO_UINT32 *_pu32Offset, HIDO_UINT32 *_pu32TotalLen); +HIDO_UINT32 HIDO_BaseQueueGetFront(HIDO_BaseQueueStruct *_pstBaseQ); +HIDO_UINT32 HIDO_BaseQueueGetRear(HIDO_BaseQueueStruct *_pstBaseQ); + +#endif /* _BASEQUEUE_H_ */ diff --git a/keil/include/components/hido/Include/HIDO_Bit.h b/keil/include/components/hido/Include/HIDO_Bit.h new file mode 100644 index 0000000..d4c420c --- /dev/null +++ b/keil/include/components/hido/Include/HIDO_Bit.h @@ -0,0 +1,31 @@ +#ifndef _HIDO_BIT_H_ +#define _HIDO_BIT_H_ + +#include "HIDO_TypeDef.h" + +typedef enum +{ + BIT_MODE_BIG_ENDIAN, + BIT_MODE_LITTLE_ENDIAN, +}HIDO_BitModeEnum; + +HIDO_VOID HIDO_BitCopy( + HIDO_UINT8 *_pu8Dst, /* 目标 */ + HIDO_BitModeEnum _eDstBitMode, /* 目标比特模式 */ + HIDO_UINT32 _u32DstBitOffset, /* 目标比特偏移 */ + const HIDO_UINT8 *_pu8Src, /* 源 */ + HIDO_BitModeEnum _eSrcBitMode, /* 源比特模式 */ + HIDO_UINT32 _u32SrcBitOffset, /* 源比特偏移 */ + HIDO_UINT32 _u32CopyBitCount /* 拷贝的比特数 */ + ); +HIDO_VOID HIDO_BitCopyAndNot( + HIDO_UINT8 *_pu8Dst, /* 目标 */ + HIDO_BitModeEnum _eDstBitMode, /* 目标比特模式 */ + HIDO_UINT32 _u32DstBitOffset, /* 目标比特偏移 */ + const HIDO_UINT8 *_pu8Src, /* 源 */ + HIDO_BitModeEnum _eSrcBitMode, /* 源比特模式 */ + HIDO_UINT32 _u32SrcBitOffset, /* 源比特偏移 */ + HIDO_UINT32 _u32CopyBitCount /* 拷贝的比特数 */ + ); + +#endif /* _HIDO_BIT_H_ */ diff --git a/keil/include/components/hido/Include/HIDO_CRC16.h b/keil/include/components/hido/Include/HIDO_CRC16.h new file mode 100644 index 0000000..5bae15c --- /dev/null +++ b/keil/include/components/hido/Include/HIDO_CRC16.h @@ -0,0 +1,8 @@ +#ifndef _HIDO_CRC16_H_ +#define _HIDO_CRC16_H_ + +#include "HIDO_TypeDef.h" + +HIDO_UINT16 HIDO_CRC16Calc(HIDO_UINT8 *_u8Data, HIDO_UINT32 _u16Len); + +#endif /* _HIDO_CRC32_H_ */ diff --git a/keil/include/components/hido/Include/HIDO_CRC32.h b/keil/include/components/hido/Include/HIDO_CRC32.h new file mode 100644 index 0000000..fe212d8 --- /dev/null +++ b/keil/include/components/hido/Include/HIDO_CRC32.h @@ -0,0 +1,10 @@ +#ifndef _HIDO_CRC32_H_ +#define _HIDO_CRC32_H_ + +#include "HIDO_TypeDef.h" + +void HIDO_CRC32Init(void); +HIDO_UINT32 HIDO_CRC32SubCalc(HIDO_UINT32 _u32CRC32, HIDO_UINT8 *_pu8Buf, HIDO_UINT32 _u32BufLen); +HIDO_UINT32 HIDO_CRC32Calc(HIDO_UINT8 *_pu8Buf, HIDO_UINT32 _u32BufLen); + +#endif /* _HIDO_CRC32_H_ */ diff --git a/keil/include/components/hido/Include/HIDO_Debug.h b/keil/include/components/hido/Include/HIDO_Debug.h new file mode 100644 index 0000000..a675cf8 --- /dev/null +++ b/keil/include/components/hido/Include/HIDO_Debug.h @@ -0,0 +1,30 @@ +/******************************************************************************* + * File Name : DB_Debug.h + * Description : + * Created on : 2018年5月28日 + * Author : www.hido-studio.com + *******************************************************************************/ + +#ifndef DBLIBRARY_DEBUG_DB_DEBUG_H_ +#define DBLIBRARY_DEBUG_DB_DEBUG_H_ +/******************************************************************************* + * Include Files * + *******************************************************************************/ +#include "HIDO_TypeDef.h" + +/******************************************************************************* + * Macro * + *******************************************************************************/ + +/******************************************************************************* + * Type Definition * + *******************************************************************************/ + +/******************************************************************************* + * Global Function * + *******************************************************************************/ +HIDO_INT32 HIDO_Debug(const HIDO_CHAR *_pcFmt, ...); +HIDO_INT32 HIDO_DebugHex(const HIDO_UINT8 *_pu8Data, HIDO_UINT32 _u32Len); +HIDO_INT32 HIDO_DebugString(const HIDO_CHAR *_pu8String, HIDO_UINT32 _u32StringLen); + +#endif /* DBLIBRARY_DEBUG_HIDO_DEBUG_H_ */ diff --git a/keil/include/components/hido/Include/HIDO_FIFO.h b/keil/include/components/hido/Include/HIDO_FIFO.h new file mode 100644 index 0000000..78ecb13 --- /dev/null +++ b/keil/include/components/hido/Include/HIDO_FIFO.h @@ -0,0 +1,85 @@ +/******************************************************************************* + * File Name : HIDO_FIFO.h + * Description : + * Created on : 2018年4月26日 + * Author : www.hido-studio.com + *******************************************************************************/ + +#ifndef HIDOLIBRARY_FIFO_HIDO_FIFO_H_ +#define HIDOLIBRARY_FIFO_HIDO_FIFO_H_ +/******************************************************************************* + * Include Files * + *******************************************************************************/ +#include "HIDO_TypeDef.h" + +/******************************************************************************* + * Macro * + *******************************************************************************/ + +/******************************************************************************* + * Type Definition * + *******************************************************************************/ +typedef struct +{ +#define FIFO_DATA_DEL_FLAG_UNDEL 0xFF +#define FIFO_DATA_DEL_FLAG_DEL 0xDE + HIDO_UINT8 m_u8DelFlag; +#define FIFO_DATA_FLAG_USED 0xAB +#define FIFO_DATA_FLAG_UNUSED 0xFF + HIDO_UINT8 m_u8Flag; /* 标记,固定为0xAB,标识已使用 */ + HIDO_UINT8 m_u8DataLen; /* 数据长度,数据的最大长度=m_u32MemberSize-sizeof(ST_FIFOHeader) */ + +#define FIFO_DATA_TYPE_MID 0xAC +#define FIFO_DATA_TYPE_END 0xED + HIDO_UINT8 m_u8Type; /* 标识是都是一段数据的结束 */ +}HIDO_FIFOHeaderStruct; + +typedef struct FIFOStruct HIDO_FIFOStruct; +typedef struct FIFOInitStruct HIDO_FIFOInitStruct; +typedef HIDO_INT32 (*HIDO_FIFOReadFunc)(HIDO_FIFOStruct *_pstFIFO, HIDO_UINT32 _u32Addr, HIDO_UINT8 *_pu8Data, HIDO_UINT32 _u32Len); +typedef HIDO_INT32 (*HIDO_FIFOWriteFunc)(HIDO_FIFOStruct *_pstFIFO, HIDO_UINT32 _u32Addr, HIDO_UINT8 *_pu8Data, HIDO_UINT32 _u32Len); +typedef HIDO_INT32 (*HIDO_FIFOEraseFunc)(HIDO_FIFOStruct *_pstFIFO, HIDO_UINT32 _u32Addr); +typedef HIDO_INT32 (*HIDO_FIFOForEachFunc)(HIDO_FIFOStruct *_pstFIFO, HIDO_UINT32 _u32Index, HIDO_VOID *_pArg); + +struct FIFOStruct +{ + HIDO_UINT16 m_u16Reserve; + HIDO_UINT32 m_u32SectorSize; /* 存储介质的sector大小 */ + HIDO_UINT32 m_u32MemberSize; /* 成员大小 */ + HIDO_UINT32 m_u32ColCount; /* 有多少列,也就是一个sector可以容纳成员的总个数 */ + HIDO_UINT32 m_u32RowCount; /* 有多少行,也就是有多少个sector */ + + HIDO_UINT32 m_u32CurIndex; /* 当前索引,记录当前保存到了哪里 */ + HIDO_UINT32 m_u32TotalCount; /* 可以存储数据的总个数,= m_u32ColCount*m_u32RowCount */ + HIDO_UINT32 m_u32StartAddr; /* 数据保存的起始位置 */ + HIDO_UINT32 m_u32TotalSize; /* FIFO的总大小 */ + + HIDO_FIFOReadFunc m_fnRead; /* 介质读取方法 */ + HIDO_FIFOWriteFunc m_fnWrite; /* 介质写入方法 */ + HIDO_FIFOEraseFunc m_fnErase; /* 介质擦除方法 */ +}; + +struct FIFOInitStruct +{ + HIDO_UINT32 m_u32SectorSize; /* 存储介质的sector大小 */ + HIDO_UINT32 m_u32MemberSize; /* 成员大小 */ + HIDO_UINT32 m_u32TotalSize; /* FIFO的总大小 */ + HIDO_UINT32 m_u32StartAddr; /* 数据保存的起始位置 */ + + HIDO_FIFOReadFunc m_fnRead; /* 介质读取方法 */ + HIDO_FIFOWriteFunc m_fnWrite; /* 介质写入方法 */ + HIDO_FIFOEraseFunc m_fnErase; /* 介质擦除方法 */ +}; + +/******************************************************************************* + * Global Function * + *******************************************************************************/ +HIDO_INT32 HIDO_FIFOInit(HIDO_FIFOStruct *_pstFIFO, HIDO_FIFOInitStruct *_pstInit); +HIDO_INT32 HIDO_FIFOReadForEach(HIDO_FIFOStruct *_pstFIFO, HIDO_FIFOForEachFunc _fnForEach, HIDO_BOOL _bAsc, HIDO_VOID *_pArg); +HIDO_INT32 HIDO_FIFOReadMember(HIDO_FIFOStruct *_pstFIFO, HIDO_UINT32 _u32ReadIndex, HIDO_FIFOHeaderStruct *_pstDataHeader, HIDO_UINT8 *_pu8Data, HIDO_UINT32 *_pu32Len); +HIDO_INT32 HIDO_FIFODelFrontData(HIDO_FIFOStruct *_pstFIFO, HIDO_UINT32 _u32FrontIndex); +HIDO_INT32 HIDO_FIFOGetFrontData(HIDO_FIFOStruct *_pstFIFO, HIDO_UINT32 *_pu32FrontIndex, HIDO_UINT8 *_pu8Data, HIDO_UINT32 _u32DataSize, HIDO_UINT32 *_pu32Len); +HIDO_INT32 HIDO_FIFOWrite(HIDO_FIFOStruct *_pstFIFO, HIDO_UINT8 *_pu8Data, HIDO_UINT32 _u32Len); +HIDO_INT32 HIDO_FIFOClean(HIDO_FIFOStruct *_pstFIFO); + +#endif /* HIDOLIBRARY_FIFO_HIDO_FIFO_H_ */ diff --git a/keil/include/components/hido/Include/HIDO_FSM.h b/keil/include/components/hido/Include/HIDO_FSM.h new file mode 100644 index 0000000..73c5ab5 --- /dev/null +++ b/keil/include/components/hido/Include/HIDO_FSM.h @@ -0,0 +1,206 @@ +/******************************************************************************* + * File Name : PointTable.h + * Description : + * Created on : 2019年5月12日 + * Author : www.hido-studio.com + *******************************************************************************/ +#ifndef _HIDO_FSM_H_ +#define _HIDO_FSM_H_ + +/******************************************************************************* + * Include Files * + *******************************************************************************/ +#include "HIDO_TypeDef.h" +#include "stdarg.h" + +/******************************************************************************* + * Macro * + *******************************************************************************/ +#define HIDO_FSM_DECLARE(name) \ + extern HIDO_FSMStruct g_stFSM##name /* 声明一个状态机 */ + +#define HIDO_FSM_STATE_EXTERN(name) \ + extern const HIDO_StateStruct g_stState##name /* 声明一个状态 */ + +#define HIDO_FSM_DECLARE_IMPLEMENT(name) \ + HIDO_FSMStruct g_stFSM##name = { HIDO_NULL }; /* 实现一个状态机 */ + +#define HIDO_FSM_STATE_DECLARE(name) \ + extern const HIDO_StateStruct g_stState##name; \ + HIDO_INT32 name##Proc(HIDO_FSMStruct *_pstFSM, HIDO_UINT32 _u32Event, void *_pArg); + /* 声明状态机的一个状态,[name]状态的名字 */ + +#define HIDO_FSM_DETACHED_STATE(name) \ + extern HIDO_StateStruct g_stState##name; \ + HIDO_INT32 name##Proc(HIDO_FSMStruct *_pstFSM, HIDO_UINT32 _u32Event, void *_pArg); + /* 声明状态机的一个状态,[name]状态的名字 */ + +#define HIDO_FSM_STATE_FULL_DECLARE(parent, name) HIDO_FSM_STATE_DECLARE(name) + +#define HIDO_FSM_STATE_IMPLEMENT(name, parent, init) \ + const HIDO_StateStruct g_stState##name = { #name, parent, init, name##Proc }; \ + HIDO_INT32 name##Proc(HIDO_FSMStruct *_pstFSM, HIDO_UINT32 _u32Event, void *_pArg) + /* 实现一个状态 */ + +#define HIDO_FSM_DETACHED_STATE_IMPLEMENT(name, parent, init) \ + HIDO_StateStruct g_stState##name = { #name, parent, init, name##Proc }; \ + HIDO_INT32 name##Proc(HIDO_FSMStruct *_pstFSM, HIDO_UINT32 _u32Event, void *_pArg) + /* 实现一个状态 */ +#define HIDO_FSM_DETACHED_STATE_SETTLE(name, parent, init) \ + g_stState##name.m_pstParent = (parent);\ + g_stState##name.m_pstInit = (init); + /* 动态修改状态的关联关系,修改它的夫状态和子状态 */ +#define HIDO_FSM(name) (&g_stFSM##name) +#define HIDO_FSM_STATE(name) (&g_stState##name) + +#define HIDO_EVENT_ENTRY 0 /* 进入状态的事件 */ +#define HIDO_EVENT_EXIT 1 /* 退出状态的事件 */ +#define HIDO_EVENT_ENTRY_NAME "EVENT_ENTRY" /* 进入状态的事件名字 */ +#define HIDO_EVENT_EXIT_NAME "EVENT_EXIT" /* 退出状态的事件名字 */ + +#define HIDO_EVENT_OK 0 /* 事件执行OK */ +#define HIDO_EVENT_NO_PROC 1 /* 当前状态不能处理目标事件,需要由父状态完成 */ +#define HIDO_STATE_MAX_DEPTH 10 /* 状态机状态嵌套的最大深度 */ + +/******************************************************************************* + * Type Definition * + *******************************************************************************/ +typedef struct HIDO_StateStruct HIDO_StateStruct; +typedef struct HIDO_StateListStruct HIDO_StateListStruct; +typedef struct HIDO_FSMStruct HIDO_FSMStruct; +typedef struct HIDO_FSMQueueStruct HIDO_FSMQueueStruct; +typedef struct HIDO_FSMQueueDataStruct HIDO_FSMQueueDataStruct; + +/* 状态参数 */ +typedef struct +{ + HIDO_VOID *m_pArg; /* 用户参数指针 */ + const HIDO_StateStruct *m_pstAfterState; /* 事件执行完进入的下一个状态 */ +} HIDO_StateArgStruct; + +/* 状态的实现 */ +typedef HIDO_INT32 (* HIDO_DebugFunc)(HIDO_FSMStruct *_pstStateMachine, HIDO_INT32 _i32Level, HIDO_CHAR *_pcFmt, va_list _ap); +typedef HIDO_INT32 (* HIDO_StateFunc)(HIDO_FSMStruct *, HIDO_UINT32, void *); +struct HIDO_StateStruct +{ + const char *m_pcName; + const HIDO_StateStruct *m_pstParent; + const HIDO_StateStruct *m_pstInit; + HIDO_StateFunc m_fnProc; +}; + +/* 未使用 */ +struct HIDO_FSMQueueDataStruct +{ + HIDO_UINT32 m_u32Event; + void *m_pArg; +}; + +/* 未使用 */ +struct HIDO_FSMQueueStruct +{ + HIDO_UINT32 m_u32Cnt; + HIDO_UINT32 m_u32Rear; + HIDO_UINT32 m_u32Front; + HIDO_UINT32 m_u32Size; + HIDO_FSMQueueDataStruct *m_pstBuff; +}; + +/* 状态机的实现结构体 */ +struct HIDO_FSMStruct +{ +#define HIDO_FSM_DBG_FLAG_OFF 0 /* 开日志 */ +#define HIDO_FSM_DBG_FLAG_ON 1 /* 关日志 */ + + HIDO_UINT16 m_u16ID; /* 状态机ID 未使用 */ + HIDO_UINT16 m_u16DbgFlag; /* 状态机调试打印开关 */ + const HIDO_StateStruct *m_pstCurrentState; /* 状态机当前的状态 */ + void *m_pPrivateData; /* 状态机私有数据 */ + const char *m_pcName; /* 状态机名字 */ + const char * const*m_ppcEventName; /* 状态机事件名字名字 */ + HIDO_FSMStruct *m_pstNext; /* 未使用 */ + HIDO_FSMQueueStruct m_stEventQueue; /* 未使用 */ + HIDO_DebugFunc m_fnDebugFunc; +}; + +/* 未使用 */ +struct HIDO_StateListStruct +{ + const HIDO_StateStruct *m_pstState; + HIDO_StateListStruct *m_pstNext; +}; + +/******************************************************************************* + * Global Function * + *******************************************************************************/ +/******************************************************************************* + * Function Name : HIDO_FSMEventExecute + * Description : 状态机执行一个事件 + * Input : _ptStatMachine 状态机结构体指针 + * _uEvent 状态机的事件 + * _pArg 状态机执行事件时传递的参数 + * Output : None + * Return : None + * Author : www.hido-studio.com + * Modified Date: : 2019年07月15日 + *******************************************************************************/ +void HIDO_FSMEventExecute(HIDO_FSMStruct *_ptStateMachine, HIDO_UINT32 _uEvent, void *_pArg); + +/******************************************************************************* + * Function Name : HIDO_FSMRegister + * Description : 状态机注册 + * Input : _ptStatMachine 状态机结构体指针 + * _ptInitState 状态机的初始状态 + * _pcName 状态机的名字(用于调试打印) + * _ppcEventName 状态机时间的名字(用于调试打印) + * _pPrivateData 状态机私有数据,可以给状态机关联一个私有数据 + * _u16DbgFlag 调试开关 HIDO_FSM_DBG_FLAG_OFF=关 HIDO_FSM_DBG_FLAG_ON=开 + * Output : None + * Return : None + * Author : www.hido-studio.com + * Modified Date: : 2019年07月15日 + *******************************************************************************/ +void HIDO_FSMRegister(HIDO_FSMStruct *_ptStatMachine, const HIDO_StateStruct *_ptInitState, const char *_pcName, const char * const*_ppcEventName, + void *_pPrivateData, HIDO_UINT16 _u16DbgFlag); + +/******************************************************************************* + * Function Name : DB_FSMRegisterDebugFunc + * Description : + * Input : + * Output : + * Return : + * Author : DuJian + * Modified Date: : 2019年11月18日 + *******************************************************************************/ +HIDO_INT32 HIDO_FSMRegisterDebugFunc(HIDO_FSMStruct *_pstStatMachine, HIDO_DebugFunc _fnDebugFunc); + +/******************************************************************************* + * Function Name : HIDO_FSMStateChange + * Description : 状态机状态迁移接口 + * Input : _ptStateMachine 状态机结构体指针 + * _ptNewState 新的状态(状态迁移的目标状态) + * _pData 状态迁移时携带的数据 + * Output : None + * Return : None + * Author : www.hido-studio.com + * Modified Date: : 2019年07月15日 + *******************************************************************************/ +void HIDO_FSMStateChange(HIDO_FSMStruct *_ptStateMachine, const HIDO_StateStruct *_ptNewState, void *_pData); + +/******************************************************************************* + * Function Name : HIDO_FSMStartTimer + * Description : 状态机启动定时器接口 + * Input : _eTimerID 定时器的ID + * _u8Type 定时器的类型(同HIDO_Timer。h中的类型) + * _uTick 定时器的定时tick(单位ms) + * _ptStatMachine 状态机结构体指针 + * _uEvent 定时器超时后,向状态机发送的事件 + * Output : None + * Return : None + * Author : www.hido-studio.com + * Modified Date: : 2019年07月15日 + *******************************************************************************/ +void HIDO_FSMStartTimer(HIDO_UINT32 _eTimerID, HIDO_UINT8 _u8Type, HIDO_UINT32 _uTick, HIDO_FSMStruct *_ptStatMachine, HIDO_UINT32 _uEvent); + +#endif + diff --git a/keil/include/components/hido/Include/HIDO_Input.h b/keil/include/components/hido/Include/HIDO_Input.h new file mode 100644 index 0000000..7834651 --- /dev/null +++ b/keil/include/components/hido/Include/HIDO_Input.h @@ -0,0 +1,69 @@ +/******************************************************************************* + * File Name : HIDO_Input.h + * Description : + * Created on : 2018年4月26日 + * Author : www.hido-studio.com + *******************************************************************************/ +#ifndef _INPUT_H_ +#define _INPUT_H_ + +/******************************************************************************* + * Include Files * + *******************************************************************************/ +#include "HIDO_TypeDef.h" + +/******************************************************************************* + * Macro * + *******************************************************************************/ +#define CMD_LENGTH 100 +#define HISTORY_MAX_NUM 10 + +/******************************************************************************* + * Type Definition * + *******************************************************************************/ +typedef enum +{ + INPUT_LOGIN_STATE_USERNAME, + INPUT_LOGIN_STATE_PASSWORD, + INPUT_LOGIN_STATE_SUCCESS, +}HIDO_InputLoginStateEnum; + +typedef struct InputStruct +{ + struct InputStruct *m_pstNext; + HIDO_UINT8 m_u8DirectionState; + HIDO_UINT8 m_u8InputState; + HIDO_InputLoginStateEnum m_eLoginState; + HIDO_UINT32 m_u32LastInputTick; + HIDO_CHAR m_acInputUserName[16]; + HIDO_CHAR m_acInputPassWord[64]; + + HIDO_UINT32 m_u32CmdLen; + HIDO_INT32 m_i32CmdIndex; + HIDO_UINT32 m_u32CmdTabLen; + HIDO_INT32 m_i32CmdTabIndex; + HIDO_UINT32 m_u32CmdTabChange; + HIDO_UINT32 m_u32HistoryReadIndex; + HIDO_INT32 m_i32HistoryWriteIndex; + HIDO_UINT32 m_u32HistoryCnt; + HIDO_CHAR m_acCmdBuf[CMD_LENGTH]; + HIDO_CHAR m_acCmdTabBuf[CMD_LENGTH]; + HIDO_CHAR m_acHistoryList[HISTORY_MAX_NUM][CMD_LENGTH]; + HIDO_CHAR m_acHistoryExchange[CMD_LENGTH]; + + HIDO_INT32 (*m_fnPrintf)(const HIDO_CHAR *_pcFmt, ...); + HIDO_INT32 (*m_fnPuts)(const HIDO_CHAR *); + HIDO_INT32 (*m_fnPutc)(HIDO_UINT8); + HIDO_INT32 (*m_fnGetc)(HIDO_UINT8 *); +}HIDO_InputStruct; + +/******************************************************************************* + * Global Function * + *******************************************************************************/ +HIDO_INT32 HIDO_InputUserVerify(HIDO_CHAR *_pcUserName, HIDO_CHAR *_pcPassWord); +HIDO_VOID HIDO_InputRegister(HIDO_InputStruct *_pstInput); +HIDO_BOOL HIDO_InputIsUserLogin(void); +HIDO_VOID HIDO_InputPoll(void); +HIDO_INT32 HIDO_InputUserHello(HIDO_CHAR *_pcBuf, HIDO_UINT32 _u32BufSize); + +#endif /* _INPUT_H_ */ diff --git a/keil/include/components/hido/Include/HIDO_Json.h b/keil/include/components/hido/Include/HIDO_Json.h new file mode 100644 index 0000000..7790c6d --- /dev/null +++ b/keil/include/components/hido/Include/HIDO_Json.h @@ -0,0 +1,132 @@ +/******************************************************************************* + * File Name : HIDO_Json.h + * Description : + * Created on : 2019骞�5鏈�12鏃� + * Author : www.hido-studio.com + *******************************************************************************/ +#ifndef HIDO_JSON_H_ +#define HIDO_JSON_H_ + +/******************************************************************************* + * Include Files * + *******************************************************************************/ +#include "HIDO_TypeDef.h" + +/******************************************************************************* + * Macro * + *******************************************************************************/ +#define MAX_JSON_STRING_LEN 1500 +#define MAX_JSON_NODE_CNT 50 +#define MAX_JSON_ARRARY_NODE_CNT 10 + +/******************************************************************************* + * Type Definition * + *******************************************************************************/ +typedef enum +{ + HIDO_JSON_STATE_IDLE = 0, + HIDO_JSON_STATE_BEGIN, + HIDO_JSON_STATE_END, + HIDO_JSON_STATE_KEY_BEGIN, + HIDO_JSON_STATE_KEY_END, + HIDO_JSON_STATE_VALUE_BEGIN, + HIDO_JSON_STATE_VALUE_END, + HIDO_JSON_STATE_VALUE_ARRARY_BEGIN, + HIDO_JSON_STATE_VALUE_ARRARY_END, + HIDO_JSON_STATE_VALUE_STRING_BEGIN, + HIDO_JSON_STATE_VALUE_STRING_END, + HIDO_JSON_STATE_VALUE_INTEGER_BEGIN, + HIDO_JSON_STATE_VALUE_INTEGER_END, + HIDO_JSON_STATE_VALUE_DOUBLE_BEGIN, + HIDO_JSON_STATE_VALUE_DOUBLE_END, + HIDO_JSON_STATE_VALUE_JSON_BEGIN, + HIDO_JSON_STATE_VALUE_JSON_END, + HIDO_JSON_STATE_VALUE_NULL_BEGIN, + HIDO_JSON_STATE_VALUE_NULL_END, + + HIDO_JSON_STATE_LAST, +}HIDO_JsonStateEnum; + +typedef enum +{ + HIDO_JSON_TYPE_NULL, + HIDO_JSON_TYPE_INTEGER, + HIDO_JSON_TYPE_DOUBLE, + HIDO_JSON_TYPE_ARRARY, + HIDO_JSON_TYPE_STRING, + HIDO_JSON_TYPE_JSON, +}HIDO_JsonTypeEnum; + +typedef struct JsonNodeStruct +{ + HIDO_UINT32 m_u32Len; + HIDO_CHAR *m_pcPtr; +}HIDO_JsonDptr; + +struct HIDO_JsonNode; +typedef struct HIDO_JsonNode +{ + HIDO_JsonTypeEnum m_eType; + HIDO_JsonDptr m_stKey; + HIDO_JsonDptr m_stValue; + HIDO_CHAR *m_pcEnd; + struct HIDO_JsonNode *m_pstNext; +}HIDO_JsonNodeStruct; + +struct HIDO_JsonArraryNode; +typedef struct HIDO_JsonArraryNode +{ + HIDO_JsonNodeStruct *m_pstJson; + struct HIDO_JsonArraryNode *m_pstNext; +}HIDO_JsonArraryNodeStruct; + +typedef struct HIDO_Json +{ + HIDO_CHAR *m_pcJson; + HIDO_UINT32 m_u32Len; + HIDO_UINT32 m_u32RemainingSize; +}HIDO_JsonStruct; + +typedef struct JsonArrayStruct +{ + HIDO_CHAR *m_pcArray; + HIDO_UINT32 m_u32Len; + HIDO_UINT32 m_u32RemainingSize; +}HIDO_JsonArrayStruct; + +typedef struct +{ + HIDO_UINT32 m_u32Hash; + const HIDO_CHAR *m_pcString; + HIDO_JsonNodeStruct *m_pstJson; +}HIDO_JsonKeyStruct; + +/******************************************************************************* + * Global Function * + *******************************************************************************/ +HIDO_VOID HIDO_JsonInit(void); +HIDO_VOID HIDO_JsonTest(void); +HIDO_VOID HIDO_JsonNodeFree(HIDO_JsonNodeStruct *_pstJsonNode); +HIDO_VOID HIDO_JsonArrayNodeFree(HIDO_JsonArraryNodeStruct *_pstJsonArraryNode); +HIDO_JsonNodeStruct *HIDO_JsonJsonParse(HIDO_CHAR *_pcJsonString); +HIDO_JsonNodeStruct *HIDO_JsonGetValue(HIDO_JsonNodeStruct *_pstJsonNodeList, HIDO_CHAR *_pcKey); +HIDO_INT32 HIDO_JsonGetInteger(HIDO_JsonNodeStruct *_pstJsonNodeList, HIDO_CHAR *_pcKey, HIDO_INT32 *_pi32Value); +HIDO_INT32 HIDO_JsonGetFloat(HIDO_JsonNodeStruct *_pstJsonNodeList, HIDO_CHAR *_pcKey, HIDO_FLOAT *_pfValue); +HIDO_INT32 HIDO_JsonGetDouble(HIDO_JsonNodeStruct *_pstJsonNodeList, HIDO_CHAR *_pcKey, HIDO_DOUBLE *_pdValue); +HIDO_INT32 HIDO_JsonGetString(HIDO_JsonNodeStruct *_pstJsonNodeList, HIDO_CHAR *_pcKey, HIDO_CHAR **_ppcValue); +HIDO_INT32 HIDO_JsonGetJson(HIDO_JsonNodeStruct *_pstJsonNodeList, HIDO_CHAR *_pcKey, HIDO_CHAR **_ppcValue); +HIDO_INT32 HIDO_JsonGetJsonArrary(HIDO_JsonNodeStruct *_pstJsonNodeList, HIDO_CHAR *_pcKey, HIDO_JsonArraryNodeStruct **_ppstValue); +HIDO_INT32 HIDO_JsonJsonInit(HIDO_JsonStruct *_pstJsonString, HIDO_CHAR *_pcJsonStringBuf, HIDO_UINT32 _u32JsonStringBufSize); +HIDO_INT32 HIDO_JsonAddInteger(HIDO_JsonStruct *_pstJsonString, HIDO_CHAR *_pcKey, HIDO_INT32 _i32Value); +HIDO_INT32 HIDO_JsonAddString(HIDO_JsonStruct *_pstJson, const HIDO_CHAR *_pcKey, const HIDO_CHAR *_pcValue); +HIDO_INT32 HIDO_JsonAddObject(HIDO_JsonStruct *_pstJsonString, HIDO_CHAR *_pcKey, HIDO_CHAR *_pcValue); +HIDO_INT32 HIDO_JsonAddArraryBegin(HIDO_JsonStruct *_pstJson, HIDO_CHAR *_pcKey, HIDO_JsonArrayStruct *_pstJsonArrry); +HIDO_INT32 HIDO_JsonAddArraryEnd(HIDO_JsonStruct *_pstJson, HIDO_JsonArrayStruct *_pstJsonArrry); +HIDO_INT32 HIDO_JsonAddJsonBegin(HIDO_JsonStruct *_pstJsonString, HIDO_CHAR *_pcKey, HIDO_JsonStruct *_pstSubJsonString); +HIDO_INT32 HIDO_JsonAddJsonEnd(HIDO_JsonStruct *_pstJsonString, HIDO_JsonStruct *_pstSubJsonString); +HIDO_INT32 HIDO_JsonAddIntegerArrary(HIDO_JsonStruct *_pstJsonString, HIDO_CHAR *_pcKey, HIDO_INT32 *_pi32Value, HIDO_UINT32 _u32ArraryCnt); +HIDO_INT32 HIDO_JsonAddStringArrary(HIDO_JsonStruct *_pstJsonString, HIDO_CHAR *_pcKey, HIDO_CHAR **_ppcValue, HIDO_UINT32 _u32ArraryCnt); +HIDO_INT32 HIDO_JsonAddObjectArrary(HIDO_JsonStruct *_pstJsonString, HIDO_CHAR *_pcKey, HIDO_CHAR **_ppcValue, HIDO_UINT32 _u32ArraryCnt); +HIDO_INT32 HIDO_JsonGetIntegerArrary(HIDO_JsonNodeStruct *_pstJsonNodeList, HIDO_CHAR *_pcKey, HIDO_INT32 *_pi32Value, HIDO_UINT32 *_pu32ValueCnt); + +#endif /* HIDO_JSON_H_ */ diff --git a/keil/include/components/hido/Include/HIDO_LWIPTimer.h b/keil/include/components/hido/Include/HIDO_LWIPTimer.h new file mode 100644 index 0000000..ef5f72c --- /dev/null +++ b/keil/include/components/hido/Include/HIDO_LWIPTimer.h @@ -0,0 +1,6 @@ +#ifndef HIDOLIBRARY_LWIP_HIDO_LWIPTIMER_H_ +#define HIDOLIBRARY_LWIP_HIDO_LWIPTIMER_H_ + +#include "HIDO_TypeDef.h" + +#endif /* HIDOLIBRARY_LWIP_HIDO_LWIPTIMER_H_ */ diff --git a/keil/include/components/hido/Include/HIDO_Lock.h b/keil/include/components/hido/Include/HIDO_Lock.h new file mode 100644 index 0000000..bb89004 --- /dev/null +++ b/keil/include/components/hido/Include/HIDO_Lock.h @@ -0,0 +1,9 @@ +#ifndef _UTIL_HIDO_LOCK_H_ +#define _UTIL_HIDO_LOCK_H_ + +#include "HIDO_TypeDef.h" + +HIDO_VOID HIDO_Lock(void); +HIDO_VOID HIDO_UnLock(void); + +#endif /* _UTIL_HIDO_LOCK_H_ */ diff --git a/keil/include/components/hido/Include/HIDO_Log.h b/keil/include/components/hido/Include/HIDO_Log.h new file mode 100644 index 0000000..d5bead0 --- /dev/null +++ b/keil/include/components/hido/Include/HIDO_Log.h @@ -0,0 +1,38 @@ +/******************************************************************************* + * File Name : DB_Log.h + * Description : + * Created on : 2018年6月28日 + * Author : www.hido-studio.com + *******************************************************************************/ + +#ifndef MIDDLEWARES_THIRD_PARTY_DBLIBRARY_DEBUG_DB_LOG_H_ +#define MIDDLEWARES_THIRD_PARTY_DBLIBRARY_DEBUG_DB_LOG_H_ +/******************************************************************************* + * Include Files * + *******************************************************************************/ +#include "HIDO_TypeDef.h" + +/******************************************************************************* + * Macro * + *******************************************************************************/ + +/******************************************************************************* + * Type Definition * + *******************************************************************************/ +typedef enum +{ + HIDO_LOG_LEVEL_ERROR = 0, + HIDO_LOG_LEVEL_WARN, + HIDO_LOG_LEVEL_INFO, + HIDO_LOG_LEVEL_DEBUG, + + HIDO_LOG_LEVEL_MAX, +}HIDO_LogLevelEnum; + +/******************************************************************************* + * Global Function * + *******************************************************************************/ +HIDO_INT32 HIDO_Log(HIDO_LogLevelEnum _eLevel, const HIDO_CHAR *_pcFmt, ...); +HIDO_INT32 HIDO_LogTrace(const HIDO_CHAR *_pcFmt, ...); + +#endif /* MIDDLEWARES_THIRD_PARTY_DBLIBRARY_DEBUG_HIDO_LOG_H_ */ diff --git a/keil/include/components/hido/Include/HIDO_Modbus.h b/keil/include/components/hido/Include/HIDO_Modbus.h new file mode 100644 index 0000000..d529d5c --- /dev/null +++ b/keil/include/components/hido/Include/HIDO_Modbus.h @@ -0,0 +1,128 @@ +#ifndef _HIDO_MODBUS_H_ +#define _HIDO_MODBUS_H_ + +#include "HIDO_TypeDef.h" +#include "HIDO_FSM.h" +#include "HIDO_VLQueue.h" + +#define MODBUS_RTU_MIN_SIZE ( 4 ) +#define MODBUS_RTU_FUNC_CODE_OFFSET ( 1 ) +#define MODBUS_RTU_ADDR_OFFSET ( 0 ) +#define MODBUS_RTU_DATA_OFFSET ( 2 ) + +#define MODBUS_RTU_ADDR_SIZE ( 1 ) +#define MODBUS_RTU_FUNC_CODE_SIZE ( 1 ) +#define MODBUS_RTU_REGISTER_SIZE ( 2 ) +#define MODBUS_RTU_REGISTER_COUNT_SIZE ( 2 ) +#define MODBUS_RTU_COUNT_SIZE ( 1 ) +#define MODBUS_RTU_CRC16_SIZE ( 2 ) + +#define MODBUS_RTU_READ_HOLDING_REGISTER_SIZE ( \ + MODBUS_RTU_ADDR_SIZE \ + + MODBUS_RTU_FUNC_CODE_SIZE \ + + MODBUS_RTU_REGISTER_SIZE \ + + MODBUS_RTU_REGISTER_COUNT_SIZE \ + + MODBUS_RTU_CRC16_SIZE) + +#define MODBUS_RTU_WRITE_MULTIPLE_REGISTERS_SIZE(cnt) ( \ + MODBUS_RTU_ADDR_SIZE \ + + MODBUS_RTU_FUNC_CODE_SIZE \ + + MODBUS_RTU_REGISTER_SIZE \ + + MODBUS_RTU_COUNT_SIZE \ + + MODBUS_RTU_REGISTER_COUNT_SIZE \ + + (MODBUS_RTU_REGISTER_SIZE * (cnt)) \ + + MODBUS_RTU_CRC16_SIZE) + +#define MODBUS_ADDRESS_BROADCAST ( 255 ) /*! Modbus broadcast address. */ +#define MODBUS_ADDRESS_MIN ( 1 ) /*! Smallest possible slave address. */ +#define MODBUS_ADDRESS_MAX ( 247 ) /*! Biggest possible slave address. */ +#define MODBUS_FUNC_NONE ( 0 ) +#define MODBUS_FUNC_READ_COILS ( 1 ) +#define MODBUS_FUNC_READ_DISCRETE_INPUTS ( 2 ) +#define MODBUS_FUNC_WRITE_SINGLE_COIL ( 5 ) +#define MODBUS_FUNC_WRITE_MULTIPLE_COILS ( 15 ) +#define MODBUS_FUNC_READ_HOLDING_REGISTER ( 3 ) +#define MODBUS_FUNC_READ_INPUT_REGISTER ( 4 ) +#define MODBUS_FUNC_WRITE_REGISTER ( 6 ) +#define MODBUS_FUNC_WRITE_MULTIPLE_REGISTERS ( 16 ) +#define MODBUS_FUNC_READWRITE_MULTIPLE_REGISTERS ( 23 ) +#define MODBUS_FUNC_DIAG_READ_EXCEPTION ( 7 ) +#define MODBUS_FUNC_DIAG_DIAGNOSTIC ( 8 ) +#define MODBUS_FUNC_DIAG_GET_COM_EVENT_CNT ( 11 ) +#define MODBUS_FUNC_DIAG_GET_COM_EVENT_LOG ( 12 ) +#define MODBUS_FUNC_OTHER_REPORT_SLAVEID ( 17 ) +#define MODBUS_FUNC_ERROR ( 128 ) + +typedef enum +{ + HIDO_MODBUS_MODE_MASTER, + HIDO_MODBUS_MODE_SLAVE, +} HIDO_ModbusModeEnum; + +typedef enum +{ + HIDO_MODBUS_RESULT_NONE, + HIDO_MODBUS_RESULT_WAIT, + HIDO_MODBUS_RESULT_RESPONSE, +} HIDO_ModbusResultEnum; + +typedef struct +{ + HIDO_VOID *m_pData; + HIDO_UINT32 m_u32Len; + HIDO_UINT32 m_u32SerialNumber; +}HIDO_ModbusDataStruct; + +typedef struct HIDO_ModbusStruct HIDO_ModbusStruct; +typedef HIDO_ModbusResultEnum (* HIDO_ModbusOnRecvFunc)(HIDO_ModbusStruct *_pstModbus, HIDO_UINT8 _u8Addr, HIDO_UINT8 _u8FuncCode, HIDO_UINT8 *_pu8Data, HIDO_UINT32 _u32Len, HIDO_UINT32 _u32SerialNumber); +typedef HIDO_VOID (* HIDO_ModbusSerialEvent)(HIDO_ModbusStruct *_pstModbus); + +struct HIDO_ModbusStruct +{ + HIDO_UINT32 m_u32TimerID; + HIDO_UINT32 m_u32SerialTXOver; + HIDO_UINT32 m_u32SerialRXOver; + HIDO_UINT32 m_u32SerialRXReady; + HIDO_FSMStruct m_stFSM; + + HIDO_UINT32 m_u32NextSerialNumber; + HIDO_UINT32 m_u32CurrentSerialNumber; + + /* 以下用户实现 */ + HIDO_UINT32 m_u32DelayUs; + + HIDO_VLQStruct m_stSendQueue; + + HIDO_UINT8 *m_pu8SendBuff; + HIDO_UINT32 m_u32SendBuffSize; + + HIDO_UINT32 m_u32TransferIndex; + HIDO_UINT32 m_u32TransferLen; + HIDO_UINT8 *m_pu8TransferBuff; + HIDO_UINT32 m_u32TransferBuffSize; + + HIDO_VOID (* m_fnTimerStart)(HIDO_ModbusStruct *_pstModbus, HIDO_UINT32 _u32Us); + HIDO_VOID (* m_fnTimerStop)(HIDO_ModbusStruct *_pstModbus); + + HIDO_VOID (* m_fnSerialEnable)(HIDO_ModbusStruct* _pstModbus, HIDO_BOOL _bRxEnable, HIDO_BOOL _bTxEnable); + HIDO_INT32 (* m_fnSerialPutByte)(HIDO_ModbusStruct *_pstModbus, HIDO_UINT8 _u8Byte); + HIDO_INT32 (* m_fnSerialGetByte)(HIDO_ModbusStruct *_pstModbus, HIDO_UINT8 *_pu8Byte); + + HIDO_VOID *m_pPrivateData; + + HIDO_ModbusOnRecvFunc m_fnOnRecv; + HIDO_ModbusSerialEvent m_fnSerialTXOver; + HIDO_ModbusSerialEvent m_fnSerialRXOver; +}; + +HIDO_VOID HIDO_ModbusEnterCriticalSection(void); +HIDO_VOID HIDO_ModbusExitCriticalSection(void); + +HIDO_INT32 HIDO_ModbusInit(HIDO_ModbusStruct *_pstModbus, HIDO_ModbusModeEnum _eMode); +HIDO_INT32 HIDO_ModbusSetOnRecvCallback(HIDO_ModbusStruct *_pstModbus, HIDO_ModbusOnRecvFunc _fnOnRecv); +HIDO_INT32 HIDO_ModbusSetSerialTXOverCallback(HIDO_ModbusStruct *_pstModbus, HIDO_ModbusSerialEvent _fnSerialEvent); +HIDO_INT32 HIDO_ModbusSetSerialRXOverCallback(HIDO_ModbusStruct *_pstModbus, HIDO_ModbusSerialEvent _fnSerialEvent); +HIDO_INT32 HIDO_ModbusFramePack(HIDO_UINT8 *_pu8FrameBuf, HIDO_UINT32 _u32FrameBufSize, HIDO_UINT8 _u8Addr, HIDO_UINT8 _u8FuncCode, HIDO_UINT8 *_pu8Data, HIDO_UINT32 _u32DataLen, HIDO_UINT32 *_pu32FrameLen); + +#endif /* _HIDO_MODBUS_H_ */ + diff --git a/keil/include/components/hido/Include/HIDO_ModbusCRC16.h b/keil/include/components/hido/Include/HIDO_ModbusCRC16.h new file mode 100644 index 0000000..665f67a --- /dev/null +++ b/keil/include/components/hido/Include/HIDO_ModbusCRC16.h @@ -0,0 +1,8 @@ +#ifndef _HIDO_MODBUS_CRC16_H_ +#define _HIDO_MODBUS_CRC16_H_ + +#include "HIDO_TypeDef.h" + +HIDO_UINT16 HIDO_ModbusCRC16(HIDO_UINT8 * _pu8Frame, HIDO_UINT16 _u16Len); + +#endif /* _HIDO_MODBUS_CRC16_H_ */ diff --git a/keil/include/components/hido/Include/HIDO_ModbusMaster.h b/keil/include/components/hido/Include/HIDO_ModbusMaster.h new file mode 100644 index 0000000..8dd998b --- /dev/null +++ b/keil/include/components/hido/Include/HIDO_ModbusMaster.h @@ -0,0 +1,15 @@ +#ifndef _HIDO_MODBUS_MASTER_H_ +#define _HIDO_MODBUS_MASTER_H_ + +#include "HIDO_TypeDef.h" +#include "HIDO_Modbus.h" + +HIDO_BOOL HIDO_ModbusMasterIsBusy(HIDO_ModbusStruct *_pstModbus); +HIDO_VOID HIDO_ModbusMasterPoll(HIDO_ModbusStruct *_pstModbus); +HIDO_INT32 HIDO_ModbusMasterPassThrough(HIDO_ModbusStruct *_pstModbus, HIDO_UINT8 _u8SlaveAddr, HIDO_UINT8 _u8FuncCode, HIDO_UINT8 *_pu8Data, HIDO_UINT32 _u32Len, HIDO_UINT32 *_pu32SerialNumber); +HIDO_INT32 HIDO_ModbusMasterReadHoldingRegister(HIDO_ModbusStruct *_pstModbus, HIDO_UINT8 u8SlaveAddr, HIDO_UINT16 _u16RegAddr, HIDO_UINT16 _u16RegCnt, HIDO_UINT32 *_pu32SerialNumber); +HIDO_INT32 HIDO_ModbusMasterWriteMultipleRegisters(HIDO_ModbusStruct *_pstModbus, HIDO_UINT8 u8SlaveAddr, HIDO_UINT16 _u16RegAddr, HIDO_UINT16 *_pu16RegValues, HIDO_UINT16 _u16RegCnt, HIDO_UINT32 *_pu32SerialNumber); +HIDO_VOID HIDO_ModbusMasterSerialTXOver(HIDO_ModbusStruct *_pstModbus); +HIDO_VOID HIDO_ModbusMasterSerialRXOver(HIDO_ModbusStruct *_pstModbus); + +#endif /* _HIDO_MODBUSMASTER_H_ */ diff --git a/keil/include/components/hido/Include/HIDO_ModbusSlave.h b/keil/include/components/hido/Include/HIDO_ModbusSlave.h new file mode 100644 index 0000000..a804762 --- /dev/null +++ b/keil/include/components/hido/Include/HIDO_ModbusSlave.h @@ -0,0 +1,16 @@ +#ifndef _HIDO_MODBUS_SLAVE_H_ +#define _HIDO_MODBUS_SLAVE_H_ + +#include "HIDO_TypeDef.h" +#include "HIDO_Modbus.h" + +HIDO_VOID HIDO_ModbusSlaveDataReady(HIDO_ModbusStruct *_pstModbus, HIDO_UINT8 _u8Addr, HIDO_UINT8 _u8FuncCode, HIDO_UINT8 *_pu8Data, HIDO_UINT32 _u32Len); +HIDO_VOID HIDO_ModbusSlavePoll(HIDO_ModbusStruct *_pstModbus); +HIDO_VOID HIDO_ModbusSlaveSerialTXOver(HIDO_ModbusStruct *_pstModbus); +HIDO_VOID HIDO_ModbusSlaveSerialRXOver(HIDO_ModbusStruct *_pstModbus); +HIDO_INT32 HIDO_ModbusSlavePackReadHoldingRegister(HIDO_ModbusStruct *_pstModbus, HIDO_UINT8 _u8Addr, HIDO_UINT16 *_pu16RegisterValue, HIDO_UINT8 _u8Cnt); +HIDO_INT32 HIDO_ModbusSlavePackReadHoldingRegister2(HIDO_ModbusStruct *_pstModbus, HIDO_UINT8 _u8Addr, HIDO_UINT8 *_pu8Data, HIDO_UINT8 _u8Len); +HIDO_INT32 HIDO_ModbusSlaveWriteSingleRegister(HIDO_ModbusStruct *_pstModbus, HIDO_UINT8 _u8Addr, HIDO_UINT16 _u16StartAddress, HIDO_UINT16 _u16Register); +HIDO_INT32 HIDO_ModbusSlaveWriteMultipleRegisters(HIDO_ModbusStruct *_pstModbus, HIDO_UINT8 _u8Addr, HIDO_UINT16 _u16StartAddress, HIDO_UINT16 _u16Cnt); + +#endif /* _HIDO_MODBUSSLAVE_H_ */ diff --git a/keil/include/components/hido/Include/HIDO_Shell.h b/keil/include/components/hido/Include/HIDO_Shell.h new file mode 100644 index 0000000..cac1da8 --- /dev/null +++ b/keil/include/components/hido/Include/HIDO_Shell.h @@ -0,0 +1,32 @@ +#ifndef _HIDO_SHELL_H_ +#define _HIDO_SHELL_H_ + +#include "HIDO_TypeDef.h" +#include "HIDO_Input.h" + +#define SHELL_CMD_MAX_COUNT 80 + +typedef HIDO_INT32 (*HIDO_ShellCmdFunc)(HIDO_INT32, HIDO_CHAR **); + +typedef struct ShellCmdStruct +{ + const HIDO_CHAR *m_pcName; + HIDO_ShellCmdFunc m_fnProc; +}HIDO_ShellCmdStruct; + +#define HIDO_ShellPrintf(...)\ +{\ + if(HIDO_ShellGetInput() != HIDO_NULL && (HIDO_ShellGetInput()->m_fnPrintf) != HIDO_NULL)\ + {\ + HIDO_ShellGetInput()->m_fnPrintf(__VA_ARGS__);\ + }\ +} + +HIDO_UINT32 HIDO_ShellGetCmdCount(void); +HIDO_VOID HIDO_ShellSetInput(HIDO_InputStruct *_pstInput); +HIDO_InputStruct* HIDO_ShellGetInput(void); +HIDO_INT32 HIDO_ShellExecute(HIDO_CHAR *_pcShellCmd); +const HIDO_CHAR* HIDO_ShellGetCmdName(HIDO_UINT32 _u32Index); +HIDO_INT32 HIDO_ShellCmdRegister(const HIDO_ShellCmdStruct *_pstShellCmd, HIDO_UINT32 _u32ShellCmdCnt); + +#endif /* _HIDO_SHELL_H_ */ diff --git a/keil/include/components/hido/Include/HIDO_Timer.h b/keil/include/components/hido/Include/HIDO_Timer.h new file mode 100644 index 0000000..dc8eab4 --- /dev/null +++ b/keil/include/components/hido/Include/HIDO_Timer.h @@ -0,0 +1,35 @@ +#ifndef _HIDO_TIMER_H_ +#define _HIDO_TIMER_H_ +#include "HIDO_TypeDef.h" + +typedef HIDO_VOID (*HIDO_TimerFunc)(HIDO_VOID *); + +typedef struct HIDO_TimerStruct +{ + HIDO_UINT32 m_u32State; + HIDO_UINT8 m_u8Type; + HIDO_UINT32 m_u32Tick; + HIDO_UINT32 m_u32TickBack; + void *m_pPrivateData; + HIDO_TimerFunc m_fnTimerProc; +}HIDO_TimerStruct; + +#define HIDO_TIMER_TICK_S(s) ((s) * 1) +#define HIDO_TIMER_TICK_MS(ms) ((ms) / 1000) +#define HIDO_TIMER_TYPE_ONCE 0 +#define HIDO_TIMER_TYPE_LOOP 1 + +#define HIDO_TIMER_ID_MAX_CNT 32 + + +HIDO_INT32 HIDO_TimerCreate(HIDO_UINT32 *_pu32TimerID); +HIDO_INT32 HIDO_TimerDestroy(HIDO_UINT32 _u32TimerID); +HIDO_INT32 HIDO_TimerStart(HIDO_UINT32 _u32TimerID, HIDO_UINT8 _u8Type, HIDO_UINT32 _u32Tick, HIDO_TimerFunc _fnTimerProc, void *_pPrivateData); +HIDO_INT32 HIDO_TimerCancel(HIDO_UINT32 _u32TimerID); +void HIDO_TimerPoll(void); +void HIDO_TimerTick(void); +HIDO_UINT32 HIDO_TimerGetTick(void); +HIDO_UINT64 HIDO_TimerGetTick64(void); +HIDO_VOID HIDO_TimerSetTick64(HIDO_UINT64 _u64Tick); + +#endif /* _HIDO_TIMER_H_ */ diff --git a/keil/include/components/hido/Include/HIDO_TypeDef.h b/keil/include/components/hido/Include/HIDO_TypeDef.h new file mode 100644 index 0000000..4049e4d --- /dev/null +++ b/keil/include/components/hido/Include/HIDO_TypeDef.h @@ -0,0 +1,73 @@ +/******************************************************************************* + * File Name : HIDO_TypeDef.h + * Description : + * Created on : 2018年6月4日 + * Author : www.hido-studio.com + *******************************************************************************/ + +#ifndef HIDO_TYPEDEF_H_ +#define HIDO_TYPEDEF_H_ +/******************************************************************************* + * Include Files * + *******************************************************************************/ +#include "HIDO_TypeDef.h" + +/******************************************************************************* + * Macro * + *******************************************************************************/ +#ifndef NULL +#define NULL 0 +#endif + +#ifndef HIDO_NULL +#define HIDO_NULL 0 +#endif + +#define HIDO_OK 0 /* 正常返回 */ +#define HIDO_ERR -1 /* 出错返回,没有明确具体出错原因的返回 */ + +#define HIDO_OFFSET_OF(type, member) ((HIDO_UINT32) &((type *)0)->member) +#define HIDO_ARRARY_COUNT(arrary) (sizeof(arrary)/sizeof((arrary)[0])) + +#define HIDO_ASSERT(bool) while(!(bool)){} + +/******************************************************************************* + * Type Definition * + *******************************************************************************/ +typedef void HIDO_VOID; /* 前缀无 */ +typedef unsigned char HIDO_UINT8; /* 前缀u8 */ +typedef unsigned short HIDO_UINT16; /* 前缀u16 */ +typedef unsigned int HIDO_UINT32; /* 前缀u32 */ +typedef unsigned long long HIDO_UINT64; /* 前缀u64 */ +typedef signed char HIDO_INT8; /* 前缀i8 */ +typedef signed short HIDO_INT16; /* 前缀i16 */ +typedef signed int HIDO_INT32; /* 前缀i32 */ +typedef signed long long HIDO_INT64; /* 前缀i64 */ +typedef char HIDO_CHAR; /* 前缀c */ +typedef float HIDO_FLOAT; /* 前缀f */ +typedef double HIDO_DOUBLE; /* 前缀d */ + +typedef enum { HIDO_FALSE, HIDO_TRUE } HIDO_BOOL; /* 前缀b */ + +typedef struct +{ + HIDO_VOID *m_pData; + HIDO_UINT32 m_u32Len; +}HIDO_DataStruct; + +typedef struct +{ + HIDO_UINT32 m_u32Size; + HIDO_UINT32 m_u32Len; + HIDO_UINT8 *m_pu8Data; +}HIDO_ByteArraryStruct; + +#define HIDO_DEFINE_BYTE_ARRARY(name, size) \ +HIDO_UINT8 (__##name##Buffer)[(size)]; \ +HIDO_ByteArraryStruct (name) = { (size), 0, __##name##Buffer } + +/******************************************************************************* + * Global Function * + *******************************************************************************/ + +#endif /* HIDO_TYPEDEF_H_ */ diff --git a/keil/include/components/hido/Include/HIDO_Util.h b/keil/include/components/hido/Include/HIDO_Util.h new file mode 100644 index 0000000..cf5ca40 --- /dev/null +++ b/keil/include/components/hido/Include/HIDO_Util.h @@ -0,0 +1,48 @@ +#ifndef _HIDO_UTIL_H_ +#define _HIDO_UTIL_H_ + +#include "HIDO_TypeDef.h" + +typedef struct +{ + HIDO_UINT16 m_u16Year; + HIDO_UINT8 m_u8Month; + HIDO_UINT8 m_u8Date; + HIDO_UINT8 m_u8Hour; + HIDO_UINT8 m_u8Min; + HIDO_UINT8 m_u8Sec; + HIDO_UINT8 m_u8Week; +} HIDO_CalendarStruct; + +HIDO_INT32 HIDO_UtilStrSplit(HIDO_CHAR *_pcSrc, const HIDO_CHAR _cSplit, HIDO_CHAR **_ppcDst, HIDO_UINT32 _u32DstSize); +HIDO_UINT8 HIDO_UtilCharToHex(HIDO_CHAR _cCh); +HIDO_UINT32 HIDO_UtilStrToInt(HIDO_CHAR *_pcString); +HIDO_UINT32 HIDO_UtilHexStrToInt(HIDO_CHAR *_pcString); +HIDO_UINT32 HIDO_UtilHexStrBufToInt(HIDO_CHAR *_pcStringBuf, HIDO_UINT32 _u32BufLen); +HIDO_UINT32 HIDO_UtilStrBufToInt(HIDO_CHAR *_pcStringBuf, HIDO_UINT32 _u32BufLen); +HIDO_UINT32 HIDO_UtilBufToHex(HIDO_CHAR *data, HIDO_UINT32 len, HIDO_UINT8 *dst); +HIDO_UINT8 HIDO_UtilBcdToByte(HIDO_UINT8 _u8Value); +HIDO_UINT8 HIDO_UtilByteToBcd(HIDO_UINT8 _u8Value); +HIDO_UINT8 HIDO_UtilCharToByte(HIDO_CHAR _cChar); +HIDO_UINT32 HIDO_UtilParseFormat(HIDO_UINT8 *_pu8Src, HIDO_UINT32 _u32SrcLen, const HIDO_CHAR *_pcFmt, ...); +HIDO_UINT32 HIDO_UtilHexStringToByteArray(const HIDO_CHAR *_pcHex, HIDO_UINT32 _u32HexLen, HIDO_UINT8 *_pu8ByteArray); +HIDO_UINT32 HIDO_UtilIPStringToInteger(HIDO_CHAR *_pcIP); +HIDO_INT32 HIDO_UtilIPStringToByteArrary(HIDO_CHAR *_pcIP, HIDO_UINT8 *_pu8IPByte); +HIDO_INT32 HIDO_UtilMACStringToByteArrary(HIDO_CHAR *_pcMAC, const HIDO_CHAR _cSplit, HIDO_UINT8 *_pu8IPByte); +HIDO_UINT32 HIDO_UtilIPStringBufToInteger(HIDO_CHAR *_pcIP, HIDO_UINT32 _u32Len); +HIDO_VOID HIDO_UtilIntegerToIpString(HIDO_CHAR *_pcIP, HIDO_UINT32 _u32Ip); +HIDO_BOOL HIDO_UtilIsIpString(HIDO_CHAR *_pcIP); +HIDO_BOOL HIDO_UtilIsNumberString(HIDO_CHAR *_pcString); +HIDO_UINT8 *HIDO_UtilStrStr(HIDO_UINT8 *_pcSrc, HIDO_UINT32 _u32SrcLen, HIDO_CHAR *_pcTarget); +HIDO_CHAR *HIDO_UtilStrnchr(const HIDO_CHAR *_pcStr, HIDO_CHAR _cChr, HIDO_UINT32 u32N); +HIDO_CHAR *HIDO_UtilStrnstr(const HIDO_CHAR *_pcSrc, const HIDO_CHAR *_pcTarget, HIDO_UINT32 _u32SrcLen); +HIDO_CHAR *HIDO_UtilStrrnstr(const HIDO_CHAR *_pcSrc, const HIDO_CHAR *_pcTarget, HIDO_UINT32 _u32SrcLen); +HIDO_UINT32 HIDO_UtilSnprintf(HIDO_CHAR *_pcBuf, HIDO_UINT32 _u32BufSize, const HIDO_CHAR *_pcFmt, ...); +HIDO_VOID HIDO_UtilBzero(HIDO_VOID *_pData, HIDO_UINT32 _u32Size); +HIDO_UINT32 HIDO_UtilByteArrayToHexString(const HIDO_UINT8 *_pu8ByteArray, HIDO_UINT32 _u32ByteCount, HIDO_CHAR *_pcHexString, HIDO_UINT32 _u32HexStringSize, HIDO_BOOL _bWithSpace); +HIDO_UINT32 HIDO_UtilEncode7To8(HIDO_UINT8 *_pu8DstBuf, const HIDO_UINT8 *_pu8SrcBuf, HIDO_UINT32 _u32SrcBufLen); +HIDO_INT32 HIDO_UtilDecode8To7(HIDO_UINT8 *_pu8DstBuff, HIDO_UINT8 *_pu8SrcBuff, HIDO_UINT32 _u32SrcLen, HIDO_UINT32 *_pu32DstLen); +HIDO_INT32 HIDO_UtilMKCalendar(HIDO_UINT32 _u32Sec, HIDO_CalendarStruct *_pstCalendar, HIDO_INT32 _i32TimeZoneSec); +HIDO_BOOL HIDO_UtilIsAsciiString(HIDO_UINT8 *_pu8Str, HIDO_UINT32 _u32StrLen); + +#endif /* _HIDO_UTIL_H_ */ diff --git a/keil/include/components/hido/Include/HIDO_VLQueue.h b/keil/include/components/hido/Include/HIDO_VLQueue.h new file mode 100644 index 0000000..942c28c --- /dev/null +++ b/keil/include/components/hido/Include/HIDO_VLQueue.h @@ -0,0 +1,40 @@ +#ifndef _VLQUEUE_H_ +#define _VLQUEUE_H_ + +#include "HIDO_TypeDef.h" +#include "HIDO_BaseQueue.h" + +typedef struct +{ + HIDO_BaseQueueMemInfoStruct m_stLenMemInfo; + HIDO_BaseQueueMemInfoStruct m_stDataMemInfo; + HIDO_BaseQueueStruct m_stLenQueue; + HIDO_BaseQueueStruct m_stDataQueue; +}HIDO_VLQStruct; + +typedef struct +{ + HIDO_VOID *m_pDataAddr; + HIDO_UINT32 m_u32DataLen; + HIDO_UINT32 m_u32TotalLen; +}HIDO_VLQMemberStruct; + +/* 获取准备入队成员 */ +HIDO_VLQMemberStruct *HIDO_VLQGetEnqueueMember(HIDO_VLQStruct *_pstVLQ, HIDO_UINT32 _u32DataSize); + +/* 修改成员用大小,只能将成员变小,不能变大 */ +HIDO_INT32 HIDO_VLQModfiyMemberSize(HIDO_VLQMemberStruct *_pstVLQMember, HIDO_UINT32 _u32NewSize); + +/* 入队 */ +HIDO_INT32 HIDO_VLQEnqueue(HIDO_VLQStruct *_pstVLQ, HIDO_VLQMemberStruct *_pstVLQMember); + +/* 获取即将出队的成员 */ +HIDO_VLQMemberStruct *HIDO_VLQGetDequeueMember(HIDO_VLQStruct *_pstVLQ); + +/* 出队 */ +HIDO_INT32 HIDO_VLQDequeue(HIDO_VLQStruct *_pstVLQ, HIDO_VLQMemberStruct *_pstVLQMember); + +/* 变长队列初始化 */ +HIDO_INT32 HIDO_VLQInit(HIDO_VLQStruct *_pstVLQ, HIDO_VOID *_pQBuf, HIDO_UINT32 _u32QBufSize, HIDO_UINT32 _u32LenInfoCnt); + +#endif /* _VLQUEUE_H_ */ diff --git a/keil/include/components/hido/Include/md5.h b/keil/include/components/hido/Include/md5.h new file mode 100644 index 0000000..ac45035 --- /dev/null +++ b/keil/include/components/hido/Include/md5.h @@ -0,0 +1,76 @@ +/* + * sw_md5.h + * + * Created on: 2016年12月28日 + * Author: YIYI + */ + +#ifndef _SW_MD5_H_ +#define _SW_MD5_H_ + +/* + ********************************************************************** + ** md5.h -- Header file for implementation of MD5 ** + ** RSA Data Security, Inc. MD5 Message Digest Algorithm ** + ** Created: 2/17/90 RLR ** + ** Revised: 12/27/90 SRD,AJ,BSK,JT Reference C version ** + ** Revised (for MD5): RLR 4/27/91 ** + ** -- G modified to have y&~z instead of y&z ** + ** -- FF, GG, HH modified to add in last register done ** + ** -- Access pattern: round 2 works mod 5, round 3 works mod 3 ** + ** -- distinct additive constant for each step ** + ** -- round 4 added, working mod 7 ** + ********************************************************************** + */ + +/* + ********************************************************************** + ** Copyright (C) 1990, RSA Data Security, Inc. All rights reserved. ** + ** ** + ** License to copy and use this software is granted provided that ** + ** it is identified as the "RSA Data Security, Inc. MD5 Message ** + ** Digest Algorithm" in all material mentioning or referencing this ** + ** software or this function. ** + ** ** + ** License is also granted to make and use derivative works ** + ** provided that such works are identified as "derived from the RSA ** + ** Data Security, Inc. MD5 Message Digest Algorithm" in all ** + ** material mentioning or referencing the derived work. ** + ** ** + ** RSA Data Security, Inc. makes no representations concerning ** + ** either the merchantability of this software or the suitability ** + ** of this software for any particular purpose. It is provided "as ** + ** is" without express or implied warranty of any kind. ** + ** ** + ** These notices must be retained in any copies of any part of this ** + ** documentation and/or software. ** + ********************************************************************** + */ +#include "HIDO_TypeDef.h" + +/* Data structure for MD5 (Message Digest) computation */ +typedef struct { + HIDO_UINT32 i[2]; /* number of _bits_ handled mod 2^64 */ + HIDO_UINT32 buf[4]; /* scratch buffer */ + HIDO_UINT8 in[64]; /* input buffer */ + HIDO_UINT8 digest[16]; /* actual digest after MD5Final call */ +} MD5_CTX; + +#define MD5_BYTE_SIZE 16 +#define MD5_STRING_SIZE 33 + +HIDO_VOID MD5Init (MD5_CTX *mdContext); +HIDO_VOID MD5Update(MD5_CTX *mdContext, HIDO_UINT8 *inBuf, HIDO_UINT32 inLen); +HIDO_VOID MD5Final (MD5_CTX *mdContext); +HIDO_VOID Transform (HIDO_UINT32 *buf, HIDO_UINT32 *in); +HIDO_VOID MDString(HIDO_CHAR *inString, HIDO_CHAR *outString); +HIDO_VOID MD5(HIDO_UINT8 *_pu8In, HIDO_UINT32 _u32InLen, HIDO_UINT8 *_pu8Out); +HIDO_VOID MD5_2(HIDO_UINT8 *_pu8In, HIDO_UINT32 _u32InLen, HIDO_CHAR *outString); + +/* + ********************************************************************** + ** End of md5.h ** + ******************************* (cut) ******************************** + */ + +#endif /* _SW_MD5_H_ */ diff --git a/keil/include/components/hido/hido.lib b/keil/include/components/hido/hido.lib new file mode 100644 index 0000000..24963f5 --- /dev/null +++ b/keil/include/components/hido/hido.lib Binary files differ diff --git a/keil/include/components/internet/inc/AIR780ECSQ.h b/keil/include/components/internet/inc/AIR780ECSQ.h new file mode 100644 index 0000000..e94a732 --- /dev/null +++ b/keil/include/components/internet/inc/AIR780ECSQ.h @@ -0,0 +1,30 @@ +/******************************************************************************* + * File Name : AIR780ECSQ.h + * Description : + * Created on : 2018年8月5日 + * Author : 杜键 + *******************************************************************************/ + +#ifndef FML_EC600_SCSQ_H_ +#define FML_EC600_SCSQ_H_ +/******************************************************************************* + * Include Files * + *******************************************************************************/ +#include "HIDO_TypeDef.h" +#include "HIDO_ATLite.h" + +/******************************************************************************* + * Macro * + *******************************************************************************/ + +/******************************************************************************* + * Type Definition * + *******************************************************************************/ + +/******************************************************************************* + * Global Function * + *******************************************************************************/ +HIDO_INT32 AIR780ECSQ_Get(HIDO_ATLiteDeviceStruct *_pstATDevice); +HIDO_INT32 AIR780ECSQ_Poll(HIDO_ATLiteDeviceStruct *_pstATDevice); + +#endif /* FML_EC600_SCSQ_H_ */ diff --git a/keil/include/components/internet/inc/AIR780EDriver.h b/keil/include/components/internet/inc/AIR780EDriver.h new file mode 100644 index 0000000..0d39c95 --- /dev/null +++ b/keil/include/components/internet/inc/AIR780EDriver.h @@ -0,0 +1,58 @@ +/******************************************************************************* + * File Name : AIR780EDriver.h + * Description : + * Created on : 2018年5月22日 + * Author : 杜键 + *******************************************************************************/ + +#ifndef FML_AIR780E_DRIVER_H_ +#define FML_AIR780E_DRIVER_H_ +/******************************************************************************* + * Include Files * + *******************************************************************************/ +#include "Socket.h" +#include "HIDO_TypeDef.h" +#include "sn74hc595.h" + +/******************************************************************************* + * Macro * + *******************************************************************************/ +#define CONNECT_LEN_UNKONW 0xFFFFFFFF + +/******************************************************************************* + * Type Definition * + *******************************************************************************/ +typedef enum +{ + AIR780E_PIN_3V8_EN, + AIR780E_PIN_RI, + AIR780E_PIN_PWRKEY, + + AIR780E_PIN_LAST, +}E_AIR780EPin; + +typedef struct +{ + HIDO_UINT32 m_u32FSMTimerID; + HIDO_UINT32 m_u32ConnectLen; +} ST_AIR780EDriverData; + +/******************************************************************************* + * Global Function * + *******************************************************************************/ +HIDO_INT32 AIR780EDriver_PinRegister(E_AIR780EPin _ePin, HIDO_UINT16 _u16Pin); +HIDO_INT32 AIR780EDriver_PowerOn(void); +HIDO_INT32 AIR780EDriver_PowerOff(void); +HIDO_INT32 AIR780EDriver_PWRKEYSet(void); +HIDO_INT32 AIR780EDriver_PWRKEYReset(void); +HIDO_INT32 AIR780EDriver_DebugOn(void); +HIDO_INT32 AIR780EDriver_DebugOff(void); +HIDO_INT32 AIR780EDriver_DTRHigh(void); +HIDO_INT32 AIR780EDriver_DTRLow(void); +HIDO_INT32 AIR780EDriver_APReadyHigh(void); +HIDO_INT32 AIR780EDriver_APReadyLow(void); +HIDO_INT32 AIR780EDriver_SetConnectLen(HIDO_UINT32 _u32ConnectLen); +void AIR780EDriver_TimerPoll(void); +HIDO_INT32 AIR780EDriver_Init(void); + +#endif /* FML_AIR780E_DRIVER_H_ */ diff --git a/keil/include/components/internet/inc/AIR780EFSM.h b/keil/include/components/internet/inc/AIR780EFSM.h new file mode 100644 index 0000000..9041ded --- /dev/null +++ b/keil/include/components/internet/inc/AIR780EFSM.h @@ -0,0 +1,121 @@ +/******************************************************************************* + * File Name : SIM8xx.h + * Description : + * Created on : 2018年5月22日 + * Author : 杜键 + *******************************************************************************/ + +#ifndef FML_AIR780E_FSM_H_ +#define FML_AIR780E_FSM_H_ +/******************************************************************************* + * Include Files * + *******************************************************************************/ +#include "HIDO_TypeDef.h" +#include "HIDO_ATLite.h" + +/******************************************************************************* + * Macro * + *******************************************************************************/ + +/******************************************************************************* + * Type Definition * + *******************************************************************************/ +typedef enum +{ + AIR780E_EVENT_OK = HIDO_AT_EVENT_LAST, + AIR780E_EVENT_CREG, + AIR780E_EVENT_CGREG, + AIR780E_EVENT_CGATT, + AIR780E_EVENT_CSQ, + AIR780E_EVENT_LBS_LOCATION, + AIR780E_EVENT_CPIN, + AIR780E_EVENT_INIT_TIMEOUT, + + AIR780E_EVENT_DELAY, + AIR780E_EVENT_POLL, + AIR780E_EVENT_ACK, + AIR780E_EVENT_NEW_SMS, + AIR780E_EVENT_READ_SMS, + AIR780E_EVENT_SMS_DATA, + AIR780E_EVENT_NEW_IP_DATA, /* 有新的IP数据通知 */ + + AIR780E_EVENT_CCID, + AIR780E_EVENT_OPEN, + AIR780E_EVENT_SEND, + AIR780E_EVENT_SEND_OK, + AIR780E_EVENT_SEND_FAIL, + AIR780E_EVENT_CLOSE, + AIR780E_EVENT_READ, + AIR780E_EVENT_CONNECT, + AIR780E_EVENT_QFLST, + AIR780E_EVENT_QFOPEN, + AIR780E_EVENT_QHTTPGET, + AIR780E_EVENT_QHTTPPOST, + AIR780E_EVENT_QHTTPREAD, + AIR780E_EVENT_QHTTPREADFILE, + AIR780E_EVENT_QHTTPPOSTFILE, + AIR780E_EVENT_QGPSLOC, + AIR780E_EVENT_CCLK, + AIR780E_EVENT_QGPSXTRADATA, + AIR780E_EVENT_PDPDEACT, + AIR780E_EVENT_QMTOPEN, + AIR780E_EVENT_QMTCLOSE, + AIR780E_EVENT_QMTCONN, + AIR780E_EVENT_QMTDISC, + AIR780E_EVENT_QMTSUB, + AIR780E_EVENT_QMTUNS, + AIR780E_EVENT_QMTPUBEX, + AIR780E_EVENT_QMTRECV, + AIR780E_EVENT_QMTPING, + AIR780E_EVENT_QMTSTAT, + + AIR780E_EVENT_RDY, + AIR780E_EVENT_QTTS, + AIR780E_EVENT_QLTONE, + AIR780E_EVENT_RECEIVE, + + AIR780E_EVENT_NUM_0, + AIR780E_EVENT_NUM_1, + AIR780E_EVENT_NUM_2, + AIR780E_EVENT_NUM_3, + AIR780E_EVENT_NUM_4, + AIR780E_EVENT_NUM_5, + AIR780E_EVENT_NUM_6, + AIR780E_EVENT_NUM_7, + AIR780E_EVENT_NUM_8, + AIR780E_EVENT_NUM_9, + + AIR780E_EVENT_LAST, +} E_AIR780EEvent; + +/******************************************************************************* + * Global Variable * + *******************************************************************************/ +HIDO_FSM_DECLARE(AIR780E); + +HIDO_FSM_STATE_FULL_DECLARE(Root, AIR780E) +HIDO_FSM_STATE_FULL_DECLARE(AIR780E, AIR780EInit) +HIDO_FSM_STATE_FULL_DECLARE(AIR780E, AIR780EPowerOff) +HIDO_FSM_STATE_FULL_DECLARE(AIR780EInit, AIR780EPowerOn) +HIDO_FSM_STATE_FULL_DECLARE(AIR780EInit, AIR780EWaitReady) +HIDO_FSM_STATE_FULL_DECLARE(AIR780EInit, AIR780EATCmdTest) +HIDO_FSM_STATE_FULL_DECLARE(AIR780EInit, AIR780EWaitSimCardReady) +HIDO_FSM_STATE_FULL_DECLARE(AIR780EInit, AIR780EATCmdInit) +HIDO_FSM_STATE_FULL_DECLARE(AIR780E, AIR780EIdle) +HIDO_FSM_STATE_FULL_DECLARE(AIR780E, AIR780EReady) +HIDO_FSM_STATE_FULL_DECLARE(AIR780EReady, AIR780ESearchingNetwork) + +HIDO_FSM_STATE_FULL_DECLARE(AIR780EReady, AIR780EIPInit) +HIDO_FSM_STATE_FULL_DECLARE(AIR780EReady, AIR780ETimeSync) +HIDO_FSM_STATE_FULL_DECLARE(AIR780EReady, AIR780EIPReady) +HIDO_FSM_STATE_FULL_DECLARE(AIR780EIPReady, AIR780EIPPoll) +HIDO_FSM_STATE_FULL_DECLARE(AIR780EIPReady, AIR780EIPCheck) +HIDO_FSM_STATE_FULL_DECLARE(AIR780EIPReady, AIR780EIPSleep) + +/******************************************************************************* + * Global Function * + *******************************************************************************/ +HIDO_BOOL AIR780E_IsIPReady(void); +HIDO_BOOL AIR780E_IsIPIdle(void); + +#endif /* FML_AIR780E_FSM_H_ */ diff --git a/keil/include/components/internet/inc/AIR780ESocket.h b/keil/include/components/internet/inc/AIR780ESocket.h new file mode 100644 index 0000000..b9d483c --- /dev/null +++ b/keil/include/components/internet/inc/AIR780ESocket.h @@ -0,0 +1,33 @@ +/******************************************************************************* + * File Name : AIR780ESocket.h + * Description : + * Created on : 2018年5月22日 + * Author : 杜键 + *******************************************************************************/ + +#ifndef FML_AIR780E_SOCKET_H_ +#define FML_AIR780E_SOCKET_H_ +/******************************************************************************* + * Include Files * + *******************************************************************************/ +#include "HIDO_TypeDef.h" +#include "HIDO_ATLite.h" + +/******************************************************************************* + * Macro * + *******************************************************************************/ + +/******************************************************************************* + * State * + *******************************************************************************/ + +/******************************************************************************* + * Type Definition * + *******************************************************************************/ + +/******************************************************************************* + * Global Function * + *******************************************************************************/ +HIDO_INT32 AIR780ESocket_Poll(HIDO_ATLiteDeviceStruct *_pstATDevice); + +#endif /* FML_AIR780E_SOCKET_H_ */ diff --git a/keil/include/components/internet/inc/ATConfig.h b/keil/include/components/internet/inc/ATConfig.h new file mode 100644 index 0000000..e2d5a15 --- /dev/null +++ b/keil/include/components/internet/inc/ATConfig.h @@ -0,0 +1,38 @@ +/******************************************************************************* + * File Name : ATConfig.h + * Description : + * Created on : 2019年12月28日 + * Author : www.hido-studio.com + *******************************************************************************/ + +#ifndef _AT_CONFIG_H_ +#define _AT_CONFIG_H_ +/******************************************************************************* + * Include Files * + *******************************************************************************/ +#include "HIDO_TypeDef.h" + +/******************************************************************************* + * Macro * + *******************************************************************************/ +#define AT_CMD_RESULT_OK 0x0001 +#define AT_CMD_RESULT_ERROR 0x0002 +#define AT_CMD_RESULT_TIMEOUT 0x0004 + +#define AT_GENERAL_TIMEOUT_TIME 5000 + +/******************************************************************************* + * Type Definition * + *******************************************************************************/ +typedef struct +{ + HIDO_CHAR *m_pcATCmd; + HIDO_UINT32 m_u32TimeOut; + HIDO_UINT32 m_u32Result; +}ST_ATCmd; + +/******************************************************************************* + * Global Function * + *******************************************************************************/ + +#endif /* _AT_CONFIG_H_ */ diff --git a/keil/include/components/internet/inc/Internet.h b/keil/include/components/internet/inc/Internet.h new file mode 100644 index 0000000..c608187 --- /dev/null +++ b/keil/include/components/internet/inc/Internet.h @@ -0,0 +1,37 @@ +/******************************************************************************* + * File Name : Internet.h + * Description : + * Created on : 2018年4月26日 + * Author : 杜键 + *******************************************************************************/ +#ifndef _INTERNET_H_ +#define _INTERNET_H_ +/******************************************************************************* + * Include Files * + *******************************************************************************/ +#include "HIDO_TypeDef.h" +#include "HIDO_VLQueue.h" +#include "HIDO_ArraryQueue.h" + +/******************************************************************************* + * Macro * + *******************************************************************************/ + + +/******************************************************************************* + * Type Definition * + *******************************************************************************/ + + +/******************************************************************************* + * Global Function * + *******************************************************************************/ +HIDO_INT32 Internet_PowerOn(void); +HIDO_INT32 Internet_PowerOff(void); +HIDO_INT32 Internet_Poll(void); +HIDO_INT32 Internet_DebugOn(void); +HIDO_INT32 Internet_DebugOff(void); +HIDO_INT32 Internet_Init(void); +HIDO_BOOL Internet_IsIPReady(void); + +#endif /* _COMMUNICATION_H_ */ diff --git a/keil/include/components/internet/inc/Module.h b/keil/include/components/internet/inc/Module.h new file mode 100644 index 0000000..599a3f2 --- /dev/null +++ b/keil/include/components/internet/inc/Module.h @@ -0,0 +1,368 @@ +/******************************************************************************* + * File Name : Module.h + * Description : + * Created on : 2018年8月5日 + * Author : www.hido-studio.com + *******************************************************************************/ + +#ifndef _MODULE_H_ +#define _MODULE_H_ +/******************************************************************************* + * Include Files * + *******************************************************************************/ +#include "HIDO_TypeDef.h" +//#include "GPS.h" + +/******************************************************************************* + * Macro * + *******************************************************************************/ +#define MODULE_IMEI_SIZE 16 +#define MODULE_IMSI_SIZE 16 +#define MODULE_CCID_SIZE 25 + +/******************************************************************************* + * Type Definition * + *******************************************************************************/ +typedef enum +{ + MODULE_MAIN, + MODULE_GNSS, + MODULE_GSM, + + MODULE_ALL, +} E_Module; + +typedef enum +{ + MODULE_STATE_SLEEP, + MODULE_STATE_WAKEUP, + MODULE_STATE_POWER_OFF, + MODULE_STATE_POWER_ON, +} E_ModuleState; + +typedef struct +{ + HIDO_DOUBLE m_dLon; + HIDO_DOUBLE m_dLat; + HIDO_UINT16 m_u16Year; + HIDO_UINT8 m_u8Mon; + HIDO_UINT8 m_u8Day; + HIDO_UINT8 m_u8Hour; + HIDO_UINT8 m_u8Min; + HIDO_UINT8 m_u8Sec; +}ST_LBSLocation; + +typedef struct +{ + HIDO_INT32 m_i32Reserve; +} ST_GNSSLocation; +typedef HIDO_VOID (*FN_SignalIntensityCallback)(HIDO_UINT32 _u32SignalIntensity, HIDO_VOID *_pArg); +typedef HIDO_VOID (*FN_LBSLocationCallback)(ST_LBSLocation *_pstLBSLocation, HIDO_VOID *_pArg); +typedef HIDO_VOID (*FN_PowerEventCallback)(E_Module _eModule, E_ModuleState _eModuleState, HIDO_VOID *_pArg); + +/******************************************************************************* + * Global Function * + *******************************************************************************/ + +/******************************************************************************* + * Function Name : Module_SignalIntensityResult + * Description : 信号强度异步结果通知 + * Input : _u32SignalIntensity 信号强度 + * Output : None + * Return : None + * Author : www.hido-studio.com + * Modified Date: : 2018年8月5日 + *******************************************************************************/ +HIDO_INT32 Module_SignalIntensityResult(HIDO_UINT32 _u32SignalIntensity); + +/******************************************************************************* + * Function Name : Module_GetSignalIntensityAsync + * Description : 信号强度异步获取 + * Input : _fnGetSignalIntensity 异步通知回调 + * Output : None + * Return : None + * Author : www.hido-studio.com + * Modified Date: : 2018年8月5日 + *******************************************************************************/ +HIDO_INT32 Module_GetSignalIntensityAsync(FN_SignalIntensityCallback _fnGetSignalIntensity, HIDO_VOID *_pArg); + +/******************************************************************************* + * Function Name : Module_SignalIntensityNeedRequest + * Description : 是否需要异步获取信号强度 + * Input : None + * Output : None + * Return : None + * Author : www.hido-studio.com + * Modified Date: : 2018年8月5日 + *******************************************************************************/ +HIDO_BOOL Module_SignalIntensityNeedRequest(void); + +/******************************************************************************* + * Function Name : Module_LBSLocationResult + * Description : + * Input : + * Output : None + * Return : None + * Author : www.hido-studio.com + * Modified Date: : 2018年8月5日 + *******************************************************************************/ +HIDO_INT32 Module_LBSLocationResult(ST_LBSLocation *_pstLBSLocation); + +/******************************************************************************* + * Function Name : Module_GetLBSLocationAsync + * Description : + * Input : + * Output : None + * Return : None + * Author : www.hido-studio.com + * Modified Date: : 2018年8月5日 + *******************************************************************************/ +HIDO_INT32 Module_GetLBSLocationAsync(FN_LBSLocationCallback _fnGetLBSLocation, HIDO_VOID *_pArg); + +/******************************************************************************* + * Function Name : Module_LBSLocationNeedRequest + * Description : + * Input : None + * Output : None + * Return : None + * Author : www.hido-studio.com + * Modified Date: : 2018年8月5日 + *******************************************************************************/ +HIDO_BOOL Module_LBSLocationNeedRequest(void); + +/******************************************************************************* + * Function Name : Module_GetIMEI + * Description : 获取IMEI接口 + * Input : None + * Output : _acIMEI IMEI + * Return : None + * Author : www.hido-studio.com + * Modified Date: : 2018年8月5日 + *******************************************************************************/ +HIDO_CHAR *Module_GetIMEI(HIDO_VOID); + +/******************************************************************************* + * Function Name : Module_SetIMEI + * Description : 设置IMEI接口 + * Input : _pcIMEI IMEI + * _u32IMEILen 长度 + * Output : None + * Return : None + * Author : www.hido-studio.com + * Modified Date: : 2018年8月5日 + *******************************************************************************/ +HIDO_INT32 Module_SetIMEI(HIDO_CHAR *_pcIMEI, HIDO_UINT32 _u32IMEILen); + +/******************************************************************************* + * Function Name : Module_GetIMSI + * Description : 设置IMEI接口 + * Input : _pcIMSI IMSI + * _u32IMSILen 长度 + * Output : None + * Return : None + * Author : www.hido-studio.com + * Modified Date: : 2018年8月5日 + *******************************************************************************/ +HIDO_CHAR *Module_GetIMSI(HIDO_VOID); + +/******************************************************************************* + * Function Name : Module_SetIMSI + * Description : 设置IMSI接口 + * Input : _pcIMSI IMSI + * _u32IMSILen 长度 + * Output : None + * Return : None + * Author : www.hido-studio.com + * Modified Date: : 2018年8月5日 + *******************************************************************************/ +HIDO_INT32 Module_SetIMSI(HIDO_CHAR *_pcIMSI, HIDO_UINT32 _u32IMSILen); + +/******************************************************************************* + * Function Name : Module_GetCCID + * Description : 获取SIM卡号 + * Input : None + * Output : None + * Return : SIM卡号 + * Author : www.hido-studio.com + * Modified Date: : 2018年8月5日 + *******************************************************************************/ +HIDO_CHAR *Module_GetCCID(HIDO_VOID); + +/******************************************************************************* + * Function Name : Module_SetCCID + * Description : 设置IMSI接口 + * Input : _pcIMSI IMSI + * _u32IMSILen 长度 + * Output : None + * Return : None + * Author : www.hido-studio.com + * Modified Date: : 2018年8月5日 + *******************************************************************************/ +HIDO_INT32 Module_SetCCID(HIDO_CHAR *_pcCCID, HIDO_UINT32 _u32CCIDLen); + +/******************************************************************************* + * Function Name : Module_Sleep + * Description : 睡眠接口 + * Input : + * Output : None + * Return : None + * Author : www.hido-studio.com + * Modified Date: : 2018年8月5日 + *******************************************************************************/ +HIDO_INT32 Module_SetPowerEventCallback(FN_PowerEventCallback _fnPowerCallback, HIDO_VOID *_pArg); + +/******************************************************************************* + * Function Name : Module_Sleep + * Description : 睡眠接口 + * Input : + * Output : None + * Return : None + * Author : www.hido-studio.com + * Modified Date: : 2018年8月5日 + *******************************************************************************/ +HIDO_INT32 Module_Sleep(E_Module _eModule); + +/******************************************************************************* + * Function Name : Module_WakeUp + * Description : 唤醒接口 + * Input : + * Output : None + * Return : None + * Author : www.hido-studio.com + * Modified Date: : 2018年8月5日 + *******************************************************************************/ +HIDO_INT32 Module_WakeUp(E_Module _eModule); + +/******************************************************************************* + * Function Name : Module_PowerEvent + * Description : + * Input : + * Output : None + * Return : None + * Author : www.hido-studio.com + * Modified Date: : 2018年8月5日 + *******************************************************************************/ +HIDO_INT32 Module_PowerEvent(E_Module _eModule, E_ModuleState _eModuleState); + +/******************************************************************************* + * Function Name : Module_PowerOff + * Description : 关机接口 + * Input : + * Output : None + * Return : None + * Author : www.hido-studio.com + * Modified Date: : 2018年8月5日 + *******************************************************************************/ +HIDO_INT32 Module_PowerOff(E_Module _eModule); + +/******************************************************************************* + * Function Name : Module_PowerOn + * Description : 开机接口 + * Input : + * Output : None + * Return : None + * Author : www.hido-studio.com + * Modified Date: : 2018年8月5日 + *******************************************************************************/ +HIDO_INT32 Module_PowerOn(E_Module _eModule); + +/******************************************************************************* + * Function Name : Module_NeedSleep + * Description : 睡眠接口 + * Input : + * Output : None + * Return : None + * Author : www.hido-studio.com + * Modified Date: : 2018年8月5日 + *******************************************************************************/ +HIDO_BOOL Module_NeedSleep(E_Module _eModule); + +/******************************************************************************* + * Function Name : Module_WakeUp + * Description : 唤醒接口 + * Input : + * Output : None + * Return : None + * Author : www.hido-studio.com + * Modified Date: : 2018年8月5日 + *******************************************************************************/ +HIDO_BOOL Module_NeedWakeUp(E_Module _eModule); + +/******************************************************************************* + * Function Name : Module_PowerOff + * Description : 关机接口 + * Input : + * Output : None + * Return : None + * Author : www.hido-studio.com + * Modified Date: : 2018年8月5日 + *******************************************************************************/ +HIDO_BOOL Module_NeedPowerOff(E_Module _eModule); + +/******************************************************************************* + * Function Name : Module_PowerOn + * Description : 开机接口 + * Input : + * Output : None + * Return : None + * Author : www.hido-studio.com + * Modified Date: : 2018年8月5日 + *******************************************************************************/ +HIDO_BOOL Module_NeedPowerOn(E_Module _eModule); + +/******************************************************************************* + * Function Name : Module_GetSignalIntensity + * Description : 获取最后一次缓存的信号限度 + * Input : None + * Output : None + * Return : 信号强度 + * Author : www.hido-studio.com + * Modified Date: : 2018年8月5日 + *******************************************************************************/ +HIDO_UINT32 Module_GetSignalIntensity(void); + +/******************************************************************************* + * Function Name : Module_RunATCmdResult + * Description : 用户AT命令运行结果 + * Input : None + * Output : None + * Return : None + * Author : www.hido-studio.com + * Modified Date: : 2018年8月5日 + *******************************************************************************/ +HIDO_INT32 Module_RunATCmdResult(HIDO_DataStruct * _pstATResponse); + +/******************************************************************************* + * Function Name : Module_RunATCmdEnable + * Description : 判断是否需要用户的AT命令 + * Input : None + * Output : None + * Return : None + * Author : www.hido-studio.com + * Modified Date: : 2018年8月5日 + *******************************************************************************/ +HIDO_BOOL Module_RunATCmdEnable(HIDO_VOID); + +/******************************************************************************* + * Function Name : Module_GetRunATCmd + * Description : 获取用户运行的AT命令 + * Input : None + * Output : None + * Return : None + * Author : www.hido-studio.com + * Modified Date: : 2018年8月5日 + *******************************************************************************/ +HIDO_CHAR *Module_GetRunATCmd(HIDO_VOID); + +/******************************************************************************* + * Function Name : Module_RunATCmd + * Description : 用户运行AT命令 + * Input : None + * Output : None + * Return : None + * Author : www.hido-studio.com + * Modified Date: : 2018年8月5日 + *******************************************************************************/ +HIDO_INT32 Module_RunATCmd(HIDO_CHAR *_pcATCmd); + +#endif /* _MODULE_H_ */ diff --git a/keil/include/components/internet/inc/Socket.h b/keil/include/components/internet/inc/Socket.h new file mode 100644 index 0000000..88edc10 --- /dev/null +++ b/keil/include/components/internet/inc/Socket.h @@ -0,0 +1,355 @@ +#ifndef FML_SOCKET_H_ +#define FML_SOCKET_H_ + +#include "HIDO_TypeDef.h" +#include "HIDO_VLQueue.h" + +#define SOCKET_NUM 3 + +typedef enum +{ + SOCKET_TYPE_NONE = 0, + SOCKET_TYPE_TCP, + SOCKET_TYPE_UDP, +} E_SocketType; + +typedef enum +{ + SOCKET_STATE_IDLE = 0, + SOCKET_STATE_CLOSED, + SOCKET_STATE_CREATED, + SOCKET_STATE_CONNECT, + SOCKET_STATE_CLOSE_BEFORE_CONNECT, + SOCKET_STATE_CLOSE, + SOCKET_STATE_CONNECTED, + SOCKET_STATE_CONNECT_FAILED, +} E_SocketState; + +typedef enum +{ + SOCKET_EVENT_CONNECT_FAILED, + SOCKET_EVENT_CONNECTED, + SOCKET_EVENT_CLOSED, + SOCKET_EVENT_RECV_DATA, +} E_SocketEvent; + +typedef HIDO_VOID (*FN_SocketEventProc)(HIDO_INT32, E_SocketEvent, HIDO_VOID *); + +/******************************************************************************* + * Function Name : Socket_HaveRecvData + * Description : 通知Socket有数据需要接收 + * Input : _i32Sock Socket描述符 + * Output : None + * Return : HIDO_OK 成功, HIDO_ERR 失败 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月17日 + *******************************************************************************/ +HIDO_INT32 Socket_HaveRecvData(HIDO_INT32 _i32SockID); + +/******************************************************************************* + * Function Name : Socket_NoRecvData + * Description : 通知Socket没有数据需要接收 + * Input : _i32Sock Socket描述符 + * Output : None + * Return : HIDO_OK 成功, HIDO_ERR 失败 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月17日 + *******************************************************************************/ +HIDO_INT32 Socket_NoRecvData(HIDO_INT32 _i32SockID); + +/******************************************************************************* + * Function Name : Socket_HasRecvData + * Description : 获取Socket是否有数据需要接收 + * Input : _i32Sock Socket描述符 + * Output : None + * Return : HIDO_TRUE 有数据需要接收, HIDO_FALSE 没有数据需要接收 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月17日 + *******************************************************************************/ +HIDO_BOOL Socket_HasRecvData(HIDO_INT32 _i32SockID); + +/******************************************************************************* + * Function Name : Socket_GetSocketRecvQueue + * Description : 获取Socket接收队列 + * Input : _i32Sock Socket描述符 + * Output : None + * Return : Socket接收队列 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月17日 + *******************************************************************************/ +HIDO_VLQStruct *Socket_GetSocketRecvQueue(HIDO_INT32 _i32SockID); + +/******************************************************************************* + * Function Name : Socket_GetSocketSendQueue + * Description : 获取Socket发送队列 + * Input : _i32Sock Socket描述符 + * Output : None + * Return : Socket发送队列 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月17日 + *******************************************************************************/ +HIDO_VLQStruct *Socket_GetSocketSendQueue(HIDO_INT32 _i32SockID); + +/******************************************************************************* + * Function Name : Socket_GetType + * Description : 获取Socke类型 + * Input : _i32Sock Socket描述符 + * Output : None + * Return : Socke类型 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月17日 + *******************************************************************************/ +E_SocketType Socket_GetType(HIDO_INT32 _i32SockID); + +/******************************************************************************* + * Function Name : Socket_GetSocketState + * Description : 获取Socke内部状态 + * Input : _i32Sock Socket描述符 + * Output : None + * Return : Socke内部状态 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月17日 + *******************************************************************************/ +E_SocketState Socket_GetSocketState(HIDO_INT32 _i32SockID); + +/******************************************************************************* + * Function Name : Socket_SetSocketState + * Description : 设置Socke内部状态 + * Input : _i32Sock Socket描述符 + * : _eState Socke内部状态 + * Output : None + * Return : HIDO_OK 成功, HIDO_ERR 失败 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月17日 + *******************************************************************************/ +HIDO_INT32 Socket_SetSocketState(HIDO_INT32 _i32SockID, E_SocketState _eState); + +/******************************************************************************* + * Function Name : Socket_GetRemoteAddr + * Description : 获取Socket远程地址 + * Input : _i32Sock Socket描述符 + * Output : None + * Return : 远程地址 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月17日 + *******************************************************************************/ +HIDO_CHAR *Socket_GetRemoteAddr(HIDO_INT32 _i32SockID); + +/******************************************************************************* + * Function Name : Socket_GetRemotePort + * Description : 获取Socket远程端口 + * Input : _i32Sock Socket描述符 + * Output : None + * Return : 远程端口 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月17日 + *******************************************************************************/ +HIDO_UINT16 Socket_GetRemotePort(HIDO_INT32 _i32SockID); + +/******************************************************************************* + * Function Name : Socket_RecvAll + * Description : 全部Socket需要接收数据的通知 + * Input : None + * Output : None + * Return : HIDO_OK 成功, HIDO_ERR 失败 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月17日 + *******************************************************************************/ +HIDO_INT32 Socket_RecvAll(void); + +/******************************************************************************* + * Function Name : Socket_ClosedAll + * Description : 全部Socket被断开的通知 + * Input : None + * Output : None + * Return : HIDO_OK 成功, HIDO_ERR 失败 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月17日 + *******************************************************************************/ +HIDO_INT32 Socket_ClosedAll(void); + +/******************************************************************************* + * Function Name : Socket_OnConnectFailed + * Description : Socket连接失败时的内部通知 + * Input : _i32Sock Socket描述符 + * Output : None + * Return : HIDO_OK 成功, HIDO_ERR 失败 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月17日 + *******************************************************************************/ +HIDO_INT32 Socket_OnConnectFailed(HIDO_INT32 _i32SockID); + +/******************************************************************************* + * Function Name : Socket_OnConnected + * Description : Socket连接成功时的内部通知 + * Input : _i32Sock Socket描述符 + * Output : None + * Return : HIDO_OK 成功, HIDO_ERR 失败 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月17日 + *******************************************************************************/ +HIDO_INT32 Socket_OnConnected(HIDO_INT32 _i32SockID); + +/******************************************************************************* + * Function Name : Socket_OnClosed + * Description : Socket被关闭时的内部通知 + * Input : _i32Sock Socket描述符 + * Output : None + * Return : HIDO_OK 成功, HIDO_ERR 失败 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月17日 + *******************************************************************************/ +HIDO_INT32 Socket_OnClosed(HIDO_INT32 _i32SockID); + +/******************************************************************************* + * Function Name : Socket_RecvData + * Description : Socket收到数据时的内部处理 + * Input : _i32Sock Socket描述符 + * : _pu8Data 收到的数据 + * : _u32Len 收到的数据长度 + * Output : None + * Return : HIDO_OK 成功, HIDO_ERR 失败 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月17日 + *******************************************************************************/ +HIDO_INT32 Socket_RecvData(HIDO_INT32 _i32SockID, HIDO_UINT8 *_pu8Data, HIDO_UINT32 _u32Len); + +/******************************************************************************* + * Function Name : Socket_OnRecv + * Description : Socket收到数据时的内部通知 + * Input : _i32Sock Socket描述符 + * Output : None + * Return : HIDO_OK 成功, HIDO_ERR 失败 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月17日 + *******************************************************************************/ +HIDO_INT32 Socket_OnRecv(HIDO_INT32 _i32SockID); + +/******************************************************************************* + * Function Name : Socket_Create + * Description : Socket创建 + * Input : _eSocketType Socket类型 + * : _fnEventProc Socket事件处理函数 + * : _pArg 参数 + * Output : _pi32SockID Socket描述符 + * Return : HIDO_OK 成功, HIDO_ERR 失败 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月17日 + *******************************************************************************/ +HIDO_INT32 Socket_Create(HIDO_INT32 *_pi32SockID, E_SocketType _eSocketType, FN_SocketEventProc _fnEventProc, HIDO_VOID *_pArg); + +/******************************************************************************* + * Function Name : Socket_Connect + * Description : Socket连接 + * Input : _i32Sock Socket描述符 + * : _pcRemoteAddr 目标地址 + * : _u16RemotePort 目标端口 + * Output : None + * Return : HIDO_OK 成功, HIDO_ERR 失败 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月17日 + *******************************************************************************/ +HIDO_INT32 Socket_Connect(HIDO_INT32 _i32SockID, HIDO_CHAR *_pcRemoteAddr, HIDO_UINT16 _u16RemotePort); + +/******************************************************************************* + * Function Name : Socket_Close + * Description : 关闭一个Socket + * Input : _i32Sock Socket描述符 + * Output : None + * Return : HIDO_OK 成功, HIDO_ERR 失败 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月17日 + *******************************************************************************/ +HIDO_INT32 Socket_Close(HIDO_INT32 _i32SockID); + +/******************************************************************************* + * Function Name : Socket_Destroy + * Description : 销毁一个Socket + * Input : _i32Sock Socket描述符 + * Output : None + * Return : HIDO_OK 成功, HIDO_ERR 失败 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月17日 + *******************************************************************************/ +HIDO_INT32 Socket_Destroy(HIDO_INT32 _i32SockID); + +/******************************************************************************* + * Function Name : Socket_IsSendQueueEmpty + * Description : 判断发送队列是否为空 + * Input : _i32Sock Socket描述符 + * Output : None + * Return : HIDO_TRUE 发送队列为空, HIDO_FALSE 发送队列不为空 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月17日 + *******************************************************************************/ +HIDO_BOOL Socket_IsSendQueueEmpty(HIDO_INT32 _i32SockID); + +/******************************************************************************* + * Function Name : Socket_Send + * Description : Socket发送数据 + * Input : _i32Sock Socket描述符 + * : _pu8Data 发送的数据 + * : _u32DataLen 发送的数据长度 + * Output : None + * Return : HIDO_OK 成功, HIDO_ERR 失败 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月17日 + *******************************************************************************/ +HIDO_INT32 Socket_Send(HIDO_INT32 _i32SockID, HIDO_UINT8 *_pu8Data, HIDO_UINT32 _u32DataLen); + +/******************************************************************************* + * Function Name : Socket_IsClosed + * Description : 检查Socket是否已断开 + * Input : _i32Sock Socket描述符 + * Output : _pbResult 断开状态 HIDO_TRUE 已断开 HIDO_FALSE 未断开 + * Return : HIDO_OK 成功, HIDO_ERR 失败 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月17日 + *******************************************************************************/ +HIDO_INT32 Socket_IsClosed(HIDO_INT32 _i32SockID, HIDO_BOOL *_pbResult); + +/******************************************************************************* + * Function Name : Socket_IsConnected + * Description : 检查Socket是否已连接 + * Input : _i32Sock Socket描述符 + * Output : _pbResult 连接状态 HIDO_TRUE 已连接 HIDO_FALSE 未连接 + * Return : HIDO_OK 成功, HIDO_ERR 失败 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月17日 + *******************************************************************************/ +HIDO_INT32 Socket_IsConnected(HIDO_INT32 _i32SockID, HIDO_BOOL *_pbResult); + +/******************************************************************************* + * Function Name : Socket_UseHeartbeat + *******************************************************************************/ +HIDO_BOOL Socket_UseHeartbeat(HIDO_INT32 _i32SockID); + +/******************************************************************************* + * Function Name : Socket_HeartbeatConfig + *******************************************************************************/ +HIDO_INT32 Socket_HeartbeatConfig(HIDO_INT32 _i32SockID, HIDO_UINT8 *_pu8Data, HIDO_UINT32 _u32Len, HIDO_UINT32 _u32HeartbeatFreq); + +/******************************************************************************* + * Function Name : Socket_GetHeartbeatFreq + *******************************************************************************/ +HIDO_UINT32 Socket_GetHeartbeatFreq(HIDO_INT32 _i32SockID); + +/******************************************************************************* + * Function Name : Socket_GetHeartbeatFreq + *******************************************************************************/ +HIDO_CHAR *Socket_GetHeartbeatData(HIDO_INT32 _i32SockID); + +/******************************************************************************* + * Function Name : Socket_Recv + * Description : 从Socket接收队列中读取数据 + * Input : _i32Sock Socket描述符 + * : _u32RecvBuffSize 读取数据的缓存地址 + * Output : _pu8RecvBuff 读取数据的缓存 + * : _pu32RecvLen 数据长度 + * Return : HIDO_OK 成功, HIDO_ERR 失败 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月17日 + *******************************************************************************/ +HIDO_INT32 Socket_Recv(HIDO_INT32 _i32SockID, HIDO_UINT8 *_pu8RecvBuff, HIDO_UINT32 _u32RecvBuffSize, HIDO_UINT32 *_pu32RecvLen); + +#endif /* FML_GPRS_SOCKET_SOCKET_H_ */ diff --git a/keil/include/components/internet/src/AIR780ECSQ.c b/keil/include/components/internet/src/AIR780ECSQ.c new file mode 100644 index 0000000..8571343 --- /dev/null +++ b/keil/include/components/internet/src/AIR780ECSQ.c @@ -0,0 +1,148 @@ +/******************************************************************************* + * File Name : AIR780ELBS.c + * Description : + * Created on : 2018年5月23日 + * Author : 杜键 + *******************************************************************************/ + +/******************************************************************************* + * Include Files * + *******************************************************************************/ +#include "AIR780ECSQ.h" + +#include "string.h" +#include "stdlib.h" +#include "Module.h" +#include "Module.h" +#include "AIR780EDriver.h" +#include "AIR780EFSM.h" +#include "HIDO_Util.h" +#include "HIDO_FSM.h" +#include "HIDO_Timer.h" +#include "HIDO_ATLite.h" +#include "HIDO_Debug.h" +#include "ATConfig.h" + +/******************************************************************************* + * Macro * + *******************************************************************************/ + +/******************************************************************************* + * Type Definition * + *******************************************************************************/ + +/******************************************************************************* + * Local Variable * + *******************************************************************************/ +HIDO_FSM_DETACHED_STATE(AIR780ECSQ) + +/******************************************************************************* + * Local Function Declaration * + *******************************************************************************/ + +/******************************************************************************* + * Local Function * + *******************************************************************************/ +/******************************************************************************* + * State Name : AIR780ECSQ + * Parent State : + * Description : + * Author : 杜键 + * Modified Date: : 2018-05-01 + *******************************************************************************/ +HIDO_FSM_DETACHED_STATE_IMPLEMENT(AIR780ECSQ, HIDO_NULL, HIDO_NULL) +{ + static const HIDO_StateStruct *l_pstAfterState = HIDO_NULL; + HIDO_ATLiteDeviceStruct *_pstATDevice = (HIDO_ATLiteDeviceStruct *) _pstFSM->m_pPrivateData; + + switch (_u32Event) + { + case HIDO_EVENT_ENTRY: + { + HIDO_StateArgStruct *pstStateArg = (HIDO_StateArgStruct *)_pArg; + + l_pstAfterState = pstStateArg->m_pstAfterState; + + HIDO_ATLiteCmdSend(_pstATDevice, AT_GENERAL_TIMEOUT_TIME, "AT+CSQ\r\n"); + break; + } + case HIDO_EVENT_EXIT: + { + HIDO_ATLiteCmdSendOver(_pstATDevice); + break; + } + case HIDO_AT_EVENT_OK: + case HIDO_AT_EVENT_ERROR: + { + HIDO_FSMStateChange(_pstFSM, l_pstAfterState, HIDO_NULL); + break; + } + case AIR780E_EVENT_CSQ: + { + /* +CSQ: 0,31 */ + HIDO_UINT32 u32CSQResult = 0; + HIDO_DataStruct *pstData = (HIDO_DataStruct *) _pArg; + + if (HIDO_UtilParseFormat((HIDO_UINT8 *) pstData->m_pData, pstData->m_u32Len, "+CSQ: %d,%*\r\n", + &u32CSQResult)!= 2) + { + break; + } + + Module_SignalIntensityResult(u32CSQResult); + + break; + } + default: + { + return HIDO_EVENT_NO_PROC; + } + } + + return HIDO_EVENT_OK; +} + +/******************************************************************************* + * Global Function * + *******************************************************************************/ + +/******************************************************************************* + * Function Name : AIR780ECSQ_Poll + * Description : + * Input : + * Output : + * Return : + * Author : 杜键 + * Modified Date: : 2018年5月22日 + *******************************************************************************/ +HIDO_INT32 AIR780ECSQ_Poll(HIDO_ATLiteDeviceStruct *_pstATDevice) +{ + if (Module_SignalIntensityNeedRequest() == HIDO_TRUE) + { + AIR780ECSQ_Get(_pstATDevice); + return HIDO_OK; + } + + return HIDO_ERR; +} + +/******************************************************************************* + * Function Name : AIR780ECSQ_Poll + * Description : + * Input : + * Output : + * Return : + * Author : 杜键 + * Modified Date: : 2018年5月22日 + *******************************************************************************/ +HIDO_INT32 AIR780ECSQ_Get(HIDO_ATLiteDeviceStruct *_pstATDevice) +{ + HIDO_StateArgStruct stStateArg; + + stStateArg.m_pArg = HIDO_NULL; + stStateArg.m_pstAfterState = _pstATDevice->m_pstFSM->m_pstCurrentState; + HIDO_FSM_DETACHED_STATE_SETTLE(AIR780ECSQ, _pstATDevice->m_pstFSM->m_pstCurrentState->m_pstParent, HIDO_NULL); + HIDO_FSMStateChange(_pstATDevice->m_pstFSM, HIDO_FSM_STATE(AIR780ECSQ), &stStateArg); + + return HIDO_OK; +} diff --git a/keil/include/components/internet/src/AIR780EDriver.c b/keil/include/components/internet/src/AIR780EDriver.c new file mode 100644 index 0000000..369b190 --- /dev/null +++ b/keil/include/components/internet/src/AIR780EDriver.c @@ -0,0 +1,637 @@ +/******************************************************************************* + * File Name : AIR780EDriver.c + * Description : + * Created on : 2018年5月22日 + * Author : 杜键 + *******************************************************************************/ + +/******************************************************************************* + * Include Files * + *******************************************************************************/ +#include "AIR780EDriver.h" + +#include "AIR780EFSM.h" +#include "string.h" +#include "stdarg.h" +#include "mk_gpio.h" +#include "UART.h" +#include "HIDO_Timer.h" +#include "HIDO_Util.h" +#include "HIDO_Debug.h" +#include "HIDO_Log.h" + +/******************************************************************************* + * Macro * + *******************************************************************************/ +/* 串口相关 */ +#define AIR780E_UART_TX_BUF_SIZE (100) /* 串口未使用DMA模式,不需要buff */ +#define AIR780E_UART_RX_BUF_SIZE (1024) +#define AIR780E_UART_TX_QUEUE_MEMBER_CNT 8 /* 串口未使用DMA模式,不需要 */ + +/* AT相关 */ +#define AIR780E_AT_SEND_BUF_SIZE (128) /* 发送的单条AT指令的最大长度 */ +#define AIR780E_AT_RECV_BUF_SIZE (128) /* 单挑AT指令 */ + +/******************************************************************************* + * Type Definition * + *******************************************************************************/ + +/******************************************************************************* + * Local Variable * + *******************************************************************************/ +static HIDO_UINT8 l_au8AIR780EUartRxBuf[AIR780E_UART_RX_BUF_SIZE]; +static HIDO_UINT8 l_au8AIR780EUartTxBuf[AIR780E_UART_TX_BUF_SIZE]; + +static HIDO_UINT8 l_au8ATSendBuf[AIR780E_AT_SEND_BUF_SIZE]; +static HIDO_UINT8 l_au8ATRecvBuf[AIR780E_AT_RECV_BUF_SIZE]; + +static ST_AIR780EDriverData l_stDriverData; +static HIDO_ATLiteDeviceStruct l_stAIR780EDevice; +static HIDO_UINT32 l_u32ConnectLen = 0; + +static const HIDO_ATLiteCmdSetStruct l_astATCmdSetList[] = +{ + { "OK", HIDO_AT_EVENT_OK }, + { "SHUT OK", HIDO_AT_EVENT_OK }, + { "+CME ERROR:", HIDO_AT_EVENT_ERROR }, + { "ERROR", HIDO_AT_EVENT_ERROR }, + { "+CREG:", AIR780E_EVENT_CREG }, + { "+CGREG:", AIR780E_EVENT_CGREG }, + { "+CGATT:", AIR780E_EVENT_CGATT }, + { "+CSQ:", AIR780E_EVENT_CSQ }, + { "+CIPGSMLOC:", AIR780E_EVENT_LBS_LOCATION }, + { "+CPIN:", AIR780E_EVENT_CPIN }, + { ">", AIR780E_EVENT_ACK }, + { "+CMTI:", AIR780E_EVENT_NEW_SMS }, + { "+CMGR:", AIR780E_EVENT_READ_SMS }, + { "SEND OK", AIR780E_EVENT_SEND_OK }, + { "SEND FAIL", AIR780E_EVENT_SEND_FAIL }, + + { "+QIOPEN:", AIR780E_EVENT_OPEN }, + { "+QIURC: \"recv\",", AIR780E_EVENT_NEW_IP_DATA }, + { "+QIURC: \"closed\",", AIR780E_EVENT_CLOSE }, + { "+QISEND:", AIR780E_EVENT_SEND }, + { "+QIRD:", AIR780E_EVENT_READ }, + { "CONNECT", AIR780E_EVENT_CONNECT }, + { "+QFLST:", AIR780E_EVENT_QFLST }, + { "+QFOPEN:", AIR780E_EVENT_QFOPEN }, + { "+QHTTPGET:", AIR780E_EVENT_QHTTPGET }, + { "+QHTTPPOST:", AIR780E_EVENT_QHTTPPOST }, + { "+QHTTPREAD:", AIR780E_EVENT_QHTTPREAD }, + { "+QHTTPREADFILE:", AIR780E_EVENT_QHTTPREADFILE }, + { "+QHTTPPOSTFILE:", AIR780E_EVENT_QHTTPPOSTFILE }, + { "+QGPSLOC:", AIR780E_EVENT_QGPSLOC }, + { "+CCLK:", AIR780E_EVENT_CCLK }, + { "+QGPSXTRADATA:", AIR780E_EVENT_QGPSXTRADATA }, + { "+QIURC: \"pdpdeact\"", AIR780E_EVENT_PDPDEACT }, + { "+QMTOPEN:", AIR780E_EVENT_QMTOPEN }, + { "+QMTCLOSE:", AIR780E_EVENT_QMTCLOSE }, + { "+QMTCONN:", AIR780E_EVENT_QMTCONN }, + { "+QMTDISC:", AIR780E_EVENT_QMTDISC }, + { "+QMTSUB:", AIR780E_EVENT_QMTSUB }, + { "+QMTUNS:", AIR780E_EVENT_QMTUNS }, + { "+QMTPUBEX:", AIR780E_EVENT_QMTPUBEX }, + { "+QMTRECV:", AIR780E_EVENT_QMTRECV }, + { "+QMTPING:", AIR780E_EVENT_QMTPING }, + { "+QMTSTAT:", AIR780E_EVENT_QMTSTAT }, + { "+CCID:", AIR780E_EVENT_CCID }, + { "RDY", AIR780E_EVENT_RDY }, + { "+CTTS:", AIR780E_EVENT_QTTS }, + { "+QLTONE:", AIR780E_EVENT_QLTONE }, + { "+RECEIVE,", AIR780E_EVENT_RECEIVE }, + + { "0", AIR780E_EVENT_NUM_0 }, + { "1", AIR780E_EVENT_NUM_1 }, + { "2", AIR780E_EVENT_NUM_2 }, + { "3", AIR780E_EVENT_NUM_3 }, + { "4", AIR780E_EVENT_NUM_4 }, + { "5", AIR780E_EVENT_NUM_5 }, + { "6", AIR780E_EVENT_NUM_6 }, + { "7", AIR780E_EVENT_NUM_7 }, + { "8", AIR780E_EVENT_NUM_8 }, + { "9", AIR780E_EVENT_NUM_9 }, +}; + +static const HIDO_CHAR * const l_apcEventName[AIR780E_EVENT_LAST]={ + HIDO_EVENT_ENTRY_NAME, + HIDO_EVENT_EXIT_NAME, + "HIDO_AT_EVENT_OK", + "HIDO_AT_EVENT_ERROR", + "HIDO_AT_EVENT_TIMEOUT", + "HIDO_AT_EVENT_SEND_ERROR", + "AIR780E_EVENT_OK", + "AIR780E_EVENT_CREG", + "AIR780E_EVENT_CGREG", + "AIR780E_EVENT_CGATT", + "AIR780E_EVENT_CSQ", + "AIR780E_EVENT_LBS_LOCATION", + "AIR780E_EVENT_CPIN", + "AIR780E_EVENT_INIT_TIMEOUT", + + "AIR780E_EVENT_DELAY", + "-AIR780E_EVENT_POLL", + "AIR780E_EVENT_ACK", + "AIR780E_EVENT_NEW_SMS", + "AIR780E_EVENT_READ_SMS", + "AIR780E_EVENT_SMS_DATA", + "AIR780E_EVENT_NEW_IP_DATA", + + "AIR780E_EVENT_CCID", + "AIR780E_EVENT_OPEN", + "AIR780E_EVENT_SEND", + "AIR780E_EVENT_SEND_OK", + "AIR780E_EVENT_SEND_FAIL", + "AIR780E_EVENT_CLOSE", + "AIR780E_EVENT_READ", + "AIR780E_EVENT_CONNECT", + "AIR780E_EVENT_QFLST", + "AIR780E_EVENT_QFOPEN", + "AIR780E_EVENT_QHTTPGET", + "AIR780E_EVENT_QHTTPPOST", + "AIR780E_EVENT_QHTTPREAD", + "AIR780E_EVENT_QHTTPREADFILE", + "AIR780E_EVENT_QHTTPPOSTFILE", + "AIR780E_EVENT_QGPSLOC", + "AIR780E_EVENT_CCLK", + "AIR780E_EVENT_QGPSXTRADATA", + "AIR780E_EVENT_PDPDEACT", + "AIR780E_EVENT_QMTOPEN", + "AIR780E_EVENT_QMTCLOSE", + "AIR780E_EVENT_QMTCONN", + "AIR780E_EVENT_QMTDISC", + "AIR780E_EVENT_QMTSUB", + "AIR780E_EVENT_QMTUNS", + "AIR780E_EVENT_QMTPUBEX", + "AIR780E_EVENT_QMTRECV", + "AIR780E_EVENT_QMTPING", + "AIR780E_EVENT_QMTSTAT", + + "AIR780E_EVENT_RDY", + "AIR780E_EVENT_QTTS", + "AIR780E_EVENT_QLTONE", + "AIR780E_EVENT_RECEIVE", + + "AIR780E_EVENT_NUM_0", + "AIR780E_EVENT_NUM_1", + "AIR780E_EVENT_NUM_2", + "AIR780E_EVENT_NUM_3", + "AIR780E_EVENT_NUM_4", + "AIR780E_EVENT_NUM_5", + "AIR780E_EVENT_NUM_6", + "AIR780E_EVENT_NUM_7", + "AIR780E_EVENT_NUM_8", + "AIR780E_EVENT_NUM_9", +}; + +static enum IO_PIN_T l_stAIR780EPin[AIR780E_PIN_LAST]; + +/******************************************************************************* + * Local Function Declaration * + *******************************************************************************/ + +/******************************************************************************* + * Local Function * + *******************************************************************************/ +/******************************************************************************* + * Function Name : AIR780E_GetChar + * Description : + * Input : + * Output : + * Return : + * Author : 杜键 + * Modified Date: : 2018年5月22日 + *******************************************************************************/ +static HIDO_INT32 AIR780E_GetChar(HIDO_ATLiteDeviceStruct *_pstATDevice, HIDO_CHAR *_pcRecvChar) +{ + return Uart_GetChar(UART_ID_4G, (HIDO_UINT8 *) _pcRecvChar); +} + +/******************************************************************************* + * Function Name : AIR780E_ReadLine + * Description : + * Input : + * Output : + * Return : + * Author : 杜键 + * Modified Date: : 2018年5月22日 + *******************************************************************************/ +uint8_t log_4g_enable_flag; +static HIDO_INT32 AIR780E_ReadLine(HIDO_ATLiteDeviceStruct *_pstATDevice) +{ + static HIDO_UINT8 l_u8Mode = 0; + static HIDO_UINT32 l_u32ExpectedLen = 0; + static HIDO_UINT32 l_u32LastTick = 0; + HIDO_CHAR cCh = 0; + + if ((HIDO_NULL == _pstATDevice) || (HIDO_NULL == _pstATDevice->m_fnGetc) + || (HIDO_NULL == _pstATDevice->m_pcLineBuf) || (0 == _pstATDevice->m_u32LineBufSize)) + { + return HIDO_ERR; + } + + while (_pstATDevice->m_u32LineLen < _pstATDevice->m_u32LineBufSize - 1) + { + if (_pstATDevice->m_fnGetc(_pstATDevice, &cCh) != HIDO_OK) + { + return HIDO_ERR; + } + + _pstATDevice->m_pcLineBuf[_pstATDevice->m_u32LineLen++] = cCh; + _pstATDevice->m_pcLineBuf[_pstATDevice->m_u32LineLen] = '\0'; + + /* +RECEIVE, */ + if (9 == _pstATDevice->m_u32LineLen && memcmp("+RECEIVE,", _pstATDevice->m_pcLineBuf, 9) == 0) + { + l_u8Mode = 1; + l_u32LastTick = HIDO_TimerGetTick(); + } + + /* 超时检查,防止长时间处于IPDATA的状态 */ + if(((l_u8Mode == 1) || (l_u8Mode == 2) || (l_u8Mode == 3)) && (HIDO_TimerGetTick() - l_u32LastTick) > 1500) + { + break; + } + + if(1 == l_u8Mode) + { + HIDO_CHAR *pcTmp = strstr(_pstATDevice->m_pcLineBuf, ":"); + + if(pcTmp != HIDO_NULL) + { + HIDO_UINT32 u32ReqLen = 0; + + /* 获取真实需要接收的长度 */ + if (HIDO_UtilParseFormat((HIDO_UINT8 *) _pstATDevice->m_pcLineBuf, _pstATDevice->m_u32LineLen, "+RECEIVE,%*,%d:", + &u32ReqLen) != 2) + { + break; + } + + if(0 == u32ReqLen) + { + break; + } + + l_u32ExpectedLen = pcTmp - _pstATDevice->m_pcLineBuf + 3 + u32ReqLen; + l_u8Mode = 10; + } + } + else if(10 == l_u8Mode) + { + if(_pstATDevice->m_u32LineLen == l_u32ExpectedLen) + { + break; + } + } + else + { + /* 检查CR */ + if (AT_READ_CHAR_CR == cCh) + { + _pstATDevice->m_eLineReadFlag = AT_RAED_FLAG_GET_CR; + } + /* 检查LF */ + else if (AT_READ_CHAR_LF == cCh) + { + if (AT_RAED_FLAG_GET_CR == _pstATDevice->m_eLineReadFlag) + { + _pstATDevice->m_eLineReadFlag = AT_RAED_FLAG_GET_LF; + } + } + + if (AT_RAED_FLAG_GET_LF == _pstATDevice->m_eLineReadFlag) + { + if (2 == _pstATDevice->m_u32LineLen) + { + _pstATDevice->m_u32LineLen = 0; + _pstATDevice->m_eLineReadFlag = AT_RAED_FLAG_NONE; + } + else + { + _pstATDevice->m_eLineReadFlag = AT_RAED_FLAG_NONE; + + if(l_u8Mode == 10) + { + l_u8Mode = 0; + _pstATDevice->m_u32LineLen = 0; + _pstATDevice->m_eLineReadFlag = AT_RAED_FLAG_NONE; + } + else + { + break; + } + } + } + + if (1 == _pstATDevice->m_u32LineLen && '>' == _pstATDevice->m_pcLineBuf[0]) + { + break; + } + } + } + + if(HIDO_UtilIsAsciiString((HIDO_UINT8 *)_pstATDevice->m_pcLineBuf, _pstATDevice->m_u32LineLen) == HIDO_TRUE) + { + if((_pstATDevice->m_u32LineLen > 0) && (_pstATDevice->m_pcLineBuf[_pstATDevice->m_u32LineLen - 1] == '\n')) + { + if(log_4g_enable_flag) + LOG_INFO(TRACE_MODULE_APP, "[AT Recv] %s", _pstATDevice->m_pcLineBuf);//修改4G + //HIDO_Debug( "[AT Recv] %s", _pstATDevice->m_pcLineBuf); + } + else + { + if(log_4g_enable_flag) + LOG_INFO(TRACE_MODULE_APP, "[AT Recv] %s\r\n", _pstATDevice->m_pcLineBuf);//修改4G + //HIDO_Debug("[AT Recv] %s\r\n", _pstATDevice->m_pcLineBuf); + } + } + + l_u8Mode = 0; + + return HIDO_OK; +} + +/******************************************************************************* + * Function Name : AIR780E_Output + * Description : + * Input : + * Output : + * Return : + * Author : 杜键 + * Modified Date: : 2018年5月22日 + *******************************************************************************/ +static HIDO_INT32 AIR780E_Output(HIDO_ATLiteDeviceStruct *_pstATDevice, HIDO_UINT8 *_pu8Data, + HIDO_UINT32 _u32Len) +{ + if(HIDO_UtilIsAsciiString(_pu8Data, _u32Len) == HIDO_TRUE) + { + if(_pu8Data[_u32Len] == '\0') + { + if((_u32Len > 0) && (_pu8Data[_u32Len - 1] == '\n')) + { + // HIDO_Debug("[AT Send] %s", _pu8Data); + if(log_4g_enable_flag) + LOG_INFO(TRACE_MODULE_APP, "[AT Send] %s", _pu8Data);//修改4G + } + else + { + // HIDO_Debug("[AT Send] %s\r\n", _pu8Data); + if(log_4g_enable_flag) + LOG_INFO(TRACE_MODULE_APP, "[AT Send] %s", _pu8Data);//修改4G + } + } + } + + return Uart_Send(UART_ID_4G, _pu8Data, _u32Len); +} + +/******************************************************************************* + * Global Function * + *******************************************************************************/ + +/******************************************************************************* + * Function Name : AIR780E_PinRegister + * Description : + * Input : + * Output : + * Return : + * Author : 杜键 + * Modified Date: : 2018年5月22日 + *******************************************************************************/ +HIDO_INT32 AIR780EDriver_PinRegister(E_AIR780EPin _ePin, HIDO_UINT16 _u16Pin) +{ + l_stAIR780EPin[_ePin] = _u16Pin; + + return HIDO_OK; +} + +/******************************************************************************* + * Function Name : AIR780E_PowerOn + * Description : + * Input : + * Output : + * Return : + * Author : 杜键 + * Modified Date: : 2018年5月22日 + *******************************************************************************/ +HIDO_INT32 AIR780EDriver_PowerOn(void) +{ + AIR780E_Reset(); + return HIDO_OK; +} + +/******************************************************************************* + * Function Name : AIR780E_PowerOff + * Description : + * Input : + * Output : + * Return : + * Author : 杜键 + * Modified Date: : 2018年5月22日 + *******************************************************************************/ +HIDO_INT32 AIR780EDriver_PowerOff(void) +{ +// update_led_power_state(); + return HIDO_OK; +} + +/******************************************************************************* + * Function Name : AIR780EDriver_PowerEnable + * Description : + * Input : + * Output : + * Return : + * Author : 杜键 + * Modified Date: : 2018年5月22日 + *******************************************************************************/ +HIDO_INT32 AIR780EDriver_PWRKEYSet(void) +{ + gpio_pin_clr(l_stAIR780EPin[AIR780E_PIN_PWRKEY]); + + return HIDO_OK; +} + +/******************************************************************************* + * Function Name : AIR780EDriver_PowerEnable + * Description : + * Input : + * Output : + * Return : + * Author : 杜键 + * Modified Date: : 2018年5月22日 + *******************************************************************************/ +HIDO_INT32 AIR780EDriver_PWRKEYReset(void) +{ + gpio_pin_set(l_stAIR780EPin[AIR780E_PIN_PWRKEY]); + + return HIDO_OK; +} + +/******************************************************************************* + * Function Name : AIR780EDriver_DebugOn + * Description : + * Input : + * Output : + * Return : + * Author : 杜键 + * Modified Date: : 2018年5月22日 + *******************************************************************************/ +HIDO_INT32 AIR780EDriver_DebugOn(void) +{ + HIDO_FSM(AIR780E)->m_u16DbgFlag = HIDO_FSM_DBG_FLAG_ON; + + return HIDO_OK; +} + +/******************************************************************************* + * Function Name : AIR780EDriver_DebugOff + * Description : + * Input : + * Output : + * Return : + * Author : 杜键 + * Modified Date: : 2018年5月22日 + *******************************************************************************/ +HIDO_INT32 AIR780EDriver_DebugOff(void) +{ + HIDO_FSM(AIR780E)->m_u16DbgFlag = HIDO_FSM_DBG_FLAG_OFF; + + return HIDO_OK; +} + +/******************************************************************************* + * Function Name : AIR780EDriver_SetConnectLen + * Description : + * Input : + * Output : + * Return : + * Author : 杜键 + * Modified Date: : 2018年5月22日 + *******************************************************************************/ +HIDO_INT32 AIR780EDriver_SetConnectLen(HIDO_UINT32 _u32ConnectLen) +{ + l_u32ConnectLen = _u32ConnectLen; + + return HIDO_OK; +} + +/******************************************************************************* + * Function Name : AIR780EDriver_FSMDebug + * Description : + * Input : + * Output : + * Return : + * Author : 杜键 + * Modified Date: : 2018年5月22日 + *******************************************************************************/ +extern uint8_t log_4g_enable_flag; +HIDO_INT32 AIR780EDriver_FSMDebug(HIDO_FSMStruct *_pstStateMachine, HIDO_INT32 _i32Level, HIDO_CHAR *_pcFmt, va_list _ap) +{ + HIDO_CHAR acBuff[384]; + + vsnprintf(acBuff, sizeof(acBuff), _pcFmt, _ap); + + // HIDO_Log(HIDO_LOG_LEVEL_DEBUG, "%s", acBuff); + //HIDO_Debug(acBuff); +if(log_4g_enable_flag) + LOG_INFO(TRACE_MODULE_APP, acBuff);//修改4G + + return HIDO_OK; +} + +/******************************************************************************* + * Function Name : AIR780EDriver_Reset + * Description : + * Input : + * Output : + * Return : + * Author : 杜键 + * Modified Date: : 2018年5月22日 + *******************************************************************************/ +HIDO_INT32 AIR780EDriver_Reset(void) +{ + HIDO_FSMEventExecute(HIDO_FSM(AIR780E), HIDO_AT_EVENT_TIMEOUT, HIDO_NULL); + + return HIDO_OK; +} + +/******************************************************************************* + * Function Name : AIR780EDriver_Init + * Description : + * Input : + * Output : + * Return : + * Author : 杜键 + * Modified Date: : 2018年5月22日 + *******************************************************************************/ +void AIR780EUartInit(void) +{ + ST_UartInit stUartInit; + + /* 串口初始化 */ + stUartInit.m_eRxMode = UART_RX_MODE_INT; + stUartInit.m_eTxMode = UART_TX_MODE_POLL; + stUartInit.m_pu8RxBuf = l_au8AIR780EUartRxBuf; + stUartInit.m_u32RxBufSize = AIR780E_UART_RX_BUF_SIZE; + stUartInit.m_pu8TxBuf = l_au8AIR780EUartTxBuf; + stUartInit.m_u32TxBufSize = AIR780E_UART_TX_BUF_SIZE; + stUartInit.m_u32TxQueueMemberCnt = AIR780E_UART_TX_QUEUE_MEMBER_CNT; + stUartInit.m_u32BaudRate = 9600; + if(Uart_Init(UART_ID_4G, &stUartInit) != HIDO_OK) + { + + } +} +HIDO_INT32 AIR780EDriver_Init(void) +{ + ST_UartInit stUartInit; + + /* 串口初始化 */ + stUartInit.m_eRxMode = UART_RX_MODE_INT; + stUartInit.m_eTxMode = UART_TX_MODE_POLL; + stUartInit.m_pu8RxBuf = l_au8AIR780EUartRxBuf; + stUartInit.m_u32RxBufSize = AIR780E_UART_RX_BUF_SIZE; + stUartInit.m_pu8TxBuf = l_au8AIR780EUartTxBuf; + stUartInit.m_u32TxBufSize = AIR780E_UART_TX_BUF_SIZE; + stUartInit.m_u32TxQueueMemberCnt = AIR780E_UART_TX_QUEUE_MEMBER_CNT; + stUartInit.m_u32BaudRate = 9600; + if(Uart_Init(UART_ID_4G, &stUartInit) != HIDO_OK) + { + return HIDO_ERR; + } + + /* 定时器初始化 */ + if (HIDO_TimerCreate(&l_stDriverData.m_u32FSMTimerID) != HIDO_OK) + { + return HIDO_ERR; + } + + /* AT驱动初始化 */ + HIDO_ATLiteDeviceInitStruct stATInit; + + stATInit.m_pstFSM = HIDO_FSM(AIR780E); + stATInit.m_pstAtSets = l_astATCmdSetList; + stATInit.m_u32AtSetsCount = HIDO_ARRARY_COUNT(l_astATCmdSetList); + stATInit.m_fnGetc = AIR780E_GetChar; + stATInit.m_fnReadLine = AIR780E_ReadLine; + stATInit.m_fnOutput = AIR780E_Output; + stATInit.m_pcSendBuf = (HIDO_CHAR *) l_au8ATSendBuf; + stATInit.m_u32SendBufSize = HIDO_ARRARY_COUNT(l_au8ATSendBuf); + stATInit.m_pcLineBuf = (HIDO_CHAR *) l_au8ATRecvBuf; + stATInit.m_u32LineBufSize = HIDO_ARRARY_COUNT(l_au8ATRecvBuf); + stATInit.m_pUserData = &l_stDriverData; + + /* AT设备初始化 */ + if (HIDO_ATLiteDeviceInit(&l_stAIR780EDevice, &stATInit) != HIDO_OK) + { + return HIDO_ERR; + } + + /* 状态机初始化 */ + HIDO_FSMRegister(HIDO_FSM(AIR780E), HIDO_FSM_STATE(AIR780E), "AIR780E", l_apcEventName, &l_stAIR780EDevice, + HIDO_FSM_DBG_FLAG_ON); + + HIDO_FSMRegisterDebugFunc(HIDO_FSM(AIR780E), AIR780EDriver_FSMDebug); + + return HIDO_OK; +} diff --git a/keil/include/components/internet/src/AIR780EFSM.c b/keil/include/components/internet/src/AIR780EFSM.c new file mode 100644 index 0000000..1d65fce --- /dev/null +++ b/keil/include/components/internet/src/AIR780EFSM.c @@ -0,0 +1,1598 @@ +/******************************************************************************* + * File Name : AIR780EFSM.c + * Description : + * Created on : 2018年5月22日 + * Author : www.hido-studio.com + *******************************************************************************/ + +/******************************************************************************* + * Include Files * + *******************************************************************************/ +#include "AIR780EFSM.h" + +#include "string.h" +#include "Module.h" +#include "Socket.h" +#include "Module.h" +#include "AIR780ECSQ.h" +#include "AIR780EDriver.h" +#include "AIR780ESocket.h" +#include "HIDO_FSM.h" +#include "HIDO_Timer.h" +#include "HIDO_Util.h" +#include "HIDO_Debug.h" +#include "ATConfig.h" +#include "UART.h" +#include "Module.h" + +/******************************************************************************* + * Macro * + *******************************************************************************/ +#define TTS_SPEED "-10000" +#define TTS_VOLUME "-20000" + +/******************************************************************************* + * Type Definition * + *******************************************************************************/ + +/******************************************************************************* + * Global Variable * + *******************************************************************************/ +HIDO_FSM_DECLARE_IMPLEMENT(AIR780E); +HIDO_FSM_DETACHED_STATE(AIR780ERunATCmd) +HIDO_FSM_DETACHED_STATE(AIR780ECloseWireless) +HIDO_FSM_DETACHED_STATE(AIR780EOpenWireless) + +/******************************************************************************* + * Local Variable * + *******************************************************************************/ +static HIDO_BOOL l_bDeact = HIDO_FALSE; +static HIDO_UINT32 l_u32IPCheckTick = 0; +//static HIDO_UINT32 l_u32CSQGetTick = 0; +static HIDO_StateArgStruct l_stStateArg; + +/******************************************************************************* + * Local Function Declaration * + *******************************************************************************/ + +/******************************************************************************* + * Local Function * + *******************************************************************************/ +static HIDO_INT32 AIR780E_Poll(HIDO_ATLiteDeviceStruct *_pstATDevice); +static HIDO_INT32 AIR780E_PollOnIPReady(HIDO_ATLiteDeviceStruct *_pstATDevice); + +/******************************************************************************* + * Global Function * + *******************************************************************************/ + +/******************************************************************************* + * State Name : AIR780E + * Parent State : None + * Description : AIR780E主状态 + * Author : www.hido-studio.com + * Modified Date: : 2018-05-01 + *******************************************************************************/ +HIDO_FSM_STATE_IMPLEMENT(AIR780E, HIDO_NULL, HIDO_FSM_STATE(AIR780EPowerOn)) +{ + switch (_u32Event) + { + case HIDO_EVENT_ENTRY: + { + break; + } + case HIDO_EVENT_EXIT: + { + break; + } + case HIDO_AT_EVENT_TIMEOUT: + { + HIDO_FSMStateChange(_pstFSM, HIDO_FSM_STATE(AIR780EInit), HIDO_NULL); + break; + } + case AIR780E_EVENT_RECEIVE: + { + HIDO_DataStruct *pstData = (HIDO_DataStruct *) _pArg; + HIDO_UINT32 u32ID = 0; + HIDO_UINT8 *pu8Data = HIDO_NULL; + HIDO_UINT32 u32Len = 0; + + if (HIDO_UtilParseFormat((HIDO_UINT8 *) pstData->m_pData, pstData->m_u32Len, "+RECEIVE,%d,%d:\r\n%e", &u32ID, &u32Len, &pu8Data) + != 3) + { + break; + } + + Socket_RecvData(u32ID, pu8Data, u32Len); + Socket_OnRecv(u32ID); + break; + } + case AIR780E_EVENT_NUM_0: + case AIR780E_EVENT_NUM_1: + case AIR780E_EVENT_NUM_2: + case AIR780E_EVENT_NUM_3: + case AIR780E_EVENT_NUM_4: + case AIR780E_EVENT_NUM_5: + { + HIDO_DataStruct *pstData = (HIDO_DataStruct *) _pArg; + HIDO_UINT32 u32ConnectID = 0; + HIDO_DataStruct stEvent; + + if (HIDO_UtilParseFormat((HIDO_UINT8 *) pstData->m_pData, pstData->m_u32Len, "%d, %p\r\n", + &u32ConnectID, &stEvent) != 2) + { + break; + } + + if (strncmp(stEvent.m_pData, "CLOSED", stEvent.m_u32Len) == 0) + { + Socket_OnClosed(u32ConnectID); + } + + break; + } + default: + { + return HIDO_EVENT_NO_PROC; + } + } + + return HIDO_EVENT_OK; +} + +/******************************************************************************* + * State Name : AIR780EInit + * Parent State : AIR780E + * Description : 初始化主状态 + * Author : www.hido-studio.com + * Modified Date: : 2018-05-01 + *******************************************************************************/ +HIDO_FSM_STATE_IMPLEMENT(AIR780EInit, HIDO_FSM_STATE(AIR780E), HIDO_FSM_STATE(AIR780EPowerOn)) +{ + switch (_u32Event) + { + case HIDO_EVENT_ENTRY: + { + break; + } + case HIDO_EVENT_EXIT: + { + break; + } + case HIDO_AT_EVENT_TIMEOUT: + { + /* AT命令相应超时,重新初始化 */ + HIDO_FSMStateChange(_pstFSM, HIDO_FSM_STATE(AIR780EInit), HIDO_NULL); + + break; + } + default: + { + return HIDO_EVENT_NO_PROC; + } + } + + return HIDO_EVENT_OK; +} + +/******************************************************************************* + * State Name : AIR780EPowerOff + * Parent State : AIR780EInit + * Description : + * Author : www.hido-studio.com + * Modified Date: : 2018-05-01 + *******************************************************************************/ +HIDO_FSM_STATE_IMPLEMENT(AIR780EPowerOff, HIDO_FSM_STATE(AIR780E), HIDO_NULL) +{ + switch (_u32Event) + { + case HIDO_EVENT_ENTRY: + { + AIR780EDriver_PowerOff(); + Module_PowerEvent(MODULE_MAIN, MODULE_STATE_POWER_OFF); + break; + } + case HIDO_EVENT_EXIT: + { + break; + } + case AIR780E_EVENT_POLL: + { + if(Module_NeedPowerOff(MODULE_MAIN) == HIDO_TRUE) + { + Module_PowerEvent(MODULE_MAIN, MODULE_STATE_POWER_OFF); + } + + if(Module_NeedPowerOn(MODULE_MAIN) == HIDO_TRUE) + { + HIDO_FSMStateChange(_pstFSM, HIDO_FSM_STATE(AIR780EPowerOn), HIDO_NULL); + } + + break; + } + default: + { + return HIDO_EVENT_NO_PROC; + } + } + + return HIDO_EVENT_OK; +} + +/******************************************************************************* + * State Name : AIR780EPowerOn + * Parent State : AIR780EInit + * Description : + * Author : www.hido-studio.com + * Modified Date: : 2018-05-01 + *******************************************************************************/ +HIDO_FSM_STATE_IMPLEMENT(AIR780EPowerOn, HIDO_FSM_STATE(AIR780EInit), HIDO_NULL) +{ + static enum + { + AIR780E_SUB_STATE_POWER_OFF, + AIR780E_SUB_STATE_POWER_ON, + } l_eAIR780ESubState; + + HIDO_ATLiteDeviceStruct *pstATDevice = (HIDO_ATLiteDeviceStruct *) _pstFSM->m_pPrivateData; + HIDO_UINT32 u32FSMTimerID = ((ST_AIR780EDriverData *)pstATDevice->m_pUserData)->m_u32FSMTimerID; + + switch (_u32Event) + { + case HIDO_EVENT_ENTRY: + { + pstATDevice->m_u32LineLen = 0; + while (pstATDevice->m_fnReadLine(pstATDevice) == HIDO_OK) + { + ; + } + pstATDevice->m_u32LineLen = 0; + + l_eAIR780ESubState = AIR780E_SUB_STATE_POWER_OFF; + AIR780EDriver_PowerOff(); + HIDO_FSMStartTimer(u32FSMTimerID, HIDO_TIMER_TYPE_ONCE, HIDO_TIMER_TICK_S(1), _pstFSM, AIR780E_EVENT_DELAY); + break; + } + case HIDO_EVENT_EXIT: + { + /* 退出初始化 */ + HIDO_TimerCancel(u32FSMTimerID); + + break; + } + case AIR780E_EVENT_DELAY: + { + switch(l_eAIR780ESubState) + { + case AIR780E_SUB_STATE_POWER_OFF: + { + l_eAIR780ESubState = AIR780E_SUB_STATE_POWER_ON; + AIR780EDriver_PowerOn(); + HIDO_FSMStartTimer(u32FSMTimerID, HIDO_TIMER_TYPE_ONCE, HIDO_TIMER_TICK_S(5), _pstFSM, AIR780E_EVENT_DELAY); + break; + } + case AIR780E_SUB_STATE_POWER_ON: + { + HIDO_FSMStateChange(_pstFSM, HIDO_FSM_STATE(AIR780EATCmdTest), HIDO_NULL); + //Uart_ReConfigBaudRate(UART_ID_4G, 115200); + //HIDO_ATLiteCmdSend(pstATDevice, AT_GENERAL_TIMEOUT_TIME, "AT+IPR=9600;&W\r\n"); + //Uart_ReConfigBaudRate(UART_ID_4G, 9600); + break; + } + } + + break; + } + case AIR780E_EVENT_RDY: + { + HIDO_FSMStateChange(_pstFSM, HIDO_FSM_STATE(AIR780EATCmdTest), HIDO_NULL); + break; + } + case HIDO_AT_EVENT_OK: + case HIDO_AT_EVENT_ERROR: + case HIDO_AT_EVENT_TIMEOUT: + { + HIDO_FSMStateChange(_pstFSM, HIDO_FSM_STATE(AIR780EATCmdTest), HIDO_NULL); + break; + } + default: + { + return HIDO_EVENT_NO_PROC; + } + } + + return HIDO_EVENT_OK; +} + +/******************************************************************************* + * State Name : AIR780EATCmdTest + * Parent State : AIR780EInit + * Description : AT命令测试状态 + * Author : www.hido-studio.com + * Modified Date: : 2018-05-01 + *******************************************************************************/ +HIDO_FSM_STATE_IMPLEMENT(AIR780EATCmdTest, HIDO_FSM_STATE(AIR780EInit), HIDO_NULL) +{ + HIDO_ATLiteDeviceStruct *pstATDevice = (HIDO_ATLiteDeviceStruct *) _pstFSM->m_pPrivateData; + + switch (_u32Event) + { + case HIDO_EVENT_ENTRY: + { + HIDO_ATLiteCmdSend(pstATDevice, AT_GENERAL_TIMEOUT_TIME, "ATE0\r\n"); + break; + } + case HIDO_EVENT_EXIT: + { + HIDO_ATLiteCmdSendOver(pstATDevice); + break; + } + case HIDO_AT_EVENT_OK: + { + /* 上电成功 */ + Module_PowerEvent(MODULE_MAIN, MODULE_STATE_POWER_ON); + HIDO_FSMStateChange(_pstFSM, HIDO_FSM_STATE(AIR780EWaitSimCardReady), HIDO_NULL); + + break; + } + case HIDO_AT_EVENT_ERROR: + { + break; + } + case HIDO_AT_EVENT_TIMEOUT: + { + HIDO_FSMStateChange(_pstFSM, HIDO_FSM_STATE(AIR780EPowerOn), HIDO_NULL); + break; + } + default: + { + return HIDO_EVENT_NO_PROC; + } + } + + return HIDO_EVENT_OK; +} + +/******************************************************************************* + * State Name : AIR780EWaitSimCardReady + * Parent State : AIR780EInit + * Description : 等待SIM卡准备完成 + * Author : www.hido-studio.com + * Modified Date: : 2018-05-01 + *******************************************************************************/ +HIDO_FSM_STATE_IMPLEMENT(AIR780EWaitSimCardReady, HIDO_FSM_STATE(AIR780EInit), HIDO_NULL) +{ + static HIDO_UINT32 u32RetryCnt = 0; + HIDO_ATLiteDeviceStruct *pstATDevice = (HIDO_ATLiteDeviceStruct *) _pstFSM->m_pPrivateData; + HIDO_UINT32 u32FSMTimerID = ((ST_AIR780EDriverData *)pstATDevice->m_pUserData)->m_u32FSMTimerID; + + switch (_u32Event) + { + case HIDO_EVENT_ENTRY: + { + u32RetryCnt = 0; + HIDO_ATLiteCmdSend(pstATDevice, AT_GENERAL_TIMEOUT_TIME, "AT+CPIN?\r\n"); + break; + } + case HIDO_EVENT_EXIT: + { + HIDO_ATLiteCmdSendOver(pstATDevice); + HIDO_TimerCancel(u32FSMTimerID); + break; + } + case HIDO_AT_EVENT_OK: + { + HIDO_FSMStateChange(_pstFSM, HIDO_FSM_STATE(AIR780EATCmdInit), HIDO_NULL); + break; + } + case HIDO_AT_EVENT_ERROR: + { + HIDO_FSMStartTimer(u32FSMTimerID, HIDO_TIMER_TYPE_ONCE, HIDO_TIMER_TICK_S(1), + _pstFSM, AIR780E_EVENT_DELAY); + break; + } + case HIDO_AT_EVENT_TIMEOUT: + { + break; + } + case AIR780E_EVENT_DELAY: + { + if(u32RetryCnt < 10) + { + u32RetryCnt++; + HIDO_ATLiteCmdSend(pstATDevice, AT_GENERAL_TIMEOUT_TIME, "AT+CPIN?\r\n"); + } + else + { + HIDO_FSMStateChange(_pstFSM, HIDO_FSM_STATE(AIR780EIdle), HIDO_NULL); + } + break; + } + case AIR780E_EVENT_POLL: + { + if(Module_NeedPowerOff(MODULE_MAIN) == HIDO_TRUE) + { + HIDO_FSMStateChange(HIDO_FSM(AIR780E), HIDO_FSM_STATE(AIR780EPowerOff), HIDO_NULL); + + break; + } + + break; + } + default: + { + return HIDO_EVENT_NO_PROC; + } + } + + return HIDO_EVENT_OK; +} + +/******************************************************************************* + * State Name : AIR780EATCmdInit + * Parent State : AIR780EInit + * Description : + * Author : www.hido-studio.com + * Modified Date: : 2018-05-01 + *******************************************************************************/ +HIDO_FSM_STATE_IMPLEMENT(AIR780EATCmdInit, HIDO_FSM_STATE(AIR780EInit), HIDO_NULL) +{ + static HIDO_UINT32 l_u32CmdIndex = 0; + static HIDO_UINT32 l_u32RetryCnt = 0; + + const ST_ATCmd astInitCmdList[] = + { + { "AT+CGSN\r\n", AT_GENERAL_TIMEOUT_TIME, AT_CMD_RESULT_OK }, + { "AT+CIMI\r\n", AT_GENERAL_TIMEOUT_TIME, AT_CMD_RESULT_OK }, + { "AT+CCID\r\n", AT_GENERAL_TIMEOUT_TIME, AT_CMD_RESULT_OK }, + { "ATI\r\n", AT_GENERAL_TIMEOUT_TIME, AT_CMD_RESULT_OK }, + { "AT+CFGRI=1\r\n", AT_GENERAL_TIMEOUT_TIME, AT_CMD_RESULT_OK }, +// { "AT+CTTSPARAM=100,0,50,50,0,2,25,1500,150,1,0,1\r\n", AT_GENERAL_TIMEOUT_TIME, AT_CMD_RESULT_OK }, + }; + + HIDO_ATLiteDeviceStruct *pstATDevice = (HIDO_ATLiteDeviceStruct *) _pstFSM->m_pPrivateData; + HIDO_UINT32 u32FSMTimerID = ((ST_AIR780EDriverData *) pstATDevice->m_pUserData)->m_u32FSMTimerID; + + switch (_u32Event) + { + case HIDO_EVENT_ENTRY: + { + l_u32CmdIndex = 0; + l_u32RetryCnt = 0; + HIDO_ATLiteCmdSend(pstATDevice, astInitCmdList[l_u32CmdIndex].m_u32TimeOut, astInitCmdList[l_u32CmdIndex].m_pcATCmd); + l_u32RetryCnt++; + + break; + } + case HIDO_EVENT_EXIT: + { + HIDO_ATLiteCmdSendOver(pstATDevice); + HIDO_TimerCancel(u32FSMTimerID); + break; + } + case HIDO_AT_EVENT_OK: + case HIDO_AT_EVENT_ERROR: + case HIDO_AT_EVENT_TIMEOUT: + { + if(HIDO_AT_EVENT_TIMEOUT == _u32Event) + { + if(astInitCmdList[l_u32CmdIndex].m_u32Result & AT_CMD_RESULT_TIMEOUT) + { + l_u32RetryCnt = 0; + l_u32CmdIndex++; + if (l_u32CmdIndex >= HIDO_ARRARY_COUNT(astInitCmdList)) + { + HIDO_FSMStateChange(_pstFSM, HIDO_FSM_STATE(AIR780EReady), HIDO_NULL); + } + else + { + HIDO_ATLiteCmdSend(pstATDevice, astInitCmdList[l_u32CmdIndex].m_u32TimeOut, astInitCmdList[l_u32CmdIndex].m_pcATCmd); + } + + break; + } + else + { + return HIDO_EVENT_NO_PROC; + } + } + + if (astInitCmdList[l_u32CmdIndex].m_u32Result + & (HIDO_AT_EVENT_OK == _u32Event ? AT_CMD_RESULT_OK : AT_CMD_RESULT_ERROR)) + { + l_u32RetryCnt = 0; + l_u32CmdIndex++; + if (l_u32CmdIndex >= HIDO_ARRARY_COUNT(astInitCmdList)) + { + HIDO_FSMStateChange(_pstFSM, HIDO_FSM_STATE(AIR780EReady), HIDO_NULL); + } + else + { + HIDO_ATLiteCmdSend(pstATDevice, astInitCmdList[l_u32CmdIndex].m_u32TimeOut, astInitCmdList[l_u32CmdIndex].m_pcATCmd); + } + } + else + { + l_u32RetryCnt++; + if (l_u32RetryCnt >= 3) + { + /* 重试超限 */ + HIDO_FSMStateChange(_pstFSM, HIDO_FSM_STATE(AIR780EPowerOn), HIDO_NULL); + } + else + { + /* 不是期待的结果,10后再次尝试 */ + HIDO_FSMStartTimer(u32FSMTimerID, HIDO_TIMER_TYPE_ONCE, HIDO_TIMER_TICK_S(10), _pstFSM, + AIR780E_EVENT_DELAY); + } + } + + break; + } + case AIR780E_EVENT_DELAY: + { + HIDO_ATLiteCmdSend(pstATDevice, astInitCmdList[l_u32CmdIndex].m_u32TimeOut, astInitCmdList[l_u32CmdIndex].m_pcATCmd); + break; + } + case AIR780E_EVENT_NUM_0: + case AIR780E_EVENT_NUM_1: + case AIR780E_EVENT_NUM_2: + case AIR780E_EVENT_NUM_3: + case AIR780E_EVENT_NUM_4: + case AIR780E_EVENT_NUM_5: + case AIR780E_EVENT_NUM_6: + case AIR780E_EVENT_NUM_7: + case AIR780E_EVENT_NUM_8: + case AIR780E_EVENT_NUM_9: + { + HIDO_DataStruct *pstData = (HIDO_DataStruct *) _pArg; + + switch(l_u32CmdIndex) + { + case 0: + { + Module_SetIMEI((HIDO_CHAR *)pstData->m_pData, pstData->m_u32Len); + break; + } + case 1: + { + Module_SetIMSI((HIDO_CHAR *)pstData->m_pData, pstData->m_u32Len); + break; + } + case 2: + { + Module_SetCCID((HIDO_CHAR *)pstData->m_pData, pstData->m_u32Len); + break; + } + default: + { + break; + } + } + + break; + } + case AIR780E_EVENT_POLL: + { + if(Module_NeedPowerOff(MODULE_MAIN) == HIDO_TRUE) + { + HIDO_FSMStateChange(HIDO_FSM(AIR780E), HIDO_FSM_STATE(AIR780EPowerOff), HIDO_NULL); + + break; + } + + break; + } + default: + { + return HIDO_EVENT_NO_PROC; + } + } + + return HIDO_EVENT_OK; +} + +/******************************************************************************* + * State Name : AIR780EIdle + * Parent State : AIR780E + * Description : + * Author : www.hido-studio.com + * Modified Date: : 2018-05-01 + *******************************************************************************/ +HIDO_FSM_STATE_IMPLEMENT(AIR780EIdle, HIDO_FSM_STATE(AIR780E), HIDO_NULL) +{ + HIDO_ATLiteDeviceStruct *pstATDevice = (HIDO_ATLiteDeviceStruct *) _pstFSM->m_pPrivateData; + + switch (_u32Event) + { + case HIDO_EVENT_ENTRY: + { + break; + } + case HIDO_EVENT_EXIT: + { + break; + } + case AIR780E_EVENT_POLL: + { + AIR780E_Poll(pstATDevice); + + break; + } + default: + { + return HIDO_EVENT_NO_PROC; + } + } + + return HIDO_EVENT_OK; +} + +/******************************************************************************* + * State Name : AIR780EReady + * Parent State : AIR780E + * Description : + * Author : www.hido-studio.com + * Modified Date: : 2018-05-01 + *******************************************************************************/ +HIDO_FSM_STATE_IMPLEMENT(AIR780EReady, HIDO_FSM_STATE(AIR780E), HIDO_FSM_STATE(AIR780ESearchingNetwork)) +{ + switch (_u32Event) + { + case HIDO_EVENT_ENTRY: + { + break; + } + case HIDO_EVENT_EXIT: + { + break; + } + default: + { + return HIDO_EVENT_NO_PROC; + } + } + + return HIDO_EVENT_OK; +} + +/******************************************************************************* + * State Name : AIR780ESearchingNetwork + * Parent State : AIR780E + * Description : 查找网络 + * Author : www.hido-studio.com + * Modified Date: : 2018-05-01 + *******************************************************************************/ +HIDO_FSM_STATE_IMPLEMENT(AIR780ESearchingNetwork, HIDO_FSM_STATE(AIR780EReady), HIDO_NULL) +{ + static enum + { + AIR780E_SUB_STATE_CREG, + AIR780E_SUB_STATE_CGREG, + } l_eAIR780ESubState; + + static HIDO_UINT32 l_u32RespCode = 0; + static HIDO_UINT32 l_u32Cnt = 0; + static HIDO_UINT32 l_u32ReadyCnt = 0; + static HIDO_BOOL l_bATBusy = HIDO_FALSE; + + HIDO_ATLiteDeviceStruct *pstATDevice = (HIDO_ATLiteDeviceStruct *) _pstFSM->m_pPrivateData; + HIDO_UINT32 u32FSMTimerID = ((ST_AIR780EDriverData *) pstATDevice->m_pUserData)->m_u32FSMTimerID; + + switch (_u32Event) + { + case HIDO_EVENT_ENTRY: + { + l_eAIR780ESubState = AIR780E_SUB_STATE_CREG; + l_u32Cnt = 0; + l_u32RespCode = 0; + l_bATBusy = HIDO_TRUE; + HIDO_ATLiteCmdSend(pstATDevice, AT_GENERAL_TIMEOUT_TIME, "AT+CREG?\r\n"); + break; + } + case HIDO_EVENT_EXIT: + { + HIDO_ATLiteCmdSendOver(pstATDevice); + HIDO_TimerCancel(u32FSMTimerID); + break; + } + case HIDO_AT_EVENT_OK: + { + if (AIR780E_SUB_STATE_CREG == l_eAIR780ESubState) + { + l_bATBusy = HIDO_FALSE; + + if (1 == l_u32RespCode || 5 == l_u32RespCode) + { + l_eAIR780ESubState = AIR780E_SUB_STATE_CGREG; + l_u32Cnt = 0; + l_u32RespCode = 0; + l_bATBusy = HIDO_TRUE; + HIDO_ATLiteCmdSend(pstATDevice, AT_GENERAL_TIMEOUT_TIME, "AT+CGREG?\r\n"); + } + else + { + l_u32Cnt++; + + if (l_u32Cnt > 100) + { + HIDO_FSMStateChange(_pstFSM, HIDO_FSM_STATE(AIR780EInit), HIDO_NULL); + break; + } + else + { + HIDO_FSMStartTimer(u32FSMTimerID, HIDO_TIMER_TYPE_ONCE, HIDO_TIMER_TICK_S(2), _pstFSM, + AIR780E_EVENT_DELAY); + } + } + } + else if (AIR780E_SUB_STATE_CGREG == l_eAIR780ESubState) + { + l_bATBusy = HIDO_FALSE; + + if (1 == l_u32RespCode || 5 == l_u32RespCode) + { + l_u32ReadyCnt++; + } + else + { + l_u32ReadyCnt = 0; + l_u32Cnt++; + } + + if (l_u32ReadyCnt >= 1) + { + HIDO_FSMStateChange(_pstFSM, HIDO_FSM_STATE(AIR780EIPInit), HIDO_NULL); + } + else + { + HIDO_FSMStartTimer(u32FSMTimerID, HIDO_TIMER_TYPE_ONCE, HIDO_TIMER_TICK_S(2), _pstFSM, + AIR780E_EVENT_DELAY); + } + + if (l_u32Cnt > 100) + { + /* TODO网络出错 */ + } + } + + break; + } + case AIR780E_EVENT_CREG: + { + HIDO_DataStruct *pstData = (HIDO_DataStruct *) _pArg; + + if (AIR780E_SUB_STATE_CREG == l_eAIR780ESubState) + { + if (HIDO_UtilParseFormat((HIDO_UINT8 *) pstData->m_pData, pstData->m_u32Len, "+CREG: %*,%d", + &l_u32RespCode) != 2) + { + break; + } + } + + break; + } + case AIR780E_EVENT_CGREG: + { + HIDO_DataStruct *pstData = (HIDO_DataStruct *) _pArg; + + if (AIR780E_SUB_STATE_CGREG == l_eAIR780ESubState) + { + if (HIDO_UtilParseFormat((HIDO_UINT8 *) pstData->m_pData, pstData->m_u32Len, "+CGREG: %*,%d", + &l_u32RespCode) != 2) + { + break; + } + } + break; + } + case AIR780E_EVENT_DELAY: + { + if (AIR780E_SUB_STATE_CREG == l_eAIR780ESubState) + { + l_u32RespCode = 0; + l_bATBusy = HIDO_TRUE; + HIDO_ATLiteCmdSend(pstATDevice, AT_GENERAL_TIMEOUT_TIME, "AT+CREG?\r\n"); + } + else if (AIR780E_SUB_STATE_CGREG == l_eAIR780ESubState) + { + l_u32RespCode = 0; + l_bATBusy = HIDO_TRUE; + HIDO_ATLiteCmdSend(pstATDevice, AT_GENERAL_TIMEOUT_TIME, "AT+CGREG?\r\n"); + } + + break; + } + case AIR780E_EVENT_POLL: + { + if (HIDO_FALSE == l_bATBusy) + { + AIR780E_Poll(pstATDevice); + } + + break; + } + default: + { + return HIDO_EVENT_NO_PROC; + } + } + + return HIDO_EVENT_OK; +} + +/******************************************************************************* + * State Name : AIR780EIPInit + * Parent State : AIR780E + * Description : + * Author : www.hido-studio.com + * Modified Date: : 2018-05-01 + *******************************************************************************/ +HIDO_FSM_STATE_IMPLEMENT(AIR780EIPInit, HIDO_FSM_STATE(AIR780EReady), HIDO_NULL) +{ + static HIDO_UINT32 l_u32CmdIndex = 0; + static HIDO_UINT32 l_u32RetryCnt = 0; + + HIDO_CHAR *pcIMSI = HIDO_NULL; + HIDO_CHAR acAPN[32] = { 0 }; + HIDO_ATLiteDeviceStruct *pstATDevice = (HIDO_ATLiteDeviceStruct *) _pstFSM->m_pPrivateData; + HIDO_UINT32 u32FSMTimerID = ((ST_AIR780EDriverData *) pstATDevice->m_pUserData)->m_u32FSMTimerID; + + const ST_ATCmd astInitCmdList[] = + { + { "AT+CIPRXF=1\r\n", AT_GENERAL_TIMEOUT_TIME, AT_CMD_RESULT_OK }, + { "AT+CIPMUX=1\r\n", AT_GENERAL_TIMEOUT_TIME, AT_CMD_RESULT_OK }, + { "AT+CSTT=\"%s\",\"\",\"\"\r\n", 60000, AT_CMD_RESULT_OK | AT_CMD_RESULT_ERROR }, + { "AT+CIICR\r\n", 60000, AT_CMD_RESULT_OK | AT_CMD_RESULT_ERROR }, + { "AT+CIFSR\r\n", 1000, AT_CMD_RESULT_OK | AT_CMD_RESULT_TIMEOUT }, + { "AT+POWERMODE=\"PRO\"\r\n", 5000, AT_CMD_RESULT_OK | AT_CMD_RESULT_TIMEOUT }, + }; + + pcIMSI = Module_GetIMSI(); + if(strncmp(pcIMSI, "46000", 5) == 0 || strncmp(pcIMSI, "46002", 5) == 0) + { + HIDO_UtilSnprintf(acAPN, sizeof(acAPN), "CMNET"); + } + else if(strncmp(pcIMSI, "46001", 5) == 0) + { + HIDO_UtilSnprintf(acAPN, sizeof(acAPN), "UNINET"); + } + else if(strncmp(pcIMSI, "46006", 5) == 0) + { + HIDO_UtilSnprintf(acAPN, sizeof(acAPN), "CMNET"); + } + else if(strncmp(pcIMSI, "46003", 5) == 0) + { + HIDO_UtilSnprintf(acAPN, sizeof(acAPN), "CTNET"); + } + + switch (_u32Event) + { + case HIDO_EVENT_ENTRY: + { + l_u32CmdIndex = 0; + l_u32RetryCnt = 0; + HIDO_ATLiteCmdSend(pstATDevice, astInitCmdList[l_u32CmdIndex].m_u32TimeOut, astInitCmdList[l_u32CmdIndex].m_pcATCmd); + l_u32RetryCnt++; + + break; + } + case HIDO_EVENT_EXIT: + { + HIDO_ATLiteCmdSendOver(pstATDevice); + HIDO_TimerCancel(u32FSMTimerID); + break; + } + case HIDO_AT_EVENT_OK: + case HIDO_AT_EVENT_ERROR: + case HIDO_AT_EVENT_TIMEOUT: + { + if(HIDO_AT_EVENT_TIMEOUT == _u32Event) + { + if(astInitCmdList[l_u32CmdIndex].m_u32Result & AT_CMD_RESULT_TIMEOUT) + { + l_u32RetryCnt = 0; + l_u32CmdIndex++; + if (l_u32CmdIndex >= HIDO_ARRARY_COUNT(astInitCmdList)) + { + HIDO_FSMStateChange(_pstFSM, HIDO_FSM_STATE(AIR780EIPReady), HIDO_NULL); + } + else + { + HIDO_ATLiteCmdSend(pstATDevice, astInitCmdList[l_u32CmdIndex].m_u32TimeOut, astInitCmdList[l_u32CmdIndex].m_pcATCmd, acAPN); + } + + break; + } + else + { + return HIDO_EVENT_NO_PROC; + } + } +ok: + if((HIDO_AT_EVENT_OK == _u32Event && (astInitCmdList[l_u32CmdIndex].m_u32Result & AT_CMD_RESULT_OK)) + || (HIDO_AT_EVENT_ERROR == _u32Event && (astInitCmdList[l_u32CmdIndex].m_u32Result & AT_CMD_RESULT_ERROR))) + { + l_u32RetryCnt = 0; + l_u32CmdIndex++; + if (l_u32CmdIndex >= HIDO_ARRARY_COUNT(astInitCmdList)) + { + HIDO_FSMStateChange(_pstFSM, HIDO_FSM_STATE(AIR780EIPReady), HIDO_NULL); + } + else + { + HIDO_ATLiteCmdSend(pstATDevice, astInitCmdList[l_u32CmdIndex].m_u32TimeOut, astInitCmdList[l_u32CmdIndex].m_pcATCmd, acAPN); + } + } + else + { + l_u32RetryCnt++; + if (l_u32RetryCnt >= 3) + { + /* 重试超限 */ + HIDO_FSMStateChange(_pstFSM, HIDO_FSM_STATE(AIR780E), HIDO_NULL); + } + else + { + /* 不是期待的结果,10后再次尝试 */ + HIDO_FSMStartTimer(u32FSMTimerID, HIDO_TIMER_TYPE_ONCE, HIDO_TIMER_TICK_S(10), _pstFSM, + AIR780E_EVENT_DELAY); + } + } + + break; + } + case AIR780E_EVENT_DELAY: + { + HIDO_ATLiteCmdSend(pstATDevice, astInitCmdList[l_u32CmdIndex].m_u32TimeOut, astInitCmdList[l_u32CmdIndex].m_pcATCmd, acAPN); + break; + } + case AIR780E_EVENT_POLL: + { + break; + } + case AIR780E_EVENT_NUM_0: + case AIR780E_EVENT_NUM_1: + case AIR780E_EVENT_NUM_2: + case AIR780E_EVENT_NUM_3: + case AIR780E_EVENT_NUM_4: + case AIR780E_EVENT_NUM_5: + case AIR780E_EVENT_NUM_6: + case AIR780E_EVENT_NUM_7: + case AIR780E_EVENT_NUM_8: + case AIR780E_EVENT_NUM_9: + { + if(l_u32CmdIndex == 4) + { + _u32Event = HIDO_AT_EVENT_OK; + goto ok; + } + break; + } + default: + { + return HIDO_EVENT_NO_PROC; + } + } + + return HIDO_EVENT_OK; +} + +/******************************************************************************* + * State Name : AIR780EIPReady + * Parent State : AIR780E + * Description : + * Author : www.hido-studio.com + * Modified Date: : 2018-05-01 + *******************************************************************************/ +HIDO_FSM_STATE_IMPLEMENT(AIR780EIPReady, HIDO_FSM_STATE(AIR780EReady), HIDO_FSM_STATE(AIR780EIPPoll)) +{ + switch (_u32Event) + { + case HIDO_EVENT_ENTRY: + { + break; + } + case HIDO_EVENT_EXIT: + { + Socket_ClosedAll(); +#ifdef __AIR780E_MQTT__ + MQTT_ClosedAll(); +#endif + break; + } + case AIR780E_EVENT_POLL: + { + break; + } + case HIDO_AT_EVENT_TIMEOUT: + { + HIDO_FSMStateChange(_pstFSM, HIDO_FSM_STATE(AIR780EInit), HIDO_NULL); + break; + } + case AIR780E_EVENT_CLOSE: + { + HIDO_DataStruct *pstData = (HIDO_DataStruct *) _pArg; + HIDO_UINT32 u32ID = 0; + + if (HIDO_UtilParseFormat((HIDO_UINT8 *) pstData->m_pData, pstData->m_u32Len, "+QIURC: \"closed\",%d\r\n", &u32ID) != 1) + { + break; + } + + Socket_OnClosed(u32ID); + + break; + } + case AIR780E_EVENT_PDPDEACT: + { + l_bDeact = HIDO_TRUE; + break; + } +#ifdef __AIR780E_MQTT__ + case AIR780E_EVENT_QMTSTAT: + { + HIDO_DataStruct *pstData = (HIDO_DataStruct *) _pArg; + HIDO_UINT32 u32Err = 0; + HIDO_UINT32 u32ClientID = 0; + + if (HIDO_UtilParseFormat((HIDO_UINT8 *) pstData->m_pData, pstData->m_u32Len, "+QMTSTAT: %d,%d\r\n", + &u32ClientID, &u32Err) != 2) + { + break; + } + + if(u32Err != 0) + { + MQTT_OnClosed(u32ClientID); + + break; + } + + break; + } + case AIR780E_EVENT_QMTPUBEX: + { + AIR780EMQTT_SendAck((HIDO_DataStruct *) _pArg); + + break; + } +#endif + default: + { + return HIDO_EVENT_NO_PROC; + } + } + + return HIDO_EVENT_OK; +} + +/******************************************************************************* + * State Name : AIR780EIPPoll + * Parent State : AIR780EIPReady + * Description : + * Author : www.hido-studio.com + * Modified Date: : 2018-05-01 + *******************************************************************************/ +HIDO_FSM_STATE_IMPLEMENT(AIR780EIPPoll, HIDO_FSM_STATE(AIR780EIPReady), HIDO_NULL) +{ + HIDO_ATLiteDeviceStruct *pstATDevice = (HIDO_ATLiteDeviceStruct *) _pstFSM->m_pPrivateData; + + switch (_u32Event) + { + case HIDO_EVENT_ENTRY: + { + break; + } + case HIDO_EVENT_EXIT: + { + break; + } + case AIR780E_EVENT_POLL: + { + if (HIDO_TRUE == l_bDeact) + { + l_bDeact = HIDO_FALSE; + HIDO_FSMStateChange(_pstFSM, HIDO_FSM_STATE(AIR780EReady), HIDO_NULL); + break; + } + + if(AIR780E_PollOnIPReady(pstATDevice) == HIDO_OK) + { + break; + } + + break; + } + default: + { + return HIDO_EVENT_NO_PROC; + } + } + + return HIDO_EVENT_OK; +} + +/******************************************************************************* + * State Name : AIR780EIPCheck + * Parent State : AIR780EIPReady + * Description : + * Author : www.hido-studio.com + * Modified Date: : 2018-05-01 + *******************************************************************************/ +HIDO_FSM_STATE_IMPLEMENT(AIR780EIPCheck, HIDO_FSM_STATE(AIR780EIPReady), HIDO_NULL) +{ + static HIDO_UINT32 l_u32CGATT = 0; + HIDO_ATLiteDeviceStruct *pstATDevice = (HIDO_ATLiteDeviceStruct *) _pstFSM->m_pPrivateData; + + switch (_u32Event) + { + case HIDO_EVENT_ENTRY: + { + l_u32CGATT = 0; + HIDO_ATLiteCmdSend(pstATDevice, AT_GENERAL_TIMEOUT_TIME, "AT+CGATT?\r\n"); + break; + } + case HIDO_EVENT_EXIT: + { + HIDO_ATLiteCmdSendOver(pstATDevice); + break; + } + case HIDO_AT_EVENT_OK: + { + if (1 == l_u32CGATT) + { + HIDO_FSMStateChange(_pstFSM, HIDO_FSM_STATE(AIR780EIPPoll), HIDO_NULL); + } + else + { + HIDO_FSMStateChange(_pstFSM, HIDO_FSM_STATE(AIR780EReady), HIDO_NULL); + } + + break; + } + case AIR780E_EVENT_CGATT: + { + HIDO_DataStruct *pstData = (HIDO_DataStruct *) _pArg; + + if (HIDO_UtilParseFormat((HIDO_UINT8 *) pstData->m_pData, pstData->m_u32Len, "+CGATT: %d", &l_u32CGATT) == 1) + { + + } + + break; + } + default: + { + return HIDO_EVENT_NO_PROC; + } + } + + return HIDO_EVENT_OK; +} + +/******************************************************************************* + * State Name : AIR780ERunATCmd + * Parent State : AIR780EReady + * Description : + * Author : www.hido-studio.com + * Modified Date: : 2018-05-01 + *******************************************************************************/ +HIDO_FSM_DETACHED_STATE_IMPLEMENT(AIR780ERunATCmd, HIDO_NULL, HIDO_NULL) +{ + HIDO_ATLiteDeviceStruct *pstATDevice = (HIDO_ATLiteDeviceStruct *) _pstFSM->m_pPrivateData; + + switch (_u32Event) + { + case HIDO_EVENT_ENTRY: + { + HIDO_ATLiteCmdSend(pstATDevice, AT_GENERAL_TIMEOUT_TIME, "%s\r\n", Module_GetRunATCmd()); + break; + } + case HIDO_EVENT_EXIT: + { + HIDO_ATLiteCmdSendOver(pstATDevice); + break; + } + case HIDO_AT_EVENT_OK: + case HIDO_AT_EVENT_ERROR: + case HIDO_AT_EVENT_TIMEOUT: + { + Module_RunATCmdResult((HIDO_DataStruct *)_pArg); + HIDO_FSMStateChange(_pstFSM, l_stStateArg.m_pstAfterState, HIDO_NULL); + break; + } + default: + { + return HIDO_EVENT_NO_PROC; + } + } + + return HIDO_EVENT_OK; +} + +/******************************************************************************* + * State Name : AIR780ERunATCmd + * Parent State : AIR780EReady + * Description : + * Author : www.hido-studio.com + * Modified Date: : 2018-05-01 + *******************************************************************************/ +HIDO_FSM_DETACHED_STATE_IMPLEMENT(AIR780ECloseWireless, HIDO_NULL, HIDO_NULL) +{ + HIDO_ATLiteDeviceStruct *pstATDevice = (HIDO_ATLiteDeviceStruct *) _pstFSM->m_pPrivateData; + + switch (_u32Event) + { + case HIDO_EVENT_ENTRY: + { + HIDO_ATLiteCmdSend(pstATDevice, AT_GENERAL_TIMEOUT_TIME, "AT+CFUN=0\r\n"); + break; + } + case HIDO_EVENT_EXIT: + { + HIDO_ATLiteCmdSendOver(pstATDevice); + break; + } + case HIDO_AT_EVENT_OK: + case HIDO_AT_EVENT_ERROR: + { + Module_PowerEvent(MODULE_GSM, MODULE_STATE_POWER_OFF); + HIDO_FSMStateChange(_pstFSM, HIDO_FSM_STATE(AIR780EIdle), HIDO_NULL); + break; + } + default: + { + return HIDO_EVENT_NO_PROC; + } + } + + return HIDO_EVENT_OK; +} + +/******************************************************************************* + * State Name : OpenWireless + * Parent State : AIR780EReady + * Description : + * Author : www.hido-studio.com + * Modified Date: : 2018-05-01 + *******************************************************************************/ +HIDO_FSM_DETACHED_STATE_IMPLEMENT(AIR780EOpenWireless, HIDO_NULL, HIDO_NULL) +{ + HIDO_ATLiteDeviceStruct *pstATDevice = (HIDO_ATLiteDeviceStruct *) _pstFSM->m_pPrivateData; + + switch (_u32Event) + { + case HIDO_EVENT_ENTRY: + { + HIDO_ATLiteCmdSend(pstATDevice, AT_GENERAL_TIMEOUT_TIME, "AT+CFUN=1\r\n"); + break; + } + case HIDO_EVENT_EXIT: + { + HIDO_ATLiteCmdSendOver(pstATDevice); + break; + } + case HIDO_AT_EVENT_OK: + case HIDO_AT_EVENT_ERROR: + { + Module_PowerEvent(MODULE_GSM, MODULE_STATE_POWER_ON); + HIDO_FSMStateChange(_pstFSM, HIDO_FSM_STATE(AIR780EReady), HIDO_NULL); + break; + } + default: + { + return HIDO_EVENT_NO_PROC; + } + } + + return HIDO_EVENT_OK; +} + +/******************************************************************************* + * Function Name : AIR780E_PowerPoll + * Description : 电源处理事件的轮询 + * Input : _pstATDevice AT设备描述 + * Output : None + * Return : HIDO_OK 成功, HIDO_ERR 失败 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月22日 + *******************************************************************************/ +static HIDO_INT32 AIR780E_PowerPoll(HIDO_ATLiteDeviceStruct *_pstATDevice) +{ + if(Module_NeedPowerOn(MODULE_MAIN) == HIDO_TRUE) + { + Module_PowerEvent(MODULE_MAIN, MODULE_STATE_POWER_ON); + } + + if(Module_NeedPowerOff(MODULE_MAIN) == HIDO_TRUE) + { + HIDO_FSMStateChange(HIDO_FSM(AIR780E), HIDO_FSM_STATE(AIR780EPowerOff), HIDO_NULL); + return HIDO_OK; + } + + return HIDO_ERR; +} + +/******************************************************************************* + * Function Name : AIR780E_RunATCmdPoll + * Description : 运行用户AT命令处理轮询 + * Input : _pstATDevice AT设备描述 + * Output : None + * Return : HIDO_OK 成功, HIDO_ERR 失败 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月22日 + *******************************************************************************/ +static HIDO_INT32 AIR780E_RunATCmdPoll(HIDO_ATLiteDeviceStruct *_pstATDevice) +{ + if(Module_RunATCmdEnable() == HIDO_TRUE) + { + l_stStateArg.m_pArg = HIDO_NULL; + l_stStateArg.m_pstAfterState = _pstATDevice->m_pstFSM->m_pstCurrentState; + HIDO_FSM_DETACHED_STATE_SETTLE(AIR780ERunATCmd, _pstATDevice->m_pstFSM->m_pstCurrentState->m_pstParent, HIDO_NULL); + HIDO_FSMStateChange(_pstATDevice->m_pstFSM, HIDO_FSM_STATE(AIR780ERunATCmd), HIDO_NULL); + + return HIDO_OK; + } + + return HIDO_ERR; +} + +/******************************************************************************* + * Function Name : AIR780E_CloseWirelessPoll + * Description : 关闭无线数据轮询 + * Input : _pstATDevice AT设备描述 + * Output : None + * Return : HIDO_OK 成功, HIDO_ERR 失败 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月22日 + *******************************************************************************/ +static HIDO_INT32 AIR780E_CloseWirelessPoll(HIDO_ATLiteDeviceStruct *_pstATDevice) +{ + if(Module_NeedPowerOff(MODULE_GSM) == HIDO_TRUE) + { + l_stStateArg.m_pArg = HIDO_NULL; + l_stStateArg.m_pstAfterState = _pstATDevice->m_pstFSM->m_pstCurrentState; + HIDO_FSM_DETACHED_STATE_SETTLE(AIR780ECloseWireless, _pstATDevice->m_pstFSM->m_pstCurrentState->m_pstParent, HIDO_NULL); + HIDO_FSMStateChange(_pstATDevice->m_pstFSM, HIDO_FSM_STATE(AIR780ECloseWireless), HIDO_NULL); + + return HIDO_OK; + } + + return HIDO_ERR; +} + +/******************************************************************************* + * Function Name : AIR780E_OpenWirelessPoll + * Description : 打开无线数据轮询 + * Input : _pstATDevice AT设备描述 + * Output : None + * Return : HIDO_OK 成功, HIDO_ERR 失败 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月22日 + *******************************************************************************/ +static HIDO_INT32 AIR780E_OpenWirelessPoll(HIDO_ATLiteDeviceStruct *_pstATDevice) +{ + if(Module_NeedPowerOn(MODULE_GSM) == HIDO_TRUE) + { + l_stStateArg.m_pArg = HIDO_NULL; + l_stStateArg.m_pstAfterState = _pstATDevice->m_pstFSM->m_pstCurrentState; + HIDO_FSM_DETACHED_STATE_SETTLE(AIR780EOpenWireless, _pstATDevice->m_pstFSM->m_pstCurrentState->m_pstParent, HIDO_NULL); + HIDO_FSMStateChange(_pstATDevice->m_pstFSM, HIDO_FSM_STATE(AIR780EOpenWireless), HIDO_NULL); + + return HIDO_OK; + } + + return HIDO_ERR; +} + +/******************************************************************************* + * Function Name : AIR780E_Poll + * Description : 在非IPReady状态时的轮询处理 + * Input : _pstATDevice AT设备描述 + * Output : None + * Return : HIDO_OK 成功, HIDO_ERR 失败 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月22日 + *******************************************************************************/ +static HIDO_INT32 AIR780E_Poll(HIDO_ATLiteDeviceStruct *_pstATDevice) +{ + /* Power */ + if(AIR780E_PowerPoll(_pstATDevice) == HIDO_OK) + { + return HIDO_OK; + } + +#ifdef __AIR780E_GNSS__ + /* GNSS */ + if(AIR780EGNSS_Poll(_pstATDevice) == HIDO_OK) + { + return HIDO_OK; + } +#endif + +#if 0 + /* Audio */ + if (AIR780EAudio_Poll(_pstATDevice) == HIDO_OK) + { + return HIDO_OK; + } +#endif + + /* CSQ */ + if (AIR780ECSQ_Poll(_pstATDevice) == HIDO_OK) + { + return HIDO_OK; + } + + /* RunATCmd */ + if (AIR780E_RunATCmdPoll(_pstATDevice) == HIDO_OK) + { + return HIDO_OK; + } + + /* GSM */ + if (AIR780E_CloseWirelessPoll(_pstATDevice) == HIDO_OK) + { + return HIDO_OK; + } + + if (AIR780E_OpenWirelessPoll(_pstATDevice) == HIDO_OK) + { + return HIDO_OK; + } + +#ifdef __AIR780E_FILE__ + if (AIR780EFile_Poll(_pstATDevice) == HIDO_OK) + { + return HIDO_OK; + } +#endif + + return HIDO_ERR; +} + +/******************************************************************************* + * Function Name : AIR780E_PollOnIPReady + * Description : 在IPReady状态时的轮询处理 + * Input : _pstATDevice AT设备描述 + * Output : None + * Return : HIDO_OK 成功, HIDO_ERR 失败 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月22日 + *******************************************************************************/ +static HIDO_INT32 AIR780E_PollOnIPReady(HIDO_ATLiteDeviceStruct *_pstATDevice) +{ + HIDO_UINT32 u32CurTick = HIDO_TimerGetTick(); + + /* Power */ + if (AIR780E_PowerPoll(_pstATDevice) == HIDO_OK) + { + return HIDO_OK; + } + +#ifdef __AIR780E_GNSS__ + /* GNSS */ + if(AIR780EGNSS_Poll(_pstATDevice) == HIDO_OK) + { + return HIDO_OK; + } +#endif + +#if 0 + /* Audio */ + if (AIR780EAudio_Poll(_pstATDevice) == HIDO_OK) + { + return HIDO_OK; + } +#endif + + /* Socket */ + if (AIR780ESocket_Poll(_pstATDevice) == HIDO_OK) + { + return HIDO_OK; + } + +#ifdef __AIR780E_MQTT__ + /* MQTT */ + if (AIR780EMQTT_Poll(_pstATDevice) == HIDO_OK) + { + return HIDO_OK; + } +#endif + +#ifdef __AIR780E_HTTP__ + /* HTTP */ + if (AIR780EHTTP_Poll(_pstATDevice) == HIDO_OK) + { + return HIDO_OK; + } +#endif + /* CSQ */ + if (AIR780ECSQ_Poll(_pstATDevice) == HIDO_OK) + { + return HIDO_OK; + } + +#if 0 + if ((u32CurTick - l_u32IPCheckTick) > HIDO_TIMER_TICK_S(10)) + { + l_u32IPCheckTick = u32CurTick; + HIDO_FSMStateChange(HIDO_FSM(AIR780E), HIDO_FSM_STATE(AIR780EIPCheck), HIDO_NULL); + return HIDO_OK; + } +#endif + + /* RunATCmd */ + if (AIR780E_RunATCmdPoll(_pstATDevice) == HIDO_OK) + { + return HIDO_OK; + } + + /* GSM */ + if (AIR780E_CloseWirelessPoll(_pstATDevice) == HIDO_OK) + { + return HIDO_OK; + } + + if (AIR780E_OpenWirelessPoll(_pstATDevice) == HIDO_OK) + { + return HIDO_OK; + } + +#ifdef __AIR780E_FILE__ + if (AIR780EFile_Poll(_pstATDevice) == HIDO_OK) + { + return HIDO_OK; + } +#endif + + return HIDO_ERR; +} + +/******************************************************************************* + * Function Name : AIR780E_IsIPReady + * Description : 判断状态机是否处在AIR780EIPReady状态 + * Input : None + * Output : None + * Return : HIDO_TRUE 是, HIDO_FALSE 否 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月22日 + *******************************************************************************/ +HIDO_BOOL AIR780E_IsIPReady(void) +{ + const HIDO_StateStruct *pstTmpState = HIDO_FSM(AIR780E)->m_pstCurrentState; + + while(pstTmpState != HIDO_NULL) + { + if(pstTmpState == HIDO_FSM_STATE(AIR780EIPReady)) + { + return HIDO_TRUE; + } + + pstTmpState = pstTmpState->m_pstParent; + } + + return HIDO_FALSE; +} + +/******************************************************************************* + * Function Name : AIR780E_IsIPIdle + * Description : 判断状态机是否处在AIR780EIPPoll状态 + * Input : None + * Output : None + * Return : HIDO_TRUE 是, HIDO_FALSE 否 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月22日 + *******************************************************************************/ +HIDO_BOOL AIR780E_IsIPIdle(void) +{ + const HIDO_StateStruct *pstTmpState = HIDO_FSM(AIR780E)->m_pstCurrentState; + + if(pstTmpState == HIDO_FSM_STATE(AIR780EIPPoll)) + { + return HIDO_TRUE; + } + + return HIDO_FALSE; +} diff --git a/keil/include/components/internet/src/AIR780ESocket.c b/keil/include/components/internet/src/AIR780ESocket.c new file mode 100644 index 0000000..82bee1c --- /dev/null +++ b/keil/include/components/internet/src/AIR780ESocket.c @@ -0,0 +1,513 @@ +/******************************************************************************* + * File Name : Socket.c + * Description : + * Created on : 2018年5月22日 + * Author : 杜键 + *******************************************************************************/ + +/******************************************************************************* + * Include Files * + *******************************************************************************/ +#include "Socket.h" +#include "string.h" +#include "stdlib.h" +#include "AIR780EDriver.h" +#include "AIR780EFSM.h" +#include "HIDO_FSM.h" +#include "HIDO_Timer.h" +#include "HIDO_Util.h" +#include "HIDO_VLQueue.h" +#include "HIDO_ArraryQueue.h" +#include "HIDO_ATLite.h" +#include "HIDO_Debug.h" +#include "Module.h" +#include "ATConfig.h" + +/******************************************************************************* + * Macro * + *******************************************************************************/ + +/******************************************************************************* + * Type Definition * + *******************************************************************************/ + +/******************************************************************************* + * Local Variable * + *******************************************************************************/ +HIDO_FSM_STATE_FULL_DECLARE(AIR780EIPReady, AIR780ESocketConnect) /* SOCKET连接状态 */ +HIDO_FSM_STATE_FULL_DECLARE(AIR780EIPReady, AIR780ESocketClose) /* SOCKET关闭状态 */ +HIDO_FSM_STATE_FULL_DECLARE(AIR780EIPReady, AIR780ESocketSendData) /* SOCKET发送数据状态 */ +HIDO_FSM_STATE_FULL_DECLARE(AIR780EIPReady, AIR780ESocketSendAck) +HIDO_FSM_STATE_FULL_DECLARE(AIR780EIPReady, AIR780ESocketHeartConfig) +HIDO_FSM_STATE_FULL_DECLARE(AIR780EIPReady, AIR780ESocketHeartbeat) + +static HIDO_BOOL l_abSocketUnAck[SOCKET_NUM]; +static HIDO_UINT32 l_au32SocketUnAckTick[SOCKET_NUM]; +static HIDO_UINT32 l_au32SocketSendTick[SOCKET_NUM]; + +/******************************************************************************* + * Local Function Declaration * + *******************************************************************************/ + +/******************************************************************************* + * Local Function * + *******************************************************************************/ + +/******************************************************************************* + * Global Function * + *******************************************************************************/ + +/******************************************************************************* + * State Name : AIR780ESocketHeartConfig + * Parent State : AIR780E + * Description : + * Author : 杜键 + * Modified Date: : 2018-05-01 + *******************************************************************************/ +HIDO_FSM_STATE_IMPLEMENT(AIR780ESocketHeartConfig, HIDO_FSM_STATE(AIR780EIPReady), HIDO_NULL) +{ + HIDO_ATLiteDeviceStruct *pstATDevice = (HIDO_ATLiteDeviceStruct *) _pstFSM->m_pPrivateData; + static HIDO_INT32 l_i32SocketID = 0; + + switch (_u32Event) + { + case HIDO_EVENT_ENTRY: + { + l_i32SocketID = (HIDO_INT32) _pArg; + HIDO_ATLiteCmdSend(pstATDevice, HIDO_TIMER_TICK_S(30), "AT^HEARTCONFIG=1,%d,%u\r\n", l_i32SocketID, Socket_GetHeartbeatFreq(l_i32SocketID)); + break; + } + case HIDO_EVENT_EXIT: + { + HIDO_ATLiteCmdSendOver(pstATDevice); + break; + } + case HIDO_AT_EVENT_ERROR: + case HIDO_AT_EVENT_OK: + { + + HIDO_FSMStateChange(_pstFSM, HIDO_FSM_STATE(AIR780ESocketHeartbeat), HIDO_NULL); + break; + } + default: + { + return HIDO_EVENT_NO_PROC; + } + } + + return HIDO_EVENT_OK; +} + +/******************************************************************************* + * State Name : AIR780ESocketHeartbeat + * Parent State : AIR780E + * Description : + * Author : 杜键 + * Modified Date: : 2018-05-01 + *******************************************************************************/ +HIDO_FSM_STATE_IMPLEMENT(AIR780ESocketHeartbeat, HIDO_FSM_STATE(AIR780EIPReady), HIDO_NULL) +{ + HIDO_ATLiteDeviceStruct *pstATDevice = (HIDO_ATLiteDeviceStruct *) _pstFSM->m_pPrivateData; + static HIDO_INT32 l_i32SocketID = 0; + + switch (_u32Event) + { + case HIDO_EVENT_ENTRY: + { + l_i32SocketID = (HIDO_INT32) _pArg; + HIDO_ATLiteCmdSend(pstATDevice, HIDO_TIMER_TICK_S(30), "AT^HEARTBEATHEX=%d,%u,%s\r\n", l_i32SocketID, + strlen(Socket_GetHeartbeatData(l_i32SocketID)) / 2, Socket_GetHeartbeatData(l_i32SocketID)); + break; + } + case HIDO_EVENT_EXIT: + { + HIDO_ATLiteCmdSendOver(pstATDevice); + break; + } + case HIDO_AT_EVENT_ERROR: + case HIDO_AT_EVENT_OK: + { + + HIDO_FSMStateChange(_pstFSM, HIDO_FSM_STATE(AIR780EIPPoll), HIDO_NULL); + break; + } + default: + { + return HIDO_EVENT_NO_PROC; + } + } + + return HIDO_EVENT_OK; +} + +/******************************************************************************* + * State Name : AIR780ESocketConnect + * Parent State : AIR780E + * Description : + * Author : 杜键 + * Modified Date: : 2018-05-01 + *******************************************************************************/ +HIDO_FSM_STATE_IMPLEMENT(AIR780ESocketConnect, HIDO_FSM_STATE(AIR780EIPReady), HIDO_NULL) +{ + static HIDO_INT32 l_i32SocketID = 0; + static HIDO_UINT32 l_u32FailedCnt = 0; + + HIDO_ATLiteDeviceStruct *pstATDevice = (HIDO_ATLiteDeviceStruct *) _pstFSM->m_pPrivateData; + HIDO_UINT32 u32FSMTimerID = ((ST_AIR780EDriverData *)pstATDevice->m_pUserData)->m_u32FSMTimerID; + + switch (_u32Event) + { + case HIDO_EVENT_ENTRY: + { + l_i32SocketID = (HIDO_INT32) _pArg; + HIDO_ATLiteCmdSend(pstATDevice, AT_GENERAL_TIMEOUT_TIME, "AT+CIPSTART=%d,\"%s\",\"%s\",%u\r\n", l_i32SocketID, + Socket_GetType(l_i32SocketID) == SOCKET_TYPE_TCP ? "TCP" : "UDP", + Socket_GetRemoteAddr(l_i32SocketID), Socket_GetRemotePort(l_i32SocketID)); + + HIDO_FSMStartTimer(u32FSMTimerID, HIDO_TIMER_TYPE_ONCE, HIDO_TIMER_TICK_S(180), _pstFSM, AIR780E_EVENT_DELAY); + break; + } + case HIDO_EVENT_EXIT: + { + HIDO_ATLiteCmdSendOver(pstATDevice); + HIDO_TimerCancel(u32FSMTimerID); + break; + } + case HIDO_AT_EVENT_OK: + { + break; + } + case HIDO_AT_EVENT_ERROR: + { + Socket_OnConnectFailed(l_i32SocketID); + + l_u32FailedCnt++; + if(l_u32FailedCnt >= 3) + { + l_u32FailedCnt = 0; + HIDO_FSMStateChange(_pstFSM, HIDO_FSM_STATE(AIR780E), HIDO_NULL); + } + else + { + HIDO_FSMStateChange(_pstFSM, HIDO_FSM_STATE(AIR780EIPPoll), HIDO_NULL); + } + break; + } + case AIR780E_EVENT_NUM_0: + case AIR780E_EVENT_NUM_1: + case AIR780E_EVENT_NUM_2: + case AIR780E_EVENT_NUM_3: + case AIR780E_EVENT_NUM_4: + case AIR780E_EVENT_NUM_5: + { + HIDO_DataStruct *pstData = (HIDO_DataStruct *) _pArg; + HIDO_UINT32 u32ConnectID = 0; + HIDO_DataStruct stEvent; + + if (HIDO_UtilParseFormat((HIDO_UINT8 *) pstData->m_pData, pstData->m_u32Len, "%d, %p\r\n", + &u32ConnectID, &stEvent) != 2) + { + break; + } + + if (l_i32SocketID == u32ConnectID) + { + if (strncmp(stEvent.m_pData, "ALREADY CONNECT", stEvent.m_u32Len) == 0 + || strncmp(stEvent.m_pData, "CONNECT OK", stEvent.m_u32Len) == 0) + { + l_u32FailedCnt = 0; + Socket_OnConnected(l_i32SocketID); + + if(Socket_UseHeartbeat(l_i32SocketID)) + { + HIDO_FSMStateChange(_pstFSM, HIDO_FSM_STATE(AIR780ESocketHeartConfig), HIDO_NULL); + + } + else + { + HIDO_FSMStateChange(_pstFSM, HIDO_FSM_STATE(AIR780EIPPoll), HIDO_NULL); + } + + break; + } + else if (strncmp(stEvent.m_pData, "CONNECT FAIL", stEvent.m_u32Len) == 0) + { + Socket_OnConnectFailed(l_i32SocketID); + + l_u32FailedCnt++; + if (l_u32FailedCnt >= 3) + { + l_u32FailedCnt = 3; + Socket_Destroy(l_i32SocketID); + HIDO_FSMStateChange(_pstFSM, HIDO_FSM_STATE(AIR780EIPPoll), HIDO_NULL); + } + else + { + HIDO_FSMStateChange(_pstFSM, HIDO_FSM_STATE(AIR780EIPPoll), HIDO_NULL); + } + } + } + + break; + } + case AIR780E_EVENT_DELAY: + { + HIDO_FSMStateChange(_pstFSM, HIDO_FSM_STATE(AIR780EIPPoll), HIDO_NULL); + break; + } + default: + { + return HIDO_EVENT_NO_PROC; + } + } + + return HIDO_EVENT_OK; +} + +/******************************************************************************* + * State Name : AIR780ESocketClose + * Parent State : AIR780E + * Description : + * Author : 杜键 + * Modified Date: : 2018-05-01 + *******************************************************************************/ +HIDO_FSM_STATE_IMPLEMENT(AIR780ESocketClose, HIDO_FSM_STATE(AIR780EIPReady), HIDO_NULL) +{ + HIDO_ATLiteDeviceStruct *pstATDevice = (HIDO_ATLiteDeviceStruct *) _pstFSM->m_pPrivateData; + static HIDO_INT32 l_i32SocketID = 0; + + switch (_u32Event) + { + case HIDO_EVENT_ENTRY: + { + l_i32SocketID = (HIDO_INT32) _pArg; + HIDO_ATLiteCmdSend(pstATDevice, HIDO_TIMER_TICK_S(30), "AT+CIPCLOSE=%d\r\n", l_i32SocketID); + break; + } + case HIDO_EVENT_EXIT: + { + HIDO_ATLiteCmdSendOver(pstATDevice); + break; + } + case HIDO_AT_EVENT_ERROR: + case HIDO_AT_EVENT_OK: + { + Socket_OnClosed(l_i32SocketID); + HIDO_FSMStateChange(_pstFSM, HIDO_FSM_STATE(AIR780EIPPoll), HIDO_NULL); + break; + } + case AIR780E_EVENT_NUM_0: + case AIR780E_EVENT_NUM_1: + case AIR780E_EVENT_NUM_2: + case AIR780E_EVENT_NUM_3: + case AIR780E_EVENT_NUM_4: + case AIR780E_EVENT_NUM_5: + { + HIDO_DataStruct *pstData = (HIDO_DataStruct *) _pArg; + HIDO_UINT32 u32ConnectID = 0; + HIDO_DataStruct stEvent; + + if (HIDO_UtilParseFormat((HIDO_UINT8 *) pstData->m_pData, pstData->m_u32Len, "%d, %p\r\n", + &u32ConnectID, &stEvent) != 2) + { + break; + } + + if (strncmp(stEvent.m_pData, "CLOSE OK", stEvent.m_u32Len) == 0) + { + Socket_OnClosed(l_i32SocketID); + HIDO_FSMStateChange(_pstFSM, HIDO_FSM_STATE(AIR780EIPPoll), HIDO_NULL); + break; + } + + break; + } + default: + { + return HIDO_EVENT_NO_PROC; + } + } + + return HIDO_EVENT_OK; +} + +/******************************************************************************* + * State Name : AIR780ESocketSendData + * Parent State : Ready + * Description : + * Author : 杜键 + * Modified Date: : 2018-05-01 + *******************************************************************************/ +HIDO_FSM_STATE_IMPLEMENT(AIR780ESocketSendData, HIDO_FSM_STATE(AIR780EIPReady), HIDO_NULL) +{ + static HIDO_INT32 l_i32SocketID = 0; + static HIDO_VLQMemberStruct *l_pstMember = HIDO_NULL; + + HIDO_ATLiteDeviceStruct *pstATDevice = (HIDO_ATLiteDeviceStruct *) _pstFSM->m_pPrivateData; + HIDO_VLQStruct *pstSendQueue = HIDO_NULL; + + switch (_u32Event) + { + case HIDO_EVENT_ENTRY: + { + l_i32SocketID = (HIDO_INT32) _pArg; + + pstSendQueue = Socket_GetSocketSendQueue(l_i32SocketID); + if(HIDO_NULL == pstSendQueue) + { + break; + } + + l_pstMember = HIDO_VLQGetDequeueMember(pstSendQueue); + if(HIDO_NULL == l_pstMember) + { + break; + } + + HIDO_ATLiteCmdSend(pstATDevice, AT_GENERAL_TIMEOUT_TIME, "AT+CIPSEND=%d,%u\r\n", l_i32SocketID, l_pstMember->m_u32DataLen); + break; + } + case HIDO_EVENT_EXIT: + { + l_pstMember = HIDO_NULL; + HIDO_ATLiteCmdSendOver(pstATDevice); + break; + } + case HIDO_AT_EVENT_OK: + { + //HIDO_Debug("OK\r\n"); + break; + } + case HIDO_AT_EVENT_ERROR: + { + Socket_OnClosed(l_i32SocketID); + HIDO_FSMStateChange(_pstFSM, HIDO_FSM_STATE(AIR780EIPPoll), HIDO_NULL); + break; + } + case AIR780E_EVENT_ACK: + { + if(HIDO_ATLiteGetDebugFlag() == HIDO_TRUE) + { + HIDO_DebugHex((HIDO_UINT8 *)l_pstMember->m_pDataAddr, l_pstMember->m_u32DataLen); + } + + HIDO_ATLiteDataSend(pstATDevice, 20000, (HIDO_UINT8 *)l_pstMember->m_pDataAddr, l_pstMember->m_u32DataLen); + break; + } + case AIR780E_EVENT_NUM_0: + case AIR780E_EVENT_NUM_1: + case AIR780E_EVENT_NUM_2: + case AIR780E_EVENT_NUM_3: + case AIR780E_EVENT_NUM_4: + case AIR780E_EVENT_NUM_5: + { + HIDO_DataStruct *pstData = (HIDO_DataStruct *) _pArg; + HIDO_UINT32 u32ConnectID = 0; + HIDO_DataStruct stEvent; + + if (HIDO_UtilParseFormat((HIDO_UINT8 *) pstData->m_pData, pstData->m_u32Len, "%d, %p\r\n", + &u32ConnectID, &stEvent) != 2) + { + break; + } + + if (l_i32SocketID == u32ConnectID) + { + if (strncmp(stEvent.m_pData, "SEND OK", stEvent.m_u32Len) == 0) + { + pstSendQueue = Socket_GetSocketSendQueue(l_i32SocketID); + if (NULL == pstSendQueue) + { + break; + } + + HIDO_VLQDequeue(pstSendQueue, l_pstMember); + HIDO_FSMStateChange(_pstFSM, HIDO_FSM_STATE(AIR780EIPPoll), NULL); + } + else if (strncmp(stEvent.m_pData, "SEND FAIL", stEvent.m_u32Len) == 0) + { + Socket_OnClosed(l_i32SocketID); + HIDO_FSMStateChange(_pstFSM, HIDO_FSM_STATE(AIR780EInit), NULL); + } + } + + break; + } + default: + { + return HIDO_EVENT_NO_PROC; + } + } + + return HIDO_EVENT_OK; +} + +HIDO_INT32 AIR780ESocket_Poll(HIDO_ATLiteDeviceStruct *_pstATDevice) +{ + static HIDO_INT32 i32LastSocketIndex = 0; + HIDO_INT32 i = 0; + HIDO_INT32 i32SocketIndex = 0; + HIDO_VLQStruct *pstSendQueue = HIDO_NULL; + HIDO_UINT32 u32CurTick = HIDO_TimerGetTick(); + + /* 先处理连接、断开、数据接收 */ + for(i32SocketIndex = 0; i32SocketIndex < SOCKET_NUM; i32SocketIndex++) + { + if(SOCKET_STATE_CONNECT == Socket_GetSocketState(i32SocketIndex)) + { + Socket_SetSocketState(i32SocketIndex, SOCKET_STATE_CLOSE_BEFORE_CONNECT); + HIDO_FSMStateChange(_pstATDevice->m_pstFSM, HIDO_FSM_STATE(AIR780ESocketClose), (HIDO_VOID *)(HIDO_UINT32)i32SocketIndex); + return HIDO_OK; + } + else if(SOCKET_STATE_CLOSE_BEFORE_CONNECT == Socket_GetSocketState(i32SocketIndex)) + { + HIDO_FSMStateChange(_pstATDevice->m_pstFSM, HIDO_FSM_STATE(AIR780ESocketConnect), (HIDO_VOID *)(HIDO_UINT32)i32SocketIndex); + return HIDO_OK; + } + else if (SOCKET_STATE_CLOSE == Socket_GetSocketState(i32SocketIndex)) + { + HIDO_FSMStateChange(_pstATDevice->m_pstFSM, HIDO_FSM_STATE(AIR780ESocketClose), + (HIDO_VOID *) (HIDO_UINT32) i32SocketIndex); + return HIDO_OK; + } + +#if 0 + /* 暂不使用发送确认检查,影响发送速率 */ + if (HIDO_TRUE == l_abSocketUnAck[i32SocketIndex]) + { + if ((u32CurTick - l_au32SocketUnAckTick[i32SocketIndex]) >= 10) + { + HIDO_FSMStateChange(_pstATDevice->m_pstFSM, HIDO_FSM_STATE(AIR780ESocketSendAck), (HIDO_VOID *)(HIDO_UINT32)i32SocketIndex); + return HIDO_OK; + } + else + { + return HIDO_ERR; + } + } +#endif + } + + /* 采用均衡的方式处理数据发送 */ + i32SocketIndex = (i32LastSocketIndex + 1) % SOCKET_NUM; + for(i = 0; i < SOCKET_NUM; i++) + { + if(SOCKET_STATE_CONNECTED == Socket_GetSocketState(i32SocketIndex)) + { + pstSendQueue = Socket_GetSocketSendQueue(i32SocketIndex); + if(pstSendQueue != HIDO_NULL) + { + if(HIDO_VLQGetDequeueMember(pstSendQueue) != HIDO_NULL) + { + i32LastSocketIndex = i32SocketIndex; + HIDO_FSMStateChange(_pstATDevice->m_pstFSM, HIDO_FSM_STATE(AIR780ESocketSendData), (HIDO_VOID *)(HIDO_UINT32)i32SocketIndex); + return HIDO_OK; + } + } + } + + i32SocketIndex = (i32SocketIndex + 1) % SOCKET_NUM; + } + + return HIDO_ERR; +} diff --git a/keil/include/components/internet/src/Internet.c b/keil/include/components/internet/src/Internet.c new file mode 100644 index 0000000..0f8b11b --- /dev/null +++ b/keil/include/components/internet/src/Internet.c @@ -0,0 +1,128 @@ +/******************************************************************************* + * File Name : Internet.c + * Description : + * Created on : 2018年5月26日 + * Author : 杜键 + *******************************************************************************/ + +/******************************************************************************* + * Include Files * + *******************************************************************************/ +#include "Internet.h" +#include "AIR780EDriver.h" +#include "AIR780EFSM.h" + +/******************************************************************************* + * Macro * + *******************************************************************************/ + +/******************************************************************************* + * Type Definition * + *******************************************************************************/ + +/******************************************************************************* + * Local Variable * + *******************************************************************************/ + +/******************************************************************************* + * Local Function Declaration * + *******************************************************************************/ + +/******************************************************************************* + * Local Function * + *******************************************************************************/ + +/******************************************************************************* + * Global Function * + *******************************************************************************/ + +/******************************************************************************* + * Function Name : Internet_Poll + * Description : + * Input : + * Output : + * Return : + * Author : 杜键 + * Modified Date: : 2018年5月26日 + *******************************************************************************/ +HIDO_INT32 Internet_Poll(void) +{ + HIDO_FSMEventExecute(HIDO_FSM(AIR780E), AIR780E_EVENT_POLL, HIDO_NULL); + + return HIDO_OK; +} + +/******************************************************************************* + * Function Name : Internet_Poll + * Description : + * Input : + * Output : + * Return : + * Author : 杜键 + * Modified Date: : 2018年5月26日 + *******************************************************************************/ +HIDO_INT32 Internet_DebugOn(void) +{ + AIR780EDriver_DebugOn(); + + return HIDO_OK; +} + +/******************************************************************************* + * Function Name : SIM8xxDriver_DebugOff + * Description : + * Input : + * Output : + * Return : + * Author : 杜键 + * Modified Date: : 2018年5月22日 + *******************************************************************************/ +HIDO_INT32 Internet_DebugOff(void) +{ + AIR780EDriver_DebugOff(); + + return HIDO_OK; +} + +/******************************************************************************* + * Function Name : Internet_Poll + * Description : + * Input : + * Output : + * Return : + * Author : 杜键 + * Modified Date: : 2018年5月26日 + *******************************************************************************/ +HIDO_BOOL Internet_IsIPReady(void) +{ + return AIR780E_IsIPReady(); +} + +/******************************************************************************* + * Function Name : Internet_Poll + * Description : + * Input : + * Output : + * Return : + * Author : 杜键 + * Modified Date: : 2018年5月26日 + *******************************************************************************/ +HIDO_INT32 Internet_Init(void) +{ + if (AIR780EDriver_Init() != HIDO_OK) + { + return HIDO_ERR; + } +#if 0 + if (TTS_Init() != HIDO_OK) + { + return HIDO_ERR; + } + + if (TONE_Init() != HIDO_OK) + { + return HIDO_ERR; + } +#endif + return HIDO_OK; +} diff --git a/keil/include/components/internet/src/Module.c b/keil/include/components/internet/src/Module.c new file mode 100644 index 0000000..c95a292 --- /dev/null +++ b/keil/include/components/internet/src/Module.c @@ -0,0 +1,556 @@ +/******************************************************************************* + * File Name : Module.c + * Description : + * Created on : 2018年8月5日 + * Author : www.hido-studio.com + *******************************************************************************/ + +/******************************************************************************* + * Include Files * + *******************************************************************************/ +#include "Module.h" +#include "string.h" +#include "HIDO_Util.h" + +/******************************************************************************* + * Macro * + *******************************************************************************/ +#define FUNC_CALL(fn, ...) \ +if((fn) != HIDO_NULL) \ + (fn)(__VA_ARGS__) + +/******************************************************************************* + * Type Definition * + *******************************************************************************/ + +/******************************************************************************* + * Local Variable * + *******************************************************************************/ +static HIDO_CHAR l_acIMEI[MODULE_IMEI_SIZE]; +static HIDO_CHAR l_acIMSI[MODULE_IMSI_SIZE]; +static HIDO_CHAR l_acCCID[MODULE_CCID_SIZE]; + +/* CSQ */ +static HIDO_UINT32 l_u32SignalIntensity = 0; +static HIDO_VOID *l_pSignalIntensityArg = HIDO_NULL; +static FN_SignalIntensityCallback l_fnSignalIntensityCallback = HIDO_NULL; +static HIDO_BOOL l_bSignalIntensityNeedRequest = HIDO_FALSE; + +/* LBS */ +static ST_LBSLocation l_stLBSLocation; +static HIDO_VOID *l_pLBSLocationArg = HIDO_NULL; +static FN_LBSLocationCallback l_fnLBSLocationCallback = HIDO_NULL; +static HIDO_BOOL l_bLBSLocationNeedRequest = HIDO_FALSE; + +/* Power */ +static FN_PowerEventCallback l_fnPowerEventCallback = HIDO_NULL; +static HIDO_VOID *l_pPowerEventArg = HIDO_NULL; +static HIDO_BOOL l_abModuleNeedSleep[MODULE_ALL] = { HIDO_FALSE }; +static HIDO_BOOL l_abModuleNeedWakeUp[MODULE_ALL] = { HIDO_FALSE }; + +static HIDO_BOOL l_abModuleNeedPowerOff[MODULE_ALL] = { HIDO_FALSE }; +static HIDO_BOOL l_abModuleNeedPowerOn[MODULE_ALL] = { HIDO_FALSE }; + +static HIDO_BOOL l_bRunATCmd = HIDO_FALSE; +static HIDO_CHAR l_acRunATCmdBuff[128]; + +/******************************************************************************* + * Local Function Declaration * + *******************************************************************************/ + +/******************************************************************************* + * Local Function * + *******************************************************************************/ + +/******************************************************************************* + * Global Function * + *******************************************************************************/ + +/******************************************************************************* + * Function Name : Module_SignalIntensityResult + * Description : 信号强度异步结果通知 + * Input : _u32SignalIntensity 信号强度 + * Output : None + * Return : None + * Author : www.hido-studio.com + * Modified Date: : 2018年8月5日 + *******************************************************************************/ +HIDO_INT32 Module_SignalIntensityResult(HIDO_UINT32 _u32SignalIntensity) +{ + if(l_fnSignalIntensityCallback != HIDO_NULL) + { + l_fnSignalIntensityCallback(_u32SignalIntensity, l_pSignalIntensityArg); + } + + l_u32SignalIntensity = _u32SignalIntensity; + + return HIDO_OK; +} + +/******************************************************************************* + * Function Name : Module_GetSignalIntensityAsync + * Description : 信号强度异步获取 + * Input : _fnGetSignalIntensity 异步通知回调 + * Output : None + * Return : None + * Author : www.hido-studio.com + * Modified Date: : 2018年8月5日 + *******************************************************************************/ +HIDO_INT32 Module_GetSignalIntensityAsync(FN_SignalIntensityCallback _fnGetSignalIntensity, HIDO_VOID *_pArg) +{ + l_fnSignalIntensityCallback = _fnGetSignalIntensity; + l_pSignalIntensityArg = _pArg; + l_bSignalIntensityNeedRequest = HIDO_TRUE; + + return HIDO_OK; +} + +/******************************************************************************* + * Function Name : Module_SignalIntensityNeedRequest + * Description : 是否需要异步获取信号强度 + * Input : None + * Output : None + * Return : None + * Author : www.hido-studio.com + * Modified Date: : 2018年8月5日 + *******************************************************************************/ +HIDO_BOOL Module_SignalIntensityNeedRequest(void) +{ + HIDO_BOOL bState = l_bSignalIntensityNeedRequest; + + l_bSignalIntensityNeedRequest = HIDO_FALSE; + + return bState; +} + +/******************************************************************************* + * Function Name : Module_LBSLocationResult + * Description : + * Input : _u32SignalIntensity 信号强度 + * Output : None + * Return : None + * Author : www.hido-studio.com + * Modified Date: : 2018年8月5日 + *******************************************************************************/ +HIDO_INT32 Module_LBSLocationResult(ST_LBSLocation *_pstLBSLocation) +{ + if(l_fnLBSLocationCallback != HIDO_NULL) + { + l_fnLBSLocationCallback(_pstLBSLocation, l_pLBSLocationArg); + } + + memcpy(&l_stLBSLocation, _pstLBSLocation, sizeof(ST_LBSLocation)); + + return HIDO_OK; +} + +/******************************************************************************* + * Function Name : Module_GetLBSLocationAsync + * Description : + * Input : _fnGetSignalIntensity 异步通知回调 + * Output : None + * Return : None + * Author : www.hido-studio.com + * Modified Date: : 2018年8月5日 + *******************************************************************************/ +HIDO_INT32 Module_GetLBSLocationAsync(FN_LBSLocationCallback _fnGetLBSLocation, HIDO_VOID *_pArg) +{ + l_fnLBSLocationCallback = _fnGetLBSLocation; + l_pLBSLocationArg = _pArg; + l_bLBSLocationNeedRequest = HIDO_TRUE; + + return HIDO_OK; +} + +/******************************************************************************* + * Function Name : Module_LBSLocationNeedRequest + * Description : + * Input : None + * Output : None + * Return : None + * Author : www.hido-studio.com + * Modified Date: : 2018年8月5日 + *******************************************************************************/ +HIDO_BOOL Module_LBSLocationNeedRequest(void) +{ + HIDO_BOOL bState = l_bLBSLocationNeedRequest; + + l_bLBSLocationNeedRequest = HIDO_FALSE; + + return bState; +} + +/******************************************************************************* + * Function Name : Module_GetIMEI + * Description : 获取IMEI接口 + * Input : None + * Output : _acIMEI IMEI + * Return : None + * Author : www.hido-studio.com + * Modified Date: : 2018年8月5日 + *******************************************************************************/ +HIDO_CHAR *Module_GetIMEI(HIDO_VOID) +{ + return l_acIMEI; +} + +/******************************************************************************* + * Function Name : Module_SetIMEI + * Description : 设置IMEI接口 + * Input : _pcIMEI IMEI + * _u32IMEILen 长度 + * Output : None + * Return : None + * Author : www.hido-studio.com + * Modified Date: : 2018年8月5日 + *******************************************************************************/ +HIDO_INT32 Module_SetIMEI(HIDO_CHAR *_pcIMEI, HIDO_UINT32 _u32IMEILen) +{ + if(_u32IMEILen < 2) + { + return HIDO_ERR; + } + + _u32IMEILen -= 2; + + if(_u32IMEILen < MODULE_IMEI_SIZE) + { + memcpy(l_acIMEI, _pcIMEI, _u32IMEILen); + l_acIMEI[_u32IMEILen] = '\0'; + } + + return HIDO_OK; +} + +/******************************************************************************* + * Function Name : Module_GetIMSI + * Description : 设置IMEI接口 + * Input : _pcIMSI IMSI + * _u32IMSILen 长度 + * Output : None + * Return : None + * Author : www.hido-studio.com + * Modified Date: : 2018年8月5日 + *******************************************************************************/ +HIDO_CHAR *Module_GetIMSI(HIDO_VOID) +{ + return l_acIMSI; +} + +/******************************************************************************* + * Function Name : Module_SetIMSI + * Description : 设置IMSI接口 + * Input : _pcIMSI IMSI + * _u32IMSILen 长度 + * Output : None + * Return : None + * Author : www.hido-studio.com + * Modified Date: : 2018年8月5日 + *******************************************************************************/ +HIDO_INT32 Module_SetIMSI(HIDO_CHAR *_pcIMSI, HIDO_UINT32 _u32IMSILen) +{ + if(_u32IMSILen < 2) + { + return HIDO_ERR; + } + + _u32IMSILen -= 2; + + if(_u32IMSILen < MODULE_IMSI_SIZE) + { + memcpy(l_acIMSI, _pcIMSI, _u32IMSILen); + l_acIMSI[_u32IMSILen] = '\0'; + } + + return HIDO_OK; +} + +/******************************************************************************* + * Function Name : Module_GetCCID + * Description : 获取SIM卡号 + * Input : None + * Output : None + * Return : SIM卡号 + * Author : www.hido-studio.com + * Modified Date: : 2018年8月5日 + *******************************************************************************/ +HIDO_CHAR *Module_GetCCID(HIDO_VOID) +{ + return l_acCCID; +} + +/******************************************************************************* + * Function Name : Module_SetCCID + * Description : 设置IMSI接口 + * Input : _pcIMSI IMSI + * _u32IMSILen 长度 + * Output : None + * Return : None + * Author : www.hido-studio.com + * Modified Date: : 2018年8月5日 + *******************************************************************************/ +HIDO_INT32 Module_SetCCID(HIDO_CHAR *_pcCCID, HIDO_UINT32 _u32CCIDLen) +{ + if(_u32CCIDLen < MODULE_CCID_SIZE) + { + memcpy(l_acCCID, _pcCCID, _u32CCIDLen-2); +// l_acCCID[_u32CCIDLen] = '\0'; + } + + return HIDO_OK; +} + +/******************************************************************************* + * Function Name : Module_Sleep + * Description : 睡眠接口 + * Input : + * Output : None + * Return : None + * Author : www.hido-studio.com + * Modified Date: : 2018年8月5日 + *******************************************************************************/ +HIDO_INT32 Module_SetPowerEventCallback(FN_PowerEventCallback _fnPowerCallback, HIDO_VOID *_pArg) +{ + l_fnPowerEventCallback = _fnPowerCallback; + l_pPowerEventArg = _pArg; + + return HIDO_OK; +} + +/******************************************************************************* + * Function Name : Module_Sleep + * Description : 睡眠接口 + * Input : + * Output : None + * Return : None + * Author : www.hido-studio.com + * Modified Date: : 2018年8月5日 + *******************************************************************************/ +HIDO_INT32 Module_Sleep(E_Module _eModule) +{ + l_abModuleNeedSleep[_eModule] = HIDO_TRUE; + l_abModuleNeedWakeUp[_eModule] = HIDO_FALSE; + + return HIDO_OK; +} + +/******************************************************************************* + * Function Name : Module_WakeUp + * Description : 唤醒接口 + * Input : + * Output : None + * Return : None + * Author : www.hido-studio.com + * Modified Date: : 2018年8月5日 + *******************************************************************************/ +HIDO_INT32 Module_WakeUp(E_Module _eModule) +{ + l_abModuleNeedWakeUp[_eModule] = HIDO_TRUE; + l_abModuleNeedSleep[_eModule] = HIDO_FALSE; + + return HIDO_OK; +} + +/******************************************************************************* + * Function Name : Module_PowerEvent + * Description : + * Input : + * Output : None + * Return : None + * Author : www.hido-studio.com + * Modified Date: : 2018年8月5日 + *******************************************************************************/ +HIDO_INT32 Module_PowerEvent(E_Module _eModule, E_ModuleState _eModuleState) +{ + FUNC_CALL(l_fnPowerEventCallback, _eModule, _eModuleState, l_pPowerEventArg); + + return HIDO_OK; +} + +/******************************************************************************* + * Function Name : Module_PowerOff + * Description : 关机接口 + * Input : + * Output : None + * Return : None + * Author : www.hido-studio.com + * Modified Date: : 2018年8月5日 + *******************************************************************************/ +HIDO_INT32 Module_PowerOff(E_Module _eModule) +{ + l_abModuleNeedPowerOff[_eModule] = HIDO_TRUE; + l_abModuleNeedPowerOn[_eModule] = HIDO_FALSE; + + return HIDO_OK; +} + +/******************************************************************************* + * Function Name : Module_PowerOn + * Description : 开机接口 + * Input : + * Output : None + * Return : None + * Author : www.hido-studio.com + * Modified Date: : 2018年8月5日 + *******************************************************************************/ +HIDO_INT32 Module_PowerOn(E_Module _eModule) +{ + l_abModuleNeedPowerOn[_eModule] = HIDO_TRUE; + l_abModuleNeedPowerOff[_eModule] = HIDO_FALSE; + + return HIDO_OK; +} + +/******************************************************************************* + * Function Name : Module_NeedSleep + * Description : 睡眠接口 + * Input : + * Output : None + * Return : None + * Author : www.hido-studio.com + * Modified Date: : 2018年8月5日 + *******************************************************************************/ +HIDO_BOOL Module_NeedSleep(E_Module _eModule) +{ + HIDO_BOOL bState = l_abModuleNeedSleep[_eModule]; + + l_abModuleNeedSleep[_eModule] = HIDO_FALSE; + + return bState; +} + +/******************************************************************************* + * Function Name : Module_WakeUp + * Description : 唤醒接口 + * Input : + * Output : None + * Return : None + * Author : www.hido-studio.com + * Modified Date: : 2018年8月5日 + *******************************************************************************/ +HIDO_BOOL Module_NeedWakeUp(E_Module _eModule) +{ + HIDO_BOOL bState = l_abModuleNeedWakeUp[_eModule]; + + l_abModuleNeedWakeUp[_eModule] = HIDO_FALSE; + + return bState; +} + +/******************************************************************************* + * Function Name : Module_PowerOff + * Description : 关机接口 + * Input : + * Output : None + * Return : None + * Author : www.hido-studio.com + * Modified Date: : 2018年8月5日 + *******************************************************************************/ +HIDO_BOOL Module_NeedPowerOff(E_Module _eModule) +{ + HIDO_BOOL bState = l_abModuleNeedPowerOff[_eModule]; + + l_abModuleNeedPowerOff[_eModule] = HIDO_FALSE; + + return bState; +} + +/******************************************************************************* + * Function Name : Module_PowerOn + * Description : 开机接口 + * Input : + * Output : None + * Return : None + * Author : www.hido-studio.com + * Modified Date: : 2018年8月5日 + *******************************************************************************/ +HIDO_BOOL Module_NeedPowerOn(E_Module _eModule) +{ + HIDO_BOOL bState = l_abModuleNeedPowerOn[_eModule]; + + l_abModuleNeedPowerOn[_eModule] = HIDO_FALSE; + + return bState; +} + +/******************************************************************************* + * Function Name : Module_GetSignalIntensity + * Description : 获取最后一次缓存的信号限度 + * Input : None + * Output : None + * Return : 信号强度 + * Author : www.hido-studio.com + * Modified Date: : 2018年8月5日 + *******************************************************************************/ +HIDO_UINT32 Module_GetSignalIntensity(void) +{ + return l_u32SignalIntensity; +} + +/******************************************************************************* + * Function Name : Module_RunATCmdResult + * Description : 用户AT命令运行结果 + * Input : None + * Output : None + * Return : None + * Author : www.hido-studio.com + * Modified Date: : 2018年8月5日 + *******************************************************************************/ +HIDO_INT32 Module_RunATCmdResult(HIDO_DataStruct * _pstATResponse) +{ + return HIDO_OK; +} + +/******************************************************************************* + * Function Name : Module_RunATCmdEnable + * Description : 判断是否需要用户的AT命令 + * Input : None + * Output : None + * Return : None + * Author : www.hido-studio.com + * Modified Date: : 2018年8月5日 + *******************************************************************************/ +HIDO_BOOL Module_RunATCmdEnable(HIDO_VOID) +{ + HIDO_BOOL bState = l_bRunATCmd; + + l_bRunATCmd = HIDO_FALSE; + + return bState; +} + +/******************************************************************************* + * Function Name : Module_GetRunATCmd + * Description : 获取用户运行的AT命令 + * Input : None + * Output : None + * Return : None + * Author : www.hido-studio.com + * Modified Date: : 2018年8月5日 + *******************************************************************************/ +HIDO_CHAR *Module_GetRunATCmd(HIDO_VOID) +{ + return l_acRunATCmdBuff; +} + +/******************************************************************************* + * Function Name : Module_RunATCmd + * Description : 用户运行AT命令 + * Input : None + * Output : None + * Return : None + * Author : www.hido-studio.com + * Modified Date: : 2018年8月5日 + *******************************************************************************/ +HIDO_INT32 Module_RunATCmd(HIDO_CHAR *_pcATCmd) +{ + if(HIDO_NULL == _pcATCmd) + { + return HIDO_ERR; + } + + l_bRunATCmd = HIDO_TRUE; + HIDO_UtilSnprintf(l_acRunATCmdBuff, sizeof(l_acRunATCmdBuff), _pcATCmd); + + return HIDO_OK; +} diff --git a/keil/include/components/internet/src/Socket.c b/keil/include/components/internet/src/Socket.c new file mode 100644 index 0000000..7c0ffc7 --- /dev/null +++ b/keil/include/components/internet/src/Socket.c @@ -0,0 +1,893 @@ +/******************************************************************************* + * File Name : Socket.c + * Description : + * Created on : 2018年5月17日 + * Author : www.hido-studio.com + *******************************************************************************/ + +/******************************************************************************* + * Include Files * + *******************************************************************************/ +#include "string.h" +#include "Socket.h" +#include "HIDO_Util.h" +#include "HIDO_Debug.h" +#include "HIDO_ArraryQueue.h" + +/******************************************************************************* + * Macro * + *******************************************************************************/ +/* SOICKET相关 */ +#define SOCKET_SEND_QUEUE_BUF_SIZE (512) +#define SOCKET_RECV_QUEUE_BUF_SIZE (512) +#define SOCKET_SEND_QUEUE_MEMBER_CNT 16 +#define SOCKET_RECV_QUEUE_MEMBER_CNT 16 + +/******************************************************************************* + * Type Definition * + *******************************************************************************/ + +typedef struct +{ + E_SocketState m_eState; + E_SocketType m_eType; + HIDO_BOOL m_bHasRecvData; + HIDO_INT32 m_i32ID; + FN_SocketEventProc m_fnEventProc; + HIDO_VOID *m_pArg; + + HIDO_CHAR m_acRemoteAddr[42]; + HIDO_UINT16 m_u16RemotePort; + + HIDO_VLQStruct m_stSendQueue; + HIDO_VLQStruct m_stRecvQueue; + HIDO_ArraryQueueStruct m_stRecvInfoQueue; + HIDO_ArraryQueueStruct m_stTCPRecvQueue; + + HIDO_UINT8 l_au8SendQueueBuf[SOCKET_SEND_QUEUE_BUF_SIZE]; + HIDO_UINT8 l_au8RecvQueueBuf[SOCKET_RECV_QUEUE_BUF_SIZE]; + + HIDO_BOOL m_bUseHeartbeat; + HIDO_UINT32 m_u32HeartbeatFreq; + HIDO_CHAR m_acHeartbeatData[128]; +}ST_SocketData; + +/******************************************************************************* + * Local Variable * + *******************************************************************************/ +static ST_SocketData l_astSocketData[SOCKET_NUM]; + +/******************************************************************************* + * Local Function Declaration * + *******************************************************************************/ + +/******************************************************************************* + * Local Function * + *******************************************************************************/ + +/******************************************************************************* + * Global Function * + *******************************************************************************/ +/******************************************************************************* + * Function Name : Socket_HaveRecvData + * Description : 通知Socket有数据需要接收 + * Input : _i32Sock Socket描述符 + * Output : None + * Return : HIDO_OK 成功, HIDO_ERR 失败 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月17日 + *******************************************************************************/ +HIDO_INT32 Socket_HaveRecvData(HIDO_INT32 _i32SockID) +{ + if(_i32SockID < SOCKET_NUM) + { + l_astSocketData[_i32SockID].m_bHasRecvData = HIDO_TRUE; + + return HIDO_OK; + } + + return HIDO_ERR; +} + +/******************************************************************************* + * Function Name : Socket_NoRecvData + * Description : 通知Socket没有数据需要接收 + * Input : _i32Sock Socket描述符 + * Output : None + * Return : HIDO_OK 成功, HIDO_ERR 失败 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月17日 + *******************************************************************************/ +HIDO_INT32 Socket_NoRecvData(HIDO_INT32 _i32SockID) +{ + if(_i32SockID < SOCKET_NUM) + { + l_astSocketData[_i32SockID].m_bHasRecvData = HIDO_FALSE; + + return HIDO_OK; + } + + return HIDO_ERR; +} + +/******************************************************************************* + * Function Name : Socket_HasRecvData + * Description : 获取Socket是否有数据需要接收 + * Input : _i32Sock Socket描述符 + * Output : None + * Return : HIDO_TRUE 有数据需要接收, HIDO_FALSE 没有数据需要接收 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月17日 + *******************************************************************************/ +HIDO_BOOL Socket_HasRecvData(HIDO_INT32 _i32SockID) +{ + if(_i32SockID < SOCKET_NUM) + { + return l_astSocketData[_i32SockID].m_bHasRecvData; + } + + return HIDO_FALSE; +} + +/******************************************************************************* + * Function Name : Socket_GetSocketRecvQueue + * Description : 获取Socket接收队列 + * Input : _i32Sock Socket描述符 + * Output : None + * Return : Socket接收队列 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月17日 + *******************************************************************************/ +HIDO_VLQStruct *Socket_GetSocketRecvQueue(HIDO_INT32 _i32SockID) +{ + if(_i32SockID < SOCKET_NUM) + { + return &l_astSocketData[_i32SockID].m_stRecvQueue; + } + + return HIDO_NULL; +} + +/******************************************************************************* + * Function Name : Socket_GetSocketSendQueue + * Description : 获取Socket发送队列 + * Input : _i32Sock Socket描述符 + * Output : None + * Return : Socket发送队列 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月17日 + *******************************************************************************/ +HIDO_VLQStruct *Socket_GetSocketSendQueue(HIDO_INT32 _i32SockID) +{ + if(_i32SockID < SOCKET_NUM) + { + return &l_astSocketData[_i32SockID].m_stSendQueue; + } + + return HIDO_NULL; +} + +/******************************************************************************* + * Function Name : Socket_GetType + * Description : 获取Socke类型 + * Input : _i32Sock Socket描述符 + * Output : None + * Return : Socke类型 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月17日 + *******************************************************************************/ +E_SocketType Socket_GetType(HIDO_INT32 _i32SockID) +{ + if(_i32SockID < SOCKET_NUM) + { + return l_astSocketData[_i32SockID].m_eType; + } + + return SOCKET_TYPE_NONE; +} + +/******************************************************************************* + * Function Name : Socket_GetSocketState + * Description : 获取Socke内部状态 + * Input : _i32Sock Socket描述符 + * Output : None + * Return : Socke内部状态 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月17日 + *******************************************************************************/ +E_SocketState Socket_GetSocketState(HIDO_INT32 _i32SockID) +{ + if(_i32SockID < SOCKET_NUM) + { + return l_astSocketData[_i32SockID].m_eState; + } + + return SOCKET_STATE_IDLE; +} + +/******************************************************************************* + * Function Name : Socket_SetSocketState + * Description : 设置Socke内部状态 + * Input : _i32Sock Socket描述符 + * : _eState Socke内部状态 + * Output : None + * Return : HIDO_OK 成功, HIDO_ERR 失败 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月17日 + *******************************************************************************/ +HIDO_INT32 Socket_SetSocketState(HIDO_INT32 _i32SockID, E_SocketState _eState) +{ + if(_i32SockID < SOCKET_NUM) + { + l_astSocketData[_i32SockID].m_eState = _eState; + + return HIDO_OK; + } + + return HIDO_ERR; +} + +/******************************************************************************* + * Function Name : Socket_GetRemoteAddr + * Description : 获取Socket远程地址 + * Input : _i32Sock Socket描述符 + * Output : None + * Return : 远程地址 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月17日 + *******************************************************************************/ +HIDO_CHAR *Socket_GetRemoteAddr(HIDO_INT32 _i32SockID) +{ + if(_i32SockID < SOCKET_NUM) + { + return l_astSocketData[_i32SockID].m_acRemoteAddr; + } + + return ""; +} + +/******************************************************************************* + * Function Name : Socket_GetRemotePort + * Description : 获取Socket远程端口 + * Input : _i32Sock Socket描述符 + * Output : None + * Return : 远程端口 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月17日 + *******************************************************************************/ +HIDO_UINT16 Socket_GetRemotePort(HIDO_INT32 _i32SockID) +{ + if(_i32SockID < SOCKET_NUM) + { + return l_astSocketData[_i32SockID].m_u16RemotePort; + } + + return 0; +} + +/******************************************************************************* + * Function Name : Socket_RecvAll + * Description : 全部Socket需要接收数据的通知 + * Input : None + * Output : None + * Return : HIDO_OK 成功, HIDO_ERR 失败 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月17日 + *******************************************************************************/ +HIDO_INT32 Socket_RecvAll(void) +{ + HIDO_INT32 i32SockID = 0; + ST_SocketData *pstSocketData = HIDO_NULL; + + for(i32SockID = 0; i32SockID < SOCKET_NUM; i32SockID++) + { + pstSocketData = &l_astSocketData[i32SockID]; + if(pstSocketData != HIDO_NULL && SOCKET_STATE_CONNECTED == pstSocketData->m_eState) + { + pstSocketData->m_bHasRecvData = HIDO_TRUE; + } + } + + return HIDO_OK; +} + +/******************************************************************************* + * Function Name : Socket_ClosedAll + * Description : 全部Socket被断开的通知 + * Input : None + * Output : None + * Return : HIDO_OK 成功, HIDO_ERR 失败 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月17日 + *******************************************************************************/ +HIDO_INT32 Socket_ClosedAll(void) +{ + HIDO_INT32 i32SockID = 0; + ST_SocketData *pstSocketData = HIDO_NULL; + + for(i32SockID = 0; i32SockID < SOCKET_NUM; i32SockID++) + { + pstSocketData = &l_astSocketData[i32SockID]; + + switch (pstSocketData->m_eState) + { + case SOCKET_STATE_CONNECT: + case SOCKET_STATE_CLOSE_BEFORE_CONNECT: + case SOCKET_STATE_CONNECTED: + { + pstSocketData->m_bHasRecvData = HIDO_FALSE; + pstSocketData->m_eState = SOCKET_STATE_CLOSED; + + if (pstSocketData->m_fnEventProc != HIDO_NULL) + { + pstSocketData->m_fnEventProc(i32SockID, SOCKET_EVENT_CLOSED, pstSocketData->m_pArg); + } + break; + } + default: + { + break; + } + } + } + + return HIDO_OK; +} + +/******************************************************************************* + * Function Name : Socket_OnConnectFailed + * Description : Socket连接失败时的内部通知 + * Input : _i32Sock Socket描述符 + * Output : None + * Return : HIDO_OK 成功, HIDO_ERR 失败 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月17日 + *******************************************************************************/ +HIDO_INT32 Socket_OnConnectFailed(HIDO_INT32 _i32SockID) +{ + ST_SocketData *pstSocketData = &l_astSocketData[_i32SockID]; + + if(_i32SockID < 0 || _i32SockID >= SOCKET_NUM || pstSocketData == HIDO_NULL) + { + return HIDO_ERR; + } + + pstSocketData->m_eState = SOCKET_STATE_CONNECT_FAILED; + if(pstSocketData->m_fnEventProc != HIDO_NULL) + { + pstSocketData->m_fnEventProc(_i32SockID, SOCKET_EVENT_CONNECT_FAILED, pstSocketData->m_pArg); + } + + return HIDO_OK; +} + +/******************************************************************************* + * Function Name : Socket_OnConnected + * Description : Socket连接成功时的内部通知 + * Input : _i32Sock Socket描述符 + * Output : None + * Return : HIDO_OK 成功, HIDO_ERR 失败 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月17日 + *******************************************************************************/ +HIDO_INT32 Socket_OnConnected(HIDO_INT32 _i32SockID) +{ + ST_SocketData *pstSocketData = &l_astSocketData[_i32SockID]; + + if(_i32SockID < 0 || _i32SockID >= SOCKET_NUM || pstSocketData == HIDO_NULL) + { + return HIDO_ERR; + } + + pstSocketData->m_eState = SOCKET_STATE_CONNECTED; + + /* 重置队列 */ +#if 0 + HIDO_VLQInit(&pstSocketData->m_stSendQueue, pstSocketData->l_au8SendQueueBuf, + SOCKET_SEND_QUEUE_BUF_SIZE, SOCKET_SEND_QUEUE_MEMBER_CNT); + if(SOCKET_TYPE_TCP == pstSocketData->m_eType) + { + HIDO_ArraryQueueInit(&pstSocketData->m_stTCPRecvQueue, pstSocketData->l_au8RecvQueueBuf, + SOCKET_RECV_QUEUE_BUF_SIZE, sizeof(HIDO_UINT8)); + } + else + { + HIDO_VLQInit(&pstSocketData->m_stRecvQueue, pstSocketData->l_au8RecvQueueBuf, + SOCKET_RECV_QUEUE_BUF_SIZE, SOCKET_RECV_QUEUE_MEMBER_CNT); + } +#endif + + /* 通知上层 */ + if(pstSocketData->m_fnEventProc != HIDO_NULL) + { + pstSocketData->m_fnEventProc(_i32SockID, SOCKET_EVENT_CONNECTED, pstSocketData->m_pArg); + } + + return HIDO_OK; +} + +/******************************************************************************* + * Function Name : Socket_OnClosed + * Description : Socket被关闭时的内部通知 + * Input : _i32Sock Socket描述符 + * Output : None + * Return : HIDO_OK 成功, HIDO_ERR 失败 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月17日 + *******************************************************************************/ +HIDO_INT32 Socket_OnClosed(HIDO_INT32 _i32SockID) +{ + ST_SocketData *pstSocketData = &l_astSocketData[_i32SockID]; + + if(_i32SockID < 0 || _i32SockID >= SOCKET_NUM || pstSocketData == HIDO_NULL) + { + return HIDO_ERR; + } + + if(SOCKET_STATE_CLOSE_BEFORE_CONNECT == pstSocketData->m_eState) + { + return HIDO_ERR; + } + + pstSocketData->m_eState = SOCKET_STATE_CLOSED; + if(pstSocketData->m_fnEventProc != HIDO_NULL) + { + pstSocketData->m_fnEventProc(_i32SockID, SOCKET_EVENT_CLOSED, pstSocketData->m_pArg); + } + + return HIDO_OK; +} + +/******************************************************************************* + * Function Name : Socket_RecvData + * Description : Socket收到数据时的内部处理 + * Input : _i32Sock Socket描述符 + * : _pu8Data 收到的数据 + * : _u32Len 收到的数据长度 + * Output : None + * Return : HIDO_OK 成功, HIDO_ERR 失败 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月17日 + *******************************************************************************/ +HIDO_INT32 Socket_RecvData(HIDO_INT32 _i32SockID, HIDO_UINT8 *_pu8Data, HIDO_UINT32 _u32Len) +{ + ST_SocketData *pstSocketData = &l_astSocketData[_i32SockID]; + HIDO_UINT32 i = 0; + + if(_i32SockID < 0 || _i32SockID >= SOCKET_NUM || pstSocketData == HIDO_NULL) + { + return HIDO_ERR; + } + + if(SOCKET_TYPE_TCP == pstSocketData->m_eType) + { + for(i = 0; i < _u32Len; i++) + { + if(HIDO_ArraryQueueIn(&(pstSocketData->m_stTCPRecvQueue), &_pu8Data[i]) != HIDO_OK) + { + return HIDO_ERR; + } + } + } + else + { + HIDO_VLQMemberStruct *pstMember = HIDO_NULL; + + pstMember = HIDO_VLQGetEnqueueMember(&l_astSocketData[_i32SockID].m_stRecvQueue, _u32Len); + if (pstMember != HIDO_NULL) + { + memcpy(pstMember->m_pDataAddr, _pu8Data, _u32Len); + + HIDO_VLQEnqueue(&l_astSocketData[_i32SockID].m_stRecvQueue, pstMember); + } + else + { + HIDO_Debug("Socket[%u] Recv Buffer Full\r\n", _i32SockID); + } + } + + return HIDO_OK; +} + +/******************************************************************************* + * Function Name : Socket_OnRecv + * Description : Socket收到数据时的内部通知 + * Input : _i32Sock Socket描述符 + * Output : None + * Return : HIDO_OK 成功, HIDO_ERR 失败 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月17日 + *******************************************************************************/ +HIDO_INT32 Socket_OnRecv(HIDO_INT32 _i32SockID) +{ + ST_SocketData *pstSocketData = &l_astSocketData[_i32SockID]; + + if(_i32SockID < 0 || _i32SockID >= SOCKET_NUM || pstSocketData == HIDO_NULL) + { + return HIDO_ERR; + } + + if(pstSocketData->m_fnEventProc != HIDO_NULL) + { + pstSocketData->m_fnEventProc(_i32SockID, SOCKET_EVENT_RECV_DATA, pstSocketData->m_pArg); + } + + return HIDO_OK; +} + +/******************************************************************************* + * Function Name : Socket_Create + * Description : Socket创建 + * Input : _eSocketType Socket类型 + * : _fnEventProc Socket事件处理函数 + * : _pArg 参数 + * Output : _pi32SockID Socket描述符 + * Return : HIDO_OK 成功, HIDO_ERR 失败 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月17日 + *******************************************************************************/ +HIDO_INT32 Socket_Create(HIDO_INT32 *_pi32SockID, E_SocketType _eSocketType, FN_SocketEventProc _fnEventProc, HIDO_VOID *_pArg) +{ + HIDO_INT32 i32SockID = 0; + ST_SocketData *pstSocketData = HIDO_NULL; + + for(i32SockID = 0; i32SockID < SOCKET_NUM; i32SockID++) + { + pstSocketData = &l_astSocketData[i32SockID]; + if(pstSocketData != HIDO_NULL && (SOCKET_STATE_IDLE == pstSocketData->m_eState)) + { + HIDO_UtilBzero(pstSocketData, sizeof(ST_SocketData)); + + pstSocketData->m_i32ID = i32SockID; + pstSocketData->m_eType = _eSocketType; + pstSocketData->m_eState = SOCKET_STATE_CREATED; + pstSocketData->m_fnEventProc = _fnEventProc; + pstSocketData->m_pArg = _pArg; + + HIDO_VLQInit(&pstSocketData->m_stSendQueue, pstSocketData->l_au8SendQueueBuf, + SOCKET_SEND_QUEUE_BUF_SIZE, SOCKET_SEND_QUEUE_MEMBER_CNT); + + if(SOCKET_TYPE_TCP == _eSocketType) + { + HIDO_ArraryQueueInit(&pstSocketData->m_stTCPRecvQueue, pstSocketData->l_au8RecvQueueBuf, + SOCKET_RECV_QUEUE_BUF_SIZE, sizeof(HIDO_UINT8)); + } + else + { + HIDO_VLQInit(&pstSocketData->m_stRecvQueue, pstSocketData->l_au8RecvQueueBuf, + SOCKET_RECV_QUEUE_BUF_SIZE, SOCKET_RECV_QUEUE_MEMBER_CNT); + } + + *_pi32SockID = i32SockID; + + return HIDO_OK; + } + } + + return HIDO_ERR; +} + +/******************************************************************************* + * Function Name : Socket_Connect + * Description : Socket连接 + * Input : _i32Sock Socket描述符 + * : _pcRemoteAddr 目标地址 + * : _u16RemotePort 目标端口 + * Output : None + * Return : HIDO_OK 成功, HIDO_ERR 失败 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月17日 + *******************************************************************************/ +HIDO_INT32 Socket_Connect(HIDO_INT32 _i32SockID, HIDO_CHAR *_pcRemoteAddr, HIDO_UINT16 _u16RemotePort) +{ + ST_SocketData *pstSocketData = &l_astSocketData[_i32SockID]; + + if(_i32SockID < 0 || _i32SockID >= SOCKET_NUM || pstSocketData == HIDO_NULL) + { + return HIDO_ERR; + } + + HIDO_UtilSnprintf(pstSocketData->m_acRemoteAddr, sizeof(pstSocketData->m_acRemoteAddr), "%s", _pcRemoteAddr); + pstSocketData->m_u16RemotePort = _u16RemotePort; + pstSocketData->m_eState = SOCKET_STATE_CONNECT; + + return HIDO_OK; +} + +/******************************************************************************* + * Function Name : Socket_Close + * Description : 关闭一个Socket + * Input : _i32Sock Socket描述符 + * Output : None + * Return : HIDO_OK 成功, HIDO_ERR 失败 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月17日 + *******************************************************************************/ +HIDO_INT32 Socket_Close(HIDO_INT32 _i32SockID) +{ + ST_SocketData *pstSocketData = &l_astSocketData[_i32SockID]; + + if(_i32SockID < 0 || _i32SockID >= SOCKET_NUM || pstSocketData == HIDO_NULL) + { + return HIDO_ERR; + } + + if(pstSocketData->m_eState != SOCKET_STATE_IDLE && pstSocketData->m_eState != SOCKET_STATE_CLOSED) + { + pstSocketData->m_eState = SOCKET_STATE_CLOSE; + } + + return HIDO_OK; +} + +/******************************************************************************* + * Function Name : Socket_Destroy + * Description : 销毁一个Socket + * Input : _i32Sock Socket描述符 + * Output : None + * Return : HIDO_OK 成功, HIDO_ERR 失败 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月17日 + *******************************************************************************/ +HIDO_INT32 Socket_Destroy(HIDO_INT32 _i32SockID) +{ + ST_SocketData *pstSocketData = &l_astSocketData[_i32SockID]; + + if(_i32SockID < 0 || _i32SockID >= SOCKET_NUM || pstSocketData == HIDO_NULL) + { + return HIDO_ERR; + } + + pstSocketData->m_eState = SOCKET_STATE_IDLE; + + return HIDO_OK; +} + +/******************************************************************************* + * Function Name : Socket_IsSendQueueEmpty + * Description : 判断发送队列是否为空 + * Input : _i32Sock Socket描述符 + * Output : None + * Return : HIDO_TRUE 发送队列为空, HIDO_FALSE 发送队列不为空 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月17日 + *******************************************************************************/ +HIDO_BOOL Socket_IsSendQueueEmpty(HIDO_INT32 _i32SockID) +{ + HIDO_VLQMemberStruct *pstMember = HIDO_NULL; + ST_SocketData *pstSocketData = &l_astSocketData[_i32SockID]; + + if(_i32SockID < 0 || _i32SockID >= SOCKET_NUM || pstSocketData == HIDO_NULL) + { + return HIDO_FALSE; + } + + pstMember = HIDO_VLQGetDequeueMember(&pstSocketData->m_stSendQueue); + if(HIDO_NULL == pstMember) + { + return HIDO_TRUE; + } + + return HIDO_FALSE; +} + +/******************************************************************************* + * Function Name : Socket_Send + * Description : Socket发送数据 + * Input : _i32Sock Socket描述符 + * : _pu8Data 发送的数据 + * : _u32DataLen 发送的数据长度 + * Output : None + * Return : HIDO_OK 成功, HIDO_ERR 失败 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月17日 + *******************************************************************************/ +HIDO_INT32 Socket_Send(HIDO_INT32 _i32SockID, HIDO_UINT8 *_pu8Data, HIDO_UINT32 _u32DataLen) +{ + HIDO_VLQMemberStruct *pstMember = HIDO_NULL; + ST_SocketData *pstSocketData = &l_astSocketData[_i32SockID]; + + if(_i32SockID < 0 || _i32SockID >= SOCKET_NUM || pstSocketData == HIDO_NULL || _u32DataLen == 0) + { + return HIDO_ERR; + } + + pstMember = HIDO_VLQGetEnqueueMember(&pstSocketData->m_stSendQueue, _u32DataLen); /* 获取入队空间 */ + if(HIDO_NULL == pstMember) + { + HIDO_Debug("socket[%d] send buf full\r\n", _i32SockID); + + return HIDO_ERR; + } + + memcpy(pstMember->m_pDataAddr, _pu8Data, _u32DataLen); + HIDO_VLQEnqueue(&pstSocketData->m_stSendQueue, pstMember); /* 入队 */ + + return HIDO_OK; +} + +/******************************************************************************* + * Function Name : Socket_IsClosed + * Description : 检查Socket是否已断开 + * Input : _i32Sock Socket描述符 + * Output : _pbResult 断开状态 HIDO_TRUE 已断开 HIDO_FALSE 未断开 + * Return : HIDO_OK 成功, HIDO_ERR 失败 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月17日 + *******************************************************************************/ +HIDO_INT32 Socket_IsClosed(HIDO_INT32 _i32SockID, HIDO_BOOL *_pbResult) +{ + ST_SocketData *pstSocketData = &l_astSocketData[_i32SockID]; + + if(_i32SockID < 0 || _i32SockID >= SOCKET_NUM || HIDO_NULL == _pbResult) + { + return HIDO_ERR; + } + + if(SOCKET_STATE_CLOSED == pstSocketData->m_eState || SOCKET_STATE_IDLE == pstSocketData->m_eState + || SOCKET_STATE_CONNECT_FAILED == pstSocketData->m_eState || SOCKET_STATE_CREATED == pstSocketData->m_eState) + { + *_pbResult = HIDO_TRUE; + } + else + { + *_pbResult = HIDO_FALSE; + } + + return HIDO_OK; +} + +/******************************************************************************* + * Function Name : Socket_IsConnected + * Description : 检查Socket是否已连接 + * Input : _i32Sock Socket描述符 + * Output : _pbResult 连接状态 HIDO_TRUE 已连接 HIDO_FALSE 未连接 + * Return : HIDO_OK 成功, HIDO_ERR 失败 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月17日 + *******************************************************************************/ +HIDO_INT32 Socket_IsConnected(HIDO_INT32 _i32SockID, HIDO_BOOL *_pbResult) +{ + ST_SocketData *pstSocketData = &l_astSocketData[_i32SockID]; + + if(_i32SockID < 0 || _i32SockID >= SOCKET_NUM || HIDO_NULL == _pbResult) + { + return HIDO_ERR; + } + + if(SOCKET_STATE_CONNECTED == pstSocketData->m_eState) + { + *_pbResult = HIDO_TRUE; + } + else + { + *_pbResult = HIDO_FALSE; + } + + return HIDO_OK; +} + +/******************************************************************************* + * Function Name : Socket_UseHeartbeat + *******************************************************************************/ +HIDO_BOOL Socket_UseHeartbeat(HIDO_INT32 _i32SockID) +{ + ST_SocketData *pstSocketData = &l_astSocketData[_i32SockID]; + + if(_i32SockID < 0 || _i32SockID >= SOCKET_NUM) + { + return HIDO_FALSE; + } + + return pstSocketData->m_bUseHeartbeat; +} + +/******************************************************************************* + * Function Name : Socket_SetHeartbeatData + *******************************************************************************/ +HIDO_INT32 Socket_HeartbeatConfig(HIDO_INT32 _i32SockID, HIDO_UINT8 *_pu8Data, HIDO_UINT32 _u32Len, HIDO_UINT32 _u32HeartbeatFreq) +{ + ST_SocketData *pstSocketData = &l_astSocketData[_i32SockID]; + + if(_i32SockID < 0 || _i32SockID >= SOCKET_NUM) + { + return HIDO_ERR; + } + + pstSocketData->m_bUseHeartbeat = HIDO_TRUE; + pstSocketData->m_u32HeartbeatFreq = _u32HeartbeatFreq; + HIDO_UtilByteArrayToHexString(_pu8Data, _u32Len, pstSocketData->m_acHeartbeatData, sizeof(pstSocketData->m_acHeartbeatData), HIDO_FALSE); + + return HIDO_OK; +} + +/******************************************************************************* + * Function Name : Socket_GetHeartbeatFreq + *******************************************************************************/ +HIDO_UINT32 Socket_GetHeartbeatFreq(HIDO_INT32 _i32SockID) +{ + ST_SocketData *pstSocketData = &l_astSocketData[_i32SockID]; + + if(_i32SockID < 0 || _i32SockID >= SOCKET_NUM) + { + return 300; + } + + return pstSocketData->m_u32HeartbeatFreq; +} + +/******************************************************************************* + * Function Name : Socket_GetHeartbeatFreq + *******************************************************************************/ +HIDO_CHAR *Socket_GetHeartbeatData(HIDO_INT32 _i32SockID) +{ + ST_SocketData *pstSocketData = &l_astSocketData[_i32SockID]; + + if(_i32SockID < 0 || _i32SockID >= SOCKET_NUM) + { + return 300; + } + + return pstSocketData->m_acHeartbeatData; +} + +/******************************************************************************* + * Function Name : Socket_Recv + * Description : 从Socket接收队列中读取数据 + * Input : _i32Sock Socket描述符 + * : _u32RecvBuffSize 读取数据的缓存地址 + * Output : _pu8RecvBuff 读取数据的缓存 + * : _pu32RecvLen 数据长度 + * Return : HIDO_OK 成功, HIDO_ERR 失败 + * Author : www.hido-studio.com + * Modified Date: : 2018年5月17日 + *******************************************************************************/ +HIDO_INT32 Socket_Recv(HIDO_INT32 _i32SockID, HIDO_UINT8 *_pu8RecvBuff, HIDO_UINT32 _u32RecvBuffSize, HIDO_UINT32 *_pu32RecvLen) +{ + HIDO_INT32 i32Result = HIDO_ERR; + HIDO_VLQMemberStruct *pstMember = HIDO_NULL; + ST_SocketData *pstSocketData = &l_astSocketData[_i32SockID]; + + if(_i32SockID < 0 || _i32SockID >= SOCKET_NUM || pstSocketData == HIDO_NULL || _pu32RecvLen == HIDO_NULL) + { + return HIDO_ERR; + } + + if(SOCKET_TYPE_TCP == pstSocketData->m_eType) + { + HIDO_UINT32 i = 0; + HIDO_UINT32 u32RecvLen = 0; + + for(i = 0; i < _u32RecvBuffSize; i++) + { + if(HIDO_ArraryQueueOut(&pstSocketData->m_stTCPRecvQueue, &_pu8RecvBuff[i]) != HIDO_OK) + { + *_pu32RecvLen = u32RecvLen; + return HIDO_OK; + } + + u32RecvLen++; + } + + *_pu32RecvLen = u32RecvLen; + i32Result = HIDO_OK; + } + else + { + pstMember = HIDO_VLQGetDequeueMember(&pstSocketData->m_stRecvQueue); + if(pstMember != HIDO_NULL) + { + if(_u32RecvBuffSize > pstMember->m_u32DataLen) + { + memcpy(_pu8RecvBuff, pstMember->m_pDataAddr, pstMember->m_u32DataLen); + *_pu32RecvLen = pstMember->m_u32DataLen; + i32Result = HIDO_OK; + } + + HIDO_VLQDequeue(&pstSocketData->m_stRecvQueue, pstMember); + } + } + + return i32Result; +} + diff --git a/keil/include/components/libc/libc.c b/keil/include/components/libc/libc.c index 5e965be..0f3913f 100644 --- a/keil/include/components/libc/libc.c +++ b/keil/include/components/libc/libc.c @@ -199,37 +199,37 @@ return libc_rom->strlcat(dst, src, len); } -int sprintf(char *s, const char *format, ...) -{ - va_list ap; - int len; +//int sprintf(char *s, const char *format, ...) +//{ +// va_list ap; +// int len; - va_start(ap, format); - len = libc_rom->vsnprintf(s, -(size_t)s, format, ap); - va_end(ap); - return (len); -} +// va_start(ap, format); +// len = libc_rom->vsnprintf(s, -(size_t)s, format, ap); +// va_end(ap); +// return (len); +//} -int snprintf(char *s, size_t n, const char *format, ...) -{ - va_list ap; - int len; +//int snprintf(char *s, size_t n, const char *format, ...) +//{ +// va_list ap; +// int len; - va_start(ap, format); - len = libc_rom->vsnprintf(s, n, format, ap); - va_end(ap); - return (len); -} +// va_start(ap, format); +// len = libc_rom->vsnprintf(s, n, format, ap); +// va_end(ap); +// return (len); +//} -int vsprintf(char *s, const char *format, va_list arg) -{ - return libc_rom->vsprintf(s, format, arg); -} +//int vsprintf(char *s, const char *format, va_list arg) +//{ +// return libc_rom->vsprintf(s, format, arg); +//} -int vsnprintf(char *s, size_t n, const char *format, va_list arg) -{ - return libc_rom->vsnprintf(s, n, format, arg); -} +//int vsnprintf(char *s, size_t n, const char *format, va_list arg) +//{ +// return libc_rom->vsnprintf(s, n, format, arg); +//} int sscanf(const char *s, const char *format, ...) { diff --git a/keil/include/drivers/PCA9555.c b/keil/include/drivers/PCA9555.c new file mode 100644 index 0000000..a9ac050 --- /dev/null +++ b/keil/include/drivers/PCA9555.c @@ -0,0 +1,542 @@ +#include "PCA9555.h" +uint8_t gps_led_output_state,tts_enbale_output_state,wake_up_output_state,air780e_enable_output_state,sos_enable_output_state,gps_backup_output_state,gps_power_output_state,main_ri_output_state;//1组output IO口从左到右1.0~1.7 +uint8_t mcu_a_output_state,chg_g_output_state,lora_irq_output_state,lora_nrst_output_state,adc_minius_output_state,input_5v_output_state,pwr_on_output_state,pwr_enable_output_state;//2组output IO口从左到右0.0~0.7 +uint8_t pca9555writedata_config[10];//暂存寄存器所有配置的数组 +uint8_t pca9555writedata_output[10];//暂存输出高低电平配置的数组 +uint8_t pca9555writedata_input[10];//暂存输入寄存器所有配置的数组 +uint8_t pca9555writedata_polarity[10];//暂存输入极性反转寄存器所有配置的数组 +void IIC_gpio_pca_init(void) +{ + io_pin_mux_set(SDA_PIN, IO_FUNC0); + io_pin_mux_set(SCL_PIN, IO_FUNC0); + + gpio_pin_set_dir(SDA_PIN , GPIO_DIR_OUT, 1); + //io_open_drain_set(SDA_PIN, 1); + io_pull_set(SDA_PIN , IO_PULL_UP, IO_PULL_UP_LEVEL2);//输出高阻态 + + gpio_pin_set_dir(SCL_PIN , GPIO_DIR_OUT, 1); + //io_open_drain_set(SCL_PIN, 1); + io_pull_set(SCL_PIN , IO_HIGH_Z, IO_PULL_UP_NONE); +} + +void IIC2_pca_Start(void) +{ +//// IIC2_SDA_OUT(); //sda线输出 +// SDA_1; +// delay_us(10); +// SCL_1; +// delay_us(10); +// SDA_0;//START:when CLK is high,DATA change form high to low +// delay_us(10); + + // IIC2_SDA_OUT(); //sda线输出 + SDA_1; +// delay_us(10); + SCL_1; +// delay_us(10); + SDA_0;//START:when CLK is high,DATA change form high to low + delay_us(10); + SCL_0;//钳住I2C总线,准备发送或接收数据 +} +void IIC_pca_Ready(void) +{ + + SCL_1; + delay_us(10); + SDA_1; + delay_us(10); +} +//产生IIC停止信号 +void IIC2_pca_Stop(void) +{ + +// SDA_0;//STOP:when CLK is high DATA change form low to high +// +// delay_us(10); +// SCL_1; +// delay_us(10); +// SDA_1;//发送I2C总线结束信号 +// delay_us(10); + + SCL_0; + SDA_0;//sToP:when ClK is high DATA change form low to high + delay_us(10); + SCL_1; + //delay_us(10); + SDA_1;//7发送I2C总线结束信号 + delay_us(10); +} +//等待应答信号到来 +//返回值:1,接收应答失败 +// 0,接收应答成功 +uint8_t IIC2_Wait_pca_Ack(void) +{ + uint8_t ucErrTime=0; +// IIC2_SDA_IN(); + + gpio_pin_set_dir(SDA_PIN,GPIO_DIR_IN,1); //SDA设置为输入等待接收端的应答信号 + SDA_1; + delay_us(6); + SCL_1; + delay_us(6); +// SDA_1; +// delay_us(6); + + + while(IIC2_READ_SDA) + { + ucErrTime++; + if(ucErrTime>250) + { + IIC2_pca_Stop(); + gpio_pin_set_dir(SDA_PIN , GPIO_DIR_OUT, 1); + return 1; + } + } + gpio_pin_set_dir(SDA_PIN , GPIO_DIR_OUT, 0); + SCL_0;//时钟输出0 + return 0; + +} +//产生ACK应答 +void IIC2_pca_send_Ack(void) +{ + SCL_0; + SDA_0;//读取SDA电平为低则有应答 + delay_us(10); + SCL_1; + delay_us(10); + SCL_0; +} +//不产生ACK应答 +void IIC2_pca_send_NAck(void) +{ + SCL_0; + SDA_1;//读取SDA电平为高则无应答信号 + delay_us(10); + SCL_1; + delay_us(10); + SCL_0; +} +//IIC发送一个字节,WRITE +//返回从机有无应答 +//1,有应答 +//0,无应答 +uint8_t statistic_num; +void IIC2_Send_pca_Byte(uint8_t txd) +{ + uint8_t t; +// IIC2_SDA_OUT(); + SCL_0;//拉低时钟开始数据传输 +// delay_us(10); + for(t=0; t<8; t++) + { + if((txd&0x80)>>7) + { + SDA_1; + } + else + { + SDA_0; + } + txd <<= 1; + delay_us(10); + SCL_1; + delay_us(10); + SCL_0; + delay_us(10); + } +// statistic_num=txd; +// SDA_1;//新增sda拉高 +// delay_us(10); +} + +//读1个字节,ack=1时,发送ACK,ack=0,发送nACK,不是一样的 +uint8_t IIC2_Read_pca_Byte(unsigned char ack) +{ + unsigned char i,receive=0,bit=0; + gpio_pin_set_dir(SDA_PIN,GPIO_DIR_IN,0); //设置为输入读取电平 +// io_pull_set(SDA_PIN , IO_HIGH_Z, IO_PULL_UP_NONE); + for(i=0; i<8; i++ ) + { + SCL_0; + delay_us(6);//修改时间 + SCL_1; + //receive<<=1; + if(IIC2_READ_SDA){ + bit=1<<i; + receive|=bit; + } + delay_us(5); + } + SCL_0; + if(ack==2){ + gpio_pin_set_dir(SDA_PIN,GPIO_DIR_OUT,0); //设置为输出恢复ACK + }else{ + gpio_pin_set_dir(SDA_PIN,GPIO_DIR_OUT,1); //设置为输出恢复ACK + } + +// io_pull_set(SDA_PIN , IO_PULL_UP, IO_PULL_UP_LEVEL2);//输出高阻态 +// if (!ack) +// IIC2_pca_send_NAck();//发送nACK +// else +// IIC2_pca_send_Ack(); //发送ACK + return receive; +} + + +/********************************************************* +//写pca9555第二层驱动,可辅助逻辑不破坏最底层驱动 + addr 芯片地址,0x40表示第一个芯片地址 + low_byte 写入芯片的前八位数据 + high_byte 写入芯片的前后位数据 +*********************************************************/ +//写pca9555第一层,最底层驱动 +int temp_ack3,temp_ack4,temp_ack5,temp_ack6; +void IIC_Write_Pca9555(unsigned char addr,unsigned char reg_addr,unsigned char low_byte,unsigned char high_byte) +{ + IIC2_pca_Start(); + IIC2_Send_pca_Byte(addr & 0xfe); + temp_ack3=IIC2_Wait_pca_Ack(); + IIC2_Send_pca_Byte(reg_addr); + temp_ack4=IIC2_Wait_pca_Ack(); + IIC2_Send_pca_Byte(low_byte); + temp_ack5=IIC2_Wait_pca_Ack(); + IIC2_Send_pca_Byte(high_byte); + temp_ack6=IIC2_Wait_pca_Ack(); + IIC2_pca_Stop(); + +// IIC2_Start(); +// IIC2_Send_Byte(addr & 0xfe); //发送写命令 +// temp_ack3=IIC2_Wait_pca_Ack(); +// IIC2_Send_Byte(reg_addr); //发送地址 +// temp_ack4=IIC2_Wait_pca_Ack(); +// IIC2_Send_Byte(low_byte); //发送字节 +// temp_ack5=IIC2_Wait_pca_Ack(); +// IIC2_Send_Byte(high_byte); //发送字节 +// temp_ack6=IIC2_Wait_pca_Ack(); +// IIC2_Stop();//产生一个停止条件 + +} +/* + // IIC2_Start(); +// IIC2_Send_Byte(addr & 0xfe); //发送写命令 +// temp_ack3=IIC2_Wait_Ack(); +// IIC2_Send_Byte(reg_addr); //发送地址 +// temp_ack4=IIC2_Wait_Ack(); +// IIC2_Send_Byte(low_byte); //发送字节 +// temp_ack5=IIC2_Wait_Ack(); +// IIC2_Send_Byte(high_byte); //发送字节 +// temp_ack6=IIC2_Wait_Ack(); +// IIC2_Stop();//产生一个停止条件 +*/ +int temp_ack,temp_ack1,temp_ack2; + uint8_t temp=0; +void IIC_Read_Pca9555(uint8_t addr,uint8_t reg_addr,uint8_t* pBuffer,uint16_t num) +{ + IIC2_pca_Start(); + IIC2_Send_pca_Byte(addr & 0xfe); + temp_ack=IIC2_Wait_pca_Ack(); + IIC2_Send_pca_Byte(reg_addr); + temp_ack1=IIC2_Wait_pca_Ack(); + + IIC2_pca_Start(); + IIC2_Send_pca_Byte(addr | 0x01); + temp_ack2=IIC2_Wait_pca_Ack(); + +// if(num==2){ +// pBuffer[0]=IIC2_Read_Byte(1); +// pBuffer[1]=IIC2_Read_Byte(0); +// }else{ +// pBuffer[0]=IIC2_Read_Byte(0); +// } + + while (num) + { + *pBuffer = IIC2_Read_pca_Byte(num); + if (num == 1) + { + IIC2_pca_send_NAck(); + //IIC2_NAck(); + } + else + { + IIC2_pca_send_Ack(); + //IIC2_Ack(); + } + pBuffer++; + num--; + } + IIC2_pca_Stop(); + + +// IIC2_Start(); +// IIC2_Send_Byte(addr & 0xfe); //发送写命令 +// IIC2_Wait_pca_Ack(); +// IIC2_Send_Byte(reg_addr); //发送读地址 +// IIC2_Wait_pca_Ack(); +// IIC2_Start(); +// IIC2_Send_Byte(0x41); //发送读命令,进入接收模式 +// IIC2_Wait_pca_Ack(); +// temp=IIC2_Read_Byte(0); +// IIC2_Stop(); //产生一个停止条件 + +} + +/*写pca9555第二层驱动,可辅助逻辑不破坏最底层驱动,该函数默认配置输出寄存器 + addr 芯片地址,0x40表示第一个芯片地址 + data_L 写入芯片的前八位数据 + data_H 写入芯片的前后位数据 +*/ +void PCA9555_write_output_port_data(unsigned char addr,unsigned char data_L,unsigned char data_H) +{ + IIC_Write_Pca9555(addr,PCA9555_REG_OUT0,data_L,data_H);// PCA9555_REG_OUT0 输出寄存器0地址 + pca9555writedata_output[0]= data_L;//保存该次设置数据 + pca9555writedata_output[1]= data_H; +} + +/*写pca9555第二层驱动,可辅助逻辑不破坏最底层驱动,该函数默认配置输出寄存器 + addr 芯片地址,0x40表示第一个芯片地址 + data_L 写入芯片的前八位数据 + data_H 写入芯片的前后位数据 +*/ +void PCA9555_write_config_port_data(unsigned char addr,unsigned char data_L,unsigned char data_H) +{ + IIC_Write_Pca9555(addr,PCA9555_REG_CFG0,data_L,data_H);// PCA9555_REG_OUT0 输出寄存器0地址 + pca9555writedata_config[0]= data_L;//保存该次设置数据 + pca9555writedata_config[1]= data_H; +} +/*写pca9555第二层驱动,可辅助逻辑不破坏最底层驱动,该函数默认配置输入极性翻转寄存器 1翻转 2不变 + addr 芯片地址,0x40表示第一个芯片地址 + data_L 写入芯片的前八位数据 + data_H 写入芯片的前后位数据 +*/ +void PCA9555_write_polarity_port_data(unsigned char addr,unsigned char data_L,unsigned char data_H) +{ + IIC_Write_Pca9555(addr,PCA9555_REG_POL0,data_L,data_H);// PCA9555_REG_OUT0 输出寄存器0地址 + pca9555writedata_polarity[0]= data_L;//保存该次设置数据 + pca9555writedata_polarity[1]= data_H; +} + +/*读pca9555第二层驱动,可辅助逻辑不破坏最底层驱动 + addr 芯片地址,0x40表示第一个芯片地址 + pBuffer 读出芯片的数据 2个输入寄存器的值仅限输入模式使用 +*/ +void PCA9555_readdata(unsigned char addr,unsigned char* pBuffer) +{ + IIC_Read_Pca9555(addr,PCA9555_REG_IN0,pBuffer,2);//2为读出芯片数据组数,9555为2组,全部读出 +} +/*读pca9555第二层驱动,可辅助逻辑不破坏最底层驱动 + addr 芯片地址,0x40表示第一个芯片地址 + pBuffer 读出芯片的数据 2个寄存器的值仅限输出模式,此模式下仅回复输入输出的控制模式的值,而非电平值 +*/ +void PCA9555_readdata_from_output_register(unsigned char addr,unsigned char* pBuffer) +{ + IIC_Read_Pca9555(addr,PCA9555_REG_OUT0,pBuffer,2);//2为读出芯片数据组数,9555为2组,全部读出 +} +/*读pca9555第二层驱动,可辅助逻辑不破坏最底层驱动 + addr 芯片地址,0x40表示第一个芯片地址 + pBuffer 读出芯片的数据 2个寄存器的值仅限输出模式,此模式下仅回复输入输出的控制模式的值,而非电平值 +*/ +void PCA9555_readdata_from_polarity_register(unsigned char addr,unsigned char* pBuffer) +{ + IIC_Read_Pca9555(addr,PCA9555_REG_POL0,pBuffer,2);//2为读出芯片数据组数,9555为2组,全部读出 +} +/*读pca9555第二层驱动,可辅助逻辑不破坏最底层驱动 + addr 芯片地址,0x40表示第一个芯片地址 + pBuffer 读出芯片的数据 配置2个寄存器的数值 +*/ +void PCA9555_readdata_from_config_register(unsigned char addr,unsigned char* pBuffer) +{ + IIC_Read_Pca9555(addr,PCA9555_REG_CFG0,pBuffer,2);//2为读出芯片数据组数,9555为2组,全部读出 +} +///*配置芯片的对应管脚输入输出功能 +// addr 芯片地址,0x40表示第一个芯片地址 +// data_L 写入芯片的前八位数据 1高阻抗输入 0输出 输入寄存器默认上拉 +// data_H 写入芯片的前后位数据 +//*/ +//void PCA9555_config_gpio(unsigned char addr,unsigned char data_L,unsigned char data_H) +//{ +// IIC_Write_Pca9555(addr,PCA9555_REG_CFG0,data_L,data_H);// PCA9555_REG_OUT0 输出寄存器0地址 +//} + + +/*设置所有输出 + value 控制的IO输出状态 0:全部输出低 1:全部输出高 + 仅限输出模式 +*/ +void PCA9555_Set_All_Output(unsigned char value) +{ + int i; + for(i=0;i<4;i++){ + if(value==0) + pca9555writedata_output[i]=0; + else + pca9555writedata_output[i]=0xff; + } + PCA9555_write_output_port_data(PCA9555_DEVICE_ADDR,pca9555writedata_output[0],pca9555writedata_output[1]);//全部输出为1或0 + //多芯片 + //PCA9555_writedata(PCA9555_REG_OUT0,pca9555writedata[2],pca9555writedata[3]); +} +/*设置第一个芯片某一通道IO高低输出仅限输出 + num 控制的IO序号 1~16 + value 控制的IO输出状态 0:低电平 1:高电平 +*/ +void PCA9555_Set_One_Value_Output(unsigned char num,unsigned char value) +{ + if(num >0 && num <17){//第一个芯片IO1-16控制 + if(num <9){ + if(value)pca9555writedata_output[0] |= 0x01<<(num - 1);//赋值位高 + else pca9555writedata_output[0] &= ~(0x01<<(num - 1));//赋值位低 + } + else{ + if(value)pca9555writedata_output[1] |= 0x01<<(num - 9);//赋值位高 + else pca9555writedata_output[1] &= ~(0x01<<(num - 9));//赋值位低 + } + PCA9555_write_output_port_data(PCA9555_DEVICE_ADDR,pca9555writedata_output[0],pca9555writedata_output[1]); + }else{//超出芯片控制 + //error + } + //底下为多芯片逻辑 +// else if(num >16 && num <33){//第二个芯片IO1-16控制,使用更多IO以此类推,最多支持0x000~0x111 共8个芯片串联,共128个IO,如果不够可以使用PCA9505,40个IO,最多串联320个IO +// if(num <25){ +// if(value)pca9555writedata[2] |= 0x01<<(num - 17);//赋值位高 +// else pca9555writedata[2] &= ~(0x01<<(num - 17));//赋值位低 +// } +// else{ +// if(value)pca9555writedata[3] |= 0x01<<(num - 25);//赋值位高 +// else pca9555writedata[3] &= ~(0x01<<(num - 25));//赋值位低 +// } +// PCA9555_writedata(PCA9555_REG_OUT1,pca9555writedata[2],pca9555writedata[3]); +// } +// else{//超出芯片控制 +// //error +// } +} +/*设置第一个芯片某一通道IO输入或输出 + num 控制的IO序号 1~17 + value 控制的IO输出状态 0:输出 1:输入 +*/ +void PCA9555_Set_One_Value_Config(unsigned char num,unsigned char value) +{ + + if(num >0 && num <17){//第一个芯片IO1-16控制 + if(num <9){ + if(value)pca9555writedata_config[0] |= 0x01<<(num - 1);//赋值位高 + else pca9555writedata_config[0] &= ~(0x01<<(num - 1));//赋值位低 + } + else{ + if(value)pca9555writedata_config[1] |= 0x01<<(num - 9);//赋值位高 + else pca9555writedata_config[1] &= ~(0x01<<(num - 9));//赋值位低 + } + PCA9555_write_config_port_data(PCA9555_DEVICE_ADDR,pca9555writedata_config[0],pca9555writedata_config[1]); + }else{//超出芯片控制 + //error + } +} +/*设置第一个芯片某一通道默认输入的极性 + num 控制的IO序号 1~17 + value 控制的IO输出状态 0:非使能 1:使能翻转为电平0 +*/ +void PCA9555_Set_One_Value_Polarity_input(unsigned char num,unsigned char value) +{ + if(num >0 && num <17){//第一个芯片IO1-16控制 + if(num <9){ + if(value)pca9555writedata_polarity[0] |= 0x01<<(num - 1);//赋值位高 + else pca9555writedata_polarity[0] &= ~(0x01<<(num - 1));//赋值位低 + } + else{ + if(value)pca9555writedata_polarity[1] |= 0x01<<(num - 9);//赋值位高 + else pca9555writedata_polarity[1] &= ~(0x01<<(num - 9));//赋值位低 + } + PCA9555_write_polarity_port_data(PCA9555_DEVICE_ADDR,pca9555writedata_polarity[0],pca9555writedata_polarity[1]); + }else{//超出芯片控制 + //error + } +} +/*读取5V引脚的输入高低电平 + 返回值 高1 低0 电平 +*/ +int read_5v_input_pca(void) +{PCA9555_readdata(PCA9555_DEVICE_ADDR,pca9555writedata_input);//读输入寄存器的值 + uint16_t gpio_state; + gpio_state=(uint16_t)pca9555writedata_input[0]<<8|pca9555writedata_input[1]; + if(INPUT_5V_POSITION&gpio_state) + return 1; + else { + return 0; + } +} +/*读取供电引脚的输入高低电平 + 返回值 高1 低0 电平 +*/ +int read_powerkey_input_pca(void) +{PCA9555_readdata(PCA9555_DEVICE_ADDR,pca9555writedata_input);//读输入寄存器的值 + uint16_t gpio_state; + gpio_state=(uint16_t)pca9555writedata_input[0]<<8|pca9555writedata_input[1]; + if(PWR_ON_POSITION&gpio_state) + return 1; + else { + return 0; + } +} +/*读取SOS引脚的输入高低电平 + 返回值 高1 低0 电平 +*/ +int read_userkey_input_pca(void) +{PCA9555_readdata(PCA9555_DEVICE_ADDR,pca9555writedata_input);//读输入寄存器的值 + uint16_t gpio_state; + gpio_state=(uint16_t)pca9555writedata_input[0]<<8|pca9555writedata_input[1]; + if(SOS_ENBALE_POSITION&gpio_state) + return 1; + else { + return 0; + } +} +void PCA9555_init() +{ +//IIC_gpio_pca_init();//配置IIC管脚 + + //PCA9555_write_config_port_data(PCA9555_DEVICE_ADDR,PCA_OUTPUT_CONFIG_MASK,PCA_OUTPUT_CONFIG_MASK);//全配置为输出 + //PCA9555_Set_One_Value_Polarity_input(PWR_ON,0); + //PCA9555_write_config_port_data(PCA9555_DEVICE_ADDR,PCA_INPUT_CONFIG_MASK,PCA_INPUT_CONFIG_MASK);//全配置为输入 + //PCA9555_write_polarity_port_data(PCA9555_DEVICE_ADDR,0x00,0x00);//翻转 + //PCA9555_Set_One_Value_Config(WAKE_UP,1); + //PCA9555_Set_All_Output(1); + + PCA9555_Set_One_Value_Config(GPS_POWER,0);//设置GPS为输出 + PCA9555_Set_One_Value_Output(GPS_POWER,1);//拉高GPS + PCA9555_Set_One_Value_Config(ADC_MINIUS,0);//设置ADC输出 + PCA9555_Set_One_Value_Output(ADC_MINIUS,1);//默认拉高 + PCA9555_Set_One_Value_Config(MCU_A,0);//设置串口复用芯片切换 + PCA9555_Set_One_Value_Output(MCU_A,1);//输出高电平为uart通讯 + PCA9555_Set_One_Value_Config(INPUT_5V,1);//设置5V输入检测 + PCA9555_Set_One_Value_Config(GPS_LED,0);//设置LED灯输出 + PCA9555_Set_One_Value_Output(GPS_LED,1);//输出高电平开启LED通闪烁 + PCA9555_Set_One_Value_Config(PWR_ENABLE,0);//设置电池上电是否给单片机供电 + PCA9555_Set_One_Value_Output(PWR_ENABLE,1);//高电平默认导通单片机供电 + PCA9555_Set_One_Value_Config(PWR_ON,1);//设置开关机按键输入 + + PCA9555_Set_One_Value_Config(AIR780E_ENBALE,0);//配置4G供电 + PCA9555_Set_One_Value_Output(AIR780E_ENBALE,1);//打开4G + + PCA9555_Set_One_Value_Config(MAIN_RI,1);//配置4G唤醒引脚为输入 + + PCA9555_Set_One_Value_Config(SOS_ENBALE,1);//设置SOS按钮输入 +// PCA9555_Set_One_Value_Output(PWR_ON,0);//拉低 + //PCA9555_readdata_from_output_register(PCA9555_DEVICE_ADDR,pca9555writedata_input); + //PCA9555_Set_One_Value_Output(AIR780E_ENBALE,0); + //PCA9555_Set_One_Value_Output(PWR_ON,0); +// PCA9555_Set_All_Output(0); + //PCA9555_readdata_from_polarity_register(PCA9555_DEVICE_ADDR,pca9555writedata_input); + PCA9555_readdata(PCA9555_DEVICE_ADDR,pca9555writedata_input);//读输入寄存器的值 + + //PCA9555_readdata_from_config_register(PCA9555_DEVICE_ADDR,pca9555writedata_config); +// PCA9555_Set_All_Output(0);//全部拉低 + + //测试 +//PCA9555_Set_All_Output(1);//全部拉高 +//PCA9555_Set_All_Output(0);//全部拉低 + +} + diff --git a/keil/include/drivers/PCA9555.h b/keil/include/drivers/PCA9555.h new file mode 100644 index 0000000..3638272 --- /dev/null +++ b/keil/include/drivers/PCA9555.h @@ -0,0 +1,80 @@ +#include "board.h" +#define IIC2_READ_SDA gpio_pin_get_val(SDA_PIN) +#define SDA_1 gpio_pin_set(SDA_PIN) +#define SCL_1 gpio_pin_set(SCL_PIN) + +#define PCA9555_SLA (0x40 >> 1) // 定义PAC9555的器件地址 +#define PCA9555_REG_IN0 0x00 // 定义输入寄存器0地址 +#define PCA9555_REG_IN1 0x01 // 定义输入寄存器1地址 +#define PCA9555_REG_OUT0 0x02 // 定义输出寄存器0地址 +#define PCA9555_REG_OUT1 0x03 // 定义输出寄存器1地址 +#define PCA9555_REG_POL0 0x04 // 定义极性反转寄存器0地址 +#define PCA9555_REG_POL1 0x05 // 定义极性反转寄存器1地址 +#define PCA9555_REG_CFG0 0x06 // 定义方向配置寄存器0地址 +#define PCA9555_REG_CFG1 0x07 // 定义方向配置寄存器1地址 +#define PCA9555_DEVICE_ADDR 0x40 // 定义PCA9555地址 +#define PCA_OUTPUT_CONFIG_MASK 0x00 +#define PCA_INPUT_CONFIG_MASK 0xff +#define SDA_0 gpio_pin_clr(SDA_PIN) +#define SCL_0 gpio_pin_clr(SCL_PIN) + +#define MAX_GPIO_NUM 16 +//0组 +#define MCU_A 0x01 +#define CHG_G 0x02 +#define LORA_IRQ 0x03 +#define LORA_NRST 0x04 +#define ADC_MINIUS 0x05 +#define INPUT_5V 0x06 +#define PWR_ON 0x07 +#define PWR_ENABLE 0x08 +//1组 +#define GPS_LED 0x09 +#define TTS_ENABLE 0x0A +#define WAKE_UP 0x0B +#define AIR780E_ENBALE 0x0C +#define SOS_ENBALE 0x0D +#define GPS_BACKUP 0x0E +#define GPS_POWER 0x0F +#define MAIN_RI 0x10 + +//输入寄存器INT判断数组对应位置 +//input 0组 +#define MCU_A_POSITION (1<<(MAX_GPIO_NUM-MCU_A)) +#define CHG_G_POSITION (1<<(MAX_GPIO_NUM-CHG_G)) +#define LORA_IRQ_POSITION (1<<(MAX_GPIO_NUM-LORA_IRQ)) +#define LORA_NRST_POSITION (1<<(MAX_GPIO_NUM-LORA_NRST)) +#define ADC_MINIUS_POSITION (1<<(MAX_GPIO_NUM-ADC_MINIUS)) +#define INPUT_5V_POSITION (1<<(MAX_GPIO_NUM-INPUT_5V)) +#define PWR_ON_POSITION (1<<(MAX_GPIO_NUM-PWR_ON)) +#define PWR_ENABLE_POSITION (1<<(MAX_GPIO_NUM-PWR_ENABLE)) +//input 1组 +#define GPS_LED_POSITION (1<<(MAX_GPIO_NUM-GPS_LED)) +#define TTS_ENABLE_POSITION (1<<(MAX_GPIO_NUM-TTS_ENABLE)) +#define WAKE_UP_POSITION (1<<(MAX_GPIO_NUM-WAKE_UP)) +#define AIR780E_ENBALE_POSITION (1<<(MAX_GPIO_NUM-AIR780E_ENBALE)) +#define SOS_ENBALE_POSITION (1<<(MAX_GPIO_NUM-SOS_ENBALE)) +#define GPS_BACKUP_POSITION (1<<(MAX_GPIO_NUM-GPS_BACKUP)) +#define GPS_POWER_POSITION (1<<(MAX_GPIO_NUM-GPS_POWER)) +#define MAIN_RI_POSITION (1<<(MAX_GPIO_NUM-MAIN_RI)) +//uint8_t gps_led_output_state,tts_enbale_output_state,wake_up_output_state,air780e_enable_output_state,sos_enable_output_state,gps_backup_output_state,gps_power_output_state,main_ri_output_state;//1组output IO口从左到右1.0~1.7 +//uint8_t mcu_a_output_state,chg_g_output_state,lora_irq_output_state,lora_nrst_output_state,adc_minius_output_state,input_5v_output_state,pwr_on_output_state,pwr_enable_output_state;//2组output IO口从左到右0.0~0.7 +void IIC_gpio_pca_init(void); +void IIC2_pca_Start(void); +void IIC_pca_Ready(void); +void IIC2_pca_Stop(void); +uint8_t IIC2_Wait_pca_Ack(void); +void IIC2_pca_send_Ack(void); +void IIC2_pca_send_NAck(void); +void IIC2_Send_pca_Byte(uint8_t txd); +uint8_t IIC2_Read_pca_Byte(unsigned char ack); +void IIC_Write_Pca9555(unsigned char addr,unsigned char reg_addr,unsigned char low_byte,unsigned char high_byte); +void IIC_Read_Pca9555(uint8_t addr,uint8_t reg_addr,uint8_t* pBuffer,uint16_t num); +void PCA9555_write_output_port_data(unsigned char addr,unsigned char data_L,unsigned char data_H); +void PCA9555_write_config_port_data(unsigned char addr,unsigned char data_L,unsigned char data_H); +void PCA9555_readdata(unsigned char addr,unsigned char* pBuffer); +void PCA9555_Set_All_Output(unsigned char value); +void PCA9555_Set_One_Value_Output(unsigned char num,unsigned char value); +void PCA9555_Set_One_Value_Config(unsigned char num,unsigned char value); +void PCA9555_Set_One_Value_Polarity_input(unsigned char num,unsigned char value); +void PCA9555_init(); diff --git a/keil/include/drivers/dw_app_anchor.c b/keil/include/drivers/dw_app_anchor.c new file mode 100644 index 0000000..ff1fa33 --- /dev/null +++ b/keil/include/drivers/dw_app_anchor.c @@ -0,0 +1,57 @@ +#include "dw_app_anchor.h" +#include "stdint.h" +#include <string.h> +#if defined (MK_SS_TWR_DW_INIT) +static float clockOffsetRatio; +static double rtd_init, rtd_resp; +static double tof,distance; +#define SPEED_OF_LIGHT 299702547 +#define DWT_TIME_UNITS (1.0/499.2e6/128.0) //!< = 15.65e-12 s +static uint32_t anc_pollrx[MAX_NEARBASE_NUM],anc_resptx[MAX_NEARBASE_NUM],tag_resprx[MAX_NEARBASE_NUM],tag_polltx[MAX_NEARBASE_NUM]; +static int32_t anc_clockoffset[MAX_NEARBASE_NUM]; +static int16_t anc_distoffset[MAX_NEARBASE_NUM]; +extern uint8_t taglist_keeptime[MAX_TAG_LIST_NUM]; //每个标签存活时间 +extern uint16_t taglist_id[MAX_TAG_LIST_NUM],taglist_dist[MAX_TAG_LIST_NUM]; //标签距离和标签的ID +extern uint16_t taglist_total_num,taglist_current_index; + +extern uint8_t exsistbase_list[MAX_NEARBASE_NUM]; +extern int32_t nearbase_distlist[MAX_NEARBASE_NUM]; +void SetANCTimestap(uint8_t i,uint8_t* pollrx,uint8_t* resptx,uint32_t resprx,uint8_t* distoffset,int32_t anc_clockoffset_from_MK) //写入时间戳信息 +{ + memcpy(&anc_pollrx[i],pollrx,4); + memcpy(&anc_resptx[i],resptx,4); + memcpy(&tag_resprx[i],&resprx,4); + memcpy(&anc_distoffset[i],distoffset,2); + anc_clockoffset[i] = anc_clockoffset_from_MK;//MK8000修改 +} +void CalculateDists(int64_t poll_tx_ts) +{ + for(int i=0; i<MAX_NEARBASE_NUM; i++) + { + //rec_anc_signalpower[i] = exsistbase_list[i]; + if(exsistbase_list[i]==KEEP_TIMES) + { + // exsistbase_list[i]--; +#ifdef _UWB_4G + clockOffsetRatio = anc_clockoffset[i] * (FREQ_OFFSET_MULTIPLIER * HERTZ_TO_PPM_MULTIPLIER_CHAN_2 / 1.0e6) ; +#else + clockOffsetRatio = anc_clockoffset[i] * (FREQ_OFFSET_MULTIPLIER * HERTZ_TO_PPM_MULTIPLIER_CHAN_5 / 1.0e6) ;//MK8000修改 +#endif + rtd_init = tag_resprx[i] - (uint32_t)poll_tx_ts; + rtd_resp = anc_resptx[i] - anc_pollrx[i]; + tof = ((rtd_init - rtd_resp * (1 - clockOffsetRatio)) / 2.0) * DWT_TIME_UNITS; + distance = tof * SPEED_OF_LIGHT; + if(distance>-10&&distance<1000) + { + nearbase_distlist[i] = distance*100+anc_distoffset[i]; + } + } else { + // nearbase_distlist[i] = 0x1ffff; + } + + } + +} +#endif + + diff --git a/keil/include/drivers/dw_app_anchor.h b/keil/include/drivers/dw_app_anchor.h new file mode 100644 index 0000000..212c3d5 --- /dev/null +++ b/keil/include/drivers/dw_app_anchor.h @@ -0,0 +1,46 @@ +#ifndef __DW_APP_H__ +#define __DW_APP_H__ +#include "stdint.h" +void SetANCTimestap(uint8_t i,uint8_t* pollrx,uint8_t* resptx,uint32_t resprx,uint8_t* distoffset,int32_t anc_clockoffset); +void CalculateDists(int64_t poll_tx_ts); +typedef enum +{ UN_BIND=0, + LINK_SUCCESS, + SEARCH_DEV, +} Operation_step; +#define MBX_RESPONSE 0x21 +#define MBX_POLL 0x20 +#define MBX_RESPONSE 0x21 +#define MBX_FINAL 0x22 +#define MBX_PRAAREPLY 0x23 +#define MBX_REG 0x24 +#define MESSAGE_TYPE_IDX 9 +#define TAG_ID_IDX 5 +#define GROUP_ID_IDX 0 +#define ANCHOR_ID_IDX 1 +#define MAX_NEARBASE_NUM 25 +#define KEEP_TIMES 5 +#define TAG_NUM_IN_SYS 25 +#define FZ_NEARBASENUM_INDEX 10 +#define FZ_NEARBASEID_INDEX 11 +#define ANC_MAX_NUM 50 + +#define DIST_IDX 10 +#define SEQUENCE_IDX 3 +#define BATTARY_IDX 4 +//NEAR POLL +#define RESP_MSG_POLL_RX_TS_IDX 26 +#define RESP_MSG_RESP_TX_TS_IDX 30 +#define RESP_MSG_ANC_DISTOFFSET 34 + +#define TAG_KEEPTIMES 20 //标签存活时间 +#define MAX_TAG_LIST_NUM 200 //同时通讯标签最大数量 + +#define FREQ_OFFSET_MULTIPLIER (998.4e6/2.0/1024.0/131072.0) +#define FREQ_OFFSET_MULTIPLIER_110KB (998.4e6/2.0/8192.0/131072.0) + +#define HERTZ_TO_PPM_MULTIPLIER_CHAN_1 (-1.0e6/3494.4e6) +#define HERTZ_TO_PPM_MULTIPLIER_CHAN_2 (-1.0e6/3993.6e6) +#define HERTZ_TO_PPM_MULTIPLIER_CHAN_3 (-1.0e6/4492.8e6) +#define HERTZ_TO_PPM_MULTIPLIER_CHAN_5 (-1.0e6/6489.6e6) +#endif \ No newline at end of file diff --git a/keil/include/drivers/dw_tag.c b/keil/include/drivers/dw_tag.c new file mode 100644 index 0000000..d4a6faf --- /dev/null +++ b/keil/include/drivers/dw_tag.c @@ -0,0 +1,138 @@ +#include "dw_tag.h" +#include "stdint.h" +#include <string.h> +#include "mk_uwb.h" +#include "mk_misc.h" +#include "mk_uart.h" +#include "mk_trace.h" +#include "global_param.h" +static float clockOffsetRatio; +static double rtd_init, rtd_resp; +double tof,distance_tag; +#define SPEED_OF_LIGHT 299702547 +#define DWT_TIME_UNITS (1.0/499.2e6/128.0) //!< = 15.65e-12 s +static uint32_t anc_pollrx[MAX_NEARBASE_NUM],anc_resptx[MAX_NEARBASE_NUM],tag_resprx[MAX_NEARBASE_NUM],tag_polltx[MAX_NEARBASE_NUM]; +static int32_t anc_clockoffset[MAX_NEARBASE_NUM]; +static int16_t anc_distoffset[MAX_NEARBASE_NUM]; +extern uint8_t taglist_keeptime[MAX_TAG_LIST_NUM]; //每个标签存活时间 +extern uint16_t taglist_id[MAX_TAG_LIST_NUM],taglist_dist[MAX_TAG_LIST_NUM]; //标签距离和标签的ID +extern uint16_t taglist_total_num,taglist_current_index; +//#if defined (MK_SS_TWR_DW_INIT) + uint8_t exsistbase_list[MAX_NEARBASE_NUM]; + int32_t nearbase_distlist[MAX_NEARBASE_NUM]; +static int64_t tround,treply; +static int64_t poll_tx_timestamp,resp_rx_timestamp,resp_tx_timestamp,poll_rx_timestamp; + +int32_t temp_freq_offset; +int64_t tround_temp,treply_temp; +int32_t tof_i; +uint32_t tof_i_ui; +double tof_f; + int32_t freq_offset,freq_offset_filter; +void SetANCTimestap(uint8_t i,uint8_t* pollrx,uint8_t* resptx,uint32_t resprx,uint8_t* distoffset,int32_t anc_clockoffset_from_MK,uint32_t polltx) //写入时间戳信息 +{ + memcpy(&anc_pollrx[i],pollrx,4); + memcpy(&anc_resptx[i],resptx,4); + memcpy(&tag_resprx[i],&resprx,4); + memcpy(&anc_distoffset[i],distoffset,2); + memcpy(&tag_polltx[i],&polltx,4); + //anc_clockoffset[i] = anc_clockoffset_from_MK;//MK8000修改 +} +//void CalculateDists1(int64_t poll_tx_ts) +//{ +//for(int i=0;i<MAX_NEARBASE_NUM;i++) +// { +// //rec_anc_signalpower[i] = exsistbase_list[i]; +// if(exsistbase_list[i]==KEEP_TIMES) +// { +// // exsistbase_list[i]--; +//#ifdef _UWB_4G +// clockOffsetRatio = anc_clockoffset[i] * (FREQ_OFFSET_MULTIPLIER * HERTZ_TO_PPM_MULTIPLIER_CHAN_2 / 1.0e6) ; +//#else +// clockOffsetRatio = anc_clockoffset[i] * (FREQ_OFFSET_MULTIPLIER * HERTZ_TO_PPM_MULTIPLIER_CHAN_5 / 1.0e6) ;//MK8000修改 +//#endif +// rtd_init = tag_resprx[i] - (uint32_t)poll_tx_ts; +// rtd_resp = anc_resptx[i] - anc_pollrx[i]; +// tof = ((rtd_init - rtd_resp * (1 - clockOffsetRatio)) / 2.0) * DWT_TIME_UNITS; +// distance_tag = tof * SPEED_OF_LIGHT/100; +// if(distance_tag>-10&&distance_tag<1000) +// { +// nearbase_distlist[i] = distance_tag+anc_distoffset[i]; +// } +// }else{ +// nearbase_distlist[i] = 0x1ffff; +// } +// } +//} +// ts_a - ts_b +int64_t ranging_timestamp_diff1(int64_t ts_a, int64_t ts_b) +{ + if (ts_a < ts_b) + { + return (0x20000000000 - ts_b + ts_a); + } + else + { + return (ts_a - ts_b); + } +} +void CalculateDists(int64_t poll_tx_ts) +{ + for(int i=0;i<MAX_NEARBASE_NUM;i++) + { + + if(exsistbase_list[i]==KEEP_TIMES) + { + + //temp_freq_offset=freq_offset_filter;//测试 + memcpy(&resp_tx_timestamp,&anc_resptx[i],4); + memcpy(&poll_rx_timestamp,&anc_pollrx[i],4); + treply = ranging_timestamp_diff1(resp_tx_timestamp, poll_rx_timestamp); + //基站 +// // correct antenna delay +// treply += ranging_ant_delays_get((uint8_t)(RX_MAIN_ANT_PORT)); + +// uint32_t tag_tx_temp=(uint32_t)poll_tx_ts;//测试 +// memcpy(&tag_polltx[0],&tag_tx_temp,4);//测试 + + //poll_tx_timestamp=poll_tx_ts; + + memcpy(&poll_tx_timestamp,&tag_polltx[i],4); + memcpy(&resp_rx_timestamp,&tag_resprx[i],4); + + tround=ranging_timestamp_diff1(resp_rx_timestamp, poll_tx_timestamp); + tround_temp=tround; + treply_temp=treply; + //标签 + // correct antenna delay +// tround -= ranging_ant_delays_get(uwb_app_config.ppdu_params.rx_ant_id); + // corrected by frequency offset + tround = (int64_t)((double)tround * (1 - (double)freq_offset_filter / ch_center_freq_map[UWB_CH_NUM])); + tround_temp=tround; + treply_temp=treply; + tof_i = (int32_t)(tround - treply) / 2; +// tof_i_ui=(uint32_t)tof_i; + + // outlier filter去掉负值过滤未添加offset +// if (tof_i < 0) +// { +// tof_i = 0; +// } + //tof_f = (double)TIMESTAMP_UNIT_TO_NS((uint32_t)tof_i);//yuan + tof_f = (double)TIMESTAMP_UNIT_TO_NS(tof_i); + //distance_tag=(uint16_t)(tof_f * 0.299702547 * VP_VAL - RANGING_CORR);//yuan + distance_tag=tof_f * 0.299702547 * VP_VAL - RANGING_CORR; + distance_tag=distance_tag+30;//测试加的offset + //LOG_INFO(TRACE_MODULE_APP, "distance_tag is %lf\r\n",distance_tag); + + if(distance_tag>-1000&&distance_tag<100000) + { + nearbase_distlist[i] = distance_tag+(int16_t)g_com_map[OFFSET_AS_TAG];//offset加入上位机校准 + } + }else{ + nearbase_distlist[i] = 0x1ffff; + } + + } +} +//#endif \ No newline at end of file diff --git a/keil/include/drivers/dw_tag.h b/keil/include/drivers/dw_tag.h new file mode 100644 index 0000000..44710cb --- /dev/null +++ b/keil/include/drivers/dw_tag.h @@ -0,0 +1,50 @@ +#ifndef __DW_APP_H__ +#define __DW_APP_H__ +#include "stdint.h" +void SetANCTimestap(uint8_t i,uint8_t* pollrx,uint8_t* resptx,uint32_t resprx,uint8_t* distoffset,int32_t anc_clockoffset_from_MK,uint32_t polltx); +void CalculateDists1(int64_t poll_tx_ts); +void CalculateDists(int64_t poll_tx_ts); +int64_t ranging_timestamp_diff(int64_t ts_a, int64_t ts_b); +typedef enum +{ UN_BIND=0, + LINK_SUCCESS, + SEARCH_DEV, +} Operation_step; +#define MBX_RESPONSE 0x21 +#define MBX_POLL 0x20 +#define MBX_RESPONSE 0x21 +#define MBX_FINAL 0x22 +#define MBX_PRAAREPLY 0x23 +#define MBX_REG 0x24 + +#define MESSAGE_TYPE_IDX 9 +#define TAG_ID_IDX 5 +#define GROUP_ID_IDX 0 +#define ANCHOR_ID_IDX 1 +#define MAX_NEARBASE_NUM 25 +#define TAG_KEEPTIMES 30 //标签存活时间 +#define KEEP_TIMES 5 +#define TAG_NUM_IN_SYS 25 + +#define SEQUENCE_IDX 3 +#define BATTARY_IDX 4 +//NEAR POLL +#define RESP_MSG_POLL_RX_TS_IDX 26 +#define RESP_MSG_RESP_TX_TS_IDX 30 +#define RESP_MSG_ANC_DISTOFFSET 34 + +//NEAR MSG +#define NEARBASENUM_INDEX 10 +#define NEARBASEID_INDEX 11 + +#define TAG_KEEPTIMES 30 //标签存活时间 +#define MAX_TAG_LIST_NUM 200 //同时通讯标签最大数量 + +#define FREQ_OFFSET_MULTIPLIER (998.4e6/2.0/1024.0/131072.0) +#define FREQ_OFFSET_MULTIPLIER_110KB (998.4e6/2.0/8192.0/131072.0) + +#define HERTZ_TO_PPM_MULTIPLIER_CHAN_1 (-1.0e6/3494.4e6) +#define HERTZ_TO_PPM_MULTIPLIER_CHAN_2 (-1.0e6/3993.6e6) +#define HERTZ_TO_PPM_MULTIPLIER_CHAN_3 (-1.0e6/4492.8e6) +#define HERTZ_TO_PPM_MULTIPLIER_CHAN_5 (-1.0e6/6489.6e6) +#endif \ No newline at end of file diff --git a/keil/include/drivers/global_param.h b/keil/include/drivers/global_param.h index 4cd8908..87b4b75 100644 --- a/keil/include/drivers/global_param.h +++ b/keil/include/drivers/global_param.h @@ -12,7 +12,7 @@ #define VERSION 0x1 #define DEV_ID 0x2 //设备的Id #define COM_INTERVAL 0x3 //通讯间隔 -//#define OFFSET_AS_URT_TAG 0x3 //车载校准距离 +#define OFFSET_AS_TAG 0x3 #define MAX_REPORT_ANC_NUM 0x4 //单次通讯基站上限 #define GROUP_ID 0x5 //单次通讯基站下限 @@ -51,7 +51,9 @@ #define ACTIVE_INDEX 0x22 #define UWB_ACTIVE_FLAG_IDX 0x23 #define HEIGHTOFFEST_INDEX 0x28 - +#define UWB_RNAGE_TIME 0xA +#define UWB_WAIT_TIME 0xB +#define SEND_4G_SECOND 0x1B //4G上报频率 #define CNT_RESTART 0x30 #define CNT_REBOOT 0x31 #define CNT_UPDATE 0x32 diff --git a/keil/include/drivers/mk_4G.c b/keil/include/drivers/mk_4G.c new file mode 100644 index 0000000..9d0a4b8 --- /dev/null +++ b/keil/include/drivers/mk_4G.c @@ -0,0 +1,53 @@ +#include "mk_4G.h" +#include "global_param.h" +#include "sn74hc595.h" +void bind_reset(void) +{ + g_com_map[BIND_DEV_ID]=0x00;//重置默认下发ID保存 + save_com_map_to_flash(); +} +void message_construct() +{ +//sprintf(send_buf,"$message,%d,%d,%d,%d,%d,%d,%%f,%lf,%lf,%lf,%lf,%d,%d",Commend_SendDate.messgetype,Commend_SendDate.tagId,Commend_SendDate.bindState, + //Commend_SendDate.gunLableId,Commend_SendDate.alarmType,Commend_SendDate.power,Commend_SendDate.warnDistance,Commend_SendDate.alarmDistance,Commend_SendDate.lng,Commend_SendDate.lat + //Commend_SendDate.applyId,Commend_SendDate.result); + + //send 4G +} +void message_from_4G_Handler(void) +{ + + +//sscanf(4G_api_buf,"$%*[^,],%d,%d,%d,%d,%lf,%lf,%d",Commend_Datestruct.type,Commend_Datestruct.applyID,Commend_Datestruct.tagId, + //Commend_Datestruct.gunLableId,Commend_Datestruct.warnDistance,Commend_Datestruct.alarmDistance,Commend_Datestruct.frequency); + /*根据指令去执行 + switch(Commend_Datestruct.type) + case BIND_SUCCESS: + { + g_com_map[DEV_ID]=Commend_Datestruct.tagId; + g_com_map[BIND_DEV_ID]=Commend_Datestruct.gunLableId; + g_com_map[STATIONARY_TIME]=Commend_Datestruct.warnDistance; + g_com_map[ALARM_DISTANCE2]=Commend_Datestruct.alarmDistance;//这个距离double和uint格式不符 + g_com_map[SEND_4G_FREQUENCY]=1000/Commend_Datestruct.frequency; + } + break; + case UNBIND: + bind_resetbreak(); + case OPEN_GNSS: + gnss_forceopen(); + case CLOSE_VIBRATION: + vibration_close(); + case QUARY_INFORMATION: + //?? + case CHANGE_POLL_FREQUENCY: + g_com_map[SEND_4G_FREQUENCY]=Commend_Datestruct.frequency; + break; + + save_com_map_to_flash(); + */ +} + +void gnss_forceopen(void) +{ + gps_air780_power_change(1, air780_power_state); +} \ No newline at end of file diff --git a/keil/include/drivers/mk_4G.h b/keil/include/drivers/mk_4G.h new file mode 100644 index 0000000..6f6ebb9 --- /dev/null +++ b/keil/include/drivers/mk_4G.h @@ -0,0 +1,53 @@ +#include "board.h" +typedef enum{ +BIND_SUCCESS=1, +UNBIND, +OPEN_GNSS, +CLOSE_VIBRATION, +QUARY_INFORMATION, +CHANGE_POLL_FREQUENCY, +OPEN_VIBRATION, +}Message_RecvState; + +typedef enum +{ + HEART = 0, + ALARM, + POSITION, +} Message_SendState; + +typedef enum +{ + OPEN_DEPART_ALARM = 0, + CLOSE_ALARM, + DISASSEMBLE, +} Message_AlarmState; +typedef struct{ +Message_SendState type; +uint16_t tagId; +bool bindState; +uint16_t gunLableId; +Message_AlarmState alarmType; +double power; +uint16_t warnDistence; +uint16_t alarmDistence; +double lng; +double lat; +uint16_t applyId; +int result; +}Commend_SendDate; + +typedef struct{ +Message_RecvState type; +char applyID[10]; +uint16_t tagId; +uint16_t gunLableId; +uint16_t warnDistance; +uint16_t alarmDistance; +uint8_t frequency; + +}Commend_Datestruct; +void message_from_4G_Handler(void); +void gnss_forceopen(void); +void bind_reset(void); +void message_construct(void); \ No newline at end of file diff --git a/keil/include/drivers/mk_misc.c b/keil/include/drivers/mk_misc.c index 5fbbdb2..ef10f07 100644 --- a/keil/include/drivers/mk_misc.c +++ b/keil/include/drivers/mk_misc.c @@ -389,7 +389,24 @@ // reboot reset_module(RESET_MODULE_REBOOT); } - +void delay_US(uint32_t nTimer) +{ + uint32_t i=0; + for(i=0;i<nTimer;i++){ + __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP(); + __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP(); + __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP(); + __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP(); + __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP(); + __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP(); + __NOP();__NOP();__NOP();__NOP(); + } +} +void delay_ms(uint32_t nTimer) +{ + uint32_t i=1000*nTimer; + delay_US(i); +} void delay_us(uint32_t cnt) { #define SYSTEM_CLOCK_MHZ 62.4 diff --git a/keil/include/drivers/mk_power.c b/keil/include/drivers/mk_power.c index a330de8..272118d 100644 --- a/keil/include/drivers/mk_power.c +++ b/keil/include/drivers/mk_power.c @@ -586,7 +586,7 @@ } #endif } - +uint8_t state_flag=0; static void power_clear_if_power_mode(void) { power_mode_clear(POWER_UNIT_UART); @@ -670,6 +670,7 @@ if (power_env.power_request[POWER_MODE_ACTIVE]) { + state_flag=1; // stay in active mode } else @@ -682,16 +683,19 @@ if (power_env.power_request[POWER_MODE_ACTIVE]) { // stay in active mode + state_flag=2; } else if (power_env.power_request[POWER_MODE_SLEEP]) { // enter sleep mode + state_flag=3; power_enter_sleep_mode(); } else if (power_env.power_request[POWER_MODE_POWER_DOWN]) { // enter power down mode // board_led_on(BOARD_LED_1); + state_flag=4; power_enter_power_down_mode(0); // board_led_off(BOARD_LED_1); wakeup_from_power_down = 1; @@ -700,12 +704,14 @@ { // enter deep power down mode // board_led_on(BOARD_LED_2); + state_flag=5; power_enter_power_down_mode(1); // board_led_off(BOARD_LED_2); wakeup_from_power_down = 1; } else { + state_flag=6; power_enter_shelf_mode(); } diff --git a/keil/include/drivers/sn74hc595.c b/keil/include/drivers/sn74hc595.c new file mode 100644 index 0000000..1c58ab3 --- /dev/null +++ b/keil/include/drivers/sn74hc595.c @@ -0,0 +1,149 @@ + +#include "sn74hc595.h" +void IO_control_init(void) +{ +//SDA->SER + io_open_drain_set(SER_PIN, 0); + io_pin_mux_set(SER_PIN,IO_FUNC0);//把原先io SDA变为普通GPIO + gpio_pin_set_dir(SER_PIN , GPIO_DIR_OUT, 0);//复用原先GPIO引脚为SER + io_pull_set(SER_PIN , IO_PULL_DOWN, IO_PULL_UP_LEVEL4); +//SRCLK + io_pin_mux_set(SRCLK_PIN,IO_FUNC0); + gpio_pin_set_dir(SRCLK_PIN , GPIO_DIR_OUT, 0); + io_pull_set(SRCLK_PIN , IO_PULL_DOWN, IO_PULL_UP_LEVEL4); +//RCLK + io_pin_mux_set(RCLK_PIN,IO_FUNC0); + gpio_pin_set_dir(RCLK_PIN , GPIO_DIR_OUT, 0); + io_pull_set(RCLK_PIN , IO_PULL_DOWN, IO_PULL_UP_LEVEL4); +} +uint8_t data_temp,temp_bit; +void IO_LED_control_change(uint8_t data) +{ + data_temp=data; + uint8_t temp; + for(int i=0; i<8; i++) { + temp=data&1; + temp_bit=temp; + if(temp)//写入低位数据 + SER_1; + else + SER_0; + SRCLK_1;//将数据放入移位寄存器 + SRCLK_0; + data>>=1; + } + RCLK_1;//将数据存入存储器并输出 + RCLK_0; +} +//高电平开启power,低电平关闭power +void gps_air780_power_change(uint8_t gps_state,uint8_t air_state) +{ + gps_power_state=gps_state; + air780_power_state=air_state; + update_led_power_state();//更新控制引脚 +} +void update_led_power_state(void) +{ + uint8_t control_state=air780_power_state<<7|gps_power_state<<6|motor_power_state<<5|uwb_state<<4|gps_success_state<<3|air780_success_state<<2|red_charge_state<<1|green_charge_state; + IO_LED_control_change(control_state); +} +void blink_led(uint8_t*state) +{ if(*state==0) + *state=1; + else { + *state=0; + } + update_led_power_state(); + delay_us(1000); + if(*state==0) + *state=1; + else { + *state=0; + } + update_led_power_state(); +} + +void gps_led_on(void) +{ + gps_success_state=1;//uwb亮起 + update_led_power_state(); +} +void gps_led_off(void) +{ + gps_success_state=0;//uwb灭 + update_led_power_state(); +} +void uwb_led_on(void) +{ + uwb_state=1;//uwb亮起 + update_led_power_state(); +} +void uwb_led_off(void) +{ + uwb_state=0;//uwb灭 + update_led_power_state(); +} +void air780_led_on(void) +{ + air780_success_state=1;//uwb亮起 + update_led_power_state(); +} +void air780_led_off(void) +{ + air780_success_state=0;//uwb灭 + update_led_power_state(); +} +void charge_red_on(void) +{ + red_charge_state=1;//充电红灯亮起 + update_led_power_state(); +} +void charge_red_off(void) +{ + red_charge_state=0;//充电红灯熄灭 + update_led_power_state(); +} +void charge_green_on(void) +{ + green_charge_state=1;//充电绿灯亮起 + update_led_power_state(); +} +void charge_green_off(void) +{ + green_charge_state=0;//充电绿灯熄灭 + update_led_power_state(); +} + +void charge_state_change(void) +{ + if(gpio_pin_get_val(INPUT_5V_Pin)) + { + if(bat_percent==100) + { + red_charge_state=0; + green_charge_state=1; + }else{ + red_charge_state=1; + green_charge_state=0; + } + enbale_blink_flag=0; + update_led_power_state(); + }else{ + if(bat_percent>15) + { + charge_green_off(); + charge_red_off(); + enbale_blink_flag=0; + }else{ +// green_charge_state=0; +// if(secondtask_count%2==0) +// { +// red_charge_state=0; +// }else{ +// red_charge_state=1; +// } +// update_led_power_state(); + enbale_blink_flag=1; + } + } +} \ No newline at end of file diff --git a/keil/include/drivers/sn74hc595.h b/keil/include/drivers/sn74hc595.h new file mode 100644 index 0000000..2672a96 --- /dev/null +++ b/keil/include/drivers/sn74hc595.h @@ -0,0 +1,16 @@ +#include "board.h" +#define SER_1 gpio_pin_set(SER_PIN) +#define SER_0 gpio_pin_clr(SER_PIN) +#define SRCLK_1 gpio_pin_set(SRCLK_PIN) +#define SRCLK_0 gpio_pin_clr(SRCLK_PIN) +#define RCLK_1 gpio_pin_set(RCLK_PIN) +#define RCLK_0 gpio_pin_clr(RCLK_PIN) + +void gps_air780_power_change(uint8_t gps_state,uint8_t air_state); +void IO_LED_control_change(uint8_t data); +void IO_control_init(void); +void update_led_power_state(void); + +void uwb_led_off(void); +void uwb_led_on(void); +extern uint8_t bat_percent,enbale_blink_flag,gps_power_state,motor_power_state,uwb_state,air780_power_state,gps_success_state,red_charge_state,green_charge_state,air780_success_state; \ No newline at end of file diff --git a/keil/include/drivers/uwb_app.c b/keil/include/drivers/uwb_app.c new file mode 100644 index 0000000..a91ff99 --- /dev/null +++ b/keil/include/drivers/uwb_app.c @@ -0,0 +1,1137 @@ +#include "mk_trace.h" +#include "mk_uwb.h" +#include "mk_phy.h" +#include "mk_misc.h" +#include "mk_power.h" +#include "mk_sleep_timer.h" +#include "lib_ranging.h" +#include "lib_aoa.h" +#include "dw_app_anchor.h" +#include "global_param.h" +#include "board.h" +#include "lib_aoa.h" + +extern int simple_main(void); +extern int temp_main(void); +void Calibration_Time(void); +void TagListUpdate(void); +void TagListUpdate_person_num(void); +void Uwb_init(void); +void OpenUWB(void); +void CloseUWB(void); +int Anchor_App(void); +extern void IO_LED_control_change(uint8_t data); +extern void IO_control_init(void); + +extern void updata_led_power_state(void); +/*receive buffer*/ +static uint8_t rx_buf[150]; +static uint8_t uwb_sendbuffer[150]; +static volatile uint16_t rx_state; +static volatile uint16_t rx_length; + +//resp变量 +static uint8_t frame_seq_nb2,battary,button,rec_nearbase_num,ancidlist_num; +static uint16_t ancidlist_rec[TAG_NUM_IN_SYS],ancidlist_send[TAG_NUM_IN_SYS],rec_ancidlist[TAG_NUM_IN_SYS]; +static int16_t rec_ancdistlist[TAG_NUM_IN_SYS]; +extern uint8_t group_id; +static uint16_t anc_id_recv,tag_id_recv; +static int16_t rec_antdelay; +extern uint32_t dev_id; +static uint16_t taglist_pos,tmp_time; +extern uint16_t tag_frequency; +extern uint16_t disoffset; +static uint8_t frame_len,recpoll_len,current_syncid,new_tagid,seize_anchor,result,g_start_sync_flag; +extern uint8_t gps_power_state,motor_power_state,uwb_state,air780_power_state,gps_success_state,red_charge_state,green_charge_state,air780_success_state; +int poll_rx_num,resp_tx_num; +//resp函数 +void PushAnchorDataArray(uint16_t ancid,int16_t dist,uint8_t battary);//找到自己的id信息对应位置更新自己的交互信息 +static void resp_msg_set_ts(uint8_t *ts_field, int64_t ts);//用来对应位置放入时间戳 +static uint16_t tagid_list[TAG_NUM_IN_SYS]; +uint16_t CmpTagInList(uint16_t tagid); +uint8_t Anchor_RecNearPoll(uint8_t ancrec_nearbasepos); +static uint8_t send_buffer[100]; +static uint8_t tagofflinetime[TAG_NUM_IN_SYS]; +uint32_t temp_count=0; +uint32_t temp_count1=0; +uint32_t temp_count2=0; +uint32_t temp_count3=0; +uint32_t temp_count7=0; +uint32_t temp_internal=0; +int16_t elevation = 0; +int16_t azimuth = 0; +uint8_t fom = 0; +int32_t distance; +uint8_t taglist_num; +float *sts_rssi=NULL; + uint8_t recev_error_num; +uint8_t uwb_rx_flag; +//extern Operation_step UWB_work_state; +extern int16_t first_search_flag; +typedef enum +{ + SEARCH, + CLOSE, + RANGE, +}enumwltagstate; +/* Ranging period */ +#define RANGING_PERIOD_MS (1000) + +/* This is the delay from Frame RX POLL frame to send RESP Frame */ +#define POLL_RX_TO_RESP_TX_DLY_US 550U //yuan550极限 + +#define RESP_TX_TO_FINAL_RX_DLY_US 500U + +/* RX sync window size 50 ms*/ +#define RX_SYNC_WIN_US 5000U //yuan1000 7000success + +/* RX sync window size 50 ms*/ +#define RX_SYNC_WIN_US_TEMP 2000000U //yuan1000 7000success + +/* Receive poll timeout 500us*/ +#define POLL_RX_TIMEOUT_US 500 + +/* Receive final timeout 500us */ +#define FINAL_RX_TIMEOUT_US 500 + +/* RX window open in advance */ +#define RX_WIN_IN_ADVANCE_US (150) + +#define DELAY_BETWEEN_TWO_FRAME_UUS 500 //yuan1400 + +/* Field index in frame */ +#define MSG_SEQ_NUM_IDX 2 +#define FINAL_MSG_POLL_TX_TS_IDX 10 +#define FINAL_MSG_RESP_RX_TS_IDX 14 +#define FINAL_MSG_FINAL_TX_TS_IDX 18 +#define DELAY_DEFAULT 1000 +#define HALF_SECOND_TIME 624000000 +/* Length of the common part of the message */ +#define MSG_COMMON_LEN 10 + +#define UWB_DELAY_TIME_US 496 +static uint8_t receive_flag=0; +struct mk_uwb_configure +{ + uint8_t phy_work_mode; /* PHY_TX / PHY_RX / PHT_TX|PHY_RX */ + struct UWB_CONFIG_T phy_cfg; +}; + +///* Default communication configuration. */ +//static struct mk_uwb_configure config = {//原来的基站非110k代码 +// .phy_work_mode = (uint8_t)(PHY_TX | PHY_RX), +// .phy_cfg.ch_num = 5, /* Channel number. */ +// .phy_cfg.code_index = 9, /* TX preamble code. */ +// .phy_cfg.mean_prf = MEAN_PRF_64M, /* Data rate 6.8M */ +// .phy_cfg.data_bit_rate = DATA_BR_6M8, /* data rate 6.8M. */ +// .phy_cfg.sync_sym = PREAM_LEN_128, /* Preamble duration, length of preamble 128 */ +// .phy_cfg.sfd_sym = BPRF_NSFD2_8, /* Identifier for SFD sequence */ +// .phy_cfg.ranging_bit = 1, /* ranging bit set. */ +// .phy_cfg.trx_mode = TRX_MODE_15_4Z_BPRF, /* IEEE802.15.4z - BPRF mode */ +// .phy_cfg.sts_pkt_cfg = STS_PKT_CFG_0, /* SP0 Frame */ +// .phy_cfg.sts_segnum = STS_SEGNUM_BPRF_1, /* Number of STS segments in the frame */ +// .phy_cfg.sts_seglen = STS_SEGLEN_BPRF_64, /* Number of symbols in an STS segment */ +// .phy_cfg.rx_ant_id = UWB_RX_ANT_3, /* UWB RX antenna port */ +//}; +#ifdef DW1000 +static struct mk_uwb_configure config = { + .phy_work_mode = (uint8_t)(PHY_TX | PHY_RX), + .phy_cfg.ch_num = 5, /* Channel number. */ + .phy_cfg.code_index = 9, /* TRX preamble code */ + .phy_cfg.mean_prf = MEAN_PRF_64M, /* Mean prf 64/128/256M */ + .phy_cfg.data_bit_rate = DATA_BR_6M8, /* Data rate 6.8M */ + .phy_cfg.sync_sym = PREAM_LEN_128, /* Preamble duration, length of preamble 128 */ + .phy_cfg.sfd_sym = NON_STD_NSFD5_8, /* Identifier for SFD sequence */ + .phy_cfg.ranging_bit = 1, /* ranging bit set 1 */ + .phy_cfg.trx_mode = TRX_MODE_15_4A, /* IEEE802.15.4z - BPRF mode */ + .phy_cfg.sts_pkt_cfg = STS_PKT_CFG_0, /* SP0 Frame */ + .phy_cfg.sts_segnum = STS_SEGNUM_BPRF_1, /* Number of STS segments in the frame */ + .phy_cfg.sts_seglen = STS_SEGLEN_BPRF_64, /* Number of symbols in an STS segment */ + .phy_cfg.rx_ant_id = UWB_RX_ANT_3, /* UWB RX antenna port */ +}; +#elif defined STS_MODE +static struct mk_uwb_configure config = { + .phy_work_mode = (uint8_t)(PHY_TX | PHY_RX), + .phy_cfg.ch_num = 5, /* Channel number. */ + .phy_cfg.code_index = 9, /* TRX preamble code */ + .phy_cfg.mean_prf = MEAN_PRF_64M, /* Mean prf 64/128/256M */ + .phy_cfg.data_bit_rate = DATA_BR_6M8, /* Data rate 6.8M */ + .phy_cfg.sync_sym = PREAM_LEN_128, /* Preamble duration, length of preamble 128 */ + .phy_cfg.sfd_sym = BPRF_NSFD2_8, /* Identifier for SFD sequence */ + .phy_cfg.ranging_bit = 1, /* ranging bit set 1 */ + .phy_cfg.trx_mode = TRX_MODE_15_4Z_BPRF, /* IEEE802.15.4z - BPRF mode */ + .phy_cfg.sts_pkt_cfg = STS_PKT_CFG_1, /* SP1 Frame */ + .phy_cfg.sts_segnum = STS_SEGNUM_BPRF_1, /* Number of STS segments in the frame */ + .phy_cfg.sts_seglen = STS_SEGLEN_BPRF_64, /* Number of symbols in an STS segment */ + .phy_cfg.rx_ant_id = UWB_RX_ANT_3, /* UWB RX antenna port */ +}; +/* Use the default key and IV specified in the IEEE 802.15.4z attachment */ +static struct UWB_STS_KEY_CONFIG_T sts_iv_key = { + .sts_vcounter = 0x1F9A3DE4, + .sts_vupper0 = 0xD37EC3CA, + .sts_vupper1 = 0xC44FA8FB, + .sts_vupper2 = 0x362EEB34, + .sts_key0 = 0x14EB220F, + .sts_key1 = 0xF86050A8, + .sts_key2 = 0xD1D336AA, + .sts_key3 = 0x14148674, +}; +#elif defined MK_MODE +static struct mk_uwb_configure config = { + .phy_work_mode = (uint8_t)(PHY_TX | PHY_RX), + .phy_cfg.ch_num = 9, /* Channel number. */ + .phy_cfg.code_index = 9, /* TX preamble code. */ + .phy_cfg.mean_prf = MEAN_PRF_64M, /* Data rate 6.8M */ + .phy_cfg.data_bit_rate = DATA_BR_6M8, /* data rate 6.8M. */ + .phy_cfg.sync_sym = PREAM_LEN_128, /* Preamble duration, length of preamble 128 */ + .phy_cfg.sfd_sym = BPRF_NSFD2_8, /* Identifier for SFD sequence */ + .phy_cfg.ranging_bit = 1, /* ranging bit set. */ + .phy_cfg.trx_mode = TRX_MODE_15_4Z_BPRF, /* IEEE802.15.4z - BPRF mode */ + .phy_cfg.sts_pkt_cfg = STS_PKT_CFG_0, /* SP0 Frame */ + .phy_cfg.sts_segnum = STS_SEGNUM_BPRF_1, /* Number of STS segments in the frame */ + .phy_cfg.sts_seglen = STS_SEGLEN_BPRF_64, /* Number of symbols in an STS segment */ + .phy_cfg.rx_ant_id = UWB_RX_ANT_3, /* UWB RX antenna port */ +}; +#endif + +static struct anchor_id_car{ + uint16_t anchor_new_id; + uint16_t change_num; +}; +/* Buffer to store received frame */ + +/* Frames used in the ranging process + * Poll message: + * - byte 0 - 1: 0x8841 to indicate a data frame using 16-bit addressing. + * - byte 2: sequence number, incremented for each new frame. + * - byte 3 - 4: PAN Id 0x4B4d + * - byte 5 - 6: Destination address + * - byte 7 - 8: Source address + * - byte 9: Message type (0x02 RANGING_POLL / 0x03 RANGING_RESPONSE / 0x04 RANGING_FINAL) + * Response message: + * - byte 10: activity code (0x07 to tell the initiator to go on with the ranging exchange) + * Final message: + * - byte 10 - 13: poll message transmission timestamp. + * - byte 14 - 17: response message reception timestamp. + * - byte 18 - 21: final message transmission timestamp. + */ +static uint8_t rx_poll_msg[] = {0x41, 0x88, 0, 0x4D, 0x4B, 0x53, 0x45, 0x4D, 0x49, 0x02}; +static uint8_t tx_resp_msg[] = {0x41, 0x88, 0, 0x4D, 0x4B, 0x4D, 0x49, 0x53, 0x45, 0x03, 0x07}; +static uint8_t rx_final_msg[] = {0x41, 0x88, 0, 0x4D, 0x4B, 0x53, 0x45, 0x4D, 0x49, 0x04, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + +/* Count value of phy counter when transmitting and receiving frames */ +static uint32_t poll_rx_en_start_u32; +static uint32_t resp_tx_en_start_u32; +static uint32_t resp_tx_timeout; +int64_t temp_resp_i64; +/* 41 bits timestamps of frames transmission/reception. */ +int64_t poll_rx_ts_i64; +int64_t resp_tx_ts_i64; +int64_t final_rx_ts_i64; + +/* Frame sequence number, incremented after each transmission. */ +static uint8_t frame_seq_nb = 0; + +/* MAC report data structure */ +static struct MAC_HW_REPORT_T rx_rpt; + +enum SIMPLE_FSM_T +{ + SIMPLE_IDLE = 0, + SIMPLE_POLL = 1, + SIMPLE_RESPONSE = 2, + SIMPLE_FINAL = 3, +}; + +static enum SIMPLE_FSM_T state = SIMPLE_IDLE; + +/** + * @brief Correct TX timestamp of the ranging frame. + * + * @param[in] timestamp PHY timer count of TX + * @return TX timestamp (unit: 15.65ps) + */ +static int64_t ranging_tx_time_correct(uint32_t timestamp) +{ + int64_t tx_timestamp = ranging_tx_time(timestamp); + + // correct antenna delay (TX using the same antenna as RX) + tx_timestamp += ranging_ant_delays_get(config.phy_cfg.rx_ant_id) / 2; + + return tx_timestamp; +} + +/** + * @brief Correct RX timestamp of the ranging frame. + * + * @param[in] ind MAC RX report + * @return RX timestamp (unit: 15.65ps) + */ +static int64_t ranging_rx_time_correct(const struct MAC_HW_REPORT_T *ind) +{ + int64_t rx_timestamp = ranging_rx_time(ind); + + // correct antenna delay + rx_timestamp -= ranging_ant_delays_get(config.phy_cfg.rx_ant_id) / 2; + + return rx_timestamp; +} + +/* RX done process handler. */ +int8_t rssi; +uint32_t range_timeout_us = 2000000,dev_id;//yuan5000 +uint8_t flag_temp2,flag_temp1,group_id; +uint16_t uwb_losttimer,disoffset; +static void rx_int_callback(struct MAC_HW_REPORT_T *rx_report) +{ uint8_t valid_sts=0; + // Power off radio + power_off_radio(); + + /** UWB RX success */ + if (rx_report->err_code == UWB_RX_OK) + { + /* Received data does not contain FCS */ + rx_length = rx_report->pkt_len; + memcpy(rx_buf, rx_report->pkt_data, rx_length); + memcpy(&rx_rpt, rx_report, sizeof(struct MAC_HW_REPORT_T)); + /* Calculate rx timestamp */ + temp_count= phy_timer_count_get(); + poll_rx_en_start_u32 = rx_rpt.timestamp - phy_shr_duration(); + poll_rx_ts_i64 = ranging_rx_time_correct(&rx_rpt); + poll_rx_num++; + rssi = rx_report->rssi; + receive_flag=1; + Anchor_App(); + #ifdef STS_MODE + valid_sts= sts_valid_check(); + if (valid_sts) + { + aoa_calculate(&elevation, &azimuth); + aoa_fom_get(NULL, &fom); +// float pdoa[3]; +// pdoa[0] = pdoa_select_get(0, 3); +// pdoa[1] = pdoa_select_get(1, 3); +// pdoa[2] = pdoa_select_get(2, 3); +// LOG_INFO(TRACE_MODULE_APP, "PDOA: %f %f %f\r\n", pdoa[0], pdoa[1], pdoa[2]); + + sts_rssi = sts_rssi_output_get(); + } + #endif + } + else + { + /* UWB_PLD_ERR payload error */ + /* UWB_PHR_ERR PHR error */ + /* UWB_SFD_ERR Sfd error */ + /* UWB_BD_ERR Preamble detection error */ + /* UWB_TO_ERR Receive timeout */ + /* UWB_STS_ERR STS error */ + temp_count= phy_timer_count_get(); + memcpy(&rx_rpt, rx_report, sizeof(struct MAC_HW_REPORT_T)); + rx_length = 0; + // OpenUWB();//再次开启UWB接收 + } + OpenUWB();//再次开启UWB接收 +} + +/* TX done process handler. */ +static void tx_int_callback(struct MAC_HW_REPORT_T *tx_report) +{ + // Power off radio + power_off_radio(); + + /** UWB TX success */ + if (tx_report->err_code == UWB_TX_OK) + { + temp_count= phy_timer_count_get(); + temp_internal=temp_count; + resp_tx_num++; + // OpenUWB();//再次开启UWB接收 + //LOG_INFO(TRACE_MODULE_APP, "poll_rx_num is %d,resp_tx_num is %d\r\n",poll_rx_num,resp_tx_num); + } +} +uint32_t start_receive_count,end_receive_count,poll_timeout,current_count,temp_resp; + uint16_t anchordata_id[TAG_NUM_IN_SYS],anchordata_dist[TAG_NUM_IN_SYS]; +static uint8_t anchordata_bat[TAG_NUM_IN_SYS]; +uint8_t anchordata_num = 0; +static int32_t tagdist_list[TAG_NUM_IN_SYS]; +uint16_t random_time; +//anchor +int32_t hist_dist; +int16_t temp_recdist_before_offset; +int16_t dist_temp; +void PushAnchorDataArray(uint16_t ancid,int16_t dist,uint8_t battary) +{ + uint8_t i; + for(i=0; i<anchordata_num; i++) + { + if(anchordata_id[i] == ancid)//查询标签是否在自己已通讯列表中 + { + + break; + } + } + if(i==anchordata_num) + { + if(anchordata_num<TAG_NUM_IN_SYS-1) + anchordata_num++; + } + anchordata_id[i] = ancid;//与之通信的标签id存入当前表中 + distance=dist*0.5+(int16_t)anchordata_dist[i]*0.5; + anchordata_dist[i] = dist; + anchordata_bat[i] = battary; + tagofflinetime[i]=0;//不断更新当前TAG对应离线时间 + dist_temp=dist; +// if(dist>0) + +// if(temp_recdist_before_offset!=0&&distance!=0x1ffff) +// { +// distance=dist*0.5+distance*0.5; +// }else{ +// distance=dist; +// } + +} +//uint16_t CmpTagInList(uint16_t tagid) +//{ uint16_t i; +// for(i=0; i<taglist_num; i++) +// { +// if(memcmp(&tagid,&anchordata_id[i],2)==0) +// break; +// } +// if(i==taglist_num) +// return taglist_num; +// //tagofflinetime[i] = 0; +// return i; +//}yuan +uint16_t CmpTagInList(uint16_t tagid) +{ uint16_t i; + for(i=0; i<taglist_num; i++) + { + if(memcmp(&tagid,&tagid_list[i],2)==0) + break; + } + return i; +} +uint16_t ExistInTagList(uint16_t tagid) +{ uint16_t i; + for(i=0; i<taglist_num; i++) + { + if(memcmp(&tagid,&tagid_list[i],2)==0) + return 1; + } + return 0; +} + +uint16_t CmpCarInExistList(uint16_t tagid) +{ uint16_t i; + for(i=0; i<anchordata_num; i++) + { + if(memcmp(&tagid,&anchordata_id[i],2)==0) + break; + } + if(i==anchordata_num) + return anchordata_num; + //tagofflinetime[i] = 0; + return i; +} + +static void resp_msg_set_ts(uint8_t *ts_field, int64_t ts) +{ + int i,ts2; + ts2=(int32_t)ts; + for (i = 0; i < 4; i++) + { + ts_field[i] = (uint8_t)ts2; + ts2 >>= 8; + } +} + +//void TagListUpdate(void) +//{ +// uint8_t i,j=0; +// for(i=0; i<anchordata_num; i++) +// { +// if(tagofflinetime[i]++<QUIT_SLOT_TIME) +// { +// anchordata_id[j]=anchordata_id[i]; +// tagofflinetime[j++]=tagofflinetime[i]; +// } +// } +// anchordata_num=j; +//} +void TagListUpdate(void) +{ +uint16_t i,j=0,k=0; + for(i=0; i<taglist_num; i++) + { + if(tagofflinetime[i]++<TAG_KEEPTIMES) + { + tagid_list[j]=tagid_list[i]; + tagdist_list[j] = tagdist_list[i]; + anchordata_bat[j]=anchordata_bat[i];//电量随之更新 + tagofflinetime[j++]=tagofflinetime[i]; + } + } + taglist_num=j; +} + +uint8_t position; +uint8_t Anchor_RecNearPoll(uint8_t ancrec_nearbasepos)//根据自己是否为新基站定制消息去发送,根据是否抢占判断 +{ + temp_count2=poll_rx_en_start_u32; + + memcpy(&send_buffer[GROUP_ID_IDX],&group_id,1);//组id + memcpy(&send_buffer[ANCHOR_ID_IDX],&dev_id,2);//自身id + memcpy(&send_buffer[TAG_ID_IDX],&tag_id_recv,2);//接受者id + send_buffer[MESSAGE_TYPE_IDX]=MBX_RESPONSE; + +// if(rec_nearbase_num == ancrec_nearbasepos)//抢占模式自己为新基站 +// { +// random_time = (phy_timer_count_get()%100);//多基站抢占一个位置时避免一个也收不到的情况就每一个随机错开几十uS +// //resp_tx_time = (poll_rx_ts+((random_time+rec_nearbase_num*20 + POLL_RX_TO_RESP_TX_DLY_UUS+ancrec_nearbasepos*DELAY_BETWEEN_TWO_FRAME_UUS) * UUS_TO_DWT_TIME)) >> 8;//计算Response发送时间T3。 +// // (resp_tx_en_start_u32) is the moment when TX enable +// resp_tx_en_start_u32 = phy_timer_count_get()+US_TO_PHY_TIMER_COUNT(20*rec_nearbase_num+POLL_RX_TO_RESP_TX_DLY_US+rec_nearbase_num*DELAY_BETWEEN_TWO_FRAME_UUS);//后面的需要根据已有基站数量进行更改,如果是抢占自己最后一个回复,要有底数 +// +// } else { +// //resp_tx_time = (poll_rx_ts + ((rec_nearbase_num*20+POLL_RX_TO_RESP_TX_DLY_UUS+ancrec_nearbasepos*DELAY_BETWEEN_TWO_FRAME_UUS) * UUS_TO_DWT_TIME)) >> 8;//计算Response发送时间T3。 +// resp_tx_en_start_u32 = phy_timer_count_get()+US_TO_PHY_TIMER_COUNT(20*rec_nearbase_num+POLL_RX_TO_RESP_TX_DLY_US+ancrec_nearbasepos*DELAY_BETWEEN_TWO_FRAME_UUS);//后面的需要根据已有基站数量进行更改,如果是抢占自己最后一个回复,要有底数 +// //这里应该有问题问一下钟工 +// }//此处设置绝对时间将poll u32改为phy_timer_count_get() + position=ancrec_nearbasepos; + resp_tx_en_start_u32 = poll_rx_en_start_u32+US_TO_PHY_TIMER_COUNT(POLL_RX_TO_RESP_TX_DLY_US)+ancrec_nearbasepos*US_TO_PHY_TIMER_COUNT(DELAY_BETWEEN_TWO_FRAME_UUS);//加入帧间隔 + resp_tx_ts_i64 = ranging_tx_time_correct(resp_tx_en_start_u32 + phy_shr_duration());//修正时间戳 + /* Write all timestamps in the final message. See NOTE 8 below. */ + resp_msg_set_ts(&send_buffer[RESP_MSG_POLL_RX_TS_IDX], poll_rx_ts_i64); + resp_msg_set_ts(&send_buffer[RESP_MSG_RESP_TX_TS_IDX], resp_tx_ts_i64);//此处时间戳int64直接转换为uint64不知道会不会有错误 + memcpy(&send_buffer[RESP_MSG_ANC_DISTOFFSET],&disoffset,2);//差个修正offset,修正有符号但是这个com表为无符号的,传过去直接赋给Int16_t相当于还原了 + temp_resp_i64=resp_tx_ts_i64; + temp_count3= phy_timer_count_get(); + flag_temp2=uwb_tx(send_buffer, 40,1 ,resp_tx_en_start_u32);//立即发送测试size大小 + tagofflinetime[taglist_pos] = 0;//更新标签通信 +// temp_count1=phy_timer_count_get(); + //while(mac_is_busy()); + ////gpio_pin_clr(SCL_PIN); +} + +uint16_t uwb_searchcount; +uint8_t flag_recsuccess; + +uint32_t start_receive_count_calibration; +uint32_t current_count_calibration; +uint32_t get_in_num,get_out_num; +struct anchor_id_car anchor_id_in_car[TAG_NUM_IN_SYS],anchor_id_out_car[TAG_NUM_IN_SYS]; +int16_t change_count[TAG_NUM_IN_SYS]; +uint16_t anchor_id_in[TAG_NUM_IN_SYS],anchor_id_out[TAG_NUM_IN_SYS]; +uint8_t secondtask_search_count,secondtask_search_flag; +extern uint8_t g_start_send_flag,search_open_flag = 1,link_success_flag,flag_secondtask; +enumwltagstate wltag_state=RANGE; +uint32_t wltag_statetimer,wltag_uwbtimer; +uint32_t uwbtasktimer=0,uwbtagsendtimer=0; +void IdleTask(void) +{ +//if(read_5v_input_pca()) +// { +// if(state5v==0) +// { +// state5v=1; +// state5V_prase_flag=state5v; +// gps_prase_flag=0;//解除gps解析 +// uart1_change_from_gps_to_debug();//测试 +// PCA9555_Set_One_Value_Output(MCU_A,1);//输出高电平切换为5V输入 +// } +// }else { +// if(state5v==1) +// { +// g_com_map[MODBUS_MODE] = 0; +// state5v=0; +// state5V_prase_flag=state5v; +// gps_prase_flag=1;//恢复gps解析 +// uart1_change_from_debug_to_gps();//测试 +// PCA9555_Set_One_Value_Output(MCU_A,0);//输出低电平切换为GPS +// } +// } +// UART_CheckReceive(); +} +uint16_t CmpCarInTable(uint16_t tagid) +{ uint16_t i; + for(i=0; i<get_in_num; i++) + { + if(memcmp(&tagid,&anchor_id_in[i],2)==0) + break; + } + if(i==get_in_num) + return get_in_num; + //tagofflinetime[i] = 0; + return i; +} +void Calibration_Time(void) +{ + current_count_calibration=phy_timer_count_get(); + if((current_count_calibration-start_receive_count_calibration>=MS_TO_PHY_TIMER_COUNT(500)||current_count_calibration+(UINT32_MAX-start_receive_count_calibration)>=MS_TO_PHY_TIMER_COUNT(500)) + &&!((end_receive_count-current_count_calibration<=MS_TO_PHY_TIMER_COUNT(200))||(end_receive_count+(UINT32_MAX-current_count_calibration)<=MS_TO_PHY_TIMER_COUNT(200)))) + { + start_receive_count_calibration=current_count_calibration;//更新开始时间 + + + if(secondtask_search_count++%2==0) + { + secondtask_search_flag = 1; + }else{ + secondtask_search_flag = 0; + } + if(secondtask_search_flag)//更新S时间TICK + { + HIDO_TimerTick(); + TagListUpdate(); +// GPS_Poll(); +// if(nomove_count<=g_com_map[NOMOVESLEEP_TIME])//防止溢出 +// nomove_count++; +// else{ +// nomove_count=g_com_map[NOMOVESLEEP_TIME]+1; +// } + } +// update_led_power_state();//更新等状态防止震动卡死在搜索 + } +} +uint16_t g_com_receive_id; +void CloseUWB(void) +{ + uwb_rx_force_off(1); + uwb_rx_flag=0; + //LOG_INFO(TRACE_MODULE_APP,"关闭uwb_rx\r\n"); +} +void OpenUWB(void) +{ + flag_temp1=uwb_rx(0, 0,range_timeout_us);//提交接收请求 + uwb_rx_flag=1; + //LOG_INFO(TRACE_MODULE_APP,"打开uwb_rx\r\n"); +} +void UWBOneSecondTask(void) +{ + TagListUpdate();//更新标签数 + uwb_losttimer++; + if(uwb_losttimer>g_com_map[UWB_RNAGE_TIME]) + uwb_losttimer=g_com_map[UWB_RNAGE_TIME]+1;//防止溢出 +} +void UWBIdleTask(void) +{ + + if(HIDO_TimerGetTick()-uwbtasktimer >=1) + { + uwbtasktimer = HIDO_TimerGetTick(); + UWBOneSecondTask(); + } +} +int uwb_app_poll(void) +{ +// switch(wltag_state) +// { +// case RANGE: +// if(HIDO_TimerGetTick()-wltag_uwbtimer>2&&uwb_rx_flag==0) +// { +// wltag_uwbtimer = HIDO_TimerGetTick(); +// OpenUWB(); +// } +// else if(HIDO_TimerGetTick()-wltag_uwbtimer>1&&uwb_rx_flag==1) +// { +// wltag_uwbtimer = HIDO_TimerGetTick(); +// CloseUWB(); +// } +// if(uwb_losttimer>g_com_map[UWB_RNAGE_TIME]) +// { +// wltag_statetimer = HIDO_TimerGetTick(); +// if(uwb_rx_flag==0)//若要切换到搜索模式时没有开启则开启UWB +// { +// OpenUWB(); +// } +// wltag_state = SEARCH; +// } +// break; +// case SEARCH: +// if(HIDO_TimerGetTick()-wltag_statetimer>1) +// { +// wltag_statetimer = HIDO_TimerGetTick(); +// wltag_state = CLOSE; +// CloseUWB(); +// } +// break; +// case CLOSE: +// if(HIDO_TimerGetTick()-wltag_statetimer>g_com_map[UWB_WAIT_TIME]) +// { +// wltag_statetimer = HIDO_TimerGetTick(); +// wltag_state = SEARCH; +// OpenUWB(); +// } +// break; +// } + UWBIdleTask(); +} +int Anchor_App(void) +{ + uint8_t i; + uint16_t tempid; + if(group_id==rx_buf[GROUP_ID_IDX]&&rx_buf[MESSAGE_TYPE_IDX] == MBX_POLL)//判断是否是和自己是同一组通讯的且为poll包 + { flag_recsuccess = 1; + wltag_state=RANGE;//成功后从search切换为range + memcpy(&g_com_receive_id,&rx_buf[TAG_ID_IDX],2); + //temp_count2=phy_timer_count_get(); + uwb_losttimer=0;//成功测距清0 lost时间 + frame_seq_nb2 = rx_buf[SEQUENCE_IDX];//获取包序 + battary = rx_buf[BATTARY_IDX]; + rec_nearbase_num=rx_buf[FZ_NEARBASENUM_INDEX]; //标签传过来的他与基站交互的基站id数目 + memcpy(&tag_id_recv,&rx_buf[TAG_ID_IDX],2); + memcpy(rec_ancidlist,&rx_buf[FZ_NEARBASEID_INDEX],2*rec_nearbase_num); + memcpy(rec_ancdistlist,&rx_buf[FZ_NEARBASEID_INDEX+2*rec_nearbase_num],2*rec_nearbase_num); + memcpy(&rec_antdelay,&rx_buf[FZ_NEARBASEID_INDEX+rec_nearbase_num*4],2); +// for(i=0; i<rec_nearbase_num; i++) +// { +// if(rec_ancidlist[i] == dev_id) +// { temp_recdist_before_offset=rec_ancdistlist[i]; +// rec_ancdistlist[i]+=(int16_t)g_com_map[DIST_OFFSET]; +// PushAnchorDataArray(tag_id_recv,rec_ancdistlist[i],battary); +// } +// } +// for(i=0; i<rec_nearbase_num; i++) +// { +// memcpy(&tempid,&rx_buf[FZ_NEARBASEID_INDEX+i*2],2); +// if(tempid==dev_id)//也是比id如果有就更新没有就抢占 +// { +// seize_anchor=0; //非抢占。已存在列表中 +// Anchor_RecNearPoll(i); +// break; +// } +// } + +// if(i==rec_nearbase_num) +// { +// seize_anchor=1; //抢占anchor +// Anchor_RecNearPoll(i); +// } + taglist_pos=CmpTagInList(tag_id_recv); + if(taglist_num>=ANC_MAX_NUM) + return 0; + for(i=0; i<rec_nearbase_num; i++) + { + memcpy(&tempid,&rx_buf[FZ_NEARBASEID_INDEX+i*2],2); + if(tempid==dev_id) + { + Anchor_RecNearPoll(i); + tagdist_list[taglist_pos]=rec_ancdistlist[i]; + anchordata_bat[taglist_pos] = battary;//保存该基站电量 + if(taglist_pos==taglist_num)// taglist_pos==taglist_num 说明这个基站不在当前列表中 + { //tempid==dev_id 说明基站下发测距报文有这个标签的信息 + taglist_num++; //满足上述两种情况才会添加基站ID进入列表中,否则会出现标签不在基站列表中,标签也不响应的情况 + tagid_list[taglist_pos] = tag_id_recv; + + } + break; + } + } + if((i==rec_nearbase_num&&taglist_pos==taglist_num)||(rec_nearbase_num==0&&!ExistInTagList(tag_id_recv)))//当基站不在标签列表中,标签也不在基站列表中时,随机找个时间片回复基站。 + { + Anchor_RecNearPoll(rec_nearbase_num); + } + } + + +} + +int UwbRange(void) +{ + uint8_t i; + uint16_t tempid; + // The following peripherals will be initialized in the uwb_open function + // phy/mac/aes/lsp/phy timers initialized + //uwb_open(); + +// // Set calibration parameters +// uwb_calibration_params_set(config.phy_cfg.ch_num); + +// // set advanced parameters +// struct PHY_ADV_CONFIG_T adv_config = { +// .thres_fap_detect = 40, +// .nth_scale_factor = 4, +// .ranging_performance_mode = 0, +// .skip_weakest_port_en = 0, +// }; +// phy_adv_params_configure(&adv_config); + +// // uwb configure +// uwb_configure(config.phy_work_mode, board_param.tx_power_fcc[CALIB_CH(config.phy_cfg.ch_num)], &config.phy_cfg); + +// ranging_frame_type_set(config.phy_cfg.sts_pkt_cfg); + + // Register rx interrupt callback function + //mac_register_process_handler(tx_int_callback, rx_int_callback); + + receive_flag = 0; + flag_recsuccess = 0; + temp_count3=phy_timer_count_get(); + //gpio_pin_set(SCL_PIN); + sts_lsp_store(); + flag_temp1=uwb_rx(0, 0, range_timeout_us);//开启接收 + + // while(mac_is_busy()); + // temp_count2=phy_timer_count_get(); + start_receive_count=phy_timer_count_get(); + poll_timeout=US_TO_PHY_TIMER_COUNT(range_timeout_us);//多一个多0.4ms默认0.4ms计算为0.125*4*100000,默认开启1mss + end_receive_count=start_receive_count+poll_timeout; + if(end_receive_count>=UINT32_MAX) + {end_receive_count-=UINT32_MAX;} + current_count=phy_timer_count_get(); + while(current_count<end_receive_count||current_count>end_receive_count+HALF_SECOND_TIME)//循环接受包体,若为124.8K则是+62400000 + { + current_count=phy_timer_count_get(); + while(mac_is_busy()) + { + Calibration_Time(); + IdleTask(); + current_count=phy_timer_count_get(); + if(current_count>end_receive_count&¤t_count<end_receive_count+HALF_SECOND_TIME) + { + break; + } + } + sts_lsp_store_stop(); + + + if(receive_flag==1)//成功接收 + { + + //if(group_id==rx_buf[GROUP_ID_IDX]&&rx_buf[MESSAGE_TYPE_IDX] == MBX_POLL&&!memcmp(&rx_buf[TAG_ID_IDX],&g_com_map[BIND_DEV_ID],2))//判断是否是和自己是同一组通讯的且为poll包 + if(group_id==rx_buf[GROUP_ID_IDX]&&rx_buf[MESSAGE_TYPE_IDX] == MBX_POLL)//判断是否是和自己是同一组通讯的且为poll包 + { flag_recsuccess = 1; + memcpy(&g_com_receive_id,&rx_buf[TAG_ID_IDX],2); +// sleep_timer_start(__MS_TO_32K_CNT(UWB_DELAY_TIME_US));//测试 + temp_count2=phy_timer_count_get(); + frame_seq_nb2 = rx_buf[SEQUENCE_IDX];//获取包序 + battary = rx_buf[BATTARY_IDX]; + rec_nearbase_num=rx_buf[FZ_NEARBASENUM_INDEX]; //标签传过来的他与基站交互的基站id数目 + memcpy(&tag_id_recv,&rx_buf[TAG_ID_IDX],2); + memcpy(rec_ancidlist,&rx_buf[FZ_NEARBASEID_INDEX],2*rec_nearbase_num); + memcpy(rec_ancdistlist,&rx_buf[FZ_NEARBASEID_INDEX+2*rec_nearbase_num],2*rec_nearbase_num); + memcpy(&rec_antdelay,&rx_buf[FZ_NEARBASEID_INDEX+rec_nearbase_num*4],2); + for(i=0; i<rec_nearbase_num; i++) + { + if(rec_ancidlist[i] == dev_id) + { temp_recdist_before_offset=rec_ancdistlist[i]; + rec_ancdistlist[i]+=(int16_t)g_com_map[DIST_OFFSET]; + PushAnchorDataArray(tag_id_recv,rec_ancdistlist[i],battary); + } + } + for(i=0; i<rec_nearbase_num; i++) + { + memcpy(&tempid,&rx_buf[FZ_NEARBASEID_INDEX+i*2],2); + if(tempid==dev_id)//也是比id如果有就更新没有就抢占 + { + seize_anchor=0; //非抢占。已存在列表中 + Anchor_RecNearPoll(i); + break; + } + } + + if(i==rec_nearbase_num) + { + seize_anchor=1; //抢占anchor + Anchor_RecNearPoll(i); + } + recev_error_num=0; + //range_timeout_us=5000;//恢复为5000进入range后 + //LOG_INFO(TRACE_MODULE_APP,"标签ID:%X,距离: %d 包序%d\r\n",g_com_receive_id,distance,frame_seq_nb2); + + + //gpio_pin_clr(SCL_PIN); + //break;去掉break变为一对多 + } + } + sts_lsp_store(); + + break; + //失败或者接受被高发射机打断都会再次开启接收 + //flag_temp1=uwb_rx(0, 0, range_timeout_us); + } + delay_us(1); + sts_lsp_store_stop(); + uwb_rx_force_off(1); + +// if(!flag_recsuccess) +// { +// //sleep_timer_start(__MS_TO_32K_CNT(UWB_DELAY_TIME_US-3));//测试 +// //LOG_INFO(TRACE_MODULE_APP,"测距失败,计数:%d\r\n",recev_error_num); +// if(recev_error_num++>5) +// { +// recev_error_num=0; +// UWB_work_state=SEARCH_DEV; +// uwb_searchcount = 0; +// search_open_flag = 1; +// } + //} + + + + return 0; +} +void Uwb_init(void) +{ + uwb_open(); + #ifdef STS_MODE + // Set STS key and IV + phy_sts_key_configure(&sts_iv_key); + + // which RX ports will be used for AoA/PDoA + phy_rx_ant_mode_set(RX_ANT_PORTS_COMBINATION); + #endif + // Set calibration parameters + uwb_calibration_params_set(config.phy_cfg.ch_num); + #ifndef STS_MODE + // set advanced parameters + struct PHY_ADV_CONFIG_T adv_config = { + .thres_fap_detect = 40, + .nth_scale_factor = 4, + .ranging_performance_mode = 0, + .skip_weakest_port_en = 0, + }; + #else + // set advanced parameters + struct PHY_ADV_CONFIG_T adv_config = { + .thres_fap_detect = 40, + .nth_scale_factor = 4, + .ranging_performance_mode = 3, + .skip_weakest_port_en = 0, + }; + #endif + phy_adv_params_configure(&adv_config); + + // uwb configure + uwb_configure(config.phy_work_mode, board_param.tx_power_fcc[CALIB_CH(config.phy_cfg.ch_num)], &config.phy_cfg); + #if (defined STS_MODE) || (defined MK_MODE) + ranging_lib_init(); + #endif + ranging_frame_type_set(config.phy_cfg.sts_pkt_cfg); + #ifdef STS_MODE + aoa_aux_info_set(AOA_AUX_ANT_IQ_RSSI_PDOA_AOA_FOM); + aoa_steering_vector_set((const float *)((uint32_t)((config.phy_cfg.ch_num == 9) ? svec_ch9_ptr : svec_ch5_ptr) | SRAM_BASE)); + + aoa_param_config(); + + phy_rx_sts_switch_mode_set(config.phy_cfg.sts_pkt_cfg, STS_SWITCH_EVERY_4SYM, 0, 0); + #endif + mac_register_process_handler(tx_int_callback, rx_int_callback);//初始化回调 +} + +//主函数绑定接受逻辑 +int UwbSearch(void) +{ + uint8_t i; + uint16_t tempid; + // The following peripherals will be initialized in the uwb_open function + // phy/mac/aes/lsp/phy timers initialized + uwb_open(); + #ifdef STS_MODE + // Set STS key and IV + phy_sts_key_configure(&sts_iv_key); + + // which RX ports will be used for AoA/PDoA + phy_rx_ant_mode_set(RX_ANT_PORTS_COMBINATION); + #endif + // Set calibration parameters + uwb_calibration_params_set(config.phy_cfg.ch_num); + + #ifndef STS_MODE + // set advanced parameters + struct PHY_ADV_CONFIG_T adv_config = { + .thres_fap_detect = 40, + .nth_scale_factor = 4, + .ranging_performance_mode = 0, + .skip_weakest_port_en = 0, + }; + #else + // set advanced parameters + struct PHY_ADV_CONFIG_T adv_config = { + .thres_fap_detect = 40, + .nth_scale_factor = 4, + .ranging_performance_mode = 3, + .skip_weakest_port_en = 0, + }; + #endif + phy_adv_params_configure(&adv_config); + + // uwb configure + uwb_configure(config.phy_work_mode, board_param.tx_power_fcc[CALIB_CH(config.phy_cfg.ch_num)], &config.phy_cfg); + + #ifdef STS_MODE + ranging_lib_init(); + #endif + ranging_frame_type_set(config.phy_cfg.sts_pkt_cfg); + + #ifdef STS_MODE + aoa_aux_info_set(AOA_AUX_ANT_IQ_RSSI_PDOA_AOA_FOM); + aoa_steering_vector_set((const float *)((uint32_t)((config.phy_cfg.ch_num == 9) ? svec_ch9_ptr : svec_ch5_ptr) | SRAM_BASE)); + + aoa_param_config(); + + phy_rx_sts_switch_mode_set(config.phy_cfg.sts_pkt_cfg, STS_SWITCH_EVERY_4SYM, 0, 0); + #endif + // Register rx interrupt callback function + mac_register_process_handler(tx_int_callback, rx_int_callback); + + receive_flag = 0; + temp_count3=phy_timer_count_get(); + //gpio_pin_set(SCL_PIN); + sts_lsp_store(); + flag_temp2=uwb_rx(0, 0, RX_SYNC_WIN_US_TEMP);//开启接收 + start_receive_count=phy_timer_count_get(); + poll_timeout=US_TO_PHY_TIMER_COUNT(2000000);//多一个多0.4ms默认0.4ms计算为0.125*4*100000,默认开启1mss + end_receive_count=start_receive_count+poll_timeout; + if(end_receive_count>=UINT32_MAX) + { + end_receive_count-=UINT32_MAX; + } + current_count=phy_timer_count_get(); + while(current_count<end_receive_count||current_count>end_receive_count+HALF_SECOND_TIME)//循环接受包体,若为124.8K则是+62400000 + { + while(mac_is_busy()) + { + IdleTask(); + current_count=phy_timer_count_get(); + if(current_count>end_receive_count&¤t_count<end_receive_count+HALF_SECOND_TIME) + { + break; + } + } + sts_lsp_store_stop(); + + + temp_count2=phy_timer_count_get(); + if(receive_flag==1)//成功接收 + { +// if(group_id==rx_buf[GROUP_ID_IDX]&&rx_buf[MESSAGE_TYPE_IDX] == MBX_POLL&&!memcmp(&rx_buf[TAG_ID_IDX],&g_com_map[BIND_DEV_ID],2))//判断是否是和自己是同一组通讯的且为poll包 + if(group_id==rx_buf[GROUP_ID_IDX]&&rx_buf[MESSAGE_TYPE_IDX] == MBX_POLL)//判断是否是和自己是同一组通讯的且为poll包 + { + sleep_timer_start(__MS_TO_32K_CNT(UWB_DELAY_TIME_US-13));//测试 + range_timeout_us=20000;//将下次range开启后超时时间设为20ms之后再range里恢复 + temp_count2=phy_timer_count_get(); + frame_seq_nb2 = rx_buf[SEQUENCE_IDX];//获取包序 + battary = rx_buf[BATTARY_IDX]; + rec_nearbase_num=rx_buf[FZ_NEARBASENUM_INDEX]; //标签传过来的他与基站交互的基站id数目 + memcpy(&tag_id_recv,&rx_buf[TAG_ID_IDX],2); + memcpy(rec_ancidlist,&rx_buf[FZ_NEARBASEID_INDEX],2*rec_nearbase_num); + memcpy(rec_ancdistlist,&rx_buf[FZ_NEARBASEID_INDEX+2*rec_nearbase_num],2*rec_nearbase_num); + memcpy(&rec_antdelay,&rx_buf[FZ_NEARBASEID_INDEX+rec_nearbase_num*4],2); + for(i=0; i<rec_nearbase_num; i++) + { + if(rec_ancidlist[i] == dev_id) + { + temp_recdist_before_offset=rec_ancdistlist[i]; + rec_ancdistlist[i]+=(int16_t)g_com_map[DIST_OFFSET]; + PushAnchorDataArray(tag_id_recv,rec_ancdistlist[i],battary); + } + } + for(i=0; i<rec_nearbase_num; i++) + { + memcpy(&tempid,&rx_buf[FZ_NEARBASEID_INDEX+i*2],2); + if(tempid==dev_id)//也是比id如果有就更新没有就抢占 + { + seize_anchor=0; //非抢占。已存在列表中 + Anchor_RecNearPoll(i); + break; + } + } + + if(i==rec_nearbase_num) + { + seize_anchor=1; //抢占anchor + Anchor_RecNearPoll(i); + } + + //gpio_pin_clr(SCL_PIN);//测试 + LOG_INFO(TRACE_MODULE_APP,"标签ID:%X,距离: %d 信号强度ANT0:%f,信号强度ANT2: %f\r\n",g_com_map[BIND_DEV_ID],distance,sts_rssi[0],sts_rssi[2]); + return 1;//返回发送成功标志 + } + + } + temp_count3=phy_timer_count_get(); + sts_lsp_store(); + flag_temp2=uwb_rx(0, 0, RX_SYNC_WIN_US_TEMP);//再次开启接收 + } + delay_us(2); + sts_lsp_store_stop(); + uwb_rx_force_off(1); + // LOG_INFO(TRACE_MODULE_APP,"超时定时器:%x,%x,%x\r\n",start_receive_count,end_receive_count,current_count); + //gpio_pin_clr(SCL_PIN);//测试 + return 0;//返回绑定失败标志 +} +//} + +#define SEARCH_TIMESTEMP 20 +//void UWBPoll(void) +//{ +// switch(UWB_work_state) +// { +// case LINK_SUCCESS: +// { //连接成功进行轮询测距 + +// uwb_led_on(); +// UwbRange(); +// uwb_led_off(); + +// } +// break; +// case SEARCH_DEV: +// { +// UWB_work_state=LINK_SUCCESS; +// Uwb_init(); +//// //接包不成功或者通讯失败进入搜索模式 +//// if(search_open_flag) +//// { +//// LOG_INFO(TRACE_MODULE_APP,"开启搜索\r\n"); +//// search_open_flag=0; +//// uwb_led_on(); +//// link_success_flag=UwbSearch();//第一次开启接收2s绑定失败后则进行下面1分钟后重新开启2s绑定流程 +//// uwb_led_off(); +//// if(link_success_flag) +//// UWB_work_state=LINK_SUCCESS; +//// }else{ +//// LOG_INFO(TRACE_MODULE_APP,"等待进入搜索模式:%d\r\n",SEARCH_TIMESTEMP-uwb_searchcount); +//// } + +// } +// break; +// case UN_BIND: +// { +// uwb_led_off();//关闭uwb指示灯 +// } +// break; +// } +// if(UWB_work_state==LINK_SUCCESS) +// { //成功时清0错误计数 +// uwb_searchcount=0; +// } +// if(UWB_work_state==SEARCH_DEV) +// { +// if(!search_open_flag) +// { +// if(uwb_searchcount++>SEARCH_TIMESTEMP) +// { +// uwb_searchcount=0; +// search_open_flag=1; +// } +// } +// //link_error_count+=g_com_map[COM_INTERVAL]; +// //if(link_error_count>=g_com_map[4G_INTERNAL]) +// //link_error_count=0; +// // update_led_power_state();//更新灯状态 +// } +// //LOG_INFO(TRACE_MODULE_APP,"UWB状态:%d\r\n",UWB_work_state); +//} + +//uint8_t GetUWBBindState(void) +//{ +// if(UWB_work_state == UN_BIND) +// { +// return 0; +// } +// return 1; +//} + diff --git a/keil/include/main/main.c b/keil/include/main/main.c index f98589e..0f062ee 100644 --- a/keil/include/main/main.c +++ b/keil/include/main/main.c @@ -109,7 +109,7 @@ // //***************************************************************************** #define WSF_BUF_POOLS 5 -void Fira_Ranging_Task(void); +void Fira_Change_Task(void); // Default pool descriptor. static wsfBufPoolDesc_t poolDescriptors[WSF_BUF_POOLS] = { {32, 26}, {64, 24}, {128, 4}, {256 + 32, 4}, {1024 + 32, 2}, @@ -191,13 +191,45 @@ break; } } -wsfHandlerId_t handlerId; -void Fira_Ranging_Task(void) + +void Fira_Change_Task(void) { - // +} +extern uint8_t normal_flag; +int main(void) +{ + // Initialize MCU system + board_init(); + + // Disable watchdog timer + wdt_close(WDT_ID0); + LOG_INFO(TRACE_MODULE_APP, "UCI FiRa example\r\n"); + + // Platform init for WSF + PalSysInit(); + + // Initialize os + + // + // Set up timers for the WSF scheduler. + // + WsfOsInit(); + WsfTimerInit(); + sys_tick_callback_set(WsfTimerUpdateTicks); + + // + // Initialize a buffer pool for WSF dynamic memory needs. + // + uint32_t wsfBufMemLen = WsfBufInit(WSF_BUF_POOLS, poolDescriptors); + + if (wsfBufMemLen > FREE_MEM_SIZE) + { + LOG_INFO(TRACE_MODULE_APP, "Memory pool is not enough %d\r\n", wsfBufMemLen - FREE_MEM_SIZE); + } +// // Create app task // - handlerId = WsfOsSetNextHandler(app_handler); + wsfHandlerId_t handlerId = WsfOsSetNextHandler(app_handler); app_init(handlerId); // @@ -239,38 +271,6 @@ uwb_app_config.filter_en = (uint8_t)(FILTER_EN); uwb_app_config.session_param.tx_power_level = board_param.tx_power_fcc[CALIB_CH(uwb_app_config.ppdu_params.ch_num)]; uwb_app_config.ppdu_params.rx_ant_id = (uint8_t)(RX_MAIN_ANT_PORT); -} -int main(void) -{ - // Initialize MCU system - board_init(); - - // Disable watchdog timer - wdt_close(WDT_ID0); - LOG_INFO(TRACE_MODULE_APP, "UCI FiRa example\r\n"); - - // Platform init for WSF - PalSysInit(); - - // Initialize os - - // - // Set up timers for the WSF scheduler. - // - WsfOsInit(); - WsfTimerInit(); - sys_tick_callback_set(WsfTimerUpdateTicks); - - // - // Initialize a buffer pool for WSF dynamic memory needs. - // - uint32_t wsfBufMemLen = WsfBufInit(WSF_BUF_POOLS, poolDescriptors); - - if (wsfBufMemLen > FREE_MEM_SIZE) - { - LOG_INFO(TRACE_MODULE_APP, "Memory pool is not enough %d\r\n", wsfBufMemLen - FREE_MEM_SIZE); - } - // diff --git a/keil/include/src/TCPClient.c b/keil/include/src/TCPClient.c new file mode 100644 index 0000000..e7869fe --- /dev/null +++ b/keil/include/src/TCPClient.c @@ -0,0 +1,448 @@ +/******************************************************************************* + * File Name : TCPClient.c + * Description : + * Created on : 2021?1?9? + * Author : www.hido-studio.com + *******************************************************************************/ + +/******************************************************************************* + * Include Files * + *******************************************************************************/ +#include "TCPClient.h" +#include "Socket.h" +#include "HIDO_Debug.h" +#include "Internet.h" +#include "string.h" +#include "HIDO_Timer.h" +#include "HIDO_Util.h" +#include "global_param.h" +#include "Uart.h" +#include "mk_4G.h" +#include "mk_trace.h" +#include "dw_app_anchor.h" +#include "PCA9555.h" +/******************************************************************************* + * Macro * + *******************************************************************************/ +#define STRCMP(cmd, header) strncmp((HIDO_CHAR *)_u8Data, header, sizeof(header) - 1) +/******************************************************************************* + * Type Definition * + *******************************************************************************/ +typedef enum +{ + TCP_CLIENT_STATE_IDLE, + TCP_CLIENT_STATE_CONNECTING, + TCP_CLIENT_STATE_CONNECTED, +} E_TCPClientState; + +/******************************************************************************* + * Local Variable * + *******************************************************************************/ +HIDO_INT32 l_i32TCPClientID = 0; +extern uint8_t gps_power_state; +static E_TCPClientState l_eTCPClientState = TCP_CLIENT_STATE_IDLE; +static HIDO_UINT32 l_u32HeartBeatTick = 0; +static HIDO_UINT8 l_au8CmdBuff[1024]; + +uint8_t TCPfail_flag = 0,flag_first_TCPconnect=1; +uint32_t TCPfailetimer; +uint16_t ip0,ip1,ip2,ip3,port; + +/******************************************************************************* + * Local Function Declaration * + *******************************************************************************/ +HIDO_INT32 TCPClient_Heartbeat(HIDO_VOID); +void TCPHeartBeatUpload(void); +void UDPClient_UploadGPS(void); +void TCPReceiveMessageReply(void); +/******************************************************************************* + * Local Function * + *******************************************************************************/ +/******************************************************************************* + * Function Name : TCPClient_DataProc + * Description : + * Input : + * Output : + * Return : + * Author : www.hido-studio.com + * Modified Date: : 2021年1月9日 + *******************************************************************************/ +extern uint8_t gps_4g_flag,search_open_flag,gps_open_flag,gps_wait_count,gps_need_data_flag,gps_wait_count2; +extern Operation_step UWB_work_state; +Commend_Datestruct TCP_command; +uint8_t result; +char applyid[10]; +uint16_t receive_id; +uint16_t g_com_position; +uint16_t g_com_num; +static HIDO_INT32 TCPClient_DataProc(HIDO_UINT8 *_u8Data, HIDO_UINT32 _u32Len) +{ + HIDO_CHAR *apcSplitStr[12]; + HIDO_UINT32 u32SplitCnt = 0; + HIDO_CHAR acResponse[200]; + HIDO_CHAR temp_acResponse[200]; + HIDO_CHAR acReadponse[200]; + HIDO_UINT32 datalenth; + HIDO_UINT32 u32ResponseLen; + HIDO_UINT32 u32ReadResponseLen; + LOG_INFO(TRACE_MODULE_APP, "收到数据\r\n"); + + + + if(STRCMP(_u8Data, "$setpara,") == 0) + { + u32ResponseLen = snprintf(acResponse, sizeof(acResponse), "$setparaok,%s\r\n", \ + _u8Data); + memcpy(temp_acResponse,acResponse,sizeof(acResponse)); + + u32SplitCnt = HIDO_UtilStrSplit((HIDO_CHAR *)_u8Data, ',', apcSplitStr, HIDO_ARRARY_COUNT(apcSplitStr)); + receive_id = HIDO_UtilHexStrToInt(apcSplitStr[1]); + + if(g_com_map[DEV_ID]==receive_id) + { + g_com_position=HIDO_UtilStrToInt(apcSplitStr[2]); + if(g_com_position!=CNT_RESTART&&g_com_position!=0&&g_com_position!=CNT_UPDATE) + { + Socket_Send(l_i32TCPClientID, (HIDO_UINT8 *)temp_acResponse, u32ResponseLen); + g_com_map[g_com_position]=HIDO_UtilStrToInt(apcSplitStr[3]); + } + if(g_com_map[SEND_4G_SECOND]<30) + { + gps_open_flag=0; + gps_wait_count=0; + gps_wait_count2=0; + gps_need_data_flag=1;//切换状态 + }else{ + gps_open_flag=1; + gps_wait_count=0; + gps_wait_count2=0; + gps_need_data_flag=1;//切换状态 + } + +// switch(TCP_command.type) +// { +// case BIND_SUCCESS: +// { + +// g_com_map[ALARM_DISTANCE1]= TCP_command.warnDistance; +// g_com_map[ALARM_DISTANCE2]=TCP_command.alarmDistance; +// // g_com_map[SEND_4G_FREQUENCY]=1000/TCP_command.frequency; +// if(g_com_map[BIND_DEV_ID]!=TCP_command.gunLableId) +// { +// g_com_map[BIND_DEV_ID]=TCP_command.gunLableId; +// UWB_work_state = SEARCH_DEV; +// search_open_flag = 1; +// } + + +// } +// break; +// case UNBIND: +// g_com_map[BIND_DEV_ID] = 0; +// UWB_work_state = UN_BIND; + + +// break; +// // bind_resetbreak(); +// case OPEN_GNSS: +// gps_4g_flag = 1; + +// break; + +// case CLOSE_VIBRATION: +// g_com_map[MOTOR_ENABLE]=0; + + +// break; +// case OPEN_VIBRATION: +// g_com_map[MOTOR_ENABLE]=1; + + +// break; +// case QUARY_INFORMATION: +// //?? + +// break; +// case CHANGE_POLL_FREQUENCY: + +// g_com_map[SEND_4G_SECOND]=TCP_command.frequency*60; +// break; +// } +// result = 1; +// TCPHeartBeatUpload(); +// if(TCP_command.type!=QUARY_INFORMATION||TCP_command.type!=OPEN_GNSS) + save_com_map_to_flash(); +// result = 0; +// memset(&applyid,0,8); + } + } else if(STRCMP(_u8Data, "$readpara,") == 0) + { + u32SplitCnt = HIDO_UtilStrSplit((HIDO_CHAR *)_u8Data, ',', apcSplitStr, HIDO_ARRARY_COUNT(apcSplitStr)); + receive_id = HIDO_UtilHexStrToInt(apcSplitStr[1]); + if(g_com_map[DEV_ID]==receive_id) + { + g_com_position=HIDO_UtilStrToInt(apcSplitStr[2]); + g_com_num= HIDO_UtilStrToInt(apcSplitStr[3]); + u32ReadResponseLen = snprintf(acReadponse, sizeof(acReadponse), "$replypara,%04x,%d", \ + receive_id,g_com_position); + for(uint16_t i=0;i<g_com_num;i++) + { + datalenth = sprintf((HIDO_CHAR *)&acReadponse[u32ReadResponseLen],",%d",g_com_map[g_com_position+i]); + u32ReadResponseLen += datalenth; + } + Socket_Send(l_i32TCPClientID, (HIDO_UINT8 *)acReadponse, u32ReadResponseLen); + } + } + return HIDO_OK; +} + +/******************************************************************************* + * Function Name : TCPClient_SocketEventProc + * Description : + * Input : + * Output : + * Return : + * Author : www.hido-studio.com + * Modified Date: : 2021?1?9? + *******************************************************************************/ +static HIDO_VOID TCPClient_SocketEventProc(HIDO_INT32 _i32SockID, E_SocketEvent _eEvent, HIDO_VOID *_pData) +{ + switch(_eEvent) + { + case SOCKET_EVENT_CONNECT_FAILED: + { + if(l_eTCPClientState == TCP_CLIENT_STATE_CONNECTING) + { + TCPfail_flag = 0; + l_eTCPClientState = TCP_CLIENT_STATE_IDLE; + } + + break; + } + case SOCKET_EVENT_CONNECTED: + { + if(l_eTCPClientState == TCP_CLIENT_STATE_CONNECTING) + { + l_eTCPClientState = TCP_CLIENT_STATE_CONNECTED; + } + break; + } + case SOCKET_EVENT_CLOSED: + { + TCPfail_flag = 0; + l_eTCPClientState = TCP_CLIENT_STATE_IDLE; + break; + } + case SOCKET_EVENT_RECV_DATA: + { + HIDO_INT32 i32Ret = 0; + HIDO_UINT32 u32RecvLen = 0; + + i32Ret = Socket_Recv(l_i32TCPClientID, l_au8CmdBuff, sizeof(l_au8CmdBuff) - 1, &u32RecvLen); + if(HIDO_OK == i32Ret) + { + TCPClient_DataProc(l_au8CmdBuff, u32RecvLen); + } + break; + } + default: + { + break; + } + } +} + +/******************************************************************************* + * Global Function * + *******************************************************************************/ +/******************************************************************************* + * Function Name : + * Description : + * Input : + * Output : + * Return : + * Author : www.hido-studio.com + * Modified Date: : 2021?1?9? + *******************************************************************************/ +extern uint8_t bat_percent,taglist_num; +uint8_t alarm_type; +extern double jd,wd; +extern int32_t distance; +extern gps_timeout_flag; +extern uint16_t g_spsum,g_snum,ave_sp; +void UDPClient_UploadGPS(void) +{ + HIDO_CHAR acHeart[200]; + HIDO_UINT32 u32HeartLen; + ave_sp = g_spsum/g_snum; + g_spsum = 0; + g_snum = 0; +// if(alarm_type==1) +// { +// u32HeartLen = snprintf(acHeart, sizeof(acHeart), "$message,alarm,%04x,%d,%04x,%d,%02u%%,%d,%d,%lf,%lf,%s,%d,%d,0\r\n", \ +// g_com_map[DEV_ID],GetUWBBindState(),g_com_map[BIND_DEV_ID],alarm_type,bat_percent,g_com_map[ALARM_DISTANCE1],g_com_map[ALARM_DISTANCE2],jd,wd,applyid,result,distance); +// } else { +// u32HeartLen = snprintf(acHeart, sizeof(acHeart), "$message,heart,%04x,%d,%04x,%d,%02u%%,%d,%d,%lf,%lf,%s,%d,%d,0\r\n", \ +// g_com_map[DEV_ID],GetUWBBindState(),g_com_map[BIND_DEV_ID],alarm_type,bat_percent,g_com_map[ALARM_DISTANCE1],g_com_map[ALARM_DISTANCE2],jd,wd,applyid,result,distance); +// } + +// u32HeartLen = snprintf(acHeart, sizeof(acHeart), "%s,%04x,%02u%%,%d,%d\r\n", \ +// GPS_GGAmessage,g_com_map[DEV_ID],bat_percent,userkey_state,gps_timeout_flag); +// userkey_state = 0; + Socket_Send(l_i32TCPClientID, (HIDO_UINT8 *)acHeart, u32HeartLen); +} + +void TCPHeartBeatUpload(void) +{ + HIDO_CHAR acHeart[200]; + HIDO_UINT32 u32HeartLen; + ave_sp = g_spsum/g_snum; + g_spsum = 0; + g_snum = 0; +// if(alarm_type==1) +// { +// u32HeartLen = snprintf(acHeart, sizeof(acHeart), "$message,alarm,%04x,%d,%04x,%d,%02u%%,%d,%d,%lf,%lf,%s,%d,%d,0\r\n", \ +// g_com_map[DEV_ID],GetUWBBindState(),g_com_map[BIND_DEV_ID],alarm_type,bat_percent,g_com_map[ALARM_DISTANCE1],g_com_map[ALARM_DISTANCE2],jd,wd,applyid,result,distance); +// } else { +// u32HeartLen = snprintf(acHeart, sizeof(acHeart), "$message,heart,%04x,%d,%04x,%d,%02u%%,%d,%d,%lf,%lf,%s,%d,%d,0\r\n", \ +// g_com_map[DEV_ID],GetUWBBindState(),g_com_map[BIND_DEV_ID],alarm_type,bat_percent,g_com_map[ALARM_DISTANCE1],g_com_map[ALARM_DISTANCE2],jd,wd,applyid,result,distance); +// } +// u32HeartLen = snprintf(acHeart, sizeof(acHeart), "%s,%04x,%02u%%\r\n", \ +// GPS_GGAmessage,g_com_map[DEV_ID],bat_percent); + Socket_Send(l_i32TCPClientID, (HIDO_UINT8 *)acHeart, u32HeartLen); +} +void TCPReceiveMessageReply(void) +{ + HIDO_CHAR acHeart[200]; + HIDO_UINT32 u32HeartLen = snprintf(acHeart, sizeof(acHeart), "$rec_message,%04x",g_com_map[DEV_ID]); + Socket_Send(l_i32TCPClientID, (HIDO_UINT8 *)acHeart, u32HeartLen); +} +void _4GAlarmUpload(uint8_t alarm) +{ + alarm_type = alarm; + TCPHeartBeatUpload(); + if(alarm_type == 2) + alarm_type = 0; +} + +HIDO_INT32 TCPClient_Poll(void) +{ + if (Internet_IsIPReady() == HIDO_TRUE) + { + HIDO_UINT32 u32CurTick = HIDO_TimerGetTick(); + if (TCP_CLIENT_STATE_IDLE == l_eTCPClientState) + { + if (!TCPfail_flag) + { + l_eTCPClientState = TCP_CLIENT_STATE_CONNECTING; + + + HIDO_UtilSnprintf((HIDO_CHAR *) l_au8CmdBuff, sizeof(l_au8CmdBuff), "%u.%u.%u.%u", ip0,ip1, ip2, ip3); + + Socket_Connect(l_i32TCPClientID, (HIDO_CHAR *) l_au8CmdBuff, port); + +// HIDO_UtilSnprintf((HIDO_CHAR *) l_au8CmdBuff, sizeof(l_au8CmdBuff), "123.57.87.125"); +// Socket_Connect(l_i32TCPClientID, (HIDO_CHAR *) l_au8CmdBuff, 8888); + +// HIDO_UtilSnprintf((HIDO_CHAR *) l_au8CmdBuff, sizeof(l_au8CmdBuff), "111.198.60.6"); +// Socket_Connect(l_i32TCPClientID, (HIDO_CHAR *) l_au8CmdBuff, 1234); + TCPfail_flag = 1; + } + else + { + if (u32CurTick - TCPfailetimer > HIDO_TIMER_TICK_S(5)) + { + TCPfailetimer = u32CurTick; + TCPfail_flag = 0; + } + } + } + else if (TCP_CLIENT_STATE_CONNECTED == l_eTCPClientState) + { + if ((u32CurTick - l_u32HeartBeatTick) >= HIDO_TIMER_TICK_S(60)||flag_first_TCPconnect) + //if ((u32CurTick - l_u32HeartBeatTick) >= HIDO_TIMER_TICK_S(g_com_map[SEND_4G_SECOND])||flag_first_TCPconnect) + { + flag_first_TCPconnect = 0; + l_u32HeartBeatTick = u32CurTick; + // 这里是自定义心跳 + TCPHeartBeatUpload(); + //UDPClient_UploadGPS();//先不弄心跳 +// HIDO_CHAR acHeart[128]; +// HIDO_UINT32 u32HeartLen = snprintf(acHeart, sizeof(acHeart), "$message heart,%04x,00001,1,50,50,50,,,,\r\n", g_com_map[DEV_ID]); +// Socket_Send(l_i32TCPClientID, (HIDO_UINT8 *)acHeart, u32HeartLen); + } + } + } + else + { + l_eTCPClientState = TCP_CLIENT_STATE_IDLE; + } + + return HIDO_OK; +} + +/******************************************************************************* + * Function Name : TCPClient_Upload + * Description : + * Input : + * Output : + * Return : + * Author : www.hido-studio.com + * Modified Date: : 2021年1月9日 + *******************************************************************************/ +HIDO_INT32 TCPClient_Upload(HIDO_UINT8 *_pu8Data, HIDO_UINT32 _u32Len) +{ + Socket_Send(l_i32TCPClientID, _pu8Data, _u32Len); + + return HIDO_OK; +} + +HIDO_BOOL TCPClient_IsSendOver(HIDO_VOID) +{ + return Socket_IsSendQueueEmpty(l_i32TCPClientID); +} + +/******************************************************************************* + * Function Name : TCPClient_Init + * Description : TCP客户端初始化 + * Input : None + * Output : None + * Return : HIDO_OK 成功,HIDO_ERR 失败 + * Author : www.hido-studio.com + * Modified Date: : 2021年1月9日 + *******************************************************************************/ +HIDO_INT32 TCPClient_Init(void) +{ + l_eTCPClientState = TCP_CLIENT_STATE_IDLE; + Socket_Create(&l_i32TCPClientID, SOCKET_TYPE_UDP, TCPClient_SocketEventProc, HIDO_NULL); + + // 这里是固定的心跳,由4G自行发送 +#if 0 + HIDO_CHAR acHeart[64]; + HIDO_UINT32 u32HeartLen = snprintf(acHeart, sizeof(acHeart), "$message heart2,%04x\r\n", g_com_map[DEV_ID]); + Socket_HeartbeatConfig(l_i32TCPClientID, (HIDO_UINT8 *)acHeart, u32HeartLen, 180); +#endif + + return HIDO_OK; +} +char str[17]= {"AT+IPR=9600;&W\r\n"}; +void AIR780E_Reset(void) +{ +// PCA9555_Set_One_Value_Output(AIR780E_ENBALE,0);//关闭4G + delay_ms(1500); +// PCA9555_Set_One_Value_Output(AIR780E_ENBALE,1);//打开4G + delay_ms(3000); +// Uart_ReConfigBaudRate(UART_ID_4G,115200); +// uart_send(UART_ID0, str,17, NULL); +// Uart_ReConfigBaudRate(UART_ID_4G,9600); + +} +uint8_t IfTCPConnected(void) +{ + if(TCP_CLIENT_STATE_CONNECTED == l_eTCPClientState) + { + return 1; + } else { + return 0; + } +} \ No newline at end of file diff --git a/keil/include/src/TCPClient.h b/keil/include/src/TCPClient.h new file mode 100644 index 0000000..e62bd62 --- /dev/null +++ b/keil/include/src/TCPClient.h @@ -0,0 +1,59 @@ +/******************************************************************************* + * File Name : TCPClient.h + * Description : + * Created on : 2021年1月9日 + * Author : www.hido-studio.com + *******************************************************************************/ + +#ifndef APL_TCPCLIENT_H_ +#define APL_TCPCLIENT_H_ +/******************************************************************************* + * Include Files * + *******************************************************************************/ +#include "HIDO_TYpeDef.h" + +/******************************************************************************* + * Macro * + *******************************************************************************/ + +/******************************************************************************* + * Type Definition * + *******************************************************************************/ + +/******************************************************************************* + * Global Function * + *******************************************************************************/ +/******************************************************************************* + * Function Name : TCPClient_Poll + * Description : + * Input : + * Output : + * Return : + * Author : www.hido-studio.com + * Modified Date: : 2021年1月9日 + *******************************************************************************/ +HIDO_INT32 TCPClient_Poll(void); + +/******************************************************************************* + * Function Name : TCPClient_Upload + * Description : + * Input : + * Output : + * Return : + * Author : www.hido-studio.com + * Modified Date: : 2021年1月9日 + *******************************************************************************/ +HIDO_INT32 TCPClient_Upload(HIDO_UINT8 *_pu8Data, HIDO_UINT32 _u32Len); + +/******************************************************************************* + * Function Name : TCPClient_Init + * Description : + * Input : + * Output : + * Return : + * Author : www.hido-studio.com + * Modified Date: : 2021年1月9日 + *******************************************************************************/ +HIDO_INT32 TCPClient_Init(void); + +#endif /* APL_TCPCLIENT_H_ */ diff --git a/keil/include/src/gps.c b/keil/include/src/gps.c new file mode 100644 index 0000000..33cb59b --- /dev/null +++ b/keil/include/src/gps.c @@ -0,0 +1,150 @@ +#include "board.h" +#include "HIDO_Util.h" +#include "global_param.h" +#include "sn74hc595.h" +#define GPS_OPEN_TIME_OUT 48 //1分钟开启 +#define GPS_RESTART_TIME1 480 //10分钟 +#define GPS_RESTART_TIME2 48 //1分钟 +#define GPS_RESTART_TIME3 30 //30s + uint16_t gps_wait_count; + extern uint16_t g_com_map[COM_MAP_SIZE]; +extern uint8_t flag_first_TCPconnect; + uint16_t gps_wait_count2; +uint16_t g_spsum,g_snum,ave_sp; +uint8_t gps_power_state,gps_uwb_flag,gps_4g_flag,gps_timeout_flag,gps_need_data_flag = 1,gps_open_flag; +void GPS_Poll(void) +{ + + if(gps_4g_flag||gps_uwb_flag) { + gps_power_state = 1; //打开GPS电源 + if(!gps_timeout_flag) { + if(gps_need_data_flag) { + gps_wait_count++; + if(gps_wait_count>=GPS_OPEN_TIME_OUT) { //超时切换工作状态 + gps_timeout_flag=1;//串口添加改变timeout逻辑 + gps_wait_count=0; + gps_need_data_flag=0;//切换为关闭模式 + } + } else { + gps_wait_count++; + gps_power_state=0;//关闭GPS + if(gps_wait_count>GPS_RESTART_TIME2) { + gps_power_state=1;//开启GPS + gps_need_data_flag=1; + gps_wait_count=0; + } + } + } else { //超时工作状态 + if(gps_need_data_flag) { + gps_wait_count++; + if(gps_wait_count>=GPS_OPEN_TIME_OUT) { //超时切换工作状态 + gps_timeout_flag=1; + gps_need_data_flag=0; + gps_wait_count=0; + } + } else { + gps_wait_count++; + gps_power_state=0;//关闭GPS + if(gps_wait_count>GPS_RESTART_TIME1) { + gps_power_state=1;//开启GPS + gps_need_data_flag=1; + gps_wait_count=0; + } + } + + } + } else { + gps_power_state=0;//关闭gps + gps_wait_count=0; + gps_timeout_flag=0; + gps_need_data_flag=1; + } +} +void GpsConrol(uint8_t flag_4g_uwb,uint8_t open_close) +{ + if(gps_4g_flag==0&&gps_uwb_flag==0) + if(open_close) + { + gps_wait_count = 0; + gps_need_data_flag = 1; + gps_timeout_flag = 0; + } + if(flag_4g_uwb) + { + gps_4g_flag = open_close; + } else { + gps_uwb_flag = open_close; + } + +} +void Gps_change(void) +{ + if(gps_open_flag){ + if(gps_need_data_flag) { + gps_power_state = 1; //打开GPS电源 + + gps_wait_count++; + if(gps_wait_count>=g_com_map[SEND_4G_SECOND]) { //超时切换工作状态 + gps_timeout_flag=1;//串口添加改变timeout逻辑 + gps_wait_count=0; + gps_need_data_flag=0;//切换为关闭模式 + UDPClient_UploadGPS();//上传GPS超时无效数据 + } + } else { + gps_wait_count++; + gps_power_state=0;//关闭GPS + + if(gps_wait_count>g_com_map[SEND_4G_SECOND]) { + gps_power_state=1;//开启GPS + gps_need_data_flag=1; + gps_wait_count=0; + } + } + gps_wait_count2=0; + }else{ + gps_wait_count2++; + if(gps_wait_count2>=g_com_map[SEND_4G_SECOND]) { //超时切换工作状态 + gps_wait_count=0; + gps_timeout_flag=1; + UDPClient_UploadGPS();//上传GPS 30s固定数据 + gps_wait_count2=0; + } + gps_power_state=1;//开启gps + gps_need_data_flag=1; + } +// update_led_power_state(); +} + +HIDO_INT32 GPS_ParseGSV(HIDO_CHAR *_pcData, HIDO_UINT32 _u32Len) +{ + HIDO_DataStruct spower[4]; + +// if (GPS_DataCheck(_pcData, _u32Len) != HIDO_OK) +// { +// return HIDO_ERR; +// } + + if (HIDO_UtilParseFormat((HIDO_UINT8 *) _pcData, _u32Len, "$%*,%*,%*,%*,%*,%*,%*,%p,%*,%*,%*,%p,%*,%*,%*,%p,%*,%*,%*,%p,%**", &spower[0], &spower[1], &spower[2], &spower[3]) == 21) + { + g_snum+=4; + g_spsum+=atoi((HIDO_CHAR *)spower[0].m_pData)+atoi((HIDO_CHAR *)spower[1].m_pData)+atoi((HIDO_CHAR *)spower[2].m_pData)+atoi((HIDO_CHAR *)spower[3].m_pData); + }else if(HIDO_UtilParseFormat((HIDO_UINT8 *) _pcData, _u32Len, "$%*,%*,%*,%*,%*,%*,%*,%p,%*,%*,%*,%p,%*,%*,%*,%p,%**", &spower[0], &spower[1], &spower[2]) == 17) + { + g_snum+=3; + g_spsum+=atoi((HIDO_CHAR *)spower[0].m_pData)+atoi((HIDO_CHAR *)spower[1].m_pData)+atoi((HIDO_CHAR *)spower[2].m_pData); + + }else if(HIDO_UtilParseFormat((HIDO_UINT8 *) _pcData, _u32Len, "$%*,%*,%*,%*,%*,%*,%*,%p,%*,%*,%*,%p,%**", &spower[0], &spower[1]) == 13) + { + g_snum+=2; + g_spsum+=atoi((HIDO_CHAR *)spower[0].m_pData)+atoi((HIDO_CHAR *)spower[1].m_pData); + + }else if(HIDO_UtilParseFormat((HIDO_UINT8 *) _pcData, _u32Len, "$%*,%*,%*,%*,%*,%*,%*,%p,%**", &spower[0]) == 9) + { + g_snum+=1; + g_spsum+=atoi((HIDO_CHAR *)spower[0].m_pData); + + } + // l_u8PosState = atoi((HIDO_CHAR *)stPosState.m_pData); + + return HIDO_OK; +} \ No newline at end of file diff --git a/keil/uci_fira.uvprojx b/keil/uci_fira.uvprojx index 8bc86c8..e330fd1 100644 --- a/keil/uci_fira.uvprojx +++ b/keil/uci_fira.uvprojx @@ -339,7 +339,7 @@ <MiscControls>-Wno-cast-qual -Wno-declaration-after-statement -Wno-double-promotion -Wno-extra-semi-stmt -Wno-gnu-zero-variadic-macro-arguments -Wno-padded -Wno-unused-parameter</MiscControls> <Define>FIRA_RANGING_EN UWB_EN UWB_UCI_TEST_EN WSF_EN</Define> <Undefine></Undefine> - <IncludePath>..;..\..\..;.\include\CMSIS\Include;.\include\components\algo\inc;.\include\components\app\inc;.\include\components\crc;.\include\components\libc;.\include\components\se\inc;.\include\components\uci\inc;.\include\components\uwb\inc;.\include\components\wsf\include;.\include\components\wsf\include\platform;.\include\devices\MK800X\Include;.\include\drivers;.\include\board</IncludePath> + <IncludePath>..;..\..\..;.\include\CMSIS\Include;.\include\components\algo\inc;.\include\components\app\inc;.\include\components\crc;.\include\components\libc;.\include\components\se\inc;.\include\components\uci\inc;.\include\components\uwb\inc;.\include\components\wsf\include;.\include\components\wsf\include\platform;.\include\devices\MK800X\Include;.\include\drivers;.\include\board;.\include\components\hido\Include;.\include\components\internet\inc;.\include\components\hal;.\include\src</IncludePath> </VariousControls> </Cads> <Aads> @@ -588,6 +588,26 @@ <FileType>1</FileType> <FilePath>.\include\drivers\mk_wdt.c</FilePath> </File> + <File> + <FileName>uwb_app.c</FileName> + <FileType>1</FileType> + <FilePath>.\include\drivers\uwb_app.c</FilePath> + </File> + <File> + <FileName>dw_app_anchor.c</FileName> + <FileType>1</FileType> + <FilePath>.\include\drivers\dw_app_anchor.c</FilePath> + </File> + <File> + <FileName>dw_tag.c</FileName> + <FileType>1</FileType> + <FilePath>.\include\drivers\dw_tag.c</FilePath> + </File> + <File> + <FileName>global_param.c</FileName> + <FileType>1</FileType> + <FilePath>.\include\drivers\global_param.c</FilePath> + </File> </Files> </Group> <Group> @@ -607,6 +627,16 @@ <FileName>pin_config.c</FileName> <FileType>1</FileType> <FilePath>..\pin_config.c</FilePath> + </File> + <File> + <FileName>gps.c</FileName> + <FileType>1</FileType> + <FilePath>.\include\src\gps.c</FilePath> + </File> + <File> + <FileName>TCPClient.c</FileName> + <FileType>1</FileType> + <FilePath>.\include\src\TCPClient.c</FilePath> </File> </Files> </Group> @@ -760,6 +790,66 @@ </File> </Files> </Group> + <Group> + <GroupName>HidoLib</GroupName> + <Files> + <File> + <FileName>hido.lib</FileName> + <FileType>4</FileType> + <FilePath>.\include\components\hido\hido.lib</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>Internet</GroupName> + <Files> + <File> + <FileName>AIR780ECSQ.c</FileName> + <FileType>1</FileType> + <FilePath>.\include\components\internet\src\AIR780ECSQ.c</FilePath> + </File> + <File> + <FileName>AIR780EDriver.c</FileName> + <FileType>1</FileType> + <FilePath>.\include\components\internet\src\AIR780EDriver.c</FilePath> + </File> + <File> + <FileName>AIR780EFSM.c</FileName> + <FileType>1</FileType> + <FilePath>.\include\components\internet\src\AIR780EFSM.c</FilePath> + </File> + <File> + <FileName>AIR780ESocket.c</FileName> + <FileType>1</FileType> + <FilePath>.\include\components\internet\src\AIR780ESocket.c</FilePath> + </File> + <File> + <FileName>Internet.c</FileName> + <FileType>1</FileType> + <FilePath>.\include\components\internet\src\Internet.c</FilePath> + </File> + <File> + <FileName>Module.c</FileName> + <FileType>1</FileType> + <FilePath>.\include\components\internet\src\Module.c</FilePath> + </File> + <File> + <FileName>Socket.c</FileName> + <FileType>1</FileType> + <FilePath>.\include\components\internet\src\Socket.c</FilePath> + </File> + </Files> + </Group> + <Group> + <GroupName>Hal</GroupName> + <Files> + <File> + <FileName>UART.c</FileName> + <FileType>1</FileType> + <FilePath>.\include\components\hal\UART.c</FilePath> + </File> + </Files> + </Group> </Groups> </Target> </Targets> diff --git a/user_config.h b/user_config.h index a47e1ef..da1d376 100644 --- a/user_config.h +++ b/user_config.h @@ -289,7 +289,7 @@ /** TX power level: 0 ~ 60 */ #define TX_POWER_LEVEL (36) - +#define RANGING_CORR (0) /** Antenna ports combination, @ref macro definition RX_xPORTS_ANT_xxx */ #define RX_ANT_PORTS_COMBINATION (RX_4PORTS_ANT_3_0_1_2) @@ -315,6 +315,7 @@ /** Velocity of propagation (%) */ #define VP_VAL (100) +#define DW1000 /* ========================================== Timing configuration ======================================== */ /// Period prefetch time for event program from wakeup - 400us+ -- Gitblit v1.9.3