Bonjour,
J'ai une application serveur sur Arduino qui doit écrire des données pour des client Arduino.
Tout communique par Ethernet, en HTTP.
Les données ne sont pas en HTML mais dans un format binaire maison.
Tout fonctionne très bien.
Les données sont juste une liste d'octets (byte), envoyés un par un ou alors en bloc dans un Buffer (un tableau de byte, comme une chaine de caractères de longueur fixe)
Il est très efficace de stocker des buffers en PROGMEM contenant des données à envoyer au client.
Typiquement, je peux avoir en PROGMEM un buffer pour chaque "page" reçue et affichée par le client.
Bien évidemment ces pages sont "fixes", puisque stockées en PROGMEM 
Cela impose de passer par un logiciel utilitaire annexe de ma conception qui écrit ces "pages" sous forme de tableaux de bytes en PROGMEM, et qu'on insère via l'éditeur de code. J'ai fait au mieux, mon logiciel utilitaire ajoute des commentaires à coté de chaque ligne pour faciliter la compréhension et une éventuelle édition manuelle mais c'est un peu lourd.
Pour que le server soit plus facile à programmer, je devrais en tout logique écrire toute une série de fonctions.
Par exemple, une fonction DrawRectangle(X, Y, Width, Height, Color) qui va envoyer au client les fameux octets correspondant à mon format binaire.
Là ou le bas blesse, c'est que le code de cette fonction, ainsi que chaque appel de fonction me bouffe beaucoup d'octets de codes. 
Tout ça pour envoyer au client entre 5 à 9 octets seulement.
En effet, dans mon format binaire maison :
- il y a un octet qui code l'instruction (ici, DrawRectangle) et qui contient en même temps l'index de la couleur
- pour X : un octet si X<255, deux octets sinon
- pour Y : un octet si X<255, deux octets sinon
- pour Width : un octet si X<255, deux octets sinon
- pour Height : un octet si X<255, deux octets sinon
Ce que je cherche, c'est une astuce pour écrire ou générer ces octets en utilisant le moins de code possible, sans non plus que ce soit un cauchemard à écrire. 
Je pense utiliser des #define et des macro similaires à F() FlashStringHelper comme pour les chaines de caractères.
Concrètement, au lieu de faire :
client.DrawRectangle(10, 20, 100, 15, 3);
je ferais un truc du genre :
1 2 3
| #define DrawRectangle 65
...
client.write(F({DrawRectangle+3,Int9(10),Int9(20),Int9(100),Int9(15),})); |
Le code binaire sur un octet correspondant à DrawRectangle de couleur 3 est égal à 65+3
Int9(X) doit être une macro (je ne sais pas comment faire) qui génère un nombre égal à X si X<255 et sinon, qui génère DEUX nombre, le premier égal à 255, le deuxième égal à X-255
Le mieux, ça serait d'avoir une macro client.DrawRectangle(X, Y, Width, Height, Color) qui, au moment de la compilation, me génère le client.write(F({.,.,.,.,.,.})) qui va bien.
=> j'ai un code qui une fois compilé ne bouffe pas trop de ROM
=> j'ai un code qui reste facile à écrire et à lire
Mais je ne sais pas comment m'y prendre.
Car vous le voyez, mon format binaire est assez compact, 5 à 9 octets suffisent pour dessiner un rectangle, avec 500 octets on peut dessiner de nombreuses formes et textes sur l'écran du client. Mais si je créé plein de petites fonctions du style DrawRectangle(X, Y, Width, Height, Color) et qu'ensuite je les appelle pour dessiner chaque chose, le serveur risque d'utiliser 10 Ko de code juste pour écrire 500 octets...
Tout cela peut sembler inutilement compliqué...
D'autant que pour le contenu "dynamique", il faudra que j'utilise des fonctions "normales"
Mais l'expérience m'a montré quand dans une interface homme machine, il y a beaucoup de choses affichées qui sont fixes, et très peu d'affichage variable.
Regardez par exemple les fenêtres des logiciels que vous utilisez, il y a beaucoup d'éléments "fixes" et assez peu d'éléments modifiables (en dehors des éditeurs de texte évidemment
)
A bientôt
Partager