jickster wrote: ↑Thu Sep 27, 2018 5:12 pm
Python:
Code: Select all
mp_obj_t get_data()
{
// somewhere data_list_t * first is declared
data_list_t * curr = first;
qstr prop_name;
// create a list
mp_obj_list_t * mylist = mp_type_list.make_new(NULL, 0, 0, NULL)
// contain the payload data
mp_obj_t mp_data;
// simplest way to get list[x].field functionality
mp_obj_module_t * mod;
while(curr != NULL)
{
prop_name = qstr_from_str(curr->prop_name);
switch(curr->data_type)
{
case INT8:
mp_data = MP_OBJ_NEW_SMALL_INT(curr->data.int8_val);
break;
case UINT8:
mp_data = MP_OBJ_NEW_SMALL_INT(curr->data.uint8_val);
break;
case INT16:
mp_data = MP_OBJ_NEW_SMALL_INT(curr->data.int16_val);
break;
case UINT16:
mp_data = MP_OBJ_NEW_SMALL_INT(curr->data.uint16_val);
break;
case INT32:
mp_data = MP_OBJ_NEW_SMALL_INT(curr->data.int32_val);
break;
case UINT32:
mp_data = MP_OBJ_NEW_SMALL_INT(curr->data.uint32_val);
break;
case LONG:
mp_data = MP_OBJ_NEW_SMALL_INT(curr->data.long_val);
break;
case FLOAT:
mp_data = MP_OBJ_NEW_SMALL_INT(curr->data.float_val);
break;
case STRING:
mp_data = MP_OBJ_NEW_QSTR(qstr_from_str(curr->data.string_val));
break;
}
mod = m_new_obj(mp_obj_module_t);
mod->base.type = &mp_type_module;
mod->globals = MP_OBJ_TO_PTR(mp_obj_new_dict(2));
mp_obj_dict_store(MP_OBJ_FROM_PTR(mod->globals), MP_OBJ_NEW_QSTR(MP_QSTR_name), MP_OBJ_NEW_QSTR(prop_name));
mp_obj_dict_store(MP_OBJ_FROM_PTR(mod->globals), MP_OBJ_NEW_QSTR(MP_QSTR_val), mp_data);
mylist->append(mod);
curr = curr->next;
}
return (mp_obj_t) my_list;
}
Thanks a lot I was able to do the similar thing in micropython although I don't think it was the best solution. I did not know I could do the conversion first in c and return the dictionary. This should help a lot.
Following is what I did:
Code: Select all
import uctypes
import invmodule
desc = {
'nameaddr': uctypes.UINT32 | 0,
'nextaddr': uctypes.UINT32 | 8,
'datatype': uctypes.UINT8 | 12,
'namelength': uctypes.UINT8 | 13,
'vallength': uctypes.UINT8 | 14,
}
def getdict(head_addr):
device_dict = {}
node_addr = head_addr
node = 0
while(node_addr != 0):
datatype = uctypes.struct(node_addr, {'type': uctypes.UINT8 | 12,}, uctypes.LITTLE_ENDIAN)
if datatype.type == 0:
desc['data'] = uctypes.INT8 | 4
node = uctypes.struct(node_addr, desc, uctypes.LITTLE_ENDIAN)
propName = str(uctypes.bytearray_at(node.nameaddr, node.namelength), 'utf-8', 'ignore')
device_dict[propName] = node.data
elif datatype.type == 1:
desc['data'] = uctypes.UINT8 | 4
node = uctypes.struct(node_addr, desc, uctypes.LITTLE_ENDIAN)
propName = str(uctypes.bytearray_at(node.nameaddr, node.namelength), 'utf-8', 'ignore')
device_dict[propName] = node.data
elif datatype.type == 2:
desc['data'] = uctypes.INT16 | 4
node = uctypes.struct(node_addr, desc, uctypes.LITTLE_ENDIAN)
propName = str(uctypes.bytearray_at(node.nameaddr, node.namelength), 'utf-8', 'ignore')
device_dict[propName] = node.data
elif datatype.type == 3:
desc['data'] = uctypes.UINT16 | 4
node = uctypes.struct(node_addr, desc, uctypes.LITTLE_ENDIAN)
propName = str(uctypes.bytearray_at(node.nameaddr, node.namelength), 'utf-8', 'ignore')
device_dict[propName] = node.data
elif datatype.type == 4:
desc['data'] = uctypes.INT32 | 4
node = uctypes.struct(node_addr, desc, uctypes.LITTLE_ENDIAN)
propName = str(uctypes.bytearray_at(node.nameaddr, node.namelength), 'utf-8', 'ignore')
device_dict[propName] = node.data
elif datatype.type == 5:
desc['data'] = uctypes.UINT32 | 4
node = uctypes.struct(node_addr, desc, uctypes.LITTLE_ENDIAN)
propName = str(uctypes.bytearray_at(node.nameaddr, node.namelength), 'utf-8', 'ignore')
device_dict[propName] = node.data
elif datatype.type == 6:
desc['data'] = uctypes.FLOAT32 | 4
node = uctypes.struct(node_addr, desc, uctypes.LITTLE_ENDIAN)
propName = str(uctypes.bytearray_at(node.nameaddr, node.namelength), 'utf-8', 'ignore')
device_dict[propName] = node.data
elif datatype.type == 7:
desc['data'] = uctypes.UINT32 | 4
node = uctypes.struct(node_addr, desc, uctypes.LITTLE_ENDIAN)
propName = str(uctypes.bytearray_at(node.nameaddr, node.namelength), 'utf-8', 'ignore')
propVal = str(uctypes.bytearray_at(node.data, node.vallength), 'utf-8', 'ignore')
device_dict[propName] = propVal
node_addr = node.nextaddr
return device_dict