Implémenter une sauvegarde des paramètres de respiration sur mémoire Flash #36
Labels
enhancement
New feature or request
good first issue
Good for newcomers
help wanted
Extra attention is needed
Il faut intégrer l'implémentation des deux fonctions déclarées dans
Controller/C_Controller/lowlevel/include/lowlevel.h
Line 22 in c7a69c7
Dans le fichier :
https://github.com/Recovid/Controller/blob/master/C_Controller/lowlevel/stm32f303/flash.c
De sorte que le code de ihm_communication.c puisse lancer la sauvegarde asynchrone des paramètres validés. Cette fonction sera appelée en phase expiration pour ne pas perturber le driver moteur qui fonctionne en DMA.
Le fichier attaché implémente la fonction mais il faut encore l'intégrer.
De Hugo Van Reeth :
Le fichier à regarder est "Flash_save.c/h", dans lequel on trouve une fonction de Save et une fonction de Restore des paramètres. Il est plus simple d'écrire tous les paramètres d'un coup car il faut faire un erase de Flash avant écriture.
Quelques détails :
La structure de settings suivante n'existe pas dans le code (les paramètres individuels sont encapsulés dans ihm_communication.c) :
typedef struct attribute ((aligned(4))){
int version; // should always be first, since we use a pointer to this for union
int setting_FR_pm;
int setting_VT_mL;
int setting_PEP_cmH2O;
int setting_Vmax_Lpm;
int setting_EoI_ratio;
int setting_Pmax_cmH2O;
int setting_Pmin_cmH2O;
int setting_VTmin_mL;
int setting_FRmin_pm;
int setting_VMmin_Lm;
int magic; // usefull to check that all settings were written until the end
int crc; // should always be the last thing to write in Flash
} Settings_t;
J'ai donc rajouté par rapport aux settings de base
• Les fonctions de lecture/écriture sont :
int Save_Settings(Settings_t* settings, int pageAddress);
int Restore_Settings(Settings_t* settings, int pageAddress);
Ces fonctions gèrent les erase de flash, les lecture/ecriture, et les calculs CRC. Il peut être intéressant de rajouter une vérification des valeurs des settings à postériori (si ils sont dans une fourchette cohérente, ...)
• Pour les lectures/ecritures en Flash, plutot que de faire paramètre par paramètre, je copie directement le contenu mémoire de la structure complète en Flash sans me soucier du type de chaque setting. Avec cette mécanique, on peut rajouter/enlever des paramètres (de n'importe quel type int, float, char...) dans la structure sans avoir à retoucher les fonctions de lecture/ecriture Flash. C'est plus simple que d'écrire un par un les paramètres, qui pourraient avoir des types différents.
Par contre, il faut toujours que la version soit en premier dans la structure car je fais pointer mes pointeurs d'écriture dessus.
• J'écris à la derniere page de la Flash (addresse 0x0807F800). J'ai modifié le .ld pour enlever cette page de la mémoire programme.
• Le fichier main.c permet de tester ça :
-> Restore des paramètres au démarrage de la carte
-> Si appui court sur le bouton de la Nucleo => ecriture de données random dans la strcture, et sauvegarde en Flash
-> Si appui long (>1s) sur le bouton de la Nucleo => ecriture de valeurs par défaut dans la strcture, et sauvegarde en Flash
The text was updated successfully, but these errors were encountered: