Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 

816 строки
26 KiB

  1. #include "SIM7080GInterface.h"
  2. #include "BoardCfg.h"
  3. #include "timer.h"
  4. #include "Uart.h"
  5. #include "Syslog.h"
  6. #include "WiFiCtrl.h"
  7. #include "ATCmdInterpreter.h"
  8. #include "ProtocolDefs.h"
  9. #include "NetworkProtocol.h"
  10. static BYTE mActivateNetworkCmd[] = "AT+CNACT=0,1\r";
  11. static BYTE mDisconnectNetworkCmd[] = "AT+CNACT=0,0\r";
  12. static BYTE mCheckAPNConnectionCmd[] = "AT+CNACT?\r";
  13. static BYTE mConnectToMasterCmd[] = "AT+CAOPEN=0,0,\"TCP\",\"grosgin.myftp.org\",2182\r";
  14. static BYTE mDisconnectFromMasterCmd[] = "AT+CACLOSE=0\r";
  15. static BYTE mReceiveDataCmd[] = "AT+CARECV=0,100\r";
  16. char mMasterTxBuffer[MAX_MESSAGE_SIZE];
  17. int mMasterTxSize;
  18. int mLTEModuleSMState;
  19. int mLTEModuleOperationSMState;
  20. int mLTEModuleOperationSMSubState;
  21. int mNbCmdCharsReceived;
  22. char mATCmd[LTE_MODULE_MAX_CMD_LENGTH];
  23. bool mIsPassthroughEnabled;
  24. bool mModuleSerialDebugEnabled;
  25. bool mPICSerialDebugEnabled;
  26. int mCurrentCmd;
  27. bool mIsInitializing;
  28. int mNbMasterReconnectCount;
  29. bool mMasterConnected;
  30. bool mMasterSocketError;
  31. bool mAPNConnected;
  32. void InitLTEModule()
  33. {
  34. mLTEModuleSMState = LTE_MODULE_SM_INIT_STATE;
  35. mLTEModuleOperationSMState = LTE_MODULE_OPERATION_INIT_STATE;
  36. mLTEModuleOperationSMSubState = LTE_MODULE_OPERATION_NOMINAL_SUBSTATE;
  37. mNbCmdCharsReceived = 0;
  38. mIsPassthroughEnabled = false;
  39. mModuleSerialDebugEnabled = false;
  40. mPICSerialDebugEnabled = false;
  41. mCurrentCmd = LTE_MODULE_NO_CMD;
  42. mIsInitializing = true;
  43. mNbMasterReconnectCount = 0;
  44. mMasterSocketError = false;
  45. mMasterConnected = false;
  46. mAPNConnected = false;
  47. }
  48. int LTEModuleReset()
  49. {
  50. InitLTEModule();
  51. return RET_OK;
  52. }
  53. void LTEModuleSM(int SMEvent)
  54. {
  55. switch(mLTEModuleSMState)
  56. {
  57. case LTE_MODULE_SM_INIT_STATE:
  58. {
  59. // LORA_MODULE_RELAY_PIN = 1;
  60. TimerStart(LTE_MODULE_TIMER,LTE_MODULE_POWERUP_TIMEOUT);
  61. mLTEModuleSMState = LTE_MODULE_SM_RESET_STATE;
  62. break;
  63. }
  64. case LTE_MODULE_SM_RESET_STATE:
  65. {
  66. if(IsTimerExpired(LTE_MODULE_TIMER) == true)
  67. {
  68. // LORA_MODULE_RELAY_PIN = 0;
  69. // LTE_MODULE_PWR_PIN = 0;
  70. TimerStart(LTE_MODULE_TIMER,LTE_MODULE_POWERUP_TIMEOUT);
  71. mLTEModuleSMState = LTE_MODULE_SM_POWERUP_STATE;
  72. }
  73. break;
  74. }
  75. case LTE_MODULE_SM_POWERUP_STATE:
  76. {
  77. if(IsTimerExpired(LTE_MODULE_TIMER) == true)
  78. {
  79. // LTE_MODULE_PWR_PIN = 1;
  80. TimerStart(LTE_MODULE_TIMER,LTE_MODULE_WAIT_INIT_TIMEOUT);
  81. mLTEModuleSMState = LTE_MODULE_SM_WAIT_RDY_STATE;
  82. TimerStart(LTE_COMM_TIMER, LTE_MODULE_MAX_COMM_TIMEOUT);
  83. }
  84. break;
  85. }
  86. case LTE_MODULE_SM_WAIT_RDY_STATE:
  87. {
  88. if(SMEvent == LTE_MODULE_RX_RDY_EVENT)
  89. {
  90. mLTEModuleSMState = LTE_MODULE_SM_SETECHOOFF_STATE;
  91. }
  92. else if(SMEvent == LTE_MODULE_SM_TICK_EVENT)
  93. {
  94. if(IsTimerExpired(LTE_COMM_TIMER) == true)
  95. {
  96. LTEModuleReset();
  97. }
  98. }
  99. break;
  100. }
  101. case LTE_MODULE_SM_SETECHOOFF_STATE:
  102. {
  103. char Cmd[5] = {'A','T','E','0','\r'};
  104. //UartTransmitData(LTE_IF_UART_PORT,Cmd,5);
  105. SendDataToLteModule(Cmd,5);
  106. TimerStart(LTE_MODULE_TIMER,LTE_MODULE_POWERUP_TIMEOUT);
  107. mLTEModuleSMState = LTE_MODULE_SM_DELAY_STATE;
  108. break;
  109. }
  110. case LTE_MODULE_SM_SETAPN_STATE:
  111. {
  112. char Cmd[10] = {'A','T','+','C','G','N','A','P','N','\r'};
  113. //UartTransmitData(LTE_IF_UART_PORT,Cmd,10);
  114. SendDataToLteModule(Cmd,10);
  115. TimerStart(LTE_MODULE_TIMER,LTE_MODULE_POWERUP_TIMEOUT);
  116. mLTEModuleSMState = LTE_MODULE_SM_DELAY_STATE;
  117. break;
  118. }
  119. case LTE_MODULE_SM_DELAY_STATE:
  120. {
  121. if(IsTimerExpired(LTE_MODULE_TIMER) == true)
  122. {
  123. mLTEModuleSMState = LTE_MODULE_SM_RUN_STATE;
  124. }
  125. break;
  126. }
  127. case LTE_MODULE_SM_RUN_STATE:
  128. {
  129. if(SMEvent == LTE_MODULE_ENTER_PASSTHROUGH_EVENT)
  130. {
  131. mLTEModuleSMState = LTE_MODULE_SM_PASSTHROUGH_STATE;
  132. SyslogNewString("LTE Module entering passthrough mode...");
  133. }
  134. if(SMEvent == LTE_MODULE_SM_TICK_EVENT)
  135. {
  136. LTEModuleOperationSM(LTE_MODULE_OP_TICK_EVENT);
  137. }
  138. break;
  139. }
  140. case LTE_MODULE_SM_PASSTHROUGH_STATE:
  141. {
  142. if(SMEvent == LTE_MODULE_EXIT_PASSTHROUGH_EVENT)
  143. {
  144. SyslogNewString("LTE Module exiting passthrough mode...");
  145. mLTEModuleSMState = LTE_MODULE_SM_RUN_STATE;
  146. }
  147. break;
  148. }
  149. }
  150. }
  151. void TickLTEModule()
  152. {
  153. LTEModuleSM(LTE_MODULE_SM_TICK_EVENT);
  154. }
  155. void LTEModuleNewData(unsigned char Data)
  156. {
  157. if(mIsPassthroughEnabled == true)
  158. {
  159. SyslogNewByte(Data);
  160. // SendSyslogByte(Data);
  161. return;
  162. }
  163. if(mModuleSerialDebugEnabled == true)
  164. {
  165. SyslogNewByte(Data);
  166. }
  167. if(Data == '\n') //ignore line feeds
  168. return;
  169. if(Data != '\r')
  170. {
  171. if(mLTEModuleOperationSMState == LTE_MODULE_OPERATION_SENDING_DATA_STATE && Data == '>')
  172. {
  173. LTESendMasterBufferToModule();
  174. }
  175. else if(mNbCmdCharsReceived < LTE_MODULE_MAX_CMD_LENGTH)
  176. {
  177. mATCmd[mNbCmdCharsReceived] = Data;
  178. mNbCmdCharsReceived++;
  179. }
  180. else
  181. {
  182. //error...
  183. mNbCmdCharsReceived = 0;
  184. }
  185. }
  186. else
  187. {
  188. if(mNbCmdCharsReceived != 0) //New Command received
  189. {
  190. if(mLTEModuleSMState == LTE_MODULE_SM_WAIT_RDY_STATE)
  191. {
  192. if(mATCmd[0] == 'R' && mATCmd[1] == 'D' && mATCmd[2] == 'Y')
  193. {
  194. LTEModuleSM(LTE_MODULE_RX_RDY_EVENT);
  195. }
  196. }
  197. else if(mLTEModuleSMState == LTE_MODULE_SM_RUN_STATE)
  198. {
  199. AnalyzeNewATString(mATCmd,mNbCmdCharsReceived,mCurrentCmd);
  200. mNbCmdCharsReceived = mNbCmdCharsReceived;
  201. }
  202. mNbCmdCharsReceived = 0;
  203. }
  204. }
  205. }
  206. void LTEEnterSerialPassthrough()
  207. {
  208. LTEModuleSM(LTE_MODULE_ENTER_PASSTHROUGH_EVENT);
  209. mIsPassthroughEnabled = true;
  210. SyslogSetLTEPassthrough(true);
  211. mPICSerialDebugEnabled = false;
  212. mModuleSerialDebugEnabled = false;
  213. }
  214. void LTEExitSerialPassthrough()
  215. {
  216. LTEModuleSM(LTE_MODULE_EXIT_PASSTHROUGH_EVENT);
  217. mIsPassthroughEnabled = false;
  218. SyslogSetLTEPassthrough(false);
  219. }
  220. void LTEFwdPassthroughData(char Data)
  221. {
  222. if(mIsPassthroughEnabled == true)
  223. {
  224. UartTransmitData(LTE_IF_UART_PORT,&Data,1);
  225. }
  226. }
  227. int LTEEnableSerialDebug(bool EnModule, bool EnPic)
  228. {
  229. if(EnModule == true)
  230. {
  231. if(mIsPassthroughEnabled == true)
  232. {
  233. return RET_ERROR;
  234. }
  235. mModuleSerialDebugEnabled = true;
  236. }
  237. else
  238. {
  239. mModuleSerialDebugEnabled = false;
  240. }
  241. if(EnPic == true)
  242. {
  243. if(mIsPassthroughEnabled == true)
  244. {
  245. return RET_ERROR;
  246. }
  247. mPICSerialDebugEnabled = true;
  248. }
  249. else
  250. {
  251. mPICSerialDebugEnabled = false;
  252. }
  253. return RET_OK;
  254. }
  255. void SendDataToLteModule(char *Data, int Size)
  256. {
  257. if(mPICSerialDebugEnabled)
  258. {
  259. char *ptr = Data;
  260. int i;
  261. for(i = 0; i < Size; i++)
  262. {
  263. SyslogNewByte(*ptr++);
  264. }
  265. }
  266. UartTransmitData(LTE_IF_UART_PORT,Data,Size);
  267. }
  268. void LTECmdResponseReceived(int Cmd, int Result)
  269. {
  270. switch(Cmd)
  271. {
  272. case LTE_MODULE_NO_CMD:
  273. {
  274. break;
  275. }
  276. case LTE_MODULE_CONNECT_APN_CMD:
  277. {
  278. if(Result == LTE_MODULE_RESULT_OK)
  279. {
  280. LTEModuleOperationSM(LTE_MODULE_OP_APN_CONN_OK_EVENT);
  281. }
  282. else if(Result == LTE_MODULE_RESULT_ERROR)
  283. {
  284. LTEModuleOperationSM(LTE_MODULE_OP_APN_CONN_FAILED_EVENT);
  285. }
  286. break;
  287. }
  288. case LTE_MODULE_DISCONNECT_APN_CMD:
  289. {
  290. break;
  291. }
  292. case LTE_MODULE_CHECK_APN_CONNECTION_CMD:
  293. {
  294. if(Result == LTE_MODULE_RESULT_OK)
  295. {
  296. if(mAPNConnected == true)
  297. {
  298. LTEModuleOperationSM(LTE_MODULE_OP_APN_CONNECTED_EVENT);
  299. }
  300. else
  301. {
  302. LTEModuleOperationSM(LTE_MODULE_OP_APN_DISCONNECTED_EVENT);
  303. }
  304. }
  305. else if(Result == LTE_MODULE_RESULT_ERROR)
  306. {
  307. LTEModuleOperationSM(LTE_MODULE_OP_APN_CONN_FAILED_EVENT);
  308. }
  309. break;
  310. }
  311. case LTE_MODULE_CONNECT_TO_MASTER_CMD:
  312. {
  313. if(Result == LTE_MODULE_RESULT_OK)
  314. {
  315. if(mMasterConnected == true)
  316. {
  317. LTEModuleOperationSM(LTE_MODULE_OP_SERVER_CONNECTED_EVENT);
  318. }
  319. else
  320. {
  321. LTEModuleOperationSM(LTE_MODULE_OP_SERVER_DISCONNECTED_EVENT);
  322. }
  323. }
  324. else if(Result == LTE_MODULE_RESULT_ERROR)
  325. {
  326. LTEModuleOperationSM(LTE_MODULE_OP_SERVER_CONN_FAILED_EVENT);
  327. }
  328. break;
  329. }
  330. case LTE_MODULE_DISCONNECT_FROM_MASTER_CMD:
  331. {
  332. if(Result == LTE_MODULE_RESULT_OK)
  333. {
  334. LTEModuleOperationSM(LTE_MODULE_OP_SERVER_DISCONNECTED_EVENT);
  335. }
  336. else if(Result == LTE_MODULE_RESULT_ERROR)
  337. {
  338. LTEModuleOperationSM(LTE_MODULE_OP_SERVER_DISCONNECTED_EVENT);
  339. }
  340. break;
  341. }
  342. case LTE_MODULE_CHECK_MASTER_CONNECTION_CMD:
  343. {
  344. if(Result == LTE_MODULE_RESULT_OK)
  345. {
  346. }
  347. else if(Result == LTE_MODULE_RESULT_ERROR)
  348. {
  349. }
  350. break;
  351. }
  352. case LTE_MODULE_RX_DATA_CMD:
  353. {
  354. if(Result == LTE_MODULE_RESULT_OK)
  355. {
  356. //This case is managed by LTEModuleDataReceived()
  357. }
  358. else if(Result == LTE_MODULE_RESULT_ERROR)
  359. {
  360. LTEModuleOperationSM(LTE_MODULE_OP_MASTER_DATA_RECEIVED_EVENT);
  361. }
  362. break;
  363. }
  364. case LTE_MODULE_TX_DATA_CMD:
  365. {
  366. if(Result == LTE_MODULE_RESULT_OK)
  367. {
  368. LTEModuleOperationSM(LTE_MODULE_OP_MASTER_DATA_SENT_EVENT);
  369. }
  370. else if(Result == LTE_MODULE_RESULT_ERROR)
  371. {
  372. //TODO: Manage a TX error...
  373. LTEModuleOperationSM(LTE_MODULE_OP_MASTER_DATA_SENT_EVENT);
  374. }
  375. break;
  376. }
  377. }
  378. }
  379. void LTEModuleAPNConnectionStatus(int Status)
  380. {
  381. if(Status == LTE_MODULE_APN_CONNECTED)
  382. {
  383. mAPNConnected = true;
  384. // SyslogNewString("APN connected\n");
  385. }
  386. else
  387. {
  388. mAPNConnected = false;
  389. // SyslogNewString("APN disconnected\n");
  390. }
  391. }
  392. void LTEModuleMasterConnectionStatus(int Status)
  393. {
  394. if(Status == LTE_MODULE_MASTER_CONNECTED)
  395. {
  396. mMasterConnected = true;
  397. // SyslogNewString("Master connected\n");
  398. }
  399. else if(Status == LTE_MODULE_MASTER_SOCKET_ERROR)
  400. {
  401. mMasterConnected = false;
  402. mMasterSocketError = true;
  403. // SyslogNewString("Master socket error\n");
  404. }
  405. else
  406. {
  407. mMasterConnected = false;
  408. // SyslogNewString("Master disconnected\n");
  409. }
  410. }
  411. void LTEModuleOperationSM(int OperationEvent)
  412. {
  413. switch(mLTEModuleOperationSMState)
  414. {
  415. case LTE_MODULE_OPERATION_INIT_STATE:
  416. {
  417. mIsInitializing = true;
  418. //Send the request to connect module APN
  419. LTESendCommandToModule(LTE_MODULE_CONNECT_APN_CMD);
  420. mLTEModuleOperationSMState = LTE_MODULE_OPERATION_WAIT_CONNECT_APN_STATE;
  421. break;
  422. }
  423. case LTE_MODULE_OPERATION_WAIT_CONNECT_APN_STATE:
  424. {
  425. if(OperationEvent == LTE_MODULE_OP_APN_CONN_OK_EVENT)
  426. {
  427. //Send the request to confirm the state of the connection
  428. LTESendCommandToModule(LTE_MODULE_CHECK_APN_CONNECTION_CMD);
  429. mLTEModuleOperationSMState = LTE_MODULE_OPERATION_CHECK_APN_STATE;
  430. }
  431. else if(OperationEvent == LTE_MODULE_OP_APN_CONN_FAILED_EVENT)
  432. {
  433. //TODO: What do we do??
  434. LTEModuleReset(); //Something's wrong... reset the module.
  435. }
  436. else if(OperationEvent == LTE_MODULE_OP_TICK_EVENT)
  437. {
  438. if(IsTimerExpired(LTE_COMM_TIMER) == true)
  439. {
  440. LTEModuleReset();
  441. }
  442. }
  443. break;
  444. }
  445. case LTE_MODULE_OPERATION_CHECK_APN_STATE:
  446. {
  447. if(OperationEvent == LTE_MODULE_OP_APN_CONNECTED_EVENT)
  448. {
  449. if(mIsInitializing == true) //The first time, try to connect the server immediately
  450. {
  451. mIsInitializing = false;
  452. //Send the request to connect to Mastercontroller
  453. LTESendCommandToModule(LTE_MODULE_CONNECT_TO_MASTER_CMD);
  454. mLTEModuleOperationSMState = LTE_MODULE_OPERATION_WAIT_CONNECT_SERVER_STATE;
  455. }
  456. else
  457. {
  458. mCurrentCmd = LTE_MODULE_NO_CMD;
  459. mLTEModuleOperationSMState = LTE_MODULE_OPERATION_STANDBY_STATE;
  460. }
  461. }
  462. else if(OperationEvent == LTE_MODULE_OP_APN_DISCONNECTED_EVENT)
  463. {
  464. //Let the main loop retry later...
  465. mCurrentCmd = LTE_MODULE_NO_CMD;
  466. mLTEModuleOperationSMState = LTE_MODULE_OPERATION_STANDBY_STATE;
  467. }
  468. else if(OperationEvent == LTE_MODULE_OP_TICK_EVENT)
  469. {
  470. if(IsTimerExpired(LTE_COMM_TIMER) == true)
  471. {
  472. LTEModuleReset();
  473. }
  474. }
  475. break;
  476. }
  477. case LTE_MODULE_OPERATION_WAIT_CONNECT_SERVER_STATE:
  478. {
  479. if(OperationEvent == LTE_MODULE_OP_SERVER_CONNECTED_EVENT)
  480. {
  481. mCurrentCmd = LTE_MODULE_NO_CMD;
  482. mLTEModuleOperationSMState = LTE_MODULE_OPERATION_STANDBY_STATE;
  483. TimerStart(LTE_MODULE_TIMER,LTE_MODULE_CONNECTION_CHECK_TIMEOUT);
  484. }
  485. else if(OperationEvent == LTE_MODULE_OP_SERVER_DISCONNECTED_EVENT)
  486. {
  487. mCurrentCmd = LTE_MODULE_NO_CMD;
  488. mLTEModuleOperationSMState = LTE_MODULE_OPERATION_STANDBY_STATE;
  489. TimerStart(LTE_MODULE_TIMER,LTE_MODULE_CONNECTION_CHECK_TIMEOUT);
  490. }
  491. else if(OperationEvent == LTE_MODULE_OP_SERVER_CONN_FAILED_EVENT)
  492. {
  493. //TODO: Should we reset the module instead?
  494. mCurrentCmd = LTE_MODULE_NO_CMD;
  495. mLTEModuleOperationSMState = LTE_MODULE_OPERATION_STANDBY_STATE;
  496. TimerStart(LTE_MODULE_TIMER,LTE_MODULE_CONNECTION_CHECK_TIMEOUT);
  497. }
  498. else if(OperationEvent == LTE_MODULE_OP_TICK_EVENT)
  499. {
  500. if(IsTimerExpired(LTE_COMM_TIMER) == true)
  501. {
  502. LTEModuleReset();
  503. }
  504. }
  505. break;
  506. }
  507. case LTE_MODULE_OPERATION_WAIT_DISCONNECT_SERVER_STATE:
  508. {
  509. if(OperationEvent == LTE_MODULE_OP_SERVER_DISCONNECTED_EVENT)
  510. {
  511. //Always reconnect after a forced disconnection..
  512. mLTEModuleOperationSMState = LTE_MODULE_OPERATION_WAIT_CONNECT_SERVER_STATE;
  513. LTESendCommandToModule(LTE_MODULE_CONNECT_TO_MASTER_CMD);
  514. }
  515. else if(OperationEvent == LTE_MODULE_OP_TICK_EVENT)
  516. {
  517. if(IsTimerExpired(LTE_COMM_TIMER) == true)
  518. {
  519. LTEModuleReset();
  520. }
  521. }
  522. break;
  523. }
  524. case LTE_MODULE_OPERATION_STANDBY_STATE:
  525. {
  526. if(OperationEvent == LTE_MODULE_OP_TICK_EVENT)
  527. {
  528. if(IsTimerRunning(LTE_COMM_TIMER) == true)
  529. {
  530. TimerStop(LTE_COMM_TIMER);
  531. }
  532. switch(mLTEModuleOperationSMSubState)
  533. {
  534. case LTE_MODULE_OPERATION_NOMINAL_SUBSTATE:
  535. {
  536. if(IsTimerExpired(LTE_MODULE_TIMER) == true)
  537. {
  538. if(mMasterConnected == true) //All is good for now...
  539. {
  540. char tmp[] = "Ca marche\n\r";
  541. mNbMasterReconnectCount = 0;
  542. TimerStart(LTE_MODULE_TIMER,LTE_MODULE_CONNECTION_CHECK_TIMEOUT);
  543. }
  544. else
  545. {
  546. //Master connection is lost... try to reconnect.
  547. if(mNbMasterReconnectCount < LTE_MODULE_MAX_MASTER_CONNECT_RETRY)
  548. {
  549. mNbMasterReconnectCount++;
  550. mLTEModuleOperationSMSubState = LTE_MODULE_OPERATION_RECONNECT_MASTER_SUBSTATE;
  551. mLTEModuleOperationSMState = LTE_MODULE_OPERATION_WAIT_DISCONNECT_SERVER_STATE;
  552. LTESendCommandToModule(LTE_MODULE_DISCONNECT_FROM_MASTER_CMD); //Always disconnect before reconnecting...
  553. // SyslogNewString("Master reconnection attempt\n");
  554. }
  555. else //We tried 10 times, check the APN
  556. {
  557. mLTEModuleOperationSMState = LTE_MODULE_OPERATION_CHECK_APN_STATE;
  558. mLTEModuleOperationSMSubState = LTE_MODULE_OPERATION_CHECK_APN_SUBSTATE;
  559. LTESendCommandToModule(LTE_MODULE_CHECK_APN_CONNECTION_CMD);
  560. mNbMasterReconnectCount = 0;
  561. // SyslogNewString("Master reconnection attempt count reached.. checking APN\n");
  562. }
  563. }
  564. }
  565. break;
  566. }
  567. case LTE_MODULE_OPERATION_RECONNECT_MASTER_SUBSTATE:
  568. {
  569. mLTEModuleOperationSMSubState = LTE_MODULE_OPERATION_NOMINAL_SUBSTATE;
  570. //TODO: check for SOCKET ERROR result code and reset APN directly here?
  571. // if(mMasterSocketError == true)
  572. // {
  573. // mMasterSocketError = false;
  574. // mLTEModuleOperationSMState = LTE_MODULE_OPERATION_CHECK_APN_STATE;
  575. // mLTEModuleOperationSMSubState = LTE_MODULE_OPERATION_CHECK_APN_SUBSTATE;
  576. // LTESendCommandToModule(LTE_MODULE_CHECK_APN_CONNECTION_CMD);
  577. // mNbMasterReconnectCount = 0;
  578. // }
  579. break;
  580. }
  581. case LTE_MODULE_OPERATION_CHECK_APN_SUBSTATE:
  582. {
  583. if(mAPNConnected == true)
  584. {
  585. mLTEModuleOperationSMSubState = LTE_MODULE_OPERATION_NOMINAL_SUBSTATE;
  586. }
  587. else //APN is disconnected.. try reconnecting.
  588. {
  589. mLTEModuleOperationSMState = LTE_MODULE_OPERATION_WAIT_CONNECT_APN_STATE;
  590. mLTEModuleOperationSMSubState = LTE_MODULE_OPERATION_RECONNECT_APN_SUBSTATE;
  591. LTESendCommandToModule(LTE_MODULE_CONNECT_APN_CMD);
  592. }
  593. break;
  594. }
  595. case LTE_MODULE_OPERATION_RECONNECT_APN_SUBSTATE:
  596. {
  597. mLTEModuleOperationSMSubState = LTE_MODULE_OPERATION_NOMINAL_SUBSTATE;
  598. break;
  599. }
  600. default:
  601. {
  602. break;
  603. }
  604. }
  605. }
  606. else if(OperationEvent == LTE_MODULE_OP_MASTER_DATA_READY_EVENT)
  607. {
  608. LTESendCommandToModule(LTE_MODULE_RX_DATA_CMD);
  609. mLTEModuleOperationSMState = LTE_MODULE_OPERATION_WAIT_FOR_DATA_STATE;
  610. }
  611. else if(OperationEvent == LTE_MODULE_OP_MASTER_SEND_DATA_REQUEST_EVENT)
  612. {
  613. if(mMasterConnected == true)
  614. {
  615. LTESendCommandToModule(LTE_MODULE_TX_DATA_CMD);
  616. mLTEModuleOperationSMState = LTE_MODULE_OPERATION_SENDING_DATA_STATE;
  617. }
  618. }
  619. break;
  620. }
  621. case LTE_MODULE_OPERATION_WAIT_FOR_DATA_STATE:
  622. {
  623. if(OperationEvent == LTE_MODULE_OP_MASTER_DATA_RECEIVED_EVENT)
  624. {
  625. mCurrentCmd = LTE_MODULE_NO_CMD;
  626. mLTEModuleOperationSMState = LTE_MODULE_OPERATION_STANDBY_STATE;
  627. }
  628. else if(OperationEvent == LTE_MODULE_OP_TICK_EVENT)
  629. {
  630. if(IsTimerExpired(LTE_COMM_TIMER) == true)
  631. {
  632. LTEModuleReset();
  633. }
  634. }
  635. break;
  636. }
  637. case LTE_MODULE_OPERATION_SENDING_DATA_STATE:
  638. {
  639. if(OperationEvent == LTE_MODULE_OP_TICK_EVENT)
  640. {
  641. if(IsTimerExpired(LTE_COMM_TIMER) == true)
  642. {
  643. LTEModuleReset();
  644. }
  645. }
  646. else if(OperationEvent == LTE_MODULE_OP_MASTER_DATA_SENT_EVENT)
  647. {
  648. mCurrentCmd = LTE_MODULE_NO_CMD;
  649. mLTEModuleOperationSMState = LTE_MODULE_OPERATION_STANDBY_STATE;
  650. }
  651. break;
  652. }
  653. }
  654. }
  655. void LTEModuleNewDataReady()
  656. {
  657. LTEModuleOperationSM(LTE_MODULE_OP_MASTER_DATA_READY_EVENT);
  658. }
  659. void LTEModuleDataReceived(char *Data, int Size)
  660. {
  661. LTEModuleOperationSM(LTE_MODULE_OP_MASTER_DATA_RECEIVED_EVENT);
  662. int i;
  663. for(i = 0; i < Size; i++)
  664. {
  665. ProtocolAnalyzeNewData(Data[i], NETWORK_PROTOCOL_USER_LTE);
  666. }
  667. }
  668. int LTESendCommandToModule(int Cmd)
  669. {
  670. switch(Cmd)
  671. {
  672. TimerStart(LTE_COMM_TIMER,LTE_MODULE_MAX_COMM_TIMEOUT);
  673. case LTE_MODULE_CONNECT_APN_CMD:
  674. {
  675. mCurrentCmd = LTE_MODULE_CONNECT_APN_CMD;
  676. SendDataToLteModule(mActivateNetworkCmd,strlen(mActivateNetworkCmd));
  677. break;
  678. }
  679. case LTE_MODULE_DISCONNECT_APN_CMD:
  680. {
  681. mCurrentCmd = LTE_MODULE_DISCONNECT_APN_CMD;
  682. SendDataToLteModule(mDisconnectNetworkCmd,strlen(mDisconnectNetworkCmd));
  683. break;
  684. }
  685. case LTE_MODULE_CONNECT_TO_MASTER_CMD:
  686. {
  687. mCurrentCmd = LTE_MODULE_CONNECT_TO_MASTER_CMD;
  688. SendDataToLteModule(mConnectToMasterCmd,strlen(mConnectToMasterCmd));
  689. break;
  690. }
  691. case LTE_MODULE_DISCONNECT_FROM_MASTER_CMD:
  692. {
  693. mCurrentCmd = LTE_MODULE_DISCONNECT_FROM_MASTER_CMD;
  694. SendDataToLteModule(mDisconnectFromMasterCmd,strlen(mDisconnectFromMasterCmd));
  695. break;
  696. }
  697. case LTE_MODULE_RX_DATA_CMD:
  698. {
  699. mCurrentCmd = LTE_MODULE_RX_DATA_CMD;
  700. SendDataToLteModule(mReceiveDataCmd,strlen(mReceiveDataCmd));
  701. break;
  702. }
  703. case LTE_MODULE_TX_DATA_CMD:
  704. {
  705. char Cmd[25];
  706. sprintf(Cmd,"AT+CASEND=0,%d\r",mMasterTxSize);
  707. mCurrentCmd = LTE_MODULE_TX_DATA_CMD;
  708. SendDataToLteModule(Cmd,strlen(Cmd));
  709. break;
  710. }
  711. case LTE_MODULE_CHECK_APN_CONNECTION_CMD:
  712. {
  713. mCurrentCmd = LTE_MODULE_CHECK_APN_CONNECTION_CMD;
  714. SendDataToLteModule(mCheckAPNConnectionCmd,strlen(mCheckAPNConnectionCmd));
  715. break;
  716. }
  717. case LTE_MODULE_CHECK_MASTER_CONNECTION_CMD:
  718. {
  719. break;
  720. }
  721. case LTE_MODULE_NO_CMD:
  722. default:
  723. {
  724. TimerStop(LTE_COMM_TIMER);
  725. mCurrentCmd = LTE_MODULE_NO_CMD;
  726. return RET_ERROR;
  727. break;
  728. }
  729. }
  730. return RET_OK;
  731. }
  732. void LTEModuleMasterCtrlCommStatus(bool Offline)
  733. {
  734. if(Offline == true)
  735. {
  736. mMasterConnected = false;
  737. }
  738. // else
  739. // mMasterConnected = true;
  740. }
  741. //This is the function to call from outside to send data to the server
  742. int LTESendDataToMaster(char *Buffer, int Size)
  743. {
  744. // LTE_MODULE_TX_LED_PIN = LED_ON;
  745. if(Size > MAX_MESSAGE_SIZE)
  746. {
  747. return RET_ERROR;
  748. }
  749. if(mMasterConnected == false)
  750. {
  751. return RET_ERROR;
  752. }
  753. memcpy(mMasterTxBuffer,Buffer,Size);
  754. mMasterTxSize = Size;
  755. LTEModuleOperationSM(LTE_MODULE_OP_MASTER_SEND_DATA_REQUEST_EVENT);
  756. return RET_OK;
  757. }
  758. //The module is ready... send the payload so it can transmit it to the master
  759. int LTESendMasterBufferToModule()
  760. {
  761. SendDataToLteModule(mMasterTxBuffer,mMasterTxSize);
  762. // LTE_MODULE_TX_LED_PIN = LED_OFF;
  763. return RET_OK;
  764. }
  765. bool LTEModuleIsMasterConnected()
  766. {
  767. return mMasterConnected;
  768. }