Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 
 
 
 

624 wiersze
19 KiB

  1. /*
  2. Description:
  3. This is a template file for standard C header file.
  4. */
  5. /* ************************************************************************** */
  6. /* Revision:
  7. ### 20120607 JFM
  8. Original version.
  9. ### 20120607 Initial, Bug Identification
  10. Change description.
  11. */
  12. #include <string.h>
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. #include "terminal.h"
  16. #include "define.h"
  17. #include "WiFiCtrl.h"
  18. #include "LedLightCtrl.h"
  19. #include "ChaletPowerRelay.h"
  20. #include "BatteryMonitor.h"
  21. #include "BootloaderInterface.h"
  22. #include "SIM7080GInterface.h"
  23. //#include "SDCardMgr.h"
  24. #ifdef TERMINAL_USE_TELNET
  25. #include "TCPIP_Stack/Telnet.h"
  26. #endif
  27. #define TerminalPrint(fmt, ...) \
  28. do { sprintf(TerminalWorkString, fmt, __VA_ARGS__); \
  29. TerminalPrintString(TerminalWorkString);} while (0)
  30. char TerminalDataBuf[TERMINAL_STRING_LENGTH];
  31. char TerminalPrevDataBuf[TERMINAL_STRING_LENGTH];
  32. char TerminalWorkString[TERMINAL_STRING_LENGTH];
  33. char *TerminalDataPtr;
  34. int mTerminalPendingAction;
  35. BOOL mTerminalOpened;
  36. int mTerminalTickState;
  37. #define BOOTLOAD_VERSION_ADDRESS 0x9D000000
  38. const uint32_t *mBootloaderMagicWord = (uint32_t *) BOOTLOAD_VERSION_ADDRESS;
  39. static BYTE mHelpString[] = "Here is the list of the available commands:\n\r\n\r"
  40. "help : Shows this window\n\r"
  41. "\npower [state] Set chalet's 12V Inverter feed power state. This command controls the main power relay\n"
  42. " - Available [state] argument are: on\n"
  43. " off\n"
  44. "\nwifi [command] control ChaletDuino's WiFi module state%\n"
  45. " - Available [command] argument are: on (turns ON module)\n"
  46. " off (turns OFF module)\n"
  47. " status (returns current status)\n"
  48. "\nbattery [sensor] returns current battery sensors readings\n"
  49. " - Available [sensor] argument are: voltage\n"
  50. " current\n"
  51. " soc (state of charge)\n"
  52. " Empty [sensor] argument prints all values\n"
  53. "\nstatus : get general system status\n"
  54. "\nbootloader [command] : bootloader mode control\n"
  55. " - Available [command] argument are: start (enable bootloader and opens port)\n"
  56. " stop (disables bootloader if not busy)\n"
  57. " state (prints actual state of the bootloader)\n";
  58. static BYTE mHelpString1[] = "\nlte [command] [value] : bootloader mode control\n"
  59. " - Available [command] argument are: passthrough (enable using syslog as a passthrough interface with lte module)\n"
  60. " -Available passthrough [value]: on (enable passthrough)\n"
  61. " off (disable passthrough)\n"
  62. " debug (enable using syslog as a debug interface with lte module)\n"
  63. " -Available debug [value]: module (debug LTE module comm only)\n"
  64. " pic (debug PIC comm only)\n"
  65. " both (debug both PIC and LTE module comm )\n"
  66. " off (disable LTE debug)\n"
  67. "\nHave a good day!\n";
  68. BYTE *mHelpStringPtr;
  69. void InitTerminal(void)
  70. {
  71. TerminalDataPtr = &TerminalDataBuf[0];
  72. memset(TerminalDataBuf,0,sizeof(TerminalDataBuf));
  73. memset(TerminalPrevDataBuf,'\0',sizeof(TerminalPrevDataBuf));
  74. memset(TerminalWorkString,'\0',sizeof(TerminalWorkString));
  75. mTerminalPendingAction = TERMINAL_ACTION_NONE;
  76. }
  77. void TickTerminal()
  78. {
  79. switch(mTerminalPendingAction)
  80. {
  81. case TERMINAL_ACTION_NONE:
  82. {
  83. break;
  84. }
  85. case TERMINAL_ACTION_TURN_OFF_WIFI:
  86. {
  87. mTerminalPendingAction = TERMINAL_ACTION_NONE;
  88. TurnOFFWiFi();
  89. break;
  90. }
  91. }
  92. }
  93. void RxTerminalBuf(uint8* DataBuf, int size)
  94. {
  95. if(DataBuf != 0)
  96. {
  97. int i = 0;
  98. for(i = 0; i < size; i++)
  99. {
  100. RxTerminalData(*DataBuf++);
  101. }
  102. }
  103. }
  104. void RxTerminalData(unsigned char Data)
  105. {
  106. // sTerminalPrint(TerminalWorkString,"%c",Data);
  107. // TerminalPrintString(TerminalWorkString);
  108. if(Data == 0x0D) //enter
  109. {
  110. //TerminalPrint("\n\r");
  111. TerminalPrintString("\n\r\0");
  112. if(strlen(TerminalDataBuf) != 0)
  113. {
  114. strcpy(TerminalPrevDataBuf,TerminalDataBuf);
  115. ParseNewBuffer();
  116. }
  117. TerminalDataPtr = &TerminalDataBuf[0];
  118. memset(TerminalDataBuf,'\0',sizeof(TerminalDataBuf));
  119. }
  120. else if(Data == 0x08 || Data == 0x7F) //backspace
  121. {
  122. // TerminalPrint("%c",Data);
  123. TerminalPrintChar(Data);
  124. if(TerminalDataPtr != &TerminalDataBuf[0])
  125. {
  126. TerminalDataPtr--;
  127. *TerminalDataPtr = '\0';
  128. }
  129. }
  130. // else if(Data == 0x1B) //Up key
  131. // {
  132. // //memcpy(TerminalDataBuf,TerminalPrevDataBuf,strlen(TerminalPrevDataBuf)-1);
  133. // strcpy(TerminalDataBuf,TerminalPrevDataBuf);
  134. // TerminalPrint("%s",TerminalDataBuf);
  135. // }
  136. else
  137. {
  138. //TerminalPrint("%c",Data);
  139. TerminalPrintChar(Data);
  140. if(TerminalDataPtr < &TerminalDataBuf[TERMINAL_STRING_LENGTH])
  141. {
  142. *TerminalDataPtr = Data;
  143. TerminalDataPtr++;
  144. }
  145. }
  146. }
  147. void ParseNewBuffer(void)
  148. {
  149. char mCmdString[30], mDataString1[30], mDataString2[30], mDataString3[30],mDataString4[30];
  150. memset(mCmdString,'\0',sizeof(mCmdString));
  151. memset(mDataString1,'\0',sizeof(mDataString1));
  152. memset(mDataString2,'\0',sizeof(mDataString2));
  153. memset(mDataString3,'\0',sizeof(mDataString3));
  154. memset(mDataString4,'\0',sizeof(mDataString4));
  155. sscanf(TerminalDataBuf,"%s %s %s %s %s",mCmdString, mDataString1, mDataString2, mDataString3,mDataString4);
  156. if(strncmp(mCmdString,"help",strlen("help")) == 0)
  157. {
  158. SendTerminalData(mHelpString,strlen(mHelpString));
  159. SendTerminalData(mHelpString1,strlen(mHelpString1));
  160. }
  161. else if(strncmp(mCmdString,"power",strlen("power")) == 0)
  162. {
  163. if(strlen(mDataString1) == 0)
  164. {
  165. TerminalPrintString("\n[state] parameter is invalid. Type 'help' for more info\n");
  166. return;
  167. }
  168. if(strncmp(mDataString1,"on",strlen("on")) == 0)
  169. {
  170. TerminalPrintString("Turning chalet's inverter ON\n");
  171. // ChaletPowerRelayTurnOn();
  172. }
  173. else if(strncmp(mDataString1,"off",strlen("off")) == 0)
  174. {
  175. TerminalPrintString("Turning chalet's inverter OFF\n");
  176. // ChaletPowerRelayTurnOff();
  177. }
  178. else
  179. {
  180. TerminalPrintString("\n[state] parameter is invalid. Type 'help' for valid values\n");
  181. }
  182. TerminalPrintString("\n");
  183. }
  184. else if(strncmp(mCmdString,"wifi",strlen("wifi")) == 0)
  185. {
  186. if(strlen(mDataString1) == 0)
  187. {
  188. TerminalPrintString("\n[value] parameter is invalid. Type 'help' for more info\n");
  189. return;
  190. }
  191. if(strncmp(mDataString1,"on",strlen("on")) == 0)
  192. {
  193. if(GetWiFiSate() != WIFI_CONNECTED_STATE)
  194. {
  195. TerminalPrintString("Turning WiFi module ON\n");
  196. InitWiFi();
  197. }
  198. else
  199. {
  200. TerminalPrintString("WiFi already connected...\n");
  201. }
  202. }
  203. else if(strncmp(mDataString1,"off",strlen("off")) == 0)
  204. {
  205. if(GetWiFiSate() != WIFI_MODULE_OFF_STATE)
  206. {
  207. TerminalPrintString("Turning WiFi module OFF... Goodbye!\n");
  208. //TurnOFFWiFi();
  209. mTerminalPendingAction = TERMINAL_ACTION_TURN_OFF_WIFI;
  210. }
  211. else
  212. {
  213. TerminalPrintString("WiFi module already OFF... that's weird!\n");
  214. }
  215. }
  216. else if(strncmp(mDataString1,"status",strlen("status")) == 0)
  217. {
  218. switch (GetWiFiSate())
  219. {
  220. case WIFI_MODULE_OFF_STATE:
  221. {
  222. TerminalPrintString("WiFi module OFF\n");
  223. break;
  224. }
  225. case WIFI_CONNECTED_STATE:
  226. {
  227. TerminalPrintString("WiFi Connected\n");
  228. break;
  229. }
  230. case WIFI_DISCONNECTED_STATE:
  231. {
  232. TerminalPrintString("WiFi Disconnected\n");
  233. break;
  234. }
  235. case WIFI_INIT_ERROR_STATE:
  236. {
  237. TerminalPrintString("WiFi ERROR\n");
  238. break;
  239. }
  240. case WIFI_UNKNOWN_STATE:
  241. {
  242. TerminalPrintString("WiFi state Unknown!\n");
  243. break;
  244. }
  245. }
  246. }
  247. TerminalPrintString("\n");
  248. }
  249. else if(strncmp(mCmdString,"battery",strlen("battery")) == 0)
  250. {
  251. // if(strlen(mDataString1) == 0)
  252. // {
  253. // char voltage[15];
  254. // sprintf(voltage,"%f",GetBatteryVoltage(0));
  255. // TerminalPrintString("Battery Voltage: ");
  256. // TerminalPrintString(voltage);
  257. // TerminalPrintString("\n");
  258. // char current[15];
  259. // sprintf(current,"%d",GetSolarPanelCurrent());
  260. // TerminalPrintString("Battery charge current: ");
  261. // TerminalPrintString(current);
  262. // TerminalPrintString("mA\n");
  263. // return;
  264. // }
  265. //
  266. // if(strncmp(mDataString1,"voltage",strlen("voltage")) == 0)
  267. // {
  268. // char voltage[15];
  269. // sprintf(voltage,"%f",GetBatteryVoltage(0));
  270. // TerminalPrintString("Battery Voltage: ");
  271. // TerminalPrintString(voltage);
  272. // TerminalPrintString("\n");
  273. // }
  274. // else if(strncmp(mDataString1,"current",strlen("current")) == 0)
  275. // {
  276. // char current[15];
  277. // sprintf(current,"%d",GetSolarPanelCurrent());
  278. // TerminalPrintString("Battery charge current: ");
  279. // TerminalPrintString(current);
  280. // TerminalPrintString("mA\n");
  281. // }
  282. // else if(strncmp(mDataString1,"soc",strlen("soc")) == 0)
  283. // {
  284. // char SOC[15];
  285. // sprintf(SOC,"%d",GetBatterySOC());
  286. // TerminalPrintString("Battery SOC: ");
  287. // // TerminalPrintString(SOC);
  288. // TerminalPrintString("%\n");
  289. // }
  290. // TerminalPrintString("\n");
  291. }
  292. else if(strncmp(mCmdString,"status",strlen("status")) == 0)
  293. {
  294. // TerminalPrintString("General status:\nBattery: TBD \nWiFi: TBD\nOther Stuff: TBD\n");
  295. TerminalPrintString("General status:\n");
  296. // if(GetChaletPowerRelayState() == CHALET_POWER_RELAY_OFF_STATE)
  297. // {
  298. // TerminalPrintString("Inverter power relay: OFF\n");
  299. // }
  300. // else if(GetChaletPowerRelayState() == CHALET_POWER_RELAY_ON_STATE)
  301. // {
  302. // TerminalPrintString("Inverter power relay: ON\n");
  303. // }
  304. // else
  305. // {
  306. // TerminalPrintString("Inverter power relay: UNKNOWN\n");
  307. // }
  308. switch(GetWiFiSate())
  309. {
  310. case WIFI_MODULE_OFF_STATE:
  311. {
  312. TerminalPrintString("WiFi: Module is turned OFF\n");
  313. break;
  314. }
  315. case WIFI_CONNECTED_STATE:
  316. {
  317. TerminalPrintString("WiFi: Connected to AP\n");
  318. break;
  319. }
  320. case WIFI_DISCONNECTED_STATE:
  321. {
  322. TerminalPrintString("WiFi: Disconnected from AP\n");
  323. break;
  324. }
  325. case WIFI_INIT_ERROR_STATE:
  326. {
  327. TerminalPrintString("WiFi: Module initialization error\n");
  328. break;
  329. }
  330. case WIFI_UNKNOWN_STATE:
  331. default:
  332. {
  333. TerminalPrintString("WiFi: Unknown state\n");
  334. break;
  335. }
  336. }
  337. // char voltage[15];
  338. // memset(voltage,0,15);
  339. // sprintf(voltage,"%.2f",GetBatteryVoltage(0));
  340. // TerminalPrintString("Battery Voltage: ");
  341. // TerminalPrintString(voltage);
  342. // TerminalPrintString("V\n");
  343. //
  344. // char current[15];
  345. // memset(current,0,15);
  346. // sprintf(current,"%dmA\n",GetSolarPanelCurrent());
  347. // TerminalPrintString("Battery charge current: ");
  348. // TerminalPrintString(current);
  349. // //TerminalPrintString("mA\n");
  350. if(*mBootloaderMagicWord == 0xBAADCAFE)
  351. {
  352. TerminalPrintString("Bootloader: Detected\n");
  353. }
  354. else
  355. {
  356. TerminalPrintString("Bootloader: Not Detected\n");
  357. }
  358. // char SOC[15];
  359. // memset(SOC,0,15);
  360. // sprintf(SOC,"%d%%\n",GetBatterySOC());
  361. // TerminalPrintString("Battery SOC: ");
  362. // TerminalPrintString(SOC);
  363. // // TerminalPrintString("\n");
  364. TerminalPrintString("\n");
  365. }
  366. else if(strncmp(mCmdString,"bootloader",strlen("bootloader")) == 0)
  367. {
  368. if(strlen(mDataString1) == 0)
  369. {
  370. TerminalPrintString("\n[command] parameter is invalid. Type 'help' for more info\n");
  371. return;
  372. }
  373. if(strncmp(mDataString1,"start",strlen("start")) == 0)
  374. {
  375. //start bootloader server
  376. // OpenBootloaderServer();
  377. BootloaderActivateBootloader();
  378. TerminalPrintString("Activating bootloader\n");
  379. }
  380. else if(strncmp(mDataString1,"stop",strlen("stop")) == 0)
  381. {
  382. //CloseBootloaderServer();
  383. TerminalPrintString("Deactivating bootloader\n");
  384. BootloaderDeactivateBootloader();
  385. }
  386. else if(strncmp(mDataString1,"status",strlen("status")) == 0)
  387. {
  388. if(IsBootloaderClientConnected())
  389. {
  390. TerminalPrintString("\nBootloader client connected\n");
  391. return;
  392. }
  393. else
  394. if(IsBootloaderClientConnected())
  395. {
  396. TerminalPrintString("\nBootloader client not connected\n");
  397. return;
  398. }
  399. }
  400. }
  401. else if(strncmp(mCmdString,"lte",strlen("lte")) == 0)
  402. {
  403. if(strlen(mDataString1) == 0)
  404. {
  405. TerminalPrintString("\n[command] parameter is invalid. Type 'help' for more info\n");
  406. return;
  407. }
  408. if(strlen(mDataString2) == 0)
  409. {
  410. TerminalPrintString("\n[value] parameter is invalid. Type 'help' for more info\n");
  411. return;
  412. }
  413. if(strncmp(mDataString1,"passthrough",strlen("passthrough")) == 0)
  414. {
  415. // if(strncmp(mDataString2,"on",strlen("on")) == 0)
  416. // {
  417. // LTEEnterSerialPassthrough();
  418. // TerminalPrintString("LTE passthrough enabled in Syslog window\n");
  419. // }
  420. // else if (strncmp(mDataString2,"off",strlen("off")) == 0)
  421. // {
  422. // LTEExitSerialPassthrough();
  423. // TerminalPrintString("LTE passthrough disabled\n");
  424. // }
  425. // else
  426. // {
  427. // TerminalPrintString("\nInvalid [value] parameter (use on or off)\n");
  428. // }
  429. }
  430. if(strncmp(mDataString1,"debug",strlen("debug")) == 0)
  431. {
  432. // if(strncmp(mDataString2,"module",strlen("module")) == 0)
  433. // {
  434. // if(LTEEnableSerialDebug(true,false) == RET_OK)
  435. // {
  436. // TerminalPrintString("LTE module debug enabled in Syslog window\n");
  437. // }
  438. // else
  439. // {
  440. // TerminalPrintString("Cannot put LTE module in debug mode (passthrought enabled?)\n");
  441. // }
  442. // }
  443. // else if(strncmp(mDataString2,"pic",strlen("pic")) == 0)
  444. // {
  445. // if(LTEEnableSerialDebug(false,true) == RET_OK)
  446. // {
  447. // TerminalPrintString("LTE PIC comm debug enabled in Syslog window\n");
  448. // }
  449. // else
  450. // {
  451. // TerminalPrintString("Cannot put LTE PIC comm in debug mode (passthrought enabled?)\n");
  452. // }
  453. // }
  454. // else if(strncmp(mDataString2,"both",strlen("both")) == 0)
  455. // {
  456. // if(LTEEnableSerialDebug(true,true) == RET_OK)
  457. // {
  458. // TerminalPrintString("LTE module and PIC comm debug enabled in Syslog window\n");
  459. // }
  460. // else
  461. // {
  462. // TerminalPrintString("Cannot put LTE comm in debug mode (passthrought enabled?)\n");
  463. // }
  464. // }
  465. // else if (strncmp(mDataString2,"off",strlen("off")) == 0)
  466. // {
  467. // LTEEnableSerialDebug(false,false);
  468. // TerminalPrintString("LTE debug disabled\n");
  469. // }
  470. // else
  471. // {
  472. // TerminalPrintString("\nInvalid [value] parameter (use on or off)\n");
  473. // }
  474. }
  475. }
  476. else if(strncmp(mCmdString,"debug",strlen(mCmdString)) == 0)
  477. {
  478. // if(strlen(mDataString1) == 0)
  479. // {
  480. // TerminalPrintString("\n[subsystem] parameter is invalid. Type 'help' for more info\n");
  481. // return;
  482. // }
  483. // if(strlen(mDataString2) == 0)
  484. // {
  485. // TerminalPrintString("\n[timeout] parameter is invalid. Type 'help' for more info\n");
  486. // return;
  487. // }
  488. //
  489. // unsigned int timeout = atoi(mDataString2);
  490. // if(timeout != 0 && timeout < 100 && timeout > 5000)
  491. // {
  492. // TerminalPrint("[timeout] value must be between 100 & 5000. Current value: %d",timeout);
  493. // return;
  494. // }
  495. //
  496. // if(strncmp(mDataString1,"valve",strlen("valve")) == 0)
  497. // {
  498. // // TerminalPrintValveStatus();
  499. // TerminalPrintString("Debug valve not implemented\n");
  500. // }
  501. // else if(strncmp(mDataString1,"flow",strlen("flow")) == 0)
  502. // {
  503. // if(timeout == 0)
  504. // {
  505. // TerminalPrintString("Flow debugging stopped\n");
  506. // StopDebugFlowMeter();
  507. // }
  508. // else
  509. // {
  510. // TerminalPrintString("OK\n");
  511. // StartDebugFlowMeter(timeout);
  512. // }
  513. // }
  514. // else if(strncmp(mDataString1,"hygro",strlen("hygro")) == 0)
  515. // {
  516. // TerminalPrintString("Debug hygro not implemented\n");
  517. // }
  518. }
  519. else
  520. TerminalPrintString("Unknown command\n\n");
  521. }
  522. void TerminalPrintString(char *str)
  523. {
  524. #ifdef USE_WINC1500
  525. SendTerminalData(str,strlen(str));
  526. #else
  527. #ifdef TERMINAL_USE_TCP_SERVER
  528. TCPPutString(mTerminalSocket, str);
  529. #endif
  530. #endif
  531. }
  532. void TerminalPrintChar(char byte)
  533. {
  534. #ifdef USE_WINC1500
  535. SentTerminalByte(byte);
  536. #else
  537. #ifdef TERMINAL_USE_TCP_SERVER
  538. TCPPut(mTerminalSocket,byte);
  539. #endif
  540. #endif
  541. }
  542. void TerminalStateMachine(void)
  543. {
  544. }
  545. //
  546. //void TerminalPrintValveStatus()
  547. //{
  548. // if(GetValveState() == VALVE_ON)
  549. // {
  550. // TerminalPrintString("The valve is ON\n");
  551. // }
  552. // else
  553. // {
  554. // TerminalPrintString("The valve is OFF\n");
  555. // }
  556. //}
  557. //
  558. //void TerminalPrintFlowStatus()
  559. //{
  560. // unsigned int Flow = GetCurrentFlow();
  561. // TerminalPrint("Flow: %d\n",Flow);;
  562. //}
  563. //
  564. //void TerminalPrintHygroStatus(int unit)
  565. //{
  566. // TerminalPrint("Hygro %d: ?\n",unit);
  567. //}
  568. //
  569. //EOf