aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorBen V. Brown <[email protected]>2019-08-19 20:36:57 +1000
committerBen V. Brown <[email protected]>2019-08-19 20:36:57 +1000
commitaed7d7b12605292ac12377a8b8595a27663ff900 (patch)
tree269ef714243c089da310598670c9e843bae90bfe
parenta49c4e974096deef007200570f3a2ce3abdc310e (diff)
downloadIronOS-aed7d7b12605292ac12377a8b8595a27663ff900.tar.gz
IronOS-aed7d7b12605292ac12377a8b8595a27663ff900.zip
Split GUI out for easier management
-rwxr-xr-x[-rw-r--r--]Translation Editor/make_translation.py0
-rw-r--r--workspace/TS100/Core/Src/GUIThread.cpp855
-rw-r--r--workspace/TS100/Core/Src/main.cpp826
3 files changed, 855 insertions, 826 deletions
diff --git a/Translation Editor/make_translation.py b/Translation Editor/make_translation.py
index 55527292..55527292 100644..100755
--- a/Translation Editor/make_translation.py
+++ b/Translation Editor/make_translation.py
diff --git a/workspace/TS100/Core/Src/GUIThread.cpp b/workspace/TS100/Core/Src/GUIThread.cpp
new file mode 100644
index 00000000..18365dcd
--- /dev/null
+++ b/workspace/TS100/Core/Src/GUIThread.cpp
@@ -0,0 +1,855 @@
+/*
+ * GUIThread.cpp
+ *
+ * Created on: 19 Aug 2019
+ * Author: ralim
+ */
+#include <MMA8652FC.hpp>
+#include <gui.hpp>
+#include <main.hpp>
+#include "LIS2DH12.hpp"
+#include <history.hpp>
+#include <power.hpp>
+#include "Settings.h"
+#include "Translation.h"
+#include "cmsis_os.h"
+#include "stdlib.h"
+#include "stm32f1xx_hal.h"
+#include "string.h"
+extern uint8_t PCBVersion;
+// File local variables
+extern uint32_t currentlyActiveTemperatureTarget;
+extern uint32_t lastMovementTime;
+extern int16_t idealQCVoltage;
+uint32_t lastButtonTime = 0;
+extern osThreadId GUITaskHandle;
+extern osThreadId MOVTaskHandle;
+extern osThreadId PIDTaskHandle;
+
+static uint16_t min(uint16_t a, uint16_t b) {
+ if (a > b)
+ return b;
+ else
+ return a;
+}
+
+void printVoltage() {
+ uint32_t volt = getInputVoltageX10(systemSettings.voltageDiv, 0);
+ OLED::printNumber(volt / 10, 2);
+ OLED::print(SymbolDot);
+ OLED::printNumber(volt % 10, 1);
+}
+void GUIDelay() {
+ // Called in all UI looping tasks,
+ // This limits the re-draw rate to the LCD and also lets the DMA run
+ // As the gui task can very easily fill this bus with transactions, which will
+ // prevent the movement detection from running
+ osDelay(50);
+}
+void gui_drawTipTemp(bool symbol) {
+ // Draw tip temp handling unit conversion & tolerance near setpoint
+ uint16_t Temp = getTipRawTemp(0);
+
+ if (systemSettings.temperatureInF)
+ Temp = tipMeasurementToF(Temp);
+ else
+ Temp = tipMeasurementToC(Temp);
+
+ OLED::printNumber(Temp, 3); // Draw the tip temp out finally
+ if (symbol) {
+ if (systemSettings.temperatureInF)
+ OLED::print(SymbolDegF);
+ else
+ OLED::print(SymbolDegC);
+ }
+}
+ButtonState getButtonState() {
+ /*
+ * Read in the buttons and then determine if a state change needs to occur
+ */
+
+ /*
+ * If the previous state was 00 Then we want to latch the new state if
+ * different & update time
+ * If the previous state was !00 Then we want to search if we trigger long
+ * 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 = 40;
+ uint8_t currentState;
+ currentState = (
+ HAL_GPIO_ReadPin(KEY_A_GPIO_Port, KEY_A_Pin) == GPIO_PIN_RESET ?
+ 1 : 0) << 0;
+ currentState |= (
+ HAL_GPIO_ReadPin(KEY_B_GPIO_Port, KEY_B_Pin) == GPIO_PIN_RESET ?
+ 1 : 0) << 1;
+
+ if (currentState)
+ lastButtonTime = xTaskGetTickCount();
+ if (currentState == previousState) {
+ if (currentState == 0)
+ return BUTTON_NONE;
+ if ((xTaskGetTickCount() - previousStateChange) > timeout) {
+ // User has been holding the button down
+ // We want to send a buttong is held message
+ if (currentState == 0x01)
+ return BUTTON_F_LONG;
+ else if (currentState == 0x02)
+ return BUTTON_B_LONG;
+ else
+ return BUTTON_NONE; // Both being held case, we dont long hold this
+ } else
+ return BUTTON_NONE;
+ } else {
+ // A change in button state has occurred
+ 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;
+ }
+ } 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) {
+ // The user didn't hold the button for long
+ // So we send button press
+
+ if (previousState == 0x01)
+ retVal = BUTTON_F_SHORT;
+ else if (previousState == 0x02)
+ retVal = BUTTON_B_SHORT;
+ else
+ retVal = BUTTON_BOTH; // Both being held case
+ }
+ }
+ previousState = currentState;
+ previousStateChange = xTaskGetTickCount();
+ return retVal;
+ }
+ return BUTTON_NONE;
+}
+
+void waitForButtonPress() {
+ // we are just lazy and sleep until user confirms button press
+ // This also eats the button press event!
+ ButtonState buttons = getButtonState();
+ while (buttons) {
+ buttons = getButtonState();
+ GUIDelay();
+ }
+ while (!buttons) {
+ buttons = getButtonState();
+ GUIDelay();
+ }
+}
+
+void waitForButtonPressOrTimeout(uint32_t timeout) {
+ timeout += xTaskGetTickCount();
+ // calculate the exit point
+
+ ButtonState buttons = getButtonState();
+ while (buttons) {
+ buttons = getButtonState();
+ GUIDelay();
+ if (xTaskGetTickCount() > timeout)
+ return;
+ }
+ while (!buttons) {
+ buttons = getButtonState();
+ GUIDelay();
+ if (xTaskGetTickCount() > timeout)
+ return;
+ }
+}
+#ifdef MODEL_TS100
+// returns true if undervoltage has occured
+static bool checkVoltageForExit() {
+ uint16_t v = getInputVoltageX10(systemSettings.voltageDiv, 0);
+
+ //Dont check for first 1.5 seconds while the ADC stabilizes and the DMA fills the buffer
+ if (xTaskGetTickCount() > 150) {
+ if ((v < lookupVoltageLevel(systemSettings.cutoutSetting))) {
+ GUIDelay();
+ OLED::clearScreen();
+ OLED::setCursor(0, 0);
+ if (systemSettings.detailedSoldering) {
+ OLED::setFont(1);
+ OLED::print(UndervoltageString);
+ OLED::setCursor(0, 8);
+ OLED::print(InputVoltageString);
+ printVoltage();
+ OLED::print("V");
+
+ } else {
+ OLED::setFont(0);
+ OLED::print(UVLOWarningString);
+ }
+
+ OLED::refresh();
+ currentlyActiveTemperatureTarget = 0;
+ waitForButtonPress();
+ return true;
+ }
+ }
+ return false;
+}
+#endif
+static void gui_drawBatteryIcon() {
+#ifdef MODEL_TS100
+ if (systemSettings.cutoutSetting) {
+ // User is on a lithium battery
+ // we need to calculate which of the 10 levels they are on
+ uint8_t cellCount = systemSettings.cutoutSetting + 2;
+ uint32_t cellV = getInputVoltageX10(systemSettings.voltageDiv, 0)
+ / cellCount;
+ // Should give us approx cell voltage X10
+ // Range is 42 -> 33 = 9 steps therefore we will use battery 1-10
+ if (cellV < 33)
+ cellV = 33;
+ cellV -= 33;// Should leave us a number of 0-9
+ if (cellV > 9)
+ cellV = 9;
+ OLED::drawBattery(cellV + 1);
+ } else
+ OLED::drawSymbol(15); // Draw the DC Logo
+#else
+ // On TS80 we replace this symbol with the voltage we are operating on
+ // If <9V then show single digit, if not show duals
+ uint8_t V = getInputVoltageX10(systemSettings.voltageDiv, 0);
+ if (V % 10 >= 5)
+ V = V / 10 + 1; // round up
+ else
+ V = V / 10;
+ if (V >= 10) {
+ int16_t xPos = OLED::getCursorX();
+ OLED::setFont(1);
+ OLED::printNumber(1, 1);
+ OLED::setCursor(xPos, 8);
+ OLED::printNumber(V % 10, 1);
+ OLED::setFont(0);
+ OLED::setCursor(xPos + 12, 0); // need to reset this as if we drew a wide char
+ } else {
+ OLED::printNumber(V, 1);
+ }
+#endif
+}
+static void gui_solderingTempAdjust() {
+ uint32_t lastChange = xTaskGetTickCount();
+ currentlyActiveTemperatureTarget = 0;
+ uint32_t autoRepeatTimer = 0;
+ uint8_t autoRepeatAcceleration = 0;
+ for (;;) {
+ OLED::setCursor(0, 0);
+ OLED::clearScreen();
+ OLED::setFont(0);
+ ButtonState buttons = getButtonState();
+ if (buttons)
+ lastChange = xTaskGetTickCount();
+ switch (buttons) {
+ case BUTTON_NONE:
+ // stay
+ break;
+ case BUTTON_BOTH:
+ // exit
+ return;
+ break;
+ case BUTTON_B_LONG:
+ if (xTaskGetTickCount() - autoRepeatTimer
+ + autoRepeatAcceleration > PRESS_ACCEL_INTERVAL_MAX) {
+ systemSettings.SolderingTemp -= 10; // sub 10
+ autoRepeatTimer = xTaskGetTickCount();
+ autoRepeatAcceleration += PRESS_ACCEL_STEP;
+ }
+ break;
+ case BUTTON_F_LONG:
+ if (xTaskGetTickCount() - autoRepeatTimer
+ + autoRepeatAcceleration > PRESS_ACCEL_INTERVAL_MAX) {
+ systemSettings.SolderingTemp += 10;
+ autoRepeatTimer = xTaskGetTickCount();
+ autoRepeatAcceleration += PRESS_ACCEL_STEP;
+ }
+ break;
+ case BUTTON_F_SHORT:
+ systemSettings.SolderingTemp += 10; // add 10
+ break;
+ case BUTTON_B_SHORT:
+ systemSettings.SolderingTemp -= 10; // sub 10
+ break;
+ default:
+ break;
+ }
+ if ((PRESS_ACCEL_INTERVAL_MAX - autoRepeatAcceleration)
+ < PRESS_ACCEL_INTERVAL_MIN) {
+ autoRepeatAcceleration = PRESS_ACCEL_INTERVAL_MAX
+ - PRESS_ACCEL_INTERVAL_MIN;
+ }
+ // constrain between 50-450 C
+ if (systemSettings.temperatureInF) {
+ if (systemSettings.SolderingTemp > 850)
+ systemSettings.SolderingTemp = 850;
+ if (systemSettings.SolderingTemp < 120)
+ systemSettings.SolderingTemp = 120;
+ } else {
+ if (systemSettings.SolderingTemp > 450)
+ systemSettings.SolderingTemp = 450;
+ if (systemSettings.SolderingTemp < 50)
+ systemSettings.SolderingTemp = 50;
+ }
+
+ if (xTaskGetTickCount() - lastChange > 200)
+ return; // exit if user just doesn't press anything for a bit
+
+#ifdef MODEL_TS80
+ if (!OLED::getRotation())
+#else
+ if (OLED::getRotation())
+#endif
+ OLED::print(SymbolMinus);
+ else
+ OLED::print(SymbolPlus);
+
+ OLED::print(SymbolSpace);
+ OLED::printNumber(systemSettings.SolderingTemp, 3);
+ if (systemSettings.temperatureInF)
+ OLED::drawSymbol(0);
+ else
+ OLED::drawSymbol(1);
+ OLED::print(SymbolSpace);
+#ifdef MODEL_TS80
+ if (!OLED::getRotation())
+#else
+ if (OLED::getRotation())
+#endif
+ OLED::print(SymbolPlus);
+ else
+ OLED::print(SymbolMinus);
+ OLED::refresh();
+ GUIDelay();
+ }
+}
+
+static int gui_SolderingSleepingMode() {
+ // Drop to sleep temperature and display until movement or button press
+
+ for (;;) {
+ ButtonState buttons = getButtonState();
+ if (buttons)
+ return 0;
+ if ((xTaskGetTickCount() - lastMovementTime < 100)
+ || (xTaskGetTickCount() - lastButtonTime < 100))
+ return 0; // user moved or pressed a button, go back to soldering
+#ifdef MODEL_TS100
+ if (checkVoltageForExit())
+ return 1; // return non-zero on error
+#endif
+ if (systemSettings.temperatureInF) {
+ currentlyActiveTemperatureTarget = ftoTipMeasurement(
+ min(systemSettings.SleepTemp,
+ systemSettings.SolderingTemp));
+ } else {
+ currentlyActiveTemperatureTarget = ctoTipMeasurement(
+ min(systemSettings.SleepTemp,
+ systemSettings.SolderingTemp));
+ }
+ // draw the lcd
+ uint16_t tipTemp;
+ if (systemSettings.temperatureInF)
+ tipTemp = tipMeasurementToF(getTipRawTemp(0));
+ else
+ tipTemp = tipMeasurementToC(getTipRawTemp(0));
+
+ OLED::clearScreen();
+ OLED::setCursor(0, 0);
+ if (systemSettings.detailedSoldering) {
+ OLED::setFont(1);
+ OLED::print(SleepingAdvancedString);
+ OLED::setCursor(0, 8);
+ OLED::print(SleepingTipAdvancedString);
+ OLED::printNumber(tipTemp, 3);
+ if (systemSettings.temperatureInF)
+ OLED::print(SymbolDegF);
+ else
+ OLED::print(SymbolDegC);
+
+ OLED::print(SymbolSpace);
+ printVoltage();
+ OLED::print(SymbolVolts);
+ } else {
+ OLED::setFont(0);
+ OLED::print(SleepingSimpleString);
+ OLED::printNumber(tipTemp, 3);
+ if (systemSettings.temperatureInF)
+ OLED::drawSymbol(0);
+ else
+ OLED::drawSymbol(1);
+ }
+ if (systemSettings.ShutdownTime) // only allow shutdown exit if time > 0
+ if (lastMovementTime)
+ if (((uint32_t) (xTaskGetTickCount() - lastMovementTime))
+ > (uint32_t) (systemSettings.ShutdownTime * 60 * 100)) {
+ // shutdown
+ currentlyActiveTemperatureTarget = 0;
+ return 1; // we want to exit soldering mode
+ }
+ OLED::refresh();
+ GUIDelay();
+ }
+ return 0;
+}
+
+static void display_countdown(int sleepThres) {
+ /*
+ * Print seconds or minutes (if > 99 seconds) until sleep
+ * mode is triggered.
+ */
+ int lastEventTime =
+ lastButtonTime < lastMovementTime ?
+ lastMovementTime : lastButtonTime;
+ int downCount = sleepThres - xTaskGetTickCount() + lastEventTime;
+ if (downCount > 9900) {
+ OLED::printNumber(downCount / 6000 + 1, 2);
+ OLED::print(SymbolMinutes);
+ } else {
+ OLED::printNumber(downCount / 100 + 1, 2);
+ OLED::print(SymbolSeconds);
+ }
+}
+
+static void gui_solderingMode(uint8_t jumpToSleep) {
+ /*
+ * * Soldering (gui_solderingMode)
+ * -> Main loop where we draw temp, and animations
+ * --> User presses buttons and they goto the temperature adjust screen
+ * ---> Display the current setpoint temperature
+ * ---> Use buttons to change forward and back on temperature
+ * ---> Both buttons or timeout for exiting
+ * --> Long hold front button to enter boost mode
+ * ---> Just temporarily sets the system into the alternate temperature for
+ * PID control
+ * --> Long hold back button to exit
+ * --> Double button to exit
+ */
+ bool boostModeOn = false;
+ uint8_t badTipCounter = 0;
+ uint32_t sleepThres = 0;
+ if (systemSettings.SleepTime < 6)
+ sleepThres = systemSettings.SleepTime * 10 * 100;
+ else
+ sleepThres = (systemSettings.SleepTime - 5) * 60 * 100;
+ if (jumpToSleep) {
+ if (gui_SolderingSleepingMode()) {
+ lastButtonTime = xTaskGetTickCount();
+ return; // If the function returns non-0 then exit
+ }
+ }
+ for (;;) {
+
+ ButtonState buttons = getButtonState();
+ switch (buttons) {
+ case BUTTON_NONE:
+ // stay
+ 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 (systemSettings.boostModeEnabled)
+ boostModeOn = true;
+ break;
+ case BUTTON_F_SHORT:
+ case BUTTON_B_SHORT: {
+ uint16_t oldTemp = systemSettings.SolderingTemp;
+ gui_solderingTempAdjust(); // goto adjust temp mode
+ if (oldTemp != systemSettings.SolderingTemp) {
+ saveSettings(); // only save on change
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ // else we update the screen information
+ OLED::setCursor(0, 0);
+ OLED::clearScreen();
+ OLED::setFont(0);
+ uint16_t tipTemp = getTipRawTemp(0);
+ if (tipTemp > 32700) {
+ badTipCounter++; // Use a counter so that error has to persist for > 1 second continious so that peak errors dont trip it
+ } else {
+ badTipCounter = 0;
+ }
+ //Draw in the screen details
+ if (systemSettings.detailedSoldering) {
+ OLED::setFont(1);
+ OLED::print(SolderingAdvancedPowerPrompt); // Power:
+ OLED::printNumber(milliWattHistory[0] / 1000, 2);
+ OLED::print(SymbolDot);
+ OLED::printNumber(milliWattHistory[0] / 100 % 10, 1);
+ OLED::print(SymbolWatts);
+
+ if (systemSettings.sensitivity && systemSettings.SleepTime) {
+ OLED::print(SymbolSpace);
+ display_countdown(sleepThres);
+ }
+
+ OLED::setCursor(0, 8);
+ OLED::print(SleepingTipAdvancedString);
+ gui_drawTipTemp(true);
+ OLED::print(SymbolSpace);
+ printVoltage();
+ OLED::print(SymbolVolts);
+ } else {
+ // We switch the layout direction depending on the orientation of the
+ // OLED::
+ if (OLED::getRotation()) {
+ // battery
+ gui_drawBatteryIcon();
+ OLED::print(SymbolSpace); // Space out gap between battery <-> temp
+ gui_drawTipTemp(true); // Draw current tip temp
+
+ // We draw boost arrow if boosting, or else gap temp <-> heat
+ // indicator
+ if (boostModeOn)
+ OLED::drawSymbol(2);
+ else
+ OLED::print(SymbolSpace);
+
+ // Draw heating/cooling symbols
+ OLED::drawHeatSymbol(
+ milliWattsToPWM(milliWattHistory[0],
+ systemSettings.voltageDiv));
+ } else {
+ // Draw heating/cooling symbols
+ OLED::drawHeatSymbol(
+ milliWattsToPWM(milliWattHistory[0],
+ systemSettings.voltageDiv));
+ // We draw boost arrow if boosting, or else gap temp <-> heat
+ // indicator
+ if (boostModeOn)
+ OLED::drawSymbol(2);
+ else
+ OLED::print(SymbolSpace);
+ gui_drawTipTemp(true); // Draw current tip temp
+
+ OLED::print(SymbolSpace); // Space out gap between battery <-> temp
+
+ gui_drawBatteryIcon();
+ }
+ }
+
+ if (badTipCounter > 128) {
+ OLED::print(BadTipString);
+ OLED::refresh();
+ currentlyActiveTemperatureTarget = 0;
+ waitForButtonPress();
+ currentlyActiveTemperatureTarget = 0;
+ return;
+ }
+ OLED::refresh();
+
+ // Update the setpoints for the temperature
+ if (boostModeOn) {
+ if (systemSettings.temperatureInF)
+ currentlyActiveTemperatureTarget = ftoTipMeasurement(
+ systemSettings.BoostTemp);
+ else
+ currentlyActiveTemperatureTarget = ctoTipMeasurement(
+ systemSettings.BoostTemp);
+
+ } else {
+ if (systemSettings.temperatureInF)
+ currentlyActiveTemperatureTarget = ftoTipMeasurement(
+ systemSettings.SolderingTemp);
+ else
+ currentlyActiveTemperatureTarget = ctoTipMeasurement(
+ systemSettings.SolderingTemp);
+ }
+
+#ifdef MODEL_TS100
+ // Undervoltage test
+ if (checkVoltageForExit()) {
+ lastButtonTime = xTaskGetTickCount();
+ return;
+ }
+#else
+ // on the TS80 we only want to check for over voltage to prevent tip damage
+ /*if (getInputVoltageX10(systemSettings.voltageDiv, 1) > 150) {
+ lastButtonTime = xTaskGetTickCount();
+ currentlyActiveTemperatureTarget = 0;
+ return; // Over voltage
+ }*/
+#endif
+
+ if (systemSettings.sensitivity && systemSettings.SleepTime)
+ if (xTaskGetTickCount() - lastMovementTime > sleepThres
+ && xTaskGetTickCount() - lastButtonTime > sleepThres) {
+ if (gui_SolderingSleepingMode()) {
+ return; // If the function returns non-0 then exit
+ }
+ }
+ //slow down ui update rate
+ GUIDelay();
+ }
+}
+
+static const char *HEADERS[] = {
+__DATE__, "Heap: ", "HWMG: ", "HWMP: ", "HWMM: ", "Time: ", "Move: ", "RTip: ",
+ "CTip: ", "Vin :", "THan: ", "Model: ",
+#ifdef MODEL_TS80
+ "QCV: ", "Tr ",
+#else
+ "Tm ", "Ralim-",
+
+#endif
+ };
+
+void showVersion(void) {
+ uint8_t screen = 0;
+ ButtonState b;
+ for (;;) {
+ OLED::clearScreen(); // Ensure the buffer starts clean
+ OLED::setCursor(0, 0); // Position the cursor at the 0,0 (top left)
+ OLED::setFont(1); // small font
+#ifdef MODEL_TS100
+ OLED::print(SymbolVersionNumber); // Print version number
+#else
+ OLED::print(SymbolVersionNumber); // Print version number
+#endif
+ OLED::setCursor(0, 8); // second line
+ OLED::print(HEADERS[screen]);
+ switch (screen) {
+ case 2:
+ OLED::printNumber(uxTaskGetStackHighWaterMark(GUITaskHandle), 5);
+ break;
+ case 3:
+ OLED::printNumber(uxTaskGetStackHighWaterMark(PIDTaskHandle), 5);
+ break;
+ case 4:
+ OLED::printNumber(uxTaskGetStackHighWaterMark(MOVTaskHandle), 5);
+ break;
+ case 5:
+ OLED::printNumber(xTaskGetTickCount() / 100, 5);
+ break;
+ case 6:
+ OLED::printNumber(lastMovementTime / 100, 5);
+ break;
+ case 7:
+ OLED::printNumber(getTipRawTemp(0), 6);
+ break;
+ case 8:
+ OLED::printNumber(tipMeasurementToC(getTipRawTemp(0)), 5);
+ break;
+ case 9:
+ printVoltage();
+ break;
+ case 10:
+ OLED::printNumber(getHandleTemperature(), 3);
+ break;
+ case 11:
+ OLED::printNumber(PCBVersion, 1); // Print PCB ID number
+ break;
+ case 12:
+#ifdef MODEL_TS80
+ OLED::printNumber(idealQCVoltage, 3);
+#else
+ OLED::printNumber(systemSettings.tipType, 3);
+#endif
+ break;
+ case 13:
+#ifdef MODEL_TS80
+ OLED::printNumber(calculateTipR(), 5);
+#else
+ OLED::print("Tek.com");
+#endif
+ break;
+ default:
+ break;
+ }
+
+ OLED::refresh();
+ b = getButtonState();
+ if (b == BUTTON_B_SHORT)
+ return;
+ else if (b == BUTTON_F_SHORT) {
+ screen++;
+ screen = screen % 14;
+ }
+ GUIDelay();
+ }
+}
+
+/* StartGUITask function */
+void startGUITask(void const *argument __unused) {
+ FRToSI2C::FRToSInit();
+ uint8_t tempWarningState = 0;
+ bool buttonLockout = false;
+ bool tempOnDisplay = false;
+ getTipRawTemp(1); // reset filter
+ OLED::setRotation(systemSettings.OrientationMode & 1);
+ uint32_t ticks = xTaskGetTickCount();
+ ticks += 400; // 4 seconds from now
+ while (xTaskGetTickCount() < ticks) {
+ if (showBootLogoIfavailable() == false)
+ ticks = xTaskGetTickCount();
+ ButtonState buttons = getButtonState();
+ if (buttons)
+ ticks = xTaskGetTickCount(); // make timeout now so we will exit
+ GUIDelay();
+ }
+ if (systemSettings.autoStartMode) {
+ // jump directly to the autostart mode
+ if (systemSettings.autoStartMode == 1)
+ gui_solderingMode(0);
+ if (systemSettings.autoStartMode == 2)
+ gui_solderingMode(1);
+ }
+
+#if ACCELDEBUG
+
+ for (;;) {
+ HAL_IWDG_Refresh(&hiwdg);
+ osDelay(100);
+ }
+//^ Kept here for a way to block this thread
+#endif
+
+ for (;;) {
+ ButtonState buttons = getButtonState();
+ if (buttons != BUTTON_NONE) {
+ OLED::displayOnOff(true); // turn lcd on
+ OLED::setFont(0);
+ }
+ if (tempWarningState == 2)
+ buttons = BUTTON_F_SHORT;
+ if (buttons != BUTTON_NONE && buttonLockout)
+ buttons = BUTTON_NONE;
+ else
+ buttonLockout = false;
+
+ switch (buttons) {
+ case BUTTON_NONE:
+ // Do nothing
+ break;
+ case BUTTON_BOTH:
+ // Not used yet
+ // In multi-language this might be used to reset language on a long hold
+ // or some such
+ break;
+
+ case BUTTON_B_LONG:
+ // Show the version information
+ showVersion();
+ break;
+ case BUTTON_F_LONG:
+ gui_solderingTempAdjust();
+ saveSettings();
+ break;
+ case BUTTON_F_SHORT:
+ gui_solderingMode(0); // enter soldering mode
+ buttonLockout = true;
+ break;
+ case BUTTON_B_SHORT:
+ enterSettingsMenu(); // enter the settings menu
+ saveSettings();
+ buttonLockout = true;
+ setCalibrationOffset(systemSettings.CalibrationOffset); // ensure cal offset is applied
+ break;
+ default:
+ break;
+ }
+
+ currentlyActiveTemperatureTarget = 0; // ensure tip is off
+ getInputVoltageX10(systemSettings.voltageDiv, 0);
+ uint16_t tipTemp = tipMeasurementToC(getTipRawTemp(0));
+
+ if (tipTemp < 50) {
+ if (systemSettings.sensitivity) {
+ if ((xTaskGetTickCount() - lastMovementTime) > 6000
+ && (xTaskGetTickCount() - lastButtonTime) > 6000) {
+ OLED::displayOnOff(false); // turn lcd off when no movement
+ } else
+ OLED::displayOnOff(true); // turn lcd on
+ } else
+ OLED::displayOnOff(true); // turn lcd on - disabled motion sleep
+ } else
+ OLED::displayOnOff(true); // turn lcd on when temp > 50C
+
+ // Clear the lcd buffer
+ OLED::clearScreen();
+ OLED::setCursor(0, 0);
+ if (systemSettings.detailedIDLE) {
+ OLED::setFont(1);
+ if (tipTemp > 470) {
+ OLED::print(TipDisconnectedString);
+ } else {
+ OLED::print(IdleTipString);
+ gui_drawTipTemp(false);
+ OLED::print(IdleSetString);
+ OLED::printNumber(systemSettings.SolderingTemp, 3);
+ }
+ OLED::setCursor(0, 8);
+
+ OLED::print(InputVoltageString);
+ printVoltage();
+
+ } else {
+ OLED::setFont(0);
+#ifdef MODEL_TS80
+ if (!OLED::getRotation()) {
+#else
+ if (OLED::getRotation()) {
+#endif
+ OLED::drawArea(12, 0, 84, 16, idleScreenBG);
+ OLED::setCursor(0, 0);
+ gui_drawBatteryIcon();
+ } else {
+ OLED::drawArea(0, 0, 84, 16, idleScreenBGF); // Needs to be flipped so button ends up
+ // on right side of screen
+ OLED::setCursor(84, 0);
+ gui_drawBatteryIcon();
+ }
+ if (tipTemp > 55)
+ tempOnDisplay = true;
+ else if (tipTemp < 45)
+ tempOnDisplay = false;
+ if (tempOnDisplay) {
+ // draw temp over the start soldering button
+ // Location changes on screen rotation
+#ifdef MODEL_TS80
+ if (!OLED::getRotation()) {
+#else
+ if (OLED::getRotation()) {
+#endif
+ // in right handed mode we want to draw over the first part
+ OLED::fillArea(55, 0, 41, 16, 0); // clear the area for the temp
+ OLED::setCursor(56, 0);
+
+ } else {
+ OLED::fillArea(0, 0, 41, 16, 0); // clear the area
+ OLED::setCursor(0, 0);
+ }
+ // draw in the temp
+ if (!(systemSettings.coolingTempBlink
+ && (xTaskGetTickCount() % 25 < 16)))
+ gui_drawTipTemp(false); // draw in the temp
+ }
+ }
+ OLED::refresh();
+ GUIDelay();
+ }
+}
diff --git a/workspace/TS100/Core/Src/main.cpp b/workspace/TS100/Core/Src/main.cpp
index 25e4fc2d..5fac913d 100644
--- a/workspace/TS100/Core/Src/main.cpp
+++ b/workspace/TS100/Core/Src/main.cpp
@@ -12,12 +12,10 @@
#include "stm32f1xx_hal.h"
#include "string.h"
-#define ACCELDEBUG 0
uint8_t PCBVersion = 0;
// File local variables
uint32_t currentlyActiveTemperatureTarget = 0;
uint32_t lastMovementTime = 0;
-uint32_t lastButtonTime = 0;
int16_t idealQCVoltage = 0;
// FreeRTOS variables
@@ -104,832 +102,8 @@ int main(void) {
}
}
-void printVoltage() {
- uint32_t volt = getInputVoltageX10(systemSettings.voltageDiv, 0);
- OLED::printNumber(volt / 10, 2);
- OLED::print(SymbolDot);
- OLED::printNumber(volt % 10, 1);
-}
-void GUIDelay() {
- // Called in all UI looping tasks,
- // This limits the re-draw rate to the LCD and also lets the DMA run
- // As the gui task can very easily fill this bus with transactions, which will
- // prevent the movement detection from running
- osDelay(50);
-}
-void gui_drawTipTemp(bool symbol) {
- // Draw tip temp handling unit conversion & tolerance near setpoint
- uint16_t Temp = getTipRawTemp(0);
-
- if (systemSettings.temperatureInF)
- Temp = tipMeasurementToF(Temp);
- else
- Temp = tipMeasurementToC(Temp);
-
- OLED::printNumber(Temp, 3); // Draw the tip temp out finally
- if (symbol) {
- if (systemSettings.temperatureInF)
- OLED::print(SymbolDegF);
- else
- OLED::print(SymbolDegC);
- }
-}
-ButtonState getButtonState() {
- /*
- * Read in the buttons and then determine if a state change needs to occur
- */
-
- /*
- * If the previous state was 00 Then we want to latch the new state if
- * different & update time
- * If the previous state was !00 Then we want to search if we trigger long
- * 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 = 40;
- uint8_t currentState;
- currentState = (
- HAL_GPIO_ReadPin(KEY_A_GPIO_Port, KEY_A_Pin) == GPIO_PIN_RESET ?
- 1 : 0) << 0;
- currentState |= (
- HAL_GPIO_ReadPin(KEY_B_GPIO_Port, KEY_B_Pin) == GPIO_PIN_RESET ?
- 1 : 0) << 1;
-
- if (currentState)
- lastButtonTime = xTaskGetTickCount();
- if (currentState == previousState) {
- if (currentState == 0)
- return BUTTON_NONE;
- if ((xTaskGetTickCount() - previousStateChange) > timeout) {
- // User has been holding the button down
- // We want to send a buttong is held message
- if (currentState == 0x01)
- return BUTTON_F_LONG;
- else if (currentState == 0x02)
- return BUTTON_B_LONG;
- else
- return BUTTON_NONE; // Both being held case, we dont long hold this
- } else
- return BUTTON_NONE;
- } else {
- // A change in button state has occurred
- 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;
- }
- } 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) {
- // The user didn't hold the button for long
- // So we send button press
-
- if (previousState == 0x01)
- retVal = BUTTON_F_SHORT;
- else if (previousState == 0x02)
- retVal = BUTTON_B_SHORT;
- else
- retVal = BUTTON_BOTH; // Both being held case
- }
- }
- previousState = currentState;
- previousStateChange = xTaskGetTickCount();
- return retVal;
- }
- return BUTTON_NONE;
-}
-
-void waitForButtonPress() {
- // we are just lazy and sleep until user confirms button press
- // This also eats the button press event!
- ButtonState buttons = getButtonState();
- while (buttons) {
- buttons = getButtonState();
- GUIDelay();
- }
- while (!buttons) {
- buttons = getButtonState();
- GUIDelay();
- }
-}
-
-void waitForButtonPressOrTimeout(uint32_t timeout) {
- timeout += xTaskGetTickCount();
- // calculate the exit point
-
- ButtonState buttons = getButtonState();
- while (buttons) {
- buttons = getButtonState();
- GUIDelay();
- if (xTaskGetTickCount() > timeout)
- return;
- }
- while (!buttons) {
- buttons = getButtonState();
- GUIDelay();
- if (xTaskGetTickCount() > timeout)
- return;
- }
-}
-#ifdef MODEL_TS100
-// returns true if undervoltage has occured
-static bool checkVoltageForExit() {
- uint16_t v = getInputVoltageX10(systemSettings.voltageDiv, 0);
-
- //Dont check for first 1.5 seconds while the ADC stabilizes and the DMA fills the buffer
- if (xTaskGetTickCount() > 150) {
- if ((v < lookupVoltageLevel(systemSettings.cutoutSetting))) {
- GUIDelay();
- OLED::clearScreen();
- OLED::setCursor(0, 0);
- if (systemSettings.detailedSoldering) {
- OLED::setFont(1);
- OLED::print(UndervoltageString);
- OLED::setCursor(0, 8);
- OLED::print(InputVoltageString);
- printVoltage();
- OLED::print("V");
- } else {
- OLED::setFont(0);
- OLED::print(UVLOWarningString);
- }
- OLED::refresh();
- currentlyActiveTemperatureTarget = 0;
- waitForButtonPress();
- return true;
- }
- }
- return false;
-}
-#endif
-static void gui_drawBatteryIcon() {
-#ifdef MODEL_TS100
- if (systemSettings.cutoutSetting) {
- // User is on a lithium battery
- // we need to calculate which of the 10 levels they are on
- uint8_t cellCount = systemSettings.cutoutSetting + 2;
- uint32_t cellV = getInputVoltageX10(systemSettings.voltageDiv, 0)
- / cellCount;
- // Should give us approx cell voltage X10
- // Range is 42 -> 33 = 9 steps therefore we will use battery 1-10
- if (cellV < 33)
- cellV = 33;
- cellV -= 33;// Should leave us a number of 0-9
- if (cellV > 9)
- cellV = 9;
- OLED::drawBattery(cellV + 1);
- } else
- OLED::drawSymbol(15); // Draw the DC Logo
-#else
- // On TS80 we replace this symbol with the voltage we are operating on
- // If <9V then show single digit, if not show duals
- uint8_t V = getInputVoltageX10(systemSettings.voltageDiv, 0);
- if (V % 10 >= 5)
- V = V / 10 + 1; // round up
- else
- V = V / 10;
- if (V >= 10) {
- int16_t xPos = OLED::getCursorX();
- OLED::setFont(1);
- OLED::printNumber(1, 1);
- OLED::setCursor(xPos, 8);
- OLED::printNumber(V % 10, 1);
- OLED::setFont(0);
- OLED::setCursor(xPos + 12, 0); // need to reset this as if we drew a wide char
- } else {
- OLED::printNumber(V, 1);
- }
-#endif
-}
-static void gui_solderingTempAdjust() {
- uint32_t lastChange = xTaskGetTickCount();
- currentlyActiveTemperatureTarget = 0;
- uint32_t autoRepeatTimer = 0;
- uint8_t autoRepeatAcceleration = 0;
- for (;;) {
- OLED::setCursor(0, 0);
- OLED::clearScreen();
- OLED::setFont(0);
- ButtonState buttons = getButtonState();
- if (buttons)
- lastChange = xTaskGetTickCount();
- switch (buttons) {
- case BUTTON_NONE:
- // stay
- break;
- case BUTTON_BOTH:
- // exit
- return;
- break;
- case BUTTON_B_LONG:
- if (xTaskGetTickCount() - autoRepeatTimer + autoRepeatAcceleration >
- PRESS_ACCEL_INTERVAL_MAX) {
- systemSettings.SolderingTemp -= 10; // sub 10
- autoRepeatTimer = xTaskGetTickCount();
- autoRepeatAcceleration += PRESS_ACCEL_STEP;
- }
- break;
- case BUTTON_F_LONG:
- if (xTaskGetTickCount() - autoRepeatTimer + autoRepeatAcceleration >
- PRESS_ACCEL_INTERVAL_MAX) {
- systemSettings.SolderingTemp += 10;
- autoRepeatTimer = xTaskGetTickCount();
- autoRepeatAcceleration += PRESS_ACCEL_STEP;
- }
- break;
- case BUTTON_F_SHORT:
- systemSettings.SolderingTemp += 10; // add 10
- break;
- case BUTTON_B_SHORT:
- systemSettings.SolderingTemp -= 10; // sub 10
- break;
- default:
- break;
- }
- if ((PRESS_ACCEL_INTERVAL_MAX - autoRepeatAcceleration) <
- PRESS_ACCEL_INTERVAL_MIN) {
- autoRepeatAcceleration =
- PRESS_ACCEL_INTERVAL_MAX - PRESS_ACCEL_INTERVAL_MIN;
- }
- // constrain between 50-450 C
- if (systemSettings.temperatureInF) {
- if (systemSettings.SolderingTemp > 850)
- systemSettings.SolderingTemp = 850;
- if (systemSettings.SolderingTemp < 120)
- systemSettings.SolderingTemp = 120;
- } else {
- if (systemSettings.SolderingTemp > 450)
- systemSettings.SolderingTemp = 450;
- if (systemSettings.SolderingTemp < 50)
- systemSettings.SolderingTemp = 50;
- }
-
- if (xTaskGetTickCount() - lastChange > 200)
- return; // exit if user just doesn't press anything for a bit
-
-#ifdef MODEL_TS80
- if (!OLED::getRotation())
-#else
- if (OLED::getRotation())
-#endif
- OLED::print(SymbolMinus);
- else
- OLED::print(SymbolPlus);
-
- OLED::print(SymbolSpace);
- OLED::printNumber(systemSettings.SolderingTemp, 3);
- if (systemSettings.temperatureInF)
- OLED::drawSymbol(0);
- else
- OLED::drawSymbol(1);
- OLED::print(SymbolSpace);
-#ifdef MODEL_TS80
- if (!OLED::getRotation())
-#else
- if (OLED::getRotation())
-#endif
- OLED::print(SymbolPlus);
- else
- OLED::print(SymbolMinus);
- OLED::refresh();
- GUIDelay();
- }
-}
-
-static uint16_t min(uint16_t a, uint16_t b) {
- if (a > b)
- return b;
- else
- return a;
-}
-static int gui_SolderingSleepingMode() {
- // Drop to sleep temperature and display until movement or button press
-
- for (;;) {
- ButtonState buttons = getButtonState();
- if (buttons)
- return 0;
- if ((xTaskGetTickCount() - lastMovementTime < 100)
- || (xTaskGetTickCount() - lastButtonTime < 100))
- return 0; // user moved or pressed a button, go back to soldering
-#ifdef MODEL_TS100
- if (checkVoltageForExit())
- return 1; // return non-zero on error
-#endif
- if (systemSettings.temperatureInF) {
- currentlyActiveTemperatureTarget = ftoTipMeasurement(
- min(systemSettings.SleepTemp,
- systemSettings.SolderingTemp));
- } else {
- currentlyActiveTemperatureTarget = ctoTipMeasurement(
- min(systemSettings.SleepTemp,
- systemSettings.SolderingTemp));
- }
- // draw the lcd
- uint16_t tipTemp;
- if (systemSettings.temperatureInF)
- tipTemp = tipMeasurementToF(getTipRawTemp(0));
- else
- tipTemp = tipMeasurementToC(getTipRawTemp(0));
-
- OLED::clearScreen();
- OLED::setCursor(0, 0);
- if (systemSettings.detailedSoldering) {
- OLED::setFont(1);
- OLED::print(SleepingAdvancedString);
- OLED::setCursor(0, 8);
- OLED::print(SleepingTipAdvancedString);
- OLED::printNumber(tipTemp, 3);
- if (systemSettings.temperatureInF)
- OLED::print(SymbolDegF);
- else
- OLED::print(SymbolDegC);
-
- OLED::print(SymbolSpace);
- printVoltage();
- OLED::print(SymbolVolts);
- } else {
- OLED::setFont(0);
- OLED::print(SleepingSimpleString);
- OLED::printNumber(tipTemp, 3);
- if (systemSettings.temperatureInF)
- OLED::drawSymbol(0);
- else
- OLED::drawSymbol(1);
- }
- if (systemSettings.ShutdownTime) // only allow shutdown exit if time > 0
- if (lastMovementTime)
- if (((uint32_t) (xTaskGetTickCount() - lastMovementTime))
- > (uint32_t) (systemSettings.ShutdownTime * 60 * 100)) {
- // shutdown
- currentlyActiveTemperatureTarget = 0;
- return 1; // we want to exit soldering mode
- }
- OLED::refresh();
- GUIDelay();
- }
- return 0;
-}
-
-static void display_countdown(int sleepThres) {
- /*
- * Print seconds or minutes (if > 99 seconds) until sleep
- * mode is triggered.
- */
- int lastEventTime =
- lastButtonTime < lastMovementTime ?
- lastMovementTime : lastButtonTime;
- int downCount = sleepThres - xTaskGetTickCount() + lastEventTime;
- if (downCount > 9900) {
- OLED::printNumber(downCount / 6000 + 1, 2);
- OLED::print(SymbolMinutes);
- } else {
- OLED::printNumber(downCount / 100 + 1, 2);
- OLED::print(SymbolSeconds);
- }
-}
-
-static void gui_solderingMode(uint8_t jumpToSleep) {
- /*
- * * Soldering (gui_solderingMode)
- * -> Main loop where we draw temp, and animations
- * --> User presses buttons and they goto the temperature adjust screen
- * ---> Display the current setpoint temperature
- * ---> Use buttons to change forward and back on temperature
- * ---> Both buttons or timeout for exiting
- * --> Long hold front button to enter boost mode
- * ---> Just temporarily sets the system into the alternate temperature for
- * PID control
- * --> Long hold back button to exit
- * --> Double button to exit
- */
- bool boostModeOn = false;
- uint8_t badTipCounter = 0;
- uint32_t sleepThres = 0;
- if (systemSettings.SleepTime < 6)
- sleepThres = systemSettings.SleepTime * 10 * 100;
- else
- sleepThres = (systemSettings.SleepTime - 5) * 60 * 100;
- if (jumpToSleep) {
- if (gui_SolderingSleepingMode()) {
- lastButtonTime = xTaskGetTickCount();
- return; // If the function returns non-0 then exit
- }
- }
- for (;;) {
-
- ButtonState buttons = getButtonState();
- switch (buttons) {
- case BUTTON_NONE:
- // stay
- 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 (systemSettings.boostModeEnabled)
- boostModeOn = true;
- break;
- case BUTTON_F_SHORT:
- case BUTTON_B_SHORT: {
- uint16_t oldTemp = systemSettings.SolderingTemp;
- gui_solderingTempAdjust(); // goto adjust temp mode
- if (oldTemp != systemSettings.SolderingTemp) {
- saveSettings(); // only save on change
- }
- }
- break;
- default:
- break;
- }
- // else we update the screen information
- OLED::setCursor(0, 0);
- OLED::clearScreen();
- OLED::setFont(0);
- uint16_t tipTemp = getTipRawTemp(0);
- if (tipTemp > 32700) {
- badTipCounter++; // Use a counter so that error has to persist for > 1 second continious so that peak errors dont trip it
- } else {
- badTipCounter = 0;
- }
- //Draw in the screen details
- if (systemSettings.detailedSoldering) {
- OLED::setFont(1);
- OLED::print(SolderingAdvancedPowerPrompt); // Power:
- OLED::printNumber(milliWattHistory[0] / 1000, 2);
- OLED::print(SymbolDot);
- OLED::printNumber(milliWattHistory[0] / 100 % 10, 1);
- OLED::print(SymbolWatts);
-
- if (systemSettings.sensitivity && systemSettings.SleepTime) {
- OLED::print(SymbolSpace);
- display_countdown(sleepThres);
- }
-
- OLED::setCursor(0, 8);
- OLED::print(SleepingTipAdvancedString);
- gui_drawTipTemp(true);
- OLED::print(SymbolSpace);
- printVoltage();
- OLED::print(SymbolVolts);
- } else {
- // We switch the layout direction depending on the orientation of the
- // OLED::
- if (OLED::getRotation()) {
- // battery
- gui_drawBatteryIcon();
- OLED::print(SymbolSpace); // Space out gap between battery <-> temp
- gui_drawTipTemp(true); // Draw current tip temp
-
- // We draw boost arrow if boosting, or else gap temp <-> heat
- // indicator
- if (boostModeOn)
- OLED::drawSymbol(2);
- else
- OLED::print(SymbolSpace);
-
- // Draw heating/cooling symbols
- OLED::drawHeatSymbol(
- milliWattsToPWM(milliWattHistory[0],
- systemSettings.voltageDiv));
- } else {
- // Draw heating/cooling symbols
- OLED::drawHeatSymbol(
- milliWattsToPWM(milliWattHistory[0],
- systemSettings.voltageDiv));
- // We draw boost arrow if boosting, or else gap temp <-> heat
- // indicator
- if (boostModeOn)
- OLED::drawSymbol(2);
- else
- OLED::print(SymbolSpace);
- gui_drawTipTemp(true); // Draw current tip temp
-
- OLED::print(SymbolSpace); // Space out gap between battery <-> temp
-
- gui_drawBatteryIcon();
- }
- }
-
- if (badTipCounter > 128) {
- OLED::print(BadTipString);
- OLED::refresh();
- currentlyActiveTemperatureTarget = 0;
- waitForButtonPress();
- currentlyActiveTemperatureTarget = 0;
- return;
- }
- OLED::refresh();
-
- // Update the setpoints for the temperature
- if (boostModeOn) {
- if (systemSettings.temperatureInF)
- currentlyActiveTemperatureTarget = ftoTipMeasurement(
- systemSettings.BoostTemp);
- else
- currentlyActiveTemperatureTarget = ctoTipMeasurement(
- systemSettings.BoostTemp);
-
- } else {
- if (systemSettings.temperatureInF)
- currentlyActiveTemperatureTarget = ftoTipMeasurement(
- systemSettings.SolderingTemp);
- else
- currentlyActiveTemperatureTarget = ctoTipMeasurement(
- systemSettings.SolderingTemp);
- }
-
-#ifdef MODEL_TS100
- // Undervoltage test
- if (checkVoltageForExit()) {
- lastButtonTime = xTaskGetTickCount();
- return;
- }
-#else
- // on the TS80 we only want to check for over voltage to prevent tip damage
- /*if (getInputVoltageX10(systemSettings.voltageDiv, 1) > 150) {
- lastButtonTime = xTaskGetTickCount();
- currentlyActiveTemperatureTarget = 0;
- return; // Over voltage
- }*/
-#endif
-
- if (systemSettings.sensitivity && systemSettings.SleepTime)
- if (xTaskGetTickCount() - lastMovementTime > sleepThres
- && xTaskGetTickCount() - lastButtonTime > sleepThres) {
- if (gui_SolderingSleepingMode()) {
- return; // If the function returns non-0 then exit
- }
- }
- //slow down ui update rate
- GUIDelay();
- }
-}
-
-static const char *HEADERS[] = {
-__DATE__, "Heap: ", "HWMG: ", "HWMP: ", "HWMM: ", "Time: ", "Move: ", "RTip: ",
- "CTip: ", "Vin :", "THan: ", "Model: ",
-#ifdef MODEL_TS80
- "QCV: ", "Tr ",
-#else
- "Tm ", "Ralim-",
-
-#endif
- };
-
-void showVersion(void) {
- uint8_t screen = 0;
- ButtonState b;
- for (;;) {
- OLED::clearScreen(); // Ensure the buffer starts clean
- OLED::setCursor(0, 0); // Position the cursor at the 0,0 (top left)
- OLED::setFont(1); // small font
-#ifdef MODEL_TS100
- OLED::print(SymbolVersionNumber); // Print version number
-#else
- OLED::print(SymbolVersionNumber); // Print version number
-#endif
- OLED::setCursor(0, 8); // second line
- OLED::print(HEADERS[screen]);
- switch (screen) {
- case 2:
- OLED::printNumber(uxTaskGetStackHighWaterMark(GUITaskHandle), 5);
- break;
- case 3:
- OLED::printNumber(uxTaskGetStackHighWaterMark(PIDTaskHandle), 5);
- break;
- case 4:
- OLED::printNumber(uxTaskGetStackHighWaterMark(MOVTaskHandle), 5);
- break;
- case 5:
- OLED::printNumber(xTaskGetTickCount() / 100, 5);
- break;
- case 6:
- OLED::printNumber(lastMovementTime / 100, 5);
- break;
- case 7:
- OLED::printNumber(getTipRawTemp(0), 6);
- break;
- case 8:
- OLED::printNumber(tipMeasurementToC(getTipRawTemp(0)), 5);
- break;
- case 9:
- printVoltage();
- break;
- case 10:
- OLED::printNumber(getHandleTemperature(), 3);
- break;
- case 11:
- OLED::printNumber(PCBVersion, 1); // Print PCB ID number
- break;
- case 12:
-#ifdef MODEL_TS80
- OLED::printNumber(idealQCVoltage, 3);
-#else
- OLED::printNumber(systemSettings.tipType, 3);
-#endif
- break;
- case 13:
-#ifdef MODEL_TS80
- OLED::printNumber(calculateTipR(), 5);
-#else
- OLED::print("Tek.com");
-#endif
- break;
- default:
- break;
- }
-
- OLED::refresh();
- b = getButtonState();
- if (b == BUTTON_B_SHORT)
- return;
- else if (b == BUTTON_F_SHORT) {
- screen++;
- screen = screen % 14;
- }
- GUIDelay();
- }
-}
-
-/* StartGUITask function */
-void startGUITask(void const *argument __unused) {
- FRToSI2C::FRToSInit();
- uint8_t tempWarningState = 0;
- bool buttonLockout = false;
- bool tempOnDisplay = false;
- getTipRawTemp(1); // reset filter
- OLED::setRotation(systemSettings.OrientationMode & 1);
- uint32_t ticks = xTaskGetTickCount();
- ticks += 400; // 4 seconds from now
- while (xTaskGetTickCount() < ticks) {
- if (showBootLogoIfavailable() == false)
- ticks = xTaskGetTickCount();
- ButtonState buttons = getButtonState();
- if (buttons)
- ticks = xTaskGetTickCount(); // make timeout now so we will exit
- GUIDelay();
- }
- if (systemSettings.autoStartMode) {
- // jump directly to the autostart mode
- if (systemSettings.autoStartMode == 1)
- gui_solderingMode(0);
- if (systemSettings.autoStartMode == 2)
- gui_solderingMode(1);
- }
-
-#if ACCELDEBUG
-
- for (;;) {
- HAL_IWDG_Refresh(&hiwdg);
- osDelay(100);
- }
-//^ Kept here for a way to block this thread
-#endif
-
- for (;;) {
- ButtonState buttons = getButtonState();
- if (buttons != BUTTON_NONE) {
- OLED::displayOnOff(true); // turn lcd on
- OLED::setFont(0);
- }
- if (tempWarningState == 2)
- buttons = BUTTON_F_SHORT;
- if (buttons != BUTTON_NONE && buttonLockout)
- buttons = BUTTON_NONE;
- else
- buttonLockout = false;
-
- switch (buttons) {
- case BUTTON_NONE:
- // Do nothing
- break;
- case BUTTON_BOTH:
- // Not used yet
- // In multi-language this might be used to reset language on a long hold
- // or some such
- break;
-
- case BUTTON_B_LONG:
- // Show the version information
- showVersion();
- break;
- case BUTTON_F_LONG:
- gui_solderingTempAdjust();
- saveSettings();
- break;
- case BUTTON_F_SHORT:
- gui_solderingMode(0); // enter soldering mode
- buttonLockout = true;
- break;
- case BUTTON_B_SHORT:
- enterSettingsMenu(); // enter the settings menu
- saveSettings();
- buttonLockout = true;
- setCalibrationOffset(systemSettings.CalibrationOffset); // ensure cal offset is applied
- break;
- default:
- break;
- }
-
- currentlyActiveTemperatureTarget = 0; // ensure tip is off
- getInputVoltageX10(systemSettings.voltageDiv, 0);
- uint16_t tipTemp = tipMeasurementToC(getTipRawTemp(0));
-
- if (tipTemp < 50) {
- if (systemSettings.sensitivity) {
- if ((xTaskGetTickCount() - lastMovementTime) > 6000
- && (xTaskGetTickCount() - lastButtonTime) > 6000) {
- OLED::displayOnOff(false); // turn lcd off when no movement
- } else
- OLED::displayOnOff(true); // turn lcd on
- } else
- OLED::displayOnOff(true); // turn lcd on - disabled motion sleep
- } else
- OLED::displayOnOff(true); // turn lcd on when temp > 50C
-
- // Clear the lcd buffer
- OLED::clearScreen();
- OLED::setCursor(0, 0);
- if (systemSettings.detailedIDLE) {
- OLED::setFont(1);
- if (tipTemp > 470) {
- OLED::print(TipDisconnectedString);
- } else {
- OLED::print(IdleTipString);
- gui_drawTipTemp(false);
- OLED::print(IdleSetString);
- OLED::printNumber(systemSettings.SolderingTemp, 3);
- }
- OLED::setCursor(0, 8);
-
- OLED::print(InputVoltageString);
- printVoltage();
-
- } else {
- OLED::setFont(0);
-#ifdef MODEL_TS80
- if (!OLED::getRotation()) {
-#else
- if (OLED::getRotation()) {
-#endif
- OLED::drawArea(12, 0, 84, 16, idleScreenBG);
- OLED::setCursor(0, 0);
- gui_drawBatteryIcon();
- } else {
- OLED::drawArea(0, 0, 84, 16, idleScreenBGF); // Needs to be flipped so button ends up
- // on right side of screen
- OLED::setCursor(84, 0);
- gui_drawBatteryIcon();
- }
- if (tipTemp > 55)
- tempOnDisplay = true;
- else if (tipTemp < 45)
- tempOnDisplay = false;
- if (tempOnDisplay) {
- // draw temp over the start soldering button
- // Location changes on screen rotation
-#ifdef MODEL_TS80
- if (!OLED::getRotation()) {
-#else
- if (OLED::getRotation()) {
-#endif
- // in right handed mode we want to draw over the first part
- OLED::fillArea(55, 0, 41, 16, 0); // clear the area for the temp
- OLED::setCursor(56, 0);
-
- } else {
- OLED::fillArea(0, 0, 41, 16, 0); // clear the area
- OLED::setCursor(0, 0);
- }
- // draw in the temp
- if (!(systemSettings.coolingTempBlink
- && (xTaskGetTickCount() % 25 < 16)))
- gui_drawTipTemp(false); // draw in the temp
- }
- }
- OLED::refresh();
- GUIDelay();
- }
-}
/* StartPIDTask function */
void startPIDTask(void const *argument __unused) {