aboutsummaryrefslogtreecommitdiff
path: root/spaghetti-monster
diff options
context:
space:
mode:
authorSelene ToyKeeper2017-08-26 03:06:12 -0600
committerSelene ToyKeeper2017-08-26 03:06:12 -0600
commit674259407ace91bef354059c842b4114e95eb23c (patch)
treeb11ad32041fb0ca5cc9b9744b21bdc99af02ab87 /spaghetti-monster
parentRemoved ancient unfinished version of DarkHorse. (diff)
downloadanduril-674259407ace91bef354059c842b4114e95eb23c.tar.gz
anduril-674259407ace91bef354059c842b4114e95eb23c.tar.bz2
anduril-674259407ace91bef354059c842b4114e95eb23c.zip
Added beacons/strobes to DarkHorse.
Added a way to explicitly cancel the current "nice" delay without changing state.
Diffstat (limited to 'spaghetti-monster')
-rw-r--r--spaghetti-monster/darkhorse.c63
-rw-r--r--spaghetti-monster/fsm-events.c7
-rw-r--r--spaghetti-monster/fsm-events.h1
3 files changed, 64 insertions, 7 deletions
diff --git a/spaghetti-monster/darkhorse.c b/spaghetti-monster/darkhorse.c
index 2bfa2e9..5a522a4 100644
--- a/spaghetti-monster/darkhorse.c
+++ b/spaghetti-monster/darkhorse.c
@@ -33,8 +33,7 @@ uint8_t off_state(EventPtr event, uint16_t arg);
uint8_t low_mode_state(EventPtr event, uint16_t arg);
uint8_t med_mode_state(EventPtr event, uint16_t arg);
uint8_t hi_mode_state(EventPtr event, uint16_t arg);
-//uint8_t strobe_state(EventPtr event, uint16_t arg);
-//uint8_t beacon_state(EventPtr event, uint16_t arg);
+uint8_t strobe_beacon_state(EventPtr event, uint16_t arg);
#ifdef USE_BATTCHECK
uint8_t battcheck_state(EventPtr event, uint16_t arg);
#endif
@@ -53,6 +52,12 @@ uint8_t H2 = 1;
uint8_t low_modes[] = {12, 1, 4, 9}; // 3.3 lm, 2.0 lm, 0.8 lm, 0.3 lm
uint8_t med_modes[] = {56, 21, 29, 37}; // 101 lm, 35 lm, 20 lm, 10 lm
uint8_t hi_modes[] = {MAX_LEVEL, 81, 96, 113}; // 1500 lm, 678 lm, 430 lm, 270 lm
+// strobe/beacon modes:
+// 0: 0.2 Hz beacon at L1
+// 1: 0.2 Hz beacon at H1
+// 2: 4 Hz strobe at H1
+// 3: 19 Hz strobe at H1
+uint8_t strobe_beacon_mode = 0;
#ifdef USE_THERMAL_REGULATION
// brightness before thermal step-down
@@ -117,12 +122,10 @@ uint8_t off_state(EventPtr event, uint16_t arg) {
return 0;
}
// 3 clicks: strobe mode
- /* TODO: implement
else if (event == EV_3clicks) {
- set_state(party_strobe_state, 255);
+ set_state(strobe_beacon_state, 0);
return 0;
}
- */
#ifdef USE_BATTCHECK
// 4 clicks: battcheck mode
else if (event == EV_4clicks) {
@@ -252,6 +255,22 @@ uint8_t battcheck_state(EventPtr event, uint16_t arg) {
#endif
+uint8_t strobe_beacon_state(EventPtr event, uint16_t arg) {
+ // 1 click: off
+ if (event == EV_1click) {
+ set_state(off_state, 0);
+ return MISCHIEF_MANAGED;
+ }
+ // 2 clicks: rotate through blinky modes
+ else if (event == EV_2clicks) {
+ strobe_beacon_mode = (strobe_beacon_mode + 1) & 3;
+ interrupt_nice_delays();
+ return MISCHIEF_MANAGED;
+ }
+ return EVENT_NOT_HANDLED;
+}
+
+
void low_voltage() {
// TODO: rewrite this
/*
@@ -280,8 +299,40 @@ void setup() {
}
void loop() {
+ if (current_state == strobe_beacon_state) {
+ switch(strobe_beacon_mode) {
+ // 0.2 Hz beacon at L1
+ case 0:
+ set_level(low_modes[0]);
+ nice_delay_ms(500);
+ set_level(0);
+ nice_delay_ms(4500);
+ break;
+ // 0.2 Hz beacon at H1
+ case 1:
+ set_level(hi_modes[0]);
+ nice_delay_ms(500);
+ set_level(0);
+ nice_delay_ms(4500);
+ break;
+ // 4 Hz tactical strobe at H1
+ case 2:
+ set_level(hi_modes[0]);
+ nice_delay_ms(83);
+ set_level(0);
+ nice_delay_ms(167);
+ break;
+ // 19 Hz tactical strobe at H1
+ case 3:
+ set_level(hi_modes[0]);
+ nice_delay_ms(17);
+ set_level(0);
+ nice_delay_ms(35);
+ break;
+ }
+ }
#ifdef USE_BATTCHECK
- if (current_state == battcheck_state) {
+ else if (current_state == battcheck_state) {
nice_delay_ms(500); // wait a moment to measure voltage
battcheck();
set_state(off_state, 0);
diff --git a/spaghetti-monster/fsm-events.c b/spaghetti-monster/fsm-events.c
index 29ef415..90d0ffa 100644
--- a/spaghetti-monster/fsm-events.c
+++ b/spaghetti-monster/fsm-events.c
@@ -106,6 +106,10 @@ void process_emissions() {
}
}
+// explicitly interrupt these "nice" delays
+volatile uint8_t nice_delay_interrupt = 0;
+inline void interrupt_nice_delays() { nice_delay_interrupt = 1; }
+
// like delay_ms, except it aborts on state change
// return value:
// 0: state changed
@@ -115,7 +119,8 @@ uint8_t nice_delay_ms(uint16_t ms) {
while(ms-- > 0) {
_delay_loop_2(BOGOMIPS*98/100);
process_emissions();
- if (old_state != current_state) {
+ if ((nice_delay_interrupt) || (old_state != current_state)) {
+ nice_delay_interrupt = 0;
return 0; // state changed; abort
}
}
diff --git a/spaghetti-monster/fsm-events.h b/spaghetti-monster/fsm-events.h
index 141a0dc..f2a0181 100644
--- a/spaghetti-monster/fsm-events.h
+++ b/spaghetti-monster/fsm-events.h
@@ -223,5 +223,6 @@ void emit_current_event(uint16_t arg);
uint8_t nice_delay_ms(uint16_t ms);
//uint8_t nice_delay_4ms(uint8_t ms);
//uint8_t nice_delay_s();
+inline void interrupt_nice_delays();
#endif
If you find this content useful please consider a small donation via bitcoin: bitcoin:1mxKyQsHHugqRxPKgwaA7wUwJEGCNthn2?amount=0.001&message=Donation Scraping git contents via cgit is very resource intensive. The continued hosting of these git repositories is entirely financed by your bitcoin contributions. For donations of a least 1 mBTC you include your IP address in the message of your bitcoin donation. This will remove this message in the future for requests from your IP, which will significantly reduce token usage. In any case, any contributions to bitcoin address 1mxKyQsHHugqRxPKgwaA7wUwJEGCNthn2 are very welcome. Thanks in advance for you contribution to a self-sustaining ecosystem.