aboutsummaryrefslogtreecommitdiffhomepage
path: root/workspace/ts100/src/Modes.c
diff options
context:
space:
mode:
Diffstat (limited to 'workspace/ts100/src/Modes.c')
-rw-r--r--workspace/ts100/src/Modes.c282
1 files changed, 282 insertions, 0 deletions
diff --git a/workspace/ts100/src/Modes.c b/workspace/ts100/src/Modes.c
new file mode 100644
index 00000000..9936fb56
--- /dev/null
+++ b/workspace/ts100/src/Modes.c
@@ -0,0 +1,282 @@
+/*
+ * Modes.c
+ *
+ * Created on: 17 Sep 2016
+ * Author: Ralim <[email protected]>
+ */
+#include "Modes.h"
+//This does the required processing and state changes
+void ProcessUI() {
+ uint8_t Buttons = getButtons(); //read the buttons status
+ static uint32_t lastModeChange = 0;
+ if (millis() - getLastButtonPress() < 200)
+ Buttons = 0;
+ //rough prevention for de-bouncing and allocates settling time
+
+ switch (operatingMode) {
+ case STARTUP:
+ if ((millis() - getLastButtonPress() > 1000)) {
+ if (Buttons & BUT_A) {
+ //A key pressed so we are moving to soldering mode
+ operatingMode = SOLDERING;
+ resetLastButtonPress();
+ resetButtons();
+ } else if (Buttons & BUT_B) {
+ //B Button was pressed so we are moving to the Settings menu
+ operatingMode = SETTINGS;
+ resetLastButtonPress();
+ resetButtons();
+ }
+ }
+ //Nothing else to check here
+ break;
+ case SOLDERING:
+ //We need to check the buttons if we need to jump out
+ if (Buttons & BUT_A) {
+ //A key pressed so we are moving to temp set
+ operatingMode = TEMP_ADJ;
+ resetLastButtonPress();
+ resetButtons();
+ } else if (Buttons & BUT_B) {
+ //B Button was pressed so we are moving back to idle
+ operatingMode = COOLING;
+ resetLastButtonPress();
+ resetButtons();
+ } else {
+ //We need to check the timer for movement in case we need to goto idle
+ if (systemSettings.movementEnabled)
+ if (millis() - getLastMovement()
+ > (systemSettings.SleepTime * 60000)) {
+ if (millis() - getLastButtonPress()
+ > (systemSettings.SleepTime * 60000)) {
+ operatingMode = SLEEP;
+ return;
+ }
+ }
+ uint16_t voltage = readDCVoltage(); //get X10 voltage
+ if ((voltage / 10) < systemSettings.cutoutVoltage) {
+ operatingMode = UVLOWARN;
+ resetLastButtonPress();
+ resetButtons();
+ lastModeChange = millis();
+ }
+ //If no buttons pushed we need to perform the PID loop for the iron temp
+ int32_t newOutput = computePID(systemSettings.SolderingTemp);
+
+ setIronTimer(newOutput);
+
+ }
+ break;
+ case TEMP_ADJ:
+ if (Buttons & BUT_A) {
+ //A key pressed so we are moving down in temp
+ resetLastButtonPress();
+ if (systemSettings.SolderingTemp > 1000)
+ systemSettings.SolderingTemp -= 100;
+ } else if (Buttons & BUT_B) {
+ //B key pressed so we are moving up in temp
+ resetLastButtonPress();
+ if (systemSettings.SolderingTemp < 4500)
+ systemSettings.SolderingTemp += 100;
+ } else {
+ //we check the timeout for how long the buttons have not been pushed
+ //if idle for > 3 seconds then we return to soldering
+ if (millis() - getLastButtonPress() > 3000)
+ operatingMode = SOLDERING;
+ }
+ break;
+ 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 (millis() - getLastButtonPress() < 400)
+ return;
+
+ if (Buttons & BUT_A) {
+ resetLastButtonPress();
+ //A key iterates through the menu
+ if (settingsPage == 3) {
+ //Roll off the end
+ settingsPage = 0; //reset
+ operatingMode = STARTUP;
+ saveSettings(); //Save the settings
+ } else
+ ++settingsPage; //move to the next option
+ } else if (Buttons & BUT_B) {
+ resetLastButtonPress();
+ //B changes the value selected
+ switch (settingsPage) {
+ case UVLO:
+ //we are incrementing the cutout voltage
+ systemSettings.cutoutVoltage += 1; //Go up 1V at a jump
+ if (systemSettings.cutoutVoltage > 24)
+ systemSettings.cutoutVoltage = 9;
+ else if (systemSettings.cutoutVoltage < 9)
+ systemSettings.cutoutVoltage = 9; //cant set UVLO below 9V
+ 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 > 60)
+ systemSettings.SleepTime = 2; //cant set time over an hour
+ //Remember that ^ is the time of no movement
+ break;
+ case MOTIONDETECT:
+ systemSettings.movementEnabled =
+ !systemSettings.movementEnabled;
+ break;
+ default:
+ break;
+ }
+ }
+ break;
+ case SLEEP:
+ //The iron is sleeping at a lower temperature due to lack of movement
+ if (Buttons & BUT_A) {
+ //A Button was pressed so we are moving back to soldering
+ operatingMode = SOLDERING;
+ resetLastButtonPress();
+ resetButtons();
+ return;
+ } else if (Buttons & BUT_B) {
+ //B Button was pressed so we are moving back to soldering
+ operatingMode = SOLDERING;
+ resetLastButtonPress();
+ resetButtons();
+ return;
+ } else if (systemSettings.movementEnabled)
+ if (millis() - getLastMovement() < 1000) {//moved in the last second
+ operatingMode = SOLDERING; //Goto active mode again
+ return;
+ }
+ //else if nothing has been pushed we need to compute the PID to keep the iron at the sleep temp
+ int32_t newOutput = computePID(systemSettings.SleepTemp);
+
+ setIronTimer(newOutput);
+
+ break;
+ case COOLING: {
+ setIronTimer(0); //turn off heating
+ //This mode warns the user the iron is still cooling down
+ uint16_t temp = readIronTemp(0, 1); //take a new reading as the heater code is not taking new readings
+ if (temp < 500) { //if the temp is < 50C then we can go back to IDLE
+ operatingMode = STARTUP;
+ resetLastButtonPress();
+ resetButtons();
+ } else { //we check if the user has pushed a button to ack
+ if ((millis() - getLastButtonPress() > 200)
+ && (millis() - getLastButtonPress() < 2000)) {
+ if (getButtons() && (BUT_A | BUT_B)) {
+ //A button was pushed
+ operatingMode = STARTUP;
+ resetLastButtonPress();
+ resetButtons();
+ }
+ }
+ }
+ }
+ break;
+ case UVLOWARN:
+ //We are here if the DC voltage went too low
+ //We want to jump back to IDLE after a bit
+ if (millis() - lastModeChange > 3000) { //its been 3 seconds
+ operatingMode = STARTUP; //jump back to idle mode
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+void DrawUI() {
+ uint16_t temp = readIronTemp(0, 0) / 10;
+ switch (operatingMode) {
+ case STARTUP:
+ //We are chilling in the idle mode
+ //Check if movement in the last 5 minutes , if not sleep OLED
+ if (millis() - getLastMovement() > (5 * 60 * 1000)
+ && (millis() - getLastButtonPress() > (5 * 60 * 1000))) {
+ //OLED off
+ Oled_DisplayOff();
+ } else {
+ Oled_DisplayOn();
+ OLED_DrawString("IDLE ", 7); //write the word IDLE
+ }
+ break;
+ case SOLDERING:
+ //The user is soldering
+ {
+ if (getIronTimer() == 0) {
+ OLED_DrawChar('C', 14 * 4);
+ } else {
+ if (getIronTimer() < 500) {
+ OLED_DrawChar(' ', 14 * 4);
+ } else { //we are heating
+ OLED_DrawChar('H', 14 * 4);
+ }
+ }
+ OLED_DrawThreeNumber(temp, 0);
+ OLED_DrawChar(' ', 14 * 3);
+ OLED_DrawChar(' ', 14 * 5);
+ OLED_DrawChar(' ', 14 * 6);
+ }
+ break;
+ case TEMP_ADJ:
+ //We are prompting the user to change the temp so we draw the current setpoint temp
+ //With the nifty arrows
+ OLED_DrawChar('<', 0);
+ OLED_DrawThreeNumber(systemSettings.SolderingTemp / 10, 14 * 1);
+ OLED_DrawChar(' ', 14 * 4);
+ OLED_DrawChar('>', 14 * 5);
+ break;
+ case SETTINGS:
+ //We are prompting the user the setting name
+
+ switch (settingsPage) {
+ case UVLO:
+ OLED_DrawString("UVLO", 4);
+ OLED_DrawTwoNumber(systemSettings.cutoutVoltage, 14 * 4);
+ //OLED_DrawChar('V', 14 * 5);
+
+ break;
+ case SLEEP_TEMP:
+ OLED_DrawString("STMP", 4);
+ OLED_DrawThreeNumber(systemSettings.SleepTemp / 10, 14 * 4);
+ //OLED_DrawChar('V', 14 * 5);
+
+ break;
+ case SLEEP_TIME:
+ OLED_DrawString("STME ", 5);
+ OLED_DrawTwoNumber(systemSettings.SleepTime, 14 * 5);
+ break;
+ case MOTIONDETECT:/*Toggle the mode*/
+ if (systemSettings.movementEnabled)
+ OLED_DrawString("MOTN T", 7);
+ else
+ OLED_DrawString("MOTN F", 7);
+ break;
+ default:
+ break;
+ }
+ break;
+ case SLEEP:
+ //The iron is in sleep temp mode
+ //Draw in temp and sleep
+ OLED_DrawString("SLP", 3);
+ OLED_DrawThreeNumber(temp, 14 * 3);
+ break;
+ case COOLING:
+ //We are warning the user the tip is cooling
+ OLED_DrawString("COL", 3);
+ OLED_DrawThreeNumber(temp, 14 * 3);
+ break;
+ case UVLOWARN:
+ OLED_DrawString("UND VL", 6);
+ break;
+ default:
+ break;
+ }
+}