Robert Ceschini / Mbed 2 deprecated PSU-POWERLOGGER

Dependencies:   mbed

Fork of PSU-POWERLOGGER by Eli Hughes

Committer:
emh203
Date:
Tue Sep 18 18:35:23 2012 +0000
Revision:
0:d0c18e423b13
Child:
1:871a329fd172
Re-added project from offline version.  COmpiles but need to test!

Who changed what in which revision?

UserRevisionLine numberNew contents of line
emh203 0:d0c18e423b13 1 #include "System.h"
emh203 0:d0c18e423b13 2
emh203 0:d0c18e423b13 3
emh203 0:d0c18e423b13 4 //*****************************************************************
emh203 0:d0c18e423b13 5 //Terminal Related stuff
emh203 0:d0c18e423b13 6 //*****************************************************************
emh203 0:d0c18e423b13 7
emh203 0:d0c18e423b13 8 #define MAX_TERMINAL_LINE_CHARS 128
emh203 0:d0c18e423b13 9 #define MAX_TERMINAL_CMD_CHARS 32
emh203 0:d0c18e423b13 10 CHAR TerminalLineBuf[MAX_TERMINAL_LINE_CHARS];
emh203 0:d0c18e423b13 11 BYTE TerminalPos;
emh203 0:d0c18e423b13 12 CHAR TerminalCmdBuf[MAX_TERMINAL_CMD_CHARS+1];
emh203 0:d0c18e423b13 13 CHAR TerminalArgs[MAX_TERMINAL_LINE_CHARS-MAX_TERMINAL_CMD_CHARS];
emh203 0:d0c18e423b13 14 BYTE NextCharIn;
emh203 0:d0c18e423b13 15 BOOL CmdFound;
emh203 0:d0c18e423b13 16
emh203 0:d0c18e423b13 17
emh203 0:d0c18e423b13 18
emh203 0:d0c18e423b13 19 #define NUM_TERMINAL_CMDS 8
emh203 0:d0c18e423b13 20
emh203 0:d0c18e423b13 21 char *TerminalCommands[NUM_TERMINAL_CMDS] = {"help","reboot","v","i","Time","Date","RTC_Init","Batt"};
emh203 0:d0c18e423b13 22
emh203 0:d0c18e423b13 23 typedef void (*TerminalCallback)(char *);
emh203 0:d0c18e423b13 24
emh203 0:d0c18e423b13 25
emh203 0:d0c18e423b13 26 void TerminalCmd_Help(char *arg);
emh203 0:d0c18e423b13 27 void TerminalCmd_Reboot(char *arg);
emh203 0:d0c18e423b13 28 void TerminalCmd_v(char *arg);
emh203 0:d0c18e423b13 29 void TerminalCmd_i(char *arg);
emh203 0:d0c18e423b13 30 void TerminalCmd_Time(char *arg);
emh203 0:d0c18e423b13 31 void TerminalCmd_Date(char *arg);
emh203 0:d0c18e423b13 32 void TerminalCmd_RTC_Init(char *arg);
emh203 0:d0c18e423b13 33 void TerminalCmd_Batt(char *arg);
emh203 0:d0c18e423b13 34
emh203 0:d0c18e423b13 35 TerminalCallback TerminalCallbacks[NUM_TERMINAL_CMDS] ={TerminalCmd_Help};
emh203 0:d0c18e423b13 36
emh203 0:d0c18e423b13 37
emh203 0:d0c18e423b13 38 void InitTerminal()
emh203 0:d0c18e423b13 39 {
emh203 0:d0c18e423b13 40 //Initialize the terminal command callbacks
emh203 0:d0c18e423b13 41 TerminalCallbacks[0] = TerminalCmd_Help;
emh203 0:d0c18e423b13 42 TerminalCallbacks[1] = TerminalCmd_Reboot;
emh203 0:d0c18e423b13 43 TerminalCallbacks[2] = TerminalCmd_v;
emh203 0:d0c18e423b13 44 TerminalCallbacks[3] = TerminalCmd_i;
emh203 0:d0c18e423b13 45 TerminalCallbacks[4] = TerminalCmd_Time;
emh203 0:d0c18e423b13 46 TerminalCallbacks[5] = TerminalCmd_Date;
emh203 0:d0c18e423b13 47 TerminalCallbacks[6] = TerminalCmd_RTC_Init;
emh203 0:d0c18e423b13 48 TerminalCallbacks[7] = TerminalCmd_Batt;
emh203 0:d0c18e423b13 49
emh203 0:d0c18e423b13 50 }
emh203 0:d0c18e423b13 51
emh203 0:d0c18e423b13 52
emh203 0:d0c18e423b13 53 extern "C" void mbed_reset();
emh203 0:d0c18e423b13 54
emh203 0:d0c18e423b13 55
emh203 0:d0c18e423b13 56 void TerminalCmd_Batt(char *)
emh203 0:d0c18e423b13 57 {
emh203 0:d0c18e423b13 58 PrintfEnqueue(&PCBackDoorTx,"\r\nBattery: %.3f\r\n",BatteryVoltage);
emh203 0:d0c18e423b13 59 }
emh203 0:d0c18e423b13 60 void TerminalCmd_RTC_Init(char *arg)
emh203 0:d0c18e423b13 61 {
emh203 0:d0c18e423b13 62 set_time(1256729737);
emh203 0:d0c18e423b13 63 PrintfEnqueue(&PCBackDoorTx,"\r\nTime Reset\r\n");
emh203 0:d0c18e423b13 64 }
emh203 0:d0c18e423b13 65
emh203 0:d0c18e423b13 66
emh203 0:d0c18e423b13 67 void TerminalCmd_Time(char *arg)
emh203 0:d0c18e423b13 68 {
emh203 0:d0c18e423b13 69 int Hour,Minute,Second=0;
emh203 0:d0c18e423b13 70 int Items;
emh203 0:d0c18e423b13 71 BOOL Error = FALSE;
emh203 0:d0c18e423b13 72 time_t TimeStampTemp;
emh203 0:d0c18e423b13 73
emh203 0:d0c18e423b13 74
emh203 0:d0c18e423b13 75 Items = sscanf(arg, "%d : %d : %d", &Hour, &Minute, &Second);
emh203 0:d0c18e423b13 76 if(Items == 3)
emh203 0:d0c18e423b13 77 {
emh203 0:d0c18e423b13 78 PrintfEnqueue(&PCBackDoorTx,"\r\n");
emh203 0:d0c18e423b13 79 if(Hour>23)
emh203 0:d0c18e423b13 80 {
emh203 0:d0c18e423b13 81 PrintfEnqueue(&PCBackDoorTx,"Hour entry must be between 0 and 24\r\n");
emh203 0:d0c18e423b13 82 Error = TRUE;
emh203 0:d0c18e423b13 83 }
emh203 0:d0c18e423b13 84 if(Minute>60)
emh203 0:d0c18e423b13 85 {
emh203 0:d0c18e423b13 86 PrintfEnqueue(&PCBackDoorTx,"Minute entry must be between 0 and 60\r\n");
emh203 0:d0c18e423b13 87 Error = TRUE;
emh203 0:d0c18e423b13 88 }
emh203 0:d0c18e423b13 89 if(Second>60)
emh203 0:d0c18e423b13 90 {
emh203 0:d0c18e423b13 91 PrintfEnqueue(&PCBackDoorTx,"Second entry must be between 0 and 60\r\n");
emh203 0:d0c18e423b13 92 Error = TRUE;
emh203 0:d0c18e423b13 93 }
emh203 0:d0c18e423b13 94
emh203 0:d0c18e423b13 95 if(Error == TRUE)
emh203 0:d0c18e423b13 96 {
emh203 0:d0c18e423b13 97 PrintfEnqueue(&PCBackDoorTx,"Error in time format. Time syntax should be H:M:S\r\n. Time not changed.\r\n");
emh203 0:d0c18e423b13 98 }
emh203 0:d0c18e423b13 99 else
emh203 0:d0c18e423b13 100 {
emh203 0:d0c18e423b13 101 TimeStampTemp = time(NULL);
emh203 0:d0c18e423b13 102 //convert to tm struct
emh203 0:d0c18e423b13 103 CurrentTime = localtime(&TimeStampTemp);
emh203 0:d0c18e423b13 104 //dump in our new valus
emh203 0:d0c18e423b13 105 CurrentTime->tm_sec = Second;
emh203 0:d0c18e423b13 106 CurrentTime->tm_min = Minute;
emh203 0:d0c18e423b13 107 CurrentTime->tm_hour = Hour;
emh203 0:d0c18e423b13 108 //set the new time
emh203 0:d0c18e423b13 109 set_time(mktime(CurrentTime));
emh203 0:d0c18e423b13 110 PrintfEnqueue(&PCBackDoorTx,"Time set to %d:%d:%d\r\n",Hour,Minute,Second);
emh203 0:d0c18e423b13 111 }
emh203 0:d0c18e423b13 112
emh203 0:d0c18e423b13 113 }
emh203 0:d0c18e423b13 114 else
emh203 0:d0c18e423b13 115 {
emh203 0:d0c18e423b13 116 PrintfEnqueue(&PCBackDoorTx,"Time syntax should be H:M:S\r\n");
emh203 0:d0c18e423b13 117 }
emh203 0:d0c18e423b13 118 }
emh203 0:d0c18e423b13 119
emh203 0:d0c18e423b13 120 void TerminalCmd_Date(char *arg)
emh203 0:d0c18e423b13 121 {
emh203 0:d0c18e423b13 122 int Day,Month,Year=0;
emh203 0:d0c18e423b13 123 int Items;
emh203 0:d0c18e423b13 124 BOOL Error = FALSE;
emh203 0:d0c18e423b13 125 time_t TimeStampTemp;
emh203 0:d0c18e423b13 126
emh203 0:d0c18e423b13 127 Items = sscanf(arg, "%d / %d / %d", &Month, &Day, &Year);
emh203 0:d0c18e423b13 128 if(Items == 3)
emh203 0:d0c18e423b13 129 {
emh203 0:d0c18e423b13 130 PrintfEnqueue(&PCBackDoorTx,"\r\n");
emh203 0:d0c18e423b13 131 if(Month>12 || Month < 1)
emh203 0:d0c18e423b13 132 {
emh203 0:d0c18e423b13 133 PrintfEnqueue(&PCBackDoorTx,"\r\nMonth entry must be between 1 and 12\r\n");
emh203 0:d0c18e423b13 134 Error = TRUE;
emh203 0:d0c18e423b13 135 }
emh203 0:d0c18e423b13 136 if(Day>31 || Day<1)
emh203 0:d0c18e423b13 137 {
emh203 0:d0c18e423b13 138 PrintfEnqueue(&PCBackDoorTx,"\r\nDay entry must be between 1 and 31\r\n");
emh203 0:d0c18e423b13 139 Error = TRUE;
emh203 0:d0c18e423b13 140 }
emh203 0:d0c18e423b13 141 if(Year<1900)
emh203 0:d0c18e423b13 142 {
emh203 0:d0c18e423b13 143 PrintfEnqueue(&PCBackDoorTx,"\r\nYear entry must be greater than 1900\r\n");
emh203 0:d0c18e423b13 144 Error = TRUE;
emh203 0:d0c18e423b13 145 }
emh203 0:d0c18e423b13 146
emh203 0:d0c18e423b13 147 if(Error == TRUE)
emh203 0:d0c18e423b13 148 {
emh203 0:d0c18e423b13 149 PrintfEnqueue(&PCBackDoorTx,"\r\nError in Date format. Date not changed.\r\n");
emh203 0:d0c18e423b13 150 }
emh203 0:d0c18e423b13 151 else
emh203 0:d0c18e423b13 152 {
emh203 0:d0c18e423b13 153 //Get the current time in seconds since unix epoch
emh203 0:d0c18e423b13 154 TimeStampTemp = time(NULL);
emh203 0:d0c18e423b13 155 //convert to tm struct fom
emh203 0:d0c18e423b13 156 CurrentTime = localtime(&TimeStampTemp);
emh203 0:d0c18e423b13 157 //dump in our new valus
emh203 0:d0c18e423b13 158 CurrentTime->tm_mon = Month-1;
emh203 0:d0c18e423b13 159 CurrentTime->tm_mday = Day;
emh203 0:d0c18e423b13 160 CurrentTime->tm_year = Year - 1900;
emh203 0:d0c18e423b13 161 //set the new time
emh203 0:d0c18e423b13 162 set_time(mktime(CurrentTime));
emh203 0:d0c18e423b13 163 PrintfEnqueue(&PCBackDoorTx,"\r\nDate set to %d/%d/%d\r\n",Month,Day,Year);
emh203 0:d0c18e423b13 164 }
emh203 0:d0c18e423b13 165
emh203 0:d0c18e423b13 166 }
emh203 0:d0c18e423b13 167 else
emh203 0:d0c18e423b13 168 {
emh203 0:d0c18e423b13 169 PrintfEnqueue(&PCBackDoorTx,"Date syntax should be MM/DD/YYYY\r\n");
emh203 0:d0c18e423b13 170 }
emh203 0:d0c18e423b13 171 }
emh203 0:d0c18e423b13 172
emh203 0:d0c18e423b13 173 void TerminalCmd_v(char *arg)
emh203 0:d0c18e423b13 174 {
emh203 0:d0c18e423b13 175 // PrintfEnqueue(&PCBackDoorTx,"\r\nVbus: %.1f\r\n",Vout);
emh203 0:d0c18e423b13 176 }
emh203 0:d0c18e423b13 177
emh203 0:d0c18e423b13 178 void TerminalCmd_i(char *arg)
emh203 0:d0c18e423b13 179 {
emh203 0:d0c18e423b13 180 // PrintfEnqueue(&PCBackDoorTx,"\r\nIbus: %.1f\r\n",Iout);
emh203 0:d0c18e423b13 181 }
emh203 0:d0c18e423b13 182
emh203 0:d0c18e423b13 183 void TerminalCmd_Help(char *arg)
emh203 0:d0c18e423b13 184 {
emh203 0:d0c18e423b13 185 BYTE i;
emh203 0:d0c18e423b13 186
emh203 0:d0c18e423b13 187 PrintfEnqueue(&PCBackDoorTx,"\r\n\r\bCommandList:\r\n");
emh203 0:d0c18e423b13 188 PrintfEnqueue(&PCBackDoorTx,"----------------------\r\n");
emh203 0:d0c18e423b13 189
emh203 0:d0c18e423b13 190 for(i=0;i<NUM_TERMINAL_CMDS;i++)
emh203 0:d0c18e423b13 191 {
emh203 0:d0c18e423b13 192 PrintfEnqueue(&PCBackDoorTx,"%s\r\n",TerminalCommands[i]);
emh203 0:d0c18e423b13 193 }
emh203 0:d0c18e423b13 194
emh203 0:d0c18e423b13 195 }
emh203 0:d0c18e423b13 196
emh203 0:d0c18e423b13 197 void TerminalCmd_Reboot(char *arg)
emh203 0:d0c18e423b13 198 {
emh203 0:d0c18e423b13 199 mbed_reset();
emh203 0:d0c18e423b13 200 }
emh203 0:d0c18e423b13 201
emh203 0:d0c18e423b13 202 void TerminalCmd_Strip(char *arg)
emh203 0:d0c18e423b13 203 {
emh203 0:d0c18e423b13 204 PrintfEnqueue(&PCBackDoorTx,"\r\n%s\r\n", arg);
emh203 0:d0c18e423b13 205 }
emh203 0:d0c18e423b13 206
emh203 0:d0c18e423b13 207 void ProcessTerminal()
emh203 0:d0c18e423b13 208 {
emh203 0:d0c18e423b13 209
emh203 0:d0c18e423b13 210 BYTE i,j;
emh203 0:d0c18e423b13 211
emh203 0:d0c18e423b13 212 if(BytesInQueue(&PCBackDoorRx)>0)
emh203 0:d0c18e423b13 213 {
emh203 0:d0c18e423b13 214 ByteDequeue(&PCBackDoorRx,&NextCharIn);
emh203 0:d0c18e423b13 215
emh203 0:d0c18e423b13 216 switch(NextCharIn)
emh203 0:d0c18e423b13 217 {
emh203 0:d0c18e423b13 218 case '\r':
emh203 0:d0c18e423b13 219
emh203 0:d0c18e423b13 220 TerminalLineBuf[TerminalPos++] = 0x0;
emh203 0:d0c18e423b13 221 ByteEnqueue(&PCBackDoorTx,NextCharIn);
emh203 0:d0c18e423b13 222
emh203 0:d0c18e423b13 223 if(TerminalPos > 1)
emh203 0:d0c18e423b13 224 {
emh203 0:d0c18e423b13 225 //find the command
emh203 0:d0c18e423b13 226 i=0;
emh203 0:d0c18e423b13 227 while(TerminalLineBuf[i]>0x20 && TerminalLineBuf[i]<0x7f)
emh203 0:d0c18e423b13 228 {
emh203 0:d0c18e423b13 229 TerminalCmdBuf[i] = TerminalLineBuf[i];
emh203 0:d0c18e423b13 230 i++;
emh203 0:d0c18e423b13 231
emh203 0:d0c18e423b13 232 if(i==MAX_TERMINAL_CMD_CHARS)
emh203 0:d0c18e423b13 233 {
emh203 0:d0c18e423b13 234 break;
emh203 0:d0c18e423b13 235 }
emh203 0:d0c18e423b13 236 }
emh203 0:d0c18e423b13 237
emh203 0:d0c18e423b13 238 TerminalCmdBuf[i] = 0;
emh203 0:d0c18e423b13 239 TerminalCmdBuf[i+1] = 0;
emh203 0:d0c18e423b13 240
emh203 0:d0c18e423b13 241 strcpy(TerminalArgs,&TerminalLineBuf[i]);
emh203 0:d0c18e423b13 242
emh203 0:d0c18e423b13 243 CmdFound = FALSE;
emh203 0:d0c18e423b13 244 for(j=0;j<NUM_TERMINAL_CMDS;j++)
emh203 0:d0c18e423b13 245 {
emh203 0:d0c18e423b13 246 if(strcmp(TerminalCmdBuf,TerminalCommands[j]) == 0)
emh203 0:d0c18e423b13 247 {
emh203 0:d0c18e423b13 248 if(TerminalCallbacks[j] != NULL)
emh203 0:d0c18e423b13 249 TerminalCallbacks[j](TerminalArgs);
emh203 0:d0c18e423b13 250
emh203 0:d0c18e423b13 251 CmdFound = TRUE;
emh203 0:d0c18e423b13 252 break;
emh203 0:d0c18e423b13 253 }
emh203 0:d0c18e423b13 254 }
emh203 0:d0c18e423b13 255 if(CmdFound == FALSE)
emh203 0:d0c18e423b13 256 {
emh203 0:d0c18e423b13 257 PrintfEnqueue(&PCBackDoorTx,"%s command not recognized.\r\n", TerminalCmdBuf);
emh203 0:d0c18e423b13 258 }
emh203 0:d0c18e423b13 259 }
emh203 0:d0c18e423b13 260 ByteEnqueue(&PCBackDoorTx,'\n');
emh203 0:d0c18e423b13 261 ByteEnqueue(&PCBackDoorTx,'>');
emh203 0:d0c18e423b13 262 TerminalPos = 0;
emh203 0:d0c18e423b13 263
emh203 0:d0c18e423b13 264 break;
emh203 0:d0c18e423b13 265
emh203 0:d0c18e423b13 266 case '\b':
emh203 0:d0c18e423b13 267 if(TerminalPos > 0)
emh203 0:d0c18e423b13 268 {
emh203 0:d0c18e423b13 269 TerminalPos--;
emh203 0:d0c18e423b13 270 ByteEnqueue(&PCBackDoorTx,NextCharIn);
emh203 0:d0c18e423b13 271 }
emh203 0:d0c18e423b13 272 break;
emh203 0:d0c18e423b13 273
emh203 0:d0c18e423b13 274 default:
emh203 0:d0c18e423b13 275
emh203 0:d0c18e423b13 276 if(TerminalPos == 0 && NextCharIn == 0x020)
emh203 0:d0c18e423b13 277 {
emh203 0:d0c18e423b13 278 //Do nothing if space bar is pressed at begining of line
emh203 0:d0c18e423b13 279 }
emh203 0:d0c18e423b13 280 else if(NextCharIn >= 0x20 && NextCharIn<0x7F)
emh203 0:d0c18e423b13 281 {
emh203 0:d0c18e423b13 282
emh203 0:d0c18e423b13 283 if(TerminalPos < MAX_TERMINAL_LINE_CHARS-1)
emh203 0:d0c18e423b13 284 {
emh203 0:d0c18e423b13 285 TerminalLineBuf[TerminalPos++] = NextCharIn;
emh203 0:d0c18e423b13 286 ByteEnqueue(&PCBackDoorTx,NextCharIn);
emh203 0:d0c18e423b13 287 }
emh203 0:d0c18e423b13 288 }
emh203 0:d0c18e423b13 289
emh203 0:d0c18e423b13 290 break;
emh203 0:d0c18e423b13 291
emh203 0:d0c18e423b13 292 }
emh203 0:d0c18e423b13 293 }
emh203 0:d0c18e423b13 294
emh203 0:d0c18e423b13 295 }
emh203 0:d0c18e423b13 296