Eli Hughes
/
InternetOfThing
2014 Freescale / Hack A Day Make It Challenge FRDM-K64 Internet of "Thing"
Embed:
(wiki syntax)
Show/hide line numbers
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