/* Description: This is a template file for standard C header file. */ /* ************************************************************************** */ /* Revision: ### 20120607 JFM Original version. ### 20120607 Initial, Bug Identification Change description. */ #include #include #include #include "terminal.h" #include "define.h" #include "WiFiCtrl.h" #include "LedLightCtrl.h" #include "ChaletPowerRelay.h" #include "BatteryMonitor.h" #include "BootloaderInterface.h" #include "SIM7080GInterface.h" //#include "SDCardMgr.h" #ifdef TERMINAL_USE_TELNET #include "TCPIP_Stack/Telnet.h" #endif #define TerminalPrint(fmt, ...) \ do { sprintf(TerminalWorkString, fmt, __VA_ARGS__); \ TerminalPrintString(TerminalWorkString);} while (0) char TerminalDataBuf[TERMINAL_STRING_LENGTH]; char TerminalPrevDataBuf[TERMINAL_STRING_LENGTH]; char TerminalWorkString[TERMINAL_STRING_LENGTH]; char *TerminalDataPtr; int mTerminalPendingAction; BOOL mTerminalOpened; int mTerminalTickState; #define BOOTLOAD_VERSION_ADDRESS 0x9D000000 const uint32_t *mBootloaderMagicWord = (uint32_t *) BOOTLOAD_VERSION_ADDRESS; static BYTE mHelpString[] = "Here is the list of the available commands:\n\r\n\r" "help : Shows this window\n\r" "\npower [state] Set chalet's 12V Inverter feed power state. This command controls the main power relay\n" " - Available [state] argument are: on\n" " off\n" "\nwifi [command] control ChaletDuino's WiFi module state%\n" " - Available [command] argument are: on (turns ON module)\n" " off (turns OFF module)\n" " status (returns current status)\n" "\nbattery [sensor] returns current battery sensors readings\n" " - Available [sensor] argument are: voltage\n" " current\n" " soc (state of charge)\n" " Empty [sensor] argument prints all values\n" "\nstatus : get general system status\n" "\nbootloader [command] : bootloader mode control\n" " - Available [command] argument are: start (enable bootloader and opens port)\n" " stop (disables bootloader if not busy)\n" " state (prints actual state of the bootloader)\n"; static BYTE mHelpString1[] = "\nlte [command] [value] : bootloader mode control\n" " - Available [command] argument are: passthrough (enable using syslog as a passthrough interface with lte module)\n" " -Available passthrough [value]: on (enable passthrough)\n" " off (disable passthrough)\n" " debug (enable using syslog as a debug interface with lte module)\n" " -Available debug [value]: module (debug LTE module comm only)\n" " pic (debug PIC comm only)\n" " both (debug both PIC and LTE module comm )\n" " off (disable LTE debug)\n" "\nHave a good day!\n"; BYTE *mHelpStringPtr; void InitTerminal(void) { TerminalDataPtr = &TerminalDataBuf[0]; memset(TerminalDataBuf,0,sizeof(TerminalDataBuf)); memset(TerminalPrevDataBuf,'\0',sizeof(TerminalPrevDataBuf)); memset(TerminalWorkString,'\0',sizeof(TerminalWorkString)); mTerminalPendingAction = TERMINAL_ACTION_NONE; } void TickTerminal() { switch(mTerminalPendingAction) { case TERMINAL_ACTION_NONE: { break; } case TERMINAL_ACTION_TURN_OFF_WIFI: { mTerminalPendingAction = TERMINAL_ACTION_NONE; TurnOFFWiFi(); break; } } } void RxTerminalBuf(uint8* DataBuf, int size) { if(DataBuf != 0) { int i = 0; for(i = 0; i < size; i++) { RxTerminalData(*DataBuf++); } } } void RxTerminalData(unsigned char Data) { // sTerminalPrint(TerminalWorkString,"%c",Data); // TerminalPrintString(TerminalWorkString); if(Data == 0x0D) //enter { //TerminalPrint("\n\r"); TerminalPrintString("\n\r\0"); if(strlen(TerminalDataBuf) != 0) { strcpy(TerminalPrevDataBuf,TerminalDataBuf); ParseNewBuffer(); } TerminalDataPtr = &TerminalDataBuf[0]; memset(TerminalDataBuf,'\0',sizeof(TerminalDataBuf)); } else if(Data == 0x08 || Data == 0x7F) //backspace { // TerminalPrint("%c",Data); TerminalPrintChar(Data); if(TerminalDataPtr != &TerminalDataBuf[0]) { TerminalDataPtr--; *TerminalDataPtr = '\0'; } } // else if(Data == 0x1B) //Up key // { // //memcpy(TerminalDataBuf,TerminalPrevDataBuf,strlen(TerminalPrevDataBuf)-1); // strcpy(TerminalDataBuf,TerminalPrevDataBuf); // TerminalPrint("%s",TerminalDataBuf); // } else { //TerminalPrint("%c",Data); TerminalPrintChar(Data); if(TerminalDataPtr < &TerminalDataBuf[TERMINAL_STRING_LENGTH]) { *TerminalDataPtr = Data; TerminalDataPtr++; } } } void ParseNewBuffer(void) { char mCmdString[30], mDataString1[30], mDataString2[30], mDataString3[30],mDataString4[30]; memset(mCmdString,'\0',sizeof(mCmdString)); memset(mDataString1,'\0',sizeof(mDataString1)); memset(mDataString2,'\0',sizeof(mDataString2)); memset(mDataString3,'\0',sizeof(mDataString3)); memset(mDataString4,'\0',sizeof(mDataString4)); sscanf(TerminalDataBuf,"%s %s %s %s %s",mCmdString, mDataString1, mDataString2, mDataString3,mDataString4); if(strncmp(mCmdString,"help",strlen("help")) == 0) { SendTerminalData(mHelpString,strlen(mHelpString)); SendTerminalData(mHelpString1,strlen(mHelpString1)); } else if(strncmp(mCmdString,"power",strlen("power")) == 0) { if(strlen(mDataString1) == 0) { TerminalPrintString("\n[state] parameter is invalid. Type 'help' for more info\n"); return; } if(strncmp(mDataString1,"on",strlen("on")) == 0) { TerminalPrintString("Turning chalet's inverter ON\n"); // ChaletPowerRelayTurnOn(); } else if(strncmp(mDataString1,"off",strlen("off")) == 0) { TerminalPrintString("Turning chalet's inverter OFF\n"); // ChaletPowerRelayTurnOff(); } else { TerminalPrintString("\n[state] parameter is invalid. Type 'help' for valid values\n"); } TerminalPrintString("\n"); } else if(strncmp(mCmdString,"wifi",strlen("wifi")) == 0) { if(strlen(mDataString1) == 0) { TerminalPrintString("\n[value] parameter is invalid. Type 'help' for more info\n"); return; } if(strncmp(mDataString1,"on",strlen("on")) == 0) { if(GetWiFiSate() != WIFI_CONNECTED_STATE) { TerminalPrintString("Turning WiFi module ON\n"); InitWiFi(); } else { TerminalPrintString("WiFi already connected...\n"); } } else if(strncmp(mDataString1,"off",strlen("off")) == 0) { if(GetWiFiSate() != WIFI_MODULE_OFF_STATE) { TerminalPrintString("Turning WiFi module OFF... Goodbye!\n"); //TurnOFFWiFi(); mTerminalPendingAction = TERMINAL_ACTION_TURN_OFF_WIFI; } else { TerminalPrintString("WiFi module already OFF... that's weird!\n"); } } else if(strncmp(mDataString1,"status",strlen("status")) == 0) { switch (GetWiFiSate()) { case WIFI_MODULE_OFF_STATE: { TerminalPrintString("WiFi module OFF\n"); break; } case WIFI_CONNECTED_STATE: { TerminalPrintString("WiFi Connected\n"); break; } case WIFI_DISCONNECTED_STATE: { TerminalPrintString("WiFi Disconnected\n"); break; } case WIFI_INIT_ERROR_STATE: { TerminalPrintString("WiFi ERROR\n"); break; } case WIFI_UNKNOWN_STATE: { TerminalPrintString("WiFi state Unknown!\n"); break; } } } TerminalPrintString("\n"); } else if(strncmp(mCmdString,"battery",strlen("battery")) == 0) { // if(strlen(mDataString1) == 0) // { // char voltage[15]; // sprintf(voltage,"%f",GetBatteryVoltage(0)); // TerminalPrintString("Battery Voltage: "); // TerminalPrintString(voltage); // TerminalPrintString("\n"); // char current[15]; // sprintf(current,"%d",GetSolarPanelCurrent()); // TerminalPrintString("Battery charge current: "); // TerminalPrintString(current); // TerminalPrintString("mA\n"); // return; // } // // if(strncmp(mDataString1,"voltage",strlen("voltage")) == 0) // { // char voltage[15]; // sprintf(voltage,"%f",GetBatteryVoltage(0)); // TerminalPrintString("Battery Voltage: "); // TerminalPrintString(voltage); // TerminalPrintString("\n"); // } // else if(strncmp(mDataString1,"current",strlen("current")) == 0) // { // char current[15]; // sprintf(current,"%d",GetSolarPanelCurrent()); // TerminalPrintString("Battery charge current: "); // TerminalPrintString(current); // TerminalPrintString("mA\n"); // } // else if(strncmp(mDataString1,"soc",strlen("soc")) == 0) // { // char SOC[15]; // sprintf(SOC,"%d",GetBatterySOC()); // TerminalPrintString("Battery SOC: "); // // TerminalPrintString(SOC); // TerminalPrintString("%\n"); // } // TerminalPrintString("\n"); } else if(strncmp(mCmdString,"status",strlen("status")) == 0) { // TerminalPrintString("General status:\nBattery: TBD \nWiFi: TBD\nOther Stuff: TBD\n"); TerminalPrintString("General status:\n"); // if(GetChaletPowerRelayState() == CHALET_POWER_RELAY_OFF_STATE) // { // TerminalPrintString("Inverter power relay: OFF\n"); // } // else if(GetChaletPowerRelayState() == CHALET_POWER_RELAY_ON_STATE) // { // TerminalPrintString("Inverter power relay: ON\n"); // } // else // { // TerminalPrintString("Inverter power relay: UNKNOWN\n"); // } switch(GetWiFiSate()) { case WIFI_MODULE_OFF_STATE: { TerminalPrintString("WiFi: Module is turned OFF\n"); break; } case WIFI_CONNECTED_STATE: { TerminalPrintString("WiFi: Connected to AP\n"); break; } case WIFI_DISCONNECTED_STATE: { TerminalPrintString("WiFi: Disconnected from AP\n"); break; } case WIFI_INIT_ERROR_STATE: { TerminalPrintString("WiFi: Module initialization error\n"); break; } case WIFI_UNKNOWN_STATE: default: { TerminalPrintString("WiFi: Unknown state\n"); break; } } // char voltage[15]; // memset(voltage,0,15); // sprintf(voltage,"%.2f",GetBatteryVoltage(0)); // TerminalPrintString("Battery Voltage: "); // TerminalPrintString(voltage); // TerminalPrintString("V\n"); // // char current[15]; // memset(current,0,15); // sprintf(current,"%dmA\n",GetSolarPanelCurrent()); // TerminalPrintString("Battery charge current: "); // TerminalPrintString(current); // //TerminalPrintString("mA\n"); if(*mBootloaderMagicWord == 0xBAADCAFE) { TerminalPrintString("Bootloader: Detected\n"); } else { TerminalPrintString("Bootloader: Not Detected\n"); } // char SOC[15]; // memset(SOC,0,15); // sprintf(SOC,"%d%%\n",GetBatterySOC()); // TerminalPrintString("Battery SOC: "); // TerminalPrintString(SOC); // // TerminalPrintString("\n"); TerminalPrintString("\n"); } else if(strncmp(mCmdString,"bootloader",strlen("bootloader")) == 0) { if(strlen(mDataString1) == 0) { TerminalPrintString("\n[command] parameter is invalid. Type 'help' for more info\n"); return; } if(strncmp(mDataString1,"start",strlen("start")) == 0) { //start bootloader server // OpenBootloaderServer(); BootloaderActivateBootloader(); TerminalPrintString("Activating bootloader\n"); } else if(strncmp(mDataString1,"stop",strlen("stop")) == 0) { //CloseBootloaderServer(); TerminalPrintString("Deactivating bootloader\n"); BootloaderDeactivateBootloader(); } else if(strncmp(mDataString1,"status",strlen("status")) == 0) { if(IsBootloaderClientConnected()) { TerminalPrintString("\nBootloader client connected\n"); return; } else if(IsBootloaderClientConnected()) { TerminalPrintString("\nBootloader client not connected\n"); return; } } } else if(strncmp(mCmdString,"lte",strlen("lte")) == 0) { if(strlen(mDataString1) == 0) { TerminalPrintString("\n[command] parameter is invalid. Type 'help' for more info\n"); return; } if(strlen(mDataString2) == 0) { TerminalPrintString("\n[value] parameter is invalid. Type 'help' for more info\n"); return; } if(strncmp(mDataString1,"passthrough",strlen("passthrough")) == 0) { // if(strncmp(mDataString2,"on",strlen("on")) == 0) // { // LTEEnterSerialPassthrough(); // TerminalPrintString("LTE passthrough enabled in Syslog window\n"); // } // else if (strncmp(mDataString2,"off",strlen("off")) == 0) // { // LTEExitSerialPassthrough(); // TerminalPrintString("LTE passthrough disabled\n"); // } // else // { // TerminalPrintString("\nInvalid [value] parameter (use on or off)\n"); // } } if(strncmp(mDataString1,"debug",strlen("debug")) == 0) { // if(strncmp(mDataString2,"module",strlen("module")) == 0) // { // if(LTEEnableSerialDebug(true,false) == RET_OK) // { // TerminalPrintString("LTE module debug enabled in Syslog window\n"); // } // else // { // TerminalPrintString("Cannot put LTE module in debug mode (passthrought enabled?)\n"); // } // } // else if(strncmp(mDataString2,"pic",strlen("pic")) == 0) // { // if(LTEEnableSerialDebug(false,true) == RET_OK) // { // TerminalPrintString("LTE PIC comm debug enabled in Syslog window\n"); // } // else // { // TerminalPrintString("Cannot put LTE PIC comm in debug mode (passthrought enabled?)\n"); // } // } // else if(strncmp(mDataString2,"both",strlen("both")) == 0) // { // if(LTEEnableSerialDebug(true,true) == RET_OK) // { // TerminalPrintString("LTE module and PIC comm debug enabled in Syslog window\n"); // } // else // { // TerminalPrintString("Cannot put LTE comm in debug mode (passthrought enabled?)\n"); // } // } // else if (strncmp(mDataString2,"off",strlen("off")) == 0) // { // LTEEnableSerialDebug(false,false); // TerminalPrintString("LTE debug disabled\n"); // } // else // { // TerminalPrintString("\nInvalid [value] parameter (use on or off)\n"); // } } } else if(strncmp(mCmdString,"debug",strlen(mCmdString)) == 0) { // if(strlen(mDataString1) == 0) // { // TerminalPrintString("\n[subsystem] parameter is invalid. Type 'help' for more info\n"); // return; // } // if(strlen(mDataString2) == 0) // { // TerminalPrintString("\n[timeout] parameter is invalid. Type 'help' for more info\n"); // return; // } // // unsigned int timeout = atoi(mDataString2); // if(timeout != 0 && timeout < 100 && timeout > 5000) // { // TerminalPrint("[timeout] value must be between 100 & 5000. Current value: %d",timeout); // return; // } // // if(strncmp(mDataString1,"valve",strlen("valve")) == 0) // { // // TerminalPrintValveStatus(); // TerminalPrintString("Debug valve not implemented\n"); // } // else if(strncmp(mDataString1,"flow",strlen("flow")) == 0) // { // if(timeout == 0) // { // TerminalPrintString("Flow debugging stopped\n"); // StopDebugFlowMeter(); // } // else // { // TerminalPrintString("OK\n"); // StartDebugFlowMeter(timeout); // } // } // else if(strncmp(mDataString1,"hygro",strlen("hygro")) == 0) // { // TerminalPrintString("Debug hygro not implemented\n"); // } } else TerminalPrintString("Unknown command\n\n"); } void TerminalPrintString(char *str) { #ifdef USE_WINC1500 SendTerminalData(str,strlen(str)); #else #ifdef TERMINAL_USE_TCP_SERVER TCPPutString(mTerminalSocket, str); #endif #endif } void TerminalPrintChar(char byte) { #ifdef USE_WINC1500 SentTerminalByte(byte); #else #ifdef TERMINAL_USE_TCP_SERVER TCPPut(mTerminalSocket,byte); #endif #endif } void TerminalStateMachine(void) { } // //void TerminalPrintValveStatus() //{ // if(GetValveState() == VALVE_ON) // { // TerminalPrintString("The valve is ON\n"); // } // else // { // TerminalPrintString("The valve is OFF\n"); // } //} // //void TerminalPrintFlowStatus() //{ // unsigned int Flow = GetCurrentFlow(); // TerminalPrint("Flow: %d\n",Flow);; //} // //void TerminalPrintHygroStatus(int unit) //{ // TerminalPrint("Hygro %d: ?\n",unit); //} // //EOf