From de76c5f5ac6a0c4291b51d5b2c16e3611b5c99e3 Mon Sep 17 00:00:00 2001 From: Mart Lubbers Date: Wed, 3 May 2017 12:11:08 +0200 Subject: [PATCH] add arduino uno compatability --- client/arduino/arduino.ino | 135 +++++++++++++++++++++++++ client/arduino/interface.cpp | 62 ++++++++++++ client/arduino/interface.h | 1 + client/arduino/interpret.c | 1 + client/arduino/interpret.h | 1 + client/arduino/mTaskSymbols.h | 1 + client/arduino/mem.c | 1 + client/arduino/mem.h | 1 + client/arduino/sds.c | 1 + client/arduino/sds.h | 1 + client/arduino/spec.c | 1 + client/arduino/spec.h | 1 + client/arduino/task.c | 1 + client/arduino/task.h | 1 + client/client.c | 180 +++++++++++++++++----------------- client/interface.h | 20 ++-- client/interpret.c | 3 +- client/interpret.h | 2 - client/mem.c | 1 + client/mem.h | 2 - client/sds.c | 6 +- client/task.c | 5 +- 22 files changed, 317 insertions(+), 111 deletions(-) create mode 100644 client/arduino/arduino.ino create mode 100644 client/arduino/interface.cpp create mode 120000 client/arduino/interface.h create mode 120000 client/arduino/interpret.c create mode 120000 client/arduino/interpret.h create mode 120000 client/arduino/mTaskSymbols.h create mode 120000 client/arduino/mem.c create mode 120000 client/arduino/mem.h create mode 120000 client/arduino/sds.c create mode 120000 client/arduino/sds.h create mode 120000 client/arduino/spec.c create mode 120000 client/arduino/spec.h create mode 120000 client/arduino/task.c create mode 120000 client/arduino/task.h diff --git a/client/arduino/arduino.ino b/client/arduino/arduino.ino new file mode 100644 index 0000000..305f51d --- /dev/null +++ b/client/arduino/arduino.ino @@ -0,0 +1,135 @@ +#include +#include +#include +#include + +#ifdef LINUX +#include +#endif + +#include "interpret.h" +#include "mTaskSymbols.h" +#include "sds.h" +#include "spec.h" +#include "task.h" +#include "interface.h" + +#define MSG_GET_TASK 't' +#define MSG_DEL_TASK 'd' +#define MSG_SDS_SPEC 's' +#define MSG_SDS_DEL 'a' +#define MSG_SDS_UPD 'u' +#define MSG_SPEC 'c' + +#define LOOPDELAY 100 + +void read_message(void) +{ + //Find next task + if (input_available()) { + uint8_t c = read_byte(); + debug("Receiving input: %c %02x\n", c, c); + switch (c) { + case MSG_SDS_SPEC: + debug("Receiving an sds"); + sds_register(); + break; + case MSG_SDS_UPD: + debug("Receiving an sds update"); + //TODO do something with the return value + c = read16(); + sds_update(c); + break; + case MSG_SDS_DEL: + debug("Receiving a delete SDS request"); + c = read16(); + sds_delete(c); + write_byte('a'); + write16(c); + write_byte('\n'); + break; + case MSG_DEL_TASK: + debug("Receiving a delete task request"); + c = read16(); + task_delete(c); + //Write acknowledgement + write_byte('d'); + write16(c); + write_byte('\n'); + break; + case MSG_GET_TASK: + debug("Receiving a task"); + task_register(); + break; + case MSG_SPEC: + debug("Receiving a spec request"); + spec_send(); + break; + case '\0': + debug("Server closed connection"); + break; + case '\n': + break; + default: + debug("Unknown message: %X", c); + } + } else { + // debug("No input"); + } +} + +unsigned long loopmillis = 0; +void loop(void) +{ +#if defined ARDUINO_ESP8266_NODEMCU || defined ARDUINO_AVR_UNO + if (getmillis() - loopmillis < LOOPDELAY) { + return; + } + loopmillis = getmillis(); +#endif + read_message(); + + //Run tasks + unsigned long cyclestart = getmillis(); + for (struct task *t = task_head(); t != NULL; t = task_next(t)) { + //interrupt task + if (is_interrupt_task(t) && had_interrupt(t)) { + debug("Interrupt task %d not implemented", t->taskid); + run_task(t); + //Interval task, and interval passed + } else if (cyclestart - t->lastrun > t->interval) { + debug("Running interval task: %d", t->taskid); + run_task(t); + + //Oneshot task, thus disable + if (t->interval == 0) { + task_delete(t->taskid); + } + t->lastrun = cyclestart; + } + } +} + +#ifdef STM +int main(void) { +#elif defined ARDUINO_ESP8266_NODEMCU || defined ARDUINO_AVR_UNO +void setup() { +#elif defined LINUX +int main(int argc, char *argv[]) { + gargc = argc; + gargv = argv; +#endif + + //Initialize device independant functionality + real_setup(); + +#if !defined(ARDUINO_ESP8266_NODEMCU) && !defined(ARDUINO_AVR_UNO) + while (true) { + //Check for newtasks + loop(); + msdelay(LOOPDELAY); + } + + return 0; +#endif +} diff --git a/client/arduino/interface.cpp b/client/arduino/interface.cpp new file mode 100644 index 0000000..c48f7c3 --- /dev/null +++ b/client/arduino/interface.cpp @@ -0,0 +1,62 @@ +#include +#include +#include + +extern "C" unsigned long getmillis(void); +extern "C" void pdie(char *, ...); +extern "C" void die(char *, ...); +extern "C" void debug(char *, ...); +extern "C" void real_setup(void); +extern "C" void write_byte(uint8_t); +extern "C" uint8_t read_byte(void); +extern "C" bool input_available(void); +extern "C" void msdelay(unsigned long); + +unsigned long getmillis(void) +{ + return millis(); +} + +void msdelay(unsigned long ms) +{ + delay(ms); +} + +bool input_available(void) +{ + return Serial.available(); +} + +uint8_t read_byte(void) +{ + return Serial.read(); +} + +void write_byte(uint8_t b) +{ + Serial.write(b); +} + +void real_setup(void) +{ + Serial.begin(9600); +} + +void debug(char *fmt, ...) +{ + Serial.println(fmt); +} + +void die(char *fmt, ...) +{ + Serial.println(fmt); + while(1){ + msdelay(1000); + Serial.print("die"); + } +} + +void pdie(char *s) +{ + die(s); +} diff --git a/client/arduino/interface.h b/client/arduino/interface.h new file mode 120000 index 0000000..b854400 --- /dev/null +++ b/client/arduino/interface.h @@ -0,0 +1 @@ +../interface.h \ No newline at end of file diff --git a/client/arduino/interpret.c b/client/arduino/interpret.c new file mode 120000 index 0000000..213f9b8 --- /dev/null +++ b/client/arduino/interpret.c @@ -0,0 +1 @@ +../interpret.c \ No newline at end of file diff --git a/client/arduino/interpret.h b/client/arduino/interpret.h new file mode 120000 index 0000000..a3858d4 --- /dev/null +++ b/client/arduino/interpret.h @@ -0,0 +1 @@ +../interpret.h \ No newline at end of file diff --git a/client/arduino/mTaskSymbols.h b/client/arduino/mTaskSymbols.h new file mode 120000 index 0000000..482ac01 --- /dev/null +++ b/client/arduino/mTaskSymbols.h @@ -0,0 +1 @@ +../mTaskSymbols.h \ No newline at end of file diff --git a/client/arduino/mem.c b/client/arduino/mem.c new file mode 120000 index 0000000..d01a49b --- /dev/null +++ b/client/arduino/mem.c @@ -0,0 +1 @@ +../mem.c \ No newline at end of file diff --git a/client/arduino/mem.h b/client/arduino/mem.h new file mode 120000 index 0000000..2e72483 --- /dev/null +++ b/client/arduino/mem.h @@ -0,0 +1 @@ +../mem.h \ No newline at end of file diff --git a/client/arduino/sds.c b/client/arduino/sds.c new file mode 120000 index 0000000..9d106bb --- /dev/null +++ b/client/arduino/sds.c @@ -0,0 +1 @@ +../sds.c \ No newline at end of file diff --git a/client/arduino/sds.h b/client/arduino/sds.h new file mode 120000 index 0000000..f6b82b5 --- /dev/null +++ b/client/arduino/sds.h @@ -0,0 +1 @@ +../sds.h \ No newline at end of file diff --git a/client/arduino/spec.c b/client/arduino/spec.c new file mode 120000 index 0000000..3a0ed1c --- /dev/null +++ b/client/arduino/spec.c @@ -0,0 +1 @@ +../spec.c \ No newline at end of file diff --git a/client/arduino/spec.h b/client/arduino/spec.h new file mode 120000 index 0000000..bbf3789 --- /dev/null +++ b/client/arduino/spec.h @@ -0,0 +1 @@ +../spec.h \ No newline at end of file diff --git a/client/arduino/task.c b/client/arduino/task.c new file mode 120000 index 0000000..e4f6627 --- /dev/null +++ b/client/arduino/task.c @@ -0,0 +1 @@ +../task.c \ No newline at end of file diff --git a/client/arduino/task.h b/client/arduino/task.h new file mode 120000 index 0000000..d8ffa8e --- /dev/null +++ b/client/arduino/task.h @@ -0,0 +1 @@ +../task.h \ No newline at end of file diff --git a/client/client.c b/client/client.c index b501e0f..305f51d 100644 --- a/client/client.c +++ b/client/client.c @@ -25,111 +25,111 @@ void read_message(void) { - //Find next task - if(input_available()){ - uint8_t c = read_byte(); - debug("Receiving input: %c %02x\n", c, c); - switch(c){ - case MSG_SDS_SPEC: - debug("Receiving an sds"); - sds_register(); - break; - case MSG_SDS_UPD: - debug("Receiving an sds update"); - //TODO do something with the return value - c = read16(); - sds_update(c); - break; - case MSG_SDS_DEL: - debug("Receiving a delete SDS request"); - c = read16(); - sds_delete(c); - write_byte('a'); - write16(c); - write_byte('\n'); - break; - case MSG_DEL_TASK: - debug("Receiving a delete task request"); - c = read16(); - task_delete(c); - //Write acknowledgement - write_byte('d'); - write16(c); - write_byte('\n'); - break; - case MSG_GET_TASK: - debug("Receiving a task"); - task_register(); - break; - case MSG_SPEC: - debug("Receiving a spec request"); - spec_send(); - break; - case '\0': - debug("Server closed connection"); - break; - case '\n': - break; - default: - debug("Unknown message: %X", c); - } - } else { -// debug("No input"); - } + //Find next task + if (input_available()) { + uint8_t c = read_byte(); + debug("Receiving input: %c %02x\n", c, c); + switch (c) { + case MSG_SDS_SPEC: + debug("Receiving an sds"); + sds_register(); + break; + case MSG_SDS_UPD: + debug("Receiving an sds update"); + //TODO do something with the return value + c = read16(); + sds_update(c); + break; + case MSG_SDS_DEL: + debug("Receiving a delete SDS request"); + c = read16(); + sds_delete(c); + write_byte('a'); + write16(c); + write_byte('\n'); + break; + case MSG_DEL_TASK: + debug("Receiving a delete task request"); + c = read16(); + task_delete(c); + //Write acknowledgement + write_byte('d'); + write16(c); + write_byte('\n'); + break; + case MSG_GET_TASK: + debug("Receiving a task"); + task_register(); + break; + case MSG_SPEC: + debug("Receiving a spec request"); + spec_send(); + break; + case '\0': + debug("Server closed connection"); + break; + case '\n': + break; + default: + debug("Unknown message: %X", c); + } + } else { + // debug("No input"); + } } unsigned long loopmillis = 0; void loop(void) { -#ifdef ARDUINO_ESP8266_NODEMCU - if(getmillis()-loopmillis < LOOPDELAY){ - return; - } - loopmillis = getmillis(); +#if defined ARDUINO_ESP8266_NODEMCU || defined ARDUINO_AVR_UNO + if (getmillis() - loopmillis < LOOPDELAY) { + return; + } + loopmillis = getmillis(); #endif - read_message(); + read_message(); - //Run tasks - unsigned long cyclestart = getmillis(); - for(struct task *t = task_head(); t != NULL; t = task_next(t)){ - //interrupt task - if(is_interrupt_task(t) && had_interrupt(t)){ - debug("Interrupt task %d not implemented", t->taskid); - run_task(t); - //Interval task, and interval passed - } else if(cyclestart-t->lastrun > t->interval){ - debug("Running interval task: %d", t->taskid); - run_task(t); + //Run tasks + unsigned long cyclestart = getmillis(); + for (struct task *t = task_head(); t != NULL; t = task_next(t)) { + //interrupt task + if (is_interrupt_task(t) && had_interrupt(t)) { + debug("Interrupt task %d not implemented", t->taskid); + run_task(t); + //Interval task, and interval passed + } else if (cyclestart - t->lastrun > t->interval) { + debug("Running interval task: %d", t->taskid); + run_task(t); - //Oneshot task, thus disable - if(t->interval == 0){ - task_delete(t->taskid); - } - t->lastrun = cyclestart; - } - } + //Oneshot task, thus disable + if (t->interval == 0) { + task_delete(t->taskid); + } + t->lastrun = cyclestart; + } + } } #ifdef STM -int main(void){ -#elif defined ARDUINO_ESP8266_NODEMCU -void setup(){ +int main(void) { +#elif defined ARDUINO_ESP8266_NODEMCU || defined ARDUINO_AVR_UNO +void setup() { #elif defined LINUX -int main(int argc, char *argv[]){ - gargc = argc; - gargv = argv; +int main(int argc, char *argv[]) { + gargc = argc; + gargv = argv; #endif - //Initialize device independant functionality - real_setup(); + //Initialize device independant functionality + real_setup(); -#ifndef ARDUINO_ESP8266_NODEMCU - while(true){ - //Check for newtasks - loop(); - msdelay(LOOPDELAY); - } +#if !defined(ARDUINO_ESP8266_NODEMCU) && !defined(ARDUINO_AVR_UNO) + while (true) { + //Check for newtasks + loop(); + msdelay(LOOPDELAY); + } - return 0; + return 0; #endif } diff --git a/client/interface.h b/client/interface.h index 9e16292..266c13d 100644 --- a/client/interface.h +++ b/client/interface.h @@ -10,8 +10,8 @@ extern "C" { #include #ifdef LINUX -#define MAXTASKS 5 -#define MAXSDSS 100 +#define STACKSIZE 1024 +#define MEMSIZE 1024 #define HAVELED 1 #define HAVEAIO 1 #define HAVEDIO 1 @@ -20,26 +20,32 @@ extern int gargc; extern char **gargv; #elif defined STM -#define MAXTASKS 5 -#define MAXSDSS 100 +#define STACKSIZE 1024 +#define MEMSIZE 1024 #define HAVELED 1 #define HAVEAIO 1 #define HAVEDIO 1 #elif defined ARDUINO_ESP8266_NODEMCU -#define MAXTASKS 5 -#define MAXSDSS 100 +#define STACKSIZE 1024 +#define MEMSIZE 1024 #define HAVELED 0 #define HAVEAIO 0 #define HAVEDIO 0 +#elif defined ARDUINO_AVR_UNO +#define STACKSIZE 64 +#define MEMSIZE 256 +#define HAVELED 0 +#define HAVEAIO 0 +#define HAVEDIO 0 #else //Add you device here #endif #define read16() 256*(uint8_t)read_byte() + (uint8_t)read_byte() #define from16(a, b) 256*a+b -#define write16(i) { write_byte((uint8_t)i/256); write_byte((uint8_t)i%256); } +#define write16(i) { write_byte((uint8_t)(i/256)); write_byte((uint8_t)(i%256)); } /* Communication */ bool input_available(void); diff --git a/client/interpret.c b/client/interpret.c index 6f2f20d..92e58d1 100644 --- a/client/interpret.c +++ b/client/interpret.c @@ -16,13 +16,14 @@ #define f16(p) program[pc]*265+program[pc+1] +uint8_t stack[STACKSIZE] = {0}; + void run_task(struct task *t) { uint8_t *program = t->bc; int plen = t->tasklength; int pc = 0; int sp = 0; - char stack[STACKSIZE] = {0}; debug("Running task with length: %d", plen); while(pc < plen){ switch(program[pc++]){ diff --git a/client/interpret.h b/client/interpret.h index 726ebf6..bb93bec 100644 --- a/client/interpret.h +++ b/client/interpret.h @@ -1,8 +1,6 @@ #ifndef INTEPRET_H #define INTEPRET_H -#define STACKSIZE 1024 - #ifdef __cplusplus extern "C" { #endif diff --git a/client/mem.c b/client/mem.c index f4cdf2c..9b72b8a 100644 --- a/client/mem.c +++ b/client/mem.c @@ -1,6 +1,7 @@ #include #include +#include "interface.h" #include "mem.h" uint8_t mem[MEMSIZE] = {0}; diff --git a/client/mem.h b/client/mem.h index c1adc94..1a1d39c 100644 --- a/client/mem.h +++ b/client/mem.h @@ -7,8 +7,6 @@ extern "C" { #include #include -#define MEMSIZE 1024 - uint8_t *mem_top; uint8_t *mem_bottom; uint8_t *mem_task; diff --git a/client/sds.c b/client/sds.c index 56f5895..2570017 100644 --- a/client/sds.c +++ b/client/sds.c @@ -1,15 +1,11 @@ #include #include -#include #include "interface.h" #include "sds.h" #include "mem.h" -extern uint8_t *mem_top; -extern uint8_t *mem_bottom; -extern uint8_t *mem_task; -extern uint8_t *mem_sds; +extern uint8_t *mem_top, *mem_bottom, *mem_task, *mem_sds; struct sds *sds_head(void) { diff --git a/client/task.c b/client/task.c index e36600d..050784c 100644 --- a/client/task.c +++ b/client/task.c @@ -6,10 +6,7 @@ #include "interface.h" #include "mem.h" -extern uint8_t *mem_top; -extern uint8_t *mem_bottom; -extern uint8_t *mem_task; -extern uint8_t *mem_sds; +extern uint8_t *mem_top, *mem_bottom, *mem_task, *mem_sds; uint8_t taskid = 0; -- 2.20.1