Choix lib RTC

perso je code tout sous codeblocks ;D

C'est clair que la gestion d'un programmateur journalier est un cas d'usage fréquent dans les montages arduino.

J'avais d'ailleurs commencé à écrire quelque chose là-dessus, mais pas fini / pas publié.

L'idée était bêtement de transposer les fonctionnalités d'un programmateur horaire classique (ceux électroniques, où on règle les jours de la semaine, l'heure de début et l'heure de fin).

à utiliser en complément du simpleRTC

Le voici "as is", même pas sûr que ça compile

const uint8_t DIMANCHE = 0b0000001;
const uint8_t LUNDI    = 0b0000010;
const uint8_t MARDI    = 0b0000100;
const uint8_t MERCREDI = 0b0001000;
const uint8_t JEUDI    = 0b0010000;
const uint8_t VENDREDI = 0b0100000;
const uint8_t SAMEDI   = 0b1000000;

const uint8_t SEMAINE  = LUNDI | MARDI | MERCREDI | JEUDI | VENDREDI;
const uint8_t WEEKEND  = SAMEDI | DIMANCHE;

const uint8_t TOUSLESJOURS = SEMAINE | WEEKEND;

typedef void (*fonctionVoid)();//correspond à toute fonction du style "void ma_fonction()"

class progJournalier
{
  public :

    //Constructeur : fournir les fonctions à appeler lors de la mise en marche et lors de l'arret
    progJournalier(fonctionVoid marche, fonctionVoid arret);

    //Paramètres de programmation journalière
    void reglerDebut(uint8_t heure, uint8_t minute);
    void reglerFin(uint8_t heure, uint8_t minute);
    void reglerJours(uint8_t jours); //utiliser les constantes ci-dessus, par exemple LUNDI | MARDI

    //Evaluation incluant l'appel éventuel aux fonctions de mise en marche ou d'arrêt
    //Valeurs en entrées fournies par un RTC
    //joursem : 0=dim, 1=lun, ... 6=sam
    //retourne true si changement d'état
    bool actualiser(uint8_t joursem, uint8_t heure, uint8_t minute);

    //Méthodes constantes d'accès aux propriétés du programme journalier
    bool estActif() const;
    void debut(uint8_t *heure, uint8_t *minute) const;
    void fin(uint8_t *heure, uint8_t *minute) const;
    uint8_t jours() const;
    bool estActifLe(uint8_t joursem) const;

  private :
    fonctionVoid on, off;
    uint16_t deb, fin;
    uint8_t jrs;
    bool actif;
};

progJournalier::progJournalier(fonctionVoid marche, fonctionVoid arret)
{
  this->on = marche;
  this->off = arret;
  this->deb = 0;
  this->fin = 0;
  this->jrs = TOUSLESJOURS;
  this->actif = false;
}

void progJournalier::reglerDebut(uint8_t heure, uint8_t minute)
{
  this->deb = heure;
  this->deb *= 60;
  this->deb += minute;
}

void progJournalier::reglerFin(uint8_t heure, uint8_t minute)
{
  this->fin = heure;
  this->fin *= 60;
  this->fin += minute;
}

void progJournalier::reglerJours(uint8_t jours)
{
  this->jrs = jours;
}

bool progJournalier::actualiser(uint8_t joursem, uint8_t heure, uint8_t minute)
{
  if (this->jrs & (1 << joursem))
  {
    uint16_t maintenant = heure;
    maintenant *= 60;
    maintenant += minute;
    if (deb <= maintenant && maintenant <fin)
    {
      if (!this->actif)
      {
        this->on();
        this->actif = true;
        return true;
      }
    }
    else
    {
      if (this->actif)
      {
        this->off();
        this->actif = false;
        return true;
      }
    }
  }
  return false;
}

bool progJournalier::estActif() const {return this->actif;}

void progJournalier::debut(uint8_t *heure, uint8_t *minute) const
{
  *minute = this->deb % 60;
  *heure  = this->deb / 60;
}

void progJournalier::fin(uint8_t *heure, uint8_t *minute) const
{
  *minute = this->fin % 60;
  *heure  = this->fin / 60;
}

uint8_t progJournalier::jours() const {return this->jrs;}

bool progJournalier::estActifLe(uint8_t joursem) const {return !!(this->jrs & (1 << joursem));}