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