--- /dev/null
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef LINUX
+#include <stdio.h>
+#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
+}
--- /dev/null
+#include <Arduino.h>
+#include <stdbool.h>
+#include <stdint.h>
+
+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);
+}
--- /dev/null
+../interface.h
\ No newline at end of file
--- /dev/null
+../interpret.c
\ No newline at end of file
--- /dev/null
+../interpret.h
\ No newline at end of file
--- /dev/null
+../mTaskSymbols.h
\ No newline at end of file
--- /dev/null
+../mem.c
\ No newline at end of file
--- /dev/null
+../mem.h
\ No newline at end of file
--- /dev/null
+../sds.c
\ No newline at end of file
--- /dev/null
+../sds.h
\ No newline at end of file
--- /dev/null
+../spec.c
\ No newline at end of file
--- /dev/null
+../spec.h
\ No newline at end of file
--- /dev/null
+../task.c
\ No newline at end of file
--- /dev/null
+../task.h
\ No newline at end of file
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
}
#include <stdarg.h>
#ifdef LINUX
-#define MAXTASKS 5
-#define MAXSDSS 100
+#define STACKSIZE 1024
+#define MEMSIZE 1024
#define HAVELED 1
#define HAVEAIO 1
#define HAVEDIO 1
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);
#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++]){
#ifndef INTEPRET_H
#define INTEPRET_H
-#define STACKSIZE 1024
-
#ifdef __cplusplus
extern "C" {
#endif
#include <stdlib.h>
#include <stdint.h>
+#include "interface.h"
#include "mem.h"
uint8_t mem[MEMSIZE] = {0};
#include <stdint.h>
#include <stdbool.h>
-#define MEMSIZE 1024
-
uint8_t *mem_top;
uint8_t *mem_bottom;
uint8_t *mem_task;
#include <stdlib.h>
#include <string.h>
-#include <stdio.h>
#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)
{
#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;