From f5cb42c9d74e4ce4646fa9e0496411b72eb4c48f Mon Sep 17 00:00:00 2001 From: "Ben V. Brown" <5425387+Ralim@users.noreply.github.com> Date: Thu, 16 Jun 2022 20:21:30 +1000 Subject: [PATCH 1/4] Infinite logo (#1309) * Check for button timeout of infinite * Dedupe * Alpine bump --- .github/workflows/push.yml | 14 +++++++------- Dockerfile | 2 +- source/Core/Drivers/BootLogo.cpp | 15 ++++++++++++--- 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 9c1eb85b..5720a006 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -6,7 +6,7 @@ jobs: build: runs-on: ubuntu-20.04 container: - image: alpine:3.15 + image: alpine:3.16 strategy: matrix: model: ["TS100", "TS80", "TS80P", "Pinecil", "MHP30"] @@ -22,7 +22,7 @@ jobs: - uses: actions/checkout@v3 with: submodules: true - + - name: Git ownership exception run: git config --global --add safe.directory /__w/IronOS/IronOS && git config --global safe.directory "$GITHUB_WORKSPACE" @@ -57,7 +57,7 @@ jobs: build_multi-lang: runs-on: ubuntu-20.04 container: - image: alpine:3.15 + image: alpine:3.16 strategy: matrix: model: ["Pinecil"] @@ -72,10 +72,10 @@ jobs: - uses: actions/checkout@v3 with: submodules: true - + - name: Git ownership exception run: git config --global --add safe.directory /__w/IronOS/IronOS && git config --global safe.directory "$GITHUB_WORKSPACE" - + - name: build ${{ matrix.model }} run: cd source && make -j$(nproc) model="${{ matrix.model }}" firmware-multi_compressed_European firmware-multi_compressed_Bulgarian+Russian+Serbian+Ukrainian firmware-multi_Chinese+Japanese @@ -107,7 +107,7 @@ jobs: tests: runs-on: ubuntu-20.04 container: - image: alpine:3.15 + image: alpine:3.16 steps: - name: deps @@ -134,7 +134,7 @@ jobs: check_formatting: runs-on: ubuntu-20.04 container: - image: alpine:3.15 + image: alpine:3.16 steps: - name: deps diff --git a/Dockerfile b/Dockerfile index 4622f33b..b1351a5a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM alpine:3.15 +FROM alpine:3.16 LABEL maintainer="Ben V. Brown " WORKDIR /build diff --git a/source/Core/Drivers/BootLogo.cpp b/source/Core/Drivers/BootLogo.cpp index 37b38eba..5113fadb 100644 --- a/source/Core/Drivers/BootLogo.cpp +++ b/source/Core/Drivers/BootLogo.cpp @@ -4,6 +4,15 @@ #include "OLED.hpp" #include "cmsis_os.h" #define LOGO_PAGE_LENGTH 1024 + +void delay() { + if (getSettingValue(SettingsOptions::LOGOTime) == 5) { + waitForButtonPress(); + } else { + waitForButtonPressOrTimeout(TICKS_SECOND * getSettingValue(SettingsOptions::LOGOTime)); + } +} + void BootLogo::handleShowingLogo(const uint8_t *ptrLogoArea) { // Read the first few bytes and figure out what format we are looking at if (OLD_LOGO_HEADER_VALUE == *(reinterpret_cast(ptrLogoArea))) { @@ -21,7 +30,7 @@ void BootLogo::showOldFormat(const uint8_t *ptrLogoArea) { OLED::refresh(); // Delay here until button is pressed or its been the amount of seconds set by the user - waitForButtonPressOrTimeout(TICKS_SECOND * getSettingValue(SettingsOptions::LOGOTime)); + delay(); } void BootLogo::showNewFormat(const uint8_t *ptrLogoArea) { @@ -46,9 +55,9 @@ void BootLogo::showNewFormat(const uint8_t *ptrLogoArea) { osDelay(interFrameDelay * 5); } // 1024 less the header type byte and the inter-frame-delay - if (getSettingValue(SettingsOptions::LOGOTime) < 5 && (position == 1022 || len == 0)) { + 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 - waitForButtonPressOrTimeout(TICKS_SECOND * getSettingValue(SettingsOptions::LOGOTime)); + delay(); return; } } while (buttons == BUTTON_NONE); From 3bb1b7bc323ab9caddba2ef6e259634b36517388 Mon Sep 17 00:00:00 2001 From: "Ben V. Brown" <5425387+Ralim@users.noreply.github.com> Date: Thu, 16 Jun 2022 20:21:46 +1000 Subject: [PATCH 2/4] Startup behaviour fixes (#1306) * Reduce PPS max to 20V to avoid instability Some PSU's cant actually run at 21V * Creating a rough draft of a "pre start check" concept * Newer alpine * Cleaning up MHP detection * Cleanup comments * PID: Run prestart based on ADC IRQ rather than times * MHP30: Far better startup for detecting tip gain * Newer alpine for github CI --- Dockerfile | 2 + source/Core/BSP/BSP.h | 4 + source/Core/BSP/MHP30/BSP.cpp | 134 ++++++++++++++----------- source/Core/BSP/MHP30/ThermoModel.cpp | 3 +- source/Core/BSP/Miniware/BSP.cpp | 3 +- source/Core/BSP/Pine64/BSP.cpp | 2 + source/Core/BSP/Pine64/configuration.h | 2 +- source/Core/Threads/GUIThread.cpp | 8 +- source/Core/Threads/PIDThread.cpp | 13 ++- 9 files changed, 98 insertions(+), 73 deletions(-) diff --git a/Dockerfile b/Dockerfile index b1351a5a..d420b12b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -14,6 +14,8 @@ RUN apk add --no-cache gcc-riscv-none-elf gcc-arm-none-eabi newlib-riscv-none-el # Install Python3 packages RUN python3 -m pip install bdflib black +# Git trust +RUN git config --global --add safe.directory /build/source COPY . /build/source COPY ./ci /build/ci diff --git a/source/Core/BSP/BSP.h b/source/Core/BSP/BSP.h index b7b2cb7d..6060f5f0 100644 --- a/source/Core/BSP/BSP.h +++ b/source/Core/BSP/BSP.h @@ -86,6 +86,10 @@ enum StatusLED { }; void setStatusLED(const enum StatusLED state); +// preStartChecks are run until they return 0 +// By the PID, after each ADC sample comes in +// For example, on the MHP30 this is used to figure out the resistance of the hotplate +uint8_t preStartChecks(); #ifdef __cplusplus } #endif diff --git a/source/Core/BSP/MHP30/BSP.cpp b/source/Core/BSP/MHP30/BSP.cpp index 12dac966..c1feab5c 100644 --- a/source/Core/BSP/MHP30/BSP.cpp +++ b/source/Core/BSP/MHP30/BSP.cpp @@ -13,13 +13,15 @@ #include WS2812 ws2812; -volatile uint16_t PWMSafetyTimer = 0; -volatile uint8_t pendingPWM = 0; -uint16_t totalPWM = 255; -const uint16_t powerPWM = 255; +volatile uint16_t PWMSafetyTimer = 0; +volatile uint8_t pendingPWM = 0; +uint16_t totalPWM = 255; +const uint16_t powerPWM = 255; +uint16_t tipSenseResistancex10Ohms = 0; +volatile bool tipMeasurementOccuring = false; +history rawTempFilter = {{0}, 0, 0}; -history rawTempFilter = {{0}, 0, 0}; -void resetWatchdog() { HAL_IWDG_Refresh(&hiwdg); } +void resetWatchdog() { HAL_IWDG_Refresh(&hiwdg); } #ifdef TEMP_NTC // Lookup table for the NTC @@ -208,7 +210,8 @@ uint16_t getHandleTemperature(uint8_t sample) { uint16_t getTipInstantTemperature() { return getADC(2); } uint16_t getTipRawTemp(uint8_t refresh) { - if (refresh) { + if (refresh && (tipMeasurementOccuring == false)) { + uint16_t lastSample = getTipInstantTemperature(); rawTempFilter.update(lastSample); return lastSample; @@ -348,69 +351,82 @@ void setPlatePullup(bool pullingUp) { HAL_GPIO_Init(PLATE_SENSOR_PULLUP_GPIO_Port, &GPIO_InitStruct); } -uint16_t tipSenseResistancex10Ohms = 0; -bool isTipDisconnected() { - static bool lastTipDisconnectedState = true; - static uint16_t adcReadingPD1Set = 0; - static TickType_t lastMeas = 0; +void performTipMeasurementStep(bool start) { + static uint16_t adcReadingPD1Set = 0; + static TickType_t lastMeas = 0; + // Inter state that performs the steps to measure the resistor on the tip + // Return 1 if a measurement is ongoing + + // We want to perform our startup measurements of the tip resistance until we detect one fitted + + // Step 1; if not setup, we turn on pullup and then wait + if (tipMeasurementOccuring == false && (start || tipSenseResistancex10Ohms == 0 || lastMeas == 0)) { + tipMeasurementOccuring = true; + tipSenseResistancex10Ohms = 0; + lastMeas = xTaskGetTickCount(); + adcReadingPD1Set = 0; + setPlatePullup(true); + return; + } + + // Wait 100ms for settle time + if ((xTaskGetTickCount() - lastMeas) < (TICKS_100MS)) { + return; + } + + lastMeas = xTaskGetTickCount(); + // We are sensing the resistance + if (adcReadingPD1Set == 0) { + // We will record the reading for PD1 being set + adcReadingPD1Set = getADC(3); + setPlatePullup(false); + return; + } + // Taking reading two + uint16_t adcReadingPD1Cleared = getADC(3); + uint32_t a = ((int)adcReadingPD1Set - (int)adcReadingPD1Cleared); + a *= 10000; + uint32_t b = ((int)adcReadingPD1Cleared + (32768 - (int)adcReadingPD1Set)); + if (b) { + tipSenseResistancex10Ohms = a / b; + } else { + tipSenseResistancex10Ohms = adcReadingPD1Set = lastMeas = 0; + } + if (tipSenseResistancex10Ohms > 1100 || tipSenseResistancex10Ohms < 900) { + tipSenseResistancex10Ohms = 0; // out of range + adcReadingPD1Set = 0; + lastMeas = 0; + return; + } + tipMeasurementOccuring = false; +} +bool isTipDisconnected() { + static bool lastDisconnectedState = false; // For the MHP30 we want to include a little extra logic in here // As when the tip is first connected we want to measure the ~100 ohm resistor on the base of the tip // And likewise if its removed we want to clear that measurement /* * plate_sensor_res = ((adc5_value_PD1_set - adc5_value_PD1_cleared) / (adc5_value_PD1_cleared + 4096 - adc5_value_PD1_set)) * 1000.0; * */ - - bool tipDisconnected = getADC(2) > (4090 * 8); - // We have to handle here that this ^ will trip while measuring the gain resistor - if (xTaskGetTickCount() - lastMeas < (TICKS_100MS * 2 + (TICKS_100MS / 2))) { - tipDisconnected = false; + if (tipMeasurementOccuring) { + performTipMeasurementStep(false); + return true; // We fake no tip disconnection during the measurement cycle to mask it } - if (tipDisconnected != lastTipDisconnectedState) { - if (tipDisconnected) { - // Tip is now disconnected - tipSenseResistancex10Ohms = 0; // zero out the resistance - adcReadingPD1Set = 0; - lastMeas = 0; - } - lastTipDisconnectedState = tipDisconnected; + // If we are too close to the top, most likely disconnected tip + bool tipDisconnected = getTipInstantTemperature() > (4090 * 8); + if (tipDisconnected == false && lastDisconnectedState == true) { + // Tip is now disconnected + performTipMeasurementStep(true); } - if (!tipDisconnected) { - if (tipSenseResistancex10Ohms == 0) { - if (lastMeas == 0) { - lastMeas = xTaskGetTickCount(); - setPlatePullup(true); - } else if (xTaskGetTickCount() - lastMeas > (TICKS_100MS)) { - lastMeas = xTaskGetTickCount(); - // We are sensing the resistance - if (adcReadingPD1Set == 0) { - // We will record the reading for PD1 being set - adcReadingPD1Set = getADC(3); - setPlatePullup(false); - } else { - // We have taken reading one - uint16_t adcReadingPD1Cleared = getADC(3); - uint32_t a = ((int)adcReadingPD1Set - (int)adcReadingPD1Cleared); - a *= 10000; - uint32_t b = ((int)adcReadingPD1Cleared + (32768 - (int)adcReadingPD1Set)); - if (b) { - tipSenseResistancex10Ohms = a / b; - } else { - tipSenseResistancex10Ohms = adcReadingPD1Set = lastMeas = 0; - } - if (tipSenseResistancex10Ohms > 1100 || tipSenseResistancex10Ohms < 900) { - tipSenseResistancex10Ohms = 0; // out of range - adcReadingPD1Set = 0; - lastMeas = 0; - } - } - } - return true; // we fake tip being disconnected until this is measured - } - } - + lastDisconnectedState = tipDisconnected; return tipDisconnected; } + +uint8_t preStartChecks() { + performTipMeasurementStep(false); + return tipMeasurementOccuring ? 1 : 0; +} void setBuzzer(bool on) { if (on) { htim3.Instance->CCR2 = 128; diff --git a/source/Core/BSP/MHP30/ThermoModel.cpp b/source/Core/BSP/MHP30/ThermoModel.cpp index 19c0e499..f43499a0 100644 --- a/source/Core/BSP/MHP30/ThermoModel.cpp +++ b/source/Core/BSP/MHP30/ThermoModel.cpp @@ -10,7 +10,8 @@ #include "configuration.h" extern uint16_t tipSenseResistancex10Ohms; uint32_t TipThermoModel::convertuVToDegC(uint32_t tipuVDelta) { - // For the MHP30, we are mimicing the original code and using the resistor fitted to the base of the heater head, this is measured in the isTipDisconnected() function + // For the MHP30, we are mimicing the original code and using the resistor fitted to the base of the heater head, + // this is measured at boot in pid task and in the disconnected tip check if tip is removed if (tipSenseResistancex10Ohms > 900 && tipSenseResistancex10Ohms <= 1100) { int32_t a = ((tipSenseResistancex10Ohms / 10) + 300) * (3300000 - tipuVDelta); int32_t b = a / 1000000; diff --git a/source/Core/BSP/Miniware/BSP.cpp b/source/Core/BSP/Miniware/BSP.cpp index 1d77a8c7..d40a7e17 100644 --- a/source/Core/BSP/Miniware/BSP.cpp +++ b/source/Core/BSP/Miniware/BSP.cpp @@ -282,4 +282,5 @@ bool isTipDisconnected() { return tipTemp > tipDisconnectedThres; } -void setStatusLED(const enum StatusLED state) {} +void setStatusLED(const enum StatusLED state) {} +uint8_t preStartChecks() { return 0; } \ No newline at end of file diff --git a/source/Core/BSP/Pine64/BSP.cpp b/source/Core/BSP/Pine64/BSP.cpp index 4b06fae3..2c7de076 100644 --- a/source/Core/BSP/Pine64/BSP.cpp +++ b/source/Core/BSP/Pine64/BSP.cpp @@ -90,3 +90,5 @@ bool isTipDisconnected() { } void setStatusLED(const enum StatusLED state) {} + +uint8_t preStartChecks() { return 0; } \ No newline at end of file diff --git a/source/Core/BSP/Pine64/configuration.h b/source/Core/BSP/Pine64/configuration.h index 09033126..27dcd4cc 100644 --- a/source/Core/BSP/Pine64/configuration.h +++ b/source/Core/BSP/Pine64/configuration.h @@ -124,7 +124,7 @@ #define POWER_LIMIT_STEPS 5 // #define OP_AMP_GAIN_STAGE OP_AMP_GAIN_STAGE_PINECIL // Uses TS100 resistors #define TEMP_uV_LOOKUP_HAKKO // Use Hakko lookup table -#define USB_PD_VMAX 21 // Maximum voltage for PD to negotiate +#define USB_PD_VMAX 20 // Maximum voltage for PD to negotiate #define PID_TIM_HZ (8) // Tick rate of the PID loop #define MAX_TEMP_C 450 // Max soldering temp selectable °C #define MAX_TEMP_F 850 // Max soldering temp selectable °F diff --git a/source/Core/Threads/GUIThread.cpp b/source/Core/Threads/GUIThread.cpp index 822b34b6..544aa172 100644 --- a/source/Core/Threads/GUIThread.cpp +++ b/source/Core/Threads/GUIThread.cpp @@ -172,7 +172,7 @@ static void gui_drawBatteryIcon() { } static void gui_solderingTempAdjust() { uint32_t lastChange = xTaskGetTickCount(); - currentTempTargetDegC = 0; + currentTempTargetDegC = 0; // Turn off header while adjusting temp uint32_t autoRepeatTimer = 0; uint8_t autoRepeatAcceleration = 0; bool waitForRelease = false; @@ -511,12 +511,8 @@ static void gui_solderingMode(uint8_t jumpToSleep) { boostModeOn = false; break; case BUTTON_BOTH: - // exit - return; - break; case BUTTON_B_LONG: return; // exit on back long hold - break; case BUTTON_F_LONG: // if boost mode is enabled turn it on if (getSettingValue(SettingsOptions::BoostTemp)) @@ -665,8 +661,6 @@ static void gui_solderingMode(uint8_t jumpToSleep) { // If we have tripped thermal runaway, turn off heater and show warning if (heaterThermalRunaway) { currentTempTargetDegC = 0; // heater control off - // TODO WARNING - warnUser(translatedString(Tr->WarningThermalRunaway), 10 * TICKS_SECOND); heaterThermalRunaway = false; return; diff --git a/source/Core/Threads/PIDThread.cpp b/source/Core/Threads/PIDThread.cpp index 4c56372c..161fa365 100644 --- a/source/Core/Threads/PIDThread.cpp +++ b/source/Core/Threads/PIDThread.cpp @@ -39,21 +39,26 @@ void startPIDTask(void const *argument __unused) { pidTaskNotification = xTaskGetCurrentTaskHandle(); uint32_t PIDTempTarget = 0; // Pre-seed the adc filters - for (int i = 0; i < 128; i++) { - osDelay(5); + for (int i = 0; i < 32; i++) { + ulTaskNotifyTake(pdTRUE, 5); TipThermoModel::getTipInC(true); getInputVoltageX10(getSettingValue(SettingsOptions::VoltageDiv), 1); } + + while (preStartChecks() != 0) { + ulTaskNotifyTake(pdTRUE, 2000); + } + int32_t x10WattsOut = 0; for (;;) { x10WattsOut = 0; // This is a call to block this thread until the ADC does its samples - if (ulTaskNotifyTake(pdTRUE, 2000)) { + if (ulTaskNotifyTake(pdTRUE, TICKS_SECOND * 2)) { // Do the reading here to keep the temp calculations churning along uint32_t currentTipTempInC = TipThermoModel::getTipInC(true); PIDTempTarget = currentTempTargetDegC; - if (PIDTempTarget) { + if (PIDTempTarget > 0) { // Cap the max set point to 450C if (PIDTempTarget > (450)) { // Maximum allowed output From 165a9952c2766718d18bff9d836e2b3f58e4368d Mon Sep 17 00:00:00 2001 From: "Ben V. Brown" <5425387+Ralim@users.noreply.github.com> Date: Thu, 16 Jun 2022 20:28:49 +1000 Subject: [PATCH 3/4] MHP30: Shutdown settings (#1307) * Reduce PPS max to 20V to avoid instability Some PSU's cant actually run at 21V * Creating a rough draft of a "pre start check" concept * Newer alpine * Cleaning up MHP detection * Cleanup comments * PID: Run prestart based on ADC IRQ rather than times * MHP30: Far better startup for detecting tip gain * Newer alpine for github CI * Bugfix: Exit on movement * Feature: Shutdown timeout for MHP30 --- source/Core/Inc/main.hpp | 6 ++--- source/Core/Src/settingsGUI.cpp | 36 ++++++++++++------------- source/Core/Threads/GUIThread.cpp | 44 ++++++++++++++++++------------- source/Core/Threads/PIDThread.cpp | 2 +- 4 files changed, 48 insertions(+), 40 deletions(-) diff --git a/source/Core/Inc/main.hpp b/source/Core/Inc/main.hpp index 42ee98e0..c2216408 100644 --- a/source/Core/Inc/main.hpp +++ b/source/Core/Inc/main.hpp @@ -3,9 +3,9 @@ #include "OLED.hpp" #include "Setup.h" -extern uint32_t currentTempTargetDegC; -extern bool settingsWereReset; -extern bool usb_pd_available; +extern volatile uint32_t currentTempTargetDegC; +extern bool settingsWereReset; +extern bool usb_pd_available; #ifdef __cplusplus extern "C" { #endif diff --git a/source/Core/Src/settingsGUI.cpp b/source/Core/Src/settingsGUI.cpp index adde3014..0f44e6ee 100644 --- a/source/Core/Src/settingsGUI.cpp +++ b/source/Core/Src/settingsGUI.cpp @@ -27,13 +27,13 @@ static void settings_displayQCInputV(void); #if POW_PD static void settings_displayPDNegTimeout(void); #endif -#ifndef NO_SLEEP_MODE static void settings_displaySensitivity(void); +static void settings_displayShutdownTime(void); static bool settings_showSleepOptions(void); +#ifndef NO_SLEEP_MODE static bool settings_setSleepTemp(void); static void settings_displaySleepTemp(void); static void settings_displaySleepTime(void); -static void settings_displayShutdownTime(void); #endif static bool settings_setTempF(void); static void settings_displayTempF(void); @@ -195,18 +195,18 @@ const menuitem solderingMenu[] = { {0, nullptr, nullptr, nullptr, SettingsOptions::SettingsOptionsLength} // end of menu marker. DO NOT REMOVE }; const menuitem PowerSavingMenu[] = { -/* - * Motion Sensitivity - * -Sleep Temp - * -Sleep Time - * -Shutdown Time - */ + /* + * Motion Sensitivity + * -Sleep Temp + * -Sleep Time + * -Shutdown Time + */ + {SETTINGS_DESC(SettingsItemIndex::MotionSensitivity), nullptr, settings_displaySensitivity, nullptr, SettingsOptions::Sensitivity}, /* Motion Sensitivity*/ #ifndef NO_SLEEP_MODE - {SETTINGS_DESC(SettingsItemIndex::MotionSensitivity), nullptr, settings_displaySensitivity, nullptr, SettingsOptions::Sensitivity}, /* Motion Sensitivity*/ {SETTINGS_DESC(SettingsItemIndex::SleepTemperature), settings_setSleepTemp, settings_displaySleepTemp, settings_showSleepOptions, SettingsOptions::SettingsOptionsLength}, /*Sleep Temp*/ {SETTINGS_DESC(SettingsItemIndex::SleepTimeout), nullptr, settings_displaySleepTime, settings_showSleepOptions, SettingsOptions::SleepTime}, /*Sleep Time*/ - {SETTINGS_DESC(SettingsItemIndex::ShutdownTimeout), nullptr, settings_displayShutdownTime, settings_showSleepOptions, SettingsOptions::ShutdownTime}, /*Shutdown Time*/ #endif + {SETTINGS_DESC(SettingsItemIndex::ShutdownTimeout), nullptr, settings_displayShutdownTime, settings_showSleepOptions, SettingsOptions::ShutdownTime}, /*Shutdown Time*/ #ifdef HALL_SENSOR {SETTINGS_DESC(SettingsItemIndex::HallEffSensitivity), nullptr, settings_displayHallEffect, settings_showHallEffect, SettingsOptions::HallEffectSensitivity}, /* HallEffect Sensitivity*/ #endif @@ -362,8 +362,6 @@ static void settings_displayPDNegTimeout(void) { } #endif -#ifndef NO_SLEEP_MODE - static void settings_displayShutdownTime(void) { printShortDescription(SettingsItemIndex::ShutdownTimeout, 5); if (getSettingValue(SettingsOptions::ShutdownTime) == 0) { @@ -374,6 +372,14 @@ static void settings_displayShutdownTime(void) { } } +static void settings_displaySensitivity(void) { + printShortDescription(SettingsItemIndex::MotionSensitivity, 7); + OLED::printNumber(getSettingValue(SettingsOptions::Sensitivity), 1, FontStyle::LARGE, false); +} +static bool settings_showSleepOptions(void) { return getSettingValue(SettingsOptions::Sensitivity) > 0; } + +#ifndef NO_SLEEP_MODE + static bool settings_setSleepTemp(void) { // If in C, 10 deg, if in F 20 deg uint16_t temp = getSettingValue(SettingsOptions::SleepTemp); @@ -392,12 +398,6 @@ static bool settings_setSleepTemp(void) { } } -static void settings_displaySensitivity(void) { - printShortDescription(SettingsItemIndex::MotionSensitivity, 7); - OLED::printNumber(getSettingValue(SettingsOptions::Sensitivity), 1, FontStyle::LARGE, false); -} - -static bool settings_showSleepOptions(void) { return getSettingValue(SettingsOptions::Sensitivity) > 0; } static void settings_displaySleepTemp(void) { printShortDescription(SettingsItemIndex::SleepTemperature, 5); OLED::printNumber(getSettingValue(SettingsOptions::SleepTemp), 3, FontStyle::LARGE); diff --git a/source/Core/Threads/GUIThread.cpp b/source/Core/Threads/GUIThread.cpp index 544aa172..be7ee864 100644 --- a/source/Core/Threads/GUIThread.cpp +++ b/source/Core/Threads/GUIThread.cpp @@ -29,7 +29,7 @@ extern "C" { #include "pd.h" #endif // File local variables -extern uint32_t currentTempTargetDegC; + extern TickType_t lastMovementTime; extern bool heaterThermalRunaway; extern osThreadId GUITaskHandle; @@ -350,28 +350,11 @@ static int gui_SolderingSleepingMode(bool stayOff, bool autoStarted) { OLED::refresh(); GUIDelay(); -#ifdef ACCEL_EXITS_ON_MOVEMENT - // If the accel works in reverse where movement will cause exiting the soldering mode - if (getSettingValue(SettingsOptions::Sensitivity)) { - if (lastMovementTime) { - if (lastMovementTime > TICKS_SECOND * 10) { - // If we have moved recently; in the last second - // Then exit soldering mode - - if (((TickType_t)(xTaskGetTickCount() - lastMovementTime)) < (TickType_t)(TICKS_SECOND)) { - currentTempTargetDegC = 0; - return 1; - } - } - } - } -#else if (!shouldBeSleeping(autoStarted)) { return 0; } -#endif if (shouldShutdown()) { // shutdown currentTempTargetDegC = 0; @@ -645,6 +628,31 @@ static void gui_solderingMode(uint8_t jumpToSleep) { } #endif +#ifdef ACCEL_EXITS_ON_MOVEMENT + // If the accel works in reverse where movement will cause exiting the soldering mode + if (getSettingValue(SettingsOptions::Sensitivity)) { + if (lastMovementTime) { + if (lastMovementTime > TICKS_SECOND * 10) { + // If we have moved recently; in the last second + // Then exit soldering mode + + if (((TickType_t)(xTaskGetTickCount() - lastMovementTime)) < (TickType_t)(TICKS_SECOND)) { + currentTempTargetDegC = 0; + return; + } + } + } + } +#endif +#ifdef NO_SLEEP_MODE + // No sleep mode, but still want shutdown timeout + + if (shouldShutdown()) { + // shutdown + currentTempTargetDegC = 0; + return; // we want to exit soldering mode + } +#endif if (shouldBeSleeping()) { if (gui_SolderingSleepingMode(false, false)) { return; // If the function returns non-0 then exit diff --git a/source/Core/Threads/PIDThread.cpp b/source/Core/Threads/PIDThread.cpp index 161fa365..7df72fc5 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; -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; From 078b8f5626aae409190c4748588dd5f018f01e7c Mon Sep 17 00:00:00 2001 From: "Ben V. Brown" <5425387+Ralim@users.noreply.github.com> Date: Thu, 16 Jun 2022 21:39:53 +1000 Subject: [PATCH 4/4] DeviceID (#1314) * Ability to print hex * Add device ID getter * Refactor debug menu * No longer need patch * Update make_translation.py * Fix typo * Fix hex drawing --- Translations/make_translation.py | 26 +++++++-- source/Core/BSP/BSP.h | 3 + source/Core/BSP/MHP30/BSP.cpp | 4 ++ source/Core/BSP/Miniware/BSP.cpp | 8 ++- .../STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal.h | 3 + .../STM32F1xx_HAL_Driver/Src/stm32f1xx_hal.c | 18 ++++++ source/Core/BSP/Pine64/BSP.cpp | 3 +- source/Core/Drivers/OLED.cpp | 7 +++ source/Core/Drivers/OLED.hpp | 5 +- source/Core/Threads/GUIThread.cpp | 55 +++++++++++-------- source/Makefile | 8 +-- source/patch.specs | 2 - 12 files changed, 104 insertions(+), 38 deletions(-) delete mode 100644 source/patch.specs diff --git a/Translations/make_translation.py b/Translations/make_translation.py index c2c61590..5c5478ec 100755 --- a/Translations/make_translation.py +++ b/Translations/make_translation.py @@ -120,9 +120,6 @@ def get_constants(build_version: str) -> List[Tuple[str, str]]: def get_debug_menu() -> List[str]: return [ datetime.today().strftime("%d-%m-%y"), - "HW G ", - "HW M ", - "HW P ", "Time ", "Move ", "RTip ", @@ -131,7 +128,11 @@ def get_debug_menu() -> List[str]: "Vin ", "ACC ", "PWR ", + "ID ", "Max ", + "HW G ", + "HW M ", + "HW P ", "Hall ", ] @@ -429,7 +430,24 @@ def get_font_map_per_font(text_list: List[str], fonts: List[str]) -> FontMapsPer def get_forced_first_symbols() -> List[str]: - forced_first_symbols = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"] + forced_first_symbols = [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "a", + "b", + "c", + "d", + "e", + "f", + ] return forced_first_symbols diff --git a/source/Core/BSP/BSP.h b/source/Core/BSP/BSP.h index 6060f5f0..dd41bc7f 100644 --- a/source/Core/BSP/BSP.h +++ b/source/Core/BSP/BSP.h @@ -74,6 +74,9 @@ void log_system_state(int32_t PWMWattsx10); // Returns true if the tip is disconnected bool isTipDisconnected(); +// Return hardware unique ID if possible +uint64_t getDeviceID(); + // Status LED controls enum StatusLED { diff --git a/source/Core/BSP/MHP30/BSP.cpp b/source/Core/BSP/MHP30/BSP.cpp index c1feab5c..32c6ffb4 100644 --- a/source/Core/BSP/MHP30/BSP.cpp +++ b/source/Core/BSP/MHP30/BSP.cpp @@ -471,3 +471,7 @@ void setStatusLED(const enum StatusLED state) { setBuzzer(false); } } +uint64_t getDeviceID() { + // + return HAL_GetUIDw0() | ((uint64_t)HAL_GetUIDw1() << 32); +} \ No newline at end of file diff --git a/source/Core/BSP/Miniware/BSP.cpp b/source/Core/BSP/Miniware/BSP.cpp index d40a7e17..2e86af22 100644 --- a/source/Core/BSP/Miniware/BSP.cpp +++ b/source/Core/BSP/Miniware/BSP.cpp @@ -282,5 +282,9 @@ bool isTipDisconnected() { return tipTemp > tipDisconnectedThres; } -void setStatusLED(const enum StatusLED state) {} -uint8_t preStartChecks() { return 0; } \ No newline at end of file +void setStatusLED(const enum StatusLED state) {} +uint8_t preStartChecks() { return 0; } +uint64_t getDeviceID() { + // + return HAL_GetUIDw0() | ((uint64_t)HAL_GetUIDw1() << 32); +} diff --git a/source/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal.h b/source/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal.h index 2bb753ce..2cd99b27 100644 --- a/source/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal.h +++ b/source/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal.h @@ -310,6 +310,9 @@ void HAL_ResumeTick(void); uint32_t HAL_GetHalVersion(void); uint32_t HAL_GetREVID(void); uint32_t HAL_GetDEVID(void); +uint32_t HAL_GetUIDw0(void); +uint32_t HAL_GetUIDw1(void); +uint32_t HAL_GetUIDw2(void); void HAL_DBGMCU_EnableDBGSleepMode(void); void HAL_DBGMCU_DisableDBGSleepMode(void); void HAL_DBGMCU_EnableDBGStopMode(void); diff --git a/source/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal.c b/source/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal.c index 4e8304d1..cb32ffdf 100644 --- a/source/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal.c +++ b/source/Core/BSP/Miniware/Vendor/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal.c @@ -513,6 +513,24 @@ void HAL_GetUID(uint32_t *UID) { UID[2] = (uint32_t)(READ_REG(*((uint32_t *)(UID_BASE + 8U)))); } +/** + * @brief Returns first word of the unique device identifier (UID based on 96 bits) + * @retval Device identifier + */ +uint32_t HAL_GetUIDw0(void) { return (READ_REG(*((uint32_t *)UID_BASE))); } + +/** + * @brief Returns second word of the unique device identifier (UID based on 96 bits) + * @retval Device identifier + */ +uint32_t HAL_GetUIDw1(void) { return (READ_REG(*((uint32_t *)(UID_BASE + 4U)))); } + +/** + * @brief Returns third word of the unique device identifier (UID based on 96 bits) + * @retval Device identifier + */ +uint32_t HAL_GetUIDw2(void) { return (READ_REG(*((uint32_t *)(UID_BASE + 8U)))); } + /** * @} */ diff --git a/source/Core/BSP/Pine64/BSP.cpp b/source/Core/BSP/Pine64/BSP.cpp index 2c7de076..3b8df2eb 100644 --- a/source/Core/BSP/Pine64/BSP.cpp +++ b/source/Core/BSP/Pine64/BSP.cpp @@ -91,4 +91,5 @@ bool isTipDisconnected() { void setStatusLED(const enum StatusLED state) {} -uint8_t preStartChecks() { return 0; } \ No newline at end of file +uint8_t preStartChecks() { return 0; } +uint64_t getDeviceID() { return dbg_id_get(); } diff --git a/source/Core/Drivers/OLED.cpp b/source/Core/Drivers/OLED.cpp index 260af607..ab436e0e 100644 --- a/source/Core/Drivers/OLED.cpp +++ b/source/Core/Drivers/OLED.cpp @@ -423,6 +423,13 @@ inline void stripLeaderZeros(char *buffer, uint8_t places) { } } } +void OLED::drawHex(uint32_t x, FontStyle fontStyle) { + // print number to hex + for (uint_fast8_t i = 0; i < 8; i++) { + uint16_t value = (x >> (4 * (7 - i))) & 0b1111; + drawChar(value + 2, fontStyle); + } +} // maximum places is 5 void OLED::printNumber(uint16_t number, uint8_t places, FontStyle fontStyle, bool noLeaderZeros) { char buffer[7] = {0}; diff --git a/source/Core/Drivers/OLED.hpp b/source/Core/Drivers/OLED.hpp index ee322815..0d6f790c 100644 --- a/source/Core/Drivers/OLED.hpp +++ b/source/Core/Drivers/OLED.hpp @@ -89,6 +89,7 @@ public: // Draws a checkbox static void drawCheckbox(bool state) { drawSymbol((state) ? 16 : 17); } static void debugNumber(int32_t val, FontStyle fontStyle); + static void drawHex(uint32_t x, FontStyle fontStyle); static void drawSymbol(uint8_t symbolID); // Used for drawing symbols of a predictable width static void drawArea(int16_t x, int8_t y, uint8_t wide, uint8_t height, const uint8_t *ptr); // Draw an area, but y must be aligned on 0/8 offset static void drawAreaSwapped(int16_t x, int8_t y, uint8_t wide, uint8_t height, const uint8_t *ptr); // Draw an area, but y must be aligned on 0/8 offset @@ -104,8 +105,8 @@ public: private: static void drawChar(uint16_t charCode, FontStyle fontStyle); // Draw a character to the current cursor location static void setFramebuffer(uint8_t *buffer); - static uint8_t * firstStripPtr; // Pointers to the strips to allow for buffer having extra content - static uint8_t * secondStripPtr; // Pointers to the strips + static uint8_t *firstStripPtr; // Pointers to the strips to allow for buffer having extra content + static uint8_t *secondStripPtr; // Pointers to the strips static bool inLeftHandedMode; // Whether the screen is in left or not (used for offsets in GRAM) static bool initDone; static DisplayState displayState; diff --git a/source/Core/Threads/GUIThread.cpp b/source/Core/Threads/GUIThread.cpp index be7ee864..d0a863fc 100644 --- a/source/Core/Threads/GUIThread.cpp +++ b/source/Core/Threads/GUIThread.cpp @@ -691,46 +691,34 @@ void showDebugMenu(void) { case 0: // Just prints date break; case 1: - // High water mark for GUI - OLED::printNumber(uxTaskGetStackHighWaterMark(GUITaskHandle), 5, FontStyle::SMALL); - break; - case 2: - // High water mark for the Movement task - OLED::printNumber(uxTaskGetStackHighWaterMark(MOVTaskHandle), 5, FontStyle::SMALL); - break; - case 3: - // High water mark for the PID task - OLED::printNumber(uxTaskGetStackHighWaterMark(PIDTaskHandle), 5, FontStyle::SMALL); - break; - case 4: // system up time stamp OLED::printNumber(xTaskGetTickCount() / TICKS_100MS, 5, FontStyle::SMALL); break; - case 5: + case 2: // Movement time stamp OLED::printNumber(lastMovementTime / TICKS_100MS, 5, FontStyle::SMALL); break; - case 6: + case 3: // Raw Tip { OLED::printNumber(TipThermoModel::convertTipRawADCTouV(getTipRawTemp(0), true), 6, FontStyle::SMALL); } break; - case 7: + case 4: // Temp in C OLED::printNumber(TipThermoModel::getTipInC(), 5, FontStyle::SMALL); break; - case 8: + case 5: // Handle Temp OLED::printNumber(getHandleTemperature(0), 6, FontStyle::SMALL); break; - case 9: + case 6: // Voltage input printVoltage(); break; - case 10: + case 7: // Print ACC type OLED::print(AccelTypeNames[(int)DetectedAccelerometerVersion], FontStyle::SMALL); break; - case 11: + case 8: // Power negotiation status { int sourceNumber = 0; @@ -766,12 +754,32 @@ void showDebugMenu(void) { OLED::print(PowerSourceNames[sourceNumber], FontStyle::SMALL); } break; - case 12: + case 9: + // Print device ID Numbers + { + uint64_t id = getDeviceID(); + OLED::drawHex((uint32_t)(id >> 32), FontStyle::SMALL); + OLED::drawHex((uint32_t)(id & 0xFFFFFFFF), FontStyle::SMALL); + } + break; + case 10: // Max deg C limit OLED::printNumber(TipThermoModel::getTipMaxInC(), 3, FontStyle::SMALL); break; -#ifdef HALL_SENSOR + case 11: + // High water mark for GUI + OLED::printNumber(uxTaskGetStackHighWaterMark(GUITaskHandle), 5, FontStyle::SMALL); + break; + case 12: + // High water mark for the Movement task + OLED::printNumber(uxTaskGetStackHighWaterMark(MOVTaskHandle), 5, FontStyle::SMALL); + break; case 13: + // High water mark for the PID task + OLED::printNumber(uxTaskGetStackHighWaterMark(PIDTaskHandle), 5, FontStyle::SMALL); + break; +#ifdef HALL_SENSOR + case 14: // Print raw hall effect value if availabe, none if hall effect disabled. { int16_t hallEffectStrength = getRawHallEffect(); @@ -781,6 +789,7 @@ void showDebugMenu(void) { } break; #endif + default: break; } @@ -792,9 +801,9 @@ void showDebugMenu(void) { else if (b == BUTTON_F_SHORT) { screen++; #ifdef HALL_SENSOR - screen = screen % 14; + screen = screen % 15; #else - screen = screen % 13; + screen = screen % 14; #endif } GUIDelay(); diff --git a/source/Makefile b/source/Makefile index 0de50fbf..0d7a78a4 100644 --- a/source/Makefile +++ b/source/Makefile @@ -1,5 +1,5 @@ ifndef model -model:=TS100 +model:=Pinecil endif ALL_MINIWARE_MODELS=TS100 TS80 TS80P @@ -161,7 +161,7 @@ bootldr_size=0x0 CPUFLAGS= -march=rv32imac \ -mabi=ilp32 \ -mcmodel=medany -fsigned-char -fno-builtin -nostartfiles -DEV_LDFLAGS=-nostartfiles --specs=patch.specs +DEV_LDFLAGS=-nostartfiles DEV_AFLAGS= DEV_GLOBAL_DEFS= -DRTOS_FREERTOS -DDOWNLOAD_MODE=DOWNLOAD_MODE_FLASHXIP DEV_CFLAGS= @@ -192,10 +192,10 @@ $(shell find $(DEVICE_BSP_DIR) -type f -name '*.cpp') \ $(shell find $(SOURCE_MIDDLEWARES_DIR) -type f -name '*.cpp') # code optimisation ------------------------------------------------------------ -OPTIM=-Os -flto -finline-small-functions -fshort-wchar -findirect-inlining -fdiagnostics-color -ffunction-sections -fdata-sections -fshort-enums -fsingle-precision-constant -fno-common +OPTIM=-Os -flto -finline-small-functions -findirect-inlining -fdiagnostics-color -ffunction-sections -fdata-sections -fshort-enums -fsingle-precision-constant -fno-common # global defines --------------------------------------------------------------- -GLOBAL_DEFINES += $(DEV_GLOBAL_DEFS) -D USE_RTOS_SYSTICK -D MODEL_$(model) -D VECT_TAB_OFFSET=$(bootldr_size)U +GLOBAL_DEFINES += $(DEV_GLOBAL_DEFS) -D USE_RTOS_SYSTICK -D MODEL_$(model) -D VECT_TAB_OFFSET=$(bootldr_size)U -fshort-wchar DEBUG=-g3 ifdef swd_enable diff --git a/source/patch.specs b/source/patch.specs deleted file mode 100644 index 312b1d49..00000000 --- a/source/patch.specs +++ /dev/null @@ -1,2 +0,0 @@ -*link: -%(nano_link) %:replace-outfile(-lm_nano -lm) \ No newline at end of file