~toykeeper/flashlight-firmware/fsm

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
Anduril User Manual
-------------------

Anduril is an open-source firmware for flashlights, distributed under 
the terms of the GPL v3.  The sources can be obtained here:

  http://tiny.cc/TKAnduril
  https://bazaar.launchpad.net/~toykeeper/flashlight-firmware/trunk/files/head:/ToyKeeper/spaghetti-monster/anduril/


Quick Start
-----------

After putting a battery in the light and tightening the parts together, 
the light should quickly blink once to confirm it has power and is now 
operational.  After that, basic usage is simple:

  - Click to turn the light on or off.
  - Hold the button to change brightness.
  - Release and hold again to change brightness the other way.

That is all the user needs to know for basic use, but there are many 
more modes and features available for people who want more.

Before reading the rest of this manual, it is recommended that users 
look at the Anduril UI diagram(s), which should be provided along with the 
flashlight.


Button presses
--------------

Button presses are abbreviated using a simple notation:

  - 1C: One click.  Press and then quickly release the button.
  - 1H: Hold.  Press the button, but keep holding it.
  - 2C: Two clicks.  Press and release quickly, twice.
  - 2H: Click, hold.  Click two times, but hold the second press.
  - 3C: Three clicks.  Press and release quickly, three times.
  - 3H: Click, click, hold.  Click three times, but hold the final press.

The same pattern is used with higher numbers too.  For example, 10C 
means ten clicks...  and 10H means ten clicks but hold the final press.


Simple UI
---------

By default, the light uses a simple UI.  This is useful if you lend the 
light to someone else, or if you just don't want to bother with any 
crazy disco modes.

Simple UI has all the basic functions needed to work as a flashlight, 
but the minimum and maximum brightness are limited by default to make it 
safer, and any complex or advanced functions are blocked.

Functions available in Simple UI include:

  - 1C: On / off
  - 1H: Ramp up (or down, if button was released less than a second ago)
  - 2H: If light is on : ramp down
        If light is off: momentary high mode
  - 2C: Double click to go to / from highest safe level
  - 4C: Lockout mode.

Some other modes and functions are available too.  When the light is 
off, these are the options:

  - 3C: Battery check mode.  (displays voltage once, then turns off)
  - 4C: Lockout mode.
  - 10H: Switch to Advanced UI.
  - 15C or more: Version check.

In Lockout mode with Simple UI, there are a few functions:

  - 1H: Momentary moon
  - 2H: Momentary low
  - 3C: Unlock and turn off
  - 4C: Unlock and turn on
  - 4H: Unlock and turn on at low level
  - 5C: Unlock and turn on at high level

To change between Simple UI and Advanced UI, turn the light off and then 
do one of these:

  In Simple UI:
    - 10H: Go to Advanced UI.

  In Advanced UI:
    - 10C: Go to Simple UI.
    - 10H: Configure Simple UI.

If you get lost, or if you want to auto-calibrate the temperature 
sensor, do a factory reset.  The process for this is:

  - Loosen tailcap
  - Hold button
  - Tighten tailcap
  - Keep holding button for about 4s

The light should flicker while getting brighter, then briefly burst to 
full power.  Hold until it reaches full power to do a reset, or let go 
of the button early to abort.

On some lights, like products where the tailcap method is impossible, 
use 13H from Off to do a factory reset.  If this is difficult, try 
counting it like music to make it easier:

  1 2 3 4
  1 2 3 4
  1 2 3 4
  HOLD

Simple UI is enabled after each factory reset.

Simple UI can be configured in several ways, but not while Simple UI is 
active.  So go to the Advanced UI, configure things, then go back to 
Simple UI.

Configurable options include:

  - floor level
  - ceiling level
  - number of steps (in stepped ramp)
  - turbo style

Other options are inherited from Advanced UI:

  - ramp style (smooth / stepped)
  - smooth ramp speed
  - ramp-after-moon style
  - memory settings
  - auto-lock settings
  - aux LED settings
  - voltage calibration
  - thermal regulation settings
  - hardware-specific "misc menu" settings


Advanced UI
-----------

Most of the information below this is for the Advanced UI.  Anything not 
already noted above is blocked in the Simple UI.


