diff --git a/README.md b/README.md index b319730d..c431650a 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,9 @@ _This firmware does **NOT** support the USB port while running for changing sett | TS80 | ❌ | ✔️ | ❌ | ❌ | | TS80P | ❌ | ✔️ | ✔️ | ✔️ | +Please note that Miniware have started to ship TS100's using cloned STM32 Chips. While these do work with IronOS, their DFU bootloader works terribly and it is hard to get it to successfully flash larger firmware images like IronOS without timing out. THis is the main reason why the TS100 is _no longer reccomended_. + + ## Getting Started To get started with IronOS firmware, please jump to [Getting Started Guide](Documentation/GettingStarted.md). diff --git a/source/Core/BSP/MHP30/portmacro.h b/source/Core/BSP/MHP30/portmacro.h index 16d5242c..f6bf700c 100644 --- a/source/Core/BSP/MHP30/portmacro.h +++ b/source/Core/BSP/MHP30/portmacro.h @@ -27,7 +27,8 @@ #ifndef PORTMACRO_H #define PORTMACRO_H - +#include "FreeRTOSConfig.h" +#include "projdefs.h" #ifdef __cplusplus extern "C" { #endif diff --git a/source/Core/BSP/Miniware/FreeRTOSConfig.h b/source/Core/BSP/Miniware/FreeRTOSConfig.h index dd95674e..ed690c09 100644 --- a/source/Core/BSP/Miniware/FreeRTOSConfig.h +++ b/source/Core/BSP/Miniware/FreeRTOSConfig.h @@ -100,7 +100,7 @@ extern uint32_t SystemCoreClock; #define configUSE_IDLE_HOOK 1 #define configUSE_TICK_HOOK 0 #define configCPU_CLOCK_HZ (SystemCoreClock) -#define configTICK_RATE_HZ ((TickType_t)1000) +#define configTICK_RATE_HZ (1000) #define configMAX_PRIORITIES (6) #define configMINIMAL_STACK_SIZE ((uint16_t)256) #define configTOTAL_HEAP_SIZE ((size_t)1024 * 14) /*Currently use about 9000*/ diff --git a/source/Core/BSP/Miniware/portmacro.h b/source/Core/BSP/Miniware/portmacro.h index 16d5242c..85fe3b13 100644 --- a/source/Core/BSP/Miniware/portmacro.h +++ b/source/Core/BSP/Miniware/portmacro.h @@ -27,6 +27,8 @@ #ifndef PORTMACRO_H #define PORTMACRO_H +#include "FreeRTOSConfig.h" +#include "projdefs.h" #ifdef __cplusplus extern "C" { diff --git a/source/Core/BSP/Pine64/Vendor/OS/FreeRTOS/Source/portable/GCC/portmacro.h b/source/Core/BSP/Pine64/Vendor/OS/FreeRTOS/Source/portable/GCC/portmacro.h index b2911fcd..f73dacf6 100644 --- a/source/Core/BSP/Pine64/Vendor/OS/FreeRTOS/Source/portable/GCC/portmacro.h +++ b/source/Core/BSP/Pine64/Vendor/OS/FreeRTOS/Source/portable/GCC/portmacro.h @@ -58,14 +58,9 @@ typedef portSTACK_TYPE StackType_t; typedef long BaseType_t; typedef unsigned long UBaseType_t; -#if (configUSE_16_BIT_TICKS == 1) -typedef uint16_t TickType_t; -#define portMAX_DELAY (TickType_t)0xffff -#else /* RISC-V TIMER is 64-bit long */ typedef uint64_t TickType_t; #define portMAX_DELAY (TickType_t)0xFFFFFFFFFFFFFFFFULL -#endif /*-----------------------------------------------------------*/ /* Architecture specifics. */ diff --git a/source/Core/Drivers/Buttons.cpp b/source/Core/Drivers/Buttons.cpp index 3875ed96..18d4cc6f 100644 --- a/source/Core/Drivers/Buttons.cpp +++ b/source/Core/Drivers/Buttons.cpp @@ -8,7 +8,7 @@ #include "settingsGUI.hpp" #include "task.h" #include -uint32_t lastButtonTime = 0; +TickType_t lastButtonTime = 0; ButtonState getButtonState() { /* @@ -22,10 +22,11 @@ ButtonState getButtonState() { * press (buttons still down), or if release we trigger press * (downtime>filter) */ - static uint8_t previousState = 0; - static uint32_t previousStateChange = 0; - const uint16_t timeout = TICKS_100MS * 4; - uint8_t currentState; + static uint8_t previousState = 0; + static bool longPressed = false; + static TickType_t previousStateChange = 0; + const TickType_t timeout = TICKS_100MS * 4; + uint8_t currentState; currentState = (getButtonA()) << 0; currentState |= (getButtonB()) << 1; @@ -34,9 +35,10 @@ ButtonState getButtonState() { if (currentState == previousState) { if (currentState == 0) return BUTTON_NONE; - if ((xTaskGetTickCount() - previousStateChange) > timeout) { + if ((xTaskGetTickCount() - previousStateChange) >= timeout) { // User has been holding the button down // We want to send a button is held message + longPressed = true; if (currentState == 0x01) return BUTTON_F_LONG; else if (currentState == 0x02) @@ -50,19 +52,15 @@ ButtonState getButtonState() { ButtonState retVal = BUTTON_NONE; if (currentState) { // User has pressed a button down (nothing done on down) - if (currentState != previousState) { - // There has been a change in the button states - // If there is a rising edge on one of the buttons from double press we - // want to mask that out As users are having issues with not release - // both at once - if (previousState == 0x03) - currentState = 0x03; - } + // If there is a rising edge on one of the buttons from double press we + // want to mask that out As users are having issues with not release + // both at once + previousState |= currentState; } else { // User has released buttons // If they previously had the buttons down we want to check if they were < // long hold and trigger a press - if ((xTaskGetTickCount() - previousStateChange) < timeout) { + if (!longPressed) { // The user didn't hold the button for long // So we send button press @@ -73,8 +71,9 @@ ButtonState getButtonState() { else retVal = BUTTON_BOTH; // Both being held case } + previousState = 0; + longPressed = false; } - previousState = currentState; previousStateChange = xTaskGetTickCount(); return retVal; } @@ -95,7 +94,7 @@ void waitForButtonPress() { } } -void waitForButtonPressOrTimeout(uint32_t timeout) { +void waitForButtonPressOrTimeout(TickType_t timeout) { timeout += xTaskGetTickCount(); // calculate the exit point diff --git a/source/Core/Drivers/Buttons.hpp b/source/Core/Drivers/Buttons.hpp index 1aab1f3c..2e421118 100644 --- a/source/Core/Drivers/Buttons.hpp +++ b/source/Core/Drivers/Buttons.hpp @@ -7,8 +7,8 @@ #include "BSP.h" #ifndef INC_BUTTONS_H_ #define INC_BUTTONS_H_ - -extern uint32_t lastButtonTime; +#include "portmacro.h" +extern TickType_t lastButtonTime; enum ButtonState { BUTTON_NONE = 0, /* No buttons pressed / < filter time*/ @@ -29,7 +29,7 @@ enum ButtonState { // Returns what buttons are pressed (if any) ButtonState getButtonState(); // Helpers -void waitForButtonPressOrTimeout(uint32_t timeout); +void waitForButtonPressOrTimeout(TickType_t timeout); void waitForButtonPress(); #endif /* INC_BUTTONS_H_ */ diff --git a/source/Core/Drivers/OLED.cpp b/source/Core/Drivers/OLED.cpp index ab436e0e..0832c48f 100644 --- a/source/Core/Drivers/OLED.cpp +++ b/source/Core/Drivers/OLED.cpp @@ -221,7 +221,7 @@ void OLED::maskScrollIndicatorOnOLED() { // it from the screen buffer which is updated by `OLED::setRotation`. uint8_t rightmostColumn = screenBuffer[7]; uint8_t maskCommands[] = { - // Set column address: + // Set column address: // A[6:0] - Column start address = rightmost column // B[6:0] - Column end address = rightmost column 0x80, @@ -252,10 +252,10 @@ void OLED::transitionSecondaryFramebuffer(bool forwardNavigation) { uint8_t *firstBackStripPtr = &secondFrameBuffer[0]; uint8_t *secondBackStripPtr = &secondFrameBuffer[OLED_WIDTH]; - uint32_t totalDuration = TICKS_100MS * 5; // 500ms - uint32_t duration = 0; - uint32_t start = xTaskGetTickCount(); - uint8_t offset = 0; + TickType_t totalDuration = TICKS_100MS * 5; // 500ms + TickType_t duration = 0; + TickType_t start = xTaskGetTickCount(); + uint8_t offset = 0; while (duration <= totalDuration) { duration = xTaskGetTickCount() - start; diff --git a/source/Core/Inc/ScrollMessage.hpp b/source/Core/Inc/ScrollMessage.hpp index 3bce9aaf..3f97fdb9 100644 --- a/source/Core/Inc/ScrollMessage.hpp +++ b/source/Core/Inc/ScrollMessage.hpp @@ -1,14 +1,14 @@ #ifndef SCROLL_MESSAGE_HPP_ #define SCROLL_MESSAGE_HPP_ +#include "portmacro.h" #include - /** * A helper class for showing a full-screen scrolling message. */ class ScrollMessage { - uint32_t messageStart = 0; - int16_t lastOffset = -1; + TickType_t messageStart = 0; + int16_t lastOffset = -1; /** * Calcualte the width in pixels of the message string, in the large @@ -47,7 +47,7 @@ public: * @param currentTick The current tick as returned by `xTaskGetTickCount()`. * @return Whether the OLED framebuffer has been modified. */ - bool drawUpdate(const char *message, uint32_t currentTick); + bool drawUpdate(const char *message, TickType_t currentTick); }; #endif /* SCROLL_MESSAGE_HPP_ */ diff --git a/source/Core/Src/ScrollMessage.cpp b/source/Core/Src/ScrollMessage.cpp index 88bebfb7..d63cede3 100644 --- a/source/Core/Src/ScrollMessage.cpp +++ b/source/Core/Src/ScrollMessage.cpp @@ -30,7 +30,7 @@ static uint16_t str_display_len(const char *const str) { uint16_t ScrollMessage::messageWidth(const char *message) { return FONT_12_WIDTH * str_display_len(message); } -bool ScrollMessage::drawUpdate(const char *message, uint32_t currentTick) { +bool ScrollMessage::drawUpdate(const char *message, TickType_t currentTick) { bool lcdRefresh = false; if (messageStart == 0) { diff --git a/source/Core/Threads/GUIThread.cpp b/source/Core/Threads/GUIThread.cpp index 327e947a..22166db4 100644 --- a/source/Core/Threads/GUIThread.cpp +++ b/source/Core/Threads/GUIThread.cpp @@ -171,9 +171,9 @@ static void gui_drawBatteryIcon() { #endif } static void gui_solderingTempAdjust() { - uint32_t lastChange = xTaskGetTickCount(); + TickType_t lastChange = xTaskGetTickCount(); currentTempTargetDegC = 0; // Turn off header while adjusting temp - uint32_t autoRepeatTimer = 0; + TickType_t autoRepeatTimer = 0; uint8_t autoRepeatAcceleration = 0; bool waitForRelease = false; ButtonState buttons = getButtonState(); @@ -370,7 +370,7 @@ static void display_countdown(int sleepThres) { * Print seconds or minutes (if > 99 seconds) until sleep * mode is triggered. */ - int lastEventTime = lastButtonTime < lastMovementTime ? lastMovementTime : lastButtonTime; + TickType_t lastEventTime = lastButtonTime < lastMovementTime ? lastMovementTime : lastButtonTime; TickType_t downCount = sleepThres - xTaskGetTickCount() + lastEventTime; if (downCount > (99 * TICKS_SECOND)) { OLED::printNumber(downCount / 60000 + 1, 2, FontStyle::SMALL); diff --git a/source/Core/Threads/PIDThread.cpp b/source/Core/Threads/PIDThread.cpp index 7df72fc5..4b3c9704 100644 --- a/source/Core/Threads/PIDThread.cpp +++ b/source/Core/Threads/PIDThread.cpp @@ -17,7 +17,7 @@ static TickType_t powerPulseWaitUnit = 25 * TICKS_100MS; // 2.5 s static TickType_t powerPulseDurationUnit = (5 * TICKS_100MS) / 2; // 250 ms TaskHandle_t pidTaskNotification = NULL; -volatile uint32_t currentTempTargetDegC = 0; // Current temperature target in C +volatile uint32_t currentTempTargetDegC = 0; // Current temperature target in C int32_t powerSupplyWattageLimit = 0; bool heaterThermalRunaway = false; @@ -114,8 +114,8 @@ int32_t getPIDResultX10Watts(int32_t setpointDelta) { static TickType_t lastCall = 0; static Integrator powerStore = {0}; - const int rate = 1000 / (xTaskGetTickCount() - lastCall); - lastCall = xTaskGetTickCount(); + const TickType_t rate = 1000 / (xTaskGetTickCount() - lastCall); + lastCall = xTaskGetTickCount(); // Sandman note: // PID Challenge - we have a small thermal mass that we to want heat up as fast as possible but we don't // want to overshot excessively (if at all) the setpoint temperature. In the same time we have 'imprecise'