#pragma once #include #include #include "BootOptions.h" class Platform : public Task { static int s_timezone; static char s_deviceID[15]; public: Platform() : Task("Platform") {} static BootOptions bootopts; static void setTimezone(int tz) { s_timezone = tz; } static int getTimezone() { return s_timezone; } static void addLEDs(CRGB* leds, unsigned int ledCount) { FastLED.addLeds(leds, ledCount); } static const char* name(); static const char* version(); static const String model() { static String modelName = String("Renderbug " ) + Platform::name(); return modelName; } static const String deviceName() { static String devName = model() + " " + Platform::deviceID(); return devName; } static void preSetup(); static void bootSplash(); static void setup(); void loop() override; static bool getLocalTime(struct tm* timedata); static const char* deviceID(); static int freeRam(); struct TaskRegistration { Task* task = 0; TaskRegistration* next = 0; TaskRegistration(Task* task) : task(task) {} }; static TaskRegistration* firstTask; static TaskRegistration* lastTask; static void registerTask(TaskRegistration* reg) { if (firstTask == NULL) { firstTask = reg; lastTask = firstTask; } else { lastTask->next = reg; lastTask = reg; } } struct task_iterator: public std::iterator { TaskRegistration* cur; explicit task_iterator() : cur(NULL) {} explicit task_iterator(TaskRegistration* head) : cur(head) {} task_iterator& operator++() { if (cur) { cur = cur->next; } return *this; } task_iterator operator++(int) {task_iterator ret = *this; ++(*this); return ret;} bool operator==(task_iterator other) const { return cur == other.cur; } bool operator!=(task_iterator other) const { return !(*this == other); } Task* operator*() const { return cur->task; } }; static task_iterator beginTasks() { return task_iterator(firstTask); } static task_iterator endTasks() { return task_iterator(NULL); } static void restart() { #ifdef BOARD_ESP8266 ESP.wdtDisable(); ESP.restart(); #elif defined(BOARD_ESP32) ESP.restart(); #endif } };