146 lines
4.5 KiB
C++
146 lines
4.5 KiB
C++
#include "Program.h"
|
|
|
|
|
|
Program::Program() {
|
|
|
|
// Startup Serial
|
|
Serial.begin(MONITOR_SPEED);
|
|
|
|
// Startup WiFi
|
|
WiFi.begin(WSSID, PASS);
|
|
|
|
Serial.print("Connecting to ");
|
|
Serial.print(WSSID); Serial.println(" ...");
|
|
|
|
int i = 0;
|
|
while (WiFi.status() != WL_CONNECTED) { // Wait for the Wi-Fi to connect
|
|
delay(1000);
|
|
Serial.print(++i);
|
|
Serial.print(' ');
|
|
}
|
|
|
|
Serial.println('\n');
|
|
Serial.println("Connection established!");
|
|
Serial.print("IP address:\t");
|
|
Serial.println(WiFi.localIP()); // Send the IP address of the ESP8266 to the computer
|
|
|
|
// Startup Discord API
|
|
this->discord = new DiscordAPI(DISCORD_HOOK);
|
|
// startup NTP
|
|
this->ntpUDP = new WiFiUDP();
|
|
this->timeClient = new NTPClient(*this->ntpUDP, "pool.ntp.org", 3600*1);//*2 = gnt+2
|
|
|
|
this->timeClient->update();
|
|
|
|
// Startup Rotary
|
|
this->encoder = new SwitchableEncodeur(ENCODER_DT, ENCODER_CLK, ENCODER_SWITCH, 3);
|
|
|
|
// Startup LEDs
|
|
this->ledLib = new LedLib(PIXEL_COUNT, PIXEL_PIN, 255);
|
|
|
|
this->ledLib->okBlink();
|
|
|
|
this->menu=MainMenu::INITIAL_STATE;
|
|
this->resetMillis = 0;
|
|
}
|
|
|
|
void Program::sendTime(String timeEnd){
|
|
String start = (String)this->timeClient->getHours() + "h";
|
|
int startQuater = this->timeClient->getMinutes()/15;
|
|
if (startQuater != 0){
|
|
start += (String)(startQuater * 15);
|
|
}
|
|
this->discord->sendHeure(start, timeEnd);
|
|
this->nLedStart = 0;
|
|
this->pm = false;
|
|
}
|
|
|
|
void Program::loop() {
|
|
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;
|
|
}
|
|
// 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: ");
|
|
// Serial.println(currentDayOfWeek);
|
|
}
|