上一篇已经创建了一个machine的模块并实现了函数,按照这个方式可以将引脚、串口、定时器等所有外设的功能都添加到这个模块里面。但是,这么多的外设,每个外设还有不少的操作函数,全部一起加到模块里,使用起来非常的不方便。MicroPython支持将一个class添加到模块里,因此我们可以将每个外设设计成一个单独的class,外设的操作作为class的method,这样添加到模块里,调用时就比较便捷了。本文以LED为例进行说明。

classes

跟模块类似,类也是一个c结构体,只是跟模块的字段不完全一样而已。

STATIC const mp_rom_map_elem_t led_locals_dict_table[] = {

};

STATIC MP_DEFINE_CONST_DICT(led_locals_dict, led_locals_dict_table);

const mp_obj_type_t pyb_led_type = {

{&mp_type_type},

.name = MP_QSTR_LED,

.print = led_obj_print,

.make_new = led_obj_make_new,

.locals_dict = (mp_obj_dict_t *)&led_locals_dict,

};

可以看到,一个类需要两个函数:make_new用于构造类并分配类需要的所有内存空间,print用于打印该类的对象。

// this is the actual C-structure for our new object

typedef struct _pyb_led_obj_t

{

// base represents some basic information, like type

mp_obj_base_t base;

// a member created by us

mp_uint_t led_id;

} pyb_led_obj_t;

STATIC const pyb_led_obj_t pyb_led_obj[] = {

{{&pyb_led_type}, PYB_LED_TOP_LEFT_1},

{{&pyb_led_type}, PYB_LED_TOP_RIGHT_1},

{{&pyb_led_type}, PYB_LED_TOP_RIGHT_2},

{{&pyb_led_type}, PYB_LED_TOP_LEFT_2},

};

首先定义一个LED的对象结构,里面包含了类的数据和一个额外的字段。然后定义了4个静态的LED对象。接下来创建print函数用于打印这些对象:

void led_obj_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind)

{

pyb_led_obj_t *self = MP_OBJ_TO_PTR(self_in);

mp_printf(print, "LED(%u)", self->led_id);

}

还有构造函数

STATIC mp_obj_t led_obj_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args)

{

// check arguments

mp_arg_check_num(n_args, n_kw, 1, 1, false);

// get led number

mp_int_t led_id = mp_obj_get_int(args[0]);

// check led number

if (!(1 <= led_id && led_id <= NUM_LEDS))

{

nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError, "LED(%d) doesn't exist", led_id));

}

// return static led object

return MP_OBJ_FROM_PTR(&pyb_led_obj[led_id - 1]);

}

到这里一个类所需的基本元素就都具备了,紧接着实现类的方法。

methods

这里实现了LED的3个方法,on、off和toggle。

/// Turn the LED on.

mp_obj_t led_obj_on(mp_obj_t self_in)

{

pyb_led_obj_t *self = MP_OBJ_TO_PTR(self_in);

Board_LED_Set(self->led_id, true);

return mp_const_none;

}

STATIC MP_DEFINE_CONST_FUN_OBJ_1(led_obj_on_obj, led_obj_on);

/// \method off()

/// Turn the LED off.

mp_obj_t led_obj_off(mp_obj_t self_in)

{

pyb_led_obj_t *self = MP_OBJ_TO_PTR(self_in);

Board_LED_Set(self->led_id, false);

return mp_const_none;

}

STATIC MP_DEFINE_CONST_FUN_OBJ_1(led_obj_off_obj, led_obj_off);

/// \method toggle()

/// Toggle the LED between on and off.

mp_obj_t led_obj_toggle(mp_obj_t self_in)

{

pyb_led_obj_t *self = MP_OBJ_TO_PTR(self_in);

Board_LED_Toggle(self->led_id);

return mp_const_none;

}

STATIC MP_DEFINE_CONST_FUN_OBJ_1(led_obj_toggle_obj, led_obj_toggle);

将实现好的方法添加到类字典里,同时添加的还有一些类常量。

STATIC const mp_rom_map_elem_t led_locals_dict_table[] = {

// instance methods

{MP_ROM_QSTR(MP_QSTR_on), MP_ROM_PTR(&led_obj_on_obj)},

{MP_ROM_QSTR(MP_QSTR_off), MP_ROM_PTR(&led_obj_off_obj)},

{MP_ROM_QSTR(MP_QSTR_toggle), MP_ROM_PTR(&led_obj_toggle_obj)},

// class constants

{MP_ROM_QSTR(MP_QSTR_TOP_LEFT_1), MP_ROM_INT(PYB_LED_TOP_LEFT_1)},

{MP_ROM_QSTR(MP_QSTR_TOP_RIGHT_1), MP_ROM_INT(PYB_LED_TOP_RIGHT_1)},

{MP_ROM_QSTR(MP_QSTR_TOP_RIGHT_2), MP_ROM_INT(PYB_LED_TOP_RIGHT_2)},

{MP_ROM_QSTR(MP_QSTR_TOP_LEFT_2), MP_ROM_INT(PYB_LED_TOP_LEFT_2)},

};

将类添加到模块

上面已经完成了一个完整的类,想要能够访问,还需要将这个类添加到模块中。注意:不要忘了在qstrdefsport.h中定义所有的QSTR名字,不然编译报错!!!

