Bonjour à tous,
J'ai classe Config qui est chargée de sauvegarder des informations de configuration pour mon application c++ sur Raspberry.
J'ai une méthode saveParam qui permet de choisir la nouvelle donnée à sauvegarder dans le fichier et une fonction getParam qui permet de lire la donnée que je lui demande.
Le fichier en question est structurée de la façon suivante :
7 données consécutives codées chacune sur un octet, suivit par une donnée codée sur 4 octets.
Ce dernier paramètre codé sur 4 octets contient le temps total pendant lequel mon tube fluo est resté allumé. Donc en fait je surveille l'état de la broche qui permet de contrôler l'éclairage de mon système grâce à une interruption.
Voici la fonction d'interruption en question :
A chaque fois que j'éteins la lumière (front descendant sur la broche surveillée), j'arrête le chrono et je stock le nouveau nombre d'heure dans le fichier avec Config::saveParam.Code:void Eclairage::chronoEclairageISR() { using namespace std; if(digitalRead(PIN_ECLAIRAGE) == HIGH) { _lastTime = chrono::system_clock::now(); } else { //quand on éteint l'éclairage, on calcule pendant combien de temps il a été allumé auto now = chrono::system_clock::now(); auto diff = chrono::duration_cast<chrono::minutes>(now - _lastTime).count(); Config config; const int tempsEclairage = config.getParam(Config::PARAM::TEMPS_ECLAIRAGE) + diff; config.saveParam(Config::PARAM::TEMPS_ECLAIRAGE, tempsEclairage); cout << tempsEclairage << " minutes allumées" << endl; } }
La fonction Config::saveParam fonctionne. Elle écrit où j'ai besoin dans le fichier, et je n'ai pas non plus de problème pour lire les données dans le fichier.
Voici maintenant la description du problème.
Lorsque je lance mon programme dans la console, et que j'éteins la lumière, ma fonction d'interruption est lancée et le fichier est modifié. Tout va bien. En temps normal, ce programme est lancé au démarrage de l'OS, donc il tourne tout seul, mais là il ne veut plus m'écrire dans le fichier.
J'ai redirigé la sortie de l'application dans un fichier pour voir ce qu'il se passe. La fonction d'interruption est bien appelée mais le fichier n'est pas modifié.
Je vous passe au cas où ma fonction Config::saveParam
Code:void Config::saveParam(const Config::PARAM param, const int newValue) { using namespace std; fstream file(_fileName.c_str(), fstream::out | fstream::in | fstream::binary); file.exceptions (ifstream::failbit | ifstream::badbit); try { file.seekp(param-1); //-1 car la première position dans le fichier est 0 et param commence à 1 int size = 0; if(Config::PARAM::TEMPS_ECLAIRAGE == param) size = sizeof(type_tps_eclairage); else size = sizeof(char); char *buffer = new char[size]; memcpy(buffer, &newValue, size); file.write(buffer, size); delete[] buffer; file.close(); } catch(const ifstream::failure& e) { cerr << "Impossible de sauvegarder les paramètres" << endl; } }
Avez-vous une suggestion ? D'où vient ce problème ?
Ce problème m'embête pas mal, je vous remercie pour l'aide que vous pourriez m'apporter
-----