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

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers Terminal.cpp Source File

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