ESP-IDF Micro python学习笔记2 | 自定义模块

一、准备工作 

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"

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
如果你想在ESP-IDF项目中添加自定义组件,有以下几个步骤: 1. 创建自定义组件文件夹:在ESP-IDF项目的`components`目录下创建一个新的文件夹,用于存放自定义组件的代码和头文件。你可以为该文件夹取一个有意义的名称,以便在项目中使用。 2. 添加组件源代码和头文件:将自定义组件的源代码和头文件放入新创建的文件夹中。确保这些文件是与ESP32芯片兼容的,并且符合ESP-IDF编程规范。 3. 创建组件CMakeLists.txt文件:在自定义组件文件夹中创建一个CMakeLists.txt文件,用于描述组件的配置信息。其中包括组件的源文件、头文件和依赖项等。示例内容如下: ``` idf_component_register(SRCS "component_source_file1.c" "component_source_file2.c" INCLUDE_DIRS "include" REQUIRES dependency1 dependency2 ) ``` 确保将"component_source_file1.c"和"component_source_file2.c"替换为你组件的实际源文件名称,将"include"替换为你组件的头文件所在的文件夹名称,将"dependency1"和"dependency2"替换为你组件所依赖的其他组件的名称。 4. 在主项目中引用自定义组件:在主项目的CMakeLists.txt文件中,添加自定义组件的引用。示例代码如下: ``` set(EXTRA_COMPONENT_DIRS "path_to_custom_component_folder" "path_to_another_custom_component_folder" ) ``` 将"path_to_custom_component_folder"和"path_to_another_custom_component_folder"替换为你自定义组件所在的文件夹路径。 5. 构建和编译项目:在完成以上步骤后,重新构建和编译ESP-IDF项目。确保自定义组件被成功添加并正确引用。 如此,你就成功地将自定义组件添加ESP-IDF项目中啦!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值