Skip to content

Commit

Permalink
Implement optional looping for animated boot logo [Ralim#1839]
Browse files Browse the repository at this point in the history
  • Loading branch information
ia committed Nov 20, 2023
1 parent e3bad2a commit a02f8c8
Show file tree
Hide file tree
Showing 5 changed files with 60 additions and 31 deletions.
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;
}
}

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

0 comments on commit a02f8c8

Please sign in to comment.