C语言开发MicroPython模块(向module添加type)

  MicroPython向module添加type的方法,以及向type添加function的方法都是按照定义好的固定框架进行添加。
  module添加type的代码格式如下:

#include "stdint.h"
#include "stdio.h"
#include "py/obj.h"
#include "py/runtime.h"
#include "driver/gpio.h"
#include "key.h"
//#pragma pack (1)
typedef struct _key_obj_t
{
    mp_obj_base_t base;   
}key_obj_t;
STATIC key_obj_t    My_key_obj;

STATIC mp_obj_t key_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args)
{
    mp_arg_check_num(n_args, n_kw, 0, 0, true);   //检查参数个数
	key_obj_t *self = (key_obj_t*)&My_key_obj;
	if (self->base.type == NULL)
	{
		self->base.type = &key_type;
	}
	return MP_OBJ_FROM_PTR(self);
}

mp_obj_t mp_get_key_state(mp_obj_t self_in) 
{ 	
	//key_obj_t *self = self_in;	
	uint8_t key=0;
	key=Get_Key_State();
	return mp_obj_new_int(key);  
}

mp_obj_t mp_set_key_state(mp_obj_t self_in,mp_obj_t state) 
{ 	
	//key_obj_t *self = self_in;	
	uint8_t State = mp_obj_get_int(state);
	Set_Key_State(State);
	return mp_const_none;
}

STATIC MP_DEFINE_CONST_FUN_OBJ_1(get_key_state_obj, mp_get_key_state);  
STATIC MP_DEFINE_CONST_FUN_OBJ_2(set_key_state_obj, mp_set_key_state);

STATIC const mp_rom_map_elem_t key_dict_table[] = 
{
    { MP_ROM_QSTR(MP_QSTR_Get_key), MP_ROM_PTR(&get_key_state_obj) }, 
	{ MP_ROM_QSTR(MP_QSTR_Set_key), MP_ROM_PTR(&set_key_state_obj) },  
};
STATIC MP_DEFINE_CONST_DICT(key_locals_dict,key_dict_table);

const mp_obj_type_t key_type = {
    .base={ &mp_type_type }, 
    .name = MP_QSTR_key,
    .make_new=key_make_new,   
    .locals_dict = (mp_obj_dict_t*)&key_locals_dict,
};


  type类型在python中是类, 对应到c语言中要有一个已经配空间的结构体,就是用来表示对象的结构体。表示对象的结构体要包含一个mp_obj_base_t类型的元素,来表明它是一个对象。
  关于MicroPython对象的相关解析可以参考C语言开发MicroPython模块(向module添加function)

  在第8行进行了结构体的声明。
  第12行进行该结构体的定义,从而经配空间,创建对象。
  第14行创建make_new函数,type对象在创建时和module不一样就是,它必须把定义make_new。
  第16行检查make_new的参数个数。
  第17行就是将make_new要创建的对象通过指针来指向,我们之前创建的对象。注意:在此处也可以重新创建对象,而不用必须用指针指向之前的对象。但是在此处先行创建对象,然后用指针指向的好处是:在Python层,如果多出定义,多出引用的话,不会出现错误,而且不同的地方操作都是指向这个对象。从而减小上层应用的难度。
  第22行,make_new返回创建的对象。
  第25行和33行创建type的 function。
  第41行和第42行,创建function对象
  第44行构建function对象数组。
  第45行创建包含function对象数组的字典对象
  第51行,创建type对象。
  type对象创建完成之后,就可以像module添加function的方法一样,将type添加到module里面。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值