diff options
| author | Donald Delmar Davis <don@suspectdevices.com> | 2012-08-25 15:42:21 -0700 |
|---|---|---|
| committer | Donald Delmar Davis <don@suspectdevices.com> | 2012-08-25 15:42:21 -0700 |
| commit | fc0a62d69b15d3e31993e364359fa9ce1990b2e1 (patch) | |
| tree | 0b2d49c39eee3c25854b7a90b05c3b5f5cf09212 | |
| parent | 640ae654041d1a448540aff18a3dc91ee51b2331 (diff) | |
try again
| -rw-r--r-- | simplemon/Monitor.cpp | 213 | ||||
| -rw-r--r-- | simplemon/Monitor.h | 131 | ||||
| -rw-r--r-- | simplemon/simplemon.pde | 203 |
3 files changed, 547 insertions, 0 deletions
diff --git a/simplemon/Monitor.cpp b/simplemon/Monitor.cpp new file mode 100644 index 0000000..8798579 --- /dev/null +++ b/simplemon/Monitor.cpp @@ -0,0 +1,213 @@ +/*--------------------------------------------------------------------Monitor.c + * + * Description and docs... are in Monitor.h + * + * Copyright (c) 2012, Donald Delmar Davis, Suspect Devices + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Suspect Devices nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + *-----------------------------------------------------------------------------*/ + +#include "Monitor.h" + +const char *keywords = KEYWORDS; + +char actionBuffer[MAX_COMMAND_LINE_LENGTH]; //return buffer for console actions allocate this once use it often. +const char *theNak="NAK:"; + +cmdBuffer deviceComm; +cmdBuffer consoleComm; + +char keyBuff[4]; //fix this. + +void registerAction(uint8_t ndx, actionptr action){ + if (ndx >=0 && ndx<NKEYWORDS) { + actions[ndx]=action; + } +} +#ifndef toupper +#define toupper((c)) (c) +#endif + +int lookupIndex(unsigned char *key) { + int ndx=0; + int ptr=0; + while (ndx<NKEYWORDS) { + if ((keywords[ptr]==toupper(key[0])) + && (keywords[ptr+1]==toupper(key[1])) + && (keywords[ptr+2]==toupper(key[2])) + ) { return ndx; + } else { + ndx++; + ptr+=3; + } + } + return -1; +} + +char * lookupKey(int ndx, char *keyBuff) { + int ptr=0; + keyBuff[0]=keyBuff[1]=keyBuff[2]='?'; + if (ndx >=0 && ndx<NKEYWORDS) { + ptr=ndx*3; + keyBuff[0]=keywords[ptr]; + keyBuff[1]=keywords[ptr+1]; + keyBuff[2]=keywords[ptr+2]; + keyBuff[3]='\0'; + } + + return keyBuff; +} + +void toDevice(char *buff){ + usart_tx(USART1, (uint8_t *)buff, strlen(buff)); + usart_tx(USART1, (uint8_t *)"\r\n", 2); + ; +} + +void toConsole(const char *format, ...){ + va_list args; + va_start( args, format ); + //int sdoPrintf(char *out, const char *format, ...) + //siprintf(actionBuffer, format, args ); + vsnprintf(actionBuffer, format, args ); + if(SerialUSB.isConnected() && (SerialUSB.getDTR() || SerialUSB.getRTS())) { + SerialUSB.write(actionBuffer); + SerialUSB.write("\r\n"); + } +} + +uint8_t NOPaction(uint8_t source) { + if (source==CONSOLE) { + toConsole("DBG: Forwarding (%c%c%c)!", + consoleComm.line[0], consoleComm.line[1], consoleComm.line[2]); + toConsole(actionBuffer); + toDevice((char *)consoleComm.line); + + return COMMAND_FORWARDED; + } + else { + return COMMAND_IGNORED; + } +} +uint8_t ACKaction (uint8_t source) { + if (source==CONSOLE) { + toConsole("ACK:"); + return COMMAND_OK; + } else { + toDevice("ACK:"); + return COMMAND_OK; + } +} + +uint8_t NAKaction (uint8_t source) { + if (source==CONSOLE) { + toConsole("NAK:"); + return COMMAND_OK; + } else { + toDevice("NAK:"); + return COMMAND_OK; + } +} + +uint8_t LSVaction (uint8_t source) { + if (source==CONSOLE) { + toConsole("LSV:%s",BOM_VERSION); + return COMMAND_OK; + } else { + toDevice("NAK:"); + return COMMAND_IGNORED; + } +} + +extern char _lm_heap_end; +extern char _lm_heap_start; +extern caddr_t _sbrk(int incr); //this doesnt resolve. + +int getFreeMemory() // none of this works. +{ static int freeMemory; + //if (freeMemory-(int)((caddr_t)&_lm_heap_end) - (int)((caddr_t)&_lm_heap_start)) { SerialUSB.write("!");} + //freeMemory=(int)((caddr_t)&_lm_heap_end) - (int)((caddr_t)&_lm_heap_start); + freeMemory=(int)((caddr_t)&_lm_heap_end) - (int)(&freeMemory); + return freeMemory; +} + + +uint8_t MEMaction (uint8_t source) { + if (consoleComm.verb=='?') { + int memory; + memory=getFreeMemory(); + toConsole(actionBuffer,"MEM:%d",memory);; + return COMMAND_OK; + } else { + toConsole("NAK:"); + return COMMAND_ERROR; + } + +} + +actionptr actions[NKEYWORDS] = { + &ACKaction, //SYN [! ] sync (hello) + &ACKaction, //ACK [ : ] acknowlege (yes) + &NAKaction, //NAK [ : ] negative ack (no) + &NOPaction, //SWV [ :?] Software Version + &NOPaction, //HWV [ :?] Hardware Version + &MEMaction, //MEM [ :?] Avaliable Memory + &NOPaction, //DID [ ] + &NOPaction, //LVB [ ] + &LSVaction, //LSV [ ] logger software version. +}; + +struct tm theTime; + +void parseLine(cmdBuffer *buff) { + // should check for more than 4 characters + buff->args=buff->line+4; + buff->verb=buff->line[3]; + //buff->line[3]='\0'; // dont need this since lookupindex uses tcharacters + + buff->kwIndex=lookupIndex(buff->line); +} + +int handleDeviceInput(cmdBuffer * cmd) { + int retval; + parseLine(cmd); + if ((cmd->kwIndex)>0) { + retval=actions[cmd->kwIndex](DEVICE); + } + cmd->gotline=false; + cmd->len=0; + return retval; +} + +int handleConsoleInput(cmdBuffer * cmd) { + int retval; + parseLine(cmd); + if ((cmd->kwIndex) >=0 ) { + retval=actions[cmd->kwIndex](CONSOLE); + } + cmd->gotline=false; + cmd->len=0; + return retval; +} diff --git a/simplemon/Monitor.h b/simplemon/Monitor.h new file mode 100644 index 0000000..5915c47 --- /dev/null +++ b/simplemon/Monitor.h @@ -0,0 +1,131 @@ + +/*------------------------------------------------------------------------Monitor.h + * + * The pourpose of the monitor is to interpret and dispatch data The idea is to + * try to set up a relatively flexible interpreter for data coming in from the + * serial port and also commands coming from the usb port. Using a jump table which + * is populated by other modules who register the action to be taken. + * + * ------------------------------------------- current vocabulary. + * Deal with multi line data. + * SOD[ :]Start of multiline data + * EOD[ :]End of multiline data + * SYN[? ]Say Hello + * SWV[? ]Software version + * + * all remaining items are sent to the monitored device + * + * Copyright (c) 2012, Donald Delmar Davis, Suspect Devices + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Suspect Devices nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + *-----------------------------------------------------------------------------*/ + +#ifndef __MONITOR_H__ +#define __MONITOR_H__ 1 +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +//#include <io.h> +//#include <signal.h> +#include <stdint.h> +#include <stdarg.h> +#include <wirish.h> +#include <usart.h> +#include <sys/stat.h> +#include <errno.h> +#include <sys/types.h> + +#define BOM_VERSION "BOM5K_"__DATE__ +//#define BOM_VERSION "BOM5K_GEN_"__DATE__ " "__TIME__ + +#define KEYWORDS \ +"SYN" "ACK" "NAK" "SWV" "LED" "NOP" + +enum keywordIndex { +_SYN_,_ACK_,_NAK_,_SWV_,_LED_,_NOP_ +}; + +// use enum to determine the size of the keyword arrays. +#define NKEYWORDS _NOP_ + 1 +#define MAX_COMMAND_LINE_LENGTH 104 + +/*-----------------------------------------------------------------DECLARATIONS + * + *----------------------------------------------------------------------------*/ + +#ifndef uint8_t +#ifndef uint8 +#define uint8 unsigned char +#define uint16 unsigned short int +#endif +#define uint8_t uint8 +#define uint16_t uint16 +//#define uint32_t uint32 +#endif + +extern const char *keywords; + +typedef uint8_t (actionfunc)(uint8_t source); +typedef uint8_t (*actionptr)(uint8_t source); + +extern actionptr actions[]; +extern char actionBuffer[MAX_COMMAND_LINE_LENGTH]; +//extern const char *theNak; + +typedef struct __cmdbuff { + unsigned char line[MAX_COMMAND_LINE_LENGTH]; + unsigned char * args; + unsigned char key[4]; //unused at present. + unsigned char verb; + int kwIndex; + bool gotline; + uint8_t len; +} cmdBuffer; + + +extern cmdBuffer deviceComm; +extern cmdBuffer consoleComm; + +enum sourceTypes { + CONSOLE, + DEVICE +}; +enum inputReturnValues { + COMMAND_ERROR=-1, + COMMAND_OK, + COMMAND_FORWARDED, + COMMAND_IGNORED +}; + +int get_free_memory(); +int lookupIndex(unsigned char *key); +char *lookupKey(int ndx, unsigned char *keyBuffer); +int handleDeviceInput(cmdBuffer *); +int handleConsoleInput(cmdBuffer *); +void toConsole(const char *format, ...); +void toDevice(const char *format, ...); +void registerAction(uint8_t, actionptr); +char *actBuff(const char *format, ...); +#endif diff --git a/simplemon/simplemon.pde b/simplemon/simplemon.pde new file mode 100644 index 0000000..a315c48 --- /dev/null +++ b/simplemon/simplemon.pde @@ -0,0 +1,203 @@ +/*-----------------------------------------------------------------simeplemon.pde + * This is a sample piece of code to discuss code + * + * the logger takes info from a monitored device (device) over serial and commands + * from a program or a user through a usb console. These commands are formatted + * in a mannor described in Monitor.cpp and Monitor.h + * + * Copyright (c) 2012, Donald Delmar Davis, Suspect Devices + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Suspect Devices nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + *-----------------------------------------------------------------------------*/ + +#ifndef uint8_t +#define uint8_t uint8 +#define uint16_t uint16 +//#define uint32_t uint32 +#endif + +#define ASCII_DELETE '\177' +#define ASCII_BACKSPACE '\010' + +/*---------------------------------------------------------------------TUNABLES + * + *----------------------------------------------------------------------------*/ +#define LED_ON LOW +#define LED_OFF HIGH + +#include "Monitor.h" + +/* Global Variables */ +/*-------------------------------------------------------------GLOBAL VARIABLES + * + *----------------------------------------------------------------------------*/ + +time_t epoch=0; + +#define MAX_SSN_LENGTH 16 +#define MAX_HWV_LENGTH 8 +#define MAX_SWV_LENGTH 24 +#define MAX_TIME_LENGTH 24 + +//stuff for the FUTURE!!!! +char deviceSSN[MAX_SSN_LENGTH]="00000000000"; +char deviceHWV[MAX_HWV_LENGTH]="0"; +char deviceSWV[MAX_SWV_LENGTH]="0.0-000000"; +time_t deviceLastContact=0L; +bool deviceIsConnected=false; + + +/*-----------------------------------------------------------------------Setup() + * + *----------------------------------------------------------------------------*/ + +void setup( void ) +{ + SerialUSB.begin(); + // Setup the LED to steady on + pinMode(BOARD_LED_PIN, OUTPUT); + digitalWrite(BOARD_LED_PIN, HIGH); + + // Setup the button as input + pinMode(BOARD_BUTTON_PIN, INPUT); + digitalWrite(BOARD_BUTTON_PIN, HIGH); + usart_init(USART1); + usart_set_baud_rate(USART1, USART_USE_PCLK, 9600); + usart_enable(USART1); + + deviceComm.len=0; + deviceComm.gotline=false; + consoleComm.len=0; + consoleComm.gotline=false; + + +} + +void loop( void ) +{ + int ret; + if (deviceComm.gotline){ + handleDeviceInput(&deviceComm); + } + if (consoleComm.gotline){ + ret=handleConsoleInput(&consoleComm); + if(ret==COMMAND_FORWARDED){ // if the device is not connected we should not wait + // if ((xSemaphoreTake(deviceComm.xGotLineSemaphore,DEVICE_RESPONSE_TIMEOUT) != pdTRUE) + // && deviceComm.gotline) { + // handleDeviceInput(&deviceComm); + // } else { + // toConsole("NAK:TIMEOUT"); + // } + + } + togglePin(GRN_LED); + } +} +/*--------------------------------------------------------------------vLedTask() + * stubb + *----------------------------------------------------------------------------*/ + +void dasBlinkin(void* pvParameters) +{ + } +// move these to monitor..... + +/*-----------------------------------------------------------------vSerialTask() + * + * Handle (usb/serial) from console and monitored device. + * The idea here is to handle the incoming characters as quickly as possible. + * All data coming from the console or the datalogger + * is delimited by <CR><LF>. Finding an end of line "gives" a semaphore. + * + * Eventually this should be moved down to the usart interupt handlers imho + * + * At 9600 baud this needs to be run at least every (uart buffer size * ms) + * to insure that the incoming data doesnt overrun the buffers. + * + */ +void handleSerial() +{ + togglePin(YEL_LED); + uint32_t rc=0; + unsigned char ch; + + if (!deviceComm.gotline) { + while (usart_data_available(USART1) + && deviceComm.len<(MAX_COMMAND_LINE_LENGTH-1)) { + ch=usart_getc(USART1); + + if (ch=='\r') { + deviceComm.gotline=true; + deviceComm.line[deviceComm.len]='\0'; + break; + } else if (ch!='\n') { + deviceComm.line[deviceComm.len++]=ch; + } + } + } + + if (!consoleComm.gotline) { + while(SerialUSB.isConnected() && SerialUSB.available() + && consoleComm.len<(MAX_COMMAND_LINE_LENGTH-1)) { + ch=SerialUSB.read(); + SerialUSB.write(ch); + if (ch=='\r') { + consoleComm.gotline=true; + consoleComm.line[consoleComm.len]='\0'; + break; + } else if ((ch==ASCII_DELETE) || (ch==ASCII_BACKSPACE)) { + if (consoleComm.len) consoleComm.len--; + } else if (ch!='\n') { + consoleComm.line[consoleComm.len++]=ch; + } + } + } +} +/*-------------------------------------------------------------------vMonitorTask() + * + * The monitor task waits for end of lines from the serial handler and dispatches it. + * + * + * + */ + +static void vMonitorTask(void* pvParameters) +{ +// Force init to be called *first*, i.e. before static object allocation. +// Otherwise, statically allocated objects that need libmaple may fail. +__attribute__((constructor)) void premain() { + init(); +} + +int main(void) { + setup(); + + while (true) { + loop(); + } + + return 0; + +} |
