From f930ff95db249a516477e5b850de3164be1eda68 Mon Sep 17 00:00:00 2001 From: Lephenixnoir Date: Sat, 29 Oct 2022 10:57:15 +0200 Subject: [PATCH] modgint: basic gint module with some of --- ports/sh/Makefile | 2 + ports/sh/keymap.c | 2 +- ports/sh/modgint.c | 258 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 261 insertions(+), 1 deletion(-) create mode 100644 ports/sh/modgint.c diff --git a/ports/sh/Makefile b/ports/sh/Makefile index 79c9c4d77..9d8f2095c 100644 --- a/ports/sh/Makefile +++ b/ports/sh/Makefile @@ -14,6 +14,7 @@ SRC_C = \ main.c \ console.c \ keymap.c \ + modgint.c \ mphalport.c \ shared/readline/readline.c \ shared/runtime/gchelper_generic.c \ @@ -22,6 +23,7 @@ SRC_C = \ SRC_QSTR += \ shared/readline/readline.c \ + modgint.c \ OBJ = $(PY_O) $(addprefix $(BUILD)/, $(SRC_C:.c=.o)) diff --git a/ports/sh/keymap.c b/ports/sh/keymap.c index 7d645d967..942ae5b14 100644 --- a/ports/sh/keymap.c +++ b/ports/sh/keymap.c @@ -15,7 +15,7 @@ static uint8_t map_flat[30] = { '7', '8', '9', 0, 0, 0, '4', '5', '6', '*', '/', 0, '1', '2', '3', '+', '-', 0, - '0', '.', 'e', '-', 0, 0, + '0', '.', 'e', '_', 0, 0, }; static uint8_t map_alpha[36] = { 'a', 'b', 'c', 'd', 'e', 'f', diff --git a/ports/sh/modgint.c b/ports/sh/modgint.c new file mode 100644 index 000000000..5c4a644c4 --- /dev/null +++ b/ports/sh/modgint.c @@ -0,0 +1,258 @@ +#include "py/runtime.h" +#include "py/objtuple.h" +#include +#include + +#define FUN_0(NAME) \ + MP_DEFINE_CONST_FUN_OBJ_0(modgint_ ## NAME ## _obj, modgint_ ## NAME) +#define FUN_1(NAME) \ + MP_DEFINE_CONST_FUN_OBJ_1(modgint_ ## NAME ## _obj, modgint_ ## NAME) +#define FUN_2(NAME) \ + MP_DEFINE_CONST_FUN_OBJ_2(modgint_ ## NAME ## _obj, modgint_ ## NAME) +#define FUN_VAR(NAME, MIN) \ + MP_DEFINE_CONST_FUN_OBJ_VAR(modgint_ ## NAME ## _obj, MIN, modgint_ ## NAME) + +/* */ + +STATIC qstr const key_event_fields[] = { + MP_QSTR_time, + MP_QSTR_mod, + MP_QSTR_shift, + MP_QSTR_alpha, + MP_QSTR_type, + MP_QSTR_key, +}; + +STATIC mp_obj_t mk_key_event(key_event_t ev) +{ + mp_obj_t items[] = { + mp_obj_new_int(ev.time), + mp_obj_new_bool(ev.mod), + mp_obj_new_bool(ev.shift), + mp_obj_new_bool(ev.alpha), + mp_obj_new_int(ev.type), + mp_obj_new_int(ev.key), + }; + return mp_obj_new_attrtuple(key_event_fields, 6, items); +} + +STATIC mp_obj_t modgint_pollevent(void) +{ + key_event_t ev = pollevent(); + return mk_key_event(ev); +} + +// TODO: waitevent: timeout parameter? + +STATIC mp_obj_t modgint_clearevents(void) +{ + clearevents(); + return mp_const_none; +} + +STATIC mp_obj_t modgint_keydown(mp_obj_t arg1) +{ + mp_int_t key = mp_obj_get_int(arg1); + bool down = keydown(key) != 0; + return mp_obj_new_bool(down); +} + +STATIC mp_obj_t modgint_keydown_all(size_t n, mp_obj_t const *args) +{ + bool down = true; + for(size_t i = 0; i < n; i++) + down &= keydown(mp_obj_get_int(args[i])) != 0; + return mp_obj_new_bool(down); +} + +STATIC mp_obj_t modgint_keydown_any(size_t n, mp_obj_t const *args) +{ + bool down = false; + for(size_t i = 0; i < n; i++) + down |= keydown(mp_obj_get_int(args[i])) != 0; + return mp_obj_new_bool(down); +} + +STATIC mp_obj_t modgint_getkey(void) +{ + key_event_t ev = getkey(); + return mk_key_event(ev); +} + +// TODO: getkey_opt: timeout parameter? +STATIC mp_obj_t modgint_getkey_opt(mp_obj_t arg1) +{ + int options = mp_obj_get_int(arg1); + key_event_t ev = getkey_opt(options, NULL); + return mk_key_event(ev); +} + +STATIC mp_obj_t modgint_keycode_function(mp_obj_t arg1) +{ + int keycode = mp_obj_get_int(arg1); + return MP_OBJ_NEW_SMALL_INT(keycode_function(keycode)); +} + +STATIC mp_obj_t modgint_keycode_digit(mp_obj_t arg1) +{ + int keycode = mp_obj_get_int(arg1); + return MP_OBJ_NEW_SMALL_INT(keycode_digit(keycode)); +} + +FUN_0(clearevents); +FUN_0(pollevent); +FUN_1(keydown); +FUN_VAR(keydown_all, 0); +FUN_VAR(keydown_any, 0); +FUN_0(getkey); +FUN_1/*2*/(getkey_opt); +FUN_1(keycode_function); +FUN_1(keycode_digit); + +/* */ + +STATIC mp_obj_t modgint_dclear(mp_obj_t arg1) +{ + mp_int_t color0 = mp_obj_get_int(arg1); + int color = MP_OBJ_SMALL_INT_VALUE(color0); + dclear(color); + return mp_const_none; +} + +STATIC mp_obj_t modgint_dupdate(void) +{ + dupdate(); + return mp_const_none; +} + +FUN_1(dclear); +FUN_0(dupdate); + +/* Module definition */ + +// Helper: define object "modgint_F_obj" as object "F" in the module +#define OBJ(F) {MP_ROM_QSTR(MP_QSTR_ ## F), MP_ROM_PTR(&modgint_ ## F ## _obj)} + +// Helper: define small integer constant "I" as "I" in the module +#define INT(I) {MP_ROM_QSTR(MP_QSTR_ ## I), MP_OBJ_NEW_SMALL_INT(I)} + +STATIC const mp_rom_map_elem_t modgint_module_globals_table[] = { + { MP_OBJ_NEW_QSTR(MP_QSTR___name__), MP_OBJ_NEW_QSTR(MP_QSTR_gint) }, + + /* */ + + INT(KEY_F1), + INT(KEY_F2), + INT(KEY_F3), + INT(KEY_F4), + INT(KEY_F5), + INT(KEY_F6), + + INT(KEY_SHIFT), + INT(KEY_OPTN), + INT(KEY_VARS), + INT(KEY_MENU), + INT(KEY_LEFT), + INT(KEY_UP), + + INT(KEY_ALPHA), + INT(KEY_SQUARE), + INT(KEY_POWER), + INT(KEY_EXIT), + INT(KEY_DOWN), + INT(KEY_RIGHT), + + INT(KEY_XOT), + INT(KEY_LOG), + INT(KEY_LN), + INT(KEY_SIN), + INT(KEY_COS), + INT(KEY_TAN), + + INT(KEY_FRAC), + INT(KEY_FD), + INT(KEY_LEFTP), + INT(KEY_RIGHTP), + INT(KEY_COMMA), + INT(KEY_ARROW), + + INT(KEY_7), + INT(KEY_8), + INT(KEY_9), + INT(KEY_DEL), + + INT(KEY_4), + INT(KEY_5), + INT(KEY_6), + INT(KEY_MUL), + INT(KEY_DIV), + + INT(KEY_1), + INT(KEY_2), + INT(KEY_3), + INT(KEY_ADD), + INT(KEY_SUB), + + INT(KEY_0), + INT(KEY_DOT), + INT(KEY_EXP), + INT(KEY_NEG), + INT(KEY_EXE), + + INT(KEY_ACON), + INT(KEY_HELP), + INT(KEY_LIGHT), + + INT(KEY_X2), + INT(KEY_CARET), + INT(KEY_SWITCH), + INT(KEY_LEFTPAR), + INT(KEY_RIGHTPAR), + INT(KEY_STORE), + INT(KEY_TIMES), + INT(KEY_PLUS), + INT(KEY_MINUS), + + /* */ + + INT(KEYEV_NONE), + INT(KEYEV_DOWN), + INT(KEYEV_UP), + INT(KEYEV_HOLD), + + INT(GETKEY_MOD_SHIFT), + INT(GETKEY_MOD_ALPHA), + INT(GETKEY_BACKLIGHT), + INT(GETKEY_MENU), + INT(GETKEY_REP_ARROWS), + INT(GETKEY_REP_ALL), + INT(GETKEY_REP_PROFILE), + INT(GETKEY_FEATURES), + INT(GETKEY_NONE), + INT(GETKEY_DEFAULT), + + OBJ(pollevent), + // OBJ(waitevent), + OBJ(clearevents), + OBJ(keydown), + OBJ(keydown_all), + OBJ(keydown_any), + OBJ(getkey), + OBJ(getkey_opt), + OBJ(keycode_function), + OBJ(keycode_digit), + + /* */ + + OBJ(dclear), + OBJ(dupdate), +}; +STATIC MP_DEFINE_CONST_DICT( + modgint_module_globals, modgint_module_globals_table); + +const mp_obj_module_t modgint_module = { + .base = { &mp_type_module }, + .globals = (mp_obj_dict_t *)&modgint_module_globals, +}; + +MP_REGISTER_MODULE(MP_QSTR_gint, modgint_module);