|
|
|
@ -12,6 +12,7 @@
|
|
|
|
|
#include "py/runtime.h"
|
|
|
|
|
#include "py/mphal.h"
|
|
|
|
|
#include "py/objstr.h"
|
|
|
|
|
#include "py/smallint.h"
|
|
|
|
|
|
|
|
|
|
#if MICROPY_PY_TREZORMSG
|
|
|
|
|
|
|
|
|
@ -327,7 +328,6 @@ typedef struct _mp_obj_Msg_t {
|
|
|
|
|
/// '''
|
|
|
|
|
STATIC mp_obj_t mod_trezormsg_Msg_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) {
|
|
|
|
|
mp_arg_check_num(n_args, n_kw, 0, 0, false);
|
|
|
|
|
msg_init();
|
|
|
|
|
mp_obj_Msg_t *o = m_new_obj(mp_obj_Msg_t);
|
|
|
|
|
o->base.type = type;
|
|
|
|
|
o->usb_info = mp_const_none;
|
|
|
|
@ -404,7 +404,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_3(mod_trezormsg_Msg_init_usb_obj, mod_trezormsg_M
|
|
|
|
|
|
|
|
|
|
/// def deinit_usb(self) -> None:
|
|
|
|
|
/// '''
|
|
|
|
|
/// Cleans up the USB stack
|
|
|
|
|
/// Cleans up the USB stack.
|
|
|
|
|
/// '''
|
|
|
|
|
STATIC mp_obj_t mod_trezormsg_Msg_deinit_usb(mp_obj_t self) {
|
|
|
|
|
|
|
|
|
@ -428,55 +428,11 @@ STATIC mp_obj_t mod_trezormsg_Msg_send(mp_obj_t self, mp_obj_t iface, mp_obj_t m
|
|
|
|
|
uint8_t i = mp_obj_get_int(iface);
|
|
|
|
|
mp_buffer_info_t msg;
|
|
|
|
|
mp_get_buffer_raise(message, &msg, MP_BUFFER_READ);
|
|
|
|
|
ssize_t r = msg_send(i, msg.buf, msg.len);
|
|
|
|
|
ssize_t r = usb_hid_write(i, msg.buf, msg.len);
|
|
|
|
|
return MP_OBJ_NEW_SMALL_INT(r);
|
|
|
|
|
}
|
|
|
|
|
STATIC MP_DEFINE_CONST_FUN_OBJ_3(mod_trezormsg_Msg_send_obj, mod_trezormsg_Msg_send);
|
|
|
|
|
|
|
|
|
|
#define TICK_RESOLUTION 1000
|
|
|
|
|
#define TOUCH_IFACE 255
|
|
|
|
|
extern uint32_t touch_read(void); // defined in HAL
|
|
|
|
|
|
|
|
|
|
/// def select(self, timeout_us: int) -> tuple:
|
|
|
|
|
/// '''
|
|
|
|
|
/// Polls the event queue and returns the event object.
|
|
|
|
|
/// Function returns None if timeout specified in microseconds is reached.
|
|
|
|
|
/// '''
|
|
|
|
|
STATIC mp_obj_t mod_trezormsg_Msg_select(mp_obj_t self, mp_obj_t timeout_us) {
|
|
|
|
|
// mp_obj_Msg_t *o = MP_OBJ_TO_PTR(self);
|
|
|
|
|
int timeout = mp_obj_get_int(timeout_us);
|
|
|
|
|
if (timeout < 0) {
|
|
|
|
|
timeout = 0;
|
|
|
|
|
}
|
|
|
|
|
for (;;) {
|
|
|
|
|
uint32_t e = touch_read();
|
|
|
|
|
if (e) {
|
|
|
|
|
mp_obj_tuple_t *tuple = MP_OBJ_TO_PTR(mp_obj_new_tuple(4, NULL));
|
|
|
|
|
tuple->items[0] = MP_OBJ_NEW_SMALL_INT(TOUCH_IFACE);
|
|
|
|
|
tuple->items[1] = MP_OBJ_NEW_SMALL_INT((e & 0xFF0000) >> 16); // event type
|
|
|
|
|
tuple->items[2] = MP_OBJ_NEW_SMALL_INT((e & 0xFF00) >> 8); // x position
|
|
|
|
|
tuple->items[3] = MP_OBJ_NEW_SMALL_INT((e & 0xFF)); // y position
|
|
|
|
|
return MP_OBJ_FROM_PTR(tuple);
|
|
|
|
|
}
|
|
|
|
|
uint8_t iface;
|
|
|
|
|
uint8_t recvbuf[64];
|
|
|
|
|
ssize_t l = msg_recv(&iface, recvbuf, 64);
|
|
|
|
|
if (l > 0) {
|
|
|
|
|
mp_obj_tuple_t *tuple = MP_OBJ_TO_PTR(mp_obj_new_tuple(2, NULL));
|
|
|
|
|
tuple->items[0] = MP_OBJ_NEW_SMALL_INT(iface);
|
|
|
|
|
tuple->items[1] = mp_obj_new_str_of_type(&mp_type_bytes, recvbuf, l);
|
|
|
|
|
return MP_OBJ_FROM_PTR(tuple);
|
|
|
|
|
}
|
|
|
|
|
if (timeout <= 0) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
mp_hal_delay_us(TICK_RESOLUTION);
|
|
|
|
|
timeout -= TICK_RESOLUTION;
|
|
|
|
|
}
|
|
|
|
|
return mp_const_none;
|
|
|
|
|
}
|
|
|
|
|
STATIC MP_DEFINE_CONST_FUN_OBJ_2(mod_trezormsg_Msg_select_obj, mod_trezormsg_Msg_select);
|
|
|
|
|
|
|
|
|
|
STATIC mp_obj_t mod_trezormsg_Msg___del__(mp_obj_t self) {
|
|
|
|
|
mp_obj_Msg_t *o = MP_OBJ_TO_PTR(self);
|
|
|
|
|
if (o->usb_info != mp_const_none || o->usb_ifaces != mp_const_none) {
|
|
|
|
@ -492,7 +448,6 @@ STATIC const mp_rom_map_elem_t mod_trezormsg_Msg_locals_dict_table[] = {
|
|
|
|
|
{ MP_ROM_QSTR(MP_QSTR_init_usb), MP_ROM_PTR(&mod_trezormsg_Msg_init_usb_obj) },
|
|
|
|
|
{ MP_ROM_QSTR(MP_QSTR_deinit_usb), MP_ROM_PTR(&mod_trezormsg_Msg_deinit_usb_obj) },
|
|
|
|
|
{ MP_ROM_QSTR(MP_QSTR_send), MP_ROM_PTR(&mod_trezormsg_Msg_send_obj) },
|
|
|
|
|
{ MP_ROM_QSTR(MP_QSTR_select), MP_ROM_PTR(&mod_trezormsg_Msg_select_obj) },
|
|
|
|
|
};
|
|
|
|
|
STATIC MP_DEFINE_CONST_DICT(mod_trezormsg_Msg_locals_dict, mod_trezormsg_Msg_locals_dict_table);
|
|
|
|
|
|
|
|
|
@ -503,12 +458,94 @@ STATIC const mp_obj_type_t mod_trezormsg_Msg_type = {
|
|
|
|
|
.locals_dict = (void*)&mod_trezormsg_Msg_locals_dict,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
STATIC mp_obj_t read_bytes_from_hid(uint8_t iface) {
|
|
|
|
|
uint8_t buf[64];
|
|
|
|
|
int l = usb_hid_read(iface, buf, sizeof(buf));
|
|
|
|
|
if (l > 0) {
|
|
|
|
|
return mp_obj_new_str_of_type(&mp_type_bytes, buf, l);
|
|
|
|
|
} else {
|
|
|
|
|
return mp_const_empty_bytes;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#define TOUCH_IFACE (255)
|
|
|
|
|
#define POLL_READ (0x0000)
|
|
|
|
|
#define POLL_WRITE (0x0100)
|
|
|
|
|
|
|
|
|
|
/// def poll(ifaces: Iterable[int], list_ref: List, timeout_us: int) -> bool:
|
|
|
|
|
/// '''
|
|
|
|
|
/// '''
|
|
|
|
|
STATIC mp_obj_t mod_trezormsg_poll(mp_obj_t ifaces, mp_obj_t list_ref, mp_obj_t timeout_us) {
|
|
|
|
|
mp_obj_list_t *ret = MP_OBJ_TO_PTR(list_ref);
|
|
|
|
|
if (!MP_OBJ_IS_TYPE(list_ref, &mp_type_list) || ret->len < 2) {
|
|
|
|
|
mp_raise_TypeError("invalid list_ref");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const mp_uint_t timeout = mp_obj_get_int(timeout_us);
|
|
|
|
|
const mp_uint_t deadline = mp_hal_ticks_us() + timeout;
|
|
|
|
|
mp_obj_iter_buf_t iterbuf;
|
|
|
|
|
|
|
|
|
|
for (;;) {
|
|
|
|
|
mp_obj_t iter = mp_getiter(ifaces, &iterbuf);
|
|
|
|
|
mp_obj_t item;
|
|
|
|
|
while ((item = mp_iternext(iter)) != MP_OBJ_STOP_ITERATION) {
|
|
|
|
|
const mp_uint_t i = mp_obj_int_get_truncated(item);
|
|
|
|
|
const mp_uint_t iface = i & 0x00FF;
|
|
|
|
|
const mp_uint_t mode = i & 0xFF00;
|
|
|
|
|
|
|
|
|
|
if (iface == TOUCH_IFACE) {
|
|
|
|
|
uint32_t evt = touch_read();
|
|
|
|
|
if (evt) {
|
|
|
|
|
mp_obj_tuple_t *tuple = MP_OBJ_TO_PTR(mp_obj_new_tuple(3, NULL));
|
|
|
|
|
tuple->items[0] = MP_OBJ_NEW_SMALL_INT((evt & 0xFF0000) >> 16); // event type
|
|
|
|
|
tuple->items[1] = MP_OBJ_NEW_SMALL_INT((evt & 0xFF00) >> 8); // x position
|
|
|
|
|
tuple->items[2] = MP_OBJ_NEW_SMALL_INT((evt & 0xFF)); // y position
|
|
|
|
|
ret->items[0] = MP_OBJ_NEW_SMALL_INT(i);
|
|
|
|
|
ret->items[1] = MP_OBJ_FROM_PTR(tuple);
|
|
|
|
|
return mp_const_true;
|
|
|
|
|
}
|
|
|
|
|
} else
|
|
|
|
|
if (mode == POLL_READ) {
|
|
|
|
|
if (usb_hid_can_read(iface)) {
|
|
|
|
|
ret->items[0] = MP_OBJ_NEW_SMALL_INT(i);
|
|
|
|
|
ret->items[1] = read_bytes_from_hid(iface);
|
|
|
|
|
return mp_const_true;
|
|
|
|
|
}
|
|
|
|
|
} else
|
|
|
|
|
if (mode == POLL_WRITE) {
|
|
|
|
|
if (usb_hid_can_write(iface)) {
|
|
|
|
|
ret->items[0] = MP_OBJ_NEW_SMALL_INT(i);
|
|
|
|
|
ret->items[1] = mp_const_none;
|
|
|
|
|
return mp_const_true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (mp_hal_ticks_us() >= deadline) {
|
|
|
|
|
break;
|
|
|
|
|
} else {
|
|
|
|
|
MICROPY_EVENT_POLL_HOOK
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return mp_const_false;
|
|
|
|
|
}
|
|
|
|
|
STATIC MP_DEFINE_CONST_FUN_OBJ_3(mod_trezormsg_poll_obj, mod_trezormsg_poll);
|
|
|
|
|
|
|
|
|
|
STATIC const mp_rom_map_elem_t mp_module_trezormsg_globals_table[] = {
|
|
|
|
|
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_trezormsg) },
|
|
|
|
|
{ MP_ROM_QSTR(MP_QSTR_USB), MP_ROM_PTR(&mod_trezormsg_USB_type) },
|
|
|
|
|
{ MP_ROM_QSTR(MP_QSTR_HID), MP_ROM_PTR(&mod_trezormsg_HID_type) },
|
|
|
|
|
{ MP_ROM_QSTR(MP_QSTR_VCP), MP_ROM_PTR(&mod_trezormsg_VCP_type) },
|
|
|
|
|
{ MP_ROM_QSTR(MP_QSTR_Msg), MP_ROM_PTR(&mod_trezormsg_Msg_type) },
|
|
|
|
|
|
|
|
|
|
{ MP_ROM_QSTR(MP_QSTR_poll), MP_ROM_PTR(&mod_trezormsg_poll_obj) },
|
|
|
|
|
{ MP_ROM_QSTR(MP_QSTR_TOUCH), MP_OBJ_NEW_SMALL_INT(TOUCH_IFACE) },
|
|
|
|
|
{ MP_ROM_QSTR(MP_QSTR_TOUCH_START), MP_OBJ_NEW_SMALL_INT((TOUCH_START & 0xFF0000) >> 16) },
|
|
|
|
|
{ MP_ROM_QSTR(MP_QSTR_TOUCH_MOVE), MP_OBJ_NEW_SMALL_INT((TOUCH_MOVE & 0xFF0000) >> 16) },
|
|
|
|
|
{ MP_ROM_QSTR(MP_QSTR_TOUCH_END), MP_OBJ_NEW_SMALL_INT((TOUCH_END & 0xFF0000) >> 16) },
|
|
|
|
|
{ MP_ROM_QSTR(MP_QSTR_POLL_READ), MP_OBJ_NEW_SMALL_INT(POLL_READ) },
|
|
|
|
|
{ MP_ROM_QSTR(MP_QSTR_POLL_WRITE), MP_OBJ_NEW_SMALL_INT(POLL_WRITE) },
|
|
|
|
|
};
|
|
|
|
|
STATIC MP_DEFINE_CONST_DICT(mp_module_trezormsg_globals, mp_module_trezormsg_globals_table);
|
|
|
|
|
|
|
|
|
|