/******************************************************************************* * 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" #include "DBG.h" /******************************************************************************* * Macro * *******************************************************************************/ /* ´®¿ÚÏà¹Ø */ #define AIR780E_UART_TX_BUF_SIZE (100) /* ´®¿ÚδʹÓÃDMAģʽ£¬²»ÐèÒªbuff */ #define AIR780E_UART_RX_BUF_SIZE (1024 * 2 + 512) #define AIR780E_UART_TX_QUEUE_MEMBER_CNT 16 /* ´®¿ÚδʹÓÃDMAģʽ£¬²»ÐèÒª */ /* ATÏà¹Ø */ #define AIR780E_AT_SEND_BUF_SIZE ((5 * 1024) + 512) /* ·¢Ë͵ĵ¥ÌõATÖ¸ÁîµÄ×î´ó³¤¶È */ #define AIR780E_AT_RECV_BUF_SIZE ((5 * 1024) + 512) /* µ¥Ìô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ÈÕ *******************************************************************************/ extern 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; /* »ñÈ¡ÕæÊµÐèÒª½ÓÊյij¤¶È */ 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&&DBG_GetMode() == DBG_MODE_SHELL) 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&&DBG_GetMode() == DBG_MODE_SHELL) 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&&DBG_GetMode() == DBG_MODE_SHELL) LOG_INFO(TRACE_MODULE_APP, "[AT Send] %s", _pu8Data);//ÐÞ¸Ä4G } else { // HIDO_Debug("[AT Send] %s\r\n", _pu8Data); if(log_4g_enable_flag&&DBG_GetMode() == DBG_MODE_SHELL) 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) { air780_power_state = 0; 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&&DBG_GetMode() == DBG_MODE_SHELL) 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; }