1
0
forked from me/IronOS

Fix voltage on home screen

This commit is contained in:
Ben V. Brown
2020-09-20 16:24:39 +10:00
parent 60e3616c79
commit 89522027b7
3 changed files with 84 additions and 124 deletions

View File

@@ -57,10 +57,7 @@ uint16_t getHandleTemperature() {
#endif #endif
} }
uint16_t getInputVoltageX10(uint16_t divisor, uint8_t sample) { uint16_t getInputVoltageX10(uint16_t divisor, uint8_t sample) {
// ADC maximum is 32767 == 3.3V at input == 28.05V at VIN
// Therefore we can divide down from there
// Multiplying ADC max by 4 for additional calibration options,
// ideal term is 467
static uint8_t preFillneeded = 10; static uint8_t preFillneeded = 10;
static uint32_t samples[BATTFILTERDEPTH]; static uint32_t samples[BATTFILTERDEPTH];

View File

@@ -17,10 +17,9 @@
#ifdef MODEL_Pinecil #ifdef MODEL_Pinecil
#define POW_PD #define POW_PD
//#define POW_QC #define POW_QC
#define TEMP_TMP36 #define TEMP_TMP36
//#define ACCEL_BMA #define ACCEL_BMA
#define BATTFILTERDEPTH 32 #define BATTFILTERDEPTH 32
#endif #endif

View File

@@ -59,9 +59,9 @@ void gui_drawTipTemp(bool symbol) {
// Draw tip temp handling unit conversion & tolerance near setpoint // Draw tip temp handling unit conversion & tolerance near setpoint
uint16_t Temp = 0; uint16_t Temp = 0;
#ifdef ENABLED_FAHRENHEIT_SUPPORT #ifdef ENABLED_FAHRENHEIT_SUPPORT
if (systemSettings.temperatureInF){ if (systemSettings.temperatureInF) {
Temp = TipThermoModel::getTipInF(); Temp = TipThermoModel::getTipInF();
}else } else
#endif #endif
{ {
Temp = TipThermoModel::getTipInC(); Temp = TipThermoModel::getTipInC();
@@ -72,17 +72,17 @@ void gui_drawTipTemp(bool symbol) {
if (OLED::getFont() == 0) { if (OLED::getFont() == 0) {
// Big font, can draw nice symbols // Big font, can draw nice symbols
#ifdef ENABLED_FAHRENHEIT_SUPPORT #ifdef ENABLED_FAHRENHEIT_SUPPORT
if (systemSettings.temperatureInF) if (systemSettings.temperatureInF)
OLED::drawSymbol(0); OLED::drawSymbol(0);
else else
#endif #endif
OLED::drawSymbol(1); OLED::drawSymbol(1);
} else { } else {
// Otherwise fall back to chars // Otherwise fall back to chars
#ifdef ENABLED_FAHRENHEIT_SUPPORT #ifdef ENABLED_FAHRENHEIT_SUPPORT
if (systemSettings.temperatureInF) if (systemSettings.temperatureInF)
OLED::print(SymbolDegF); OLED::print(SymbolDegF);
else else
#endif #endif
OLED::print(SymbolDegC); OLED::print(SymbolDegC);
} }
@@ -123,24 +123,8 @@ static bool checkVoltageForExit() {
} }
#endif #endif
static void gui_drawBatteryIcon() { static void gui_drawBatteryIcon() {
#ifdef MODEL_TS100 #if defined(POW_PD) || defined(POW_QC)
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 // On TS80 we replace this symbol with the voltage we are operating on
// If <9V then show single digit, if not show duals // If <9V then show single digit, if not show duals
uint8_t V = getInputVoltageX10(systemSettings.voltageDiv, 0); uint8_t V = getInputVoltageX10(systemSettings.voltageDiv, 0);
@@ -151,7 +135,7 @@ static void gui_drawBatteryIcon() {
if (V >= 10) { if (V >= 10) {
int16_t xPos = OLED::getCursorX(); int16_t xPos = OLED::getCursorX();
OLED::setFont(1); OLED::setFont(1);
OLED::printNumber(1, 1); OLED::printNumber(V / 10, 1);
OLED::setCursor(xPos, 8); OLED::setCursor(xPos, 8);
OLED::printNumber(V % 10, 1); OLED::printNumber(V % 10, 1);
OLED::setFont(0); OLED::setFont(0);
@@ -159,7 +143,25 @@ static void gui_drawBatteryIcon() {
} else { } else {
OLED::printNumber(V, 1); OLED::printNumber(V, 1);
} }
#else
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
#endif #endif
} }
static void gui_solderingTempAdjust() { static void gui_solderingTempAdjust() {
uint32_t lastChange = xTaskGetTickCount(); uint32_t lastChange = xTaskGetTickCount();
@@ -182,14 +184,11 @@ static void gui_solderingTempAdjust() {
return; return;
break; break;
case BUTTON_B_LONG: case BUTTON_B_LONG:
if (xTaskGetTickCount() - autoRepeatTimer if (xTaskGetTickCount() - autoRepeatTimer + autoRepeatAcceleration > PRESS_ACCEL_INTERVAL_MAX) {
+ autoRepeatAcceleration> PRESS_ACCEL_INTERVAL_MAX) {
if (systemSettings.ReverseButtonTempChangeEnabled) { if (systemSettings.ReverseButtonTempChangeEnabled) {
systemSettings.SolderingTemp += systemSettings.SolderingTemp += systemSettings.TempChangeLongStep;
systemSettings.TempChangeLongStep;
} else } else
systemSettings.SolderingTemp -= systemSettings.SolderingTemp -= systemSettings.TempChangeLongStep;
systemSettings.TempChangeLongStep;
autoRepeatTimer = xTaskGetTickCount(); autoRepeatTimer = xTaskGetTickCount();
autoRepeatAcceleration += PRESS_ACCEL_STEP; autoRepeatAcceleration += PRESS_ACCEL_STEP;
@@ -197,47 +196,38 @@ static void gui_solderingTempAdjust() {
break; break;
case BUTTON_B_SHORT: case BUTTON_B_SHORT:
if (systemSettings.ReverseButtonTempChangeEnabled) { if (systemSettings.ReverseButtonTempChangeEnabled) {
systemSettings.SolderingTemp += systemSettings.SolderingTemp += systemSettings.TempChangeShortStep;
systemSettings.TempChangeShortStep;
} else } else
systemSettings.SolderingTemp -= systemSettings.SolderingTemp -= systemSettings.TempChangeShortStep;
systemSettings.TempChangeShortStep;
break; break;
case BUTTON_F_LONG: case BUTTON_F_LONG:
if (xTaskGetTickCount() - autoRepeatTimer if (xTaskGetTickCount() - autoRepeatTimer + autoRepeatAcceleration > PRESS_ACCEL_INTERVAL_MAX) {
+ autoRepeatAcceleration> PRESS_ACCEL_INTERVAL_MAX) {
if (systemSettings.ReverseButtonTempChangeEnabled) { if (systemSettings.ReverseButtonTempChangeEnabled) {
systemSettings.SolderingTemp -= systemSettings.SolderingTemp -= systemSettings.TempChangeLongStep;
systemSettings.TempChangeLongStep;
} else } else
systemSettings.SolderingTemp += systemSettings.SolderingTemp += systemSettings.TempChangeLongStep;
systemSettings.TempChangeLongStep;
autoRepeatTimer = xTaskGetTickCount(); autoRepeatTimer = xTaskGetTickCount();
autoRepeatAcceleration += PRESS_ACCEL_STEP; autoRepeatAcceleration += PRESS_ACCEL_STEP;
} }
break; break;
case BUTTON_F_SHORT: case BUTTON_F_SHORT:
if (systemSettings.ReverseButtonTempChangeEnabled) { if (systemSettings.ReverseButtonTempChangeEnabled) {
systemSettings.SolderingTemp -= systemSettings.SolderingTemp -= systemSettings.TempChangeShortStep; // add 10
systemSettings.TempChangeShortStep; // add 10
} else } else
systemSettings.SolderingTemp += systemSettings.SolderingTemp += systemSettings.TempChangeShortStep; // add 10
systemSettings.TempChangeShortStep; // add 10
break; break;
default: default:
break; break;
} }
if ((PRESS_ACCEL_INTERVAL_MAX - autoRepeatAcceleration) if ((PRESS_ACCEL_INTERVAL_MAX - autoRepeatAcceleration) < PRESS_ACCEL_INTERVAL_MIN) {
< PRESS_ACCEL_INTERVAL_MIN) { autoRepeatAcceleration = PRESS_ACCEL_INTERVAL_MAX - PRESS_ACCEL_INTERVAL_MIN;
autoRepeatAcceleration = PRESS_ACCEL_INTERVAL_MAX
- PRESS_ACCEL_INTERVAL_MIN;
} }
// constrain between 10-450 C // constrain between 10-450 C
#ifdef ENABLED_FAHRENHEIT_SUPPORT #ifdef ENABLED_FAHRENHEIT_SUPPORT
if (systemSettings.temperatureInF) { if (systemSettings.temperatureInF) {
if (systemSettings.SolderingTemp > 850) systemSettings.SolderingTemp = 850; if (systemSettings.SolderingTemp > 850) systemSettings.SolderingTemp = 850;
if (systemSettings.SolderingTemp < 60) systemSettings.SolderingTemp = 60; if (systemSettings.SolderingTemp < 60) systemSettings.SolderingTemp = 60;
} else } else
#endif #endif
{ {
if (systemSettings.SolderingTemp > 450) if (systemSettings.SolderingTemp > 450)
@@ -254,21 +244,17 @@ static void gui_solderingTempAdjust() {
#else #else
if (OLED::getRotation()) { if (OLED::getRotation()) {
#endif #endif
OLED::print( OLED::print(systemSettings.ReverseButtonTempChangeEnabled ? SymbolPlus : SymbolMinus);
systemSettings.ReverseButtonTempChangeEnabled ?
SymbolPlus : SymbolMinus);
} else { } else {
OLED::print( OLED::print(systemSettings.ReverseButtonTempChangeEnabled ? SymbolMinus : SymbolPlus);
systemSettings.ReverseButtonTempChangeEnabled ?
SymbolMinus : SymbolPlus);
} }
OLED::print(SymbolSpace); OLED::print(SymbolSpace);
OLED::printNumber(systemSettings.SolderingTemp, 3); OLED::printNumber(systemSettings.SolderingTemp, 3);
#ifdef ENABLED_FAHRENHEIT_SUPPORT #ifdef ENABLED_FAHRENHEIT_SUPPORT
if (systemSettings.temperatureInF) if (systemSettings.temperatureInF)
OLED::drawSymbol(0); OLED::drawSymbol(0);
else else
#endif #endif
{ {
OLED::drawSymbol(1); OLED::drawSymbol(1);
@@ -279,13 +265,9 @@ static void gui_solderingTempAdjust() {
#else #else
if (OLED::getRotation()) { if (OLED::getRotation()) {
#endif #endif
OLED::print( OLED::print(systemSettings.ReverseButtonTempChangeEnabled ? SymbolMinus : SymbolPlus);
systemSettings.ReverseButtonTempChangeEnabled ?
SymbolMinus : SymbolPlus);
} else { } else {
OLED::print( OLED::print(systemSettings.ReverseButtonTempChangeEnabled ? SymbolPlus : SymbolMinus);
systemSettings.ReverseButtonTempChangeEnabled ?
SymbolPlus : SymbolMinus);
} }
OLED::refresh(); OLED::refresh();
GUIDelay(); GUIDelay();
@@ -299,33 +281,26 @@ static int gui_SolderingSleepingMode(bool stayOff) {
ButtonState buttons = getButtonState(); ButtonState buttons = getButtonState();
if (buttons) if (buttons)
return 0; return 0;
if ((xTaskGetTickCount() > 1000) if ((xTaskGetTickCount() > 1000) && ((accelInit && (xTaskGetTickCount() - lastMovementTime < 1000)) || (xTaskGetTickCount() - lastButtonTime < 1000)))
&& ((accelInit
&& (xTaskGetTickCount() - lastMovementTime < 1000))
|| (xTaskGetTickCount() - lastButtonTime < 1000)))
return 0; // user moved or pressed a button, go back to soldering return 0; // user moved or pressed a button, go back to soldering
#ifdef MODEL_TS100 #ifdef MODEL_TS100
if (checkVoltageForExit()) if (checkVoltageForExit())
return 1; // return non-zero on error return 1; // return non-zero on error
#endif #endif
#ifdef ENABLED_FAHRENHEIT_SUPPORT #ifdef ENABLED_FAHRENHEIT_SUPPORT
if (systemSettings.temperatureInF) { if (systemSettings.temperatureInF) {
currentTempTargetDegC = stayOff ? 0 : TipThermoModel::convertFtoC(min(systemSettings.SleepTemp, systemSettings.SolderingTemp)); currentTempTargetDegC = stayOff ? 0 : TipThermoModel::convertFtoC(min(systemSettings.SleepTemp, systemSettings.SolderingTemp));
} else } else
#endif #endif
{ {
currentTempTargetDegC = currentTempTargetDegC = stayOff ? 0 : min(systemSettings.SleepTemp, systemSettings.SolderingTemp);
stayOff ?
0 :
min(systemSettings.SleepTemp,
systemSettings.SolderingTemp);
} }
// draw the lcd // draw the lcd
uint16_t tipTemp; uint16_t tipTemp;
#ifdef ENABLED_FAHRENHEIT_SUPPORT #ifdef ENABLED_FAHRENHEIT_SUPPORT
if (systemSettings.temperatureInF) if (systemSettings.temperatureInF)
tipTemp = TipThermoModel::getTipInF(); tipTemp = TipThermoModel::getTipInF();
else else
#endif #endif
{ {
tipTemp = TipThermoModel::getTipInC(); tipTemp = TipThermoModel::getTipInC();
@@ -340,9 +315,9 @@ static int gui_SolderingSleepingMode(bool stayOff) {
OLED::print(SleepingTipAdvancedString); OLED::print(SleepingTipAdvancedString);
OLED::printNumber(tipTemp, 3); OLED::printNumber(tipTemp, 3);
#ifdef ENABLED_FAHRENHEIT_SUPPORT #ifdef ENABLED_FAHRENHEIT_SUPPORT
if (systemSettings.temperatureInF) if (systemSettings.temperatureInF)
OLED::print(SymbolDegF); OLED::print(SymbolDegF);
else else
#endif #endif
{ {
OLED::print(SymbolDegC); OLED::print(SymbolDegC);
@@ -356,9 +331,9 @@ static int gui_SolderingSleepingMode(bool stayOff) {
OLED::print(SleepingSimpleString); OLED::print(SleepingSimpleString);
OLED::printNumber(tipTemp, 3); OLED::printNumber(tipTemp, 3);
#ifdef ENABLED_FAHRENHEIT_SUPPORT #ifdef ENABLED_FAHRENHEIT_SUPPORT
if (systemSettings.temperatureInF) if (systemSettings.temperatureInF)
OLED::drawSymbol(0); OLED::drawSymbol(0);
else else
#endif #endif
{ {
OLED::drawSymbol(1); OLED::drawSymbol(1);
@@ -366,8 +341,7 @@ static int gui_SolderingSleepingMode(bool stayOff) {
} }
if (systemSettings.ShutdownTime) // only allow shutdown exit if time > 0 if (systemSettings.ShutdownTime) // only allow shutdown exit if time > 0
if (lastMovementTime) if (lastMovementTime)
if (((uint32_t) (xTaskGetTickCount() - lastMovementTime)) if (((uint32_t) (xTaskGetTickCount() - lastMovementTime)) > (uint32_t) (systemSettings.ShutdownTime * 60 * 1000)) {
> (uint32_t) (systemSettings.ShutdownTime * 60 * 1000)) {
// shutdown // shutdown
currentTempTargetDegC = 0; currentTempTargetDegC = 0;
return 1; // we want to exit soldering mode return 1; // we want to exit soldering mode
@@ -383,9 +357,7 @@ static void display_countdown(int sleepThres) {
* Print seconds or minutes (if > 99 seconds) until sleep * Print seconds or minutes (if > 99 seconds) until sleep
* mode is triggered. * mode is triggered.
*/ */
int lastEventTime = int lastEventTime = lastButtonTime < lastMovementTime ? lastMovementTime : lastButtonTime;
lastButtonTime < lastMovementTime ?
lastMovementTime : lastButtonTime;
int downCount = sleepThres - xTaskGetTickCount() + lastEventTime; int downCount = sleepThres - xTaskGetTickCount() + lastEventTime;
if (downCount > 99000) { if (downCount > 99000) {
OLED::printNumber(downCount / 60000 + 1, 2); OLED::printNumber(downCount / 60000 + 1, 2);
@@ -517,18 +489,18 @@ static void gui_solderingMode(uint8_t jumpToSleep) {
// Update the setpoints for the temperature // Update the setpoints for the temperature
if (boostModeOn) { if (boostModeOn) {
#ifdef ENABLED_FAHRENHEIT_SUPPORT #ifdef ENABLED_FAHRENHEIT_SUPPORT
if (systemSettings.temperatureInF) if (systemSettings.temperatureInF)
currentTempTargetDegC = TipThermoModel::convertFtoC(systemSettings.BoostTemp); currentTempTargetDegC = TipThermoModel::convertFtoC(systemSettings.BoostTemp);
else else
#endif #endif
{ {
currentTempTargetDegC = (systemSettings.BoostTemp); currentTempTargetDegC = (systemSettings.BoostTemp);
} }
} else { } else {
#ifdef ENABLED_FAHRENHEIT_SUPPORT #ifdef ENABLED_FAHRENHEIT_SUPPORT
if (systemSettings.temperatureInF) if (systemSettings.temperatureInF)
currentTempTargetDegC = TipThermoModel::convertFtoC(systemSettings.SolderingTemp); currentTempTargetDegC = TipThermoModel::convertFtoC(systemSettings.SolderingTemp);
else else
#endif #endif
{ {
currentTempTargetDegC = (systemSettings.SolderingTemp); currentTempTargetDegC = (systemSettings.SolderingTemp);
@@ -544,8 +516,7 @@ static void gui_solderingMode(uint8_t jumpToSleep) {
#endif #endif
if (systemSettings.sensitivity && systemSettings.SleepTime) if (systemSettings.sensitivity && systemSettings.SleepTime)
if (xTaskGetTickCount() - lastMovementTime > sleepThres if (xTaskGetTickCount() - lastMovementTime > sleepThres && xTaskGetTickCount() - lastButtonTime > sleepThres) {
&& xTaskGetTickCount() - lastButtonTime > sleepThres) {
if (gui_SolderingSleepingMode(false)) { if (gui_SolderingSleepingMode(false)) {
return; // If the function returns non-0 then exit return; // If the function returns non-0 then exit
} }
@@ -593,8 +564,7 @@ void showDebugMenu(void) {
{ {
uint32_t temp = systemSettings.CalibrationOffset; uint32_t temp = systemSettings.CalibrationOffset;
systemSettings.CalibrationOffset = 0; systemSettings.CalibrationOffset = 0;
OLED::printNumber( OLED::printNumber(TipThermoModel::convertTipRawADCTouV(getTipRawTemp(1)), 6);
TipThermoModel::convertTipRawADCTouV(getTipRawTemp(1)), 6);
systemSettings.CalibrationOffset = temp; systemSettings.CalibrationOffset = temp;
} }
break; break;
@@ -642,8 +612,7 @@ void startGUITask(void const *argument __unused) {
//flipped is generated by flipping each row //flipped is generated by flipping each row
for (int row = 0; row < 2; row++) { for (int row = 0; row < 2; row++) {
for (int x = 0; x < 84; x++) { for (int x = 0; x < 84; x++) {
idleScreenBGF[(row * 84) + x] = idleScreenBG[(row * 84) idleScreenBGF[(row * 84) + x] = idleScreenBG[(row * 84) + (83 - x)];
+ (83 - x)];
} }
} }
} }
@@ -736,11 +705,7 @@ void startGUITask(void const *argument __unused) {
// button presses) in a while. // button presses) in a while.
OLED::setDisplayState(OLED::DisplayState::ON); OLED::setDisplayState(OLED::DisplayState::ON);
if ((tipTemp < 50) && systemSettings.sensitivity if ((tipTemp < 50) && systemSettings.sensitivity && (((xTaskGetTickCount() - lastMovementTime) > MOVEMENT_INACTIVITY_TIME) && ((xTaskGetTickCount() - lastButtonTime) > BUTTON_INACTIVITY_TIME))) {
&& (((xTaskGetTickCount() - lastMovementTime)
> MOVEMENT_INACTIVITY_TIME)
&& ((xTaskGetTickCount() - lastButtonTime)
> BUTTON_INACTIVITY_TIME))) {
OLED::setDisplayState(OLED::DisplayState::OFF); OLED::setDisplayState(OLED::DisplayState::OFF);
} }
@@ -799,8 +764,7 @@ void startGUITask(void const *argument __unused) {
OLED::setCursor(0, 0); OLED::setCursor(0, 0);
} }
// draw in the temp // draw in the temp
if (!(systemSettings.coolingTempBlink if (!(systemSettings.coolingTempBlink && (xTaskGetTickCount() % 25 < 16)))
&& (xTaskGetTickCount() % 25 < 16)))
gui_drawTipTemp(false); // draw in the temp gui_drawTipTemp(false); // draw in the temp
} }
} }