diff options
-rw-r--r-- | workspace/ts100/inc/Interrupt.h | 8 | ||||
-rw-r--r-- | workspace/ts100/inc/Modes.h | 3 | ||||
-rw-r--r-- | workspace/ts100/inc/Settings.h | 25 | ||||
-rw-r--r-- | workspace/ts100/src/Interrupt.c | 22 | ||||
-rw-r--r-- | workspace/ts100/src/Main.c | 2 | ||||
-rw-r--r-- | workspace/ts100/src/Modes.c | 236 | ||||
-rw-r--r-- | workspace/ts100/src/Settings.c | 3 |
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 } |