platform for developing on SQFMI's Watchy
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

117 lines
2.3 KiB

#include <stdarg.h>
#include "watchos.h"
#include <Wire.h>
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<Event*>(kernel()->getHandle(event));
}
Task* watchos::task(kernel_handle_t task)
{
return static_cast<Task*>(kernel()->getHandle(task));
}
Task* watchos::module(well_known_handle_t handle)
{
return static_cast<Task*>(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<EventListener*>(task);
if (el == nullptr)
watchos::panic("Cannot subscribe task to events--must implement EventListener");
return kernel()->subscribeEvent(el, source_mask, event_mask);
}