Bonjour et bonne année,
Question sans doute bête mais bon ...
J'ai une classe keepInRTC dont le but est de sauvegarder zone mémoire dans la mémoire RTC d'un ESP8266 et qui ressemble à ca :
J'ai une seconde classe Repeater qui l'utilise pour sauvegarder ses propres données,Code:class keepInRTC { uint32_t *what; uint32_t size; uint32_t offset; protected: keepInRTC( Context &ctx, uint32_t *w, uint32_t s ) : what(w), size(s) { /* -> ctx : context managing the RTC memory * w : which data to save * s : size of the data to save */ this->offset = ctx.reserveData( s ); if(ctx.isValid()) // previous data can be retrieved ESP.rtcUserMemoryRead(this->offset, this->what, this->size); } public: void save( void ){ ESP.rtcUserMemoryWrite( this->offset, this->what, this->size ); } };
Et j'ai une 3e qui hérite de Repeater mais qui doit aussi sauvegarder ses propres données. Ce qui donneCode:class Repeater : public Context::keepInRTC { unsigned long int next; // next run unsigned long int interval; Context &context; public: virtual void action( void ) = 0; // Which action to launch Repeater( Context &ctx, unsigned long int aint, bool now=false) : Context::keepInRTC( ctx, (uint32_t *)&next, sizeof(next) ), interval( aint ), context( ctx ) { /* <- aint : interval b/w launches (ms) * now : if the action has to be launched now */ if(!ctx.isValid()){ // 1st run, default values if(!now) this->next = context.getTime() + interval; else this->next = 0; this->save(); } } void loop( void ){ if( context.getTime() > this->next ){ this->action(); this->next = context.getTime() + interval; this->save(); } } unsigned long int remain(void){ /* Return the duration before the next activation * in mS */ if(context.getTime() > this->next) return 0; else return( this->next - context.getTime() ); } };
Sauf que GCC me renvoie le warning suivant :Code:class Auxiliaires : public Repeater, public Context::keepInRTC { struct { unsigned long int wait4stab; // Wait for the capacitor to load } tokeep; // data to be kept public: Auxiliaires( Context &ctx ) : Repeater( ctx, (INTERVAL_AUX-10) * 1e3, true ), Context::keepInRTC( ctx, (uint32_t *)&tokeep, sizeof(tokeep) ), context( ctx ), gpio( context.getOWBus(), DSADDR ){ if( !ctx.isValid() ) // Default value tokeep.wait4stab = DELAY_AUX; } };
Et du coup, j'ai peur qu'il ne face pas ce que je cherche a faire, c'est à dire avoir à la fois le contenu du Repeater et celui de Auxiliaires.sketch/Auxiliaires.h:16:7: warning: direct base 'Context::keepInRTC' inaccessible in 'Auxiliaires' due to ambiguity [enabled by default]
class Auxiliaires : public Repeater, public Context::keepInRTC {
Une idée ?
Merci
Laurent
-----