aboutsummaryrefslogtreecommitdiff
path: root/spaghetti-monster
diff options
context:
space:
mode:
Diffstat (limited to 'spaghetti-monster')
-rw-r--r--spaghetti-monster/anduril/anduril-manual.txt195
-rw-r--r--spaghetti-monster/anduril/channel-modes.c55
-rw-r--r--spaghetti-monster/anduril/channel-modes.h6
-rw-r--r--spaghetti-monster/anduril/config-default.h4
-rw-r--r--spaghetti-monster/anduril/load-save-config-fsm.h3
-rw-r--r--spaghetti-monster/anduril/load-save-config.h3
-rw-r--r--spaghetti-monster/anduril/ramp-mode-fsm.h3
-rw-r--r--spaghetti-monster/anduril/ramp-mode.c8
-rw-r--r--spaghetti-monster/anduril/ramp-mode.h2
9 files changed, 227 insertions, 52 deletions
diff --git a/spaghetti-monster/anduril/anduril-manual.txt b/spaghetti-monster/anduril/anduril-manual.txt
index 1873b8d..fc61948 100644
--- a/spaghetti-monster/anduril/anduril-manual.txt
+++ b/spaghetti-monster/anduril/anduril-manual.txt
@@ -279,8 +279,9 @@ more than 2 times when the light is off:
- 3H: Strobe modes, starting with the most recently used strobe.
- 4C: Lockout mode.
- 5C: Momentary mode.
+ - 6C: Tactical mode.
- 7C / 7H: Aux LED configuration.
- - 9H: Misc configuration menu. (only on some lights)
+ - 9H: Misc Config menu. (only on some lights)
- 10H: Simple UI configuration menu.
- 13H: Factory reset (on some lights).
- 15C or more: Version check.
@@ -485,6 +486,11 @@ In more detail, here is what each mode does:
Be careful about heat in this mode, if using it for a long time.
+ - Police strobe (on some lights)
+
+ 2-color police style strobe. Only works on lights with 2 or more
+ colors.
+
- Lightning storm mode
Flashes at random brightness and random speed to simulate lightning
@@ -519,6 +525,46 @@ To exit this mode, physically disconnect power by unscrewing the tailcap
or battery tube.
+Tactical Mode
+--------------
+
+Click 6 times from Off to enter Tactical Mode, or 6 times in Tactical
+Mode to exit and go back to "Off".
+
+Tactical Mode provides instant momentary access to high, low, and
+strobe, but each of these is configurable. The inputs are:
+
+ - 1H: High
+ - 2H: Low
+ - 3H: Strobe
+
+Each of these only lasts as long as you hold the button.
+
+Other commands in Tactical Mode are:
+
+ - 6C: exit (go back to Off Mode)
+ - 7H: Tactical Mode config menu
+ - 1st blink: configure tactical slot 1
+ - 2nd blink: configure tactical slot 2
+ - 3rd blink: configure tactical slot 3
+
+To change what is in a tactical slot, press 7H, then release the button
+after the 1st, 2nd, or 3rd blink. Then enter a number. Each click adds
+1, and each hold adds 10. The number can be:
+
+ - 1 to 150: set the brightness level
+ - 0: last-used strobe mode
+ - 151+: go directly to a specific strobe mode
+ 151 = party strobe
+ 152 = tactical strobe
+ 153+ = other strobes, in the same order they're in in the "Off -> 3H"
+ strobe group
+
+This assumes the light has a ramp 150 levels long. Strobe modes start
+at the ramp size plus 1, so it may be different if a light has a
+different ramp size.
+
+
Configuration Menus
-------------------
@@ -693,14 +739,18 @@ Misc Config Menu
----------------
Some models may have an extra config menu for settings which don't fit
-anywhere else. These settings are, in order:
+anywhere else. This menu is located at "Off -> 9H" in the advanced UI.
- - Tint ramp style:
+These settings are, in order:
- 0 = smooth (blend channels in any proportion)
- 1 = toggle (only one channel active at a time)
+ - Tint ramp style: (on some lights)
- - Jump Start level:
+ 0 : smooth ramp (blend channels in any proportion)
+ 1 : middle tint only
+ 2 : extreme tints only (only one channel active at a time)
+ 3+: stepped ramp with 3+ steps
+
+ - Jump Start level: (on some lights)
Some lights are prone to starting up slowly at low levels, so they
have an option to "jump start" the engine by pulsing a higher power
@@ -710,36 +760,71 @@ anywhere else. These settings are, in order:
The value can be from 1 to 150, but is usually between 20 and 50.
These settings are hardware-specific and may not be present on all
-lights. The number of settings in the global menu depends on the
+lights. The number of settings in the Misc Config Menu depends on the
hardware model and the firmware version.
-Tint Ramping
-------------
+Channel Modes (a.k.a. Tint Ramping or Multi Channel controls)
+-------------------------------------------------------------
Some lights have more than one set of LEDs which can be adjusted to
-change the color temperature of the light. On these models, there is a
-global button mapping which works at all times unless it's overridden by
-the mode the light is in:
+change the beam color, shape, or other properties. These lights have
+features like tint ramping and channel modes.
+
+On these models, there are some global button mappings which work at all
+times unless they're overridden by the mode the light is in:
+
+ - 3C: Next channel mode
+ - 3H: Adjust current channel mode (ramp tint, for example)
+ - 9H: Channel mode config menu
- - 3H: Tint ramping
+Details depend on the exact type of light used. For example, if a light
+has LEDs in cool white, warm white, and red... that light might have a
+few channel modes:
-So, at almost any time, click 3 times but hold the final press, and it
-can change the color of the light. This is best done with the light at
-a moderately high level, because it makes the changes smooth. Low
-levels have more coarse resolution and will typically change in very
-visible steps.
+ - White blend (adjustable CCT / tint ramping)
+ - Red only
+ - Auto-tint
-At both ends of the tint ramp, there is an "auto tint" mode. This
-automatically chooses a tint based on the brightness level... so it can
-be warm white while dim, or cool white while bright. Or vice-versa. To
-access this, ramp to the end of the tint range, then keep holding until
-the light blinks a second time.
+On a light like this, the user could press 3C to rotate through these
+different channel modes... white, then red, then auto, then back to
+white.
+
+Additionally, in the "white blend" mode, the user could press 3H to
+manually adjust the balance between warm white and cool white.
+
+Finally, if the user decides they don't want all of the modes, they can
+turn some off. Press 9H (while on) to start the channel mode config
+menu. To disable the auto-tint mode, for example, it is the 3rd mode...
+so wait for the 3rd blink, then release the button. Then at the prompt,
+enter a value of 0 (wait for the prompt to time out without clicking
+anything). Afterward, the auto tint mode should no longer be in the
+channel mode rotation. To turn the mode back on later, do the same
+thing, but enter a value of 1 (click 1 time at the prompt).
+
+A light can have many different channel modes, so don't be shy about
+turning off any modes you don't use. It makes all the others easier to
+reach.
+
+If you turn off channel modes until only 1 remains, the "Ramp -> 3C"
+action reverts to its single-channel behavior -- switching between a
+smooth or stepped brightness ramp. Additionally, when a channel mode
+has nothing to adjust with 3H, the 3H action also reverts to its
+single-channel behavior -- momentary turbo.
+
+The Misc Config Menu (Off -> 9H) may also have a setting to choose a
+tint ramp style. There are a few styles available, by entering
+different numbers into that config menu:
+
+ 0: smooth ramp
+ 1: middle tint only
+ 2: extreme tints only
+ 3+: stepped ramp with 3+ steps
+
+This setting only applies to modes with channel ramping (i.e. tint
+ramping), and only when that mode uses the default 3H event handler.
+Custom channel modes may work differently.
-The misc config menu also has a setting to choose a tint ramp style.
-This can be smooth, allowing the user to smoothly blend both channels in
-whatever ratio they desire... or it can be "tint toggle" style, where
-only one channel is active at a time.
UI Reference Table
@@ -758,9 +843,12 @@ Off Any 3C Battcheck mode
Off Full 3H Strobe mode (whichever was used last)
Off Any 4C Lockout mode
Off Full 5C Momentary mode
+Off Full 6C Tactical mode
Off Full 7C Aux LEDs: Next pattern
Off Full 7H Aux LEDs: Next color
-Off Full 9H Misc config menu (varies per light)
+Off Full 9H Misc Config menu (varies per light):
+ ?1: tint ramp style
+ ?2: jump start level
Off Full 10C Enable Simple UI
Off Simple 10H Disable Simple UI
Off Full 10H Simple UI ramp config menu:
@@ -776,19 +864,29 @@ Ramp Any 1H Ramp (up, with reversing)
Ramp Any 2H Ramp (down)
Ramp Any 2C Go to/from ceiling or turbo (configurable)
Ramp Full 3C Change ramp style (smooth / stepped)
-Ramp Any 3H Tint ramping (on some lights)
-Ramp Full 3H Momentary turbo (on lights without tint ramping)
+Ramp Full 6C (same as above, but on multi-channel lights)
+Ramp Full 3H Momentary turbo (when no tint ramping)
+Ramp Full 4H Momentary turbo (on multi channel lights)
Ramp Any 4C Lockout mode
Ramp Full 5C Momentary mode
Ramp Full 5H Sunset timer on, and add 5 minutes
-Ramp Full 7H Ramp config menu (1: floor, 2: ceiling, 3: speed/steps)
+Ramp Full 7H Ramp config menu: (for current ramp)
+ 1: floor
+ 2: ceiling
+ 3: speed / steps
Ramp Full 10C Turn on manual memory and save current brightness
Ramp Full 10H Ramp Extras config menu:
- 1: enable automatic mem
+ 1: switch to automatic mem, not manual mem
2: set manual mem timeout
3: ramp after moon or not
4: advanced UI turbo style
+Multi-channel lights only:
+Any Any 3C Next channel mode (i.e. next color mode)
+Any Any 3H Tint ramp (if this mode can)
+Any Full 9H Channel mode enable/disable menu:
+ N: click (or not) to enable (disable) mode N
+
Lockout Any 1C/1H Momentary moon (lowest floor)
Lockout Any 2C/2H Momentary moon (highest floor, or manual mem level)
Lockout Any 3C Unlock (go to "Off" mode)
@@ -797,27 +895,39 @@ Lockout Any 4H On (ramp mode, floor level)
Lockout Any 5C On (ramp mode, ceiling level)
Lockout Full 7C Aux LEDs: Next pattern
Lockout Full 7H Aux LEDs: Next color
-Lockout Full 10H Auto-lock config menu (1: set timeout)
+Lockout Full 10H Auto-lock config menu:
+ 1: set timeout in minutes (0 = no auto-lock)
Strobe (any) Full 1C Off
Strobe (any) Full 2C Next strobe mode
-Strobe (any) Full 3H Tint ramping (on some lights)
+Strobe (any) Full 4C Prev strobe mode
Strobe (any) Full 5C Momentary mode (using current strobe)
-Candle Full 1H/2H Brighter / dimmer
-Candle Full 5H Sunset timer on, add 5 minutes
Party strobe Full 1H/2H Faster / slower
Tactical strobe Full 1H/2H Faster / slower
-Biking Full 1H/2H Brighter / dimmer
+Police strobe - - None (brightness is Ramp Mode's last-used level)
Lightning Full 1H Interrupt current flash or start new one
+Candle Full 1H/2H Brighter / dimmer
+Candle Full 5H Sunset timer on, add 5 minutes
+Biking Full 1H/2H Brighter / dimmer
Batt check Any 1C Off
Batt check Full 2C Next blinky mode (Temp check, Beacon, SOS)
Batt check Full 7H Voltage config menu
+ 1: voltage correction factor
+ ...
+ 5: -0.10V
+ 6: -0.05V
+ 7: no correction
+ 8: +0.05V
+ 9: +0.10V
+ ...
Temp check Full 1C Off
Temp check Full 2C Next blinky mode (Beacon, SOS, Batt check)
Temp check Full 7H Thermal config menu
+ 1: set current temperature
+ 2: set temperature limit
Beacon Full 1C Off
Beacon Full 1H Configure beacon timing
@@ -829,8 +939,19 @@ SOS Full 2C Next blinky mode (Batt check, Temp check, Beacon)
Momentary Full Any On (until button is released)
Momentary Full Disconnect power Exit Momentary mode
+Tactical Full 1H High (tactical slot 1)
+Tactical Full 2H Low (tactical slot 2)
+Tactical Full 3H Strobe (tactical slot 3)
+Tactical Full 6C Exit (go back to Off Mode)
+Tactical Full 7H Tactical Mode config menu:
+ 1: tactical slot 1
+ 2: tactical slot 2
+ 3: tactical slot 3
+
Config menus Full Hold Skip current item with no changes
Config menus Full Release Configure current item
+ (goes to Number Entry menu)
Number entry Full Click Add 1 to value for current item
Number entry Full Hold Add 10 to value for current item
+
diff --git a/spaghetti-monster/anduril/channel-modes.c b/spaghetti-monster/anduril/channel-modes.c
index 51f294c..b2985a1 100644
--- a/spaghetti-monster/anduril/channel-modes.c
+++ b/spaghetti-monster/anduril/channel-modes.c
@@ -70,13 +70,25 @@ uint8_t channel_mode_state(Event event, uint16_t arg) {
// ignore event if we weren't the ones who handled the first frame
if (! active) return EVENT_NOT_HANDLED;
- // change normal tints
- if ((tint_ramp_direction > 0) && (tint < 255)) {
- tint += 1;
- }
- else if ((tint_ramp_direction < 0) && (tint > 0)) {
- tint -= 1;
- }
+ #ifdef USE_STEPPED_TINT_RAMPING
+ if ((tint_ramp_direction > 0 && tint < 255) ||
+ (tint_ramp_direction < 0 && tint > 0)) {
+ // ramp slower in stepped mode
+ if (cfg.tint_ramp_style && (arg % HOLD_TIMEOUT != 0))
+ return EVENT_HANDLED;
+
+ const uint8_t step_size = (cfg.tint_ramp_style < 2)
+ ? 1 : 254 / (cfg.tint_ramp_style-1);
+ tint = nearest_tint_value(
+ tint + ((int16_t)step_size * tint_ramp_direction)
+ );
+ }
+ #else // smooth tint ramping only
+ if ((tint_ramp_direction > 0) && (tint < 255)) { tint ++; }
+ else
+ if ((tint_ramp_direction < 0) && (tint > 0)) { tint --; }
+ #endif // ifdef USE_STEPPED_TINT_RAMPING
+
// if tint change stalled, let user know we hit the edge
else if (prev_tint == tint) {
if (past_edge_counter == 0) blip();
@@ -124,6 +136,7 @@ uint8_t channel_mode_state(Event event, uint16_t arg) {
return EVENT_NOT_HANDLED;
}
+
#if NUM_CHANNEL_MODES > 1
void channel_mode_config_save(uint8_t step, uint8_t value) {
// 1 menu item per channel mode, to enable or disable that mode
@@ -142,3 +155,31 @@ uint8_t channel_mode_config_state(Event event, uint16_t arg) {
}
#endif
+
+#if defined(USE_CHANNEL_MODE_ARGS) && defined(USE_STEPPED_TINT_RAMPING)
+uint8_t nearest_tint_value(const int16_t target) {
+ // const symbols for more readable code, will be removed by the compiler
+ const uint8_t tint_min = 0;
+ const uint8_t tint_max = 255;
+ const uint8_t tint_range = tint_max - tint_min;
+
+ // only equal mix of both channels
+ if (1 == cfg.tint_ramp_style) return (tint_min + tint_max) >> 1;
+
+ if (target < tint_min) return tint_min;
+ if (target > tint_max) return tint_max;
+ if (0 == cfg.tint_ramp_style) return target; // smooth ramping
+
+ const uint8_t step_size = tint_range / (cfg.tint_ramp_style-1);
+
+ uint8_t tint_result = tint_min;
+ for (uint8_t i=0; i<cfg.tint_ramp_style; i++) {
+ tint_result = tint_min
+ + (i * (uint16_t)tint_range / (cfg.tint_ramp_style-1));
+ int16_t diff = target - tint_result;
+ if (diff <= (step_size>>1)) return tint_result;
+ }
+ return tint_result;
+}
+#endif
+
diff --git a/spaghetti-monster/anduril/channel-modes.h b/spaghetti-monster/anduril/channel-modes.h
index 67d6bbb..4c16281 100644
--- a/spaghetti-monster/anduril/channel-modes.h
+++ b/spaghetti-monster/anduril/channel-modes.h
@@ -10,3 +10,9 @@ uint8_t channel_mode_state(Event event, uint16_t arg);
#if NUM_CHANNEL_MODES > 1
uint8_t channel_mode_config_state(Event event, uint16_t arg);
#endif
+
+#if defined(USE_CHANNEL_MODE_ARGS) && defined(USE_STEPPED_TINT_RAMPING)
+// calculate the nearest tint value which would be valid at the moment
+uint8_t nearest_tint_value(const int16_t target);
+#endif
+
diff --git a/spaghetti-monster/anduril/config-default.h b/spaghetti-monster/anduril/config-default.h
index 514b9a8..5023c3b 100644
--- a/spaghetti-monster/anduril/config-default.h
+++ b/spaghetti-monster/anduril/config-default.h
@@ -181,3 +181,7 @@
// those oscillations
//#define USE_LOWPASS_WHILE_ASLEEP
+// if there's tint ramping, allow user to set it smooth or stepped
+#define USE_STEPPED_TINT_RAMPING
+#define DEFAULT_TINT_RAMP_STYLE 0 // smooth
+
diff --git a/spaghetti-monster/anduril/load-save-config-fsm.h b/spaghetti-monster/anduril/load-save-config-fsm.h
index ef079db..ceb9d76 100644
--- a/spaghetti-monster/anduril/load-save-config-fsm.h
+++ b/spaghetti-monster/anduril/load-save-config-fsm.h
@@ -59,6 +59,9 @@ typedef struct Config {
#ifdef USE_MANUAL_MEMORY
uint8_t manual_memory_channel_args[NUM_CHANNEL_MODES];
#endif
+ #ifdef USE_STEPPED_TINT_RAMPING
+ uint8_t tint_ramp_style;
+ #endif
#endif
///// strobe / blinky mode settings
diff --git a/spaghetti-monster/anduril/load-save-config.h b/spaghetti-monster/anduril/load-save-config.h
index 9fe24c7..60612d3 100644
--- a/spaghetti-monster/anduril/load-save-config.h
+++ b/spaghetti-monster/anduril/load-save-config.h
@@ -85,6 +85,9 @@ Config cfg = {
// remember and reset 1 extra parameter per channel mode (like tint)
.manual_memory_channel_args = { CHANNEL_MODE_ARGS },
#endif
+ #ifdef USE_STEPPED_TINT_RAMPING
+ .tint_ramp_style = DEFAULT_TINT_RAMP_STYLE,
+ #endif
#endif
///// strobe / blinky mode settings
diff --git a/spaghetti-monster/anduril/ramp-mode-fsm.h b/spaghetti-monster/anduril/ramp-mode-fsm.h
index 8fb80d1..edfd6db 100644
--- a/spaghetti-monster/anduril/ramp-mode-fsm.h
+++ b/spaghetti-monster/anduril/ramp-mode-fsm.h
@@ -31,7 +31,8 @@
#endif
// include an extra config mode for random stuff which doesn't fit elsewhere
-#if defined(USE_TINT_RAMPING) || defined(USE_JUMP_START)
+#if defined(USE_JUMP_START) || \
+ (defined(USE_CHANNEL_MODE_ARGS) && defined(USE_STEPPED_TINT_RAMPING))
#define USE_GLOBALS_CONFIG
#endif
diff --git a/spaghetti-monster/anduril/ramp-mode.c b/spaghetti-monster/anduril/ramp-mode.c
index 5a960c9..1799e97 100644
--- a/spaghetti-monster/anduril/ramp-mode.c
+++ b/spaghetti-monster/anduril/ramp-mode.c
@@ -587,12 +587,8 @@ uint8_t ramp_extras_config_state(Event event, uint16_t arg) {
#ifdef USE_GLOBALS_CONFIG
void globals_config_save(uint8_t step, uint8_t value) {
if (0) {}
- #ifdef USE_TINT_RAMPING
- else if (step == 1+tint_style_config_step) {
- tint_style = !(!(value));
- // set tint to middle or edge depending on style being smooth or toggle
- tint = tint_style ? 1 : 127;
- }
+ #if defined(USE_CHANNEL_MODE_ARGS) && defined(USE_STEPPED_TINT_RAMPING)
+ else if (step == 1+tint_style_config_step) { cfg.tint_ramp_style = value; }
#endif
#ifdef USE_JUMP_START
else if (step == 1+jump_start_config_step) { cfg.jump_start_level = value; }
diff --git a/spaghetti-monster/anduril/ramp-mode.h b/spaghetti-monster/anduril/ramp-mode.h
index e4ded1e..20986cc 100644
--- a/spaghetti-monster/anduril/ramp-mode.h
+++ b/spaghetti-monster/anduril/ramp-mode.h
@@ -188,7 +188,7 @@ void reset_sunset_timer();
#ifdef USE_GLOBALS_CONFIG
typedef enum {
- #ifdef USE_TINT_RAMPING
+ #if defined(USE_CHANNEL_MODE_ARGS) && defined(USE_STEPPED_TINT_RAMPING)
tint_style_config_step,
#endif
#ifdef USE_JUMP_START
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.