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
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);
|
|
}
|