From 15b206e26c18916b34578ae1521cc13274fb8340 Mon Sep 17 00:00:00 2001
From: chen <15335560115@163.com>
Date: 星期五, 27 六月 2025 18:49:04 +0800
Subject: [PATCH] 加入delay去掉进入休眠打印(会导致无法休眠),lora加mk进入休眠功耗16ua左右

---
 keil/include/components/internet/src/AIR780EFSM.c | 1598 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 1,598 insertions(+), 0 deletions(-)

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;
+}

--
Gitblit v1.9.3