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.
 
 

116 lines
2.1 KiB

#include "watchos.h"
#include "watchos_hw.h"
#include "Module_Input.h"
struct ButtonState
{
byte button;
byte pin;
uint64_t mask;
bool pressed = false;
byte reserved1;
};
uint64_t wakeup_bits;
Module_Input::Module_Input()
{
for (int i = 0; i < MODULE_INPUT_BUTTONS; i++)
{
m_button[i] = new ButtonState();
}
// TODO: Figure out a way to not hardcode this
m_button[0]->button = MODULE_INPUT_BUTTON_BACK;
m_button[0]->pin = HW_BUTTON_TL;
m_button[0]->mask = HW_BUTTON_TL_MASK;
m_button[1]->button = MODULE_INPUT_BUTTON_OK;
m_button[1]->pin = HW_BUTTON_BL;
m_button[1]->mask = HW_BUTTON_BL_MASK;
m_button[2]->button = MODULE_INPUT_BUTTON_UP;
m_button[2]->pin = HW_BUTTON_TR;
m_button[2]->mask = HW_BUTTON_TR_MASK;
m_button[3]->button = MODULE_INPUT_BUTTON_DOWN;
m_button[3]->pin = HW_BUTTON_BR;
m_button[3]->mask = HW_BUTTON_BR_MASK;
if (esp_sleep_get_wakeup_cause() == ESP_SLEEP_WAKEUP_EXT1)
{
wakeup_bits = esp_sleep_get_ext1_wakeup_status();
}
else
{
wakeup_bits = 0;
}
}
void Module_Input::initialize()
{
}
void Module_Input::suspend()
{
}
int Module_Input::getId()
{
return MODULE_INPUT;
}
void Module_Input::tick()
{
poll();
wakeup_bits = 0;
}
void Module_Input::poll()
{
byte pressed = 0;
char msg[255];
for (int i = 0; i < MODULE_INPUT_BUTTONS; i++)
{
if (digitalRead(m_button[i]->pin) == 1 || (wakeup_bits & m_button[i]->mask) != 0)
{
if (!m_button[i]->pressed)
{
sprintf(msg, "Button pressed: %d", i);
Kernel::debug(msg);
pressed |= m_button[i]->button;
m_button[i]->pressed = true;
}
}
else
{
if (m_button[i]->pressed)
Kernel::debug("Button released!");
m_button[i]->pressed = false;
}
}
if (pressed != 0)
{
Kernel::get()->event(MODULE_INPUT, MODULE_INPUT_EVENT_PRESS, pressed, 0);
}
}
bool Module_Input::isAnyPressed()
{
for (int i = 0; i < MODULE_INPUT_BUTTONS; i++)
{
if (m_button[i]->pressed)
{
return true;
}
}
return false;
}
bool Module_Input::isPressed(byte button)
{
return m_button[button]->pressed;
}