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
- Committer:
- emh203
- Date:
- 2014-07-17
- Revision:
- 1:d87a428e88ee
- Parent:
- 0:29f58b9daa2c
File content as of revision 1:d87a428e88ee:
#include "Terminal.h" #include "Types.h" #include "Queue.h" #include <string.h> #include <stdint.h> //***************************************************************** //Terminal Configuration //***************************************************************** #define MAX_TERMINAL_LINE_CHARS 64 #define MAX_TERMINAL_CMD_CHARS 32 ByteQueue TERMINAL_OUTPUT_QUEUE; ByteQueue TERMINAL_INPUT_QUEUE; #define TERMINAL_QUEUE_SIZE 512 uint8_t TERMINAL_OUTPUT_QUEUE_Storage[TERMINAL_QUEUE_SIZE]; uint8_t TERMINAL_INPUT_QUEUE_Storage[TERMINAL_QUEUE_SIZE]; //Terminal Prototypes Here! void TerminalCmd_Help(char *arg); void TerminalCmd_ssr(char *arg); //Populate this array with the callback functions and their terminal command string TerminalCallbackRecord MyTerminalCallbackRecords[] ={ {"help",TerminalCmd_Help,"Lists available commands"}, {"ssr",TerminalCmd_ssr,"Enables /disables an ssr"} }; #define NUM_TERMINAL_COMMANDS (sizeof(MyTerminalCallbackRecords)/sizeof(TerminalCallbackRecord)) //Terminal Callback Implementation Here! void TerminalCmd_Help(char *arg) { uint8_t i; TERMINAL_PRINTF("\r\n\r\nCommand List:\r\n"); TERMINAL_PRINTF("----------------------\r\n"); for(i=0;i<NUM_TERMINAL_COMMANDS;i++) { TERMINAL_PRINTF("%s ----> %s\r\n",MyTerminalCallbackRecords[i].CommandString,MyTerminalCallbackRecords[i].HelpString); } TERMINAL_PRINTF("\r\n\r\n"); } void TerminalCmd_ssr(char *arg) { uint32_t Items; uint32_t RelayIndex; uint32_t RelayState; Items = sscanf(arg,"%d %d",&RelayIndex,&RelayState); if(Items!=2) { TERMINAL_PRINTF("\r\nssr requires 2 arguments:\r\n"); TERMINAL_PRINTF("1st: Relay Index Valid values are 0 (high current) and 1 (low current)\r\n"); TERMINAL_PRINTF("2nd: Relay State 0 == off 1 == on anything else == off\r\n"); } else { if(RelayIndex >1) RelayIndex = 1; if(RelayState > 1) RelayState = 0; TERMINAL_PRINTF("Setting ssr %d to state of %d",RelayIndex,RelayState); if(RelayIndex == 0) { if(RelayState == 0 ) { DISABLE_HIGH_CURRENT_RELAY ; } else { ENABLE_HIGH_CURRENT_RELAY; } } else { if(RelayState == 0 ) { DISABLE_LOW_CURRENT_RELAY; } else { ENABLE_LOW_CURRENT_RELAY; } } } } //***************************************************************** //Plumbing..... //***************************************************************** char TerminalLineBuf[MAX_TERMINAL_LINE_CHARS]; uint8_t TerminalPos; char TerminalCmdBuf[MAX_TERMINAL_CMD_CHARS+1]; char TerminalArgs[MAX_TERMINAL_LINE_CHARS-MAX_TERMINAL_CMD_CHARS]; uint8_t NextCharIn; uint8_t CmdFound; void TerminalBootMsg() { // TERMINAL_PRINTF("\r\n\r\nMonkey Do!\r\n"); } void InitTerminal() { TerminalPos = 0; CmdFound = 0; InitByteQueue(&TERMINAL_OUTPUT_QUEUE,TERMINAL_QUEUE_SIZE,&TERMINAL_OUTPUT_QUEUE_Storage[0]); InitByteQueue(&TERMINAL_INPUT_QUEUE,TERMINAL_QUEUE_SIZE,&TERMINAL_INPUT_QUEUE_Storage[0]); // TerminalBootMsg(); } void ProcessTerminal() { uint8_t i,j; uint8_t ArgsFound; if(TERMINAL_READABLE) { NextCharIn = TERMINAL_GETC; switch(NextCharIn) { case '\r': TerminalLineBuf[TerminalPos++] = 0x0; TERMINAL_PUTC(NextCharIn); if(TerminalPos > 1) { //find the command i=0; while(TerminalLineBuf[i]>0x20 && TerminalLineBuf[i]<0x7f) { TerminalCmdBuf[i] = TerminalLineBuf[i]; i++; if(i==MAX_TERMINAL_CMD_CHARS) { break; } } TerminalCmdBuf[i] = 0; TerminalCmdBuf[i+1] = 0; ArgsFound = TRUE; memset(TerminalArgs,0x00,sizeof(TerminalArgs)); //scan for num terminator or next non whitespace while(TerminalLineBuf[i]<=0x20 && (i<MAX_TERMINAL_LINE_CHARS)) { if(TerminalLineBuf[i] == 0x00) { //if we find a NULL terminator before a non whitespace character they flag for no arguments ArgsFound = FALSE; break; } i++; } if(ArgsFound == TRUE) { strcpy(TerminalArgs,&TerminalLineBuf[i]); //trim trailing whitespace i = sizeof(TerminalArgs)-1; while((TerminalArgs[i]<0x21) && (i>0)) { TerminalArgs[i]= 0x00; i--; } } CmdFound = FALSE; for(j=0;j<NUM_TERMINAL_COMMANDS;j++) { if(strcmp(TerminalCmdBuf,MyTerminalCallbackRecords[j].CommandString) == 0) { TERMINAL_PRINTF("\r\n"); if(MyTerminalCallbackRecords[j].Callback != NULL) MyTerminalCallbackRecords[j].Callback(TerminalArgs); CmdFound = TRUE; break; } } if(CmdFound == FALSE) { TERMINAL_PRINTF("\r\n%s command not recognized.\r\n\r\n",TerminalCmdBuf); } } TERMINAL_PRINTF("\r\n>"); TerminalPos = 0; break; case '\b': if(TerminalPos > 0) { TerminalPos--; TERMINAL_PUTC(NextCharIn); } break; default: if(TerminalPos == 0 && NextCharIn == 0x020) { //Do nothing if space bar is pressed at beginning of line } else if(NextCharIn >= 0x20 && NextCharIn<0x7F) { if(TerminalPos < MAX_TERMINAL_LINE_CHARS-1) { TerminalLineBuf[TerminalPos++] = NextCharIn; TERMINAL_PUTC(NextCharIn); } } break; } } }