modgint: basic gint module with some of <gint/keyboard.h>

This commit is contained in:
Lephenixnoir 2022-10-29 10:57:15 +02:00
parent 1992ec0a49
commit f930ff95db
Signed by: Lephenixnoir
GPG Key ID: 1BBA026E13FC0495
3 changed files with 261 additions and 1 deletions

View File

@ -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))

View File

@ -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',

258
ports/sh/modgint.c Normal file
View File

@ -0,0 +1,258 @@
#include "py/runtime.h"
#include "py/objtuple.h"
#include <gint/display.h>
#include <gint/keyboard.h>
#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)
/* <gint/keyboard.h> */
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);
/* <gint/display.h> */
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) },
/* <gint/keycodes.h> */
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),
/* <gint/keyboard.h> */
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),
/* <gint/display.h> */
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);