#include #include "watchos.h" #include Kernel* watchos::s_kernel = nullptr; void watchos::initialize() { Serial.begin(115200); Wire.begin(HW_I2C_SDA, HW_I2C_SCL); } void watchos::setup() { switch (esp_sleep_get_wakeup_cause()) { case ESP_SLEEP_WAKEUP_EXT0: // external rtc watchos::debug("Wake due to external rtc"); break; case ESP_SLEEP_WAKEUP_EXT1: // button press watchos::debug("Wake due to button press"); break; case ESP_SLEEP_WAKEUP_TIMER: // internal rtc watchos::debug("Wake due to internal RTC"); break; default: // full reset watchos::debug("Wake due to reset"); kernel()->initialize(); break; } kernel()->start(); } void watchos::tick() { kernel()->tick(); } Kernel* watchos::kernel() { if (s_kernel == nullptr) { s_kernel = new Kernel(); } return s_kernel; } void watchos::panic(char* fmt...) { Serial.println("PANIC PANIC PANIC"); va_list args; char msg[512]; va_start(args, fmt); vsprintf(msg, fmt, args); va_end(args); Serial.println(msg); #ifdef WATCHOS_DEBUG for (;;) {} #else delay(3000); Serial.println("Resetting..."); ESP.restart(); #endif } void watchos::debug(char* fmt...) { #ifdef WATCHOS_DEBUG va_list args; char msg[512]; va_start(args, fmt); vsprintf(msg, fmt, args); va_end(args); Serial.println(msg); #endif } Event* watchos::event(kernel_handle_t event) { return static_cast(kernel()->getHandle(event)); } Task* watchos::task(kernel_handle_t task) { return static_cast(kernel()->getHandle(task)); } Task* watchos::module(well_known_handle_t handle) { return static_cast(kernel()->getHandle(kernel()->getHandleForWellKnown(handle))); } void watchos::reference(kernel_handle_t handle) { kernel()->useHandle(handle); } void watchos::release(kernel_handle_t handle) { kernel()->releaseHandle(handle); } kernel_handle_t watchos::run(Task* task) { return kernel()->registerTask(task); } kernel_handle_t watchos::subscribe(Task* task, well_known_handle_t source_mask, uint16_t event_mask) { EventListener* el = dynamic_cast(task); if (el == nullptr) watchos::panic("Cannot subscribe task to events--must implement EventListener"); return kernel()->subscribeEvent(el, source_mask, event_mask); }