Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of PSU-POWERLOGGER by
CODE/Terminal.cpp@3:d55665050fcb, 2012-09-28 (annotated)
- Committer:
- rjc19
- Date:
- Fri Sep 28 15:41:36 2012 +0000
- Revision:
- 3:d55665050fcb
- Parent:
- 2:f6e5fdf2f872
Working serial logger needs interface improvement
Who changed what in which revision?
| User | Revision | Line number | New 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 | |
| rjc19 | 1:871a329fd172 | 19 | #define NUM_TERMINAL_CMDS 9 |
| emh203 | 0:d0c18e423b13 | 20 | |
| rjc19 | 1:871a329fd172 | 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); |
| rjc19 | 1:871a329fd172 | 34 | void TerminalCmd_NormalMode(char *arg); |
| rjc19 | 1:871a329fd172 | 35 | |
| emh203 | 0:d0c18e423b13 | 36 | |
| emh203 | 0:d0c18e423b13 | 37 | TerminalCallback TerminalCallbacks[NUM_TERMINAL_CMDS] ={TerminalCmd_Help}; |
| emh203 | 0:d0c18e423b13 | 38 | |
| emh203 | 0:d0c18e423b13 | 39 | |
| emh203 | 0:d0c18e423b13 | 40 | void InitTerminal() |
| emh203 | 0:d0c18e423b13 | 41 | { |
| emh203 | 0:d0c18e423b13 | 42 | //Initialize the terminal command callbacks |
| emh203 | 0:d0c18e423b13 | 43 | TerminalCallbacks[0] = TerminalCmd_Help; |
| emh203 | 0:d0c18e423b13 | 44 | TerminalCallbacks[1] = TerminalCmd_Reboot; |
| emh203 | 0:d0c18e423b13 | 45 | TerminalCallbacks[2] = TerminalCmd_v; |
| emh203 | 0:d0c18e423b13 | 46 | TerminalCallbacks[3] = TerminalCmd_i; |
| emh203 | 0:d0c18e423b13 | 47 | TerminalCallbacks[4] = TerminalCmd_Time; |
| emh203 | 0:d0c18e423b13 | 48 | TerminalCallbacks[5] = TerminalCmd_Date; |
| emh203 | 0:d0c18e423b13 | 49 | TerminalCallbacks[6] = TerminalCmd_RTC_Init; |
| emh203 | 0:d0c18e423b13 | 50 | TerminalCallbacks[7] = TerminalCmd_Batt; |
| rjc19 | 1:871a329fd172 | 51 | TerminalCallbacks[8] = TerminalCmd_NormalMode; |
| emh203 | 0:d0c18e423b13 | 52 | |
| emh203 | 0:d0c18e423b13 | 53 | } |
| emh203 | 0:d0c18e423b13 | 54 | |
| emh203 | 0:d0c18e423b13 | 55 | |
| emh203 | 0:d0c18e423b13 | 56 | extern "C" void mbed_reset(); |
| emh203 | 0:d0c18e423b13 | 57 | |
| emh203 | 0:d0c18e423b13 | 58 | |
| emh203 | 0:d0c18e423b13 | 59 | void TerminalCmd_Batt(char *) |
| emh203 | 0:d0c18e423b13 | 60 | { |
| emh203 | 0:d0c18e423b13 | 61 | PrintfEnqueue(&PCBackDoorTx,"\r\nBattery: %.3f\r\n",BatteryVoltage); |
| emh203 | 0:d0c18e423b13 | 62 | } |
| emh203 | 0:d0c18e423b13 | 63 | void TerminalCmd_RTC_Init(char *arg) |
| emh203 | 0:d0c18e423b13 | 64 | { |
| emh203 | 0:d0c18e423b13 | 65 | set_time(1256729737); |
| emh203 | 0:d0c18e423b13 | 66 | PrintfEnqueue(&PCBackDoorTx,"\r\nTime Reset\r\n"); |
| emh203 | 0:d0c18e423b13 | 67 | } |
| emh203 | 0:d0c18e423b13 | 68 | |
| emh203 | 0:d0c18e423b13 | 69 | |
| emh203 | 0:d0c18e423b13 | 70 | void TerminalCmd_Time(char *arg) |
| emh203 | 0:d0c18e423b13 | 71 | { |
| emh203 | 0:d0c18e423b13 | 72 | int Hour,Minute,Second=0; |
| emh203 | 0:d0c18e423b13 | 73 | int Items; |
| emh203 | 0:d0c18e423b13 | 74 | BOOL Error = FALSE; |
| emh203 | 0:d0c18e423b13 | 75 | time_t TimeStampTemp; |
| emh203 | 0:d0c18e423b13 | 76 | |
| emh203 | 0:d0c18e423b13 | 77 | |
| emh203 | 0:d0c18e423b13 | 78 | Items = sscanf(arg, "%d : %d : %d", &Hour, &Minute, &Second); |
| emh203 | 0:d0c18e423b13 | 79 | if(Items == 3) |
| emh203 | 0:d0c18e423b13 | 80 | { |
| emh203 | 0:d0c18e423b13 | 81 | PrintfEnqueue(&PCBackDoorTx,"\r\n"); |
| emh203 | 0:d0c18e423b13 | 82 | if(Hour>23) |
| emh203 | 0:d0c18e423b13 | 83 | { |
| emh203 | 0:d0c18e423b13 | 84 | PrintfEnqueue(&PCBackDoorTx,"Hour entry must be between 0 and 24\r\n"); |
| emh203 | 0:d0c18e423b13 | 85 | Error = TRUE; |
| emh203 | 0:d0c18e423b13 | 86 | } |
| emh203 | 0:d0c18e423b13 | 87 | if(Minute>60) |
| emh203 | 0:d0c18e423b13 | 88 | { |
| emh203 | 0:d0c18e423b13 | 89 | PrintfEnqueue(&PCBackDoorTx,"Minute entry must be between 0 and 60\r\n"); |
| emh203 | 0:d0c18e423b13 | 90 | Error = TRUE; |
| emh203 | 0:d0c18e423b13 | 91 | } |
| emh203 | 0:d0c18e423b13 | 92 | if(Second>60) |
| emh203 | 0:d0c18e423b13 | 93 | { |
| emh203 | 0:d0c18e423b13 | 94 | PrintfEnqueue(&PCBackDoorTx,"Second entry must be between 0 and 60\r\n"); |
| emh203 | 0:d0c18e423b13 | 95 | Error = TRUE; |
| emh203 | 0:d0c18e423b13 | 96 | } |
| emh203 | 0:d0c18e423b13 | 97 | |
| emh203 | 0:d0c18e423b13 | 98 | if(Error == TRUE) |
| emh203 | 0:d0c18e423b13 | 99 | { |
| emh203 | 0:d0c18e423b13 | 100 | PrintfEnqueue(&PCBackDoorTx,"Error in time format. Time syntax should be H:M:S\r\n. Time not changed.\r\n"); |
| emh203 | 0:d0c18e423b13 | 101 | } |
| emh203 | 0:d0c18e423b13 | 102 | else |
| emh203 | 0:d0c18e423b13 | 103 | { |
| emh203 | 0:d0c18e423b13 | 104 | TimeStampTemp = time(NULL); |
| emh203 | 0:d0c18e423b13 | 105 | //convert to tm struct |
| emh203 | 0:d0c18e423b13 | 106 | CurrentTime = localtime(&TimeStampTemp); |
| emh203 | 0:d0c18e423b13 | 107 | //dump in our new valus |
| emh203 | 0:d0c18e423b13 | 108 | CurrentTime->tm_sec = Second; |
| emh203 | 0:d0c18e423b13 | 109 | CurrentTime->tm_min = Minute; |
| emh203 | 0:d0c18e423b13 | 110 | CurrentTime->tm_hour = Hour; |
| emh203 | 0:d0c18e423b13 | 111 | //set the new time |
| emh203 | 0:d0c18e423b13 | 112 | set_time(mktime(CurrentTime)); |
| emh203 | 0:d0c18e423b13 | 113 | PrintfEnqueue(&PCBackDoorTx,"Time set to %d:%d:%d\r\n",Hour,Minute,Second); |
| emh203 | 0:d0c18e423b13 | 114 | } |
| emh203 | 0:d0c18e423b13 | 115 | |
| emh203 | 0:d0c18e423b13 | 116 | } |
| emh203 | 0:d0c18e423b13 | 117 | else |
| emh203 | 0:d0c18e423b13 | 118 | { |
| emh203 | 0:d0c18e423b13 | 119 | PrintfEnqueue(&PCBackDoorTx,"Time syntax should be H:M:S\r\n"); |
| emh203 | 0:d0c18e423b13 | 120 | } |
| emh203 | 0:d0c18e423b13 | 121 | } |
| emh203 | 0:d0c18e423b13 | 122 | |
| emh203 | 0:d0c18e423b13 | 123 | void TerminalCmd_Date(char *arg) |
| emh203 | 0:d0c18e423b13 | 124 | { |
| emh203 | 0:d0c18e423b13 | 125 | int Day,Month,Year=0; |
| emh203 | 0:d0c18e423b13 | 126 | int Items; |
| emh203 | 0:d0c18e423b13 | 127 | BOOL Error = FALSE; |
| emh203 | 0:d0c18e423b13 | 128 | time_t TimeStampTemp; |
| emh203 | 0:d0c18e423b13 | 129 | |
| emh203 | 0:d0c18e423b13 | 130 | Items = sscanf(arg, "%d / %d / %d", &Month, &Day, &Year); |
| emh203 | 0:d0c18e423b13 | 131 | if(Items == 3) |
| emh203 | 0:d0c18e423b13 | 132 | { |
| emh203 | 0:d0c18e423b13 | 133 | PrintfEnqueue(&PCBackDoorTx,"\r\n"); |
| emh203 | 0:d0c18e423b13 | 134 | if(Month>12 || Month < 1) |
| emh203 | 0:d0c18e423b13 | 135 | { |
| emh203 | 0:d0c18e423b13 | 136 | PrintfEnqueue(&PCBackDoorTx,"\r\nMonth entry must be between 1 and 12\r\n"); |
| emh203 | 0:d0c18e423b13 | 137 | Error = TRUE; |
| emh203 | 0:d0c18e423b13 | 138 | } |
| emh203 | 0:d0c18e423b13 | 139 | if(Day>31 || Day<1) |
| emh203 | 0:d0c18e423b13 | 140 | { |
| emh203 | 0:d0c18e423b13 | 141 | PrintfEnqueue(&PCBackDoorTx,"\r\nDay entry must be between 1 and 31\r\n"); |
| emh203 | 0:d0c18e423b13 | 142 | Error = TRUE; |
| emh203 | 0:d0c18e423b13 | 143 | } |
| emh203 | 0:d0c18e423b13 | 144 | if(Year<1900) |
| emh203 | 0:d0c18e423b13 | 145 | { |
| emh203 | 0:d0c18e423b13 | 146 | PrintfEnqueue(&PCBackDoorTx,"\r\nYear entry must be greater than 1900\r\n"); |
| emh203 | 0:d0c18e423b13 | 147 | Error = TRUE; |
| emh203 | 0:d0c18e423b13 | 148 | } |
| emh203 | 0:d0c18e423b13 | 149 | |
| emh203 | 0:d0c18e423b13 | 150 | if(Error == TRUE) |
| emh203 | 0:d0c18e423b13 | 151 | { |
| emh203 | 0:d0c18e423b13 | 152 | PrintfEnqueue(&PCBackDoorTx,"\r\nError in Date format. Date not changed.\r\n"); |
| emh203 | 0:d0c18e423b13 | 153 | } |
| emh203 | 0:d0c18e423b13 | 154 | else |
| emh203 | 0:d0c18e423b13 | 155 | { |
| emh203 | 0:d0c18e423b13 | 156 | //Get the current time in seconds since unix epoch |
| emh203 | 0:d0c18e423b13 | 157 | TimeStampTemp = time(NULL); |
| emh203 | 0:d0c18e423b13 | 158 | //convert to tm struct fom |
| emh203 | 0:d0c18e423b13 | 159 | CurrentTime = localtime(&TimeStampTemp); |
| emh203 | 0:d0c18e423b13 | 160 | //dump in our new valus |
| emh203 | 0:d0c18e423b13 | 161 | CurrentTime->tm_mon = Month-1; |
| emh203 | 0:d0c18e423b13 | 162 | CurrentTime->tm_mday = Day; |
| emh203 | 0:d0c18e423b13 | 163 | CurrentTime->tm_year = Year - 1900; |
| emh203 | 0:d0c18e423b13 | 164 | //set the new time |
| emh203 | 0:d0c18e423b13 | 165 | set_time(mktime(CurrentTime)); |
| emh203 | 0:d0c18e423b13 | 166 | PrintfEnqueue(&PCBackDoorTx,"\r\nDate set to %d/%d/%d\r\n",Month,Day,Year); |
| emh203 | 0:d0c18e423b13 | 167 | } |
| emh203 | 0:d0c18e423b13 | 168 | |
| emh203 | 0:d0c18e423b13 | 169 | } |
| emh203 | 0:d0c18e423b13 | 170 | else |
| emh203 | 0:d0c18e423b13 | 171 | { |
| emh203 | 0:d0c18e423b13 | 172 | PrintfEnqueue(&PCBackDoorTx,"Date syntax should be MM/DD/YYYY\r\n"); |
| emh203 | 0:d0c18e423b13 | 173 | } |
| emh203 | 0:d0c18e423b13 | 174 | } |
| emh203 | 0:d0c18e423b13 | 175 | |
| emh203 | 0:d0c18e423b13 | 176 | void TerminalCmd_v(char *arg) |
| emh203 | 0:d0c18e423b13 | 177 | { |
| emh203 | 0:d0c18e423b13 | 178 | // PrintfEnqueue(&PCBackDoorTx,"\r\nVbus: %.1f\r\n",Vout); |
| emh203 | 0:d0c18e423b13 | 179 | } |
| emh203 | 0:d0c18e423b13 | 180 | |
| emh203 | 0:d0c18e423b13 | 181 | void TerminalCmd_i(char *arg) |
| emh203 | 0:d0c18e423b13 | 182 | { |
| emh203 | 0:d0c18e423b13 | 183 | // PrintfEnqueue(&PCBackDoorTx,"\r\nIbus: %.1f\r\n",Iout); |
| emh203 | 0:d0c18e423b13 | 184 | } |
| emh203 | 0:d0c18e423b13 | 185 | |
| emh203 | 0:d0c18e423b13 | 186 | void TerminalCmd_Help(char *arg) |
| emh203 | 0:d0c18e423b13 | 187 | { |
| emh203 | 0:d0c18e423b13 | 188 | BYTE i; |
| emh203 | 0:d0c18e423b13 | 189 | |
| emh203 | 0:d0c18e423b13 | 190 | PrintfEnqueue(&PCBackDoorTx,"\r\n\r\bCommandList:\r\n"); |
| emh203 | 0:d0c18e423b13 | 191 | PrintfEnqueue(&PCBackDoorTx,"----------------------\r\n"); |
| emh203 | 0:d0c18e423b13 | 192 | |
| emh203 | 0:d0c18e423b13 | 193 | for(i=0;i<NUM_TERMINAL_CMDS;i++) |
| emh203 | 0:d0c18e423b13 | 194 | { |
| emh203 | 0:d0c18e423b13 | 195 | PrintfEnqueue(&PCBackDoorTx,"%s\r\n",TerminalCommands[i]); |
| emh203 | 0:d0c18e423b13 | 196 | } |
| emh203 | 0:d0c18e423b13 | 197 | |
| emh203 | 0:d0c18e423b13 | 198 | } |
| rjc19 | 1:871a329fd172 | 199 | void TerminalCmd_NormalMode(char *arg){ |
| rjc19 | 1:871a329fd172 | 200 | PrintfLogEnqueue(&PCBackDoorTx,"Exiting Normal mode\r\n >"); |
| rjc19 | 1:871a329fd172 | 201 | WeAreInNormalMode=FALSE; |
| rjc19 | 1:871a329fd172 | 202 | } |
| emh203 | 0:d0c18e423b13 | 203 | void TerminalCmd_Reboot(char *arg) |
| emh203 | 0:d0c18e423b13 | 204 | { |
| emh203 | 0:d0c18e423b13 | 205 | mbed_reset(); |
| emh203 | 0:d0c18e423b13 | 206 | } |
| emh203 | 0:d0c18e423b13 | 207 | |
| emh203 | 0:d0c18e423b13 | 208 | void TerminalCmd_Strip(char *arg) |
| emh203 | 0:d0c18e423b13 | 209 | { |
| emh203 | 0:d0c18e423b13 | 210 | PrintfEnqueue(&PCBackDoorTx,"\r\n%s\r\n", arg); |
| emh203 | 0:d0c18e423b13 | 211 | } |
| rjc19 | 1:871a329fd172 | 212 | BYTE AngleCount=0; |
| emh203 | 0:d0c18e423b13 | 213 | |
| emh203 | 0:d0c18e423b13 | 214 | void ProcessTerminal() |
| emh203 | 0:d0c18e423b13 | 215 | { |
| emh203 | 0:d0c18e423b13 | 216 | |
| emh203 | 0:d0c18e423b13 | 217 | BYTE i,j; |
| emh203 | 0:d0c18e423b13 | 218 | if(BytesInQueue(&PCBackDoorRx)>0) |
| emh203 | 0:d0c18e423b13 | 219 | { |
| emh203 | 0:d0c18e423b13 | 220 | ByteDequeue(&PCBackDoorRx,&NextCharIn); |
| rjc19 | 1:871a329fd172 | 221 | if(WeAreInNormalMode){ |
| rjc19 | 1:871a329fd172 | 222 | switch(NextCharIn) |
| rjc19 | 1:871a329fd172 | 223 | { |
| rjc19 | 1:871a329fd172 | 224 | case '\r': |
| rjc19 | 1:871a329fd172 | 225 | TerminalLineBuf[TerminalPos++] = 0x0; |
| rjc19 | 1:871a329fd172 | 226 | ByteEnqueue(&PCBackDoorTx,NextCharIn); |
| rjc19 | 1:871a329fd172 | 227 | |
| rjc19 | 1:871a329fd172 | 228 | if(TerminalPos > 1) |
| rjc19 | 1:871a329fd172 | 229 | { |
| rjc19 | 1:871a329fd172 | 230 | //find the command |
| rjc19 | 1:871a329fd172 | 231 | i=0; |
| rjc19 | 1:871a329fd172 | 232 | while(TerminalLineBuf[i]>0x20 && TerminalLineBuf[i]<0x7f) |
| rjc19 | 1:871a329fd172 | 233 | { |
| rjc19 | 1:871a329fd172 | 234 | TerminalCmdBuf[i] = TerminalLineBuf[i]; |
| rjc19 | 1:871a329fd172 | 235 | i++; |
| emh203 | 0:d0c18e423b13 | 236 | |
| rjc19 | 1:871a329fd172 | 237 | if(i==MAX_TERMINAL_CMD_CHARS) |
| rjc19 | 1:871a329fd172 | 238 | { |
| rjc19 | 1:871a329fd172 | 239 | break; |
| rjc19 | 1:871a329fd172 | 240 | } |
| rjc19 | 1:871a329fd172 | 241 | } |
| rjc19 | 1:871a329fd172 | 242 | |
| rjc19 | 1:871a329fd172 | 243 | TerminalCmdBuf[i] = 0; |
| rjc19 | 1:871a329fd172 | 244 | TerminalCmdBuf[i+1] = 0; |
| rjc19 | 1:871a329fd172 | 245 | |
| rjc19 | 1:871a329fd172 | 246 | strcpy(TerminalArgs,&TerminalLineBuf[i]); |
| emh203 | 0:d0c18e423b13 | 247 | |
| rjc19 | 1:871a329fd172 | 248 | CmdFound = FALSE; |
| rjc19 | 1:871a329fd172 | 249 | for(j=0;j<NUM_TERMINAL_CMDS;j++) |
| rjc19 | 1:871a329fd172 | 250 | { |
| rjc19 | 1:871a329fd172 | 251 | if(strcmp(TerminalCmdBuf,TerminalCommands[j]) == 0) |
| emh203 | 0:d0c18e423b13 | 252 | { |
| rjc19 | 1:871a329fd172 | 253 | if(TerminalCallbacks[j] != NULL) |
| rjc19 | 1:871a329fd172 | 254 | TerminalCallbacks[j](TerminalArgs); |
| rjc19 | 1:871a329fd172 | 255 | |
| rjc19 | 1:871a329fd172 | 256 | CmdFound = TRUE; |
| rjc19 | 1:871a329fd172 | 257 | break; |
| rjc19 | 1:871a329fd172 | 258 | } |
| rjc19 | 1:871a329fd172 | 259 | } |
| rjc19 | 1:871a329fd172 | 260 | if(CmdFound == FALSE) |
| emh203 | 0:d0c18e423b13 | 261 | { |
| rjc19 | 1:871a329fd172 | 262 | PrintfEnqueue(&PCBackDoorTx,"%s command not recognized.\r\n", TerminalCmdBuf); |
| rjc19 | 1:871a329fd172 | 263 | } |
| rjc19 | 1:871a329fd172 | 264 | } |
| rjc19 | 1:871a329fd172 | 265 | ByteEnqueue(&PCBackDoorTx,'\n'); |
| rjc19 | 1:871a329fd172 | 266 | ByteEnqueue(&PCBackDoorTx,'>'); |
| rjc19 | 1:871a329fd172 | 267 | TerminalPos = 0; |
| rjc19 | 1:871a329fd172 | 268 | |
| rjc19 | 1:871a329fd172 | 269 | break; |
| rjc19 | 1:871a329fd172 | 270 | case '\b': |
| rjc19 | 1:871a329fd172 | 271 | if(TerminalPos > 0) |
| rjc19 | 1:871a329fd172 | 272 | { |
| rjc19 | 1:871a329fd172 | 273 | TerminalPos--; |
| rjc19 | 1:871a329fd172 | 274 | ByteEnqueue(&PCBackDoorTx,NextCharIn); |
| rjc19 | 1:871a329fd172 | 275 | } |
| rjc19 | 1:871a329fd172 | 276 | break; |
| rjc19 | 1:871a329fd172 | 277 | |
| rjc19 | 1:871a329fd172 | 278 | default: |
| emh203 | 0:d0c18e423b13 | 279 | |
| rjc19 | 1:871a329fd172 | 280 | if(TerminalPos == 0 && NextCharIn == 0x020) |
| rjc19 | 1:871a329fd172 | 281 | { |
| rjc19 | 1:871a329fd172 | 282 | //Do nothing if space bar is pressed at begining of line |
| rjc19 | 1:871a329fd172 | 283 | } |
| rjc19 | 1:871a329fd172 | 284 | else if(NextCharIn >= 0x20 && NextCharIn<0x7F) |
| rjc19 | 1:871a329fd172 | 285 | { |
| rjc19 | 1:871a329fd172 | 286 | |
| rjc19 | 1:871a329fd172 | 287 | if(TerminalPos < MAX_TERMINAL_LINE_CHARS-1) |
| rjc19 | 1:871a329fd172 | 288 | { |
| rjc19 | 1:871a329fd172 | 289 | TerminalLineBuf[TerminalPos++] = NextCharIn; |
| rjc19 | 1:871a329fd172 | 290 | ByteEnqueue(&PCBackDoorTx,NextCharIn); |
| rjc19 | 1:871a329fd172 | 291 | } |
| rjc19 | 1:871a329fd172 | 292 | } |
| rjc19 | 1:871a329fd172 | 293 | |
| rjc19 | 1:871a329fd172 | 294 | break; |
| emh203 | 0:d0c18e423b13 | 295 | |
| rjc19 | 1:871a329fd172 | 296 | }//end of character switch |
| rjc19 | 1:871a329fd172 | 297 | }else{ //not normal mode |
| rjc19 | 1:871a329fd172 | 298 | switch(NextCharIn){ |
| rjc19 | 1:871a329fd172 | 299 | case '>': |
| rjc19 | 1:871a329fd172 | 300 | AngleCount++; |
| rjc19 | 1:871a329fd172 | 301 | if(AngleCount > 2){ |
| rjc19 | 1:871a329fd172 | 302 | WeAreInNormalMode=TRUE; |
| rjc19 | 1:871a329fd172 | 303 | PrintfLogEnqueue(&PCBackDoorTx,"Entering Normal mode\r\n >"); |
| rjc19 | 1:871a329fd172 | 304 | AngleCount=0; |
| rjc19 | 1:871a329fd172 | 305 | } |
| rjc19 | 1:871a329fd172 | 306 | break; |
| rjc19 | 1:871a329fd172 | 307 | } |
| rjc19 | 1:871a329fd172 | 308 | } |
| rjc19 | 1:871a329fd172 | 309 | } |
| rjc19 | 1:871a329fd172 | 310 | } |
| rjc19 | 1:871a329fd172 | 311 | void LogSerial(){ |
| rjc19 | 1:871a329fd172 | 312 | UINT t; |
| rjc19 | 1:871a329fd172 | 313 | UINT BytesWritten; |
| rjc19 | 1:871a329fd172 | 314 | if(BytesInQueue(&PCBackDoorRx)>0) |
| rjc19 | 1:871a329fd172 | 315 | { |
| rjc19 | 1:871a329fd172 | 316 | ByteDequeue(&PCBackDoorRx,&NextCharIn); |
| rjc19 | 1:871a329fd172 | 317 | switch(NextCharIn){ |
| rjc19 | 1:871a329fd172 | 318 | case '>': |
| rjc19 | 1:871a329fd172 | 319 | AngleCount++; |
| rjc19 | 1:871a329fd172 | 320 | if(AngleCount > 2){ |
| rjc19 | 1:871a329fd172 | 321 | WeAreInNormalMode=TRUE; |
| rjc19 | 1:871a329fd172 | 322 | PrintfLogEnqueue(&PCBackDoorTx,"Entering Normal mode\r\n >"); |
| emh203 | 0:d0c18e423b13 | 323 | } |
| rjc19 | 1:871a329fd172 | 324 | break; |
| rjc19 | 1:871a329fd172 | 325 | case '\n': |
| rjc19 | 1:871a329fd172 | 326 | break; //just eat |
| rjc19 | 1:871a329fd172 | 327 | case '\r': |
| rjc19 | 1:871a329fd172 | 328 | SerialLineBuffer[SerialLineBufferPtr++]='\r'; |
| rjc19 | 1:871a329fd172 | 329 | SerialLineBuffer[SerialLineBufferPtr++]='\n'; |
| rjc19 | 1:871a329fd172 | 330 | if(SystemState == SYSTEM_STATE_SERIAL_LOGGING){ |
| rjc19 | 1:871a329fd172 | 331 | if(f_write(&CurrentLogFileHandle,SerialLineBuffer,SerialLineBufferPtr,&BytesWritten)){ //if we didn't work kick out |
| rjc19 | 1:871a329fd172 | 332 | PrintfLogEnqueue(&PCBackDoorTx,"QQQ\r\n"); //Shutdown |
| rjc19 | 1:871a329fd172 | 333 | PrintfEnqueue(&PCBackDoorTx,"Failed to write\r\n"); |
| rjc19 | 1:871a329fd172 | 334 | EnterSystemState(SYSTEM_STATE_IDLE); |
| rjc19 | 1:871a329fd172 | 335 | }else{ |
| rjc19 | 1:871a329fd172 | 336 | if(BytesWritten != 0){ |
| rjc19 | 1:871a329fd172 | 337 | LinesWritten++; |
| rjc19 | 1:871a329fd172 | 338 | if(LinesWritten > NUMBEROFLINESBEFORESYNC){ |
| rjc19 | 1:871a329fd172 | 339 | f_sync(&CurrentLogFileHandle); |
| rjc19 | 1:871a329fd172 | 340 | PrintfEnqueue(&PCBackDoorTx,"Synced"); |
| rjc19 | 1:871a329fd172 | 341 | LinesWritten=0; |
| rjc19 | 1:871a329fd172 | 342 | } |
| rjc19 | 1:871a329fd172 | 343 | } |
| emh203 | 0:d0c18e423b13 | 344 | } |
| emh203 | 0:d0c18e423b13 | 345 | } |
| rjc19 | 1:871a329fd172 | 346 | SerialLineBufferPtr=0; //Always do this so we don't overflow |
| rjc19 | 3:d55665050fcb | 347 | SerialCount++; |
| rjc19 | 3:d55665050fcb | 348 | if(SerialCount > 5000)SerialCount=0; |
| rjc19 | 1:871a329fd172 | 349 | break; |
| rjc19 | 1:871a329fd172 | 350 | default: |
| rjc19 | 1:871a329fd172 | 351 | AngleCount=0; |
| rjc19 | 1:871a329fd172 | 352 | SerialLineBuffer[SerialLineBufferPtr++]=NextCharIn; |
| rjc19 | 1:871a329fd172 | 353 | if(SerialLineBufferPtr > 255){ |
| rjc19 | 1:871a329fd172 | 354 | if(SystemState == SYSTEM_STATE_SERIAL_LOGGING){ |
| rjc19 | 1:871a329fd172 | 355 | if(f_write(&CurrentLogFileHandle,SerialLineBuffer,SerialLineBufferPtr,&BytesWritten)){ //if we didn't work kick out |
| rjc19 | 1:871a329fd172 | 356 | PrintfLogEnqueue(&PCBackDoorTx,"QQQ\r\n"); //Shutdown |
| rjc19 | 1:871a329fd172 | 357 | PrintfEnqueue(&PCBackDoorTx,"Failed to write default\r\n"); |
| rjc19 | 1:871a329fd172 | 358 | EnterSystemState(SYSTEM_STATE_IDLE); |
| rjc19 | 1:871a329fd172 | 359 | } |
| rjc19 | 1:871a329fd172 | 360 | } |
| rjc19 | 1:871a329fd172 | 361 | SerialLineBufferPtr=0; |
| rjc19 | 1:871a329fd172 | 362 | } |
| rjc19 | 1:871a329fd172 | 363 | break; |
| rjc19 | 1:871a329fd172 | 364 | }// end of non-normal switch |
| rjc19 | 2:f6e5fdf2f872 | 365 | }//for commit |
| emh203 | 0:d0c18e423b13 | 366 | } |
| emh203 | 0:d0c18e423b13 | 367 |
