--- /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)
+{
+#ifdef ARDUINO_ESP8266_NODEMCU
+ if(getmillis()-loopmillis < LOOPDELAY){
+ return;
+ }
+ loopmillis = getmillis();
+#endif
+ debug("Loop");
+
+ 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
+void setup(){
+#elif defined LINUX
+int main(int argc, char *argv[]){
+ gargc = argc;
+ gargv = argv;
+#endif
+
+ //Initialize device independant functionality
+ real_setup();
+
+#ifndef ARDUINO_ESP8266_NODEMCU
+ while(true){
+ //Check for newtasks
+ loop();
+ msdelay(LOOPDELAY);
+ }
+
+ return 0;
+#endif
+}