aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorBen V. Brown <[email protected]>2017-07-08 23:16:02 +1000
committerBen V. Brown <[email protected]>2017-07-08 23:16:02 +1000
commitd536fb33de7a401f35fe4962c857fe7d27992232 (patch)
tree319bced010e483a2a474a4446a422b1dcc2cab11
parentfa717b2741bf1df0a26487e5b5a9412bcb27dbbd (diff)
parent0a7b6145af005b4c074d07817e81be19825efcde (diff)
downloadIronOS-1.11.tar.gz
IronOS-1.11.zip
V1.11 - Adding a Boost modev1.11
Allows users to enable a boost mode. This allows you to hold down the button near the tip while soldering to temporarily boost the soldering temperature. Closes #10
-rw-r--r--workspace/ts100/inc/Interrupt.h8
-rw-r--r--workspace/ts100/inc/Modes.h3
-rw-r--r--workspace/ts100/inc/Settings.h25
-rw-r--r--workspace/ts100/src/Interrupt.c22
-rw-r--r--workspace/ts100/src/Main.c2
-rw-r--r--workspace/ts100/src/Modes.c236
-rw-r--r--workspace/ts100/src/Settings.c3
7 files changed, 186 insertions, 113 deletions
diff --git a/workspace/ts100/inc/Interrupt.h b/workspace/ts100/inc/Interrupt.h
index 90551684..ef0ed2fa 100644
--- a/workspace/ts100/inc/Interrupt.h
+++ b/workspace/ts100/inc/Interrupt.h
@@ -11,7 +11,9 @@ void delayMs(uint32_t ticks);
volatile extern uint32_t lastKeyPress;
volatile extern uint32_t lastMovement;
-volatile extern uint16_t keyState;
+volatile extern uint8_t keyState;
+volatile extern uint8_t rawKeys;
+
inline uint32_t millis() {
return system_Ticks;
}
@@ -34,6 +36,10 @@ inline uint32_t getLastMovement() {
inline uint16_t getButtons() {
return keyState;
}
+inline uint16_t getRawButtons() {
+ return rawKeys;
+}
+
/*IRQ prototypes*/
void NMI_Handler(void);
diff --git a/workspace/ts100/inc/Modes.h b/workspace/ts100/inc/Modes.h
index b4678bf6..7721dd8a 100644
--- a/workspace/ts100/inc/Modes.h
+++ b/workspace/ts100/inc/Modes.h
@@ -29,7 +29,7 @@ enum {
TEMPCAL, //Cal tip temp offset
} operatingMode;
-#define SETTINGSOPTIONSCOUNT 10 /*Number of settings in the settings menu*/
+#define SETTINGSOPTIONSCOUNT 11 /*Number of settings in the settings menu*/
enum {
UVCO = 0,
@@ -43,6 +43,7 @@ enum {
DISPUPDATERATE,
LEFTY,
BOOSTMODE,
+ BOOSTTEMP,
} settingsPage;
void ProcessUI();
diff --git a/workspace/ts100/inc/Settings.h b/workspace/ts100/inc/Settings.h
index 6ea439b9..d8739687 100644
--- a/workspace/ts100/inc/Settings.h
+++ b/workspace/ts100/inc/Settings.h
@@ -11,7 +11,7 @@
#define SETTINGS_H_
#include <stdint.h>
#include "stm32f10x_flash.h"
-#define SETTINGSVERSION 0x09 /*Change this if you change the struct below to prevent people getting out of sync*/
+#define SETTINGSVERSION 10 /*Change this if you change the struct below to prevent people getting out of sync*/
//Motion Sensitivity
#define MOTION_HIGH (0x00)
#define MOTION_MED (0x01)
@@ -29,21 +29,22 @@
* This struct must be a multiple of 2 bytes as it is saved / restored from flash in uint16_t chunks
*/
struct {
- uint32_t SolderingTemp; //current set point for the iron
+ uint16_t SolderingTemp; //current set point for the iron
uint32_t SleepTemp; //temp to drop to in sleep
- uint8_t version; //Used to track if a reset is needed on firmware upgrade
+ uint8_t version; //Used to track if a reset is needed on firmware upgrade
uint8_t SleepTime; //minutes timeout to sleep
- uint8_t cutoutVoltage :5; //The voltage we cut out at for under voltage
- uint8_t movementEnabled :1; //If movement is enabled
- uint8_t displayTempInF :1; //If we need to convert the C reading to F
- uint8_t flipDisplay :1; //If true we want to invert the display for lefties
- uint8_t sensitivity :5; //Sensitivity of accelerometer
- uint8_t ShutdownTime :6; //Time until unit shuts down if left alone
- uint8_t displayUpdateSpeed :2;//How fast the display updates / temp showing mode
- uint8_t temperatureRounding :2; //Rounding mode for the temperature
- uint8_t boostModeEnabled :1;//Boost mode swaps BUT_A in soldering mode to temporary soldering temp over-ride
+ uint8_t cutoutVoltage:5; //The voltage we cut out at for under voltage
+ uint8_t movementEnabled:1; //If movement is enabled
+ uint8_t displayTempInF:1; //If we need to convert the C reading to F
+ uint8_t flipDisplay:1; //If true we want to invert the display for lefties
+ uint8_t sensitivity:5; //Sensitivity of accelerometer
+ uint8_t ShutdownTime:6; //Time until unit shuts down if left alone
+ uint8_t displayUpdateSpeed:2; //How fast the display updates / temp showing mode
+ uint8_t temperatureRounding:2; //Rounding mode for the temperature
+ uint8_t boostModeEnabled:1; //Boost mode swaps BUT_A in soldering mode to temporary soldering temp over-ride
uint16_t tempCalibration; //Temperature calibration value
uint16_t voltageDiv; //Voltage divisor factor
+ uint16_t BoostTemp; //Boost mode set point for the iron
} systemSettings;
void saveSettings();
diff --git a/workspace/ts100/src/Interrupt.c b/workspace/ts100/src/Interrupt.c
index 0b58800a..0786aefa 100644
--- a/workspace/ts100/src/Interrupt.c
+++ b/workspace/ts100/src/Interrupt.c
@@ -4,7 +4,8 @@
volatile uint32_t system_Ticks;
volatile uint32_t lastKeyPress; //millis() at the last button event
-volatile uint16_t keyState; //tracks the button status
+volatile uint8_t keyState; //tracks the button status
+volatile uint8_t rawKeys;
volatile uint32_t lastMovement; //millis() at last movement event
//Delay in milliseconds using systemTick
@@ -55,18 +56,24 @@ void EXTI9_5_IRQHandler(void) {
//we are interested in line 9 and line 6 for buttons
//Line 5 == movement
if (EXTI_GetITStatus(EXTI_Line9) != RESET) {
- if (GPIO_ReadInputDataBit(GPIOA, KEY_A) == SET)
+ if (GPIO_ReadInputDataBit(GPIOA, KEY_A) == SET) {
keyState &= ~(BUT_A);
- else
+ rawKeys &= ~BUT_A;
+ } else {
keyState |= BUT_A;
- lastKeyPress = millis();
+ rawKeys |= BUT_A;
+ lastKeyPress = millis();
+ }
EXTI_ClearITPendingBit(EXTI_Line9);
} else if (EXTI_GetITStatus(EXTI_Line6) != RESET) {
- if (GPIO_ReadInputDataBit(GPIOA, KEY_B) == SET)
+ if (GPIO_ReadInputDataBit(GPIOA, KEY_B) == SET) {
keyState &= ~(BUT_B);
- else
+ rawKeys &= ~BUT_B;
+ } else {
keyState |= BUT_B;
- lastKeyPress = millis();
+ rawKeys |= BUT_B;
+ lastKeyPress = millis();
+ }
EXTI_ClearITPendingBit(EXTI_Line6);
} else if (EXTI_GetITStatus(EXTI_Line5) != RESET) { //Movement Event
lastMovement = millis();
@@ -205,4 +212,3 @@ void USB_LP_CAN1_RX0_IRQHandler(void) {
}
-
diff --git a/workspace/ts100/src/Main.c b/workspace/ts100/src/Main.c
index 9ac59b9a..cec1b157 100644
--- a/workspace/ts100/src/Main.c
+++ b/workspace/ts100/src/Main.c
@@ -37,7 +37,7 @@ void setup() {
readIronTemp(systemSettings.tempCalibration, 0,0); //load the default calibration value
Init_Oled(systemSettings.flipDisplay); //Init the OLED display
- OLED_DrawString("VER 1.10", 8); //Version Number
+ OLED_DrawString("VER 1.11", 8); //Version Number
delayMs(500); //Pause to show version number
Start_Watchdog(1000); //start the system watch dog as 1 second timeout
}
diff --git a/workspace/ts100/src/Modes.c b/workspace/ts100/src/Modes.c
index 650d8fb3..75ae15f1 100644
--- a/workspace/ts100/src/Modes.c
+++ b/workspace/ts100/src/Modes.c
@@ -5,16 +5,19 @@
* Author: Ralim <[email protected]>
*/
#include "Modes.h"
-const char *SettingsLongNames[] = { " Undervoltage Cutout (V)",
- " Sleep Temperature (C)", " Sleep Timeout (Minutes)",
- " Shutdown Timeout (Minutes)", " Motion Detection",
+const char *SettingsLongNames[] = { " Undervoltage Cutout <V>",
+ " Sleep Temperature <C>", " Sleep Timeout <Minutes>",
+ " Shutdown Timeout <Minutes>", " Motion Detection",
" Motion Sensitivity", " Temperature Unit",
" Temperature Rounding Amount",
" Temperature Display Update Rate",
- " Flip Display for Left Hand" };
+ " Flip Display for Left Hand",
+ " Enable front key boost 450C mode when soldering",
+ " Temperature when in boost mode" };
const uint8_t SettingsLongNamesLengths[] = { 29, 27, 29, 32, 22, 24, 22, 33, 37,
- 25 };
-uint8_t CalStatus = 0;
+ 32, 53, 36 };
+uint8_t StatusFlags = 0;
+uint32_t temporaryTempStorage = 0;
//This does the required processing and state changes
void ProcessUI() {
uint8_t Buttons = getButtons(); //read the buttons status
@@ -41,20 +44,43 @@ void ProcessUI() {
break;
case SOLDERING:
//We need to check the buttons if we need to jump out
- if ((Buttons == BUT_A && !systemSettings.boostModeEnabled)|| Buttons == BUT_B) {
+ if ((Buttons == BUT_A && !systemSettings.boostModeEnabled)
+ || Buttons == BUT_B) {
//A or B key pressed so we are moving to temp set
operatingMode = TEMP_ADJ;
+ if (StatusFlags == 8) {
+ //Boost mode was enabled before
+ //We need to cancel the temp
+ systemSettings.SolderingTemp = temporaryTempStorage;
+ StatusFlags = 0;
+ }
} else if (Buttons == (BUT_A | BUT_B)) {
//Both buttons were pressed, exit back to the cooling screen
operatingMode = COOLING;
+ if (StatusFlags == 8) {
+ //Boost mode was enabled before
+ //We need to cancel the temp
+ systemSettings.SolderingTemp = temporaryTempStorage;
+ StatusFlags = 0;
+ }
- }
- else if (Buttons == BUT_A && systemSettings.boostModeEnabled)
- {
-
- }
- else {
+ } else if ((getRawButtons() == BUT_A && systemSettings.boostModeEnabled)) {
+ if (StatusFlags != 8) {
+ StatusFlags = 8;
+ temporaryTempStorage = systemSettings.SolderingTemp;
+ systemSettings.SolderingTemp = systemSettings.BoostTemp;
+ }
+ //Update the PID Loop
+ int32_t newOutput = computePID(systemSettings.SolderingTemp);
+ setIronTimer(newOutput);
+ } else {
+ if (StatusFlags == 8) {
+ //Boost mode was enabled before
+ //We need to cancel the temp
+ systemSettings.SolderingTemp = temporaryTempStorage;
+ StatusFlags = 0;
+ }
//We need to check the timer for movement in case we need to goto idle
if (systemSettings.movementEnabled)
if (millis() - getLastMovement()
@@ -99,70 +125,83 @@ void ProcessUI() {
case SETTINGS:
//Settings is the mode with the most logic
//Here we are in the menu so we need to increment through the sub menus / increase the value
+ if (StatusFlags == 4 && Buttons != 0) {
+ //The user pressed the button to breakout of the settings help prompt
+ StatusFlags = 0;
+ } else {
+ if (Buttons & BUT_A) {
+ //A key iterates through the menu
+ if (settingsPage == SETTINGSOPTIONSCOUNT) {
+ //Roll off the end
+ settingsPage = 0; //reset
+ operatingMode = STARTUP; //reset back to the startup
+ saveSettings(); //Save the settings
+ } else {
+ ++settingsPage; //move to the next option
+ }
+ } else if (Buttons & BUT_B) {
+ //B changes the value selected
+ switch (settingsPage) {
+ case UVCO:
+ //we are incrementing the cutout voltage
+ systemSettings.cutoutVoltage += 1; //Go up 1V at a jump
+ if (systemSettings.cutoutVoltage > 24)
+ systemSettings.cutoutVoltage = 10;
+ break;
+ case SLEEP_TEMP:
+ systemSettings.SleepTemp += 100; //Go up 10C at a time
+ if (systemSettings.SleepTemp > 3000)
+ systemSettings.SleepTemp = 1000;//cant sleep higher than 300
+ break;
+ case SLEEP_TIME:
+ ++systemSettings.SleepTime; //Go up 1 minute at a time
+ if (systemSettings.SleepTime > 30)
+ systemSettings.SleepTime = 1;//cant set time over 30 mins
+ //Remember that ^ is the time of no movement
+ break;
+ case SHUTDOWN_TIME:
+ ++systemSettings.ShutdownTime;
+ if (systemSettings.ShutdownTime > 60)
+ systemSettings.ShutdownTime = 0; //wrap to off
+ break;
+ case MOTIONDETECT:
+ systemSettings.movementEnabled =
+ !systemSettings.movementEnabled;
+ break;
+ case TEMPDISPLAY:
+ systemSettings.displayTempInF =
+ !systemSettings.displayTempInF;
+ break;
+ case LEFTY:
+ systemSettings.flipDisplay = !systemSettings.flipDisplay;
+ break;
+ case MOTIONSENSITIVITY:
+ systemSettings.sensitivity++;
+ systemSettings.sensitivity = systemSettings.sensitivity % 3;
- if (Buttons & BUT_A) {
- //A key iterates through the menu
- if (settingsPage == SETTINGSOPTIONSCOUNT) {
- //Roll off the end
- settingsPage = 0; //reset
- operatingMode = STARTUP; //reset back to the startup
- saveSettings(); //Save the settings
- } else {
- ++settingsPage; //move to the next option
- }
- } else if (Buttons & BUT_B) {
- //B changes the value selected
- switch (settingsPage) {
- case UVCO:
- //we are incrementing the cutout voltage
- systemSettings.cutoutVoltage += 1; //Go up 1V at a jump
- if (systemSettings.cutoutVoltage > 24)
- systemSettings.cutoutVoltage = 10;
- break;
- case SLEEP_TEMP:
- systemSettings.SleepTemp += 100; //Go up 10C at a time
- if (systemSettings.SleepTemp > 3000)
- systemSettings.SleepTemp = 1000;//cant sleep higher than 300
- break;
- case SLEEP_TIME:
- ++systemSettings.SleepTime; //Go up 1 minute at a time
- if (systemSettings.SleepTime > 30)
- systemSettings.SleepTime = 1; //cant set time over 30 mins
- //Remember that ^ is the time of no movement
- break;
- case SHUTDOWN_TIME:
- ++systemSettings.ShutdownTime;
- if (systemSettings.ShutdownTime > 60)
- systemSettings.ShutdownTime = 0; //wrap to off
- break;
- case MOTIONDETECT:
- systemSettings.movementEnabled =
- !systemSettings.movementEnabled;
- break;
- case TEMPDISPLAY:
- systemSettings.displayTempInF = !systemSettings.displayTempInF;
- break;
- case LEFTY:
- systemSettings.flipDisplay = !systemSettings.flipDisplay;
- break;
- case MOTIONSENSITIVITY:
- systemSettings.sensitivity++;
- systemSettings.sensitivity = systemSettings.sensitivity % 3;
-
- break;
- case TEMPROUNDING:
- systemSettings.temperatureRounding++;
- systemSettings.temperatureRounding =
- systemSettings.temperatureRounding % 3;
- break;
- case DISPUPDATERATE:
- systemSettings.displayUpdateSpeed++;
- systemSettings.displayUpdateSpeed =
- systemSettings.displayUpdateSpeed % 3;
- break;
-
- default:
- break;
+ break;
+ case TEMPROUNDING:
+ systemSettings.temperatureRounding++;
+ systemSettings.temperatureRounding =
+ systemSettings.temperatureRounding % 3;
+ break;
+ case DISPUPDATERATE:
+ systemSettings.displayUpdateSpeed++;
+ systemSettings.displayUpdateSpeed =
+ systemSettings.displayUpdateSpeed % 3;
+ break;
+ case BOOSTMODE:
+ systemSettings.boostModeEnabled =
+ !systemSettings.boostModeEnabled;
+ break;
+ case BOOSTTEMP:
+ systemSettings.BoostTemp += 100; //Go up 10C at a time
+ if (systemSettings.BoostTemp > 4500)
+ systemSettings.BoostTemp = 2500; //loop back at 250
+ break;
+ default:
+ break;
+ }
}
}
break;
@@ -222,10 +261,10 @@ void ProcessUI() {
if (Buttons == BUT_A) {
//Single button press, cycle over to the DC display
- CalStatus = 0;
+ StatusFlags = 0;
operatingMode = DCINDISP;
} else if (Buttons == BUT_B) {
- CalStatus = 0;
+ StatusFlags = 0;
operatingMode = TEMPCAL;
} else if (Buttons == (BUT_A | BUT_B)) {
//If the user is holding both button, exit the screen
@@ -236,13 +275,13 @@ void ProcessUI() {
break;
case DCINDISP: {
//This lets the user check the input voltage
- if (CalStatus == 0) {
+ if (StatusFlags == 0) {
if (Buttons == BUT_A) {
//Single button press, cycle over to the temp display
operatingMode = THERMOMETER;
} else if (Buttons == BUT_B) {
//dc cal mode
- CalStatus = 1;
+ StatusFlags = 1;
} else if (Buttons == (BUT_A | BUT_B)) {
//If the user is holding both button, exit the screen
operatingMode = STARTUP;
@@ -260,7 +299,7 @@ void ProcessUI() {
else
systemSettings.voltageDiv++;
} else if (Buttons == (BUT_A | BUT_B)) {
- CalStatus = 0;
+ StatusFlags = 0;
saveSettings();
}
if (systemSettings.voltageDiv < 120)
@@ -277,13 +316,13 @@ void ProcessUI() {
operatingMode = THERMOMETER;
} else if (Buttons == BUT_A) {
//Try and calibrate
- if (CalStatus == 0) {
+ if (StatusFlags == 0) {
if ((readTipTemp() < 300) && (readSensorTemp() < 300)) {
- CalStatus = 1;
+ StatusFlags = 1;
systemSettings.tempCalibration = readTipTemp();
saveSettings();
} else {
- CalStatus = 2;
+ StatusFlags = 2;
}
}
} else if (Buttons == (BUT_A | BUT_B)) {
@@ -363,7 +402,11 @@ void DrawUI() {
lastSolderingDrawnTemp2 = lastSolderingDrawnTemp1;
lastOLEDDrawTime = millis();
//Now draw symbols
- OLED_DrawChar(' ', 3);
+ if (StatusFlags == 8)
+ OLED_DrawChar('B', 3);
+ else
+ OLED_DrawChar(' ', 3);
+
OLED_BlankSlot(6 * 12 + 16, 24 - 16);//blank out the tail after the arrows
OLED_BlankSlot(4 * 12 + 16, 24 - 16);//blank out the tail after the temp
if (getIronTimer() == 0
@@ -399,6 +442,7 @@ void DrawUI() {
case SETTINGS:
//We are prompting the user the setting name
if (millis() - getLastButtonPress() > 3000) {
+ StatusFlags = 4;
//If the user has idled for > 3 seconds, show the long name for the selected setting instead
//draw from settingsLongTestScrollPos through to end of screen
uint8_t lengthLeft = SettingsLongNamesLengths[settingsPage]
@@ -511,6 +555,20 @@ void DrawUI() {
}
}
break;
+ case BOOSTMODE:
+ switch (systemSettings.boostModeEnabled) {
+ case 1:
+ OLED_DrawString("BOOST T", 8);
+ break;
+ case 0:
+ OLED_DrawString("BOOST F", 8);
+ break;
+ }
+ break;
+ case BOOSTTEMP:
+ OLED_DrawString("BTMP ", 5);
+ OLED_DrawThreeNumber(systemSettings.BoostTemp / 10, 5);
+ break;
default:
break;
}
@@ -548,7 +606,7 @@ void DrawUI() {
case DCINDISP: {
uint16_t voltage = readDCVoltage(systemSettings.voltageDiv); //get X10 voltage
- if (CalStatus == 0 || ((millis() % 1000) > 500)) {
+ if (StatusFlags == 0 || ((millis() % 1000) > 500)) {
OLED_DrawString("IN", 2);
OLED_DrawChar((voltage / 100) % 10, 2);
voltage -= (voltage / 100) * 100;
@@ -565,11 +623,11 @@ void DrawUI() {
break;
case TEMPCAL: {
- if (CalStatus == 0) {
+ if (StatusFlags == 0) {
OLED_DrawString("CAL TEMP", 8);
- } else if (CalStatus == 1) {
+ } else if (StatusFlags == 1) {
OLED_DrawString("CAL OK ", 8);
- } else if (CalStatus == 2) {
+ } else if (StatusFlags == 2) {
OLED_DrawString("CAL FAIL", 8);
}
}
diff --git a/workspace/ts100/src/Settings.c b/workspace/ts100/src/Settings.c
index dd19b251..0526123d 100644
--- a/workspace/ts100/src/Settings.c
+++ b/workspace/ts100/src/Settings.c
@@ -55,6 +55,7 @@ void resetSettings() {
systemSettings.ShutdownTime=30; //How many minutes until the unit turns itself off
systemSettings.displayUpdateSpeed=1; //How fast the LCD updates
systemSettings.temperatureRounding=0; //How the temperature is rounded off
- systemSettings.boostModeEnabled=0;
+ systemSettings.boostModeEnabled=0; //Default to safe, with no boost mode
+ systemSettings.BoostTemp=4000; //default to 400C
}