mardi 20 août 2019

Serialisation JSON, essayons d'en faire une librairie

Mon petit code de sérialisation en JSON du behavior tree m'a finalement donné l'intérêt de tester la création d'une librairie. J'ai donc commencé le projet JSONSerialWriter qui j'espère pourra devenir une librairie supportée par l'IDE sur plusieurs architectures. Il y a sûrement d'autre librairie JSON me direz-vous. Bin kin, y a en pas mal en fait et ArduinoJSON est excellente, mais elles sont toutes un peu trop gourmante en mémoire à mon goût. Comme la sérialisation de graph est assez verbose et que je veux utiliser le moins de RAM possible, tout spécialement sur les Uno/Nano/Micro,  je crois qu'il y a une niche pour ce projet. Il n'est pas exclus d'utiliser plus d'une librairie sdans un même projet aussi ( ici, ça ne sérialise, ça ne parse pas).

Mais sincèrement, le but est de se faire les dents à la création d'une librairie.

Que sont les prérequis pour être inclus dans le "library manager"?


Voici sommairement ce qui est nécessaire pour qu'une librarie soit incluse dans le manager de l'IDE d'Arduino.
  • Doit être héberger sur un site de gestion de source tel github, gitlab et bitbucket.
  • Doit avoir à la racine du repo les fichiers qui seront installer sous Arduino/librairies/[nomdelalibrairie]
  • Le fichier librairy,property doit être présent
  • La numéro de version est sous la forme major.minor.revision (semver)
  • Le fichier README.adoc doit décrire la librairie
  • Le fichier keywords doit définir les mots clés à "highliter" dans l'IDE
  • Le fichier .development ne doit pas être présent ( mais utile pour le dévelopment )
  • Le code source doit être accessible à partir de la racine, quoi que les dernières version supporte le répertoire /src
  • Les examples sont contenus dans le sous-répertoire /examples
  • Si supporté, utiliser le mécanisme de "release" pour spécifier les nouvelles versions
  • Écrire dans le forum d'Arduino pour annoncer la nouvelle librairie.

 Une fois la librairie inscrite, un sytème automatisé monitore le repo et mets à jours assez rapidement les nouvelles versions ( peut prendre quelques heures ).

Où trouver l'information complète pour le support du dévelopment de librairies



Fonctionnalités et utilisation de la librairie


Une seule classe est accessible via la libraire et c'est JSONSerialWriter. Les méthodes sont relativement évidentes dans leur fonctionnalité. Puisque c'est un sérializer qui écrit de manière synchrone dans le stream, l'ordre d'appel est important. C'est aussi à l'utilisateur de gérer la hiérarchie des objets sauvegardés. Par défaut, c'est l'objet Serial qui est assigné comme stream de sorti. Il est cependant possible d'assigner tout autre classe dérivant de Print pour la sérialisation.

Comme le but est d'être le moins gourmand en mémoire, la classe ne contient que trois booléens, un int et un pointeur vers le Print a utiliser. Très probable que plus tard dans le développement, le tout soit encore plus compact. Puisque les appels ne garde pas vraiment d'états ni de buffer, c'est tout aussi compact lors de l'exécution.


JSONSerialWriter writer;
writer.startWriter();
writer.writeValue( "temperature", 10 );
writer.writeValue( F("humidity"), 22.87f );
writer.writeValue( F("winddirection"), F("North"));
writer.closeWriter();

Le résultat èa la sorti sera:

{"temperature":10,"humidity":22.8700,"winddirection":"North"}


À noter que l'utliliation des string en flash F(str) est important pour sauvegarder de la mémoire.

Cédule de développement

Bien qu'il puisse y avoir pas mal de fonctionnalités utilitaires à cette librairie, j'espère faire un release rapidement. J'imagine qu'il est possible de sortir une version avant la 1.0.0 . Si c'est le cas, tant que le tout est fonctionnel, compilable sur AVR et megaAVR, ce sera parfait comme ça.

Dans les ajouts qui viendront par la suite, je prévois:

  • Support pour écrire directement dans le stream.
  • Permettre d'écrire la valeur de chaine de caractère en plusieurs appels.
  • Compiler pour les architecture sam et samd
  • Quelques méthodes utilitaires pour facilité la vie avec les arrays.
  • Optimisation 



Aucun commentaire:

Enregistrer un commentaire