一、准备工作
1、在根目录下,创建一个lvgl文件夹
2、在此文件夹下,加入lv_mode.c、lv_mod.h两个文件
lv_mod.h 里写入:
#pragma once
#include "py/builtin.h"
#include "py/runtime.h"
#include "py/obj.h"
lv_mod.c 写入:
#include "lv_mod.h"
3、找到main目录下的 CMakelists.txt 文件,定义模块文件夹和要参与编译的文件
4、 将源文件和头文件加到编译队列当中
5、 将用到 MP_QSTR_ 的文件加入到序列中
二、创建
1、创建模块字典(模块需要包含哪些元素)
STATIC const mp_rom_map_elem_t lvgl_globals_table[] = {
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_lvgl) }, //模块名称
};
2、将元素数组转换成字典对象
STATIC MP_DEFINE_CONST_DICT(lvgl_globals, lvgl_globals_table); //将数组类型转换成字典对象
3、定义模块
const mp_obj_module_t mp_mod_lvgl = {
.base = { &mp_type_module }, //模块类型的指向(模块的类型恒定为 &mp_type_module)
.globals = (mp_obj_dict_t *)&lvgl_globals, //指向字典
};
4、注册模块到系统
MP_REGISTER_MODULE(MP_QSTR_lvgl, mp_mod_lvgl);
三、添加方法
1、定义c的方法
例:定义一个 print()
STATIC mp_obj_t lv_print(){
printf("Test Function \n");
return mp_const_none; //表示 MicroPthon 中不返回
}
2、转化成 Micropython 方法对象
MP_DEFINE_CONST_FUN_OBJ_0(lv_print_obj,lv_print);
3、加入到字典中
STATIC const mp_rom_map_elem_t lvgl_globals_table[] = {
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_lvgl) }, //模块名称
// 方法定义的 3、加入到字典中
{ MP_ROM_QSTR(MP_QSTR_print), MP_ROM_PTR(&lv_print_obj) },
};
四、运行
附录:
lv_mod.c
#include "lv_mod.h"
// ############################## 添加方法 ############################
// 1、定义c的方法
STATIC mp_obj_t lv_print(){
printf("Test Function \n");
return mp_const_none; //表示 MicroPthon 中不返回
}
// 2、转化成 Micropython 方法对象
MP_DEFINE_CONST_FUN_OBJ_0(lv_print_obj,lv_print);
STATIC mp_obj_t lv_hello(mp_obj_t name){
char * _name = mp_obj_str_get_str(name); //mp_obj_str_get_str 、 mp_obj_get_int 、 mp_obj_get_float
printf("Hello %s\n", _name);
return mp_const_none;
}
MP_DEFINE_CONST_FUN_OBJ_1(lv_hello_obj,lv_hello);
STATIC mp_obj_t lv_add(mp_obj_t a,mp_obj_t b){
int sum =0;
if(&mp_type_int != mp_obj_get_type(a)){ //判断是否为整形
//printf("type error!");
}else{
sum = mp_obj_get_int(a) + mp_obj_get_int(b);
}
return mp_obj_new_int(sum);
}
MP_DEFINE_CONST_FUN_OBJ_2(lv_add_obj,lv_add);
//多参数的方法
//可变参数的方法
STATIC mp_obj_t lv_append(size_t n_args,const mp_obj_t *args){
printf("input parameters count is %d \n",n_args);
int sum=0;
if(&mp_type_tuple == mp_obj_get_type(args[0])){
mp_obj_tuple_t *t = (mp_obj_tuple_t *)args[0];
for(int i=0; i<t->len; i++){
sum += mp_obj_get_int(t->items[i]);
}
}else if(&mp_type_array == mp_obj_get_type(args[0])){
}else{
for(int i = 0; i < n_args; i++){
if(&mp_type_int != mp_obj_get_type(args[i])){
}else{
sum += mp_obj_get_int(args[i]);
}
}
}
// for(int i = 0; i < n_args; i++){
// if(&mp_type_int != mp_obj_get_type(args[i])){
// }else{
// sum += mp_obj_get_int(args[i]);
// }
// }
return mp_obj_new_int(sum);
}
MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(lv_append_obj,2,10,lv_append); //转换后的对象-最小入参数量-最小入参数量-方法名
//1、创建模块字典(模块需要包含哪些元素)
STATIC const mp_rom_map_elem_t lvgl_globals_table[] = {
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_lvgl) }, //模块名称
// 方法定义的 3、加入到字典中
{ MP_ROM_QSTR(MP_QSTR_print), MP_ROM_PTR(&lv_print_obj) },
{ MP_ROM_QSTR(MP_QSTR_hello), MP_ROM_PTR(&lv_hello_obj) },
{ MP_ROM_QSTR(MP_QSTR_add), MP_ROM_PTR(&lv_add_obj) },
{ MP_ROM_QSTR(MP_QSTR_append), MP_ROM_PTR(&lv_append_obj) },
};
//2、将元素数组转换成字典对象
STATIC MP_DEFINE_CONST_DICT(lvgl_globals, lvgl_globals_table); //将数组类型转换成字典对象
//3、定义模块
const mp_obj_module_t mp_mod_lvgl = {
.base = { &mp_type_module }, //模块类型的指向(模块的类型恒定为 &mp_type_module)
.globals = (mp_obj_dict_t *)&lvgl_globals, //指向字典
};
//4、注册模块到系统
MP_REGISTER_MODULE(MP_QSTR_lvgl, mp_mod_lvgl);
lv_mod.h
#pragma once
#include "py/builtin.h"
#include "py/runtime.h"
#include "py/obj.h"