diff --git a/Dashboard/Dashboard.ino b/Dashboard/Dashboard.ino index d978b01a104b3e409aed0d95abf52f8cdd04ddd7..ef08d6ffef8bbe0114f66d0ddc79fe7bf339c1e5 100644 --- a/Dashboard/Dashboard.ino +++ b/Dashboard/Dashboard.ino @@ -45,10 +45,12 @@ /*******MHZ19 CO2 library********/ #include <MHZ19_uart.h> +MHZ19_uart co2; /********************************/ /**********RTC library***********/ #include <microDS3231.h> +MicroDS3231 rtc; /********************************/ /*************EEPROM*************/ @@ -78,7 +80,6 @@ union Arg const void *v; }; - // Screen entity with transition table struct Screen { @@ -111,6 +112,7 @@ enum PANEL_ORIENTATION : uint8_t // Special key, which helps to validate EEPROM data const uint8_t special_key = 0b11011100; // Just a random number (it's actually the voltage from the outlet) +// Import configs #include "config.h" #include "configScreens.h" @@ -173,17 +175,21 @@ struct uint8_t wakeupMinute : 6; } globalVars; -microLED<NUMLEDS, LEDsPin, MLED_NO_CLOCK, MODEL, CLI_AVER - #if(DEBUG) - , SAVE_MILLIS - #endif - > matrix(WIDTH, HEIGHT, CONNECTION_TYPE, CORNER, DIRECTION); +// Init matrix +#if(DEBUG) +microLED<NUMLEDS, LEDsPin, MLED_NO_CLOCK, MODEL, CLI_AVER, SAVE_MILLIS> matrix(WIDTH, HEIGHT, CONNECTION_TYPE, CORNER, DIRECTION); +#else +microLED<NUMLEDS, LEDsPin, MLED_NO_CLOCK, MODEL, CLI_AVER> matrix(WIDTH, HEIGHT, CONNECTION_TYPE, CORNER, DIRECTION); +#endif + +// Textbox #include "textbox.h" textbox tb; -MHZ19_uart co2; -MicroDS3231 rtc; + +// Screens #include "screens.h" +// Extern system timer extern volatile uint32_t timer0_overflow_count; extern volatile uint32_t timer0_millis; @@ -285,6 +291,32 @@ void buttons(uint8_t resetTimers = 0) } } +// Check sleep time +void checkSleep(DateTime* DT) +{ + if(globalVars.noAutoChangeScreen) globalVars.sleep = false; + else 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 setup() { // Hardware init @@ -344,27 +376,27 @@ void setup() } } break; - case 4: + // Wake up + case 3: { - if(((eepromData & 0b11100000) == (special_key & 0b11100000)) && ((eepromData & 0b00011111) < 24) && !globalVars.unpreparedEEPROM) - globalVars.wakeupHour = eepromData & 0b00011111; + if(((eepromData & 0b11000000) == (special_key & 0b11000000)) && ((eepromData & 0b00111111) < 60) && !globalVars.unpreparedEEPROM) + globalVars.sleepMinute = eepromData & 0b00111111; else { - EEPROM.write(i, (special_key & 0b11100000) | WAKEUPHOUR); - globalVars.wakeupHour = WAKEUPHOUR; + EEPROM.write(i, (special_key & 0b11000000) | SLEEPMINUTE); + globalVars.sleepMinute = SLEEPMINUTE; globalVars.unpreparedEEPROM = true; } } break; - // Wake up - case 3: + case 4: { - if(((eepromData & 0b11000000) == (special_key & 0b11000000)) && ((eepromData & 0b00111111) < 60) && !globalVars.unpreparedEEPROM) - globalVars.sleepMinute = eepromData & 0b00111111; + if(((eepromData & 0b11100000) == (special_key & 0b11100000)) && ((eepromData & 0b00011111) < 24) && !globalVars.unpreparedEEPROM) + globalVars.wakeupHour = eepromData & 0b00011111; else { - EEPROM.write(i, (special_key & 0b11000000) | SLEEPMINUTE); - globalVars.sleepMinute = SLEEPMINUTE; + EEPROM.write(i, (special_key & 0b11100000) | WAKEUPHOUR); + globalVars.wakeupHour = WAKEUPHOUR; globalVars.unpreparedEEPROM = true; } } @@ -406,6 +438,7 @@ void setup() } } break; + // Brightness case 8: { if(!globalVars.unpreparedEEPROM) @@ -437,31 +470,6 @@ void setup() delay(500); } -void checkSleep(DateTime* DT) -{ - if(globalVars.noAutoChangeScreen) globalVars.sleep = false; - else 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() { // Terminate if buttuns are holded @@ -534,6 +542,7 @@ void loop() if(globalVars.seconds != DTtmp.second) { timer3 = millis(); + // Check sleep time checkSleep(&DTtmp); } globalVars.seconds = DTtmp.second; @@ -579,7 +588,7 @@ void loop() PRINTLN_DEBUG(globalVars.pomodoroSeconds); } - // Display + // Back to homeScreen after 30 seconds static uint32_t timer5 = 0; TIMER(timer5, 30000) { @@ -591,17 +600,22 @@ void loop() } } else globalVars.sleep = false; + + // Display switch(globalVars.prepare) { + // Prepare additional buffer case 1: PRINTLN_DEBUG(F("Prepared")); unhandle(); clearBuffer(&globalVars.leds[0]); screens[globalVars.currentScreen].funcPrepare(&globalVars.leds[0]); + // Animate case 2: PRINTLN_DEBUG(F("Animated")); animate(AN_FRAMES_DELAY); break; + // Draw screen case 0: PRINT_DEBUG(F("Screen ")); PRINT_DEBUG(globalVars.currentScreen); @@ -612,20 +626,18 @@ void loop() globalVars.swipeLeft || globalVars.swipeRight ) { timer5 = millis(); - // if(globalVars.sleep) unhandle(); } if(globalVars.sleep) matrix.clear(); - else screens[globalVars.currentScreen].func(&screens[globalVars.currentScreen].arg); + else + screens[globalVars.currentScreen].func(&screens[globalVars.currentScreen].arg); break; } matrix.show(); // Wait until ppm data stabilize TIMER(0, 180000) - { globalVars.co2Ready = true; - } // Monthly preventative safe reset of the millis() timer TIMER(0, 3456000000) diff --git a/Dashboard/screens.h b/Dashboard/screens.h index 3c220f74ce8fdb1195d24e874dd217eb656acb8f..cd9649a2e705a3b4c1f9eb5eb3c734d2476a33ab 100644 --- a/Dashboard/screens.h +++ b/Dashboard/screens.h @@ -9,7 +9,7 @@ void changeScreen(SCREEN current, uint8_t next, ANIMATION anim = NO_ANIMATION); // Animate void animate(uint16_t reciprocal_speed); // Draw small number -void drawSmallNumber(uint8_t x, uint8_t y, uint8_t num, mData color); +void drawSmallNumber(mData* m, uint8_t x, uint8_t y, uint8_t num, mData color); // Set pixel in the buffer void setPixel(mData* m, uint8_t x, uint8_t y, mData c); // Get pixel from the buffer