#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 }