Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement optional looping for animated boot logo [#1839] #1841

Merged
merged 17 commits into from
Nov 23, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 37 additions & 21 deletions source/Core/Drivers/BootLogo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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));
Expand All @@ -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;
ia marked this conversation as resolved.
Show resolved Hide resolved
}
}

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++) {
Expand Down
6 changes: 6 additions & 0 deletions source/Core/Inc/Settings.h
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
2 changes: 1 addition & 1 deletion source/Core/Src/Settings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
13 changes: 10 additions & 3 deletions source/Core/Src/settingsGUI.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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::printNumber(1, 3, FontStyle::LARGE);
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;
}
}

Expand Down
12 changes: 6 additions & 6 deletions source/Core/Threads/GUIThread.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ extern "C" {
#include "USBPD.h"
#include "pd.h"
#endif

// File local variables

extern bool heaterThermalRunaway;
Expand Down Expand Up @@ -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);
Expand Down