STATIC const mp_rom_map_elem_t machine_module_globals_table[] = {

{MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_machine)},

{MP_ROM_QSTR(MP_QSTR_reset), MP_ROM_PTR(&machine_reset_obj)},

{MP_ROM_QSTR(MP_QSTR_freq), MP_ROM_PTR(&machine_freq_obj)},

{MP_ROM_QSTR(MP_QSTR_LED), MP_ROM_PTR(&pyb_led_type)},

};

使用已添加的method

import machine

led = machine.LED(machine.LED.TOP_LEFT_1)

led.on()

micropython 常量_MicroPython添加Module(二)相关推荐

  1. micropython 模块_MicroPython添加Module(一)

    前面已经将MicroPython移植到了LPC1788,其中的一些功能已经可以使用.但是片上外设.板载外设还不能访问,需要我们去实现,然后才能在MicroPython中访问.官方文档MicroPyth ...

  2. C语言开发MicroPython模块(添加module)

      MicroPython添加模块框架模式相对简单,只需要按照定义好的固定框架就可以添加模块(module). 一.向固件里面添加module 1.1.编写mymodule.c文件   在ports/ ...

  3. HarmonyOS之在工程中导入Sample工程和添加Module

    一.导入 Sample 工程 ① Sample 说明 DevEco Studio 支持 HarmonyOS Sample 工程的导入功能,通过对接 Gitee 开源社区中的 Sample 资源,可一键 ...

  4. 怎样给CSDN博客添加微信二维码

    在使用CSDN的过程中,看到一些大佬的微信公众号二维码,扫码很方便关注,作为一般的用户是没有这个功能的,那么是怎么实现的呢?这里以添加微信二维码为例进行举例分析: (1)首先需要将自己的微信二维码上传 ...

  5. CSDN 添加微信二维码

    添加微信二维码到任意一篇博客 复制二维码链接地址 替换到img src 段中 <ul class="panel_head"> <span>感悟</sp ...

  6. 中文错别字检查添加了二维码入口

    中文错别字检查添加了二维码入口 最近在研究了一下有特色 二维码的生成, 于是借用到了中文错别字检查页面上了, 就是下面的这幅图片,怎么样,图中的 CBZ 三个字母还是清晰可以辨认的吧? 还准备把更多的 ...

  7. Android中添加Module依赖注意问题

    在开发中经常会以添加Module依赖的方式拓展其他的模块,这样的方式给我们的开发提供了很大的方便,但是也增加了编译的时间成本.但是直接在build.gradle中添加Module依赖往往会遇到Mani ...

  8. BufferedImage 将照片logo添加到二维码中间

    1. /*** 将照片logo添加到二维码中间** @param image 生成的二维码照片对象* @param imagePath 照片保存路径* @param logoPath logo照片路径 ...

  9. web前端知识集合——javascript基础篇之常量和变量(二)

    3. 变量和常量: 1.1 变量的声明: js三种方式声明变量,声明不赋值时,默认值为underfined. (1)var声明:var name='Ace',同时声明多个变量var a=1,b=2,c ...

最新文章

  1. 被拒稿、被否定:读博五年间都没有发 paper 是一种怎样的体验?
  2. GetDiskFreeSpace 和 GetDiskFreeSpaceEx
  3. 前端须知的 Cookie 知识小结
  4. python画樱桃小丸子_每天坚持画画|简笔画练习“樱桃小丸子”
  5. websocket中发生数据丢失_获取使用关闭代码1006关闭websocket的原因
  6. 干干净净用java_十四步 干干净净卸载Oracle
  7. mac新建react脚手架
  8. 《算法图解》第二章笔记与课后练习_选择排序算法
  9. Kaggle数据竞赛——伪标签的使用
  10. Android省电妙招
  11. 在Visual Studio 2005中调试SQL Server 2005的存储过程 (转)
  12. TransCAD实用技术梗概
  13. 四核网络机顶盒芯片局势分析(开放市场):rk3128将会成为四核主流
  14. javascript history对象详解
  15. 一个应届毕业生的七次 悲惨 求职经历
  16. VS2017应用在XP系统上运行
  17. 2019 年美团点评高级 Android 开发寒冬跳槽涨薪经验掏心分享
  18. 2023团体程序设计天梯赛--正式赛
  19. 蓝牙学习五(广播包分析wireshark)
  20. 测试颜色度的软件是什么情况,分光测色仪的测色应用以及注意事项

热门文章

  1. linux系统连接不上wifi
  2. QCC51XX---如何修改MDE的主题
  3. phpcms上传图片去除水印
  4. unity.生成表示地图信息的二维数组_Unity3D 中生成任意形状3D Texture amp; 体积云...
  5. Java识别获取pdf中文字信息(此方法任意pdf的信息都可以拿到)
  6. npm ERR! Could not install from “Files\nodejs\node_cache\_npx\10184“ as it does not contain a packag
  7. 工厂如何实现无线wifi短信验证登录?工厂上网实名认证系统
  8. H264 Annex B 与 AVCC的区别
  9. PHP赛事贝格尔编排法--双循环
  10. 论文理解:“Designing and training of a dual CNN for image denoising“