2014 Freescale / Hack A Day Make It Challenge FRDM-K64 Internet of "Thing"

Dependencies:   mbed

Committer:
emh203
Date:
Thu Apr 10 21:14:23 2014 +0000
Revision:
0:423d5729e94e
1st add.  Used for final demo

Who changed what in which revision?

UserRevisionLine numberNew contents of line
emh203 0:423d5729e94e 1 /*
emh203 0:423d5729e94e 2
emh203 0:423d5729e94e 3 --------------------------------------------
emh203 0:423d5729e94e 4 | |
emh203 0:423d5729e94e 5 | .... |
emh203 0:423d5729e94e 6 | 7OO$?I78. |
emh203 0:423d5729e94e 7 | .?8++++7+II?D. |
emh203 0:423d5729e94e 8 | .?O++=I++II+?= |
emh203 0:423d5729e94e 9 | .IO++?7==I??$. |
emh203 0:423d5729e94e 10 | .8++=$===?+I$ |
emh203 0:423d5729e94e 11 | ?+++===+===+ |
emh203 0:423d5729e94e 12 | ???=+I++==+? |
emh203 0:423d5729e94e 13 | .??++====+==++ |
emh203 0:423d5729e94e 14 | ?+++==========~ |
emh203 0:423d5729e94e 15 | $+++==========+= |
emh203 0:423d5729e94e 16 | =?+===+==+I======== |
emh203 0:423d5729e94e 17 | ..++======~~~~========? |
emh203 0:423d5729e94e 18 | .$?I??+=~~===~~~===~===++. |
emh203 0:423d5729e94e 19 | .+==.+=~~~=~==~~~~==~~=~==+? |
emh203 0:423d5729e94e 20 | ?===I+====~~=~~~=~~=====~~~=?. |
emh203 0:423d5729e94e 21 | .=~~~+==~==..~~~~~~= ~~~~=7= |
emh203 0:423d5729e94e 22 | +=~~?+~~=. ==~~~~=. ~~~~=?. |
emh203 0:423d5729e94e 23 | =~~~=~~~ ?===~~+. ~~~~+ |
emh203 0:423d5729e94e 24 | +~~:+~~= =~~==. =~~+. |
emh203 0:423d5729e94e 25 | ~:~ =~~= =~~~= ~=== |
emh203 0:423d5729e94e 26 | I=~~ ,=~~= ,. |
emh203 0:423d5729e94e 27 | ~~. ,==== |
emh203 0:423d5729e94e 28 | ==== |
emh203 0:423d5729e94e 29 | =~~. |
emh203 0:423d5729e94e 30 | |
emh203 0:423d5729e94e 31 |------------------------------------------|
emh203 0:423d5729e94e 32 | Internet Of Thing |
emh203 0:423d5729e94e 33 | Eli Hughes |
emh203 0:423d5729e94e 34 | Freescale / Hack-a-day Make-It-Challenge |
emh203 0:423d5729e94e 35 | FTF 2014 - Dallas, Tx |
emh203 0:423d5729e94e 36 |------------------------------------------|
emh203 0:423d5729e94e 37
emh203 0:423d5729e94e 38 */
emh203 0:423d5729e94e 39 #include "Terminal.h"
emh203 0:423d5729e94e 40 #include "Types.h"
emh203 0:423d5729e94e 41 #include "Queue.h"
emh203 0:423d5729e94e 42 #include <string.h>
emh203 0:423d5729e94e 43 #include <stdint.h>
emh203 0:423d5729e94e 44 #include "System.h"
emh203 0:423d5729e94e 45
emh203 0:423d5729e94e 46 //*****************************************************************
emh203 0:423d5729e94e 47 //Terminal Configuration
emh203 0:423d5729e94e 48 //*****************************************************************
emh203 0:423d5729e94e 49
emh203 0:423d5729e94e 50 #define MAX_TERMINAL_LINE_CHARS 64
emh203 0:423d5729e94e 51 #define MAX_TERMINAL_CMD_CHARS 32
emh203 0:423d5729e94e 52
emh203 0:423d5729e94e 53 ByteQueue TERMINAL_OUTPUT_QUEUE;
emh203 0:423d5729e94e 54 ByteQueue TERMINAL_INPUT_QUEUE;
emh203 0:423d5729e94e 55
emh203 0:423d5729e94e 56 #define TERMINAL_QUEUE_SIZE 2048
emh203 0:423d5729e94e 57
emh203 0:423d5729e94e 58 uint8_t TERMINAL_OUTPUT_QUEUE_Storage[TERMINAL_QUEUE_SIZE];
emh203 0:423d5729e94e 59 uint8_t TERMINAL_INPUT_QUEUE_Storage[TERMINAL_QUEUE_SIZE];
emh203 0:423d5729e94e 60
emh203 0:423d5729e94e 61 typedef void (*TerminalCallback)(char *);
emh203 0:423d5729e94e 62
emh203 0:423d5729e94e 63
emh203 0:423d5729e94e 64 typedef struct
emh203 0:423d5729e94e 65 {
emh203 0:423d5729e94e 66 const char *CommandString;
emh203 0:423d5729e94e 67 TerminalCallback Callback;
emh203 0:423d5729e94e 68 const char *HelpString;
emh203 0:423d5729e94e 69
emh203 0:423d5729e94e 70 } TerminalCallbackRecord;
emh203 0:423d5729e94e 71
emh203 0:423d5729e94e 72 //Callback function prototypes
emh203 0:423d5729e94e 73 void TerminalCmd_Help(char *arg);
emh203 0:423d5729e94e 74 void TerminalCmd_Go(char *arg);
emh203 0:423d5729e94e 75 void TerminalCmd_SpinCW(char *arg);
emh203 0:423d5729e94e 76 void TerminalCmd_SpinCCW(char *arg);
emh203 0:423d5729e94e 77 void TerminalCmd_Stop(char *arg);
emh203 0:423d5729e94e 78
emh203 0:423d5729e94e 79 void TerminalCmd_Reboot(char *arg);
emh203 0:423d5729e94e 80 void TerminalCmd_Back(char *arg);
emh203 0:423d5729e94e 81
emh203 0:423d5729e94e 82 //Populate this array with the callback functions and their terminal command string
emh203 0:423d5729e94e 83 TerminalCallbackRecord MyTerminalCallbackRecords[] ={ {"help",TerminalCmd_Help,"Lists available commands"},
emh203 0:423d5729e94e 84 {"thing_go",TerminalCmd_Go," Tells the thing to go forward"},
emh203 0:423d5729e94e 85 {"thing_cw",TerminalCmd_SpinCW," Tells the thing to spin clock-wise"},
emh203 0:423d5729e94e 86 {"thing_ccw",TerminalCmd_SpinCCW," Tells the thing to spin counter clockwise"},
emh203 0:423d5729e94e 87 {"thing_stop",TerminalCmd_Stop,"Tells the thing to stop"},
emh203 0:423d5729e94e 88 {"thing_back",TerminalCmd_Back,"Tells the thing to go"},
emh203 0:423d5729e94e 89 };
emh203 0:423d5729e94e 90
emh203 0:423d5729e94e 91 //*****************************************************************
emh203 0:423d5729e94e 92 //Plumbing.....
emh203 0:423d5729e94e 93 //*****************************************************************
emh203 0:423d5729e94e 94
emh203 0:423d5729e94e 95 #define NUM_TERMINAL_COMMANDS (sizeof(MyTerminalCallbackRecords)/sizeof(TerminalCallbackRecord))
emh203 0:423d5729e94e 96
emh203 0:423d5729e94e 97 char TerminalLineBuf[MAX_TERMINAL_LINE_CHARS];
emh203 0:423d5729e94e 98 uint8_t TerminalPos;
emh203 0:423d5729e94e 99 char TerminalCmdBuf[MAX_TERMINAL_CMD_CHARS+1];
emh203 0:423d5729e94e 100 char TerminalArgs[MAX_TERMINAL_LINE_CHARS-MAX_TERMINAL_CMD_CHARS];
emh203 0:423d5729e94e 101 uint8_t NextCharIn;
emh203 0:423d5729e94e 102 uint8_t CmdFound;
emh203 0:423d5729e94e 103
emh203 0:423d5729e94e 104 void TerminalBootMsg()
emh203 0:423d5729e94e 105 {
emh203 0:423d5729e94e 106 TERMINAL_PRINTF("-------------------------------------------- \r\n");
emh203 0:423d5729e94e 107 TERMINAL_PRINTF("| |\r\n");
emh203 0:423d5729e94e 108 TERMINAL_PRINTF("| .... | \r\n");
emh203 0:423d5729e94e 109 TERMINAL_PRINTF("| 7OO$?I78. | \r\n");
emh203 0:423d5729e94e 110 TERMINAL_PRINTF("| .?8++++7+II?D. | \r\n");
emh203 0:423d5729e94e 111 TERMINAL_PRINTF("| .?O++=I++II+?= | \r\n");
emh203 0:423d5729e94e 112 TERMINAL_PRINTF("| .IO++?7==I??$. | \r\n");
emh203 0:423d5729e94e 113 TERMINAL_PRINTF("| .8++=$===?+I$ | \r\n");
emh203 0:423d5729e94e 114 TERMINAL_PRINTF("| ?+++===+===+ | \r\n");
emh203 0:423d5729e94e 115 TERMINAL_PRINTF("| ???=+I++==+? | \r\n");
emh203 0:423d5729e94e 116 TERMINAL_PRINTF("| .??++====+==++ | \r\n");
emh203 0:423d5729e94e 117 TERMINAL_PRINTF("| ?+++==========~ | \r\n");
emh203 0:423d5729e94e 118 TERMINAL_PRINTF("| $+++==========+= | \r\n");
emh203 0:423d5729e94e 119 TERMINAL_PRINTF("| =?+===+==+I======== | \r\n");
emh203 0:423d5729e94e 120 TERMINAL_PRINTF("| ..++======~~~~========? | \r\n");
emh203 0:423d5729e94e 121 TERMINAL_PRINTF("| .$?I??+=~~===~~~===~===++. | \r\n");
emh203 0:423d5729e94e 122 TERMINAL_PRINTF("| .+==.+=~~~=~==~~~~==~~=~==+? | \r\n");
emh203 0:423d5729e94e 123 TERMINAL_PRINTF("| ?===I+====~~=~~~=~~=====~~~=?. | \r\n");
emh203 0:423d5729e94e 124 TERMINAL_PRINTF("| .=~~~+==~==..~~~~~~= ~~~~=7= | \r\n");
emh203 0:423d5729e94e 125 TERMINAL_PRINTF("| +=~~?+~~=. ==~~~~=. ~~~~=?. | \r\n");
emh203 0:423d5729e94e 126 TERMINAL_PRINTF("| =~~~=~~~ ?===~~+. ~~~~+ | \r\n");
emh203 0:423d5729e94e 127 TERMINAL_PRINTF("| +~~:+~~= =~~==. =~~+. | \r\n");
emh203 0:423d5729e94e 128 TERMINAL_PRINTF("| ~:~ =~~= =~~~= ~=== | \r\n");
emh203 0:423d5729e94e 129 TERMINAL_PRINTF("| I=~~ ,=~~= ,. | \r\n");
emh203 0:423d5729e94e 130 TERMINAL_PRINTF("| ~~. ,==== | \r\n");
emh203 0:423d5729e94e 131 TERMINAL_PRINTF("| ==== | \r\n");
emh203 0:423d5729e94e 132 TERMINAL_PRINTF("| =~~. | \r\n");
emh203 0:423d5729e94e 133 TERMINAL_PRINTF("| |\r\n");
emh203 0:423d5729e94e 134 TERMINAL_PRINTF("|------------------------------------------|\r\n");
emh203 0:423d5729e94e 135 TERMINAL_PRINTF("| Internet Of Thing |\r\n");
emh203 0:423d5729e94e 136 TERMINAL_PRINTF("| Eli Hughes |\r\n");
emh203 0:423d5729e94e 137 TERMINAL_PRINTF("| Freescale / Hack-a-day Make-It-Challenge |\r\n");
emh203 0:423d5729e94e 138 TERMINAL_PRINTF("| FTF 2014 - Dallas, Tx |\r\n");
emh203 0:423d5729e94e 139 TERMINAL_PRINTF("|------------------------------------------|\r\n\r\n>");
emh203 0:423d5729e94e 140 }
emh203 0:423d5729e94e 141
emh203 0:423d5729e94e 142 void TFC_InitTerminal()
emh203 0:423d5729e94e 143 {
emh203 0:423d5729e94e 144 TerminalPos = 0;
emh203 0:423d5729e94e 145 CmdFound = 0;
emh203 0:423d5729e94e 146
emh203 0:423d5729e94e 147 InitByteQueue(&TERMINAL_OUTPUT_QUEUE,TERMINAL_QUEUE_SIZE,&TERMINAL_OUTPUT_QUEUE_Storage[0]);
emh203 0:423d5729e94e 148 InitByteQueue(&TERMINAL_INPUT_QUEUE,TERMINAL_QUEUE_SIZE,&TERMINAL_INPUT_QUEUE_Storage[0]);
emh203 0:423d5729e94e 149
emh203 0:423d5729e94e 150
emh203 0:423d5729e94e 151 TerminalBootMsg();
emh203 0:423d5729e94e 152 }
emh203 0:423d5729e94e 153
emh203 0:423d5729e94e 154 void TerminalCmd_Help(char *arg)
emh203 0:423d5729e94e 155 {
emh203 0:423d5729e94e 156 uint8_t i;
emh203 0:423d5729e94e 157
emh203 0:423d5729e94e 158 TERMINAL_PRINTF("\r\n\r\nCommand List:\r\n");
emh203 0:423d5729e94e 159 TERMINAL_PRINTF("----------------------\r\n");
emh203 0:423d5729e94e 160
emh203 0:423d5729e94e 161 for(i=0;i<NUM_TERMINAL_COMMANDS;i++)
emh203 0:423d5729e94e 162 {
emh203 0:423d5729e94e 163 TERMINAL_PRINTF("%s ----> %s\r\n",MyTerminalCallbackRecords[i].CommandString,MyTerminalCallbackRecords[i].HelpString);
emh203 0:423d5729e94e 164 }
emh203 0:423d5729e94e 165
emh203 0:423d5729e94e 166 TERMINAL_PRINTF("\r\n\r\n");
emh203 0:423d5729e94e 167 }
emh203 0:423d5729e94e 168
emh203 0:423d5729e94e 169
emh203 0:423d5729e94e 170 void TerminalCmd_Go(char *arg)
emh203 0:423d5729e94e 171 {
emh203 0:423d5729e94e 172 SPIN_CCW = 0;
emh203 0:423d5729e94e 173 SPIN_CW = 0;
emh203 0:423d5729e94e 174 GO_FORWARD = 1;
emh203 0:423d5729e94e 175 GO_REVERSE = 0;
emh203 0:423d5729e94e 176
emh203 0:423d5729e94e 177 }
emh203 0:423d5729e94e 178
emh203 0:423d5729e94e 179 void TerminalCmd_Back(char *arg)
emh203 0:423d5729e94e 180 {
emh203 0:423d5729e94e 181 SPIN_CCW = 0;
emh203 0:423d5729e94e 182 SPIN_CW = 0;
emh203 0:423d5729e94e 183 GO_FORWARD = 0;
emh203 0:423d5729e94e 184 GO_REVERSE = 1;
emh203 0:423d5729e94e 185
emh203 0:423d5729e94e 186 }
emh203 0:423d5729e94e 187
emh203 0:423d5729e94e 188 void TerminalCmd_SpinCW(char *arg)
emh203 0:423d5729e94e 189 {
emh203 0:423d5729e94e 190 SPIN_CCW = 0;
emh203 0:423d5729e94e 191 SPIN_CW = 1;
emh203 0:423d5729e94e 192 GO_FORWARD = 0;
emh203 0:423d5729e94e 193 GO_REVERSE = 0;
emh203 0:423d5729e94e 194
emh203 0:423d5729e94e 195 }
emh203 0:423d5729e94e 196 void TerminalCmd_SpinCCW(char *arg)
emh203 0:423d5729e94e 197 {
emh203 0:423d5729e94e 198 SPIN_CCW = 1;
emh203 0:423d5729e94e 199 SPIN_CW = 0;
emh203 0:423d5729e94e 200 GO_FORWARD = 0;
emh203 0:423d5729e94e 201 GO_REVERSE = 0;
emh203 0:423d5729e94e 202 }
emh203 0:423d5729e94e 203
emh203 0:423d5729e94e 204 void TerminalCmd_Stop(char *arg)
emh203 0:423d5729e94e 205 {
emh203 0:423d5729e94e 206
emh203 0:423d5729e94e 207 SPIN_CCW = 0;
emh203 0:423d5729e94e 208 SPIN_CW = 0;
emh203 0:423d5729e94e 209 GO_FORWARD = 0;
emh203 0:423d5729e94e 210 GO_REVERSE = 0;
emh203 0:423d5729e94e 211
emh203 0:423d5729e94e 212 }
emh203 0:423d5729e94e 213
emh203 0:423d5729e94e 214
emh203 0:423d5729e94e 215 void TerminalCmd_Reboot(char *arg)
emh203 0:423d5729e94e 216 {
emh203 0:423d5729e94e 217 TerminalBootMsg();
emh203 0:423d5729e94e 218 }
emh203 0:423d5729e94e 219
emh203 0:423d5729e94e 220
emh203 0:423d5729e94e 221 void TFC_ProcessTerminal()
emh203 0:423d5729e94e 222 {
emh203 0:423d5729e94e 223 uint8_t i,j;
emh203 0:423d5729e94e 224 uint8_t ArgsFound;
emh203 0:423d5729e94e 225
emh203 0:423d5729e94e 226 if(TERMINAL_READABLE)
emh203 0:423d5729e94e 227 {
emh203 0:423d5729e94e 228 NextCharIn = TERMINAL_GETC;
emh203 0:423d5729e94e 229
emh203 0:423d5729e94e 230 switch(NextCharIn)
emh203 0:423d5729e94e 231 {
emh203 0:423d5729e94e 232 case '\r':
emh203 0:423d5729e94e 233
emh203 0:423d5729e94e 234 TerminalLineBuf[TerminalPos++] = 0x0;
emh203 0:423d5729e94e 235 TERMINAL_PUTC(NextCharIn);
emh203 0:423d5729e94e 236
emh203 0:423d5729e94e 237 if(TerminalPos > 1)
emh203 0:423d5729e94e 238 {
emh203 0:423d5729e94e 239 //find the command
emh203 0:423d5729e94e 240 i=0;
emh203 0:423d5729e94e 241 while(TerminalLineBuf[i]>0x20 && TerminalLineBuf[i]<0x7f)
emh203 0:423d5729e94e 242 {
emh203 0:423d5729e94e 243 TerminalCmdBuf[i] = TerminalLineBuf[i];
emh203 0:423d5729e94e 244 i++;
emh203 0:423d5729e94e 245
emh203 0:423d5729e94e 246 if(i==MAX_TERMINAL_CMD_CHARS)
emh203 0:423d5729e94e 247 {
emh203 0:423d5729e94e 248 break;
emh203 0:423d5729e94e 249 }
emh203 0:423d5729e94e 250 }
emh203 0:423d5729e94e 251
emh203 0:423d5729e94e 252 TerminalCmdBuf[i] = 0;
emh203 0:423d5729e94e 253 TerminalCmdBuf[i+1] = 0;
emh203 0:423d5729e94e 254
emh203 0:423d5729e94e 255
emh203 0:423d5729e94e 256 ArgsFound = TRUE;
emh203 0:423d5729e94e 257 memset(TerminalArgs,0x00,sizeof(TerminalArgs));
emh203 0:423d5729e94e 258 //scan for num terminator or next non whitespace
emh203 0:423d5729e94e 259 while(TerminalLineBuf[i]<=0x20 && (i<MAX_TERMINAL_LINE_CHARS))
emh203 0:423d5729e94e 260 {
emh203 0:423d5729e94e 261 if(TerminalLineBuf[i] == 0x00)
emh203 0:423d5729e94e 262 {
emh203 0:423d5729e94e 263
emh203 0:423d5729e94e 264 //if we find a NULL terminator before a non whitespace character they flag for no arguments
emh203 0:423d5729e94e 265 ArgsFound = FALSE;
emh203 0:423d5729e94e 266 break;
emh203 0:423d5729e94e 267 }
emh203 0:423d5729e94e 268 i++;
emh203 0:423d5729e94e 269 }
emh203 0:423d5729e94e 270
emh203 0:423d5729e94e 271 if(ArgsFound == TRUE)
emh203 0:423d5729e94e 272 {
emh203 0:423d5729e94e 273 strcpy(TerminalArgs,&TerminalLineBuf[i]);
emh203 0:423d5729e94e 274
emh203 0:423d5729e94e 275 //trim trailing whitespace
emh203 0:423d5729e94e 276 i = sizeof(TerminalArgs)-1;
emh203 0:423d5729e94e 277
emh203 0:423d5729e94e 278 while((TerminalArgs[i]<0x21) && (i>0))
emh203 0:423d5729e94e 279 {
emh203 0:423d5729e94e 280 TerminalArgs[i]= 0x00;
emh203 0:423d5729e94e 281 i--;
emh203 0:423d5729e94e 282 }
emh203 0:423d5729e94e 283 }
emh203 0:423d5729e94e 284
emh203 0:423d5729e94e 285 CmdFound = FALSE;
emh203 0:423d5729e94e 286 for(j=0;j<NUM_TERMINAL_COMMANDS;j++)
emh203 0:423d5729e94e 287 {
emh203 0:423d5729e94e 288 if(strcmp(TerminalCmdBuf,MyTerminalCallbackRecords[j].CommandString) == 0)
emh203 0:423d5729e94e 289 {
emh203 0:423d5729e94e 290 TERMINAL_PRINTF("\r\n");
emh203 0:423d5729e94e 291 if(MyTerminalCallbackRecords[j].Callback != NULL)
emh203 0:423d5729e94e 292 MyTerminalCallbackRecords[j].Callback(TerminalArgs);
emh203 0:423d5729e94e 293
emh203 0:423d5729e94e 294 CmdFound = TRUE;
emh203 0:423d5729e94e 295 break;
emh203 0:423d5729e94e 296 }
emh203 0:423d5729e94e 297 }
emh203 0:423d5729e94e 298 if(CmdFound == FALSE)
emh203 0:423d5729e94e 299 {
emh203 0:423d5729e94e 300 TERMINAL_PRINTF("\r\n%s command not recognized.\r\n\r\n",TerminalCmdBuf);
emh203 0:423d5729e94e 301 TerminalCmd_Help("no arg");
emh203 0:423d5729e94e 302
emh203 0:423d5729e94e 303 }
emh203 0:423d5729e94e 304 }
emh203 0:423d5729e94e 305 TERMINAL_PRINTF("\r\n>");
emh203 0:423d5729e94e 306 TerminalPos = 0;
emh203 0:423d5729e94e 307
emh203 0:423d5729e94e 308 break;
emh203 0:423d5729e94e 309
emh203 0:423d5729e94e 310 case '\b':
emh203 0:423d5729e94e 311 if(TerminalPos > 0)
emh203 0:423d5729e94e 312 {
emh203 0:423d5729e94e 313 TerminalPos--;
emh203 0:423d5729e94e 314 TERMINAL_PUTC(NextCharIn);
emh203 0:423d5729e94e 315 }
emh203 0:423d5729e94e 316 break;
emh203 0:423d5729e94e 317
emh203 0:423d5729e94e 318 default:
emh203 0:423d5729e94e 319
emh203 0:423d5729e94e 320 if(TerminalPos == 0 && NextCharIn == 0x020)
emh203 0:423d5729e94e 321 {
emh203 0:423d5729e94e 322 //Do nothing if space bar is pressed at beginning of line
emh203 0:423d5729e94e 323 }
emh203 0:423d5729e94e 324 else if(NextCharIn >= 0x20 && NextCharIn<0x7F)
emh203 0:423d5729e94e 325 {
emh203 0:423d5729e94e 326
emh203 0:423d5729e94e 327 if(TerminalPos < MAX_TERMINAL_LINE_CHARS-1)
emh203 0:423d5729e94e 328 {
emh203 0:423d5729e94e 329 TerminalLineBuf[TerminalPos++] = NextCharIn;
emh203 0:423d5729e94e 330 TERMINAL_PUTC(NextCharIn);
emh203 0:423d5729e94e 331 }
emh203 0:423d5729e94e 332 }
emh203 0:423d5729e94e 333
emh203 0:423d5729e94e 334 break;
emh203 0:423d5729e94e 335
emh203 0:423d5729e94e 336 }
emh203 0:423d5729e94e 337 }
emh203 0:423d5729e94e 338
emh203 0:423d5729e94e 339 }
emh203 0:423d5729e94e 340