support event for lvgl

This commit is contained in:
lyon 2022-06-15 20:27:34 +08:00
parent baf68767e0
commit af2d677e32
5 changed files with 191 additions and 0 deletions

View File

@ -0,0 +1,24 @@
import pika_lvgl as lv
import PikaStdLib
mem = PikaStdLib.MemChecker()
def event_cb_1(evt):
print('in evt1')
print('mem used now: %0.2f kB' % (mem.getNow()))
def event_cb_2(evt):
print('in evt2')
print('mem used now: %0.2f kB' % (mem.getNow()))
btn1 = lv.btn(lv.scr_act())
btn1.align(lv.ALIGN.TOP_MID, 0, 10)
btn2 = lv.btn(lv.scr_act())
btn2.align(lv.ALIGN.TOP_MID, 0, 50)
btn1.add_event_cb(event_cb_1, lv.EVENT.CLICKED, 0)
btn2.add_event_cb(event_cb_2, lv.EVENT.CLICKED, 0)
print('mem used max: %0.2f kB' % (mem.getMax()))
print('mem used now: %0.2f kB' % (mem.getNow()))

View File

@ -4,6 +4,8 @@
#include "pika_lvgl_arc.h"
#include "pika_lvgl_lv_obj.h"
PikaObj* pika_lv_event_listener_g;
PikaObj* pika_lvgl_scr_act(PikaObj* self) {
PikaObj* new_obj = newNormalObj(New_TinyObj);
lv_obj_t* lv_obj = lv_scr_act();
@ -12,6 +14,8 @@ PikaObj* pika_lvgl_scr_act(PikaObj* self) {
}
void pika_lvgl___init__(PikaObj* self) {
obj_newDirectObj(self, "lv_event_listener", New_TinyObj);
pika_lv_event_listener_g = obj_getObj(self, "lv_event_listener");
obj_newDirectObj(self, "ALIGN", New_TinyObj);
obj_setInt(self, "ALIGN.CENTER", LV_ALIGN_CENTER);
obj_setInt(self, "ALIGN.DEFAULT", LV_ALIGN_DEFAULT);
@ -77,6 +81,54 @@ void pika_lvgl___init__(PikaObj* self) {
obj_setInt(self, "STATE.USER_3", LV_STATE_USER_3);
obj_setInt(self, "STATE.USER_4", LV_STATE_USER_4);
obj_setInt(self, "STATE.ANY", LV_STATE_ANY);
obj_newDirectObj(self, "EVENT", New_TinyObj);
obj_setInt(self, "EVENT.ALL", LV_EVENT_ALL);
obj_setInt(self, "EVENT.PRESSED", LV_EVENT_PRESSED);
obj_setInt(self, "EVENT.PRESSING", LV_EVENT_PRESSING);
obj_setInt(self, "EVENT.PRESS_LOST", LV_EVENT_PRESS_LOST);
obj_setInt(self, "EVENT.SHORT_CLICKED", LV_EVENT_SHORT_CLICKED);
obj_setInt(self, "EVENT.LONG_PRESSED", LV_EVENT_LONG_PRESSED);
obj_setInt(self, "EVENT.LONG_PRESSED_REPEAT", LV_EVENT_LONG_PRESSED_REPEAT);
obj_setInt(self, "EVENT.CLICKED", LV_EVENT_CLICKED);
obj_setInt(self, "EVENT.RELEASED", LV_EVENT_RELEASED);
obj_setInt(self, "EVENT.SCROLL_BEGIN", LV_EVENT_SCROLL_BEGIN);
obj_setInt(self, "EVENT.SCROLL_END", LV_EVENT_SCROLL_END);
obj_setInt(self, "EVENT.SCROLL", LV_EVENT_SCROLL);
obj_setInt(self, "EVENT.GESTURE", LV_EVENT_GESTURE);
obj_setInt(self, "EVENT.KEY", LV_EVENT_KEY);
obj_setInt(self, "EVENT.FOCUSED", LV_EVENT_FOCUSED);
obj_setInt(self, "EVENT.DEFOCUSED", LV_EVENT_DEFOCUSED);
obj_setInt(self, "EVENT.LEAVE", LV_EVENT_LEAVE);
obj_setInt(self, "EVENT.HIT_TEST", LV_EVENT_HIT_TEST);
obj_setInt(self, "EVENT.COVER_CHECK", LV_EVENT_COVER_CHECK);
obj_setInt(self, "EVENT.REFR_EXT_DRAW_SIZE", LV_EVENT_REFR_EXT_DRAW_SIZE);
obj_setInt(self, "EVENT.DRAW_MAIN_BEGIN", LV_EVENT_DRAW_MAIN_BEGIN);
obj_setInt(self, "EVENT.DRAW_MAIN", LV_EVENT_DRAW_MAIN);
obj_setInt(self, "EVENT.DRAW_MAIN_END", LV_EVENT_DRAW_MAIN_END);
obj_setInt(self, "EVENT.DRAW_POST_BEGIN", LV_EVENT_DRAW_POST_BEGIN);
obj_setInt(self, "EVENT.DRAW_POST", LV_EVENT_DRAW_POST);
obj_setInt(self, "EVENT.DRAW_POST_END", LV_EVENT_DRAW_POST_END);
obj_setInt(self, "EVENT.DRAW_PART_BEGIN", LV_EVENT_DRAW_PART_BEGIN);
obj_setInt(self, "EVENT.DRAW_PART_END", LV_EVENT_DRAW_PART_END);
obj_setInt(self, "EVENT.VALUE_CHANGED", LV_EVENT_VALUE_CHANGED);
obj_setInt(self, "EVENT.INSERT", LV_EVENT_INSERT);
obj_setInt(self, "EVENT.REFRESH", LV_EVENT_REFRESH);
obj_setInt(self, "EVENT.READY", LV_EVENT_READY);
obj_setInt(self, "EVENT.CANCEL", LV_EVENT_CANCEL);
obj_setInt(self, "EVENT.DELETE", LV_EVENT_DELETE);
obj_setInt(self, "EVENT.CHILD_CHANGED", LV_EVENT_CHILD_CHANGED);
obj_setInt(self, "EVENT.CHILD_CREATED", LV_EVENT_CHILD_CREATED);
obj_setInt(self, "EVENT.CHILD_DELETED", LV_EVENT_CHILD_DELETED);
obj_setInt(self, "EVENT.SCREEN_UNLOAD_START", LV_EVENT_SCREEN_UNLOAD_START);
obj_setInt(self, "EVENT.SCREEN_LOAD_START", LV_EVENT_SCREEN_LOAD_START);
obj_setInt(self, "EVENT.SCREEN_LOADED", LV_EVENT_SCREEN_LOADED);
obj_setInt(self, "EVENT.SCREEN_UNLOADED", LV_EVENT_SCREEN_UNLOADED);
obj_setInt(self, "EVENT.SIZE_CHANGED", LV_EVENT_SIZE_CHANGED);
obj_setInt(self, "EVENT.STYLE_CHANGED", LV_EVENT_STYLE_CHANGED);
obj_setInt(self, "EVENT.LAYOUT_CHANGED", LV_EVENT_LAYOUT_CHANGED);
obj_setInt(self, "EVENT.GET_SELF_SIZE", LV_EVENT_GET_SELF_SIZE);
obj_setInt(self, "EVENT.PREPROCESS", LV_EVENT_PREPROCESS);
}
PikaObj* pika_lvgl_obj(PikaObj* self, PikaObj* parent) {

View File

@ -4,6 +4,55 @@ from PikaObj import *
def __init__(): ...
class EVENT:
ALL: int
PRESSED: int
PRESSING: int
PRESS_LOST: int
SHORT_CLICKED: int
LONG_PRESSED: int
LONG_PRESSED_REPEAT: int
CLICKED: int
RELEASED: int
SCROLL_BEGIN: int
SCROLL_END: int
SCROLL: int
GESTURE: int
KEY: int
FOCUSED: int
DEFOCUSED: int
LEAVE: int
HIT_TEST: int
COVER_CHECK: int
REFR_EXT_DRAW_SIZE: int
DRAW_MAIN_BEGIN: int
DRAW_MAIN: int
DRAW_MAIN_END: int
DRAW_POST_BEGIN: int
DRAW_POST: int
DRAW_POST_END: int
DRAW_PART_BEGIN: int
DRAW_PART_END: int
VALUE_CHANGED: int
INSERT: int
REFRESH: int
READY: int
CANCEL: int
DELETE: int
CHILD_CHANGED: int
CHILD_CREATED: int
CHILD_DELETED: int
SCREEN_UNLOAD_START: int
SCREEN_LOAD_START: int
SCREEN_LOADED: int
SCREEN_UNLOADED: int
SIZE_CHANGED: int
STYLE_CHANGED: int
LAYOUT_CHANGED: int
GET_SELF_SIZE: int
PREPROCESS: int
class ALIGN:
DEFAULT: int
TOP_LEFT: int
@ -57,6 +106,10 @@ class ANIM:
ON: int
class lv_event(TinyObj):
def get_code(self) -> int: ...
class lv_obj(TinyObj):
def center(self): ...
def set_size(self, size_x: int, size_y: int): ...
@ -65,6 +118,7 @@ class lv_obj(TinyObj):
def update_layout(self): ...
def set_width(self, w: int): ...
def add_state(self, state: int): ...
def add_event_cb(self, event_cb: any, filter: int, user_data: pointer): ...
def obj(parent: lv_obj) -> lv_obj: ...

View File

@ -0,0 +1,8 @@
#include "lvgl.h"
#include "pika_lvgl_lv_event.h"
int pika_lvgl_lv_event_get_code(PikaObj *self){
lv_event_t *lv_event = obj_getPtr(self, "lv_event");
return lv_event_get_code(lv_event);
}

View File

@ -1,8 +1,12 @@
#include "pika_lvgl_lv_obj.h"
#include "BaseObj.h"
#include "dataStrs.h"
#include "lvgl.h"
#include "pika_lvgl.h"
#include "pika_lvgl_arc.h"
#include "pika_lvgl_lv_event.h"
extern PikaObj* pika_lv_event_listener_g;
void pika_lvgl_lv_obj_center(PikaObj* self) {
lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj");
@ -38,3 +42,52 @@ void pika_lvgl_lv_obj_add_state(PikaObj* self, int state) {
lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj");
lv_obj_add_state(lv_obj, state);
}
PikaObj* eventLisener_getHandler(PikaObj* self, uintptr_t event_id) {
Args buffs = {0};
char* event_name =
strsFormat(&buffs, PIKA_SPRINTF_BUFF_SIZE, "%d", event_id);
PikaObj* event_item = obj_getObj(self, event_name);
PikaObj* event_handler = obj_getPtr(event_item, "handler");
strsDeinit(&buffs);
return event_handler;
}
extern PikaObj* __pikaMain;
static void __pika_event_cb(lv_event_t* e) {
lv_obj_t* target = lv_event_get_target(e);
PikaObj* event_handler =
eventLisener_getHandler(pika_lv_event_listener_g, (uintptr_t)target);
PikaObj* evt = obj_getObj(event_handler, "_event_evt");
obj_setPtr(evt, "lv_event", e);
obj_setArg(__pikaMain, "_event_cb", obj_getArg(event_handler, "_event_cb"));
obj_setArg(__pikaMain, "_event_evt",
obj_getArg(event_handler, "_event_evt"));
obj_run(__pikaMain, "_event_cb(_event_evt)");
obj_removeArg(__pikaMain, "_event_cb");
obj_removeArg(__pikaMain, "_event_evt");
}
void eventLicener_registEvent(PikaObj* self,
uintptr_t event_id,
PikaObj* event_handler) {
Args buffs = {0};
char* event_name =
strsFormat(&buffs, PIKA_SPRINTF_BUFF_SIZE, "%d", event_id);
obj_newDirectObj(self, event_name, New_TinyObj);
PikaObj* event_item = obj_getObj(self, event_name);
obj_setRef(event_item, "handler", event_handler);
strsDeinit(&buffs);
}
void pika_lvgl_lv_obj_add_event_cb(PikaObj* self,
Arg* event_cb,
int filter,
void* user_data) {
lv_obj_t* lv_obj = obj_getPtr(self, "lv_obj");
lv_obj_add_event_cb(lv_obj, __pika_event_cb, filter, NULL);
obj_setArg(self, "_event_cb", event_cb);
obj_setPtr(self, "_event_user_data", user_data);
obj_newDirectObj(self, "_event_evt", New_pika_lvgl_lv_event);
eventLicener_registEvent(pika_lv_event_listener_g, (uintptr_t)lv_obj, self);
}