COM_LTE-DATA.ino 7.7 KB

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