aboutsummaryrefslogtreecommitdiff
path: root/spaghetti-monster/ramping-ui.c
diff options
context:
space:
mode:
Diffstat (limited to 'spaghetti-monster/ramping-ui.c')
-rw-r--r--spaghetti-monster/ramping-ui.c77
1 files changed, 47 insertions, 30 deletions
diff --git a/spaghetti-monster/ramping-ui.c b/spaghetti-monster/ramping-ui.c
index 6eeb3b0..256c4cf 100644
--- a/spaghetti-monster/ramping-ui.c
+++ b/spaghetti-monster/ramping-ui.c
@@ -31,7 +31,7 @@
// FSM states
uint8_t off_state(EventPtr event, uint16_t arg);
uint8_t steady_state(EventPtr event, uint16_t arg);
-uint8_t party_strobe_state(EventPtr event, uint16_t arg);
+uint8_t strobe_state(EventPtr event, uint16_t arg);
// brightness control
uint8_t memorized_level = MAX_1x7135;
@@ -43,6 +43,11 @@ uint8_t ramp_step_size = 1;
uint8_t target_level = 0;
#endif
+// strobe timing
+volatile uint8_t strobe_delay = 67;
+volatile uint8_t strobe_type = 0; // 0 == party strobe, 1 == tactical strobe
+
+
uint8_t off_state(EventPtr event, uint16_t arg) {
// turn emitter off when entering state
if (event == EV_enter_state) {
@@ -74,7 +79,7 @@ uint8_t off_state(EventPtr event, uint16_t arg) {
}
// 3 clicks: strobe mode
else if (event == EV_3clicks) {
- set_state(party_strobe_state, 255);
+ set_state(strobe_state, 0);
return 0;
}
// hold: go to lowest level
@@ -90,7 +95,7 @@ uint8_t off_state(EventPtr event, uint16_t arg) {
set_state(steady_state, 1);
return 0;
}
- // click-release-hold: go to highest level (for ramping down)
+ // click, hold: go to highest level (for ramping down)
else if (event == EV_click2_hold) {
set_state(steady_state, MAX_LEVEL);
return 0;
@@ -98,6 +103,7 @@ uint8_t off_state(EventPtr event, uint16_t arg) {
return 1;
}
+
uint8_t steady_state(EventPtr event, uint16_t arg) {
// turn LED on when we first enter the mode
if (event == EV_enter_state) {
@@ -135,7 +141,7 @@ uint8_t steady_state(EventPtr event, uint16_t arg) {
}
// 3 clicks: go to strobe modes
else if (event == EV_3clicks) {
- set_state(party_strobe_state, 0xff);
+ set_state(strobe_state, 0);
return 0;
}
// 4 clicks: toggle smooth vs discrete ramping
@@ -170,7 +176,7 @@ uint8_t steady_state(EventPtr event, uint16_t arg) {
set_level(memorized_level);
return 0;
}
- // click-release-hold: change brightness (dimmer)
+ // click, hold: change brightness (dimmer)
else if (event == EV_click2_hold) {
// ramp slower in discrete mode
if (arg % ramp_step_size != 0) {
@@ -219,26 +225,9 @@ uint8_t steady_state(EventPtr event, uint16_t arg) {
return 1;
}
-uint8_t party_strobe_state(EventPtr event, uint16_t arg) {
- static volatile uint8_t frames = 0;
- static volatile uint8_t between = 2;
+
+uint8_t strobe_state(EventPtr event, uint16_t arg) {
if (event == EV_enter_state) {
- if (arg < 64) between = arg;
- frames = 0;
- return 0;
- }
- // tick: strobe the emitter
- else if (event == EV_tick) {
- if (frames == 0) {
- PWM1_LVL = 0;
- PWM2_LVL = 255;
- if (between < 3) delay_zero();
- else delay_ms(1);
- PWM2_LVL = 0;
- }
- //frames = (frames + 1) % between;
- frames++;
- if (frames > between) frames = 0;
return 0;
}
// 1 click: off
@@ -246,25 +235,37 @@ uint8_t party_strobe_state(EventPtr event, uint16_t arg) {
set_state(off_state, 0);
return 0;
}
- // 2 clicks: go back to regular modes
+ // 2 clicks: toggle party strobe vs tactical strobe
else if (event == EV_2clicks) {
+ strobe_type ^= 1;
+ return 0;
+ }
+ // 3 clicks: go back to regular modes
+ else if (event == EV_3clicks) {
set_state(steady_state, memorized_level);
return 0;
}
- // hold: change speed
+ // hold: change speed (go faster)
else if (event == EV_click1_hold) {
- if ((arg % HOLD_TIMEOUT) == 0) {
- between = (between+1)%6;
- frames = 0;
+ if ((arg & 1) == 0) {
+ if (strobe_delay > 8) strobe_delay --;
+ }
+ return 0;
+ }
+ // click, hold: change speed (go slower)
+ else if (event == EV_click2_hold) {
+ if ((arg & 1) == 0) {
+ if (strobe_delay < 255) strobe_delay ++;
}
return 0;
}
return 1;
}
+
void low_voltage() {
// "step down" from strobe to something low
- if (current_state == party_strobe_state) {
+ if (current_state == strobe_state) {
set_state(steady_state, RAMP_SIZE/6);
}
// in normal mode, step down by half or turn off
@@ -278,6 +279,7 @@ void low_voltage() {
}
}
+
void setup() {
set_level(RAMP_SIZE/8);
delay_4ms(3);
@@ -285,3 +287,18 @@ void setup() {
push_state(off_state, 0);
}
+
+
+void loop() {
+ if (current_state == strobe_state) {
+ set_level(MAX_LEVEL);
+ if (strobe_type == 0) { // party strobe
+ if (strobe_delay < 30) delay_zero();
+ else delay_ms(1);
+ } else { //tactical strobe
+ nice_delay_ms(strobe_delay >> 1);
+ }
+ set_level(0);
+ nice_delay_ms(strobe_delay);
+ }
+}