aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSelene ToyKeeper2018-04-24 01:05:53 -0600
committerSelene ToyKeeper2018-04-24 01:05:53 -0600
commite0f9fe6a2eae4a8ee803f4913ce6a5e595129235 (patch)
tree379edf1ba12e40aa81249c2306cbe5b0e5b459b2
parentConverted muggle mode to a smooth ramp style. Made it remember this in eepro... (diff)
downloadanduril-e0f9fe6a2eae4a8ee803f4913ce6a5e595129235.tar.gz
anduril-e0f9fe6a2eae4a8ee803f4913ce6a5e595129235.tar.bz2
anduril-e0f9fe6a2eae4a8ee803f4913ce6a5e595129235.zip
First pass at refactoring config modes to save space. Also, moved all config menus to 4 clicks.
-rw-r--r--spaghetti-monster/anduril/anduril.c177
-rw-r--r--spaghetti-monster/anduril/anduril.txt5
2 files changed, 95 insertions, 87 deletions
diff --git a/spaghetti-monster/anduril/anduril.c b/spaghetti-monster/anduril/anduril.c
index 2a4a2f5..aea2a50 100644
--- a/spaghetti-monster/anduril/anduril.c
+++ b/spaghetti-monster/anduril/anduril.c
@@ -114,6 +114,11 @@
// FSM states
uint8_t off_state(EventPtr event, uint16_t arg);
+// simple numeric entry config menu
+uint8_t config_state_base(EventPtr event, uint16_t arg);
+#define MAX_CONFIG_VALUES 3
+uint8_t config_state_values[MAX_CONFIG_VALUES];
+volatile uint8_t config_state_done = 0;
// ramping mode and its related config mode
uint8_t steady_state(EventPtr event, uint16_t arg);
uint8_t ramp_config_state(EventPtr event, uint16_t arg);
@@ -760,8 +765,8 @@ uint8_t tempcheck_state(EventPtr event, uint16_t arg) {
set_state(battcheck_state, 0);
return MISCHIEF_MANAGED;
}
- // 3 clicks: thermal config mode
- else if (event == EV_3clicks) {
+ // 4 clicks: thermal config mode
+ else if (event == EV_4clicks) {
set_state(thermal_config_state, 0);
return MISCHIEF_MANAGED;
}
@@ -785,8 +790,8 @@ uint8_t beacon_state(EventPtr event, uint16_t arg) {
#endif
return MISCHIEF_MANAGED;
}
- // 3 clicks: beacon config mode
- else if (event == EV_3clicks) {
+ // 4 clicks: beacon config mode
+ else if (event == EV_4clicks) {
set_state(beacon_config_state, 0);
return MISCHIEF_MANAGED;
}
@@ -1068,17 +1073,13 @@ uint8_t muggle_state(EventPtr event, uint16_t arg) {
#endif
-uint8_t ramp_config_state(EventPtr event, uint16_t arg) {
+uint8_t config_state_base(EventPtr event, uint16_t arg) {
static uint8_t config_step;
static uint8_t num_config_steps;
if (event == EV_enter_state) {
+ config_state_done = 0;
config_step = 0;
- if (ramp_style) {
- num_config_steps = 3;
- }
- else {
- num_config_steps = 2;
- }
+ num_config_steps = arg;
set_level(0);
return MISCHIEF_MANAGED;
}
@@ -1088,87 +1089,95 @@ uint8_t ramp_config_state(EventPtr event, uint16_t arg) {
push_state(number_entry_state, config_step + 1);
}
else {
- save_config();
+ config_state_done = 1;
// TODO: blink out some sort of success pattern
- // return to steady mode
- set_state(steady_state, memorized_level);
}
return MISCHIEF_MANAGED;
}
// an option was set (return from number_entry_state)
else if (event == EV_reenter_state) {
- #if 0
- // FIXME? this is a kludge which relies on the vars being consecutive
- // in RAM and in the same order as declared
- // ... and it doesn't work; it seems they're not consecutive :(
- volatile uint8_t *dest;
- if (ramp_style) dest = (&ramp_discrete_floor) + config_step;
- else dest = (&ramp_smooth_floor) + config_step;
- if (number_entry_value)
- *dest = number_entry_value;
- #else
- switch (config_step) {
- case 0:
- if (number_entry_value) {
- if (ramp_style) ramp_discrete_floor = number_entry_value;
- else ramp_smooth_floor = number_entry_value;
- }
- break;
- case 1:
- if (number_entry_value) {
- if (ramp_style) ramp_discrete_ceil = MAX_LEVEL + 1 - number_entry_value;
- else ramp_smooth_ceil = MAX_LEVEL + 1 - number_entry_value;
- }
- break;
- case 2:
- if (number_entry_value)
- ramp_discrete_steps = number_entry_value;
- break;
- }
- #endif
+ config_state_values[config_step] = number_entry_value;
config_step ++;
return MISCHIEF_MANAGED;
}
+ //return EVENT_NOT_HANDLED;
+ // eat all other events; don't pass any through to parent
+ return EVENT_HANDLED;
+}
+
+uint8_t ramp_config_state(EventPtr event, uint16_t arg) {
+ if (event == EV_enter_state) {
+ uint8_t num_config_steps;
+ num_config_steps = 2 + ramp_style;
+ return config_state_base(event, num_config_steps);
+ }
+ // let generic function handle everything except completion
+ else if (!config_state_done) {
+ return config_state_base(event, arg);
+ }
+ else if (event == EV_tick) {
+ // parse values
+ uint8_t val;
+ if (ramp_style) { // discrete / stepped ramp
+
+ val = config_state_values[0];
+ if (val) { ramp_discrete_floor = val; }
+
+ val = config_state_values[1];
+ if (val) { ramp_discrete_ceil = MAX_LEVEL + 1 - val; }
+
+ val = config_state_values[2];
+ if (val) ramp_discrete_steps = val;
+
+ } else { // smooth ramp
+
+ val = config_state_values[0];
+ if (val) { ramp_smooth_floor = val; }
+
+ val = config_state_values[1];
+ if (val) { ramp_smooth_ceil = MAX_LEVEL + 1 - val; }
+
+ }
+
+ // save values and return
+ save_config();
+ set_state(steady_state, memorized_level);
+ return MISCHIEF_MANAGED;
+ }
return EVENT_NOT_HANDLED;
}
#ifdef USE_THERMAL_REGULATION
uint8_t thermal_config_state(EventPtr event, uint16_t arg) {
- static uint8_t config_step;
if (event == EV_enter_state) {
- set_level(0);
- config_step = 0;
- return MISCHIEF_MANAGED;
+ return config_state_base(event, 2);
+ }
+ // let generic function handle everything except completion
+ else if (!config_state_done) {
+ return config_state_base(event, arg);
}
- // advance forward through config steps
else if (event == EV_tick) {
- // ask the user for a number
- if (config_step < 2) {
- push_state(number_entry_state, config_step + 1);
+ // parse values
+ uint8_t val;
+
+ // calibrate room temperature
+ val = config_state_values[0];
+ if (val) {
+ int8_t rawtemp = (temperature >> 1) - therm_cal_offset;
+ therm_cal_offset = val - rawtemp;
}
- // return to original mode
- else {
- save_config();
- set_state(tempcheck_state, 0);
- }
- return MISCHIEF_MANAGED;
- }
- // an option was set (return from number_entry_state)
- else if (event == EV_reenter_state) {
- if (number_entry_value) {
- // calibrate room temperature
- if (config_step == 0) {
- int8_t rawtemp = (temperature >> 1) - therm_cal_offset;
- therm_cal_offset = number_entry_value - rawtemp;
- }
+
+ val = config_state_values[1];
+ if (val) {
// set maximum heat limit
- else {
- therm_ceil = 30 + number_entry_value;
- }
+ therm_ceil = 30 + val;
}
if (therm_ceil > MAX_THERM_CEIL) therm_ceil = MAX_THERM_CEIL;
- config_step ++;
+
+ // save values and return
+ save_config();
+ set_state(tempcheck_state, 0);
return MISCHIEF_MANAGED;
}
return EVENT_NOT_HANDLED;
@@ -1177,25 +1186,23 @@ uint8_t thermal_config_state(EventPtr event, uint16_t arg) {
uint8_t beacon_config_state(EventPtr event, uint16_t arg) {
- static uint8_t done = 0;
if (event == EV_enter_state) {
- set_level(0);
- done = 0;
- return MISCHIEF_MANAGED;
+ return config_state_base(event, 1);
}
- // advance forward through config steps
- else if (event == EV_tick) {
- // ask the user for a number
- if (! done) push_state(number_entry_state, 0);
- // return to original mode
- else set_state(beacon_state, 0);
- return MISCHIEF_MANAGED;
+ // let generic function handle everything except completion
+ else if (!config_state_done) {
+ return config_state_base(event, arg);
}
- // an option was set (return from number_entry_state)
- else if (event == EV_reenter_state) {
- if (number_entry_value) beacon_seconds = number_entry_value;
+ else if (event == EV_tick) {
+ // parse values
+ uint8_t val = config_state_values[0];
+ if (val) {
+ beacon_seconds = val;
+ }
+
+ // save values and return
save_config();
- done = 1;
+ set_state(beacon_state, 0);
return MISCHIEF_MANAGED;
}
return EVENT_NOT_HANDLED;
diff --git a/spaghetti-monster/anduril/anduril.txt b/spaghetti-monster/anduril/anduril.txt
index 7ede740..6d27151 100644
--- a/spaghetti-monster/anduril/anduril.txt
+++ b/spaghetti-monster/anduril/anduril.txt
@@ -113,9 +113,10 @@ TODO:
* a way to configure indicator LED behavior?
* add goodnight mode?
* add lightning mode?
- - muggle mode: smooth ramp
+ * muggle mode: smooth ramp
+ + refactor to make config modes smaller
- candle mode timer, with three clicks to add 30 minutes
- candle mode: smoother adjustments?
- make sunset mode timer and brightness configurable?
- - move all config menus to four clicks
+ * move all config menus to four clicks
- diagram updates for 3-click special actions