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