diff options
-rw-r--r-- | source/Core/Drivers/BootLogo.cpp | 58 | ||||
-rw-r--r-- | source/Core/Inc/Settings.h | 6 | ||||
-rw-r--r-- | source/Core/Src/Settings.cpp | 2 | ||||
-rw-r--r-- | source/Core/Src/settingsGUI.cpp | 13 | ||||
-rw-r--r-- | source/Core/Threads/GUIThread.cpp | 12 |
5 files changed, 60 insertions, 31 deletions
diff --git a/source/Core/Drivers/BootLogo.cpp b/source/Core/Drivers/BootLogo.cpp index f21b8993..f1f5693d 100644 --- a/source/Core/Drivers/BootLogo.cpp +++ b/source/Core/Drivers/BootLogo.cpp @@ -3,10 +3,11 @@ #include "Buttons.hpp" #include "OLED.hpp" #include "cmsis_os.h" + #define LOGO_PAGE_LENGTH 1024 void delay() { - if (getSettingValue(SettingsOptions::LOGOTime) == 5) { + if (getSettingValue(SettingsOptions::LOGOTime) >= logoMode_t::ONETIME) { waitForButtonPress(); } else { waitForButtonPressOrTimeout(TICKS_SECOND * getSettingValue(SettingsOptions::LOGOTime)); @@ -20,60 +21,75 @@ void BootLogo::handleShowingLogo(const uint8_t *ptrLogoArea) { } else if (ptrLogoArea[0] == 0xAA) { showNewFormat(ptrLogoArea + 1); } + OLED::clearScreen(); OLED::refresh(); } void BootLogo::showOldFormat(const uint8_t *ptrLogoArea) { - OLED::drawAreaSwapped(0, 0, 96, 16, (uint8_t *)(ptrLogoArea + 4)); OLED::refresh(); - - // Delay here until button is pressed or its been the amount of seconds set by the user + // Delay here with static logo until a button is pressed or its been the amount of seconds set by the user delay(); } void BootLogo::showNewFormat(const uint8_t *ptrLogoArea) { - if (getSettingValue(SettingsOptions::LOGOTime) == 0) { + if (getSettingValue(SettingsOptions::LOGOTime) == logoMode_t::SKIP) { return; } + // New logo format (a) fixes long standing byte swap quirk and (b) supports animation uint8_t interFrameDelay = ptrLogoArea[0]; OLED::clearScreen(); - ButtonState buttons = getButtonState(); // Now draw in the frames int position = 1; - do { - + while (getButtonState() == BUTTON_NONE) { int len = (showNewFrame(ptrLogoArea + position)); OLED::refresh(); position += len; - buttons = getButtonState(); if (interFrameDelay) { osDelay(interFrameDelay * 4); } + // 1024 less the header type byte and the inter-frame-delay - if (getSettingValue(SettingsOptions::LOGOTime) > 0 && (position >= 1022 || len == 0)) { - // Delay here until button is pressed or its been the amount of seconds set by the user - delay(); - return; + if (getSettingValue(SettingsOptions::LOGOTime) && (position >= 1022 || len == 0)) { + // Animated logo stops here ... + if (getSettingValue(SettingsOptions::LOGOTime) == logoMode_t::INFINITY) { + // ... but if it's infinite logo setting then keep it rolling over again until a button is pressed + osDelay(4 * TICKS_100MS); + OLED::clearScreen(); + position = 1; + continue; + } + } else { + // Animation in progress so jumping to the next frame + continue; } - } while (buttons == BUTTON_NONE); + + // Static logo case ends up right here, so delay until a button is pressed or its been the amount of seconds set by the user + delay(); + return; + } } + int BootLogo::showNewFrame(const uint8_t *ptrLogoArea) { uint8_t length = ptrLogoArea[0]; - - if (length == 0xFF) { + switch (length) { + case 0: + // End + return 0; + break; + case 0xFE: + return 1; + break; + case 0xFF: // Full frame update OLED::drawArea(0, 0, 96, 16, ptrLogoArea + 1); length = 96; - } else if (length == 0xFE) { - return 1; - } else if (length == 0) { - return 0; // end - } else { + break; + default: length /= 2; // Draw length patches for (int p = 0; p < length; p++) { diff --git a/source/Core/Inc/Settings.h b/source/Core/Inc/Settings.h index c1eef128..f46df53b 100644 --- a/source/Core/Inc/Settings.h +++ b/source/Core/Inc/Settings.h @@ -92,6 +92,12 @@ typedef enum { AUTO = 2, // Automatic screen orientation based on accel.data if presented } orientationMode_t; +typedef enum { + SKIP = 0, // Skip boot logo + ONETIME = 5, // Show boot logo once (if animated) and stall until a button toggled + INFINITY = 6, // Show boot logo on repeat (if animated) until a button toggled +} logoMode_t; + // Settings wide operations void saveSettings(); bool loadSettings(); diff --git a/source/Core/Src/Settings.cpp b/source/Core/Src/Settings.cpp index 5196f4a4..e263943e 100644 --- a/source/Core/Src/Settings.cpp +++ b/source/Core/Src/Settings.cpp @@ -86,7 +86,7 @@ static const SettingConstants settingsConstants[(int)SettingsOptions::SettingsOp {0, 50, 1, 20}, // PDNegTimeout {0, 1, 1, 0}, // OLEDInversion {MIN_BRIGHTNESS, MAX_BRIGHTNESS, BRIGHTNESS_STEP, DEFAULT_BRIGHTNESS}, // OLEDBrightness - {0, 5, 1, 1}, // LOGOTime + {0, 6, 1, 1}, // LOGOTime {0, 1, 1, 0}, // CalibrateCJC {0, 1, 1, 1}, // BluetoothLE {0, 1, 1, 1}, // PDVpdo diff --git a/source/Core/Src/settingsGUI.cpp b/source/Core/Src/settingsGUI.cpp index 9542b08c..c551e14d 100644 --- a/source/Core/Src/settingsGUI.cpp +++ b/source/Core/Src/settingsGUI.cpp @@ -837,13 +837,20 @@ static void displayInvertColor(void) { } static void displayLogoTime(void) { - if (getSettingValue(SettingsOptions::LOGOTime) == 0) { + switch (getSettingValue(SettingsOptions::LOGOTime)) { + case logoMode_t::SKIP: OLED::print(translatedString(Tr->OffString), FontStyle::LARGE); - } else if (getSettingValue(SettingsOptions::LOGOTime) == 5) { + break; + case logoMode_t::ONETIME: + OLED::drawArea((OLED_WIDTH - 24 - 2) + 12, 0, 24, 16, infinityIcon); + break; + case logoMode_t::INFINITY: OLED::drawArea(OLED_WIDTH - 24 - 2, 0, 24, 16, infinityIcon); - } else { + break; + default: OLED::printNumber(getSettingValue(SettingsOptions::LOGOTime), 2, FontStyle::LARGE); OLED::print(LargeSymbolSeconds, FontStyle::LARGE); + break; } } diff --git a/source/Core/Threads/GUIThread.cpp b/source/Core/Threads/GUIThread.cpp index 56dc6574..a0684087 100644 --- a/source/Core/Threads/GUIThread.cpp +++ b/source/Core/Threads/GUIThread.cpp @@ -30,6 +30,7 @@ extern "C" { #include "USBPD.h" #include "pd.h" #endif + // File local variables extern bool heaterThermalRunaway; @@ -63,14 +64,13 @@ void startGUITask(void const *argument) { performCJCC(); } + uint16_t logoMode = getSettingValue(SettingsOptions::LOGOTime); + uint16_t startMode = getSettingValue(SettingsOptions::AutoStartMode); // If the boot logo is enabled (but it times out) and the autostart mode is enabled (but not set to sleep w/o heat), start heating during boot logo - if (getSettingValue(SettingsOptions::LOGOTime) > 0 && getSettingValue(SettingsOptions::LOGOTime) < 5 && getSettingValue(SettingsOptions::AutoStartMode) > 0 - && getSettingValue(SettingsOptions::AutoStartMode) < 3) { - uint16_t sleepTempDegC; + if (logoMode && logoMode < logoMode_t::ONETIME && startMode && startMode < autoStartMode_t::ZERO) { + uint16_t sleepTempDegC = getSettingValue(SettingsOptions::SleepTemp); if (getSettingValue(SettingsOptions::TemperatureInF)) { - sleepTempDegC = TipThermoModel::convertFtoC(getSettingValue(SettingsOptions::SleepTemp)); - } else { - sleepTempDegC = getSettingValue(SettingsOptions::SleepTemp); + sleepTempDegC = TipThermoModel::convertFtoC(sleepTempDegC); } // Only heat to sleep temperature (but no higher than 75°C for safety) currentTempTargetDegC = min(sleepTempDegC, 75); |