| | |
| | | /******************************************************************************* |
| | | * File Name : EG800FSM.c |
| | | * Description : |
| | | * Created on : 2018年5月22日 |
| | | * Created on : 2018??5??22?? |
| | | * Author : www.hido-studio.com |
| | | *******************************************************************************/ |
| | | |
| | |
| | | #include "ATConfig.h" |
| | | #include "Uart.h" |
| | | #include "Module.h" |
| | | #include "MQTT.h" |
| | | |
| | | /******************************************************************************* |
| | | * Macro * |
| | |
| | | /******************************************************************************* |
| | | * State Name : EG800 |
| | | * Parent State : None |
| | | * Description : EG800主状态 |
| | | * Description : EG800???? |
| | | * Author : www.hido-studio.com |
| | | * Modified Date: : 2018-05-01 |
| | | *******************************************************************************/ |
| | | HIDO_FSM_STATE_IMPLEMENT(EG800, HIDO_NULL, HIDO_FSM_STATE(EG800PowerOn)) |
| | | { |
| | |
| | | Socket_HaveRecvData(u32ID); |
| | | break; |
| | | } |
| | | case EG800_EVENT_QMTRECV: |
| | | { |
| | | HIDO_UINT32 u32ClientID = 0; |
| | | HIDO_UINT32 u32MsgID = 0; |
| | | HIDO_DataStruct *pstData = (HIDO_DataStruct *) _pArg; |
| | | |
| | | if (HIDO_UtilParseFormat((HIDO_UINT8 *) pstData->m_pData, pstData->m_u32Len, "+QMTRECV: %d,%d\r\n", |
| | | &u32ClientID, &u32MsgID) != 2) |
| | | { |
| | | break; |
| | | } |
| | | |
| | | MQTT_HaveRecvData(u32ClientID); |
| | | |
| | | break; |
| | | } |
| | | default: |
| | | { |
| | | return HIDO_EVENT_NO_PROC; |
| | |
| | | /******************************************************************************* |
| | | * State Name : EG800Init |
| | | * Parent State : EG800 |
| | | * Description : 初始化主状态 |
| | | * Description : ????????? |
| | | * Author : www.hido-studio.com |
| | | * Modified Date: : 2018-05-01 |
| | | *******************************************************************************/ |
| | | HIDO_FSM_STATE_IMPLEMENT(EG800Init, HIDO_FSM_STATE(EG800), HIDO_FSM_STATE(EG800PowerOn)) |
| | | { |
| | |
| | | } |
| | | case HIDO_AT_EVENT_TIMEOUT: |
| | | { |
| | | /* AT命令相应超时,重新初始化 */ |
| | | /* AT??????????,???3???? */ |
| | | HIDO_FSMStateChange(_pstFSM, HIDO_FSM_STATE(EG800Init), HIDO_NULL); |
| | | |
| | | break; |
| | |
| | | * Parent State : EG800Init |
| | | * Description : |
| | | * Author : www.hido-studio.com |
| | | * Modified Date: : 2018-05-01 |
| | | *******************************************************************************/ |
| | | HIDO_FSM_STATE_IMPLEMENT(EG800PowerOff, HIDO_FSM_STATE(EG800), HIDO_NULL) |
| | | { |
| | |
| | | * Parent State : EG800Init |
| | | * Description : |
| | | * Author : www.hido-studio.com |
| | | * Modified Date: : 2018-05-01 |
| | | *******************************************************************************/ |
| | | HIDO_FSM_STATE_IMPLEMENT(EG800PowerOn, HIDO_FSM_STATE(EG800Init), HIDO_NULL) |
| | | { |
| | |
| | | } |
| | | case HIDO_EVENT_EXIT: |
| | | { |
| | | /* 退出初始化 */ |
| | | /* ???????? */ |
| | | HIDO_TimerCancel(u32FSMTimerID); |
| | | |
| | | break; |
| | |
| | | * Parent State : EG800Init |
| | | * Description : |
| | | * Author : www.hido-studio.com |
| | | * Modified Date: : 2018-05-01 |
| | | *******************************************************************************/ |
| | | extern int Last4G; |
| | | |
| | |
| | | /******************************************************************************* |
| | | * State Name : EG800ATCmdTest |
| | | * Parent State : EG800Init |
| | | * Description : AT命令测试状态 |
| | | * Description : AT????????? |
| | | * Author : www.hido-studio.com |
| | | * Modified Date: : 2018-05-01 |
| | | *******************************************************************************/ |
| | | HIDO_FSM_STATE_IMPLEMENT(EG800ATCmdTest, HIDO_FSM_STATE(EG800Init), HIDO_NULL) |
| | | { |
| | |
| | | } |
| | | else |
| | | { |
| | | /* 上电成功 */ |
| | | /* ????? */ |
| | | Module_PowerEvent(MODULE_MAIN, MODULE_STATE_POWER_ON); |
| | | HIDO_FSMStateChange(_pstFSM, HIDO_FSM_STATE(EG800WaitSimCardReady), HIDO_NULL); |
| | | } |
| | |
| | | { |
| | | if (HIDO_TRUE == l_bConfigBaudRate) |
| | | { |
| | | /* 上电成功 */ |
| | | /* ????? */ |
| | | Module_PowerEvent(MODULE_MAIN, MODULE_STATE_POWER_ON); |
| | | HIDO_FSMStateChange(_pstFSM, HIDO_FSM_STATE(EG800WaitSimCardReady), HIDO_NULL); |
| | | break; |
| | |
| | | /******************************************************************************* |
| | | * State Name : EG800WaitSimCardReady |
| | | * Parent State : EG800Init |
| | | * Description : 等待SIM卡准备完成 |
| | | * Description : ???SIM???????? |
| | | * Author : www.hido-studio.com |
| | | * Modified Date: : 2018-05-01 |
| | | *******************************************************************************/ |
| | | HIDO_FSM_STATE_IMPLEMENT(EG800WaitSimCardReady, HIDO_FSM_STATE(EG800Init), HIDO_NULL) |
| | | { |
| | |
| | | * Parent State : EG800Init |
| | | * Description : |
| | | * Author : www.hido-studio.com |
| | | * Modified Date: : 2018-05-01 |
| | | *******************************************************************************/ |
| | | HIDO_FSM_STATE_IMPLEMENT(EG800ATCmdInit, HIDO_FSM_STATE(EG800Init), HIDO_NULL) |
| | | { |
| | |
| | | l_u32RetryCnt++; |
| | | if (l_u32RetryCnt >= 3) |
| | | { |
| | | /* 重试超限 */ |
| | | /* ??????? */ |
| | | HIDO_FSMStateChange(_pstFSM, HIDO_FSM_STATE(EG800PowerOn), HIDO_NULL); |
| | | } |
| | | else |
| | | { |
| | | /* 不是期待的结果,10后再次尝试 */ |
| | | /* ?????????????10????γ??? */ |
| | | HIDO_FSMStartTimer(u32FSMTimerID, HIDO_TIMER_TYPE_ONCE, HIDO_TIMER_TICK_S(10), _pstFSM, |
| | | EG800_EVENT_DELAY); |
| | | } |
| | |
| | | * Parent State : EG800 |
| | | * Description : |
| | | * Author : www.hido-studio.com |
| | | * Modified Date: : 2018-05-01 |
| | | *******************************************************************************/ |
| | | HIDO_FSM_STATE_IMPLEMENT(EG800Idle, HIDO_FSM_STATE(EG800), HIDO_NULL) |
| | | { |
| | |
| | | * Parent State : EG800 |
| | | * Description : |
| | | * Author : www.hido-studio.com |
| | | * Modified Date: : 2018-05-01 |
| | | *******************************************************************************/ |
| | | HIDO_FSM_STATE_IMPLEMENT(EG800Ready, HIDO_FSM_STATE(EG800), HIDO_FSM_STATE(EG800SearchingNetwork)) |
| | | { |
| | |
| | | /******************************************************************************* |
| | | * State Name : EG800SearchingNetwork |
| | | * Parent State : EG800 |
| | | * Description : 查找网络 |
| | | * Description : ???????? |
| | | * Author : www.hido-studio.com |
| | | * Modified Date: : 2018-05-01 |
| | | *******************************************************************************/ |
| | | HIDO_FSM_STATE_IMPLEMENT(EG800SearchingNetwork, HIDO_FSM_STATE(EG800Ready), HIDO_NULL) |
| | | { |
| | |
| | | |
| | | if (l_u32Cnt > 100) |
| | | { |
| | | /* TODO网络出错 */ |
| | | /* TODO??????? */ |
| | | } |
| | | } |
| | | |
| | |
| | | * Parent State : EG800 |
| | | * Description : |
| | | * Author : www.hido-studio.com |
| | | * Modified Date: : 2018-05-01 |
| | | *******************************************************************************/ |
| | | HIDO_FSM_STATE_IMPLEMENT(EG800IPInit, HIDO_FSM_STATE(EG800Ready), HIDO_NULL) |
| | | { |
| | |
| | | |
| | | const ST_ATCmd astInitCmdList[] = |
| | | { |
| | | {"AT+QICSGP=1,1,\"%s\",\"\",\"\",1\r\n", 60000, AT_CMD_RESULT_OK | AT_CMD_RESULT_ERROR}, |
| | | {"AT+QIACT=1\r\n", 60000, AT_CMD_RESULT_OK | AT_CMD_RESULT_ERROR}, |
| | | {"AT+QIACT?\r\n", AT_GENERAL_TIMEOUT_TIME, 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_u32RetryCnt++; |
| | | if (l_u32RetryCnt >= 3) |
| | | { |
| | | /* 重试超限 */ |
| | | /* ??????? */ |
| | | HIDO_FSMStateChange(_pstFSM, HIDO_FSM_STATE(EG800), HIDO_NULL); |
| | | } |
| | | else |
| | | { |
| | | /* 不是期待的结果,10后再次尝试 */ |
| | | /* ?????????????10????γ??? */ |
| | | HIDO_FSMStartTimer(u32FSMTimerID, HIDO_TIMER_TYPE_ONCE, HIDO_TIMER_TICK_S(10), _pstFSM, |
| | | EG800_EVENT_DELAY); |
| | | } |
| | |
| | | * Parent State : EG800 |
| | | * Description : |
| | | * Author : www.hido-studio.com |
| | | * Modified Date: : 2018-05-01 |
| | | *******************************************************************************/ |
| | | HIDO_FSM_STATE_IMPLEMENT(EG800IPReady, HIDO_FSM_STATE(EG800Ready), HIDO_FSM_STATE(EG800IPPoll)) |
| | | { |
| | |
| | | case HIDO_EVENT_EXIT: |
| | | { |
| | | Socket_ClosedAll(); |
| | | #ifdef __EG800_MQTT__ |
| | | MQTT_ClosedAll(); |
| | | #endif |
| | | |
| | | break; |
| | | } |
| | | case EG800_EVENT_POLL: |
| | |
| | | l_bDeact = HIDO_TRUE; |
| | | break; |
| | | } |
| | | #ifdef __EG800_MQTT__ |
| | | |
| | | case EG800_EVENT_QMTSTAT: |
| | | { |
| | | HIDO_DataStruct *pstData = (HIDO_DataStruct *)_pArg; |
| | |
| | | |
| | | break; |
| | | } |
| | | #endif |
| | | default: |
| | | { |
| | | return HIDO_EVENT_NO_PROC; |
| | |
| | | * Parent State : EG800IPReady |
| | | * Description : |
| | | * Author : www.hido-studio.com |
| | | * Modified Date: : 2018-05-01 |
| | | *******************************************************************************/ |
| | | HIDO_FSM_STATE_IMPLEMENT(EG800IPPoll, HIDO_FSM_STATE(EG800IPReady), HIDO_NULL) |
| | | { |
| | |
| | | * Parent State : EG800IPReady |
| | | * Description : |
| | | * Author : www.hido-studio.com |
| | | * Modified Date: : 2018-05-01 |
| | | *******************************************************************************/ |
| | | HIDO_FSM_STATE_IMPLEMENT(EG800IPCheck, HIDO_FSM_STATE(EG800IPReady), HIDO_NULL) |
| | | { |
| | |
| | | * Parent State : EG800Ready |
| | | * Description : |
| | | * Author : www.hido-studio.com |
| | | * Modified Date: : 2018-05-01 |
| | | *******************************************************************************/ |
| | | HIDO_FSM_DETACHED_STATE_IMPLEMENT(EG800RunATCmd, HIDO_NULL, HIDO_NULL) |
| | | { |
| | |
| | | * Parent State : EG800Ready |
| | | * Description : |
| | | * Author : www.hido-studio.com |
| | | * Modified Date: : 2018-05-01 |
| | | *******************************************************************************/ |
| | | HIDO_FSM_DETACHED_STATE_IMPLEMENT(EG800CloseWireless, HIDO_NULL, HIDO_NULL) |
| | | { |
| | |
| | | * Parent State : EG800Ready |
| | | * Description : |
| | | * Author : www.hido-studio.com |
| | | * Modified Date: : 2018-05-01 |
| | | *******************************************************************************/ |
| | | HIDO_FSM_DETACHED_STATE_IMPLEMENT(EG800OpenWireless, HIDO_NULL, HIDO_NULL) |
| | | { |
| | |
| | | |
| | | /******************************************************************************* |
| | | * Function Name : EG800_PowerPoll |
| | | * Description : 电源处理事件的轮询 |
| | | * Input : _pstATDevice AT设备描述 |
| | | * Description : ??????????????? |
| | | * Input : _pstATDevice AT?豸???? |
| | | * Output : None |
| | | * Return : HIDO_OK 成功, HIDO_ERR 失败 |
| | | * Return : HIDO_OK ???, HIDO_ERR ??? |
| | | * Author : www.hido-studio.com |
| | | * Modified Date: : 2018年5月22日 |
| | | *******************************************************************************/ |
| | | static HIDO_INT32 EG800_PowerPoll(HIDO_ATLiteDeviceStruct *_pstATDevice) |
| | | { |
| | |
| | | |
| | | /******************************************************************************* |
| | | * Function Name : EG800_RunATCmdPoll |
| | | * Description : 运行用户AT命令处理轮询 |
| | | * Input : _pstATDevice AT设备描述 |
| | | * Description : ???????AT????????? |
| | | * Input : _pstATDevice AT?豸???? |
| | | * Output : None |
| | | * Return : HIDO_OK 成功, HIDO_ERR 失败 |
| | | * Return : HIDO_OK ???, HIDO_ERR ??? |
| | | * Author : www.hido-studio.com |
| | | * Modified Date: : 2018年5月22日 |
| | | *******************************************************************************/ |
| | | static HIDO_INT32 EG800_RunATCmdPoll(HIDO_ATLiteDeviceStruct *_pstATDevice) |
| | | { |
| | |
| | | |
| | | /******************************************************************************* |
| | | * Function Name : EG800_CloseWirelessPoll |
| | | * Description : 关闭无线数据轮询 |
| | | * Input : _pstATDevice AT设备描述 |
| | | * Description : ?????????????? |
| | | * Input : _pstATDevice AT?豸???? |
| | | * Output : None |
| | | * Return : HIDO_OK 成功, HIDO_ERR 失败 |
| | | * Return : HIDO_OK ???, HIDO_ERR ??? |
| | | * Author : www.hido-studio.com |
| | | * Modified Date: : 2018年5月22日 |
| | | *******************************************************************************/ |
| | | static HIDO_INT32 EG800_CloseWirelessPoll(HIDO_ATLiteDeviceStruct *_pstATDevice) |
| | | { |
| | |
| | | |
| | | /******************************************************************************* |
| | | * Function Name : EG800_OpenWirelessPoll |
| | | * Description : 打开无线数据轮询 |
| | | * Input : _pstATDevice AT设备描述 |
| | | * Description : ????????????? |
| | | * Input : _pstATDevice AT?豸???? |
| | | * Output : None |
| | | * Return : HIDO_OK 成功, HIDO_ERR 失败 |
| | | * Return : HIDO_OK ???, HIDO_ERR ??? |
| | | * Author : www.hido-studio.com |
| | | * Modified Date: : 2018年5月22日 |
| | | *******************************************************************************/ |
| | | static HIDO_INT32 EG800_OpenWirelessPoll(HIDO_ATLiteDeviceStruct *_pstATDevice) |
| | | { |
| | |
| | | |
| | | /******************************************************************************* |
| | | * Function Name : EG800_Poll |
| | | * Description : 在非IPReady状态时的轮询处理 |
| | | * Input : _pstATDevice AT设备描述 |
| | | * Description : ???IPReady???????????? |
| | | * Input : _pstATDevice AT?豸???? |
| | | * Output : None |
| | | * Return : HIDO_OK 成功, HIDO_ERR 失败 |
| | | * Return : HIDO_OK ???, HIDO_ERR ??? |
| | | * Author : www.hido-studio.com |
| | | * Modified Date: : 2018年5月22日 |
| | | *******************************************************************************/ |
| | | static HIDO_INT32 EG800_Poll(HIDO_ATLiteDeviceStruct *_pstATDevice) |
| | | { |
| | |
| | | |
| | | /******************************************************************************* |
| | | * Function Name : EG800_PollOnIPReady |
| | | * Description : 在IPReady状态时的轮询处理 |
| | | * Input : _pstATDevice AT设备描述 |
| | | * Description : ??IPReady???????????? |
| | | * Input : _pstATDevice AT?豸???? |
| | | * Output : None |
| | | * Return : HIDO_OK 成功, HIDO_ERR 失败 |
| | | * Return : HIDO_OK ???, HIDO_ERR ??? |
| | | * Author : www.hido-studio.com |
| | | * Modified Date: : 2018年5月22日 |
| | | *******************************************************************************/ |
| | | static HIDO_INT32 EG800_PollOnIPReady(HIDO_ATLiteDeviceStruct *_pstATDevice) |
| | | { |
| | |
| | | return HIDO_OK; |
| | | } |
| | | |
| | | #ifdef __EG800_MQTT__ |
| | | /* MQTT */ |
| | | if (EG800MQTT_Poll(_pstATDevice) == HIDO_OK) |
| | | { |
| | | return HIDO_OK; |
| | | } |
| | | #endif |
| | | |
| | | #ifdef __EG800_HTTP__ |
| | | /* HTTP */ |
| | |
| | | |
| | | /******************************************************************************* |
| | | * Function Name : EG800_IsIPReady |
| | | * Description : 判断状态机是否处在EG800IPReady状态 |
| | | * Description : ?ж??????????EG800IPReady?? |
| | | * Input : None |
| | | * Output : None |
| | | * Return : HIDO_TRUE 是, HIDO_FALSE 否 |
| | | * Return : HIDO_TRUE ??, HIDO_FALSE ?? |
| | | * Author : www.hido-studio.com |
| | | * Modified Date: : 2018年5月22日 |
| | | *******************************************************************************/ |
| | | HIDO_BOOL EG800_IsIPReady(void) |
| | | { |
| | |
| | | |
| | | /******************************************************************************* |
| | | * Function Name : EG800_IsIPIdle |
| | | * Description : 判断状态机是否处在EG800IPPoll状态 |
| | | * Description : ?ж??????????EG800IPPoll?? |
| | | * Input : None |
| | | * Output : None |
| | | * Return : HIDO_TRUE 是, HIDO_FALSE 否 |
| | | * Return : HIDO_TRUE ??, HIDO_FALSE ?? |
| | | * Author : www.hido-studio.com |
| | | * Modified Date: : 2018年5月22日 |
| | | *******************************************************************************/ |
| | | HIDO_BOOL EG800_IsIPIdle(void) |
| | | { |