2022-11-17 20:43:21 -05:00

528 lines
15 KiB
C

/*
Description:
This is a template file for standard C header file.
*/
/* ************************************************************************** */
/* Revision:
### 20120607 JFM
Original version.
### 20120607 Initial, Bug Identification
Change description.
*/
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "terminal.h"
#include "define.h"
#include "WiFiCtrl.h"
#include "LedLightCtrl.h"
#include "ChaletPowerRelay.h"
#include "BatteryMonitor.h"
#include "BootloaderInterface.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;
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"
//"\ndebug : print some real-time stuff..."
"\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)
{
mHelpStringPtr = mHelpString;
static BYTE* Ptr= mHelpString;
SendTerminalData(mHelpString,strlen(mHelpString));
Ptr = mHelpStringPtr;
}
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");
Sleep(100);
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,"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