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:
parent
acc584ce25
commit
1e3b02771b
@ -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:
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
};
|
};
|
||||||
|
@ -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;
|
||||||
|
@ -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`.
|
||||||
|
Loading…
Reference in New Issue
Block a user