X-Git-Url: https://git.martlubbers.net/?a=blobdiff_plain;f=client%2Farduino%2Farduino.ino;fp=client%2Farduino%2Farduino.ino;h=305f51d876c68a4b0ba123a432596f2e89ee4def;hb=de76c5f5ac6a0c4291b51d5b2c16e3611b5c99e3;hp=0000000000000000000000000000000000000000;hpb=5ff699e2aacd37539f76e069524862dac401a303;p=mTask.git 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 +}