mirror of
https://github.com/Ralim/IronOS.git
synced 2025-02-26 07:53:55 +00:00
Release 2.19
* Bug-fix Infinite Boot Logo * Shutdown settings for MHP30 * Accelerometer sensitivity for MHP30 * Allow showing unique device ID * Bug-fix power pulse at device boot
This commit is contained in:
14
.github/workflows/push.yml
vendored
14
.github/workflows/push.yml
vendored
@@ -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
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
FROM alpine:3.15
|
||||
FROM alpine:3.16
|
||||
LABEL maintainer="Ben V. Brown <ralim@ralimtek.com>"
|
||||
|
||||
WORKDIR /build
|
||||
@@ -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
|
||||
|
||||
@@ -20,6 +20,15 @@ This project is considered feature complete for use as a soldering iron, _so ple
|
||||
|
||||
_This firmware does **NOT** support the USB port while running for changing settings. This is done through the onscreen menu only. Logos are edited using the tool or python script and uploaded in DFU mode._
|
||||
|
||||
|
||||
| Device | DC Supported | QC Supported | PD Supported | Reccomended |
|
||||
|--------: |:------------: |:------------: |:------------: |:-----------: |
|
||||
| MHP30 | ❌ | ❌ | ✔️ | ✔️ |
|
||||
| Pinecil | ✔️ | ✔️ | ✔️ | ✔️ |
|
||||
| TS100 | ✔️ | ❌ | ❌ | ❌ |
|
||||
| TS80 | ❌ | ✔️ | ❌ | ❌ |
|
||||
| TS80P | ❌ | ✔️ | ✔️ | ✔️ |
|
||||
|
||||
## Getting Started
|
||||
|
||||
To get started with IronOS firmware, please jump to [Getting Started Guide](Documentation/GettingStarted.md).
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -80,8 +80,8 @@
|
||||
"desc": "Délai avant mise en veille (s=secondes | m=minutes)"
|
||||
},
|
||||
"ShutdownTimeout": {
|
||||
"text2": ["Délai", "extinction"],
|
||||
"desc": "Délai avant extinction (m=minutes)"
|
||||
"text2": ["Délai", "arrêt"],
|
||||
"desc": "Délai avant l'arrêt du fer à souder (m=minutes)"
|
||||
},
|
||||
"MotionSensitivity": {
|
||||
"text2": ["Sensibilité", "au mouvement"],
|
||||
@@ -136,7 +136,7 @@
|
||||
"desc": "Tension maximale désirée avec une alimentation QC"
|
||||
},
|
||||
"PDNegTimeout": {
|
||||
"text2": ["Délai", "expiration PD"],
|
||||
"text2": ["Délai", "expir. PD"],
|
||||
"desc": "Délai de la negociation PD par étapes de 100ms pour la compatiblité avec certains chargeurs QC"
|
||||
},
|
||||
"PowerLimit": {
|
||||
@@ -156,17 +156,17 @@
|
||||
"desc": "Incrément de changement de température sur appui long"
|
||||
},
|
||||
"PowerPulsePower": {
|
||||
"text2": ["Puissance des", "impulsions"],
|
||||
"text2": ["Puissance", "impulsions"],
|
||||
"desc": "Puissance des impulsions pour éviter la mise en veille des batteries (watts)"
|
||||
},
|
||||
"LockingMode": {
|
||||
"text2": ["Verrouiller", "les boutons"],
|
||||
"desc": "Pendant la soudure, appuyer sur les deux boutons pour les verrouiller (D=désactivé | B=boost seulement | V=verr. total)"
|
||||
},
|
||||
"HallEffSensitivity": {
|
||||
"text2": ["Sensibilité", "capteur effet hall"],
|
||||
"desc": "Sensibilité du capteur à effet Hall pour la mise en veille (0=désactivé | 1=peu sensible | ... | 9=très sensible)"
|
||||
},
|
||||
"LockingMode": {
|
||||
"text2": ["Verrouiller", "les boutons"],
|
||||
"desc": "Pendant la soudure, appuyer sur les deux boutons pour les verrouiller (D=désactivé | B=boost seulement | V=verr. total)"
|
||||
},
|
||||
"MinVolCell": {
|
||||
"text2": ["Tension", "minimale"],
|
||||
"desc": "Tension minimale autorisée par cellule (3S: 3 - 3.7V | 4-6S: 2.4 - 3.7V)"
|
||||
@@ -193,15 +193,15 @@
|
||||
},
|
||||
"Brightness": {
|
||||
"text2": ["Luminosité", "de l'écran"],
|
||||
"desc": "Ajuster le contraste/luminosité de l'écran OLED"
|
||||
"desc": "Ajuster la luminosité de l'écran OLED"
|
||||
},
|
||||
"ColourInversion": {
|
||||
"text2": ["Inverser", "les couleurs"],
|
||||
"desc": "Inverser les couleurs de l'écran OLED"
|
||||
},
|
||||
"LOGOTime": {
|
||||
"text2": ["Boot logo", "duration"],
|
||||
"desc": "Sets the duration for the boot logo (s=seconds)"
|
||||
"text2": ["Durée logo", "au démarrage"],
|
||||
"desc": "Définit la durée d'affichage du logo au démarrage (s=secondes)"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -132,8 +132,8 @@
|
||||
"desc": "Szybkość przewijania tekstu"
|
||||
},
|
||||
"QCMaxVoltage": {
|
||||
"text2": ["Moc", "w W"],
|
||||
"desc": "Moc używanego zasilacza w (W)"
|
||||
"text2": ["QC", "napięcie"],
|
||||
"desc": "Maksymalne napięcie, które lutownica będzie próbowała wynegocjować z ładowarką Quick Charge (V)"
|
||||
},
|
||||
"PDNegTimeout": {
|
||||
"text2": ["Limit czasu", "PD"],
|
||||
|
||||
@@ -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 {
|
||||
@@ -86,6 +89,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
|
||||
|
||||
@@ -13,13 +13,15 @@
|
||||
#include <IRQ.h>
|
||||
|
||||
WS2812<GPIOA_BASE, WS2812_Pin, 1> 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<uint16_t, PID_TIM_HZ> rawTempFilter = {{0}, 0, 0};
|
||||
|
||||
history<uint16_t, PID_TIM_HZ> 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;
|
||||
@@ -455,3 +471,7 @@ void setStatusLED(const enum StatusLED state) {
|
||||
setBuzzer(false);
|
||||
}
|
||||
}
|
||||
uint64_t getDeviceID() {
|
||||
//
|
||||
return HAL_GetUIDw0() | ((uint64_t)HAL_GetUIDw1() << 32);
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -282,4 +282,9 @@ bool isTipDisconnected() {
|
||||
return tipTemp > tipDisconnectedThres;
|
||||
}
|
||||
|
||||
void setStatusLED(const enum StatusLED state) {}
|
||||
void setStatusLED(const enum StatusLED state) {}
|
||||
uint8_t preStartChecks() { return 0; }
|
||||
uint64_t getDeviceID() {
|
||||
//
|
||||
return HAL_GetUIDw0() | ((uint64_t)HAL_GetUIDw1() << 32);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)))); }
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
@@ -1,236 +1,208 @@
|
||||
#ifndef CONFIGURATION_H_
|
||||
#define CONFIGURATION_H_
|
||||
#include "Settings.h"
|
||||
#include <stdint.h>
|
||||
/**
|
||||
* Configuration.h
|
||||
* Define here your default pre settings for TS80(P) or TS100
|
||||
*
|
||||
*/
|
||||
#define CONFIGURATION_H_
|
||||
#include "Settings.h"
|
||||
#include <stdint.h>
|
||||
/**
|
||||
* Configuration.h
|
||||
* Define here your default pre settings for TS80(P) or TS100
|
||||
*
|
||||
*/
|
||||
|
||||
//===========================================================================
|
||||
//============================= Default Settings ============================
|
||||
//===========================================================================
|
||||
/**
|
||||
* Default soldering temp is 320.0 C
|
||||
* Temperature the iron sleeps at - default 150.0 C
|
||||
*/
|
||||
//===========================================================================
|
||||
//============================= Default Settings ============================
|
||||
//===========================================================================
|
||||
/**
|
||||
* Default soldering temp is 320.0 C
|
||||
* Temperature the iron sleeps at - default 150.0 C
|
||||
*/
|
||||
|
||||
#define SLEEP_TEMP 150 // Default sleep temperature
|
||||
#define BOOST_TEMP 420 // Default boost temp.
|
||||
#define BOOST_MODE_ENABLED 1 // 0: Disable 1: Enable
|
||||
#define SLEEP_TEMP 150 // Default sleep temperature
|
||||
#define BOOST_TEMP 420 // Default boost temp.
|
||||
#define BOOST_MODE_ENABLED 1 // 0: Disable 1: Enable
|
||||
|
||||
/**
|
||||
* Blink the temperature on the cooling screen when its > 50C
|
||||
*/
|
||||
#define COOLING_TEMP_BLINK 0 // 0: Disable 1: Enable
|
||||
/**
|
||||
* Blink the temperature on the cooling screen when its > 50C
|
||||
*/
|
||||
#define COOLING_TEMP_BLINK 0 // 0: Disable 1: Enable
|
||||
|
||||
/**
|
||||
* How many seconds/minutes we wait until going to sleep/shutdown.
|
||||
* Values -> SLEEP_TIME * 10; i.e. 5*10 = 50 Seconds!
|
||||
*/
|
||||
#define SLEEP_TIME 5 // x10 Seconds
|
||||
#define SHUTDOWN_TIME 10 // Minutes
|
||||
/**
|
||||
* How many seconds/minutes we wait until going to sleep/shutdown.
|
||||
* Values -> SLEEP_TIME * 10; i.e. 5*10 = 50 Seconds!
|
||||
*/
|
||||
#define SLEEP_TIME 5 // x10 Seconds
|
||||
#define SHUTDOWN_TIME 10 // Minutes
|
||||
|
||||
/**
|
||||
* Auto start off for safety.
|
||||
* Pissible values are:
|
||||
* 0 - none
|
||||
* 1 - Soldering Temperature
|
||||
* 2 - Sleep Temperature
|
||||
* 3 - Sleep Off Temperature
|
||||
*/
|
||||
#define AUTO_START_MODE 0 // Default to none
|
||||
/**
|
||||
* Auto start off for safety.
|
||||
* Pissible values are:
|
||||
* 0 - none
|
||||
* 1 - Soldering Temperature
|
||||
* 2 - Sleep Temperature
|
||||
* 3 - Sleep Off Temperature
|
||||
*/
|
||||
#define AUTO_START_MODE 0 // Default to none
|
||||
|
||||
/**
|
||||
* Locking Mode
|
||||
* When in soldering mode a long press on both keys toggle the lock of the buttons
|
||||
* Possible values are:
|
||||
* 0 - Desactivated
|
||||
* 1 - Lock except boost
|
||||
* 2 - Full lock
|
||||
*/
|
||||
#define LOCKING_MODE 0 // Default to desactivated for safety
|
||||
/**
|
||||
* Locking Mode
|
||||
* When in soldering mode a long press on both keys toggle the lock of the buttons
|
||||
* Possible values are:
|
||||
* 0 - Desactivated
|
||||
* 1 - Lock except boost
|
||||
* 2 - Full lock
|
||||
*/
|
||||
#define LOCKING_MODE 0 // Default to desactivated for safety
|
||||
|
||||
/**
|
||||
* OLED Orientation
|
||||
*
|
||||
*/
|
||||
#define ORIENTATION_MODE 2 // 0: Right 1:Left 2:Automatic - Default Automatic
|
||||
#define REVERSE_BUTTON_TEMP_CHANGE 0 // 0:Default 1:Reverse - Reverse the plus and minus button assigment for temperature change
|
||||
/**
|
||||
* OLED Orientation
|
||||
*
|
||||
*/
|
||||
#define ORIENTATION_MODE 2 // 0: Right 1:Left 2:Automatic - Default Automatic
|
||||
#define REVERSE_BUTTON_TEMP_CHANGE 0 // 0:Default 1:Reverse - Reverse the plus and minus button assigment for temperature change
|
||||
|
||||
/**
|
||||
* Temp change settings
|
||||
*/
|
||||
#define TEMP_CHANGE_SHORT_STEP 1 // Default temp change short step +1
|
||||
#define TEMP_CHANGE_LONG_STEP 10 // Default temp change long step +10
|
||||
#define TEMP_CHANGE_SHORT_STEP_MAX 50 // Temp change short step MAX value
|
||||
#define TEMP_CHANGE_LONG_STEP_MAX 90 // Temp change long step MAX value
|
||||
/**
|
||||
* Temp change settings
|
||||
*/
|
||||
#define TEMP_CHANGE_SHORT_STEP 1 // Default temp change short step +1
|
||||
#define TEMP_CHANGE_LONG_STEP 10 // Default temp change long step +10
|
||||
#define TEMP_CHANGE_SHORT_STEP_MAX 50 // Temp change short step MAX value
|
||||
#define TEMP_CHANGE_LONG_STEP_MAX 90 // Temp change long step MAX value
|
||||
|
||||
/* Power pulse for keeping power banks awake*/
|
||||
#define POWER_PULSE_INCREMENT 1
|
||||
#define POWER_PULSE_MAX 100 // x10 max watts
|
||||
#define POWER_PULSE_WAIT_MAX 9 // 9*2.5s = 22.5 seconds
|
||||
#define POWER_PULSE_DURATION_MAX 9 // 9*250ms = 2.25 seconds
|
||||
/* Power pulse for keeping power banks awake*/
|
||||
#define POWER_PULSE_INCREMENT 1
|
||||
#define POWER_PULSE_MAX 100 // x10 max watts
|
||||
#define POWER_PULSE_WAIT_MAX 9 // 9*2.5s = 22.5 seconds
|
||||
#define POWER_PULSE_DURATION_MAX 9 // 9*250ms = 2.25 seconds
|
||||
|
||||
#ifdef MODEL_TS100
|
||||
#define POWER_PULSE_DEFAULT 0
|
||||
#else
|
||||
#define POWER_PULSE_DEFAULT 5
|
||||
#endif
|
||||
#define POWER_PULSE_WAIT_DEFAULT 4 // Default rate of the power pulse: 4*2500 = 10000 ms = 10 s
|
||||
#define POWER_PULSE_DURATION_DEFAULT 1 // Default duration of the power pulse: 1*250 = 250 ms
|
||||
#ifdef MODEL_TS100
|
||||
#define POWER_PULSE_DEFAULT 0
|
||||
#else
|
||||
#define POWER_PULSE_DEFAULT 5
|
||||
#endif
|
||||
#define POWER_PULSE_WAIT_DEFAULT 4 // Default rate of the power pulse: 4*2500 = 10000 ms = 10 s
|
||||
#define POWER_PULSE_DURATION_DEFAULT 1 // Default duration of the power pulse: 1*250 = 250 ms
|
||||
|
||||
/**
|
||||
* OLED Orientation Sensitivity on Automatic mode!
|
||||
* Motion Sensitivity <0=Off 1=Least Sensitive 9=Most Sensitive>
|
||||
*/
|
||||
#define SENSITIVITY 7 // Default 7
|
||||
/**
|
||||
* OLED Orientation Sensitivity on Automatic mode!
|
||||
* Motion Sensitivity <0=Off 1=Least Sensitive 9=Most Sensitive>
|
||||
*/
|
||||
#define SENSITIVITY 7 // Default 7
|
||||
|
||||
/**
|
||||
* Detailed soldering screen
|
||||
* Detailed idle screen (off for first time users)
|
||||
*/
|
||||
#define DETAILED_SOLDERING 0 // 0: Disable 1: Enable - Default 0
|
||||
#define DETAILED_IDLE 0 // 0: Disable 1: Enable - Default 0
|
||||
/**
|
||||
* Detailed soldering screen
|
||||
* Detailed idle screen (off for first time users)
|
||||
*/
|
||||
#define DETAILED_SOLDERING 0 // 0: Disable 1: Enable - Default 0
|
||||
#define DETAILED_IDLE 0 // 0: Disable 1: Enable - Default 0
|
||||
|
||||
#define THERMAL_RUNAWAY_TIME_SEC 20
|
||||
#define THERMAL_RUNAWAY_TEMP_C 10
|
||||
#define THERMAL_RUNAWAY_TIME_SEC 20
|
||||
#define THERMAL_RUNAWAY_TEMP_C 10
|
||||
|
||||
#define CUT_OUT_SETTING 0 // default to no cut-off voltage
|
||||
#define RECOM_VOL_CELL 33 // Minimum voltage per cell (Recommended 3.3V (33))
|
||||
#define TEMPERATURE_INF 0 // default to 0
|
||||
#define DESCRIPTION_SCROLL_SPEED 0 // 0: Slow 1: Fast - default to slow
|
||||
#define ANIMATION_LOOP 1 // 0: off 1: on
|
||||
#define ANIMATION_SPEED settingOffSpeed_t::MEDIUM
|
||||
#define CUT_OUT_SETTING 0 // default to no cut-off voltage
|
||||
#define RECOM_VOL_CELL 33 // Minimum voltage per cell (Recommended 3.3V (33))
|
||||
#define TEMPERATURE_INF 0 // default to 0
|
||||
#define DESCRIPTION_SCROLL_SPEED 0 // 0: Slow 1: Fast - default to slow
|
||||
#define ANIMATION_LOOP 1 // 0: off 1: on
|
||||
#define ANIMATION_SPEED settingOffSpeed_t::MEDIUM
|
||||
|
||||
#define OP_AMP_Rf_TS100 750 * 1000 // 750 Kilo-ohms -> From schematic, R1
|
||||
#define OP_AMP_Rin_TS100 2370 // 2.37 Kilo-ohms -> From schematic, R2
|
||||
#define OP_AMP_Rf_TS100 750 * 1000 // 750 Kilo-ohms -> From schematic, R1
|
||||
#define OP_AMP_Rin_TS100 2370 // 2.37 Kilo-ohms -> From schematic, R2
|
||||
|
||||
#define OP_AMP_GAIN_STAGE_TS100 (1 + (OP_AMP_Rf_TS100 / OP_AMP_Rin_TS100))
|
||||
#define OP_AMP_GAIN_STAGE_TS100 (1 + (OP_AMP_Rf_TS100 / OP_AMP_Rin_TS100))
|
||||
|
||||
#define OP_AMP_Rf_TS80 180 * 1000 // 180 Kilo-ohms -> From schematic, R6
|
||||
#define OP_AMP_Rin_TS80 2000 // 2.0 Kilo-ohms -> From schematic, R3
|
||||
#define OP_AMP_Rf_TS80 180 * 1000 // 180 Kilo-ohms -> From schematic, R6
|
||||
#define OP_AMP_Rin_TS80 2000 // 2.0 Kilo-ohms -> From schematic, R3
|
||||
|
||||
#define OP_AMP_GAIN_STAGE_TS80 (1 + (OP_AMP_Rf_TS80 / OP_AMP_Rin_TS80))
|
||||
#define OP_AMP_GAIN_STAGE_TS80 (1 + (OP_AMP_Rf_TS80 / OP_AMP_Rin_TS80))
|
||||
|
||||
// Deriving the Voltage div:
|
||||
// Vin_max = (3.3*(r1+r2))/(r2)
|
||||
// vdiv = (32768*4)/(vin_max*10)
|
||||
// Deriving the Voltage div:
|
||||
// Vin_max = (3.3*(r1+r2))/(r2)
|
||||
// vdiv = (32768*4)/(vin_max*10)
|
||||
|
||||
#if defined(MODEL_TS100) + defined(MODEL_TS80) + defined(MODEL_TS80P) > 1
|
||||
#error "Multiple models defined!"
|
||||
#elif defined(MODEL_TS100) + defined(MODEL_TS80) + defined(MODEL_TS80P) == 0
|
||||
#error "No model defined!"
|
||||
#if defined(MODEL_TS100) + defined(MODEL_TS80) + defined(MODEL_TS80P) > 1
|
||||
#error "Multiple models defined!"
|
||||
#elif defined(MODEL_TS100) + defined(MODEL_TS80) + defined(MODEL_TS80P) == 0
|
||||
#error "No model defined!"
|
||||
#endif
|
||||
|
||||
// Miniware is swapping IMU's around a bit now, so we turn them all on
|
||||
|
||||
#define ACCEL_MMA
|
||||
#define ACCEL_LIS
|
||||
#define ACCEL_SC7
|
||||
#define ACCEL_MSA
|
||||
#define ACCEL_BMA
|
||||
|
||||
#define MIN_CALIBRATION_OFFSET 100 // Min value for calibration
|
||||
#define SOLDERING_TEMP 320 // Default soldering temp is 320.0 °C
|
||||
#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
|
||||
#define MIN_TEMP_C 10 // Min soldering temp selectable °C
|
||||
#define MIN_TEMP_F 60 // Min soldering temp selectable °F
|
||||
#define MIN_BOOST_TEMP_C 250 // The min settable temp for boost mode °C
|
||||
#define MIN_BOOST_TEMP_F 480 // The min settable temp for boost mode °F
|
||||
|
||||
#ifdef MODEL_TS100
|
||||
#define VOLTAGE_DIV 467 // 467 - Default divider from schematic
|
||||
#define CALIBRATION_OFFSET 900 // 900 - Default adc offset in uV
|
||||
#define PID_POWER_LIMIT 70 // Sets the max pwm power limit
|
||||
#define POWER_LIMIT 0 // 0 watts default limit
|
||||
#define MAX_POWER_LIMIT 70
|
||||
#define POWER_LIMIT_STEPS 5
|
||||
#define OP_AMP_GAIN_STAGE OP_AMP_GAIN_STAGE_TS100
|
||||
#define TEMP_uV_LOOKUP_HAKKO
|
||||
#define USB_PD_VMAX 20 // Maximum voltage for PD to negotiate
|
||||
|
||||
#define HARDWARE_MAX_WATTAGE_X10 750
|
||||
#define TIP_THERMAL_MASS 65 // X10 watts to raise 1 deg C in 1 second
|
||||
#define TIP_RESISTANCE 75 // x10 ohms, 7.5 typical for ts100 tips
|
||||
|
||||
#define POW_DC
|
||||
#define POW_PD 0
|
||||
#define TEMP_TMP36
|
||||
#endif
|
||||
|
||||
#if defined(MODEL_TS80) + defined(MODEL_TS80P) > 0
|
||||
#define MAX_POWER_LIMIT 40
|
||||
#define POWER_LIMIT_STEPS 2
|
||||
#define OP_AMP_GAIN_STAGE OP_AMP_GAIN_STAGE_TS80
|
||||
#define TEMP_uV_LOOKUP_TS80
|
||||
#define USB_PD_VMAX 12 // Maximum voltage for PD to negotiate
|
||||
|
||||
#define TIP_THERMAL_MASS 40
|
||||
#define TIP_RESISTANCE 45 // x10 ohms, 4.5 typical for ts80 tips
|
||||
|
||||
#define LIS_ORI_FLIP
|
||||
#define OLED_FLIP
|
||||
#endif
|
||||
|
||||
#ifdef MODEL_TS80
|
||||
#define VOLTAGE_DIV 780 // Default divider from schematic
|
||||
#define CALIBRATION_OFFSET 900 // the adc offset in uV
|
||||
#define PID_POWER_LIMIT 24 // Sets the max pwm power limit
|
||||
#define POWER_LIMIT 24 // 24 watts default power limit
|
||||
|
||||
#define HARDWARE_MAX_WATTAGE_X10 180
|
||||
|
||||
#define POW_QC
|
||||
#define POW_PD 0
|
||||
#define TEMP_TMP36
|
||||
#endif
|
||||
|
||||
#ifdef MODEL_TS80P
|
||||
#define VOLTAGE_DIV 650 // Default for TS80P with slightly different resistors
|
||||
#define CALIBRATION_OFFSET 1500 // the adc offset in uV
|
||||
#define PID_POWER_LIMIT 35 // Sets the max pwm power limit
|
||||
#define POWER_LIMIT 30 // 30 watts default power limit
|
||||
|
||||
#define HARDWARE_MAX_WATTAGE_X10 300
|
||||
|
||||
#define POW_PD 1
|
||||
#define POW_QC 1
|
||||
#define TEMP_NTC
|
||||
#define I2C_SOFT
|
||||
#define SC7_ORI_FLIP
|
||||
#endif
|
||||
#endif
|
||||
|
||||
// Miniware is swapping IMU's around a bit now, so we turn them all on
|
||||
|
||||
#define ACCEL_MMA
|
||||
#define ACCEL_LIS
|
||||
#define ACCEL_SC7
|
||||
#define ACCEL_MSA
|
||||
#define ACCEL_BMA
|
||||
|
||||
#ifdef MODEL_TS100
|
||||
#define SOLDERING_TEMP 320 // Default soldering temp is 320.0 °C
|
||||
#define VOLTAGE_DIV 467 // 467 - Default divider from schematic
|
||||
#define CALIBRATION_OFFSET 900 // 900 - Default adc offset in uV
|
||||
#define MIN_CALIBRATION_OFFSET 100 // Min value for calibration
|
||||
#define PID_POWER_LIMIT 70 // Sets the max pwm power limit
|
||||
#define POWER_LIMIT 0 // 0 watts default limit
|
||||
#define MAX_POWER_LIMIT 70 //
|
||||
#define POWER_LIMIT_STEPS 5 //
|
||||
#define OP_AMP_GAIN_STAGE OP_AMP_GAIN_STAGE_TS100 //
|
||||
#define TEMP_uV_LOOKUP_HAKKO //
|
||||
#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
|
||||
#define MIN_TEMP_C 10 // Min soldering temp selectable °C
|
||||
#define MIN_TEMP_F 60 // Min soldering temp selectable °F
|
||||
#define MIN_BOOST_TEMP_C 250 // The min settable temp for boost mode °C
|
||||
#define MIN_BOOST_TEMP_F 480 // The min settable temp for boost mode °F
|
||||
#define POW_DC
|
||||
|
||||
#define POW_PD 0
|
||||
|
||||
#define TEMP_TMP36
|
||||
#endif
|
||||
|
||||
#ifdef MODEL_TS80
|
||||
#define SOLDERING_TEMP 320 // Default soldering temp is 320.0 °C
|
||||
#define VOLTAGE_DIV 780 // Default divider from schematic
|
||||
#define PID_POWER_LIMIT 24 // Sets the max pwm power limit
|
||||
#define CALIBRATION_OFFSET 900 // the adc offset in uV
|
||||
#define MIN_CALIBRATION_OFFSET 100 // Min value for calibration
|
||||
#define POWER_LIMIT 24 // 24 watts default power limit
|
||||
#define MAX_POWER_LIMIT 40 //
|
||||
#define POWER_LIMIT_STEPS 2 //
|
||||
#define OP_AMP_GAIN_STAGE OP_AMP_GAIN_STAGE_TS80 //
|
||||
#define TEMP_uV_LOOKUP_TS80 //
|
||||
#define USB_PD_VMAX 12 // 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
|
||||
#define MIN_TEMP_C 10 // Min soldering temp selectable °C
|
||||
#define MIN_TEMP_F 60 // Min soldering temp selectable °F
|
||||
#define MIN_BOOST_TEMP_C 250 // The min settable temp for boost mode °C
|
||||
#define MIN_BOOST_TEMP_F 480 // The min settable temp for boost mode °F
|
||||
|
||||
#define POW_QC
|
||||
#define POW_PD 0
|
||||
#define TEMP_TMP36
|
||||
#define LIS_ORI_FLIP
|
||||
#define OLED_FLIP
|
||||
#endif
|
||||
|
||||
#ifdef MODEL_TS80P
|
||||
#define SOLDERING_TEMP 320 // Default soldering temp is 320.0 °C
|
||||
#define VOLTAGE_DIV 650 // Default for TS80P with slightly different resistors
|
||||
#define PID_POWER_LIMIT 35 // Sets the max pwm power limit
|
||||
#define CALIBRATION_OFFSET 1500 // the adc offset in uV
|
||||
#define MIN_CALIBRATION_OFFSET 100 // Min value for calibration
|
||||
#define POWER_LIMIT 30 // 30 watts default power limit
|
||||
#define MAX_POWER_LIMIT 40 //
|
||||
#define POWER_LIMIT_STEPS 2 //
|
||||
#define OP_AMP_GAIN_STAGE OP_AMP_GAIN_STAGE_TS80 //
|
||||
#define TEMP_uV_LOOKUP_TS80 //
|
||||
#define USB_PD_VMAX 12 // 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
|
||||
#define MIN_TEMP_C 10 // Min soldering temp selectable °C
|
||||
#define MIN_TEMP_F 60 // Min soldering temp selectable °F
|
||||
#define MIN_BOOST_TEMP_C 250 // The min settable temp for boost mode °C
|
||||
#define MIN_BOOST_TEMP_F 480 // The min settable temp for boost mode °F
|
||||
|
||||
#define POW_PD 1
|
||||
#define POW_QC 1
|
||||
#define TEMP_NTC
|
||||
#define I2C_SOFT
|
||||
#define LIS_ORI_FLIP
|
||||
#define SC7_ORI_FLIP
|
||||
#define OLED_FLIP
|
||||
#endif
|
||||
|
||||
#ifdef MODEL_TS100
|
||||
#define HARDWARE_MAX_WATTAGE_X10 750
|
||||
#define TIP_THERMAL_MASS 65 // X10 watts to raise 1 deg C in 1 second
|
||||
#define TIP_RESISTANCE 75 // x10 ohms, 7.5 typical for ts100 tips
|
||||
#endif
|
||||
|
||||
#ifdef MODEL_TS80
|
||||
#define HARDWARE_MAX_WATTAGE_X10 180
|
||||
#define TIP_THERMAL_MASS 40
|
||||
#define TIP_RESISTANCE 45 // x10 ohms, 4.5 typical for ts80 tips
|
||||
#endif
|
||||
|
||||
#ifdef MODEL_TS80P
|
||||
#define HARDWARE_MAX_WATTAGE_X10 300
|
||||
#define TIP_THERMAL_MASS 40
|
||||
#define TIP_RESISTANCE 45 // x10 ohms, 4.5 typical for ts80 tips
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define FLASH_LOGOADDR (0x08000000 + (62 * 1024))
|
||||
#define FLASH_LOGOADDR (0x08000000 + (62 * 1024))
|
||||
|
||||
@@ -90,3 +90,6 @@ bool isTipDisconnected() {
|
||||
}
|
||||
|
||||
void setStatusLED(const enum StatusLED state) {}
|
||||
|
||||
uint8_t preStartChecks() { return 0; }
|
||||
uint64_t getDeviceID() { return dbg_id_get(); }
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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<const uint32_t *>(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);
|
||||
|
||||
@@ -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};
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -62,7 +62,7 @@ uint32_t availableW10(uint8_t sample) {
|
||||
}
|
||||
uint8_t X10WattsToPWM(int32_t x10Watts, uint8_t sample) {
|
||||
// Scale input x10Watts to the pwm range available
|
||||
if (x10Watts < 0) {
|
||||
if (x10Watts <= 0) {
|
||||
// keep the battery voltage updating the filter
|
||||
getInputVoltageX10(getSettingValue(SettingsOptions::VoltageDiv), sample);
|
||||
return 0;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -511,12 +494,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))
|
||||
@@ -649,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
|
||||
@@ -665,8 +669,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;
|
||||
@@ -689,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;
|
||||
@@ -764,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();
|
||||
@@ -779,6 +789,7 @@ void showDebugMenu(void) {
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -790,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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1,2 +0,0 @@
|
||||
*link:
|
||||
%(nano_link) %:replace-outfile(-lm_nano -lm)
|
||||
@@ -4,4 +4,4 @@
|
||||
* i.e.: BUILD_VERSION = 'Rel. v2.08' --> Will generated to: 'v2.08.1a2b3c4'
|
||||
*/
|
||||
|
||||
#define BUILD_VERSION "v2.18"
|
||||
#define BUILD_VERSION "v2.19"
|
||||
|
||||
Reference in New Issue
Block a user