HIT Project #3 https://community.freescale.com/docs/DOC-99621

Dependencies:   EthernetInterface WebSocketClient mbed-rtos mbed

MonkeyDo!

/media/uploads/emh203/monkey-20plug2.png

These are the demo files for Freescale HIT project #3: Monkey Do. It uses a FRDM-AUTO + a FRDM-K64F to demo websockets for a simple IoT application.

See the main MonkeyDo page for all of the schematics, videos, GitHub links, etc for everything else!

https://community.freescale.com/docs/DOC-99621

Committer:
emh203
Date:
Thu Jul 17 00:18:36 2014 +0000
Revision:
1:d87a428e88ee
Parent:
0:29f58b9daa2c
Version for 1st project release

Who changed what in which revision?

UserRevisionLine numberNew contents of line
emh203 0:29f58b9daa2c 1
emh203 0:29f58b9daa2c 2 #include "Terminal.h"
emh203 0:29f58b9daa2c 3 #include "Types.h"
emh203 0:29f58b9daa2c 4 #include "Queue.h"
emh203 0:29f58b9daa2c 5 #include <string.h>
emh203 0:29f58b9daa2c 6 #include <stdint.h>
emh203 0:29f58b9daa2c 7
emh203 0:29f58b9daa2c 8
emh203 0:29f58b9daa2c 9 //*****************************************************************
emh203 0:29f58b9daa2c 10 //Terminal Configuration
emh203 0:29f58b9daa2c 11 //*****************************************************************
emh203 0:29f58b9daa2c 12
emh203 0:29f58b9daa2c 13 #define MAX_TERMINAL_LINE_CHARS 64
emh203 0:29f58b9daa2c 14 #define MAX_TERMINAL_CMD_CHARS 32
emh203 0:29f58b9daa2c 15
emh203 0:29f58b9daa2c 16 ByteQueue TERMINAL_OUTPUT_QUEUE;
emh203 0:29f58b9daa2c 17 ByteQueue TERMINAL_INPUT_QUEUE;
emh203 0:29f58b9daa2c 18
emh203 0:29f58b9daa2c 19 #define TERMINAL_QUEUE_SIZE 512
emh203 0:29f58b9daa2c 20
emh203 0:29f58b9daa2c 21 uint8_t TERMINAL_OUTPUT_QUEUE_Storage[TERMINAL_QUEUE_SIZE];
emh203 0:29f58b9daa2c 22 uint8_t TERMINAL_INPUT_QUEUE_Storage[TERMINAL_QUEUE_SIZE];
emh203 0:29f58b9daa2c 23
emh203 0:29f58b9daa2c 24
emh203 0:29f58b9daa2c 25
emh203 0:29f58b9daa2c 26 //Terminal Prototypes Here!
emh203 0:29f58b9daa2c 27 void TerminalCmd_Help(char *arg);
emh203 0:29f58b9daa2c 28 void TerminalCmd_ssr(char *arg);
emh203 0:29f58b9daa2c 29
emh203 0:29f58b9daa2c 30 //Populate this array with the callback functions and their terminal command string
emh203 0:29f58b9daa2c 31 TerminalCallbackRecord MyTerminalCallbackRecords[] ={ {"help",TerminalCmd_Help,"Lists available commands"},
emh203 0:29f58b9daa2c 32 {"ssr",TerminalCmd_ssr,"Enables /disables an ssr"}
emh203 0:29f58b9daa2c 33
emh203 0:29f58b9daa2c 34 };
emh203 0:29f58b9daa2c 35
emh203 0:29f58b9daa2c 36
emh203 0:29f58b9daa2c 37 #define NUM_TERMINAL_COMMANDS (sizeof(MyTerminalCallbackRecords)/sizeof(TerminalCallbackRecord))
emh203 0:29f58b9daa2c 38
emh203 0:29f58b9daa2c 39
emh203 0:29f58b9daa2c 40 //Terminal Callback Implementation Here!
emh203 0:29f58b9daa2c 41
emh203 0:29f58b9daa2c 42 void TerminalCmd_Help(char *arg)
emh203 0:29f58b9daa2c 43 {
emh203 0:29f58b9daa2c 44 uint8_t i;
emh203 0:29f58b9daa2c 45
emh203 0:29f58b9daa2c 46 TERMINAL_PRINTF("\r\n\r\nCommand List:\r\n");
emh203 0:29f58b9daa2c 47 TERMINAL_PRINTF("----------------------\r\n");
emh203 0:29f58b9daa2c 48
emh203 0:29f58b9daa2c 49 for(i=0;i<NUM_TERMINAL_COMMANDS;i++)
emh203 0:29f58b9daa2c 50 {
emh203 0:29f58b9daa2c 51 TERMINAL_PRINTF("%s ----> %s\r\n",MyTerminalCallbackRecords[i].CommandString,MyTerminalCallbackRecords[i].HelpString);
emh203 0:29f58b9daa2c 52 }
emh203 0:29f58b9daa2c 53
emh203 0:29f58b9daa2c 54 TERMINAL_PRINTF("\r\n\r\n");
emh203 0:29f58b9daa2c 55 }
emh203 0:29f58b9daa2c 56
emh203 0:29f58b9daa2c 57 void TerminalCmd_ssr(char *arg)
emh203 0:29f58b9daa2c 58 {
emh203 0:29f58b9daa2c 59 uint32_t Items;
emh203 0:29f58b9daa2c 60 uint32_t RelayIndex;
emh203 0:29f58b9daa2c 61 uint32_t RelayState;
emh203 0:29f58b9daa2c 62 Items = sscanf(arg,"%d %d",&RelayIndex,&RelayState);
emh203 0:29f58b9daa2c 63
emh203 0:29f58b9daa2c 64 if(Items!=2)
emh203 0:29f58b9daa2c 65 {
emh203 0:29f58b9daa2c 66 TERMINAL_PRINTF("\r\nssr requires 2 arguments:\r\n");
emh203 0:29f58b9daa2c 67 TERMINAL_PRINTF("1st: Relay Index Valid values are 0 (high current) and 1 (low current)\r\n");
emh203 0:29f58b9daa2c 68 TERMINAL_PRINTF("2nd: Relay State 0 == off 1 == on anything else == off\r\n");
emh203 0:29f58b9daa2c 69 }
emh203 0:29f58b9daa2c 70 else
emh203 0:29f58b9daa2c 71 {
emh203 0:29f58b9daa2c 72 if(RelayIndex >1)
emh203 0:29f58b9daa2c 73 RelayIndex = 1;
emh203 0:29f58b9daa2c 74
emh203 0:29f58b9daa2c 75 if(RelayState > 1)
emh203 0:29f58b9daa2c 76 RelayState = 0;
emh203 0:29f58b9daa2c 77
emh203 0:29f58b9daa2c 78 TERMINAL_PRINTF("Setting ssr %d to state of %d",RelayIndex,RelayState);
emh203 0:29f58b9daa2c 79
emh203 0:29f58b9daa2c 80 if(RelayIndex == 0)
emh203 0:29f58b9daa2c 81 {
emh203 0:29f58b9daa2c 82 if(RelayState == 0 )
emh203 0:29f58b9daa2c 83 {
emh203 0:29f58b9daa2c 84 DISABLE_HIGH_CURRENT_RELAY ;
emh203 0:29f58b9daa2c 85 }
emh203 0:29f58b9daa2c 86 else
emh203 0:29f58b9daa2c 87 {
emh203 0:29f58b9daa2c 88 ENABLE_HIGH_CURRENT_RELAY;
emh203 0:29f58b9daa2c 89 }
emh203 0:29f58b9daa2c 90 }
emh203 0:29f58b9daa2c 91 else
emh203 0:29f58b9daa2c 92 {
emh203 0:29f58b9daa2c 93 if(RelayState == 0 )
emh203 0:29f58b9daa2c 94 {
emh203 0:29f58b9daa2c 95 DISABLE_LOW_CURRENT_RELAY;
emh203 0:29f58b9daa2c 96 }
emh203 0:29f58b9daa2c 97 else
emh203 0:29f58b9daa2c 98 {
emh203 0:29f58b9daa2c 99 ENABLE_LOW_CURRENT_RELAY;
emh203 0:29f58b9daa2c 100 }
emh203 0:29f58b9daa2c 101 }
emh203 0:29f58b9daa2c 102
emh203 0:29f58b9daa2c 103
emh203 0:29f58b9daa2c 104 }
emh203 0:29f58b9daa2c 105 }
emh203 0:29f58b9daa2c 106
emh203 0:29f58b9daa2c 107
emh203 0:29f58b9daa2c 108
emh203 0:29f58b9daa2c 109
emh203 0:29f58b9daa2c 110 //*****************************************************************
emh203 0:29f58b9daa2c 111 //Plumbing.....
emh203 0:29f58b9daa2c 112 //*****************************************************************
emh203 0:29f58b9daa2c 113
emh203 0:29f58b9daa2c 114
emh203 0:29f58b9daa2c 115
emh203 0:29f58b9daa2c 116 char TerminalLineBuf[MAX_TERMINAL_LINE_CHARS];
emh203 0:29f58b9daa2c 117 uint8_t TerminalPos;
emh203 0:29f58b9daa2c 118 char TerminalCmdBuf[MAX_TERMINAL_CMD_CHARS+1];
emh203 0:29f58b9daa2c 119 char TerminalArgs[MAX_TERMINAL_LINE_CHARS-MAX_TERMINAL_CMD_CHARS];
emh203 0:29f58b9daa2c 120 uint8_t NextCharIn;
emh203 0:29f58b9daa2c 121 uint8_t CmdFound;
emh203 0:29f58b9daa2c 122
emh203 0:29f58b9daa2c 123 void TerminalBootMsg()
emh203 0:29f58b9daa2c 124 {
emh203 0:29f58b9daa2c 125 // TERMINAL_PRINTF("\r\n\r\nMonkey Do!\r\n");
emh203 0:29f58b9daa2c 126 }
emh203 0:29f58b9daa2c 127
emh203 0:29f58b9daa2c 128 void InitTerminal()
emh203 0:29f58b9daa2c 129 {
emh203 0:29f58b9daa2c 130 TerminalPos = 0;
emh203 0:29f58b9daa2c 131 CmdFound = 0;
emh203 0:29f58b9daa2c 132
emh203 0:29f58b9daa2c 133 InitByteQueue(&TERMINAL_OUTPUT_QUEUE,TERMINAL_QUEUE_SIZE,&TERMINAL_OUTPUT_QUEUE_Storage[0]);
emh203 0:29f58b9daa2c 134 InitByteQueue(&TERMINAL_INPUT_QUEUE,TERMINAL_QUEUE_SIZE,&TERMINAL_INPUT_QUEUE_Storage[0]);
emh203 0:29f58b9daa2c 135
emh203 0:29f58b9daa2c 136
emh203 0:29f58b9daa2c 137 // TerminalBootMsg();
emh203 0:29f58b9daa2c 138 }
emh203 0:29f58b9daa2c 139
emh203 0:29f58b9daa2c 140
emh203 0:29f58b9daa2c 141
emh203 0:29f58b9daa2c 142 void ProcessTerminal()
emh203 0:29f58b9daa2c 143 {
emh203 0:29f58b9daa2c 144 uint8_t i,j;
emh203 0:29f58b9daa2c 145 uint8_t ArgsFound;
emh203 0:29f58b9daa2c 146
emh203 0:29f58b9daa2c 147 if(TERMINAL_READABLE)
emh203 0:29f58b9daa2c 148 {
emh203 0:29f58b9daa2c 149 NextCharIn = TERMINAL_GETC;
emh203 0:29f58b9daa2c 150
emh203 0:29f58b9daa2c 151 switch(NextCharIn)
emh203 0:29f58b9daa2c 152 {
emh203 0:29f58b9daa2c 153 case '\r':
emh203 0:29f58b9daa2c 154
emh203 0:29f58b9daa2c 155 TerminalLineBuf[TerminalPos++] = 0x0;
emh203 0:29f58b9daa2c 156 TERMINAL_PUTC(NextCharIn);
emh203 0:29f58b9daa2c 157
emh203 0:29f58b9daa2c 158 if(TerminalPos > 1)
emh203 0:29f58b9daa2c 159 {
emh203 0:29f58b9daa2c 160 //find the command
emh203 0:29f58b9daa2c 161 i=0;
emh203 0:29f58b9daa2c 162 while(TerminalLineBuf[i]>0x20 && TerminalLineBuf[i]<0x7f)
emh203 0:29f58b9daa2c 163 {
emh203 0:29f58b9daa2c 164 TerminalCmdBuf[i] = TerminalLineBuf[i];
emh203 0:29f58b9daa2c 165 i++;
emh203 0:29f58b9daa2c 166
emh203 0:29f58b9daa2c 167 if(i==MAX_TERMINAL_CMD_CHARS)
emh203 0:29f58b9daa2c 168 {
emh203 0:29f58b9daa2c 169 break;
emh203 0:29f58b9daa2c 170 }
emh203 0:29f58b9daa2c 171 }
emh203 0:29f58b9daa2c 172
emh203 0:29f58b9daa2c 173 TerminalCmdBuf[i] = 0;
emh203 0:29f58b9daa2c 174 TerminalCmdBuf[i+1] = 0;
emh203 0:29f58b9daa2c 175
emh203 0:29f58b9daa2c 176
emh203 0:29f58b9daa2c 177 ArgsFound = TRUE;
emh203 0:29f58b9daa2c 178 memset(TerminalArgs,0x00,sizeof(TerminalArgs));
emh203 0:29f58b9daa2c 179 //scan for num terminator or next non whitespace
emh203 0:29f58b9daa2c 180 while(TerminalLineBuf[i]<=0x20 && (i<MAX_TERMINAL_LINE_CHARS))
emh203 0:29f58b9daa2c 181 {
emh203 0:29f58b9daa2c 182 if(TerminalLineBuf[i] == 0x00)
emh203 0:29f58b9daa2c 183 {
emh203 0:29f58b9daa2c 184
emh203 0:29f58b9daa2c 185 //if we find a NULL terminator before a non whitespace character they flag for no arguments
emh203 0:29f58b9daa2c 186 ArgsFound = FALSE;
emh203 0:29f58b9daa2c 187 break;
emh203 0:29f58b9daa2c 188 }
emh203 0:29f58b9daa2c 189 i++;
emh203 0:29f58b9daa2c 190 }
emh203 0:29f58b9daa2c 191
emh203 0:29f58b9daa2c 192 if(ArgsFound == TRUE)
emh203 0:29f58b9daa2c 193 {
emh203 0:29f58b9daa2c 194 strcpy(TerminalArgs,&TerminalLineBuf[i]);
emh203 0:29f58b9daa2c 195
emh203 0:29f58b9daa2c 196 //trim trailing whitespace
emh203 0:29f58b9daa2c 197 i = sizeof(TerminalArgs)-1;
emh203 0:29f58b9daa2c 198
emh203 0:29f58b9daa2c 199 while((TerminalArgs[i]<0x21) && (i>0))
emh203 0:29f58b9daa2c 200 {
emh203 0:29f58b9daa2c 201 TerminalArgs[i]= 0x00;
emh203 0:29f58b9daa2c 202 i--;
emh203 0:29f58b9daa2c 203 }
emh203 0:29f58b9daa2c 204 }
emh203 0:29f58b9daa2c 205
emh203 0:29f58b9daa2c 206 CmdFound = FALSE;
emh203 0:29f58b9daa2c 207 for(j=0;j<NUM_TERMINAL_COMMANDS;j++)
emh203 0:29f58b9daa2c 208 {
emh203 0:29f58b9daa2c 209 if(strcmp(TerminalCmdBuf,MyTerminalCallbackRecords[j].CommandString) == 0)
emh203 0:29f58b9daa2c 210 {
emh203 0:29f58b9daa2c 211 TERMINAL_PRINTF("\r\n");
emh203 0:29f58b9daa2c 212 if(MyTerminalCallbackRecords[j].Callback != NULL)
emh203 0:29f58b9daa2c 213 MyTerminalCallbackRecords[j].Callback(TerminalArgs);
emh203 0:29f58b9daa2c 214
emh203 0:29f58b9daa2c 215 CmdFound = TRUE;
emh203 0:29f58b9daa2c 216 break;
emh203 0:29f58b9daa2c 217 }
emh203 0:29f58b9daa2c 218 }
emh203 0:29f58b9daa2c 219 if(CmdFound == FALSE)
emh203 0:29f58b9daa2c 220 {
emh203 0:29f58b9daa2c 221 TERMINAL_PRINTF("\r\n%s command not recognized.\r\n\r\n",TerminalCmdBuf);
emh203 0:29f58b9daa2c 222
emh203 0:29f58b9daa2c 223 }
emh203 0:29f58b9daa2c 224 }
emh203 0:29f58b9daa2c 225 TERMINAL_PRINTF("\r\n>");
emh203 0:29f58b9daa2c 226 TerminalPos = 0;
emh203 0:29f58b9daa2c 227
emh203 0:29f58b9daa2c 228 break;
emh203 0:29f58b9daa2c 229
emh203 0:29f58b9daa2c 230 case '\b':
emh203 0:29f58b9daa2c 231 if(TerminalPos > 0)
emh203 0:29f58b9daa2c 232 {
emh203 0:29f58b9daa2c 233 TerminalPos--;
emh203 0:29f58b9daa2c 234 TERMINAL_PUTC(NextCharIn);
emh203 0:29f58b9daa2c 235 }
emh203 0:29f58b9daa2c 236 break;
emh203 0:29f58b9daa2c 237
emh203 0:29f58b9daa2c 238 default:
emh203 0:29f58b9daa2c 239
emh203 0:29f58b9daa2c 240 if(TerminalPos == 0 && NextCharIn == 0x020)
emh203 0:29f58b9daa2c 241 {
emh203 0:29f58b9daa2c 242 //Do nothing if space bar is pressed at beginning of line
emh203 0:29f58b9daa2c 243 }
emh203 0:29f58b9daa2c 244 else if(NextCharIn >= 0x20 && NextCharIn<0x7F)
emh203 0:29f58b9daa2c 245 {
emh203 0:29f58b9daa2c 246
emh203 0:29f58b9daa2c 247 if(TerminalPos < MAX_TERMINAL_LINE_CHARS-1)
emh203 0:29f58b9daa2c 248 {
emh203 0:29f58b9daa2c 249 TerminalLineBuf[TerminalPos++] = NextCharIn;
emh203 0:29f58b9daa2c 250 TERMINAL_PUTC(NextCharIn);
emh203 0:29f58b9daa2c 251 }
emh203 0:29f58b9daa2c 252 }
emh203 0:29f58b9daa2c 253
emh203 0:29f58b9daa2c 254 break;
emh203 0:29f58b9daa2c 255
emh203 0:29f58b9daa2c 256 }
emh203 0:29f58b9daa2c 257 }
emh203 0:29f58b9daa2c 258
emh203 0:29f58b9daa2c 259 }
emh203 0:29f58b9daa2c 260
emh203 0:29f58b9daa2c 261