For Terrance

Dependencies:   mbed

Committer:
emh203
Date:
Wed Jun 13 15:10:06 2012 +0000
Revision:
0:085749c8446f

        

Who changed what in which revision?

UserRevisionLine numberNew 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