diff --git a/config.ini b/config.ini index c8e382c..ac3ca14 100644 --- a/config.ini +++ b/config.ini @@ -26,3 +26,5 @@ build_flags = -D PIXEL_PIN=4 -D PIXEL_COUNT=24 + + -D RESET_TIME=60000 diff --git a/include/Program.h b/include/Program.h index c49730f..8f39a37 100644 --- a/include/Program.h +++ b/include/Program.h @@ -10,7 +10,12 @@ #include "SwitchableEncodeur.h" #include "LedLib.h" - +enum MainMenu{ + INITIAL_STATE, + GET_START_HOUR, + SELECT_END_HOUR, + SEND_TO_DISCORD +}; class Program { public: @@ -46,6 +51,19 @@ private: * @param[in] timeEnd LabOuest closing time */ void sendTime(String timeEnd); + + //state of the button + MainMenu menu; + + //temps de reset in ms + ulong resetMillis; + + //numéro de led de dépard + int nLedStart; + + // apres midi + bool pm; + }; #endif diff --git a/lib/SwitchableEncodeur/include/SwitchableEncodeur.h b/lib/SwitchableEncodeur/include/SwitchableEncodeur.h index bfa57f5..a0006a7 100644 --- a/lib/SwitchableEncodeur/include/SwitchableEncodeur.h +++ b/lib/SwitchableEncodeur/include/SwitchableEncodeur.h @@ -39,6 +39,13 @@ public: */ int getValue(); + /** + * @brief set the encodeur value + * + * @param val the new encodeur value + */ + void setValue(int val); + /** * @brief update the encodeur value * diff --git a/lib/SwitchableEncodeur/src/SwitchableEncodeur.cpp b/lib/SwitchableEncodeur/src/SwitchableEncodeur.cpp index 2b0edd4..907bb02 100644 --- a/lib/SwitchableEncodeur/src/SwitchableEncodeur.cpp +++ b/lib/SwitchableEncodeur/src/SwitchableEncodeur.cpp @@ -45,10 +45,14 @@ SwitchableEncodeur* SwitchableEncodeur::getInstance() { bool SwitchableEncodeur::update() { bool sortie = false; long newPosition = this->read()/4; + if(newPosition < 0){ + newPosition = 0; + this->readAndReset(); + } if (newPosition != this->oldPosition || this->menu != this->oldMenu) { this->oldMenu = this->menu; this->oldPosition = newPosition; - if(this->oldPosition < 0){ + if(this->oldPosition <= 0){ this->oldPosition = 0; } sortie = true; @@ -62,4 +66,9 @@ int SwitchableEncodeur::getValue() { void SwitchableEncodeur::resetValue() { this->oldPosition = 0; + this->readAndReset(); +} + +void SwitchableEncodeur::setValue(int val){ + this->write(val*4); } diff --git a/src/Program.cpp b/src/Program.cpp index 102fdb1..7f68b52 100644 --- a/src/Program.cpp +++ b/src/Program.cpp @@ -28,10 +28,9 @@ Program::Program() { this->discord = new DiscordAPI(DISCORD_HOOK); // startup NTP this->ntpUDP = new WiFiUDP(); - this->timeClient = new NTPClient(*this->ntpUDP, "pool.ntp.org", 3600*2);//*2 = gnt+2 + this->timeClient = new NTPClient(*this->ntpUDP, "pool.ntp.org", 3600*1);//*2 = gnt+2 this->timeClient->update(); - //this->sendTime("18h12"); // Startup Rotary this->encoder = new SwitchableEncodeur(ENCODER_DT, ENCODER_CLK, ENCODER_SWITCH, 3); @@ -41,6 +40,8 @@ Program::Program() { this->ledLib->okBlink(); + this->menu=MainMenu::INITIAL_STATE; + this->resetMillis = 0; } void Program::sendTime(String timeEnd){ @@ -50,30 +51,93 @@ void Program::sendTime(String timeEnd){ start += (String)(startQuater * 15); } this->discord->sendHeure(start, timeEnd); + this->nLedStart = 0; + this->pm = false; } void Program::loop() { - if(this->encoder->update()){ - Serial.print(this->encoder->getValue()); - this->ledLib->actLed(this->encoder->getValue(), 5); - Serial.print(" "); - Serial.println(this->encoder->getMenu()); + switch (this->menu){ + case MainMenu::INITIAL_STATE: // default state + this->encoder->resetValue(); + this->ledLib->actLed(0,0); + break; + + case MainMenu::GET_START_HOUR:{ // get NTP Hour + //TODO: géré heure d'été et d'hiver + this->timeClient->update(); + int hour = this->timeClient->getHours(); + int min = this->timeClient->getMinutes(); + int day = this->timeClient->getDay(); + if(hour >= 12){ + hour -= 12; + this->pm = true; + }else{ + this->pm = false; + } + this->nLedStart = hour*2; + if(min >= 30){ + this->nLedStart++; + } + this->menu=MainMenu::SELECT_END_HOUR; + this->resetMillis = millis(); + if(day == 2 || day == 5){ + this->encoder->setValue(21-this->nLedStart); + }else{ + this->encoder->setValue(1); + } + break;} + case MainMenu::SELECT_END_HOUR: // select Close hour + this->ledLib->actLed(this->encoder->getValue(), this->nLedStart); + break; + case MainMenu::SEND_TO_DISCORD:{ // send value to discord + String strTime = ""; + bool min = false; + int endLed = this->encoder->getValue(); + int hour = (this->nLedStart + endLed)/2; + if(this->pm)hour += 12; + if(this->nLedStart % 2 == 1){ + if(endLed % 2 == 1){ + hour -=1; + min = true; + } + }else{ + if(endLed % 2 == 0){ + hour -=1; + min = true; + } + } + if(hour >= 24)hour -= 24; + strTime += hour; + strTime += "h"; + if(min)strTime += "30"; + this->sendTime(strTime); + this->menu = MainMenu::INITIAL_STATE; + this->encoder->resetMenu(); + this->encoder->resetValue(); + this->ledLib->okBlink(); + } + break; + + default: + break; } - // delay(1000); - - // this->timeClient->update(); - - // int currentHour = this->timeClient->getHours(); - // Serial.print("Hour: "); - // Serial.println(currentHour); - - // int currentMinute = this->timeClient->getMinutes(); - // Serial.print("Minutes: "); - // Serial.println(currentMinute); - - // int currentSecond = this->timeClient->getSeconds(); - // Serial.print("Seconds: "); - // Serial.println(currentSecond); + // MAJ encodeur + if(this->encoder->update()){ + if(this->encoder->getMenu() == 1 && this->menu == MainMenu::INITIAL_STATE){//passage de l'état initial au 1er état + this->menu = MainMenu::GET_START_HOUR; + } + if(this->encoder->getMenu() == 2 && this->menu == MainMenu::SELECT_END_HOUR){//validation du choix de l'heure + this->menu = MainMenu::SEND_TO_DISCORD; + } + } + // Reseteur + if(this->resetMillis + RESET_TIME == millis()){ + this->encoder->resetMenu(); + this->resetMillis = millis(); + this->menu = MainMenu::INITIAL_STATE; + } + //TODO: gestion cas d'erreur (pas de wifi, discord down,...) + //TODO: gestion d'une ouverture de plus de 12h avec les led (chagement de couleur) // int currentDayOfWeek = this->timeClient->getDay(); // Serial.print("Day of week: ");