Ramping / Stepped Ramping Modes
-------------------------------

Anduril's ramping mode uses a smooth ramp or a stepped ramp, depending 
on which style the user prefers.

Each ramp has its own settings -- floor (lowest level), ceiling (highest 
level), and the stepped ramp can also have a configurable number of 
steps.

Additionally, Simple UI has its own ramp settings for floor, ceiling, 
and number of steps.  The smooth/stepped style is inherited from the 
Advanced UI's ramp.

There are four ways to access ramping mode when the light is off:

  - 1C: Turn on at the memorized brightness.
    (see below for details about what "memorized" means)

  - 1H: Turn on at the floor level.  Let go after the light turns on to 
    stay at the floor level, or keep holding to ramp up.

  - 2C: Turn on at the ceiling level.

  - 2H: Turn on at full power, turn off when released.  (momentary turbo)
        (in Simple UI, this uses the ceiling level instead of turbo)

While the light is on, a few actions are available:

  - 1C: Turn off.
  - 2C: Go to or from the turbo level.
        (or if it has regulated down, "bump" back up to turbo)
        (turbo level / behavior is configurable)
  - 1H: Change brightness (up).  If the button was released less than a 
    second ago, or if it's already at the ceiling, it goes down instead.
  - 2H: Change brightness (down).

  - 3C: Switch to the other ramp style.  (smooth / stepped)
        (or activate the next channel mode, when more than one is enabled)
        (then use 6C instead, for smooth / stepped toggle)
  - 6C: Switch to the other ramp style.  (when 3C is mapped to next channel)

  - 3H: Momentary turbo (when current channel has no tint to ramp).
  - 3H: Tint ramping (only when current channel has adjustable tint).
  - 4H: Momentary turbo, when 3H is mapped to tint.

  - 4C: Go to lockout mode.

  - 5C: Go to momentary mode.
  - 5H: Start a sunset timer.  Details are below in the Sunset Timer section.

  - 7H: Ramp config menu.
    - Item 1: Floor level.
    - Item 2: Ceiling level.
    - Item 3:
      Stepped ramp: Number of steps.  Can be 1 to 150.
      Smooth ramp: Ramp speed.
        1 = Full speed, ~2.5s from end to end.
        2 = Half speed, ~5s from end to end.
        3 = Third speed, ~7.5s.
        4 = Quarter speed, ~10s.

  - 10C: Activate manual memory and save the current brightness.
  - 10H: Ramp extras config menu.
    - Item 1: Disable manual memory and go back to automatic memory.
              (doesn't matter what value the user enters at the prompt)
    - Item 2: Configure the manual memory timer.
              Sets the timer to N minutes, where N is the number of 
              clicks.  A value of 0 (no clicks) turns the timer off.
    - Item 3: Configure whether to ramp up after "Off -> 1H".
              0: Ramp up after moon.
              1: Don't ramp up, just stay at the floor level.
    - Item 4: Configure Advanced UI's turbo style:
              0: No turbo, only ceiling.
              1: Anduril 1 style.  Ramp -> 2C goes to full power.
              2: Anduril 2 style.  Ramp -> 2C goes to ceiling,
                 or goes to full power if user ramped up to ceiling first.
              This value also affects momentary turbo in Ramp and Off modes.
    - Item 5: Configure "smooth steps".
              0: Disable smooth steps.
              1: Enable smooth steps.

Memory determines which brightness level the light goes to with 1 click 
from off.  There are three types of brightness memory to choose from:

  - Automatic:  Always uses the last-ramped brightness.
    (does not memorize levels accessed by a shortcut,
    like turbo, 2C for ceiling, or 1H-from-off for floor)

  - Manual:  Always uses the user's saved brightness.

  - Hybrid:  Uses the automatic memory brightness if the light was only 
    off for a short time, or resets to the manual memory level if it was 
    off for a longer time.
    The timer for this is configurable from 0 to ~140 minutes.

Another way to think of it is:  There are three styles of memory for the 
last-ramped brightness level...

  - Always remember         (automatic)
  - Remember for N minutes  (hybrid)
  - Never remember          (manual)

To choose a memory style, set the configuration accordingly:

  mem type	manual mem	manual mem timer
  --------	----------	----------------
  automatic	off		any
  manual	on		zero
  hybrid	on		non-zero

If "smooth steps" is enabled, the stepped ramp uses a smooth animation 
between steps, and turning the light on/off has the edges smoothed off 
too.  With "smooth steps" turned off, these brightness changes are 
immediate.


Sunset Timer
------------

In the ramp mode or candle mode, it's possible to make the light turn 
itself off after a while.

To activate the timer, go to the brightness you want and then use a 5H 
action.  Keep holding the button, and the light should blink once per 
second.  Each blink adds 5 minutes to the timer.

In ramp mode, it slowly dims until it's at the lowest level, then shuts 
off.  In candle mode, it stays at the same brightness until the final 
minute, at which point it dims and dies out.

The user can change the brightness while the timer is active.  If this 
happens during the final few minutes, it also "bumps" the timer up to a 
minimum of 3 minutes.  So if it's getting really dim and you need a 
little more time, you could do a 5H to add 5 minutes, or simply ramp up 
to the desired brightness.


Other Modes
-----------

Anduril has several other modes too.  To access these, press the button 
more than 2 times when the light is off:

  - 3C: Blinky / utility modes, starting with battery check.
  - 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 Config menu. (only on some lights)
  - 10H: Simple UI configuration menu.
  - 13H: Factory reset (on some lights).
  - 15C or more: Version check.


Lockout Mode
------------

Click 4 times from Off to enter Lockout mode.  Or 4 times from Ramp.  
This makes the light safe to carry in a pocket or a bag or anywhere else 
the button might be pressed by accident.

To exit lockout mode, click 4 times.  The light should blink briefly and 
then turn on at the memorized level.  Or hold the final press to turn on 
at the floor level instead:

  - 3C: Unlock and go to "Off" mode

  - 4C: Go to ramp mode (memorized level).
    (uses manual mem level if there is one)

  - 4H: Go to ramp mode (floor level).

  - 5C: Go to ramp mode (ceiling level).

Lockout mode also doubles as a momentary moon mode, so the user can do 
quick tasks without having to unlock the light.  The brightness in 
lockout mode has two levels:

  - 1H: Light up at the lowest floor level.

  - 2H: Light up at the highest floor level.
        (or the manual mem level, if there is one)

  - 3H: Next channel mode (if more than one is enabled).

It is also possible to make the light lock itself automatically after 
being turned off.  To enable this, go to lockout mode and use a 10H 
action to activate the auto-lock config menu.  Release the button after 
the first blink.  Then at the prompt, click N times to set the auto-lock 
timeout to N minutes.

  - 10H: Auto-lock config menu.  Click N times to set timeout to N minutes.
         A value of zero disables the auto-lock feature.
         So, to turn off auto-lock, don't click at all.

And on lights which have aux LEDs, there may be additional functions:

  - 7C / 7H: Change Lockout Mode's aux LED pattern.  More details on 
    this below, in a separate section.


Blinky / Utility Modes
----------------------

Click 3 times from Off to access Anduril's blinky / utility modes.  This 
always starts at battery check and the user can proceed to other blinky 
modes if Advanced UI is enabled.  The sequence is:

  - Battery check.
  - Temperature check (if light has a temperature sensor).
  - Beacon mode.
  - SOS mode (if enabled).

In all of these modes, some basic actions are available:

  - Click: Turn off.
  - 2 clicks: Next blinky mode.

Additionally, in battery check and temperature check modes:

  - 7H: Go to the voltage config menu or thermal config menu.

In more detail, this is what each blinky / utility mode does:

  Battery check:

    Blinks out the battery voltage per cell.  Full is 4.2V, empty is 
    about 3.0V.  The light blinks the whole-number digit first, pauses, 
    then blinks out the "tenths" digit.  Then a longer pause, and it 
    repeats.
    So for 4.2V, it would be "blink-blink-blink-blink .. blink-blink".

    A "zero" digit is represented by a very quick blink.

    On lights with more than one set of LEDs, pressing 3C during batt 
    check mode can select which set of LEDs (which channel mode) it uses 
    to blink out numbers.

    The voltage config menu has these settings:

      1. Voltage correction factor.  This adjusts the battery 
         measurement sensor, allowing the user to add or subtract up to 
         0.30V in 0.05V steps.  Click N times to enter a value:

         1C: -0.30V
         2C: -0.25V
         3C: -0.20V
         4C: -0.15V
         5C: -0.10V
         6C: -0.05V
         7C: default, 0V
         8C: +0.05V
         9C: +0.10V
         10C: +0.15V
         11C: +0.20V
         12C: +0.25V
         13C: +0.30V

      2. Post-off voltage display timeout.  (only on lights with RGB aux)
         This setting determines how many seconds the RGB aux LEDs 
         display the voltage color after the torch goes to sleep.  Click 
         once per desired second, or zero times to turn this function 
         off.

  Temperature check:

    Blinks out the current temperature in degrees C.  This number should 
    be pretty close to what a real thermometer says.  If not, it would 
    be a good idea to enter the thermal config menu and calibrate the 
    sensor.  Or let the light settle to room temperature, then use 
    factory reset to auto-calibrate the sensor.

    The thermal config menu has two settings:

    - Current temperature.  Click once per degree C to calibrate the 
      sensor.  For example, if the ambient temperature is 21 C, then 
      click 21 times.

    - Temperature limit.  This sets the maximum temperature the light 
      can reach before it will start doing thermal regulation to keep 
      itself from overheating.  Click once per degree C above 30.  For 
      example, to set the limit to 50 C, click 20 times.  The default is 
      45 C, and the highest value it will allow is 70 C.

  Beacon mode:

    Blinks at a slow speed.  The light stays on for 100ms, and then 
    stays off until the next blink.  The brightness and the number of 
    seconds between pulses are configurable:

      - Brightness is the user's memorized ramp level, so set this in 
        ramping mode before activating beacon mode.  Follows the same 
        memory rules as ramping -- automatic, manual, or hybrid.

      - Speed is configured by holding the button.  The light should 
        blink once per second while holding the button.  Release it 
        after the desired amount of time has passed, to set a new beacon 
        speed.
        For example, to do a 10-second alpine beacon, hold the button 
        for 10 seconds.

  SOS mode:

    Blinks out a distress signal.  Three short, three long, three short.  
    Repeats until light is turned off or until battery is low.

    The memorized ramp level determines the brightness of SOS Mode.


Strobe / Mood Modes
-------------------

Anduril includes a few extra modes for a variety of purposes:

  - Candle mode
  - Bike flasher
  - Party strobe
  - Tactical strobe
  - Lightning storm mode

Click 3 times from Off to access these, but hold the third click for a 
moment.  Click, click, hold.  The last-used strobe mode is remembered, 
so it will return to whichever one you used last.

In all of these modes, a few actions are available:

  - 1C: Turn off.
  - 2C: Next strobe / mood mode.
  - 1H: Increase brightness, or strobe faster.  (except lightning)
  - 2H: Decrease brightness, or strobe slower.  (except lightning)
  - 4C: Previous strobe / mood mode.
  - 5C: Go to momentary mode, for a momentary strobe.
        (this is useful for light painting)

Additionally, candle mode has one more action:

  - 5H: Activate Sunset Timer, and/or add 5 minutes to the timer.

In more detail, here is what each mode does:

  - Candle mode

    Brightness changes randomly in a pattern resembling a candle flame.  
    If a timer is set, it will run until the timer expires, then get 
    dimmer for one minute, then sputter and turn itself off.  Without a 
    timer, candle mode runs until the user turns it off.  Brightness is 
    configurable.

  - Bike flasher

    Runs at a medium level, but stutters to a brighter level once per 
    second.  Designed to be more visible than a normal ramping mode, but 
    otherwise works mostly the same.  Brightness is configurable.

  - Party strobe

    Motion-freezing strobe light.  Can be used to freeze spinning fans 
    and falling water.  Speed is configurable.

  - Tactical strobe

    Disorienting strobe light.  Can be used to irritate people.  Speed 
    is configurable, and the duty cycle is always 33%.

    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 
    strikes during a busy lightning storm.  Do not look directly at the 
    flashlight when this mode is running, because it may suddenly go to 
    full power without warning.


Momentary Mode
--------------

Click 5 times from Off to enter Momentary mode.  Or 5 times from Ramp, 
or 5 times from a strobe mode.

This locks the flashlight into a single-mode interface where the LEDs 
are only on when the button is held down.  It is intended for Morse 
code, light painting, and other tasks where the light should be on only 
for a short time and probably in a pattern.

Momentary mode does either a steady brightness level or a strobe, 
depending on which was active before going to momentary mode.  To select 
which one, go to the mode you want to use, adjust the brightness and 
speed and other settings, then click 5 times to enter momentary mode.

In steady mode, brightness is the memorized ramp level, so adjust that 
in Ramp Mode before entering momentary mode.

In momentary strobe mode, the settings are copied from the last-used 
strobe mode, such as party strobe, tactical strobe, or lightning.

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
-------------------

Every config menu has the same interface.  It has one or more options 
the user can configure, and it will go through them in order.  For each 
menu item, the light follows the same pattern:

  - Blink once, then go to a lower brightness.  The user can keep 
    holding the button to skip this menu item, or release the button to 
    dive in and enter a new value.

  - If the user released the button:

    - Stutter or "buzz" quickly between two brightness levels for a few 
      seconds.  This indicates that the user can click one or more times 
      to enter a number.  It will keep buzzing until the user stops 
      clicking, so there is no need to hurry.

      The actions here are:
      - click: add 1
      - hold: add 10  (only in versions 2021-09 or later)
      - wait: exit

After entering a number, or after skipping every menu item, it waits 
until the button is released then exits the menu.  It should return to 
whatever mode the light was in before entering the config menu.


Ramp Config Menu
----------------

While the light is on in a ramping mode, click 7 times (but hold the 
final click) to access the config menu for the current ramp.

Or, to access the ramp config for Simple UI, make sure the Simple UI is 
not active, then do a 10H action from Off.

For smooth ramping mode, there are three menu options:

  1. Floor.  (default = 1/150)
  2. Ceiling.  (default = 120/150)
  3. Ramp speed.  (default = 1, fastest speed)

For the stepped ramping mode, there are three menu options:

  1. Floor.  (default = 20/150)
  2. Ceiling.  (default = 120/150)
  3. Number of steps.  (default = 7)

For the Simple UI mode, there are four menu options.  The first three 
are the same as stepped ramping mode.

  1. Floor.  (default = 20/150)
  2. Ceiling.  (default = 120/150)
  3. Number of steps.  (default = 5)
  4. Turbo style.  (default = 0, no turbo)

Default values are different for each model of flashlight.  The numbers 
above are only examples.

To configure the floor level, click the button equal to the number of 
ramp levels (out of 150) at which the floor should be.  To set the 
lowest possible level, click once.

To configure the ceiling level, each click goes one level lower.  So 1 
click sets the highest possible level, 2 clicks is the 2nd-highest, 3 
clicks is the 3rd-highest level, etc.  To set the default of 120/150, 
click 31 times.

When configuring the number of steps, the value can be anything from 1 
to 150.  A value of 1 is a special case.  It places the step halfway 
between the floor and ceiling levels.


Version Check Mode
------------------

This allows people to see which version of the firmware is installed on 
their light.  The format for this is (usually) 12 digits -- a model 
number and a date.  BBPP.YYYY-MM-DD

  - BB: Brand ID
  - PP: Product ID
  - YYYY: Year
  - MM: Month
  - DD: Day

Versions before 2023-05-30 used YYYYMMDDBBPP format.
Anduril 1 used only YYYYMMDD format, or none at all.

The date is when the firmware was compiled.  If the vendor did not set 
this value, it defaults to 1969-07-20, the date of first human contact 
with the moon.  However, it might not be a date at all; some vendors may 
specify a completely different type of value here.

The brand/product values are also known as the model number.  These are 
hard-coded in the source code for each light's build target, and can be 
looked up in the "MODELS" file or by using the "make models" command.


Protection Features
-------------------

Anduril includes low voltage protection (LVP) and thermal regulation.

LVP makes the light step down to a lower level when the battery is low, 
and if the light is already at the lowest level, it shuts itself off.  
This activates at 2.8V.  LVP adjustments happen suddenly, in large 
steps.

Thermal regulation attempts to keep the light from overheating, and 
otherwise adjusts output to stay as close as possible to the 
user-configured temperature limit.  Thermal adjustments happen 
gradually, in steps so small they are difficult for humans to perceive.


Aux LEDs / Button LEDs
----------------------

Some lights have aux LEDs or button LEDs.  These can be configured to do 
different things while the main emitters are off.  There is one aux LED 
mode for the regular "off" mode, and another aux LED mode for "lockout" 
mode.  This allows the user to see at a glance whether the light is 
locked.

Aux LED modes typically include:

  - Off
  - Low
  - High
  - Blinking

To configure the aux LEDs, go to the mode you want to configure and then 
click the button 7 times.  This should change the aux LEDs to the next 
mode supported on this light.

  - 7C: Next aux LED mode.

If the aux LEDs can change color, there are additional actions to change 
the color.  It is the same as above, but hold the button on the last 
click and then let go when the desired color is reached.

  - 7H: Next aux LED color.

On most lights, the colors follow this sequence:

  - Red
  - Yellow (Red+Green)
  - Green
  - Cyan (Green+Blue)
  - Blue
  - Purple (Blue+Red)
  - White (Red+Green+Blue)
  - Disco (fast random colors)
  - Rainbow (cycles through all colors in order)
  - Voltage (uses color to display battery charge)

In voltage mode, the colors follow the same sequence, in the same order 
as a rainbow...  with red indicating a low battery and purple indicating 
a full battery.

For lights with a button LED, the button LED typically stays on while 
the main emitters are on.  Its brightness level is set in a way which 
mirrors the main LED -- off, low, or high.

For lights with a RGB button LED, the button LED indicates battery 
charge during use in the same manner as the aux LED voltage mode.

For lights with front-facing aux LEDs, the aux LEDs typically stay off 
when the main emitters are on, and when the light is otherwise awake.  
The aux LEDs on most lights only turn on when the light is asleep.

When a light has a single-color aux LED and no RGB, it fast-blinks the 
aux LED in "off" modes when voltage is low.


Misc Config Menu
----------------

Some models may have an extra config menu for settings which don't fit 
anywhere else.  This menu is located at "Off -> 9H" in the advanced UI.

These settings are, in order:

  - Tint ramp style:  (on some lights)

    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 
    level for a few milliseconds when changing from off to a low level.  
    This setting specifies how bright that pulse should be.

    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 Misc Config Menu depends on the 
hardware model and the firmware version.


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 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

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:

  - White blend (adjustable CCT / tint ramping)
  - Red only
  - Auto-tint

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.



UI Reference Table
------------------

This is a table of all button mappings in Anduril, in one place:

Mode		UI	Button	Action
----		--	------	------
Off		Any	1C	On (ramp mode, memorized level)
Off		Any	1H	On (ramp mode, floor level)
Off		Any	2C	On (ramp mode, ceiling level)
Off		Simple	2H	On (momentary ceiling level)
Off		Full	2H	On (momentary turbo)
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):
				?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:
				1: floor
				2: ceiling
				3: steps
				4: turbo style
Off		Any	13H	Factory reset (on some lights)
Off		Any	15+C	Version check

Ramp		Any	1C	Off
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		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: (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: switch to automatic mem, not manual mem
				2: set manual mem timeout
				3: ramp after moon or not
				4: advanced UI turbo style
				5: smooth steps

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)
Lockout		Any	3H	Next channel mode (if more than one enabled)
Lockout		Any	4C	On (ramp mode, memorized level)
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 in minutes (0 = no auto-lock)

Strobe (any)	Full	1C	Off
Strobe (any)	Full	2C	Next strobe mode
Strobe (any)	Full	3C	Next channel mode (saved per strobe mode)
Strobe (any)	Full	4C	Prev strobe mode
Strobe (any)	Full	5C	Momentary mode (using current strobe)

Party strobe	Full	1H/2H	Faster / slower
Tactical strobe	Full	1H/2H	Faster / slower
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	3C	Next channel mode (for number blinks only)
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
				   ...
				2: post-off voltage display seconds

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
Beacon		Full	2C	Next blinky mode (SOS, Batt check, Temp check)

SOS		Full	1C	Off
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