Hello,

Pour m'amuser, je fais joujou avec du C++ sur un MCU 16 bits avec 16k bytes de ROM et 500 bytes de RAM. En ce moment, je g�re un LCD avec deux lignes de 16 caract�res, comme ceux g�rer par CrystalLiquid d'Arduino. Ces �crans ont deux modes, un avec une interface 8 bits, l'autre avec une interface 4 bits. J'ai commenc� par la version 8 bits et je suis arriv� � une classe LCD donc le listing des fonctions peut se r�sumer � �a :
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
    void init();
 
    void writeCommand(uint8_t command);
    void writeData(uint8_t data);
 
    void setRegisterSelect(RegisterSelect selection);
    void pulseEnable();
    void write(uint8_t value);
init() est une succession d'appels � writeCommand(), c'est une fonction d'assez haut niveau. writeCommand() et writeData() sont tr�s semblables, sont des fonctions de niveau interm�diaire, et elles font toutes les deux appel � setRegisterSelect(), pulseEnable() et write(). Ces 3 derni�res fonctions sont des fonctions de bas niveau, en faisant bouger des GPIO sur MCU.

J'aimerais maintenant passer en mode 4 bits, ce qui me permet d'�conomiser 4 GPIOs et sur un MCU avec 20 pins, c'est �norme.

Mon id�e �tait de passer init() en param�tre du constructeur du LCD, mais il fait appel � des m�thodes de la classe, ce n'est pas pratique. Comme il n'existe que 2 initialisations possibles, je me suis dit que je pouvais g�rer �a facilement avec un constructeur prenant en param�tre le mode (4 ou 8 bits) et fait un simple if / else dans init().

write() �crit 8 bits (sur 8 GPIOs d'un coup) et pour g�rer le mode 4 bits, il me faut aussi une fonction write4bits(), mais �a ne change pas fondamentalement mon probl�me que je vais enfin vous exposer

Mon probl�me est que j'aimerai ben extraire ces 3 (ou 4) fonctions de bas niveau de ma classe LCD puisque leur impl�mentation varie consid�rablement en fonction de la mani�re donc l'�cran est raccord� au MCU. J'ai un temps pens� � extraire �a dans une classe LCDLowLevel et donner � manger � LCD une r�f�rence vers une instance de LCDLowLevel. Sauf que d�s que j'utilise de la virtualit�, le linker me dit que je n'ai pas assez de place en ROM. Visiblement, la virtualit� semble co�ter 15k...

Une classe LCD template parait tentant, mais comme tout template, je ne peux plus passer de LCD en param�tre d'une fonction, puisque ce sera LCD<truc>...

Ma derni�re solution est de ne pas impl�menter ces 3 (ou 4) fonctions mais de laisser leurs d�clarations dans ma classe et dans chaque projet o� j'utiliserai cette classe / biblioth�que LCD, j'impl�menterai diff�remment ces fonctions.Ce n'est pas tr�s C++esque, mais �a marche bien ^^

Au final, je me demandais si vous aviez d'autres id�es sur la questions

M�rchi !
Bktero