MicroPython: comment definir un "struct" comme en C

Bonjour, 

Je suis occupé a porter un code Arduino vers MicroPython pour le capteur magnétique BMM150 présent sur la plateforme Core de M5Stack.

Gamme M5Stack chez MCHobby

Il s'agit d'un composant I2C pour lequel il existe une bibliothèque C Arduino disponible sur le GitHub de SeeedStudio.

J'ai eu l'occasion d'y trouver la déclaration de structure en C :

struct bmm150_mag_data {
    int16_t x;
    int16_t y;
    int16_t z;
};

Qu'il faut bien évidement porter sous MicroPython.

En lecture seule?

L'option la plus élégante reste le namedtuple du module collections.
C'est là qu'il est possible d'apprécier le travaille réaliser par l'équipe de développement de MicroPython puisque que collections.namedtuple y est aussi disponible.

La structure équivalente en MicroPython est:

BMM150_Mag_Data = namedtuple( "BMM150_Mag_Data", "x y z")

Il est ensuite possible de définir une instance de la structure

>>> from collections import namedtuple
>>> BMM150_Mag_Data = namedtuple( "BMM150_Mag_Data", "x y z")
>>> m = BMM150_Mag_Data( x=2, y=13, z=50)
>>> m
BMM150_Mag_Data(x=2, y=13, z=50)
>>> m.z 
50
>>> m.z=444
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: can't set attribute

Par contre! Cela reste un Tuple, donc Immuable (impossible de changer les valeurs une fois assignée).

Pouvoir modifier la valeur des attributs

Pour modifier des valeurs, il faut utiliser une classe avec des membres. Une approche simple et efficace serait d'utiliser les slots afin de pourvoir modifier la valeur des membres. Comme c'est une classe, il est possible d'écrire de définir d'autres méthodes comme __init__(self) ou __repr__(self) pour définir des valeurs par défaut.

>>> class BMM150_Mag_Data(object):
...     __slot__ = [ "x", "y", "z" ]
... 
>>> m = BMM150_Mag_Data()
>>> m.x=10; m.y=20; m.z = 80
>>> m
<BMM150_Mag_Data object at 3ffc8b30>
>>> m.z=12
>>> m.z
12 

Voilà pour le petit billet du week-end.

Aucun commentaire