aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDonald Delmar Davis <don@suspectdevices.com>2012-08-25 15:42:21 -0700
committerDonald Delmar Davis <don@suspectdevices.com>2012-08-25 15:42:21 -0700
commitfc0a62d69b15d3e31993e364359fa9ce1990b2e1 (patch)
tree0b2d49c39eee3c25854b7a90b05c3b5f5cf09212
parent640ae654041d1a448540aff18a3dc91ee51b2331 (diff)
try again
-rw-r--r--simplemon/Monitor.cpp213
-rw-r--r--simplemon/Monitor.h131
-rw-r--r--simplemon/simplemon.pde203
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;
+
+}