HIT Project #3 https://community.freescale.com/docs/DOC-99621
Dependencies: EthernetInterface WebSocketClient mbed-rtos mbed
MonkeyDo!
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
GLUE/Terminal.cpp@1:d87a428e88ee, 2014-07-17 (annotated)
- 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?
User | Revision | Line number | New 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 |