Parlons Arduino > Bibliothèques

Bibliothèque Accessories et Expander SX1509

<< < (2/3) > >>

Thierry:
C'est pas mal du tout, et ça a le (grand) mérite de fonctionner.
Mais, parce qu'il y a toujours un mais, ça gagnerai à être mis à la mode objet. Je n'aime pas les switch, ils dénotent un manque de structure. Alors plutôt que de mettre tout le code d'un expander particulier dans ton source, qu'il faudra modifier à chaque nouvel expander, il faudrait laisser une classe de base PortExpander, peut être même abstraite (virtuelle pure) et la dériver en PortExpanderSX1509 avec son fonctionnement à lui. Il faudrait faire pareil dans le Port : lui demander de lancer le digitalWrite() de l'expander, et lui saura ce qu'il doit faire...

J'ai déjà commencer à coder quelque chose, mais je vais m'inspirer de ce que tu as fait et voir comment améliorer, à moins que tu ne te sentes d'attaque pour affiner le code...

En tout cas, c'est du bon boulot.

golgoth1009:
Merci !
Je peux faire l'héritage, effectivement, c'est plus logique et plus simple à l'avenir.
Normalement, dans la classe Port, cela devrait être transparent, elle appelle déjà les fonctions génériques statiques digitalWrite et analog de la classe Expander.
Par contre, je sèche pour l'émulateur qui redéfinit les méthodes digital et analog.
Je regarde ça ce weekend.

golgoth1009:
Bonjour Thierry,

J'ai fait les modifications avec l'héritage.
J'ai découvert un bogue lié à la façon dont j'ai intégré l'expander.
Pour ne pas avoir d'impact dans les classes héritant de Port, je démultiplexe à chaque appel de la fonction MovePin().
Mais à la différence de la fonction beginPin(), le pin a pu être modifié si c'est un digital pour utiliser la valeur GPIO.
Pour corriger cela, j'ai ajouté un test supplémentaire dans MovePin():

--- Code: ---unsigned long inExpander = 0;
if (GPIO_to_Arduino_pin((GPIO_pin_t)inPin) == -1)
inExpander = inPin / 100;
--- Fin du code ---
La question que je me pose:
Est-ce que la valeur multiplexée peut être en conflit avec le pin GPIO (ex: 103 ou 515 peut-il être une pin GPIO) ?
Si non, la correction est suffisante.
Si oui, il faut alors modifier les classes héritant de port pour sauvegarder l'expander id et le passer en paramètre de MovePin().
J'ai testé ma mdif sur arduino uno avec des appels à l'expander et aux I/O de la carte.


golgoth1009:
Bonjour,

Une version revisitée où j'ai retiré l'enum ExpanderType.
Il faut faire le begin en static directement sur la classe de l'expander voulue. Pour calquer au mieux à ce que tu fais pour les autres classes
De cette manière, l'ajout d'un nouveau type d'epxander ne devrait pas demander de modif à la classe de base ni à l'enum.

--- Code: ---  int error = 0;
  error = PortExpanderSX1509::begin(1, SX1509_ADDRESS );
  if (error == 0)
    Serial.println(F("Expander issue"));

--- Fin du code ---

Thierry:
Bonjour

Après quelques semaines de développement, je viens de pousser sur le Locogit une nouvelle version 1.2.0 d'Accessories intégrant les évolutions de golgoth1009, et des améliorations de mon crû sur le même sujet.

La classe PortExpander a été ajoutée sur la base du travail de golgoth1009, avec quelques amendements pour mieux coller à l'esprit de la bibliothèque, et avec une doc.
Le classe dérivée de PortExpander pour le SX1509, PortExpanderSX1509 (on a travaillé dur pour un nom original...), a été ajoutée. Elle gère les pins digitales et analogiques (pwm). Par contre il n'y a pas d'accès vers les fonctions spéciales de la bibliothèque originale SX1509 pour la gestion des Leds ou d'un clavier matriciel...
J'y ai ajouté une autre classe dérivée PortExpander74HC595 pour le shift register éponyme. Ne sont considérées que les broches en sortie. Le chaînage de plusieurs modules est reconnu. Par contre je n'ai testé qu'avec mon simulateur (je prépare un message sur le fil correspondant à ce sujet), je n'ai pas essayé sur un véritable montage...

En me relisant, je réalise que je n'ai pas crédité golgoth1009 pour ses idées et son travail dans les readme et les sources d'Accessories, ce qui me parait tout à fait légitime. Ce sera fait avec la prochaine version.

Navigation

[0] Index des messages

[#] Page suivante

[*] Page précédente

Utiliser la version classique