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.
Terminal.cpp
00001 /* 00002 00003 -------------------------------------------- 00004 | | 00005 | .... | 00006 | 7OO$?I78. | 00007 | .?8++++7+II?D. | 00008 | .?O++=I++II+?= | 00009 | .IO++?7==I??$. | 00010 | .8++=$===?+I$ | 00011 | ?+++===+===+ | 00012 | ???=+I++==+? | 00013 | .??++====+==++ | 00014 | ?+++==========~ | 00015 | $+++==========+= | 00016 | =?+===+==+I======== | 00017 | ..++======~~~~========? | 00018 | .$?I??+=~~===~~~===~===++. | 00019 | .+==.+=~~~=~==~~~~==~~=~==+? | 00020 | ?===I+====~~=~~~=~~=====~~~=?. | 00021 | .=~~~+==~==..~~~~~~= ~~~~=7= | 00022 | +=~~?+~~=. ==~~~~=. ~~~~=?. | 00023 | =~~~=~~~ ?===~~+. ~~~~+ | 00024 | +~~:+~~= =~~==. =~~+. | 00025 | ~:~ =~~= =~~~= ~=== | 00026 | I=~~ ,=~~= ,. | 00027 | ~~. ,==== | 00028 | ==== | 00029 | =~~. | 00030 | | 00031 |------------------------------------------| 00032 | Internet Of Thing | 00033 | Eli Hughes | 00034 | Freescale / Hack-a-day Make-It-Challenge | 00035 | FTF 2014 - Dallas, Tx | 00036 |------------------------------------------| 00037 00038 */ 00039 #include "Terminal.h" 00040 #include "Types.h" 00041 #include "Queue.h" 00042 #include <string.h> 00043 #include <stdint.h> 00044 #include "System.h" 00045 00046 //***************************************************************** 00047 //Terminal Configuration 00048 //***************************************************************** 00049 00050 #define MAX_TERMINAL_LINE_CHARS 64 00051 #define MAX_TERMINAL_CMD_CHARS 32 00052 00053 ByteQueue TERMINAL_OUTPUT_QUEUE; 00054 ByteQueue TERMINAL_INPUT_QUEUE; 00055 00056 #define TERMINAL_QUEUE_SIZE 2048 00057 00058 uint8_t TERMINAL_OUTPUT_QUEUE_Storage[TERMINAL_QUEUE_SIZE]; 00059 uint8_t TERMINAL_INPUT_QUEUE_Storage[TERMINAL_QUEUE_SIZE]; 00060 00061 typedef void (*TerminalCallback)(char *); 00062 00063 00064 typedef struct 00065 { 00066 const char *CommandString; 00067 TerminalCallback Callback; 00068 const char *HelpString; 00069 00070 } TerminalCallbackRecord; 00071 00072 //Callback function prototypes 00073 void TerminalCmd_Help(char *arg); 00074 void TerminalCmd_Go(char *arg); 00075 void TerminalCmd_SpinCW(char *arg); 00076 void TerminalCmd_SpinCCW(char *arg); 00077 void TerminalCmd_Stop(char *arg); 00078 00079 void TerminalCmd_Reboot(char *arg); 00080 void TerminalCmd_Back(char *arg); 00081 00082 //Populate this array with the callback functions and their terminal command string 00083 TerminalCallbackRecord MyTerminalCallbackRecords[] ={ {"help",TerminalCmd_Help,"Lists available commands"}, 00084 {"thing_go",TerminalCmd_Go," Tells the thing to go forward"}, 00085 {"thing_cw",TerminalCmd_SpinCW," Tells the thing to spin clock-wise"}, 00086 {"thing_ccw",TerminalCmd_SpinCCW," Tells the thing to spin counter clockwise"}, 00087 {"thing_stop",TerminalCmd_Stop,"Tells the thing to stop"}, 00088 {"thing_back",TerminalCmd_Back,"Tells the thing to go"}, 00089 }; 00090 00091 //***************************************************************** 00092 //Plumbing..... 00093 //***************************************************************** 00094 00095 #define NUM_TERMINAL_COMMANDS (sizeof(MyTerminalCallbackRecords)/sizeof(TerminalCallbackRecord)) 00096 00097 char TerminalLineBuf[MAX_TERMINAL_LINE_CHARS]; 00098 uint8_t TerminalPos; 00099 char TerminalCmdBuf[MAX_TERMINAL_CMD_CHARS+1]; 00100 char TerminalArgs[MAX_TERMINAL_LINE_CHARS-MAX_TERMINAL_CMD_CHARS]; 00101 uint8_t NextCharIn; 00102 uint8_t CmdFound; 00103 00104 void TerminalBootMsg() 00105 { 00106 TERMINAL_PRINTF("-------------------------------------------- \r\n"); 00107 TERMINAL_PRINTF("| |\r\n"); 00108 TERMINAL_PRINTF("| .... | \r\n"); 00109 TERMINAL_PRINTF("| 7OO$?I78. | \r\n"); 00110 TERMINAL_PRINTF("| .?8++++7+II?D. | \r\n"); 00111 TERMINAL_PRINTF("| .?O++=I++II+?= | \r\n"); 00112 TERMINAL_PRINTF("| .IO++?7==I??$. | \r\n"); 00113 TERMINAL_PRINTF("| .8++=$===?+I$ | \r\n"); 00114 TERMINAL_PRINTF("| ?+++===+===+ | \r\n"); 00115 TERMINAL_PRINTF("| ???=+I++==+? | \r\n"); 00116 TERMINAL_PRINTF("| .??++====+==++ | \r\n"); 00117 TERMINAL_PRINTF("| ?+++==========~ | \r\n"); 00118 TERMINAL_PRINTF("| $+++==========+= | \r\n"); 00119 TERMINAL_PRINTF("| =?+===+==+I======== | \r\n"); 00120 TERMINAL_PRINTF("| ..++======~~~~========? | \r\n"); 00121 TERMINAL_PRINTF("| .$?I??+=~~===~~~===~===++. | \r\n"); 00122 TERMINAL_PRINTF("| .+==.+=~~~=~==~~~~==~~=~==+? | \r\n"); 00123 TERMINAL_PRINTF("| ?===I+====~~=~~~=~~=====~~~=?. | \r\n"); 00124 TERMINAL_PRINTF("| .=~~~+==~==..~~~~~~= ~~~~=7= | \r\n"); 00125 TERMINAL_PRINTF("| +=~~?+~~=. ==~~~~=. ~~~~=?. | \r\n"); 00126 TERMINAL_PRINTF("| =~~~=~~~ ?===~~+. ~~~~+ | \r\n"); 00127 TERMINAL_PRINTF("| +~~:+~~= =~~==. =~~+. | \r\n"); 00128 TERMINAL_PRINTF("| ~:~ =~~= =~~~= ~=== | \r\n"); 00129 TERMINAL_PRINTF("| I=~~ ,=~~= ,. | \r\n"); 00130 TERMINAL_PRINTF("| ~~. ,==== | \r\n"); 00131 TERMINAL_PRINTF("| ==== | \r\n"); 00132 TERMINAL_PRINTF("| =~~. | \r\n"); 00133 TERMINAL_PRINTF("| |\r\n"); 00134 TERMINAL_PRINTF("|------------------------------------------|\r\n"); 00135 TERMINAL_PRINTF("| Internet Of Thing |\r\n"); 00136 TERMINAL_PRINTF("| Eli Hughes |\r\n"); 00137 TERMINAL_PRINTF("| Freescale / Hack-a-day Make-It-Challenge |\r\n"); 00138 TERMINAL_PRINTF("| FTF 2014 - Dallas, Tx |\r\n"); 00139 TERMINAL_PRINTF("|------------------------------------------|\r\n\r\n>"); 00140 } 00141 00142 void TFC_InitTerminal() 00143 { 00144 TerminalPos = 0; 00145 CmdFound = 0; 00146 00147 InitByteQueue(&TERMINAL_OUTPUT_QUEUE,TERMINAL_QUEUE_SIZE,&TERMINAL_OUTPUT_QUEUE_Storage[0]); 00148 InitByteQueue(&TERMINAL_INPUT_QUEUE,TERMINAL_QUEUE_SIZE,&TERMINAL_INPUT_QUEUE_Storage[0]); 00149 00150 00151 TerminalBootMsg(); 00152 } 00153 00154 void TerminalCmd_Help(char *arg) 00155 { 00156 uint8_t i; 00157 00158 TERMINAL_PRINTF("\r\n\r\nCommand List:\r\n"); 00159 TERMINAL_PRINTF("----------------------\r\n"); 00160 00161 for(i=0;i<NUM_TERMINAL_COMMANDS;i++) 00162 { 00163 TERMINAL_PRINTF("%s ----> %s\r\n",MyTerminalCallbackRecords[i].CommandString,MyTerminalCallbackRecords[i].HelpString); 00164 } 00165 00166 TERMINAL_PRINTF("\r\n\r\n"); 00167 } 00168 00169 00170 void TerminalCmd_Go(char *arg) 00171 { 00172 SPIN_CCW = 0; 00173 SPIN_CW = 0; 00174 GO_FORWARD = 1; 00175 GO_REVERSE = 0; 00176 00177 } 00178 00179 void TerminalCmd_Back(char *arg) 00180 { 00181 SPIN_CCW = 0; 00182 SPIN_CW = 0; 00183 GO_FORWARD = 0; 00184 GO_REVERSE = 1; 00185 00186 } 00187 00188 void TerminalCmd_SpinCW(char *arg) 00189 { 00190 SPIN_CCW = 0; 00191 SPIN_CW = 1; 00192 GO_FORWARD = 0; 00193 GO_REVERSE = 0; 00194 00195 } 00196 void TerminalCmd_SpinCCW(char *arg) 00197 { 00198 SPIN_CCW = 1; 00199 SPIN_CW = 0; 00200 GO_FORWARD = 0; 00201 GO_REVERSE = 0; 00202 } 00203 00204 void TerminalCmd_Stop(char *arg) 00205 { 00206 00207 SPIN_CCW = 0; 00208 SPIN_CW = 0; 00209 GO_FORWARD = 0; 00210 GO_REVERSE = 0; 00211 00212 } 00213 00214 00215 void TerminalCmd_Reboot(char *arg) 00216 { 00217 TerminalBootMsg(); 00218 } 00219 00220 00221 void TFC_ProcessTerminal() 00222 { 00223 uint8_t i,j; 00224 uint8_t ArgsFound; 00225 00226 if(TERMINAL_READABLE) 00227 { 00228 NextCharIn = TERMINAL_GETC; 00229 00230 switch(NextCharIn) 00231 { 00232 case '\r': 00233 00234 TerminalLineBuf[TerminalPos++] = 0x0; 00235 TERMINAL_PUTC(NextCharIn); 00236 00237 if(TerminalPos > 1) 00238 { 00239 //find the command 00240 i=0; 00241 while(TerminalLineBuf[i]>0x20 && TerminalLineBuf[i]<0x7f) 00242 { 00243 TerminalCmdBuf[i] = TerminalLineBuf[i]; 00244 i++; 00245 00246 if(i==MAX_TERMINAL_CMD_CHARS) 00247 { 00248 break; 00249 } 00250 } 00251 00252 TerminalCmdBuf[i] = 0; 00253 TerminalCmdBuf[i+1] = 0; 00254 00255 00256 ArgsFound = TRUE; 00257 memset(TerminalArgs,0x00,sizeof(TerminalArgs)); 00258 //scan for num terminator or next non whitespace 00259 while(TerminalLineBuf[i]<=0x20 && (i<MAX_TERMINAL_LINE_CHARS)) 00260 { 00261 if(TerminalLineBuf[i] == 0x00) 00262 { 00263 00264 //if we find a NULL terminator before a non whitespace character they flag for no arguments 00265 ArgsFound = FALSE; 00266 break; 00267 } 00268 i++; 00269 } 00270 00271 if(ArgsFound == TRUE) 00272 { 00273 strcpy(TerminalArgs,&TerminalLineBuf[i]); 00274 00275 //trim trailing whitespace 00276 i = sizeof(TerminalArgs)-1; 00277 00278 while((TerminalArgs[i]<0x21) && (i>0)) 00279 { 00280 TerminalArgs[i]= 0x00; 00281 i--; 00282 } 00283 } 00284 00285 CmdFound = FALSE; 00286 for(j=0;j<NUM_TERMINAL_COMMANDS;j++) 00287 { 00288 if(strcmp(TerminalCmdBuf,MyTerminalCallbackRecords[j].CommandString) == 0) 00289 { 00290 TERMINAL_PRINTF("\r\n"); 00291 if(MyTerminalCallbackRecords[j].Callback != NULL) 00292 MyTerminalCallbackRecords[j].Callback(TerminalArgs); 00293 00294 CmdFound = TRUE; 00295 break; 00296 } 00297 } 00298 if(CmdFound == FALSE) 00299 { 00300 TERMINAL_PRINTF("\r\n%s command not recognized.\r\n\r\n",TerminalCmdBuf); 00301 TerminalCmd_Help("no arg"); 00302 00303 } 00304 } 00305 TERMINAL_PRINTF("\r\n>"); 00306 TerminalPos = 0; 00307 00308 break; 00309 00310 case '\b': 00311 if(TerminalPos > 0) 00312 { 00313 TerminalPos--; 00314 TERMINAL_PUTC(NextCharIn); 00315 } 00316 break; 00317 00318 default: 00319 00320 if(TerminalPos == 0 && NextCharIn == 0x020) 00321 { 00322 //Do nothing if space bar is pressed at beginning of line 00323 } 00324 else if(NextCharIn >= 0x20 && NextCharIn<0x7F) 00325 { 00326 00327 if(TerminalPos < MAX_TERMINAL_LINE_CHARS-1) 00328 { 00329 TerminalLineBuf[TerminalPos++] = NextCharIn; 00330 TERMINAL_PUTC(NextCharIn); 00331 } 00332 } 00333 00334 break; 00335 00336 } 00337 } 00338 00339 } 00340
Generated on Tue Jul 19 2022 00:46:05 by
1.7.2