Skip to content
Snippets Groups Projects
Commit 3d06ca84 authored by q3k's avatar q3k Committed by moon2
Browse files

st3m: re-introduce handedness in buttons

moon2 note: this is still somewhat dirty and does not solve
the issue properly, c-st3m will need more love. will fix it
up alongside taking care of button api later today. merging
anyways for now to avoid rebase hell.
parent 11a9ce15
Branches
Tags
No related merge requests found
...@@ -18,21 +18,35 @@ ...@@ -18,21 +18,35 @@
#include "mp_uctx.h" #include "mp_uctx.h"
STATIC mp_obj_t mp_get_left() { STATIC mp_obj_t mp_get_app(void) {
return mp_obj_new_int(st3m_io_left_button_get()); return mp_obj_new_int(st3m_io_app_button_get());
} }
STATIC MP_DEFINE_CONST_FUN_OBJ_0(mp_get_left_obj, mp_get_left); STATIC MP_DEFINE_CONST_FUN_OBJ_0(mp_get_app_obj, mp_get_app);
STATIC mp_obj_t mp_get_right() { STATIC mp_obj_t mp_get_os(void) {
return mp_obj_new_int(st3m_io_right_button_get()); return mp_obj_new_int(st3m_io_os_button_get());
} }
STATIC MP_DEFINE_CONST_FUN_OBJ_0(mp_get_right_obj, mp_get_right); STATIC MP_DEFINE_CONST_FUN_OBJ_0(mp_get_os_obj, mp_get_os);
STATIC mp_obj_t mp_configure(mp_obj_t left_in) {
bool left = mp_obj_is_true(left_in);
st3m_io_app_button_configure(left);
return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_1(mp_configure_obj, mp_configure);
STATIC mp_obj_t mp_app_is_left(void) {
return mp_obj_new_bool(st3m_io_app_button_is_left());
}
STATIC MP_DEFINE_CONST_FUN_OBJ_0(mp_app_is_left_obj, mp_app_is_left);
STATIC const mp_rom_map_elem_t mp_module_sys_buttons_globals_table[] = { STATIC const mp_rom_map_elem_t mp_module_sys_buttons_globals_table[] = {
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_sys_buttons) }, { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_sys_buttons) },
{ MP_ROM_QSTR(MP_QSTR_get_left), MP_ROM_PTR(&mp_get_left_obj) }, { MP_ROM_QSTR(MP_QSTR_get_app), MP_ROM_PTR(&mp_get_app_obj) },
{ MP_ROM_QSTR(MP_QSTR_get_right), MP_ROM_PTR(&mp_get_right_obj) }, { MP_ROM_QSTR(MP_QSTR_get_os), MP_ROM_PTR(&mp_get_os_obj) },
{ MP_ROM_QSTR(MP_QSTR_configure), MP_ROM_PTR(&mp_configure_obj) },
{ MP_ROM_QSTR(MP_QSTR_app_is_left), MP_ROM_PTR(&mp_app_is_left_obj) },
{ MP_ROM_QSTR(MP_QSTR_PRESSED_LEFT), MP_ROM_INT(st3m_tripos_left) }, { MP_ROM_QSTR(MP_QSTR_PRESSED_LEFT), MP_ROM_INT(st3m_tripos_left) },
{ MP_ROM_QSTR(MP_QSTR_PRESSED_RIGHT), MP_ROM_INT(st3m_tripos_right) }, { MP_ROM_QSTR(MP_QSTR_PRESSED_RIGHT), MP_ROM_INT(st3m_tripos_right) },
......
...@@ -5,12 +5,16 @@ static const char *TAG = "st3m-io"; ...@@ -5,12 +5,16 @@ static const char *TAG = "st3m-io";
#include "esp_err.h" #include "esp_err.h"
#include "esp_log.h" #include "esp_log.h"
#include "freertos/FreeRTOS.h" #include "freertos/FreeRTOS.h"
#include "freertos/semphr.h"
#include "freertos/task.h" #include "freertos/task.h"
#include "flow3r_bsp.h" #include "flow3r_bsp.h"
#include "flow3r_bsp_i2c.h" #include "flow3r_bsp_i2c.h"
#include "st3m_audio.h" #include "st3m_audio.h"
static bool _app_button_left = true;
static SemaphoreHandle_t _mu = NULL;
static void _update_button_state() { static void _update_button_state() {
esp_err_t ret = flow3r_bsp_spio_update(); esp_err_t ret = flow3r_bsp_spio_update();
if (ret != ESP_OK) { if (ret != ESP_OK) {
...@@ -18,23 +22,35 @@ static void _update_button_state() { ...@@ -18,23 +22,35 @@ static void _update_button_state() {
} }
} }
void init_buttons() { bool st3m_io_charger_state_get() { return flow3r_bsp_spio_charger_state_get(); }
esp_err_t ret = flow3r_bsp_spio_init();
if (ret != ESP_OK) { void st3m_io_app_button_configure(bool left) {
ESP_LOGE(TAG, "init failed: %s", esp_err_to_name(ret)); xSemaphoreTake(_mu, portMAX_DELAY);
for (;;) { _app_button_left = left;
} xSemaphoreGive(_mu);
}
} }
bool st3m_io_charger_state_get() { return flow3r_bsp_spio_charger_state_get(); } bool st3m_io_app_button_is_left(void) {
xSemaphoreTake(_mu, portMAX_DELAY);
bool res = _app_button_left;
xSemaphoreGive(_mu);
return res;
}
st3m_tripos st3m_io_left_button_get() { st3m_tripos st3m_io_app_button_get() {
if (st3m_io_app_button_is_left()) {
return flow3r_bsp_spio_left_button_get(); return flow3r_bsp_spio_left_button_get();
} else {
return flow3r_bsp_spio_right_button_get();
}
} }
st3m_tripos st3m_io_right_button_get() { st3m_tripos st3m_io_os_button_get() {
if (st3m_io_app_button_is_left()) {
return flow3r_bsp_spio_right_button_get(); return flow3r_bsp_spio_right_button_get();
} else {
return flow3r_bsp_spio_left_button_get();
}
} }
static uint8_t badge_link_enabled = 0; static uint8_t badge_link_enabled = 0;
...@@ -102,6 +118,10 @@ static void _task(void *data) { ...@@ -102,6 +118,10 @@ static void _task(void *data) {
} }
void st3m_io_init(void) { void st3m_io_init(void) {
assert(_mu == NULL);
_mu = xSemaphoreCreateMutex();
assert(_mu != NULL);
esp_err_t ret = flow3r_bsp_spio_init(); esp_err_t ret = flow3r_bsp_spio_init();
if (ret != ESP_OK) { if (ret != ESP_OK) {
ESP_LOGE(TAG, "spio init failed: %s", esp_err_to_name(ret)); ESP_LOGE(TAG, "spio init failed: %s", esp_err_to_name(ret));
......
...@@ -19,11 +19,20 @@ typedef enum { ...@@ -19,11 +19,20 @@ typedef enum {
st3m_tripos_right = 1, st3m_tripos_right = 1,
} st3m_tripos; } st3m_tripos;
/* Read the state of the left/right button. /* Configure whether the app button is on the left (default) or on the right.
* This ignores user preference and should be used only with good reason.
*/ */
st3m_tripos st3m_io_left_button_get(); void st3m_io_app_button_configure(bool left);
st3m_tripos st3m_io_right_button_get();
/* Returns true if the app button is on the left (default), false otherwise.
*/
bool st3m_io_app_button_is_left(void);
/* Read the state of the application and OS buttons. By default, the application
* button is on the left and the OS button is on the right. However, the user
* can change that preference - see st3m_io_app_button_configure.
*/
st3m_tripos st3m_io_app_button_get();
st3m_tripos st3m_io_os_button_get();
#define BADGE_LINK_PIN_MASK_LINE_IN_TIP 0b0001 #define BADGE_LINK_PIN_MASK_LINE_IN_TIP 0b0001
#define BADGE_LINK_PIN_MASK_LINE_IN_RING 0b0010 #define BADGE_LINK_PIN_MASK_LINE_IN_RING 0b0010
......
...@@ -186,7 +186,7 @@ static void _task(void *arg) { ...@@ -186,7 +186,7 @@ static void _task(void *arg) {
st3m_mode_update_display(&restartable); st3m_mode_update_display(&restartable);
if (restartable) { if (restartable) {
st3m_tripos tp = st3m_io_right_button_get(); st3m_tripos tp = st3m_io_os_button_get();
if (tp == st3m_tripos_mid) { if (tp == st3m_tripos_mid) {
st3m_gfx_textview_t tv = { st3m_gfx_textview_t tv = {
.title = "Restarting...", .title = "Restarting...",
......
def get_left() -> int: ... def get_app() -> int: ...
def get_right() -> int: ... def get_os() -> int: ...
def configure(left: bool) -> None: ...
def app_is_left() -> bool: ...
PRESSED_LEFT: int PRESSED_LEFT: int
PRESSED_RIGHT: int PRESSED_RIGHT: int
......
...@@ -58,17 +58,10 @@ class InputButtonState: ...@@ -58,17 +58,10 @@ class InputButtonState:
PRESSED_DOWN = sys_buttons.PRESSED_DOWN PRESSED_DOWN = sys_buttons.PRESSED_DOWN
NOT_PRESSED = sys_buttons.NOT_PRESSED NOT_PRESSED = sys_buttons.NOT_PRESSED
def __init__(self, left: int, right: int, swapped: bool): def __init__(self, app: int, os: int, app_is_left: bool):
app = left
os = right
if swapped:
app, os = os, app
self.app = app self.app = app
self.os = os self.os = os
self._left = left self.app_is_left = app_is_left
self._right = right
self.app_is_left = not swapped
class InputState: class InputState:
...@@ -95,15 +88,16 @@ class InputState: ...@@ -95,15 +88,16 @@ class InputState:
self.battery_voltage = battery_voltage self.battery_voltage = battery_voltage
@classmethod @classmethod
def gather(cls, swapped_buttons: bool = False) -> "InputState": def gather(cls) -> "InputState":
""" """
Build InputState from current hardware state. Should only be used by the Build InputState from current hardware state. Should only be used by the
Reactor. Reactor.
""" """
cts = captouch.read() cts = captouch.read()
left = sys_buttons.get_left() app = sys_buttons.get_app()
right = sys_buttons.get_right() os = sys_buttons.get_os()
buttons = InputButtonState(left, right, swapped_buttons) app_is_left = sys_buttons.app_is_left()
buttons = InputButtonState(app, os, app_is_left)
acc = imu.acc_read() acc = imu.acc_read()
gyro = imu.gyro_read() gyro = imu.gyro_read()
......
...@@ -84,7 +84,6 @@ class Reactor: ...@@ -84,7 +84,6 @@ class Reactor:
"_ctx", "_ctx",
"_ts", "_ts",
"_last_ctx_get", "_last_ctx_get",
"_swap_buttons",
"stats", "stats",
) )
...@@ -95,7 +94,6 @@ class Reactor: ...@@ -95,7 +94,6 @@ class Reactor:
self._last_tick: Optional[int] = None self._last_tick: Optional[int] = None
self._last_ctx_get: Optional[int] = None self._last_ctx_get: Optional[int] = None
self._ctx: Optional[Context] = None self._ctx: Optional[Context] = None
self._swap_buttons = False
self.stats = ReactorStats() self.stats = ReactorStats()
def set_top(self, top: Responder) -> None: def set_top(self, top: Responder) -> None:
...@@ -114,9 +112,6 @@ class Reactor: ...@@ -114,9 +112,6 @@ class Reactor:
while True: while True:
self._run_once() self._run_once()
def set_buttons_swapped(self, swapped: bool) -> None:
self._swap_buttons = swapped
def _run_once(self) -> None: def _run_once(self) -> None:
start = time.ticks_ms() start = time.ticks_ms()
deadline = start + self._tickrate_ms deadline = start + self._tickrate_ms
...@@ -143,7 +138,7 @@ class Reactor: ...@@ -143,7 +138,7 @@ class Reactor:
self._ts += delta self._ts += delta
hr = InputState.gather(self._swap_buttons) hr = InputState.gather()
# Think! # Think!
self._top.think(hr, delta) self._top.think(hr, delta)
......
...@@ -20,7 +20,7 @@ from st3m.application import ( ...@@ -20,7 +20,7 @@ from st3m.application import (
from st3m.about import About from st3m.about import About
from st3m import settings, logging, processors, wifi from st3m import settings, logging, processors, wifi
import captouch, audio, leds, gc import captouch, audio, leds, gc, sys_buttons
import os import os
import machine import machine
...@@ -37,7 +37,8 @@ def _make_reactor() -> Reactor: ...@@ -37,7 +37,8 @@ def _make_reactor() -> Reactor:
reactor = Reactor() reactor = Reactor()
def _onoff_button_swap_update() -> None: def _onoff_button_swap_update() -> None:
reactor.set_buttons_swapped(settings.onoff_button_swap.value) left = not settings.onoff_button_swap.value
sys_buttons.configure(left)
settings.onoff_button_swap.subscribe(_onoff_button_swap_update) settings.onoff_button_swap.subscribe(_onoff_button_swap_update)
_onoff_button_swap_update() _onoff_button_swap_update()
......
import _sim import _sim
_app_is_left = True
def get_left():
def get_app():
if _app_is_left:
return _sim.get_button_state(1) return _sim.get_button_state(1)
else:
return _sim.get_button_state(0)
def get_right(): def get_os():
if _app_is_left:
return _sim.get_button_state(0) return _sim.get_button_state(0)
else:
return _sim.get_button_state(1)
def app_is_left():
return _app_is_left
def configure(left):
global _app_is_left
_app_is_left = left
PRESSED_LEFT = -1 PRESSED_LEFT = -1
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment