1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2025-05-31 05:08:45 +00:00

fix(core): don't use 'static lifetime for BLEEvent

[no changelog]
This commit is contained in:
Roman Zeyde 2025-03-19 14:00:20 +02:00 committed by Roman Zeyde
parent acc584ce25
commit 1e3b02771b
5 changed files with 37 additions and 22 deletions

View File

@ -1068,7 +1068,7 @@ pub static mp_module_trezorui_api: Module = obj_module! {
/// def usb_event(self, connected: bool) -> LayoutState | None: /// def usb_event(self, connected: bool) -> LayoutState | None:
/// """Receive a USB connect/disconnect event.""" /// """Receive a USB connect/disconnect event."""
/// ///
/// def ble_event(self, event: tuple[int, bytes]) -> LayoutState | None: /// def ble_event(self, event: tuple[int, int | None]) -> LayoutState | None:
/// """Receive a BLE event.""" /// """Receive a BLE event."""
/// ///
/// def timer(self, token: int) -> LayoutState | None: /// def timer(self, token: int) -> LayoutState | None:

View File

@ -5,18 +5,18 @@ use crate::error::Error;
pub enum BLEEvent { pub enum BLEEvent {
Connected, Connected,
Disconnected, Disconnected,
PairingRequest(&'static [u8]), PairingRequest(u32),
PairingCanceled, PairingCanceled,
} }
impl BLEEvent { impl BLEEvent {
pub fn new(event: u32, data: &'static [u8]) -> Result<Self, Error> { pub fn new(event: u32, data: Option<u32>) -> Result<Self, Error> {
let result = match event { let result = match (event, data) {
1 => Self::Connected, (1, None) => Self::Connected,
2 => Self::Disconnected, (2, None) => Self::Disconnected,
3 => Self::PairingRequest(data), (3, Some(code)) => Self::PairingRequest(code),
4 => Self::PairingCanceled, (4, None) => Self::PairingCanceled,
_ => return Err(Error::OutOfRange), _ => return Err(Error::ValueError(c"Invalid BLE event")),
}; };
Ok(result) Ok(result)
} }

View File

@ -11,8 +11,6 @@ use crate::ui::{event::TouchEvent, geometry::Direction};
#[cfg(feature = "touch")] #[cfg(feature = "touch")]
use num_traits::ToPrimitive; use num_traits::ToPrimitive;
#[cfg(feature = "ble")]
use crate::micropython::buffer::get_buffer;
#[cfg(feature = "ble")] #[cfg(feature = "ble")]
use crate::ui::event::BLEEvent; use crate::ui::event::BLEEvent;
@ -545,11 +543,7 @@ extern "C" fn ui_layout_ble_event(n_args: usize, args: *const Obj) -> Obj {
} }
let this: Gc<LayoutObj> = args[0].try_into()?; let this: Gc<LayoutObj> = args[0].try_into()?;
let data = unsafe { get_buffer(args[2]) }; let event = BLEEvent::new(args[1].try_into()?, args[2].try_into_option()?)?;
let data = unwrap!(data);
let event = BLEEvent::new(args[1].try_into()?, data)?;
let msg = this.inner_mut().obj_event(Event::BLE(event))?; let msg = this.inner_mut().obj_event(Event::BLE(event))?;
Ok(msg) Ok(msg)
}; };

View File

@ -48,6 +48,31 @@
extern uint32_t last_touch_sample_time; extern uint32_t last_touch_sample_time;
#ifdef USE_BLE
static mp_obj_t parse_ble_event_data(const ble_event_t *event) {
if (event->data_len == 0) {
return mp_const_none;
}
if (event->type != BLE_PAIRING_REQUEST) {
return mp_const_none;
}
// Parse pairing code
_Static_assert(sizeof(event->data) <= 6);
uint32_t code = 0;
for (int i = 0; i < event->data_len; ++i) {
uint8_t byte = event->data[i];
if (byte >= '0' && byte <= '9') {
code = 10 * code + (byte - '0');
} else {
mp_raise_ValueError("Invalid pairing code");
}
}
return mp_obj_new_int_from_uint(code);
}
#endif
/// package: trezorio.__init__ /// package: trezorio.__init__
/// def poll(ifaces: Iterable[int], list_ref: list, timeout_ms: int) -> bool: /// def poll(ifaces: Iterable[int], list_ref: list, timeout_ms: int) -> bool:
@ -208,13 +233,9 @@ STATIC mp_obj_t mod_trezorio_poll(mp_obj_t ifaces, mp_obj_t list_ref,
ble_event_t event = {0}; ble_event_t event = {0};
bool read = ble_get_event(&event); bool read = ble_get_event(&event);
if (read) { if (read) {
mp_obj_t data = mp_const_empty_bytes;
if (event.data_len > 0) {
data = mp_obj_new_bytes(event.data, event.data_len);
}
mp_obj_tuple_t *tuple = MP_OBJ_TO_PTR(mp_obj_new_tuple(2, NULL)); mp_obj_tuple_t *tuple = MP_OBJ_TO_PTR(mp_obj_new_tuple(2, NULL));
tuple->items[0] = MP_OBJ_NEW_SMALL_INT(event.type); tuple->items[0] = MP_OBJ_NEW_SMALL_INT(event.type);
tuple->items[1] = data; tuple->items[1] = parse_ble_event_data(&event);
ret->items[0] = MP_OBJ_NEW_SMALL_INT(i); ret->items[0] = MP_OBJ_NEW_SMALL_INT(i);
ret->items[1] = MP_OBJ_FROM_PTR(tuple); ret->items[1] = MP_OBJ_FROM_PTR(tuple);
return mp_const_true; return mp_const_true;

View File

@ -26,7 +26,7 @@ class LayoutObj(Generic[T]):
"""Receive a progress event.""" """Receive a progress event."""
def usb_event(self, connected: bool) -> LayoutState | None: def usb_event(self, connected: bool) -> LayoutState | None:
"""Receive a USB connect/disconnect event.""" """Receive a USB connect/disconnect event."""
def ble_event(self, event: tuple[int, bytes]) -> LayoutState | None: def ble_event(self, event: tuple[int, int | None]) -> LayoutState | None:
"""Receive a BLE event.""" """Receive a BLE event."""
def timer(self, token: int) -> LayoutState | None: def timer(self, token: int) -> LayoutState | None:
"""Callback for the timer set by `attach_timer_fn`. """Callback for the timer set by `attach_timer_fn`.