COM_LTE.ino 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394
  1. /*
  2. Description: screen will display the signal strength and network access status
  3. press buttonA to dial phonenumber.
  4. ATD13800088888 is phone number, you can change
  5. Note: Set the DIP switch to 5 and 13.
  6. */
  7. #include <M5Stack.h>
  8. #include <stdint.h>
  9. #include <vector>
  10. #include "TFTTerminal.h"
  11. TFT_eSprite Disbuff = TFT_eSprite(&M5.Lcd);
  12. TFT_eSprite TerminalBuff = TFT_eSprite(&M5.Lcd);
  13. TFTTerminal terminal(&TerminalBuff);
  14. TaskHandle_t xhandle_lte_event = NULL;
  15. SemaphoreHandle_t command_list_samap;
  16. typedef enum
  17. {
  18. kQUERY_MO = 0,
  19. KTEST_MO,
  20. kASSIGN_MO,
  21. kACTION_MO,
  22. kQUERY_MT,
  23. kTEST_MT,
  24. kASSIGN_MT,
  25. kACTION_MT,
  26. kINFORM
  27. } LTEMsg_t;
  28. typedef enum
  29. {
  30. kErrorSendTimeOUT = 0xe1,
  31. kErrorReError = 0xe2,
  32. kErroeSendError = 0xe3,
  33. kSendReady = 0,
  34. kSending = 1,
  35. kWaitforMsg = 2,
  36. kWaitforRead = 3,
  37. kReOK
  38. } LTEState_t;
  39. struct ATCommand
  40. {
  41. uint8_t command_type;
  42. String str_command;
  43. uint16_t send_max_number;
  44. uint16_t max_time;
  45. uint8_t state;
  46. String read_str;
  47. uint16_t _send_count;
  48. uint16_t _send_time_count;
  49. } user;
  50. using namespace std;
  51. vector<ATCommand> serial_at;
  52. String zmmi_str;
  53. void LTEModuleTask(void *arg)
  54. {
  55. int Number = 0;
  56. String restr;
  57. while (1)
  58. {
  59. xSemaphoreTake(command_list_samap, portMAX_DELAY);
  60. if (Serial2.available() != 0)
  61. {
  62. String str = Serial2.readString();
  63. restr += str;
  64. if(restr.indexOf("\r\n") != -1)
  65. {
  66. }
  67. if( restr.indexOf("+ZMMI:")!= -1)
  68. {
  69. zmmi_str = restr;
  70. }
  71. else if ((restr.indexOf("OK") != -1) || (restr.indexOf("ERROR") != -1))
  72. {
  73. Serial.print(restr);
  74. if (restr.indexOf("OK") != -1)
  75. {
  76. if ((serial_at[0].command_type == kACTION_MO) || (serial_at[0].command_type == kASSIGN_MO))
  77. {
  78. serial_at.erase(serial_at.begin());
  79. Serial.printf("erase now %d\n", serial_at.size());
  80. }
  81. else
  82. {
  83. serial_at[0].read_str = restr;
  84. serial_at[0].state = kWaitforRead;
  85. }
  86. }
  87. else if (restr.indexOf("ERROR") != -1)
  88. {
  89. serial_at[0].state = kErrorReError;
  90. }
  91. else
  92. {
  93. }
  94. restr.clear();
  95. }
  96. }
  97. if (serial_at.empty() != true)
  98. {
  99. Number = 0;
  100. switch (serial_at[0].state)
  101. {
  102. case kSendReady:
  103. Serial.printf(serial_at[0].str_command.c_str());
  104. Serial2.write(serial_at[0].str_command.c_str());
  105. serial_at[0].state = kSending;
  106. break;
  107. case kSending:
  108. if (serial_at[0]._send_time_count > 0)
  109. {
  110. serial_at[0]._send_time_count--;
  111. }
  112. else
  113. {
  114. serial_at[0].state = kWaitforMsg;
  115. }
  116. /* code */
  117. break;
  118. case kWaitforMsg:
  119. if (serial_at[0]._send_count > 0)
  120. {
  121. serial_at[0]._send_count--;
  122. serial_at[0]._send_time_count = serial_at[0].max_time;
  123. Serial.printf(serial_at[0].str_command.c_str());
  124. Serial2.write(serial_at[0].str_command.c_str());
  125. restr.clear();
  126. serial_at[0].state = 1;
  127. }
  128. else
  129. {
  130. serial_at[0].state = kErrorSendTimeOUT;
  131. }
  132. /* code */
  133. break;
  134. case kWaitforRead:
  135. /* code */
  136. break;
  137. case 4:
  138. /* code */
  139. break;
  140. case kErrorSendTimeOUT:
  141. /* code */
  142. break;
  143. case 0xe2:
  144. /* code */
  145. break;
  146. default:
  147. break;
  148. }
  149. }
  150. xSemaphoreGive(command_list_samap);
  151. delay(10);
  152. }
  153. }
  154. void AddMsg(String str, uint8_t type, uint16_t sendcount, uint16_t sendtime)
  155. {
  156. struct ATCommand newcommand;
  157. newcommand.str_command = str;
  158. newcommand.command_type = type;
  159. newcommand.max_time = sendtime;
  160. newcommand.send_max_number = sendcount;
  161. newcommand.state = 0;
  162. newcommand._send_count = sendcount;
  163. newcommand._send_time_count = sendtime;
  164. xSemaphoreTake(command_list_samap, portMAX_DELAY);
  165. serial_at.push_back(newcommand);
  166. xSemaphoreGive(command_list_samap);
  167. }
  168. uint8_t readSendState(uint32_t number)
  169. {
  170. xSemaphoreTake(command_list_samap, portMAX_DELAY);
  171. uint8_t restate = serial_at[number].state;
  172. xSemaphoreGive(command_list_samap);
  173. return restate;
  174. }
  175. uint32_t getATMsgSize()
  176. {
  177. xSemaphoreTake(command_list_samap, portMAX_DELAY);
  178. uint32_t restate = serial_at.size();
  179. xSemaphoreGive(command_list_samap);
  180. return restate;
  181. }
  182. String ReadMsgstr(uint32_t number)
  183. {
  184. xSemaphoreTake(command_list_samap, portMAX_DELAY);
  185. String restate = serial_at[number].read_str;
  186. xSemaphoreGive(command_list_samap);
  187. return restate;
  188. }
  189. bool EraseFirstMsg()
  190. {
  191. xSemaphoreTake(command_list_samap, portMAX_DELAY);
  192. serial_at.erase(serial_at.begin());
  193. xSemaphoreGive(command_list_samap);
  194. return true;
  195. }
  196. uint16_t GetstrNumber( String Str, uint32_t* ptrbuff )
  197. {
  198. uint16_t count = 0;
  199. String Numberstr;
  200. int indexpos = 0;
  201. while( Str.length() > 0 )
  202. {
  203. indexpos = Str.indexOf(",");
  204. if( indexpos != -1 )
  205. {
  206. Numberstr = Str.substring(0,Str.indexOf(","));
  207. Str = Str.substring(Str.indexOf(",")+1,Str.length());
  208. ptrbuff[count] = Numberstr.toInt();
  209. count ++;
  210. }
  211. else
  212. {
  213. ptrbuff[count] = Str.toInt();
  214. count ++;
  215. break;
  216. }
  217. }
  218. return count;
  219. }
  220. vector<String> restr_v;
  221. uint16_t GetstrNumber( String StartStr,String EndStr,String Str )
  222. {
  223. uint16_t count = 0;
  224. String Numberstr;
  225. int indexpos = 0;
  226. Str = Str.substring(Str.indexOf(StartStr) + StartStr.length(), Str.indexOf(EndStr));
  227. Str.trim();
  228. restr_v.clear();
  229. while( Str.length() > 0 )
  230. {
  231. indexpos = Str.indexOf(",");
  232. if( indexpos != -1 )
  233. {
  234. Numberstr = Str.substring(0,Str.indexOf(","));
  235. Str = Str.substring(Str.indexOf(",")+1,Str.length());
  236. restr_v.push_back(Numberstr);
  237. count ++;
  238. }
  239. else
  240. {
  241. restr_v.push_back(Numberstr);;
  242. count ++;
  243. break;
  244. }
  245. }
  246. return count;
  247. }
  248. String getReString( uint16_t Number )
  249. {
  250. if( restr_v.empty())
  251. {
  252. return String("");
  253. }
  254. return restr_v.at(Number);
  255. }
  256. uint16_t GetstrNumber( String StartStr,String EndStr,String Str, uint32_t* ptrbuff )
  257. {
  258. uint16_t count = 0;
  259. String Numberstr;
  260. int indexpos = 0;
  261. Str = Str.substring(Str.indexOf(StartStr) + StartStr.length(), Str.indexOf(EndStr));
  262. Str.trim();
  263. while( Str.length() > 0 )
  264. {
  265. indexpos = Str.indexOf(",");
  266. if( indexpos != -1 )
  267. {
  268. Numberstr = Str.substring(0,Str.indexOf(","));
  269. Str = Str.substring(Str.indexOf(",")+1,Str.length());
  270. ptrbuff[count] = Numberstr.toInt();
  271. count ++;
  272. }
  273. else
  274. {
  275. ptrbuff[count] = Str.toInt();
  276. count ++;
  277. break;
  278. }
  279. }
  280. return count;
  281. }
  282. uint32_t numberbuff[128];
  283. String readstr;
  284. void setup()
  285. {
  286. // put your setup code here, to run once:
  287. M5.begin();
  288. Serial.begin(115200);
  289. Serial2.begin(115200, SERIAL_8N1, 5, 13);
  290. Disbuff.createSprite(320,20);
  291. Disbuff.fillRect(0,0,320,20,BLACK);
  292. Disbuff.drawRect(0,0,320,20,Disbuff.color565(36,36,36));
  293. Disbuff.pushSprite(0,0);
  294. TerminalBuff.createSprite(120,220);
  295. TerminalBuff.fillRect(0,0,120,220,BLACK);
  296. TerminalBuff.drawRect(0,0,120,220,Disbuff.color565(36,36,36));
  297. TerminalBuff.pushSprite(0,20);
  298. terminal.setGeometry(0,20,120,220);
  299. pinMode(2, OUTPUT);
  300. digitalWrite(2, 0);
  301. Disbuff.setTextColor(WHITE);
  302. Disbuff.setTextSize(1);
  303. for (int i = 0; i < 100; i++ )
  304. {
  305. Disbuff.fillRect(0,0,320,20,Disbuff.color565(36,36,36));
  306. Disbuff.pushSprite(0,0);
  307. Disbuff.setCursor(7,7);
  308. Disbuff.printf("Reset Module %02d",i);
  309. Disbuff.pushSprite(0,0);
  310. delay(10);
  311. }
  312. digitalWrite(2, 1);
  313. xTaskCreate(LTEModuleTask, "LTEModuleTask", 1024 * 2, (void *)0, 4, &xhandle_lte_event);
  314. command_list_samap = xSemaphoreCreateMutex();
  315. xSemaphoreGive(command_list_samap);
  316. }
  317. uint8_t restate;
  318. void loop()
  319. {
  320. AddMsg("AT+CSQ\r\n", kQUERY_MT, 1000, 1000);
  321. while ((readSendState(0) == kSendReady) || (readSendState(0) == kSending) || (readSendState(0) == kWaitforMsg))delay(50);
  322. restate = readSendState(0);
  323. readstr = ReadMsgstr(0).c_str();
  324. EraseFirstMsg();
  325. terminal.print(readstr);
  326. AddMsg("AT+CREG?\r\n", kQUERY_MT, 1000, 1000);
  327. while ((readSendState(0) == kSendReady) || (readSendState(0) == kSending) || (readSendState(0) == kWaitforMsg))delay(50);
  328. restate = readSendState(0);
  329. readstr = ReadMsgstr(0).c_str();
  330. EraseFirstMsg();
  331. terminal.print(readstr);
  332. delay(500);
  333. M5.update();
  334. if( M5.BtnA.wasPressed())
  335. {
  336. AddMsg("ATD13800088888;\r\n", kQUERY_MT, 1000, 1000);
  337. while ((readSendState(0) == kSendReady) || (readSendState(0) == kSending) || (readSendState(0) == kWaitforMsg))delay(50);
  338. Serial.printf("Read state = %d \n", readSendState(0));
  339. readstr = ReadMsgstr(0).c_str();
  340. Serial.print(readstr);
  341. while(1)
  342. {
  343. M5.update();
  344. if( M5.BtnA.wasPressed()) break;
  345. delay(100);
  346. }
  347. EraseFirstMsg();
  348. AddMsg("AT+CHUP\r\n", kASSIGN_MO, 1000, 1000);
  349. }
  350. // put your main code here, to run repeatedly:
  351. }