diff --git a/source/Core/Drivers/BootLogo.cpp b/source/Core/Drivers/BootLogo.cpp index f21b8993c5..f1f5693d85 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/Drivers/Font.h b/source/Core/Drivers/Font.h index 0bd08c82a7..234baefbd3 100644 --- a/source/Core/Drivers/Font.h +++ b/source/Core/Drivers/Font.h @@ -175,11 +175,17 @@ const uint8_t buttonB[] = { // 0xFE, 0x01, 0x79, 0x25, 0x79, 0x01, 0xFE, 0x00, 0x20, 0x20, 0x20, 0x20, 0xDF, 0x07, 0x8F, 0xDF, 0xFF, 0x01, 0xFE, 0x86, 0xDA, 0x86, 0xFE, 0x01, // 0x7F, 0x80, 0xA4, 0xBE, 0xA0, 0x80, 0x7F, 0x00, 0x04, 0x0E, 0x1F, 0x04, 0xFB, 0xFB, 0xFB, 0xFB, 0xFF, 0x80, 0x7F, 0x5B, 0x41, 0x5F, 0x7F, 0x80}; -const uint8_t infinityIcon[] = { - // width = 24 +const uint8_t RepeatOnce[] = { + // width = 16 + // height = 16 + 0x00, 0xc0, 0xf0, 0x78, 0x1c, 0x0c, 0x0e, 0x06, 0x06, 0x0e, 0x2c, 0x3c, 0x38, 0x3c, 0x00, 0x00, + 0x00, 0x01, 0x08, 0x04, 0x7e, 0x00, 0x00, 0x60, 0x60, 0x70, 0x30, 0x38, 0x1e, 0x0f, 0x03, 0x00}; + +const uint8_t RepeatInf[] = { + // width = 16 // height = 16 - 0x00, 0xc0, 0x70, 0x18, 0x0c, 0x0c, 0x0c, 0x0c, 0x18, 0x10, 0x20, 0x80, 0xc0, 0x60, 0x30, 0x18, 0x0c, 0x0c, 0x0c, 0x0c, 0x18, 0x70, 0xc0, 0x00, - 0x00, 0x01, 0x07, 0x0c, 0x18, 0x18, 0x18, 0x18, 0x0c, 0x06, 0x03, 0x01, 0x00, 0x02, 0x04, 0x0c, 0x18, 0x18, 0x18, 0x18, 0x0c, 0x07, 0x01, 0x00}; + 0x00, 0xc0, 0xf0, 0x78, 0x1c, 0x0c, 0x0e, 0x06, 0x06, 0x0e, 0x2c, 0x3c, 0x38, 0x3c, 0x00, 0x00, + 0x00, 0x31, 0x49, 0x48, 0x30, 0x48, 0x48, 0x30, 0x00, 0x00, 0x30, 0x38, 0x1e, 0x0f, 0x03, 0x00}; /* * 16x16 icons diff --git a/source/Core/Inc/Settings.h b/source/Core/Inc/Settings.h index c1eef1280a..f46df53bd9 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 5196f4a48f..e263943ef5 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 9542b08c9c..cc6910accc 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) { - OLED::drawArea(OLED_WIDTH - 24 - 2, 0, 24, 16, infinityIcon); - } else { + break; + case logoMode_t::ONETIME: + OLED::drawArea(OLED_WIDTH - 16 - 2, 0, 16, 16, RepeatOnce); + break; + case logoMode_t::INFINITY: + OLED::drawArea(OLED_WIDTH - 16 - 2, 0, 16, 16, RepeatInf); + 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 56dc6574c7..a068408701 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);