diff --git a/Dashboard/Dashboard.ino b/Dashboard/Dashboard.ino index 505b6523c511c3074d6c039b1f410d22e2f33211..c2476f2d33a3384d76866464eea2ec4047605412 100644 --- a/Dashboard/Dashboard.ino +++ b/Dashboard/Dashboard.ino @@ -55,6 +55,12 @@ /************Mem map*************/ // | 0 | Panel orientation | // | 1 | Is RTC initialized | +// | 2 | Sleep hour | +// | 3 | Sleep minute | +// | 4 | Wake up hour | +// | 5 | Wake up minute | +// | 6 | Pomodoro work minutes | +// | 7 | Pomodoro break minutes | /********************************/ /*************Marcos*************/ @@ -107,20 +113,28 @@ const uint8_t special_key = 0b11011100; // Just a random number (it's actually t // Structure for all global variables struct { + // Matrix PANEL_ORIENTATION panelOrientation : 2; // Swipe panel orientation SCREEN currentScreen; // Current screen's address in the screens table uint8_t currentState; // Current state of current screen ANIMATION animation : 3; // The way to animate uint8_t prepare : 2; // 0 — Draw current screen; 1 — Call prepare function; 2 — Animate + // mData leds[NUMLEDS]; + mData leds[0]; // Sorry, but this buffer takes a lot of memory + + // Service uint32_t timer; // Global timer for screens + char S[64]; // Temp string + uint8_t unpreparedEEPROM : 1; // True if EEPROM contains special_key in each cell + uint8_t sleep : 1; // Sleep mode + + // Gestures events uint8_t tapLeft : 1; // True when tapped left uint8_t tapRight : 1; // True when tapped right uint8_t swipeLeft : 1; // True when swiped from right to left uint8_t swipeRight : 1; // True when swiped from left to right uint8_t holdLeft : 1; // True when left holded uint8_t holdRight : 1; // True when right holded - // mData leds[NUMLEDS]; - mData leds[0]; // Sorry, but this buffer takes a lot of memory // CO₂ uint16_t ppm[WIDTH]; // CO₂ ppm @@ -139,14 +153,18 @@ struct // Pomodoro uint32_t pomodoroTimer; // Timer milliseconds - uint8_t pomodoroMinutes : 5; // Current minutes, also used for setting work + uint8_t pomodoroMinutes : 6; // Current minutes, also used for setting work uint8_t pomodoroSeconds : 6; // Current seconds, also used for setting break - uint8_t pomodoroSavedWork : 5; // Last entered minutes - uint8_t pomodoroSavedBreak : 5; // Last entered seconds + uint8_t pomodoroSavedWork : 6; // Last entered minutes + uint8_t pomodoroSavedBreak : 6; // Last entered seconds uint8_t pomodoroRunning : 1; // True when timer is running uint8_t pomodoroState : 1; // False for a work, true for a break - char S[64]; + // Sleep mode + uint8_t sleepHour : 5; + uint8_t sleepMinute : 6; + uint8_t wakeupHour : 5; + uint8_t wakeupMinute : 6; } globalVars; microLED<NUMLEDS, LEDsPin, MLED_NO_CLOCK, MODEL, CLI_AVER @@ -278,37 +296,147 @@ void setup() PRINTLN_DEBUG(F("Hello")); // Reading settings from nonvolatile memory - uint8_t eepromData; - eepromData = EEPROM.read(0); - PRINTLN_DEBUG(eepromData & 0b11111100); - PRINTLN_DEBUG(special_key); - PRINTLN_DEBUG(eepromData & 0b00000011); - if(((eepromData & 0b11111100) == special_key) && ((eepromData & 0b00000011) < 3)) - globalVars.panelOrientation = (PANEL_ORIENTATION)(eepromData & 0b00000011); - else globalVars.panelOrientation = PANEL_UNKNOWN; - eepromData = EEPROM.read(1); - PRINTLN_DEBUG(eepromData); - if(!(eepromData == special_key)) + uint8_t eepromData, i; + for(i = 0; i <= 7; i++) { - PRINTLN_DEBUG(F("RTC UPDATED")); - EEPROM.write(1, special_key); - rtc.setTime(COMPILE_TIME); + eepromData = EEPROM.read(i); + switch(i) + { + // Panel orientation + case 0: + { + if(((eepromData & 0b11111100) == (special_key & 0b11111100)) && ((eepromData & 0b00000011) < 3)) + globalVars.panelOrientation = (PANEL_ORIENTATION)(eepromData & 0b00000011); + else + { + EEPROM.write(i, special_key); + globalVars.panelOrientation = PANEL_UNKNOWN; + globalVars.unpreparedEEPROM = true; + } + } + break; + // Is RTC ready? + case 1: + { + if(!(eepromData == special_key) || globalVars.unpreparedEEPROM) + { + EEPROM.write(i, special_key); + rtc.setTime(COMPILE_TIME); + globalVars.unpreparedEEPROM = true; + } + } + break; + // Sleep + case 2: + { + if(((eepromData & 0b11100000) == (special_key & 0b11100000)) && ((eepromData & 0b00011111) < 24)) + globalVars.sleepHour = eepromData & 0b00011111; + else + { + EEPROM.write(i, (eepromData & 0b11100000) | SLEEPHOUR); + globalVars.sleepHour = SLEEPHOUR; + globalVars.unpreparedEEPROM = true; + } + } + break; + case 4: + { + if(((eepromData & 0b11100000) == (special_key & 0b11100000)) && ((eepromData & 0b00011111) < 24)) + globalVars.wakeupHour = eepromData & 0b00011111; + else + { + EEPROM.write(i, (eepromData & 0b11100000) | WAKEUPHOUR); + globalVars.wakeupHour = WAKEUPHOUR; + globalVars.unpreparedEEPROM = true; + } + } + break; + // Wake up + case 3: + { + if(((eepromData & 0b11000000) == (special_key & 0b11000000)) && ((eepromData & 0b00111111) < 60)) + globalVars.sleepMinute = eepromData & 0b00111111; + else + { + EEPROM.write(i, (eepromData & 0b11000000) | SLEEPMINUTE); + globalVars.sleepMinute = SLEEPMINUTE; + globalVars.unpreparedEEPROM = true; + } + } + break; + case 5: + { + if(((eepromData & 0b11000000) == (special_key & 0b11000000)) && ((eepromData & 0b00111111) < 60)) + globalVars.wakeupMinute = eepromData & 0b00111111; + else + { + EEPROM.write(i, (eepromData & 0b11000000) | WAKEUPMINUTE); + globalVars.wakeupMinute = WAKEUPMINUTE; + globalVars.unpreparedEEPROM = true; + } + } + break; + // Pomodoro minutes + case 6: + { + if(((eepromData & 0b11000000) == (special_key & 0b11000000)) && ((eepromData & 0b00111111) < 60)) + globalVars.pomodoroSavedWork = eepromData & 0b00111111; + else + { + EEPROM.write(i, (eepromData & 0b11000000) | POMODORO_WORK); + globalVars.pomodoroSavedWork = POMODORO_WORK; + globalVars.unpreparedEEPROM = true; + } + } + break; + case 7: + { + if(((eepromData & 0b11000000) == (special_key & 0b11000000)) && ((eepromData & 0b00111111) < 60)) + globalVars.pomodoroSavedBreak = eepromData & 0b00111111; + else + { + EEPROM.write(i, (eepromData & 0b11000000) | POMODORO_BREAK); + globalVars.pomodoroSavedBreak = POMODORO_BREAK; + globalVars.unpreparedEEPROM = true; + } + } + break; + } } - PRINTLN_DEBUG(globalVars.panelOrientation); // Set start screen globalVars.currentScreen = startWith; // Start without animation globalVars.animation = NO_ANIMATION; globalVars.prepare = true; - // Write default pomodoro times - globalVars.pomodoroSavedWork = POMODORO_WORK; - globalVars.pomodoroSavedBreak = POMODORO_BREAK; + + globalVars.minPPM = bit(13) - 1; delay(500); - // Measure PPM - globalVars.freshPPM = 0; - globalVars.ppm[0] = globalVars.minPPM = globalVars.maxPPM = co2.getPPM(); +} + +void checkSleep(DateTime* DT) +{ + if ((globalVars.sleepHour > globalVars.wakeupHour) || + ((globalVars.sleepHour == globalVars.wakeupHour) && + (globalVars.sleepMinute >= globalVars.wakeupMinute))) + { + globalVars.sleep = (((DT->hour > globalVars.sleepHour) || + ((DT->hour == globalVars.sleepHour) && + (DT->minute >= globalVars.sleepMinute))) || + ((DT->hour < globalVars.wakeupHour) || + ((DT->hour == globalVars.wakeupHour) && + (DT->minute < globalVars.wakeupMinute)))); + } + else + { + globalVars.sleep = (((DT->hour > globalVars.sleepHour) || + ((DT->hour == globalVars.sleepHour) && + (DT->minute >= globalVars.sleepMinute))) && + ((DT->hour < globalVars.wakeupHour) || + ((DT->hour == globalVars.wakeupHour) && + (DT->minute < globalVars.wakeupMinute)))); + } } void loop() @@ -335,17 +463,23 @@ void loop() { timer0 = millis(); PRINT_DEBUG(F("Measured CO2 ")); - TIMER(timer1, GRAPH_UPDATE_TIME) + uint16_t measuredPPM = co2.getPPM(); + if(measuredPPM > 100) { - timer1 = millis(); - globalVars.freshPPM++; - if(globalVars.freshPPM == WIDTH) globalVars.freshPPM = 0; - PRINT_DEBUG(F("and shifted array ")); + TIMER(timer1, GRAPH_UPDATE_TIME) + { + timer1 = millis(); + globalVars.freshPPM++; + if(globalVars.freshPPM == WIDTH) globalVars.freshPPM = 0; + PRINT_DEBUG(F("and shifted array ")); + } + globalVars.ppm[globalVars.freshPPM] = measuredPPM; + if(globalVars.ppm[globalVars.freshPPM] > globalVars.maxPPM) + globalVars.maxPPM = globalVars.ppm[globalVars.freshPPM]; + if(globalVars.ppm[globalVars.freshPPM] < globalVars.minPPM) + globalVars.minPPM = globalVars.ppm[globalVars.freshPPM]; + PRINTLN_DEBUG(globalVars.ppm[globalVars.freshPPM]); } - globalVars.ppm[globalVars.freshPPM] = co2.getPPM(); - if(globalVars.ppm[globalVars.freshPPM] > globalVars.maxPPM) globalVars.maxPPM = globalVars.ppm[globalVars.freshPPM]; - if(globalVars.ppm[globalVars.freshPPM] < globalVars.minPPM) globalVars.minPPM = globalVars.ppm[globalVars.freshPPM]; - PRINTLN_DEBUG(globalVars.ppm[globalVars.freshPPM]); } // Notify when ppm is high @@ -372,7 +506,10 @@ void loop() #endif globalVars.minutes = DTtmp.minute; if(globalVars.seconds != DTtmp.second) + { timer3 = millis(); + checkSleep(&DTtmp); + } globalVars.seconds = DTtmp.second; PRINTLN_DEBUG(F("succesfuly")); } @@ -417,6 +554,9 @@ void loop() } // Display + static uint32_t timer5 = 0; + TIMER(timer5, 10000){} + else globalVars.sleep = false; switch(globalVars.prepare) { case 1: @@ -431,7 +571,13 @@ void loop() PRINT_DEBUG(globalVars.currentScreen); PRINT_DEBUG(F(" state ")); PRINT_DEBUG(globalVars.currentState); - screens[globalVars.currentScreen].func(&screens[globalVars.currentScreen].arg); + if( globalVars.tapLeft || globalVars.tapRight || + globalVars.holdLeft || globalVars.holdRight || + globalVars.swipeLeft || globalVars.swipeRight ) + timer5 = millis(); + if(globalVars.sleep) + matrix.clear(); + else screens[globalVars.currentScreen].func(&screens[globalVars.currentScreen].arg); break; } matrix.show(); @@ -453,6 +599,7 @@ void loop() timer2 = 0; timer3 = 0; timer4 = 0; + timer5 = 0; buttons(1); } } \ No newline at end of file diff --git a/Dashboard/config.h b/Dashboard/config.h index 7820e53d46820a65687d8098f9abfcddfdda01f3..ad3253ebbf662e801e48461a3a954deb339b5928 100644 --- a/Dashboard/config.h +++ b/Dashboard/config.h @@ -1,6 +1,6 @@ #pragma once // Native Language -#define LANG_RU_RU +// #define LANG_RU_RU // Time format (24, 12 and also every number) #define TIME_FORMAT 24 // If true, it will display 24:00 instead of 00:00 @@ -56,4 +56,10 @@ // Pomodoro defaults #define POMODORO_WORK 25 -#define POMODORO_BREAK 5 \ No newline at end of file +#define POMODORO_BREAK 5 + +// Sleep/wake up hours +#define SLEEPHOUR 22 +#define SLEEPMINUTE 0 +#define WAKEUPHOUR 7 +#define WAKEUPMINUTE 30 \ No newline at end of file