From 256b67ed9e4112fcfbc88439e3396e401ee11421 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Boric Date: Sat, 2 Feb 2019 15:47:09 +0100 Subject: [PATCH] [python] Implement get_keys in kandinsky --- python/port/genhdr/qstrdefs.in.h | 55 ++++++++++++++ python/port/mod/kandinsky/modkandinsky.cpp | 76 +++++++++++++++++++ python/port/mod/kandinsky/modkandinsky.h | 1 + .../port/mod/kandinsky/modkandinsky_table.c | 2 + 4 files changed, 134 insertions(+) diff --git a/python/port/genhdr/qstrdefs.in.h b/python/port/genhdr/qstrdefs.in.h index 6538a0e3f5c..dcd0fd2a632 100644 --- a/python/port/genhdr/qstrdefs.in.h +++ b/python/port/genhdr/qstrdefs.in.h @@ -25,6 +25,61 @@ Q(fill_rect) Q(get_pixel) Q(set_pixel) Q(wait_vblank) +Q(get_keys) + +// Keys QSTRs + +Q(left) +Q(up) +Q(down) +Q(right) +Q(OK) +Q(back) + +Q(shift) +Q(alpha) +Q(xnt) +Q(var) +Q(toolbox) +Q(backspace) + +Q(exp) +Q(ln) +Q(log) +Q(imaginary) +Q(,) +Q(^) + +Q(sin) +Q(cos) +Q(tan) +Q(pi) +Q(sqrt) +Q(square) + +Q(7) +Q(8) +Q(9) +Q(() +Q()) + +Q(4) +Q(5) +Q(6) +Q(*) +Q(/) + +Q(1) +Q(2) +Q(3) +Q(+) +Q(-) + +Q(0) +Q(.) +Q(EE) +Q(Ans) +Q(EXE) // Turtle QSTRs diff --git a/python/port/mod/kandinsky/modkandinsky.cpp b/python/port/mod/kandinsky/modkandinsky.cpp index caa8304db8a..a55cc8b384a 100644 --- a/python/port/mod/kandinsky/modkandinsky.cpp +++ b/python/port/mod/kandinsky/modkandinsky.cpp @@ -92,3 +92,79 @@ mp_obj_t modkandinsky_wait_vblank() { Ion::Display::waitForVBlank(); return mp_const_none; } + +struct key2mp +{ + Ion::Keyboard::Key key; + mp_obj_t string; +}; + +key2mp keyMapping[] = +{ + { Ion::Keyboard::Key::A1, MP_ROM_QSTR(MP_QSTR_left) }, + { Ion::Keyboard::Key::A2, MP_ROM_QSTR(MP_QSTR_up) }, + { Ion::Keyboard::Key::A3, MP_ROM_QSTR(MP_QSTR_down) }, + { Ion::Keyboard::Key::A4, MP_ROM_QSTR(MP_QSTR_right) }, + { Ion::Keyboard::Key::A5, MP_ROM_QSTR(MP_QSTR_OK) }, + { Ion::Keyboard::Key::A6, MP_ROM_QSTR(MP_QSTR_back) }, + + { Ion::Keyboard::Key::C1, MP_ROM_QSTR(MP_QSTR_shift) }, + { Ion::Keyboard::Key::C2, MP_ROM_QSTR(MP_QSTR_alpha) }, + { Ion::Keyboard::Key::C3, MP_ROM_QSTR(MP_QSTR_xnt) }, + { Ion::Keyboard::Key::C4, MP_ROM_QSTR(MP_QSTR_var) }, + { Ion::Keyboard::Key::C5, MP_ROM_QSTR(MP_QSTR_toolbox) }, + { Ion::Keyboard::Key::C6, MP_ROM_QSTR(MP_QSTR_backspace) }, + + { Ion::Keyboard::Key::D1, MP_ROM_QSTR(MP_QSTR_exp) }, + { Ion::Keyboard::Key::D2, MP_ROM_QSTR(MP_QSTR_ln) }, + { Ion::Keyboard::Key::D3, MP_ROM_QSTR(MP_QSTR_log) }, + { Ion::Keyboard::Key::D4, MP_ROM_QSTR(MP_QSTR_imaginary) }, + { Ion::Keyboard::Key::D5, MP_ROM_QSTR(MP_QSTR_toolbox) }, + { Ion::Keyboard::Key::D6, MP_ROM_QSTR(MP_QSTR_backspace) }, + + { Ion::Keyboard::Key::E1, MP_ROM_QSTR(MP_QSTR_sin) }, + { Ion::Keyboard::Key::E2, MP_ROM_QSTR(MP_QSTR_cos) }, + { Ion::Keyboard::Key::E3, MP_ROM_QSTR(MP_QSTR_tan) }, + { Ion::Keyboard::Key::E4, MP_ROM_QSTR(MP_QSTR_pi) }, + { Ion::Keyboard::Key::E5, MP_ROM_QSTR(MP_QSTR_sqrt) }, + { Ion::Keyboard::Key::E6, MP_ROM_QSTR(MP_QSTR_square) }, + + { Ion::Keyboard::Key::F1, MP_ROM_QSTR(MP_QSTR_7) }, + { Ion::Keyboard::Key::F2, MP_ROM_QSTR(MP_QSTR_8) }, + { Ion::Keyboard::Key::F3, MP_ROM_QSTR(MP_QSTR_9) }, + { Ion::Keyboard::Key::F4, MP_ROM_QSTR(MP_QSTR__paren_open_) }, + { Ion::Keyboard::Key::F5, MP_ROM_QSTR(MP_QSTR__paren_close_) }, + + { Ion::Keyboard::Key::G1, MP_ROM_QSTR(MP_QSTR_4) }, + { Ion::Keyboard::Key::G2, MP_ROM_QSTR(MP_QSTR_5) }, + { Ion::Keyboard::Key::G3, MP_ROM_QSTR(MP_QSTR_6) }, + { Ion::Keyboard::Key::G4, MP_ROM_QSTR(MP_QSTR__star_) }, + { Ion::Keyboard::Key::G5, MP_ROM_QSTR(MP_QSTR__slash_) }, + + { Ion::Keyboard::Key::H1, MP_ROM_QSTR(MP_QSTR_1) }, + { Ion::Keyboard::Key::H2, MP_ROM_QSTR(MP_QSTR_2) }, + { Ion::Keyboard::Key::H3, MP_ROM_QSTR(MP_QSTR_3) }, + { Ion::Keyboard::Key::H4, MP_ROM_QSTR(MP_QSTR__plus_) }, + { Ion::Keyboard::Key::H5, MP_ROM_QSTR(MP_QSTR__hyphen_) }, + + { Ion::Keyboard::Key::I1, MP_ROM_QSTR(MP_QSTR_0) }, + { Ion::Keyboard::Key::I2, MP_ROM_QSTR(MP_QSTR__dot_) }, + { Ion::Keyboard::Key::I3, MP_ROM_QSTR(MP_QSTR_EE) }, + { Ion::Keyboard::Key::I4, MP_ROM_QSTR(MP_QSTR_Ans) }, + { Ion::Keyboard::Key::I5, MP_ROM_QSTR(MP_QSTR_EXE) }, +}; + +mp_obj_t modkandinsky_get_keys() { + micropython_port_interrupt_if_needed(); + + Ion::Keyboard::State keys = Ion::Keyboard::scan(); + mp_obj_t result = mp_obj_new_set(0, nullptr); + + for (unsigned i = 0; i < sizeof(keyMapping)/sizeof(key2mp); i++) { + if (keys.keyDown(keyMapping[i].key)) { + mp_obj_set_store(result, keyMapping[i].string); + } + } + + return result; +} diff --git a/python/port/mod/kandinsky/modkandinsky.h b/python/port/mod/kandinsky/modkandinsky.h index 5f06692b7fd..4191155bc68 100644 --- a/python/port/mod/kandinsky/modkandinsky.h +++ b/python/port/mod/kandinsky/modkandinsky.h @@ -6,3 +6,4 @@ mp_obj_t modkandinsky_set_pixel(mp_obj_t x, mp_obj_t y, mp_obj_t color); mp_obj_t modkandinsky_draw_string(size_t n_args, const mp_obj_t *args); mp_obj_t modkandinsky_fill_rect(size_t n_args, const mp_obj_t *args); mp_obj_t modkandinsky_wait_vblank(); +mp_obj_t modkandinsky_get_keys(); diff --git a/python/port/mod/kandinsky/modkandinsky_table.c b/python/port/mod/kandinsky/modkandinsky_table.c index 45e1789a445..253f856a7dd 100644 --- a/python/port/mod/kandinsky/modkandinsky_table.c +++ b/python/port/mod/kandinsky/modkandinsky_table.c @@ -6,6 +6,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_3(modkandinsky_set_pixel_obj, modkandinsky_set_pi STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(modkandinsky_draw_string_obj, 3, 5, modkandinsky_draw_string); STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(modkandinsky_fill_rect_obj, 5, 5, modkandinsky_fill_rect); STATIC MP_DEFINE_CONST_FUN_OBJ_0(modkandinsky_wait_vblank_obj, modkandinsky_wait_vblank); +STATIC MP_DEFINE_CONST_FUN_OBJ_0(modkandinsky_get_keys_obj, modkandinsky_get_keys); STATIC const mp_rom_map_elem_t modkandinsky_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_kandinsky) }, @@ -15,6 +16,7 @@ STATIC const mp_rom_map_elem_t modkandinsky_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_draw_string), (mp_obj_t)&modkandinsky_draw_string_obj }, { MP_ROM_QSTR(MP_QSTR_fill_rect), (mp_obj_t)&modkandinsky_fill_rect_obj }, { MP_ROM_QSTR(MP_QSTR_wait_vblank), (mp_obj_t)&modkandinsky_wait_vblank_obj }, + { MP_ROM_QSTR(MP_QSTR_get_keys), (mp_obj_t)&modkandinsky_get_keys_obj }, }; STATIC MP_DEFINE_CONST_DICT(modkandinsky_module_globals, modkandinsky_module_globals_table);