LTE_M8321.ino 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550
  1. /*
  2. Description: Make calls using LTE Module
  3. */
  4. #include <M5Stack.h>
  5. #include <stdint.h>
  6. #include <vector>
  7. TFT_eSprite Disbuff = TFT_eSprite(&M5.Lcd);
  8. TaskHandle_t xhandle_lte_event = NULL;
  9. SemaphoreHandle_t command_list_samap;
  10. typedef enum
  11. {
  12. kQUERY_MO = 0,
  13. KTEST_MO,
  14. kASSIGN_MO,
  15. kACTION_MO,
  16. kQUERY_MT,
  17. kTEST_MT,
  18. kASSIGN_MT,
  19. kACTION_MT,
  20. kINFORM
  21. } LTEMsg_t;
  22. typedef enum
  23. {
  24. kErrorSendTimeOUT = 0xe1,
  25. kErrorReError = 0xe2,
  26. kErroeSendError = 0xe3,
  27. kSendReady = 0,
  28. kSending = 1,
  29. kWaitforMsg = 2,
  30. kWaitforRead = 3,
  31. kReOK
  32. } LTEState_t;
  33. struct ATCommand
  34. {
  35. uint8_t command_type;
  36. String str_command;
  37. uint16_t send_max_number;
  38. uint16_t max_time;
  39. uint8_t state;
  40. String read_str;
  41. uint16_t _send_count;
  42. uint16_t _send_time_count;
  43. } user;
  44. using namespace std;
  45. vector<ATCommand> serial_at;
  46. String zmmi_str;
  47. void LTEModuleTask(void *arg)
  48. {
  49. int Number = 0;
  50. String restr;
  51. while (1)
  52. {
  53. xSemaphoreTake(command_list_samap, portMAX_DELAY);
  54. if (Serial2.available() != 0)
  55. {
  56. String str = Serial2.readString();
  57. restr += str;
  58. if (restr.indexOf("\r\n") != -1)
  59. {
  60. }
  61. if (restr.indexOf("+ZMMI:") != -1)
  62. {
  63. zmmi_str = restr;
  64. }
  65. else if ((restr.indexOf("OK") != -1) || (restr.indexOf("ERROR") != -1))
  66. {
  67. Serial.print(restr);
  68. if (restr.indexOf("OK") != -1)
  69. {
  70. if ((serial_at[0].command_type == kACTION_MO) || (serial_at[0].command_type == kASSIGN_MO))
  71. {
  72. serial_at.erase(serial_at.begin());
  73. Serial.printf("erase now %d\n", serial_at.size());
  74. }
  75. else
  76. {
  77. serial_at[0].read_str = restr;
  78. serial_at[0].state = kWaitforRead;
  79. }
  80. }
  81. else if (restr.indexOf("ERROR") != -1)
  82. {
  83. serial_at[0].state = kErrorReError;
  84. }
  85. else
  86. {
  87. }
  88. restr.clear();
  89. }
  90. }
  91. if (serial_at.empty() != true)
  92. {
  93. Number = 0;
  94. switch (serial_at[0].state)
  95. {
  96. case kSendReady:
  97. Serial.printf(serial_at[0].str_command.c_str());
  98. Serial2.write(serial_at[0].str_command.c_str());
  99. serial_at[0].state = kSending;
  100. break;
  101. case kSending:
  102. if (serial_at[0]._send_time_count > 0)
  103. {
  104. serial_at[0]._send_time_count--;
  105. }
  106. else
  107. {
  108. serial_at[0].state = kWaitforMsg;
  109. }
  110. /* code */
  111. break;
  112. case kWaitforMsg:
  113. if (serial_at[0]._send_count > 0)
  114. {
  115. serial_at[0]._send_count--;
  116. serial_at[0]._send_time_count = serial_at[0].max_time;
  117. Serial.printf(serial_at[0].str_command.c_str());
  118. Serial2.write(serial_at[0].str_command.c_str());
  119. restr.clear();
  120. serial_at[0].state = 1;
  121. }
  122. else
  123. {
  124. serial_at[0].state = kErrorSendTimeOUT;
  125. }
  126. /* code */
  127. break;
  128. case kWaitforRead:
  129. /* code */
  130. break;
  131. case 4:
  132. /* code */
  133. break;
  134. case kErrorSendTimeOUT:
  135. /* code */
  136. break;
  137. case 0xe2:
  138. /* code */
  139. break;
  140. default:
  141. break;
  142. }
  143. }
  144. xSemaphoreGive(command_list_samap);
  145. delay(10);
  146. }
  147. }
  148. void AddMsg(String str, uint8_t type, uint16_t sendcount, uint16_t sendtime)
  149. {
  150. struct ATCommand newcommand;
  151. newcommand.str_command = str;
  152. newcommand.command_type = type;
  153. newcommand.max_time = sendtime;
  154. newcommand.send_max_number = sendcount;
  155. newcommand.state = 0;
  156. newcommand._send_count = sendcount;
  157. newcommand._send_time_count = sendtime;
  158. xSemaphoreTake(command_list_samap, portMAX_DELAY);
  159. serial_at.push_back(newcommand);
  160. xSemaphoreGive(command_list_samap);
  161. }
  162. uint8_t readSendState(uint32_t number)
  163. {
  164. xSemaphoreTake(command_list_samap, portMAX_DELAY);
  165. uint8_t restate = serial_at[number].state;
  166. xSemaphoreGive(command_list_samap);
  167. return restate;
  168. }
  169. uint32_t getATMsgSize()
  170. {
  171. xSemaphoreTake(command_list_samap, portMAX_DELAY);
  172. uint32_t restate = serial_at.size();
  173. xSemaphoreGive(command_list_samap);
  174. return restate;
  175. }
  176. String ReadMsgstr(uint32_t number)
  177. {
  178. xSemaphoreTake(command_list_samap, portMAX_DELAY);
  179. String restate = serial_at[number].read_str;
  180. xSemaphoreGive(command_list_samap);
  181. return restate;
  182. }
  183. bool EraseFirstMsg()
  184. {
  185. xSemaphoreTake(command_list_samap, portMAX_DELAY);
  186. serial_at.erase(serial_at.begin());
  187. xSemaphoreGive(command_list_samap);
  188. return true;
  189. }
  190. uint16_t GetstrNumber(String Str, uint32_t *ptrbuff)
  191. {
  192. uint16_t count = 0;
  193. String Numberstr;
  194. int indexpos = 0;
  195. while (Str.length() > 0)
  196. {
  197. indexpos = Str.indexOf(",");
  198. if (indexpos != -1)
  199. {
  200. Numberstr = Str.substring(0, Str.indexOf(","));
  201. Str = Str.substring(Str.indexOf(",") + 1, Str.length());
  202. ptrbuff[count] = Numberstr.toInt();
  203. count++;
  204. }
  205. else
  206. {
  207. ptrbuff[count] = Str.toInt();
  208. count++;
  209. break;
  210. }
  211. }
  212. return count;
  213. }
  214. vector<String> restr_v;
  215. uint16_t GetstrNumber(String StartStr, String EndStr, String Str)
  216. {
  217. uint16_t count = 0;
  218. String Numberstr;
  219. int indexpos = 0;
  220. Str = Str.substring(Str.indexOf(StartStr) + StartStr.length(), Str.indexOf(EndStr));
  221. Str.trim();
  222. restr_v.clear();
  223. while (Str.length() > 0)
  224. {
  225. indexpos = Str.indexOf(",");
  226. if (indexpos != -1)
  227. {
  228. Numberstr = Str.substring(0, Str.indexOf(","));
  229. Str = Str.substring(Str.indexOf(",") + 1, Str.length());
  230. restr_v.push_back(Numberstr);
  231. count++;
  232. }
  233. else
  234. {
  235. restr_v.push_back(Numberstr);
  236. ;
  237. count++;
  238. break;
  239. }
  240. }
  241. return count;
  242. }
  243. String getReString(uint16_t Number)
  244. {
  245. if (restr_v.empty())
  246. {
  247. return String("");
  248. }
  249. return restr_v.at(Number);
  250. }
  251. uint16_t GetstrNumber(String StartStr, String EndStr, String Str, uint32_t *ptrbuff)
  252. {
  253. uint16_t count = 0;
  254. String Numberstr;
  255. int indexpos = 0;
  256. Str = Str.substring(Str.indexOf(StartStr) + StartStr.length(), Str.indexOf(EndStr));
  257. Str.trim();
  258. while (Str.length() > 0)
  259. {
  260. indexpos = Str.indexOf(",");
  261. if (indexpos != -1)
  262. {
  263. Numberstr = Str.substring(0, Str.indexOf(","));
  264. Str = Str.substring(Str.indexOf(",") + 1, Str.length());
  265. ptrbuff[count] = Numberstr.toInt();
  266. count++;
  267. }
  268. else
  269. {
  270. ptrbuff[count] = Str.toInt();
  271. count++;
  272. break;
  273. }
  274. }
  275. return count;
  276. }
  277. uint32_t numberbuff[128];
  278. String readstr;
  279. void setup()
  280. {
  281. // put your setup code here, to run once:
  282. M5.begin();
  283. M5.Power.begin();
  284. Serial.begin(115200);
  285. Serial2.begin(115200, SERIAL_8N1, 16, 17);
  286. Serial.printf("FUCK STC\n");
  287. Disbuff.createSprite(320, 100);
  288. Disbuff.fillRect(0, 0, 320, 100, BLACK);
  289. Disbuff.drawRect(0, 0, 320, 20, Disbuff.color565(36, 36, 36));
  290. Disbuff.pushSprite(0, 0);
  291. pinMode(2, OUTPUT);
  292. digitalWrite(2, 0);
  293. Disbuff.setTextColor(WHITE);
  294. Disbuff.setTextSize(1);
  295. for (int i = 0; i < 100; i++)
  296. {
  297. Disbuff.fillRect(0, 0, 320, 20, Disbuff.color565(36, 36, 36));
  298. Disbuff.pushSprite(0, 0);
  299. Disbuff.setCursor(7, 7);
  300. Disbuff.printf("Reset Module %02d", i);
  301. Disbuff.pushSprite(0, 0);
  302. delay(10);
  303. }
  304. digitalWrite(2, 1);
  305. xTaskCreate(LTEModuleTask, "LTEModuleTask", 1024 * 2, (void *)0, 4, &xhandle_lte_event);
  306. command_list_samap = xSemaphoreCreateMutex();
  307. xSemaphoreGive(command_list_samap);
  308. int count_t = 0;
  309. AddMsg("AT\r\n", kASSIGN_MO, 1000, 1000);
  310. while (getATMsgSize() > 0)
  311. {
  312. Disbuff.fillRect(0, 0, 320, 20, Disbuff.color565(36, 36, 36));
  313. Disbuff.pushSprite(0, 0);
  314. Disbuff.setCursor(7, 7);
  315. Disbuff.printf("Wait Modlue Srart %02d", count_t);
  316. Disbuff.pushSprite(0, 0);
  317. count_t++;
  318. delay(300);
  319. }
  320. /*
  321. AddMsg("AT+GMR?\r\n", kQUERY_MT, 1000, 1000);
  322. while ((readSendState(0) == kSendReady) || (readSendState(0) == kSending) || (readSendState(0) == kWaitforMsg))delay(50);
  323. */
  324. AddMsg("AT^CARDMODE\r\n", kQUERY_MT, 1000, 1000);
  325. while ((readSendState(0) == kSendReady) || (readSendState(0) == kSending) || (readSendState(0) == kWaitforMsg))
  326. delay(50);
  327. Serial.printf("Read state = %d \n", readSendState(0));
  328. readstr = ReadMsgstr(0).c_str();
  329. int count = GetstrNumber("CARDMODE:", "OK", readstr, numberbuff);
  330. if (count != 0)
  331. {
  332. Serial.printf("CardMode = %d", numberbuff[0]);
  333. Disbuff.fillRect(0, 0, 320, 20, Disbuff.color565(36, 36, 36));
  334. Disbuff.pushSprite(0, 0);
  335. Disbuff.setCursor(7, 7);
  336. switch (numberbuff[0])
  337. {
  338. case 0:
  339. Disbuff.printf("Unknown Card");
  340. break;
  341. case 1:
  342. Disbuff.printf("SIM Card");
  343. break;
  344. case 2:
  345. Disbuff.printf("USIM Card");
  346. break;
  347. default:
  348. Disbuff.printf("Unknown Card:E");
  349. break;
  350. }
  351. Disbuff.pushSprite(0, 0);
  352. }
  353. EraseFirstMsg();
  354. AddMsg("AT+CFUN=1\r\n", kASSIGN_MO, 1000, 1000);
  355. AddMsg("AT+CGDCONT=1,\"IP\"\r\n", kASSIGN_MO, 1000, 1000);
  356. AddMsg("AT+CLIP=1\r\n", kASSIGN_MO, 1000, 1000);
  357. AddMsg("AT+CREG=1\r\n", kASSIGN_MO, 1000, 1000);
  358. AddMsg("AT+CGREG=1\r\n", kASSIGN_MO, 1000, 1000);
  359. AddMsg("AT+COPS=1,2,\"46008\",0\r\n", kASSIGN_MO, 1000, 1000);
  360. AddMsg("AT+S32K=0\r\n", kASSIGN_MO, 1000, 1000);
  361. }
  362. uint8_t restate;
  363. void loop()
  364. {
  365. AddMsg("AT+CSQ\r\n", kQUERY_MT, 1000, 1000);
  366. while ((readSendState(0) == kSendReady) || (readSendState(0) == kSending) || (readSendState(0) == kWaitforMsg))
  367. delay(50);
  368. restate = readSendState(0);
  369. readstr = ReadMsgstr(0).c_str();
  370. Serial.printf("Read state = %d \n", restate);
  371. if ((readstr.indexOf("+CSQ:") != -1) && (restate == kWaitforRead))
  372. {
  373. int count = GetstrNumber("+CSQ:", "OK", readstr, numberbuff);
  374. if (count != 0)
  375. {
  376. Disbuff.fillRect(220, 0, 100, 20, Disbuff.color565(36, 36, 36));
  377. Disbuff.setCursor(220, 7);
  378. Disbuff.setTextColor(WHITE);
  379. Disbuff.setTextSize(1);
  380. switch (numberbuff[2])
  381. {
  382. case 0:
  383. Disbuff.printf("no service");
  384. break;
  385. case 3:
  386. Disbuff.printf("GSM/GPRS ");
  387. if (numberbuff[0] == 99)
  388. Disbuff.printf("UnKnown");
  389. else if (numberbuff[0] == 31)
  390. Disbuff.printf(">-51dBm");
  391. else if (numberbuff[0] == 1)
  392. Disbuff.printf("UnKnown");
  393. else if (numberbuff[0] == 0)
  394. Disbuff.printf("<-110dBm");
  395. else
  396. Disbuff.printf("-%ddBm", 109 - (numberbuff[0] - 2) * 2);
  397. break;
  398. case 5:
  399. Disbuff.printf("WCDMA ");
  400. numberbuff[0] -= 100;
  401. if (numberbuff[0] == 99)
  402. Disbuff.printf("UnKnown");
  403. else if (numberbuff[0] == 91)
  404. Disbuff.printf(">-25dBm");
  405. else if (numberbuff[0] == 0)
  406. Disbuff.printf("<-115dBm");
  407. else
  408. Disbuff.printf("-%ddBm", 115 - (numberbuff[0] - 1));
  409. break;
  410. case 15:
  411. Disbuff.printf("TD-SCDMA ");
  412. numberbuff[0] -= 100;
  413. if (numberbuff[0] == 99)
  414. Disbuff.printf("UnKnown");
  415. else if (numberbuff[0] == 91)
  416. Disbuff.printf(">-25dBm");
  417. else if (numberbuff[0] == 0)
  418. Disbuff.printf("<-115dBm");
  419. else
  420. Disbuff.printf("-%ddBm", 115 - (numberbuff[0] - 1));
  421. break;
  422. case 17:
  423. Disbuff.printf("LTE ");
  424. numberbuff[0] -= 100;
  425. if (numberbuff[0] == 99)
  426. Disbuff.printf("UnKnown");
  427. else if (numberbuff[0] == 97)
  428. Disbuff.printf(">-44dBm");
  429. else if (numberbuff[0] == 0)
  430. Disbuff.printf("<-140dBm");
  431. else
  432. Disbuff.printf("-%ddBm", 140 - (numberbuff[0] - 1));
  433. break;
  434. default:
  435. Disbuff.printf("Unknown Card ");
  436. break;
  437. }
  438. //Disbuff.setCursor(160,7);
  439. }
  440. else
  441. {
  442. /* code */
  443. }
  444. }
  445. Disbuff.pushSprite(0, 0);
  446. EraseFirstMsg();
  447. AddMsg("AT+COPS=3,0\r\n", kASSIGN_MO, 1000, 1000);
  448. AddMsg("AT+COPS?\r\n", kQUERY_MT, 1000, 1000);
  449. while ((readSendState(0) == kSendReady) || (readSendState(0) == kSending) || (readSendState(0) == kWaitforMsg))
  450. delay(50);
  451. restate = readSendState(0);
  452. readstr = ReadMsgstr(0).c_str();
  453. Disbuff.fillRect(0, 20, 320, 10, BLACK);
  454. Disbuff.setCursor(20, 25);
  455. Disbuff.setTextColor(WHITE);
  456. Disbuff.setTextSize(1);
  457. readstr.trim();
  458. Disbuff.print(readstr);
  459. if ((readstr.indexOf("+COPS:") != -1) && (restate == kWaitforRead))
  460. {
  461. int count = GetstrNumber("+COPS:", "OK", readstr);
  462. Disbuff.fillRect(100, 0, 120, 20, Disbuff.color565(36, 36, 36));
  463. Disbuff.setCursor(100, 7);
  464. Disbuff.setTextColor(WHITE);
  465. Disbuff.setTextSize(1);
  466. if (count == 1)
  467. {
  468. Disbuff.printf("NO Operator");
  469. }
  470. else if (count > 1)
  471. {
  472. Disbuff.print(getReString(2).c_str());
  473. }
  474. Disbuff.pushSprite(0, 0);
  475. }
  476. Serial.print(readstr);
  477. EraseFirstMsg();
  478. //*******************************************************
  479. // call +18200000000
  480. /*
  481. delay(500);
  482. M5.update();
  483. if( M5.BtnA.wasPressed())
  484. {
  485. Disbuff.fillRect(0,70,320,10,BLACK);
  486. Disbuff.setCursor(20,70);
  487. Disbuff.setTextColor(WHITE);
  488. Disbuff.setTextSize(1);
  489. Disbuff.printf("Calling +18200000000");
  490. Disbuff.pushSprite(0,0);
  491. AddMsg("ATD18200000000;\r\n", kQUERY_MT, 1000, 1000);
  492. ATD
  493. while ((readSendState(0) == kSendReady) || (readSendState(0) == kSending) || (readSendState(0) == kWaitforMsg))delay(50);
  494. Serial.printf("Read state = %d \n", readSendState(0));
  495. readstr = ReadMsgstr(0).c_str();
  496. Serial.print(readstr);
  497. while(1)
  498. {
  499. M5.update();
  500. if( M5.BtnA.wasPressed()) break;
  501. delay(100);
  502. Disbuff.pushSprite(0,0);
  503. }
  504. Disbuff.printf("End");
  505. EraseFirstMsg();
  506. AddMsg("AT+CHUP\r\n", kASSIGN_MO, 1000, 1000);
  507. }
  508. */
  509. // put your main code here, to run repeatedly:
  510. }