add arduino uno compatability
[mTask.git] / client / arduino / arduino.ino
diff --git a/client/arduino/arduino.ino b/client/arduino/arduino.ino
new file mode 100644 (file)
index 0000000..305f51d
--- /dev/null
@@ -0,0 +1,135 @@
+#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
+}