aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--source/Core/Drivers/BootLogo.cpp58
-rw-r--r--source/Core/Inc/Settings.h6
-rw-r--r--source/Core/Src/Settings.cpp2
-rw-r--r--source/Core/Src/settingsGUI.cpp13
-rw-r--r--source/Core/Threads/GUIThread.cpp12
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);