diff --git a/python/port/genhdr/qstrdefs.in.h b/python/port/genhdr/qstrdefs.in.h index 73349bb892e..769a6df6661 100644 --- a/python/port/genhdr/qstrdefs.in.h +++ b/python/port/genhdr/qstrdefs.in.h @@ -22,6 +22,63 @@ Q(draw_string) 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(home) +Q(onOff) +Q(shift) +Q(alpha) +Q(xnt) +Q(var) +Q(toolbox) +Q(backspace) + +Q(exp) +Q(ln) +Q(log) +Q(imaginary) +Q(comma) +Q(power) + +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 Q(turtle) diff --git a/python/port/mod/kandinsky/modkandinsky.cpp b/python/port/mod/kandinsky/modkandinsky.cpp index eacc184ae67..e943feb8db0 100644 --- a/python/port/mod/kandinsky/modkandinsky.cpp +++ b/python/port/mod/kandinsky/modkandinsky.cpp @@ -4,6 +4,7 @@ extern "C" { #include } #include +#include #include "port.h" static KDColor ColorForTuple(mp_obj_t tuple) { @@ -85,3 +86,88 @@ mp_obj_t modkandinsky_fill_rect(size_t n_args, const mp_obj_t * args) { KDIonContext::sharedContext()->fillRect(rect, color); return mp_const_none; } + +mp_obj_t modkandinsky_wait_vblank() { + micropython_port_interrupt_if_needed(); + Ion::Display::waitForVBlank(); + return mp_const_none; +} + +struct key2mp +{ + Ion::Keyboard::Key key; + mp_obj_t string; +}; + +const static key2mp keyMapping[] = +{ + { Ion::Keyboard::Key::Left, MP_ROM_QSTR(MP_QSTR_left) }, + { Ion::Keyboard::Key::Right, MP_ROM_QSTR(MP_QSTR_up) }, + { Ion::Keyboard::Key::Down, MP_ROM_QSTR(MP_QSTR_down) }, + { Ion::Keyboard::Key::Up, MP_ROM_QSTR(MP_QSTR_right) }, + { Ion::Keyboard::Key::OK, MP_ROM_QSTR(MP_QSTR_OK) }, + { Ion::Keyboard::Key::Back, MP_ROM_QSTR(MP_QSTR_back) }, + + { Ion::Keyboard::Key::Home, MP_ROM_QSTR(MP_QSTR_home) }, + { Ion::Keyboard::Key::OnOff, MP_ROM_QSTR(MP_QSTR_onOff) }, + + { Ion::Keyboard::Key::Shift, MP_ROM_QSTR(MP_QSTR_shift) }, + { Ion::Keyboard::Key::Alpha, MP_ROM_QSTR(MP_QSTR_alpha) }, + { Ion::Keyboard::Key::XNT, MP_ROM_QSTR(MP_QSTR_xnt) }, + { Ion::Keyboard::Key::Var, MP_ROM_QSTR(MP_QSTR_var) }, + { Ion::Keyboard::Key::Toolbox, MP_ROM_QSTR(MP_QSTR_toolbox) }, + { Ion::Keyboard::Key::Backspace, MP_ROM_QSTR(MP_QSTR_backspace) }, + + { Ion::Keyboard::Key::Exp, MP_ROM_QSTR(MP_QSTR_exp) }, + { Ion::Keyboard::Key::Ln, MP_ROM_QSTR(MP_QSTR_ln) }, + { Ion::Keyboard::Key::Log, MP_ROM_QSTR(MP_QSTR_log) }, + { Ion::Keyboard::Key::Imaginary, MP_ROM_QSTR(MP_QSTR_imaginary) }, + { Ion::Keyboard::Key::Comma, MP_ROM_QSTR(MP_QSTR_comma) }, + { Ion::Keyboard::Key::Power, MP_ROM_QSTR(MP_QSTR_power) }, + + { Ion::Keyboard::Key::Sine, MP_ROM_QSTR(MP_QSTR_sin) }, + { Ion::Keyboard::Key::Cosine, MP_ROM_QSTR(MP_QSTR_cos) }, + { Ion::Keyboard::Key::Tangent, MP_ROM_QSTR(MP_QSTR_tan) }, + { Ion::Keyboard::Key::Pi, MP_ROM_QSTR(MP_QSTR_pi) }, + { Ion::Keyboard::Key::Sqrt, MP_ROM_QSTR(MP_QSTR_sqrt) }, + { Ion::Keyboard::Key::Square, MP_ROM_QSTR(MP_QSTR_square) }, + + { Ion::Keyboard::Key::Seven, MP_ROM_QSTR(MP_QSTR_7) }, + { Ion::Keyboard::Key::Eight, MP_ROM_QSTR(MP_QSTR_8) }, + { Ion::Keyboard::Key::Nine, MP_ROM_QSTR(MP_QSTR_9) }, + { Ion::Keyboard::Key::RightParenthesis, MP_ROM_QSTR(MP_QSTR__paren_open_) }, + { Ion::Keyboard::Key::LeftParenthesis, MP_ROM_QSTR(MP_QSTR__paren_close_) }, + + { Ion::Keyboard::Key::Four, MP_ROM_QSTR(MP_QSTR_4) }, + { Ion::Keyboard::Key::Five, MP_ROM_QSTR(MP_QSTR_5) }, + { Ion::Keyboard::Key::Six, MP_ROM_QSTR(MP_QSTR_6) }, + { Ion::Keyboard::Key::Multiplication, MP_ROM_QSTR(MP_QSTR__star_) }, + { Ion::Keyboard::Key::Division, MP_ROM_QSTR(MP_QSTR__slash_) }, + + { Ion::Keyboard::Key::One, MP_ROM_QSTR(MP_QSTR_1) }, + { Ion::Keyboard::Key::Two, MP_ROM_QSTR(MP_QSTR_2) }, + { Ion::Keyboard::Key::Three, MP_ROM_QSTR(MP_QSTR_3) }, + { Ion::Keyboard::Key::Plus, MP_ROM_QSTR(MP_QSTR__plus_) }, + { Ion::Keyboard::Key::Minus, MP_ROM_QSTR(MP_QSTR__hyphen_) }, + + { Ion::Keyboard::Key::Zero, MP_ROM_QSTR(MP_QSTR_0) }, + { Ion::Keyboard::Key::Dot, MP_ROM_QSTR(MP_QSTR__dot_) }, + { Ion::Keyboard::Key::EE, MP_ROM_QSTR(MP_QSTR_EE) }, + { Ion::Keyboard::Key::Ans, MP_ROM_QSTR(MP_QSTR_Ans) }, + { Ion::Keyboard::Key::EXE, 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 c346650cd78..4191155bc68 100644 --- a/python/port/mod/kandinsky/modkandinsky.h +++ b/python/port/mod/kandinsky/modkandinsky.h @@ -5,3 +5,5 @@ mp_obj_t modkandinsky_get_pixel(mp_obj_t x, mp_obj_t y); 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 802bee555f0..253f856a7dd 100644 --- a/python/port/mod/kandinsky/modkandinsky_table.c +++ b/python/port/mod/kandinsky/modkandinsky_table.c @@ -5,6 +5,8 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_2(modkandinsky_get_pixel_obj, modkandinsky_get_pi STATIC MP_DEFINE_CONST_FUN_OBJ_3(modkandinsky_set_pixel_obj, modkandinsky_set_pixel); 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) }, @@ -13,6 +15,8 @@ STATIC const mp_rom_map_elem_t modkandinsky_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_set_pixel), (mp_obj_t)&modkandinsky_set_pixel_obj }, { 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);