aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xbin/flash-tiny85-fuses.sh2
-rw-r--r--hwdef-BLF_GT.h6
-rw-r--r--hwdef-BLF_GT_Mini.h4
-rw-r--r--hwdef-BLF_Q8.h4
-rw-r--r--hwdef-Emisar_D1.h5
-rw-r--r--hwdef-Emisar_D1S.h5
-rw-r--r--hwdef-Emisar_D4.h6
-rw-r--r--hwdef-Emisar_D4S.h4
-rw-r--r--hwdef-FET_7135.h6
-rw-r--r--hwdef-FF_PL47.h4
-rw-r--r--hwdef-FF_ROT66.h4
-rw-r--r--hwdef-FW3A.h6
-rw-r--r--hwdef-Ferrero_Rocher.h7
-rw-r--r--hwdef-TK_Saber.h6
-rw-r--r--hwdef-Tripledown.h6
-rw-r--r--hwdef-nanjg.h6
-rw-r--r--spaghetti-monster/anduril/anduril-manual.txt358
-rw-r--r--spaghetti-monster/anduril/anduril.c97
-rw-r--r--spaghetti-monster/anduril/anduril.svg906
-rw-r--r--spaghetti-monster/anduril/anduril.txt57
-rwxr-xr-xspaghetti-monster/anduril/build-all.sh25
-rw-r--r--spaghetti-monster/anduril/cfg-blf-gt-mini.h1
-rw-r--r--spaghetti-monster/anduril/cfg-blf-gt.h1
-rw-r--r--spaghetti-monster/anduril/cfg-blf-q8.h6
-rw-r--r--spaghetti-monster/anduril/cfg-emisar-d1.h2
-rw-r--r--spaghetti-monster/anduril/cfg-emisar-d1s.h2
-rw-r--r--spaghetti-monster/anduril/cfg-emisar-d4-219c.h1
-rw-r--r--spaghetti-monster/anduril/cfg-emisar-d4.h1
-rw-r--r--spaghetti-monster/anduril/cfg-emisar-d4s-219c.h1
-rw-r--r--spaghetti-monster/anduril/cfg-emisar-d4s.h3
-rw-r--r--spaghetti-monster/anduril/cfg-ff-pl47-219.h7
-rw-r--r--spaghetti-monster/anduril/cfg-ff-pl47.h1
-rw-r--r--spaghetti-monster/anduril/cfg-ff-rot66-219.h1
-rw-r--r--spaghetti-monster/anduril/cfg-ff-rot66.h1
-rw-r--r--spaghetti-monster/anduril/cfg-fw3a.h1
-rw-r--r--spaghetti-monster/anduril/cfg-sofirn-sp36.h9
-rw-r--r--spaghetti-monster/baton/baton.c2
-rw-r--r--spaghetti-monster/darkhorse/darkhorse.c3
-rw-r--r--spaghetti-monster/fsm-adc.c2
-rw-r--r--spaghetti-monster/meteor/meteor.c2
-rw-r--r--spaghetti-monster/momentary/momentary.c2
-rw-r--r--spaghetti-monster/ramping-ui/ramping-ui.c2
-rwxr-xr-xspaghetti-monster/rampingios/build-all.sh19
-rw-r--r--spaghetti-monster/rampingios/rampingiosv3.c63
-rwxr-xr-xspaghetti-monster/werner/build-all.sh18
-rw-r--r--spaghetti-monster/werner/werner.c23
-rw-r--r--tk-attiny.h43
-rw-r--r--tk.h17
48 files changed, 1189 insertions, 569 deletions
diff --git a/bin/flash-tiny85-fuses.sh b/bin/flash-tiny85-fuses.sh
index e517b2d..f49049a 100755
--- a/bin/flash-tiny85-fuses.sh
+++ b/bin/flash-tiny85-fuses.sh
@@ -3,6 +3,6 @@
# (everything else disabled)
# Use low fuse 0xD2 for 4ms startup delay,
# or 0xE2 for 64ms (useful on a twisty light)
-avrdude -c usbasp -p t85 -u -U lfuse:w:0xe2:m -U hfuse:w:0xdf:m -U efuse:w:0xff:m
+avrdude -c usbasp -p t85 -u -U lfuse:w:0xe2:m -U hfuse:w:0xde:m -U efuse:w:0xff:m
# http://www.engbedded.com/cgi-bin/fcx.cgi?P_PREV=ATtiny85&P=ATtiny85&M_LOW_0x3F=0x22&M_HIGH_0x07=0x07&M_HIGH_0x20=0x00&B_SPIEN=P&B_SUT0=P&B_CKSEL3=P&B_CKSEL2=P&B_CKSEL0=P&V_LOW=E2&V_HIGH=DF&V_EXTENDED=FF&O_HEX=Apply+values
diff --git a/hwdef-BLF_GT.h b/hwdef-BLF_GT.h
index 7dcc8a0..01dbdbd 100644
--- a/hwdef-BLF_GT.h
+++ b/hwdef-BLF_GT.h
@@ -1,3 +1,6 @@
+#ifndef HWDEF_BLF_GT_H
+#define HWDEF_BLF_GT_H
+
/* BLF GT driver layout
* ----
* Reset -|1 8|- VCC (unused)
@@ -52,3 +55,6 @@
#define FAST 0xA3 // fast PWM both channels
#define PHASE 0xA1 // phase-correct PWM both channels
+#define LAYOUT_DEFINED
+
+#endif
diff --git a/hwdef-BLF_GT_Mini.h b/hwdef-BLF_GT_Mini.h
index aacbca4..43f74f3 100644
--- a/hwdef-BLF_GT_Mini.h
+++ b/hwdef-BLF_GT_Mini.h
@@ -1,3 +1,6 @@
+#ifndef HWDEF_BLF_GT_MINI_H
+#define HWDEF_BLF_GT_MINI_H
+
/* BLF/Lumintop GT Mini driver layout
*/
// exactly the same as a D1S, but with a lighted button
@@ -8,3 +11,4 @@
#define AUXLED_PIN PB4 // pin 3
#endif
+#endif
diff --git a/hwdef-BLF_Q8.h b/hwdef-BLF_Q8.h
index 6e13faf..5dac5d2 100644
--- a/hwdef-BLF_Q8.h
+++ b/hwdef-BLF_Q8.h
@@ -1,3 +1,6 @@
+#ifndef HWDEF_BLF_Q8_H
+#define HWDEF_BLF_Q8_H
+
/* BLF Q8 driver layout
* Q8 driver is the same as a D4, basically
*/
@@ -15,3 +18,4 @@
// Q8 driver is the same as a D4, basically
#include "hwdef-Emisar_D4.h"
+#endif
diff --git a/hwdef-Emisar_D1.h b/hwdef-Emisar_D1.h
index 6df8705..caf1d4e 100644
--- a/hwdef-Emisar_D1.h
+++ b/hwdef-Emisar_D1.h
@@ -1,4 +1,9 @@
+#ifndef HWDEF_EMISAR_D1_H
+#define HWDEF_EMISAR_D1_H
+
/* Emisar D1 driver layout
*/
// D1 driver is exactly the same as a D4
#include "hwdef-Emisar_D4.h"
+
+#endif
diff --git a/hwdef-Emisar_D1S.h b/hwdef-Emisar_D1S.h
index 31792c7..2e9fffa 100644
--- a/hwdef-Emisar_D1S.h
+++ b/hwdef-Emisar_D1S.h
@@ -1,4 +1,9 @@
+#ifndef HWDEF_EMISAR_D1S_H
+#define HWDEF_EMISAR_D1S_H
+
/* Emisar D1S driver layout
*/
// D1S driver is exactly the same as a D4
#include "hwdef-Emisar_D4.h"
+
+#endif
diff --git a/hwdef-Emisar_D4.h b/hwdef-Emisar_D4.h
index 0dfcab9..be499f1 100644
--- a/hwdef-Emisar_D4.h
+++ b/hwdef-Emisar_D4.h
@@ -1,3 +1,6 @@
+#ifndef HWDEF_EMISAR_D4_H
+#define HWDEF_EMISAR_D4_H
+
/* Emisar D4 driver layout
* ----
* Reset -|1 8|- VCC
@@ -7,6 +10,8 @@
* ----
*/
+#define LAYOUT_DEFINED
+
#define PWM_CHANNELS 2
//#define AUXLED_PIN PB4 // pin 3
@@ -42,3 +47,4 @@
#define FAST 0xA3 // fast PWM both channels
#define PHASE 0xA1 // phase-correct PWM both channels
+#endif
diff --git a/hwdef-Emisar_D4S.h b/hwdef-Emisar_D4S.h
index 47ef1eb..05a60f9 100644
--- a/hwdef-Emisar_D4S.h
+++ b/hwdef-Emisar_D4S.h
@@ -1,3 +1,6 @@
+#ifndef HWDEF_EMISAR_D4S_H
+#define HWDEF_EMISAR_D4S_H
+
/* Emisar D4S driver layout
*/
// same as a D4, basically
@@ -8,3 +11,4 @@
#define AUXLED_PIN PB4 // pin 3
#endif
+#endif
diff --git a/hwdef-FET_7135.h b/hwdef-FET_7135.h
index 58df7b2..c89d3ce 100644
--- a/hwdef-FET_7135.h
+++ b/hwdef-FET_7135.h
@@ -1,3 +1,6 @@
+#ifndef HWDEF_FET_7135_H
+#define HWDEF_FET_7135_H
+
/* FET + 7135 driver layout
* ----
* Reset -|1 8|- VCC
@@ -30,3 +33,6 @@
#define FAST 0xA3 // fast PWM both channels
#define PHASE 0xA1 // phase-correct PWM both channels
+#define LAYOUT_DEFINED
+
+#endif
diff --git a/hwdef-FF_PL47.h b/hwdef-FF_PL47.h
index 217ce45..5cd9684 100644
--- a/hwdef-FF_PL47.h
+++ b/hwdef-FF_PL47.h
@@ -1,3 +1,6 @@
+#ifndef HWDEF_FF_PL47_H
+#define HWDEF_FF_PL47_H
+
/* Fireflies PL47 driver layout
* same as a D4S, basically, except ...
*/
@@ -21,3 +24,4 @@
#undef FSM_EMISAR_D4S_DRIVER
#undef FSM_EMISAR_D4_DRIVER
+#endif
diff --git a/hwdef-FF_ROT66.h b/hwdef-FF_ROT66.h
index 0913a76..7348ab2 100644
--- a/hwdef-FF_ROT66.h
+++ b/hwdef-FF_ROT66.h
@@ -1,3 +1,6 @@
+#ifndef HWDEF_FF_ROT66_H
+#define HWDEF_FF_ROT66_H
+
/* Fireflies ROT66 driver layout
* same as a FW3A, basically, except ...
*/
@@ -19,3 +22,4 @@
#undef VISION_PIN
#endif
+#endif
diff --git a/hwdef-FW3A.h b/hwdef-FW3A.h
index 8abab9a..0b94635 100644
--- a/hwdef-FW3A.h
+++ b/hwdef-FW3A.h
@@ -1,3 +1,6 @@
+#ifndef HWDEF_FW3A_H
+#define HWDEF_FW3A_H
+
/* BLF/TLF FW3A driver layout
* ----
* Reset -|1 8|- VCC
@@ -45,3 +48,6 @@
#define FAST 0xA3 // fast PWM both channels
#define PHASE 0xA1 // phase-correct PWM both channels
+#define LAYOUT_DEFINED
+
+#endif
diff --git a/hwdef-Ferrero_Rocher.h b/hwdef-Ferrero_Rocher.h
index a46f19d..48519ef 100644
--- a/hwdef-Ferrero_Rocher.h
+++ b/hwdef-Ferrero_Rocher.h
@@ -1,3 +1,6 @@
+#ifndef HWDEF_FERRERO_ROCHER_H
+#define HWDEF_FERRERO_ROCHER_H
+
/* Ferrero Rocher driver layout
* ----
* Reset -|1 8|- VCC
@@ -9,3 +12,7 @@
// TODO: fill in this section, update Ferrero_Rocher code to use it.
#define FAST 0x23 // fast PWM channel 1 only
#define PHASE 0x21 // phase-correct PWM channel 1 only
+
+#define LAYOUT_DEFINED
+
+#endif
diff --git a/hwdef-TK_Saber.h b/hwdef-TK_Saber.h
index e90d5dd..3f49d30 100644
--- a/hwdef-TK_Saber.h
+++ b/hwdef-TK_Saber.h
@@ -1,3 +1,6 @@
+#ifndef HWDEF_TK_SABER_H
+#define HWDEF_TK_SABER_H
+
/* TK 4-color lightsaber driver layout
* ----
* Reset -|1 8|- VCC
@@ -31,3 +34,6 @@
#define FAST 0xA3 // fast PWM both channels
#define PHASE 0xA1 // phase-correct PWM both channels
+#define LAYOUT_DEFINED
+
+#endif
diff --git a/hwdef-Tripledown.h b/hwdef-Tripledown.h
index 4676e69..6bde976 100644
--- a/hwdef-Tripledown.h
+++ b/hwdef-Tripledown.h
@@ -1,3 +1,6 @@
+#ifndef HWDEF_TRIPLEDOWN_H
+#define HWDEF_TRIPLEDOWN_H
+
/* Tripledown driver layout
* ----
* Reset -|1 8|- VCC
@@ -31,3 +34,6 @@
#define FAST 0xA3 // fast PWM both channels
#define PHASE 0xA1 // phase-correct PWM both channels
+#define LAYOUT_DEFINED
+
+#endif
diff --git a/hwdef-nanjg.h b/hwdef-nanjg.h
index add10d1..135edbc 100644
--- a/hwdef-nanjg.h
+++ b/hwdef-nanjg.h
@@ -1,3 +1,6 @@
+#ifndef HWDEF_NANJG_H
+#define HWDEF_NANJG_H
+
/* NANJG driver layout
*/
#define STAR2_PIN PB0
@@ -14,3 +17,6 @@
#define FAST 0x23 // fast PWM channel 1 only
#define PHASE 0x21 // phase-correct PWM channel 1 only
+#define LAYOUT_DEFINED
+
+#endif
diff --git a/spaghetti-monster/anduril/anduril-manual.txt b/spaghetti-monster/anduril/anduril-manual.txt
new file mode 100644
index 0000000..cd4fe3e
--- /dev/null
+++ b/spaghetti-monster/anduril/anduril-manual.txt
@@ -0,0 +1,358 @@
+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, which should be provided along with the
+flashlight.
+
+
+Ramping / Stepped Ramping Modes
+-------------------------------
+
+Anduril's normal operation 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.
+
+There are four ways to access this mode when the light is off:
+
+ - Click: Turn on at the memorized brightness.
+ - Hold: Turn on at the floor level. The light should give a very
+ subtle dark blink when the user can let go of the button to stay at
+ the floor, or keep holding the button to ramp up.
+ - 2 clicks: Turn on at the ceiling level.
+ - Click, hold: Turn on at the ceiling level, then ramp down.
+
+While the light is on, a few basic actions are available:
+
+ - Click: Turn off.
+ - 2 clicks: Go to or from turbo (full power).
+ - Hold: 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.
+ - Click, hold: Change brightness (down).
+ - 3 clicks: Switch to the other ramp.
+ - 4 clicks: Go to ramp config mode.
+
+
+Other Modes
+-----------
+
+Anduril has several other modes too. To access these, press the button
+more than 2 times when the light is off:
+
+ - 3 clicks: Access the blinky / utility modes.
+ - Click, click, hold: Access the strobe modes.
+ - 4 clicks: Lockout mode.
+ - 5 clicks: Momentary mode.
+ - 6 clicks: Muggle mode.
+
+
+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 from there. The sequence is:
+
+ 1. Battery check.
+ 2. Sunset mode.
+ 3. Beacon mode.
+ 4. Temperature check.
+
+In all of these modes, some basic actions are available:
+
+ - Click: Turn off.
+ - 2 clicks: Next blinky mode.
+
+Additionally, in beacon and temperature check modes:
+
+ - 4 clicks: Go to the beacon config mode or thermal config mode.
+
+In more detail, this is what each blinky / utility mode does:
+
+ 1. 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.
+
+ 2. Sunset mode.
+
+ This starts at a low level, then dims gradually for an hour, and
+ then shuts off. It is intended for use when going to bed.
+
+ 3. Beacon mode.
+
+ Blinks at a slow speed. The light stays on for half a second, and
+ then stays off until the next blink. The brightness and the number
+ of seconds between pulses are configurable:
+
+ - Brightness is the user's last-ramped level, so set this in
+ ramping mode before starting beacon mode.
+
+ - Speed is configured in beacon config mode. Click 4 times to
+ enter beacon config mode, wait for the light to stutter, then
+ click to enter the number of seconds per blink. For example,
+ to do a 10-second alpine beacon, click 10 times.
+
+ 4. 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 click 4 times to enter thermal config mode,
+ and calibrate the sensor.
+
+ Thermal config mode 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.
+
+
+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:
+
+ - Click: Turn off.
+ - 2 Clicks: Next strobe / mood mode.
+ - Hold: Increase brightness, or strobe faster. (except lightning)
+ - Click, hold: Decrease brightness, or strobe slower. (except lightning)
+
+Additionally, candle mode has one more action:
+
+ - 3 clicks: Add 30 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%.
+
+ - 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.
+
+
+Lockout Mode
+------------
+
+Click 4 times from Off to enter Lockout mode. 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 return to the regular "off" mode.
+
+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 is determined by the floor setting of the current ramp.
+
+
+Momentary Mode
+--------------
+
+Click 5 times from Off to enter Momentary 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 and other
+signalling tasks.
+
+Brightness is the last-ramped level, so adjust that before entering
+momentary mode.
+
+To exit this mode, physically disconnect power by unscrewing the tailcap
+or battery tube.
+
+
+Muggle Mode
+-----------
+
+Click 6 times from Off to enter Muggle mode. This is a simpler and
+less-bright interface which makes the light relatively safe to lend to
+children or other people who could use the light unsafely.
+
+In Muggle mode, there are only a few available actions:
+
+ - Click: Turn the light on or off.
+ - Hold: Change brightness.
+ - 6 clicks: Exit Muggle mode.
+
+The brightness in this mode usually goes from about 10 lm to 300 lm.
+
+Muggle mode is remembered even after changing the battery. This helps
+prevent children from exiting the mode by unscrewing the tailcap.
+However, be sure to supervise children whenever they are using any
+powerful tools, including a bright flashlight.
+
+
+Configuration Modes
+-------------------
+
+Every config mode has the same interface. The menu has one or more
+options the user can configure, and it will go through them in order.
+For each menu item, the light will follow the same pattern:
+
+ - Blink one or more times, corresponding to the item number.
+
+ - 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.
+
+ - Pause, and then go to the next option.
+
+After the light has gone through all of the menu options, it should
+return to whatever mode the light was in before entering the config
+mode.
+
+If the user doesn't press a button during a menu item's "buzz" phase,
+that item remains unchanged from its previous value.
+
+
+Ramp Config Mode
+----------------
+
+While the light is on in a ramping mode, click 4 times to enter the
+config mode for the current ramp.
+
+For smooth ramping mode, there are two menu options:
+
+ 1. Floor. (default = 1/150)
+ 2. Ceiling. (default = 120/150)
+
+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)
+
+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 2
+to 150.
+
+
+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 a few times:
+
+ - Off mode: 7 clicks.
+ - Lockout mode: 3 clicks.
+
+This should change the aux LEDs to the next mode supported on this
+light.
+
+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 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.
diff --git a/spaghetti-monster/anduril/anduril.c b/spaghetti-monster/anduril/anduril.c
index ec16497..09c7927 100644
--- a/spaghetti-monster/anduril/anduril.c
+++ b/spaghetti-monster/anduril/anduril.c
@@ -19,20 +19,8 @@
*/
/********* User-configurable options *********/
-// Physical driver type (uncomment one of the following or define it at the gcc command line)
-//#define FSM_BLF_GT_DRIVER
-//#define FSM_BLF_GT_MINI_DRIVER
-//#define FSM_BLF_Q8_DRIVER
-//#define FSM_EMISAR_D1_DRIVER
-//#define FSM_EMISAR_D1S_DRIVER
-//#define FSM_EMISAR_D4_DRIVER
-//#define FSM_EMISAR_D4_219C_DRIVER
-//#define FSM_EMISAR_D4S_DRIVER
-//#define FSM_EMISAR_D4S_219C_DRIVER
-//#define FSM_FF_ROT66_DRIVER
-//#define FSM_FF_ROT66_219_DRIVER
-//#define FSM_FW3A_DRIVER
-//#define FSM_SOFIRN_SP36_DRIVER
+// Anduril config file name (set it here or define it at the gcc command line)
+//#define CONFIGFILE cfg-blf-q8.h
#define USE_LVP // FIXME: won't build when this option is turned off
@@ -76,49 +64,8 @@
//#define START_AT_MEMORIZED_LEVEL
/***** specific settings for known driver types *****/
-#if defined(FSM_BLF_GT_DRIVER)
-#include "cfg-blf-gt.h"
-
-#elif defined(FSM_BLF_GT_MINI_DRIVER)
-#include "cfg-blf-gt-mini.h"
-
-#elif defined(FSM_BLF_Q8_DRIVER)
-#include "cfg-blf-q8.h"
-
-#elif defined(FSM_EMISAR_D1_DRIVER)
-#include "cfg-emisar-d1.h"
-
-#elif defined(FSM_EMISAR_D1S_DRIVER)
-#include "cfg-emisar-d1s.h"
-
-#elif defined(FSM_EMISAR_D4_219C_DRIVER)
-#include "cfg-emisar-d4-219c.h"
-
-#elif defined(FSM_EMISAR_D4_DRIVER)
-#include "cfg-emisar-d4.h"
-
-#elif defined(FSM_EMISAR_D4S_219C_DRIVER)
-#include "cfg-emisar-d4s-219c.h"
-
-#elif defined(FSM_EMISAR_D4S_DRIVER)
-#include "cfg-emisar-d4s.h"
-
-#elif defined(FSM_FF_PL47_DRIVER)
-#include "cfg-ff-pl47.h"
-
-#elif defined(FSM_FF_ROT66_DRIVER)
-#include "cfg-ff-rot66.h"
-
-#elif defined(FSM_FF_ROT66_219_DRIVER)
-#include "cfg-ff-rot66-219.h"
-
-#elif defined(FSM_FW3A_DRIVER)
-#include "cfg-fw3a.h"
-
-#elif defined(FSM_SOFIRN_SP36_DRIVER)
-#include "cfg-sofirn-sp36.h"
-
-#endif
+#include "tk.h"
+#include incfile(CONFIGFILE)
// thermal properties, if not defined per-driver
@@ -245,6 +192,8 @@ uint8_t beacon_state(Event event, uint16_t arg);
uint8_t beacon_config_state(Event event, uint16_t arg);
// soft lockout
#define MOON_DURING_LOCKOUT_MODE
+// if enabled, 2nd lockout click goes to the other ramp's floor level
+//#define LOCKOUT_MOON_FANCY
uint8_t lockout_state(Event event, uint16_t arg);
// momentary / signalling mode
uint8_t momentary_state(Event event, uint16_t arg);
@@ -447,11 +396,6 @@ uint8_t off_state(Event event, uint16_t arg) {
set_state(steady_state, memorized_level);
return MISCHIEF_MANAGED;
}
- // 2 clicks (initial press): off, to prep for later events
- else if (event == EV_click2_press) {
- set_level(0);
- return MISCHIEF_MANAGED;
- }
// click, hold: go to highest level (ceiling) (for ramping down)
else if (event == EV_click2_hold) {
set_state(steady_state, MAX_LEVEL);
@@ -462,6 +406,11 @@ uint8_t off_state(Event event, uint16_t arg) {
set_state(steady_state, MAX_LEVEL);
return MISCHIEF_MANAGED;
}
+ // 3 clicks (initial press): off, to prep for later events
+ else if (event == EV_click3_press) {
+ set_level(0);
+ return MISCHIEF_MANAGED;
+ }
#ifdef USE_BATTCHECK
// 3 clicks: battcheck mode / blinky mode group 1
else if (event == EV_3clicks) {
@@ -1164,6 +1113,13 @@ uint8_t lockout_state(Event event, uint16_t arg) {
uint8_t lvl = ramp_smooth_floor;
if (ramp_discrete_floor < lvl) lvl = ramp_discrete_floor;
set_level(lvl);
+ #elif defined(LOCKOUT_MOON_FANCY)
+ uint8_t levels[] = { ramp_smooth_floor, ramp_discrete_floor };
+ if ((event & 0x0f) == 2) {
+ set_level(levels[ramp_style^1]);
+ } else {
+ set_level(levels[ramp_style]);
+ }
#else
// Use moon from current ramp
set_level(nearest_level(1));
@@ -1687,12 +1643,23 @@ void blink_confirm(uint8_t num) {
#if defined(USE_INDICATOR_LED) && defined(TICK_DURING_STANDBY)
// beacon-like mode for the indicator LED
void indicator_blink(uint8_t arg) {
+ #ifdef USE_FANCIER_BLINKING_INDICATOR
+
+ // fancy blink, set off/low/high levels here:
+ uint8_t seq[] = {0, 1, 2, 1, 0, 0, 0, 0,
+ 0, 0, 1, 0, 0, 0, 0, 0};
+ indicator_led(seq[arg & 15]);
+
+ #else // basic blink, 1/8th duty cycle
+
if (! (arg & 7)) {
indicator_led(2);
}
else {
indicator_led(0);
}
+
+ #endif
}
#endif
@@ -1781,6 +1748,8 @@ void save_config_wl() {
void low_voltage() {
StatePtr state = current_state;
+ // TODO: turn off aux LED(s) when power is really low
+
if (0) {} // placeholder
#ifdef USE_STROBE_STATE
@@ -1857,9 +1826,6 @@ void loop() {
StatePtr state = current_state;
- #ifdef USE_DYNAMIC_UNDERCLOCKING
- auto_clock_speed();
- #endif
if (0) {}
#ifdef USE_STROBE_STATE
@@ -1878,7 +1844,6 @@ void loop() {
uint8_t del = strobe_delays[st];
// TODO: make tac strobe brightness configurable?
set_level(STROBE_BRIGHTNESS);
- CLKPR = 1<<CLKPCE; CLKPR = 0; // run at full speed
if (st == party_strobe_e) { // party strobe
if (del < 42) delay_zero();
else nice_delay_ms(1);
diff --git a/spaghetti-monster/anduril/anduril.svg b/spaghetti-monster/anduril/anduril.svg
index 9fbb7d1..ab2926d 100644
--- a/spaghetti-monster/anduril/anduril.svg
+++ b/spaghetti-monster/anduril/anduril.svg
@@ -18,8 +18,8 @@
inkscape:version="0.92.1 r15371"
sodipodi:docname="anduril.svg"
inkscape:export-filename="/tmp/anduril-ui.png"
- inkscape:export-xdpi="114.26005"
- inkscape:export-ydpi="114.26005">
+ inkscape:export-xdpi="342.78015"
+ inkscape:export-ydpi="342.78015">
<defs
id="defs4">
<linearGradient
@@ -2469,6 +2469,188 @@
x2="1314.9019"
y2="761.10052"
gradientUnits="userSpaceOnUse" />
+ <marker
+ inkscape:stockid="Arrow1Mend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Mend-367-9-6"
+ style="overflow:visible">
+ <path
+ id="path3856-53-2-1"
+ d="M -4.2666667,0 -6.4,2.1333333 1.0666667,0 -6.4,-2.1333333 Z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:0.42666668pt"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Mend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Mend-367-9-2"
+ style="overflow:visible">
+ <path
+ id="path3856-53-2-99"
+ d="M -4.2666667,0 -6.4,2.1333333 1.0666667,0 -6.4,-2.1333333 Z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:0.42666668pt"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Mend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Mend-367-6-0-0"
+ style="overflow:visible">
+ <path
+ id="path3856-53-1-2-2"
+ d="M -4.2666667,0 -6.4,2.1333333 1.0666667,0 -6.4,-2.1333333 Z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:0.42666668pt"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Mend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Mend-79-0-6"
+ style="overflow:visible">
+ <path
+ id="path3856-20-7-1"
+ d="M -4.2666667,0 -6.4,2.1333333 1.0666667,0 -6.4,-2.1333333 Z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:0.42666668pt"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Mend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Mend-367-9-8-2"
+ style="overflow:visible">
+ <path
+ id="path3856-53-2-9-1"
+ d="M -4.2666667,0 -6.4,2.1333333 1.0666667,0 -6.4,-2.1333333 Z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:0.42666668pt"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Mend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Mend-62-70-9"
+ style="overflow:visible">
+ <path
+ id="path3856-91-4-9"
+ d="M -4.2666667,0 -6.4,2.1333333 1.0666667,0 -6.4,-2.1333333 Z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:0.42666668pt"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Mend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Mend-31-1-0-9-9-9"
+ style="overflow:visible">
+ <path
+ id="path3856-103-9-0-1-7-1"
+ d="M -4.2666667,0 -6.4,2.1333333 1.0666667,0 -6.4,-2.1333333 Z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:0.42666668pt"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Mend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Mend-367-3-5-7-0"
+ style="overflow:visible">
+ <path
+ id="path3856-53-8-86-9-4"
+ d="M -4.2666667,0 -6.4,2.1333333 1.0666667,0 -6.4,-2.1333333 Z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:0.42666668pt"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Mend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Mend-367-3-5-6-0"
+ style="overflow:visible">
+ <path
+ id="path3856-53-8-86-1-4"
+ d="M -4.2666667,0 -6.4,2.1333333 1.0666667,0 -6.4,-2.1333333 Z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:0.42666668pt"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Mend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Mend-367-3-8-4-9"
+ style="overflow:visible">
+ <path
+ id="path3856-53-8-8-0-6"
+ d="M -4.2666667,0 -6.4,2.1333333 1.0666667,0 -6.4,-2.1333333 Z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:0.42666668pt"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Mend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Mend-367-3-5-2-0"
+ style="overflow:visible">
+ <path
+ id="path3856-53-8-86-3-4"
+ d="M -4.2666667,0 -6.4,2.1333333 1.0666667,0 -6.4,-2.1333333 Z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:0.42666668pt"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Mend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Mend-367-3-5-2-2"
+ style="overflow:visible">
+ <path
+ id="path3856-53-8-86-3-2"
+ d="M -4.2666667,0 -6.4,2.1333333 1.0666667,0 -6.4,-2.1333333 Z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:0.42666668pt"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Mend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Mend-367-3-5-2-5"
+ style="overflow:visible">
+ <path
+ id="path3856-53-8-86-3-5"
+ d="M -4.2666667,0 -6.4,2.1333333 1.0666667,0 -6.4,-2.1333333 Z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:0.42666668pt"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Mend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Mend-367-3-5-0-0"
+ style="overflow:visible">
+ <path
+ id="path3856-53-8-86-6-2"
+ d="M -4.2666667,0 -6.4,2.1333333 1.0666667,0 -6.4,-2.1333333 Z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:0.42666668pt"
+ inkscape:connector-curvature="0" />
+ </marker>
</defs>
<sodipodi:namedview
id="base"
@@ -2477,7 +2659,7 @@
borderopacity="1.0"
inkscape:pageopacity="1"
inkscape:pageshadow="2"
- inkscape:zoom="1.2050864"
+ inkscape:zoom="1.2021109"
inkscape:cx="341.22418"
inkscape:cy="504.11322"
inkscape:document-units="px"
@@ -2485,7 +2667,7 @@
showgrid="false"
showguides="true"
gridtolerance="1"
- inkscape:window-width="2459"
+ inkscape:window-width="2548"
inkscape:window-height="1415"
inkscape:window-x="0"
inkscape:window-y="0"
@@ -2495,7 +2677,7 @@
fit-margin-right="0.5"
fit-margin-bottom="0.5"
units="cm"
- inkscape:snap-global="false"
+ inkscape:snap-global="true"
inkscape:snap-bbox="true"
inkscape:bbox-paths="true"
inkscape:bbox-nodes="true"
@@ -2607,6 +2789,32 @@
height="310.40146"
x="1058.2677"
y="758.40918" />
+ <path
+ style="fill:none;stroke:#009d00;stroke-width:2.13333344;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Mend-367-3-02)"
+ d="m 1597.9772,563.34418 c 0.4636,-0.36597 -0.021,1.8809 -0.045,6.26246"
+ id="path5213-6-8-4-9-9-56-6-0"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#009d00;stroke-width:2.13333344;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Mend-367-3-51)"
+ d="m 1577.5842,684.90662 c 0.4636,-0.36597 -1.5747,0.4784 -6.1098,2.54774"
+ id="path5213-6-8-4-9-9-56-6-8"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#009d00;stroke-width:2.13333344;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Mend-367-3-50)"
+ d="m 1405.234,654.99099 c 0.4636,-0.36597 0.5015,-1.74928 0.3311,-4.86628"
+ id="path5213-6-8-4-9-9-56-6-6"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.00000004;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect14693-4"
+ width="192.66586"
+ height="169.39575"
+ x="1405.2867"
+ y="520.16724"
+ rx="37" />
<g
id="g14799"
transform="translate(-1.0079016)">
@@ -3017,10 +3225,11 @@
style="opacity:1;fill:#c0c0c0;fill-opacity:1;stroke:#040000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
</g>
<path
- style="opacity:1;fill:#c0c0c0;fill-opacity:1;stroke:#040000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:4, 4;stroke-dashoffset:0;stroke-opacity:1"
- d="m 1319.7047,180.764 h 37.7525"
+ style="opacity:1;fill:#c0c0c0;fill-opacity:1;stroke:#040000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:4,4;stroke-dashoffset:6.1;stroke-opacity:1"
+ d="m 1319.7047,180.764 69.7795,0"
id="path15687-2-6"
- inkscape:connector-curvature="0" />
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#009d00;stroke-width:2.13333344;stroke-miterlimit:4;stroke-dasharray:12.8, 2.13333333;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Mend-367-6-0)"
d="m 1131.0344,258.42719 c 48.1809,-3.99296 64.2076,-2.68523 79.9712,-42.47521 42.8072,-108.05255 133.489,-146.16407 131.2384,-34.5044"
@@ -3028,10 +3237,11 @@
inkscape:connector-curvature="0"
sodipodi:nodetypes="csc" />
<path
- style="opacity:1;fill:#c0c0c0;fill-opacity:1;stroke:#040000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:4, 4;stroke-dashoffset:0;stroke-opacity:1"
- d="m 1319.7047,381.98134 h 37.7525"
+ style="opacity:1;fill:#c0c0c0;fill-opacity:1;stroke:#040000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:4,4;stroke-dashoffset:3.5;stroke-opacity:1"
+ d="m 1319.7047,381.98134 64.5803,0"
id="path15687-9-5"
- inkscape:connector-curvature="0" />
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:24px;line-height:0%;font-family:'DejaVu Sans';-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
@@ -3387,28 +3597,6 @@
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
<g
- transform="translate(980.51459,-148.00986)"
- id="g23629-5-4">
- <ellipse
- style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:4.26666689;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
- id="path3639-2-0-8"
- cx="140.59442"
- cy="435.21741"
- rx="48.48732"
- ry="29.092394" />
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.06666672"
- x="112.51038"
- y="444.62402"
- id="text3021-8-9-7"><tspan
- sodipodi:role="line"
- id="tspan3023-4-6-0"
- x="112.51038"
- y="444.62402"
- style="font-size:25.60000038px;line-height:1.25;stroke-width:1.06666672">OFF</tspan></text>
- </g>
- <g
transform="translate(969.27179,76.164687)"
id="g23629-5-4-8">
<ellipse
@@ -3592,198 +3780,6 @@
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
<g
- id="g14659"
- transform="translate(0,-45.458105)">
- <path
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0"
- id="path5213-6-8-4-9-9-56-6-28-20"
- d="m 1293.1165,914.73803 c 22.9934,5.0006 51.8174,18.31502 72.3787,39.21347"
- style="fill:none;stroke:#009d00;stroke-width:2.13333344;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Mend-367-3-5-7)" />
- <path
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0"
- id="path5213-6-8-4-9-9-56-6-28-2"
- d="m 1094.1498,960.95909 c 17.8272,-22.80331 42.9724,-34.59893 64.3085,-42.39665"
- style="fill:none;stroke:#009d00;stroke-width:2.13333344;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Mend-367-3-5-0)" />
- <path
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0"
- id="path5213-6-8-4-9-9-56-6-28-7"
- d="m 1099.1838,1048.3297 c -10.8263,-13.3296 -17.2825,-22.994 -19.3174,-41.9076"
- style="fill:none;stroke:#009d00;stroke-width:2.13333344;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Mend-367-3-5-2)" />
- <path
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0"
- id="path5213-6-8-4-9-9-56-6-28-8"
- d="m 1386.1562,998.74948 c -0.01,16.47992 -3.5377,27.95532 -16.4966,45.71352"
- style="fill:none;stroke:#009d00;stroke-width:2.13333344;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Mend-367-3-5-6)" />
- <path
- sodipodi:nodetypes="cc"
- inkscape:connector-curvature="0"
- id="path5213-6-8-4-9-9-56-6-9-6"
- d="m 1286.1122,1090.3622 c -32.6374,7.6868 -68.0318,7.3275 -98.7961,1.9808"
- style="fill:none;stroke:#009d00;stroke-width:2.13333344;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Mend-367-3-8-4)" />
- <g
- transform="translate(0.00410028,9.005851)"
- id="g7243">
- <g
- id="g28835"
- transform="translate(81.09879,-12.221496)">
- <text
- id="text3021-8-4-1-8-8-2-7"
- y="981.17542"
- x="1222.7643"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans';-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
- xml:space="preserve"><tspan
- style="font-size:25.60000038px;line-height:1.25;stroke-width:1.06666672"
- y="981.17542"
- x="1222.7643"
- id="tspan3023-4-0-1-9-63-8-7"
- sodipodi:role="line">Bike</tspan></text>
- <ellipse
- ry="29.092394"
- rx="67.643234"
- cy="986.1272"
- cx="1248.0287"
- id="path3639-4-4-9-5"
- style="fill:none;stroke:#000000;stroke-width:3.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
- <text
- id="text3021-8-4-1-8-8-2-7-4"
- y="1005.0751"
- x="1202.3188"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans';-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
- xml:space="preserve"><tspan
- style="font-size:25.60000038px;line-height:1.25;stroke-width:1.06666672"
- y="1005.0751"
- x="1202.3188"
- id="tspan3023-4-0-1-9-63-8-7-8"
- sodipodi:role="line">Flasher</tspan></text>
- </g>
- <g
- id="g28877"
- transform="translate(-82.541209,-37.878365)">
- <text
- id="text3021-8-4-1-8-8-2-7-2"
- y="1087.1008"
- x="1357.3134"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans';-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
- xml:space="preserve"><tspan
- style="font-size:25.60000038px;line-height:1.25;stroke-width:1.06666672"
- y="1087.1008"
- x="1357.3134"
- id="tspan3023-4-0-1-9-63-8-7-89"
- sodipodi:role="line">Party</tspan></text>
- <ellipse
- ry="29.092394"
- rx="67.643234"
- cy="1091.3002"
- cx="1388.598"
- id="path3639-4-4-9-5-3"
- style="fill:none;stroke:#000000;stroke-width:3.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
- <text
- id="text3021-8-4-1-8-8-2-7-4-6"
- y="1111.7531"
- x="1345.8983"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans';-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
- xml:space="preserve"><tspan
- style="font-size:25.60000038px;line-height:1.25;stroke-width:1.06666672"
- y="1111.7531"
- x="1345.8983"
- id="tspan3023-4-0-1-9-63-8-7-8-8"
- sodipodi:role="line">Strobe</tspan></text>
- </g>
- <g
- id="g28919"
- transform="translate(-88.581451,-166.13611)">
- <text
- id="text3021-8-4-1-8-8-2-7-2-2"
- y="1219.2247"
- x="1200.4392"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans';-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
- xml:space="preserve"><tspan
- style="font-size:25.60000038px;line-height:1.25;stroke-width:1.06666672"
- y="1219.2247"
- x="1200.4392"
- id="tspan3023-4-0-1-9-63-8-7-89-1"
- sodipodi:role="line">Tactical</tspan></text>
- <ellipse
- ry="29.092394"
- rx="67.643234"
- cy="1218.9089"
- cx="1247.527"
- id="path3639-4-4-9-5-3-0"
- style="fill:none;stroke:#000000;stroke-width:3.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
- <text
- id="text3021-8-4-1-8-8-2-7-4-6-5"
- y="1239.3618"
- x="1204.8273"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans';-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
- xml:space="preserve"><tspan
- style="font-size:25.60000038px;line-height:1.25;stroke-width:1.06666672"
- y="1239.3618"
- x="1204.8273"
- id="tspan3023-4-0-1-9-63-8-7-8-8-1"
- sodipodi:role="line">Strobe</tspan></text>
- </g>
- <g
- id="g28961"
- transform="translate(-2.2028768,-134.13011)">
- <text
- id="text3021-8-4-1-8-8-2-7-2-2-0"
- y="1109.4977"
- x="1088.8826"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:21.33333397px;line-height:0%;font-family:'DejaVu Sans';-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
- xml:space="preserve"><tspan
- style="font-size:21.33333397px;line-height:1.25;stroke-width:1.06666672"
- y="1109.4977"
- x="1088.8826"
- id="tspan3023-4-0-1-9-63-8-7-89-1-8"
- sodipodi:role="line">Lightning</tspan></text>
- <ellipse
- ry="29.092394"
- rx="67.643234"
- cy="1109.5366"
- cx="1139.1631"
- id="path3639-4-4-9-5-3-0-5"
- style="fill:none;stroke:#000000;stroke-width:3.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
- <text
- id="text3021-8-4-1-8-8-2-7-4-6-5-0"
- y="1131.0537"
- x="1106.3962"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:21.33333397px;line-height:0%;font-family:'DejaVu Sans';-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
- xml:space="preserve"><tspan
- style="font-size:21.33333397px;line-height:1.25;stroke-width:1.06666672"
- y="1131.0537"
- x="1106.3962"
- id="tspan3023-4-0-1-9-63-8-7-8-8-1-6"
- sodipodi:role="line">Storm</tspan></text>
- </g>
- <g
- id="g5944"
- transform="translate(2.1928969,2.1881554)">
- <text
- id="text3021-8-4-1-8-8-2-7-2-2-0-6"
- y="923.39539"
- x="1182.9138"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25.60000038px;line-height:0%;font-family:'DejaVu Sans';-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
- xml:space="preserve"><tspan
- style="font-size:25.60000038px;line-height:1.25;stroke-width:1.06666672"
- y="923.39539"
- x="1182.9138"
- id="tspan3023-4-0-1-9-63-8-7-89-1-8-7"
- sodipodi:role="line">Candle</tspan></text>
- <ellipse
- ry="29.092394"
- rx="67.643234"
- cy="913.85162"
- cx="1227.4263"
- id="path3639-4-4-9-5-3-0-5-5"
- style="fill:none;stroke:#000000;stroke-width:3.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
- </g>
- </g>
- </g>
- <g
id="g14617"
transform="translate(-13.294351,-32.815344)">
<path
@@ -3837,24 +3833,6 @@
d="m 1298.1704,855.8694 c 75.92,10.10449 72.6994,-54.50393 12.2633,-55.89492 -51.6628,-1.18906 -74.3675,75.06672 15.6104,66.18339"
style="fill:none;stroke:#009d00;stroke-width:2.1329999;stroke-miterlimit:4;stroke-dasharray:12.798, 2.133;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Mend-31-1-0-9-9)" />
</g>
- <path
- style="fill:none;stroke:#009d00;stroke-width:2.13333344;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Mend-367-3-02)"
- d="m 1597.9772,563.34418 c 0.4636,-0.36597 -0.021,1.8809 -0.045,6.26246"
- id="path5213-6-8-4-9-9-56-6-0"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc" />
- <path
- style="fill:none;stroke:#009d00;stroke-width:2.13333344;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Mend-367-3-51)"
- d="m 1577.5842,684.90662 c 0.4636,-0.36597 -1.5747,0.4784 -6.1098,2.54774"
- id="path5213-6-8-4-9-9-56-6-8"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc" />
- <path
- style="fill:none;stroke:#009d00;stroke-width:2.13333344;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Mend-367-3-50)"
- d="m 1405.234,654.99099 c 0.4636,-0.36597 0.5015,-1.74928 0.3311,-4.86628"
- id="path5213-6-8-4-9-9-56-6-6"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans';-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
@@ -4038,94 +4016,394 @@
id="path5213-6-8-4-9-9-1-3-0-0-3-0"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
- <path
- style="fill:none;stroke:#000000;stroke-width:2.13333344;stroke-miterlimit:4;stroke-dasharray:4.26666689, 4.26666689;stroke-dashoffset:2.13333344;stroke-opacity:1;marker-end:url(#Arrow1Mend-88-1)"
- d="m 1262.9626,853.74322 c 45.3646,10.29118 76.432,-7.96445 88.9489,-15.20313"
- id="path5213-6-8-4-9-9-8-3-5"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cc" />
- <text
- xml:space="preserve"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:14.66666698px;line-height:110.00000238%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- x="1342.4323"
- y="857.24713"
- id="text39623-3"><tspan
- sodipodi:role="line"
- x="1342.4323"
- y="857.24713"
- id="tspan39625-1">+30 min</tspan></text>
<g
- id="g7705">
- <circle
- r="22.470001"
- cy="821.88452"
- cx="1375.8579"
- id="path7491"
- style="opacity:1;fill:url(#linearGradient7569);fill-opacity:1;stroke:url(#linearGradient7692);stroke-width:1.715;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
- <ellipse
- ry="20.7346"
- rx="20.29092"
- cy="821.88452"
- cx="1375.8579"
- id="path7491-8"
- style="opacity:1;fill:#fcfcfd;fill-opacity:1;stroke:none;stroke-width:1.83983243;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
- <path
- transform="rotate(-90)"
- d="m -801.14121,1375.8579 a 20.743311,20.29092 0 0 1 -10.37166,17.5725 20.743311,20.29092 0 0 1 -20.74331,0 20.743311,20.29092 0 0 1 -10.37165,-17.5725"
- sodipodi:open="true"
- sodipodi:end="3.1415927"
- sodipodi:start="0"
- sodipodi:ry="20.29092"
- sodipodi:rx="20.743311"
- sodipodi:cy="1375.8579"
- sodipodi:cx="-821.88452"
- sodipodi:type="arc"
- id="path7491-5"
- style="opacity:1;fill:url(#linearGradient7538);fill-opacity:1;stroke:none;stroke-width:1.84021866;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ id="g25629">
<path
+ sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
- id="path7493"
- d="m 1355.307,821.88451 h 3.8436"
- style="opacity:1;fill:none;fill-opacity:1;stroke:#7b7b7b;stroke-width:1.3436662;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ id="path5213-6-8-4-9-9-56-6-28-20"
+ d="m 1293.1165,869.27992 c 22.9934,5.0006 51.8174,18.31502 72.3787,39.21347"
+ style="fill:none;stroke:#009d00;stroke-width:2.13333344;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Mend-367-3-5-7)" />
<path
+ sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
- id="path7495"
- d="m 1396.1468,821.88451 h -3.3507"
- style="opacity:1;fill:none;fill-opacity:1;stroke:#7b7b7b;stroke-width:1.3436662;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ id="path5213-6-8-4-9-9-56-6-28-2"
+ d="m 1094.1498,915.50098 c 17.8272,-22.80331 42.9724,-34.59893 64.3085,-42.39665"
+ style="fill:none;stroke:#009d00;stroke-width:2.13333344;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Mend-367-3-5-0)" />
<path
+ style="fill:none;stroke:#ffffff;stroke-width:1.00000004;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Mend-367-3-5-0-0)"
+ d="m 1094.1498,915.50098 c 17.8272,-22.80331 42.9724,-34.59893 64.3085,-42.39665"
+ id="path5213-6-8-4-9-9-56-6-28-2-8"
inkscape:connector-curvature="0"
- id="path7497"
- d="m 1375.8579,801.14199 v 3.54788"
- style="opacity:1;fill:none;fill-opacity:1;stroke:#7b7b7b;stroke-width:1.3436662;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ sodipodi:nodetypes="cc" />
<path
+ sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
- id="path7499"
- d="m 1375.8579,842.61913 v -3.64646"
- style="opacity:1;fill:none;fill-opacity:1;stroke:#7b7b7b;stroke-width:1.3436662;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ id="path5213-6-8-4-9-9-56-6-28-7"
+ d="m 1099.1838,1002.8716 c -10.8263,-13.32961 -17.2825,-22.994 -19.3174,-41.90761"
+ style="fill:none;stroke:#009d00;stroke-width:2.13333344;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Mend-367-3-5-2)" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path5213-6-8-4-9-9-56-6-28-8"
+ d="m 1386.1562,953.29137 c -0.01,16.47992 -3.5377,27.95532 -16.4966,45.71352"
+ style="fill:none;stroke:#009d00;stroke-width:2.13333344;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Mend-367-3-5-6)" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path5213-6-8-4-9-9-56-6-9-6"
+ d="m 1286.1122,1044.9041 c -32.6374,7.6868 -68.0318,7.3275 -98.7961,1.9808"
+ style="fill:none;stroke:#009d00;stroke-width:2.13333344;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Mend-367-3-8-4)" />
<path
- sodipodi:nodetypes="ccccc"
+ style="fill:none;stroke:#ffffff;stroke-width:1.00000004;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Mend-367-3-5-7-0)"
+ d="m 1293.1165,869.27993 c 22.9934,5.0006 51.8174,18.31502 72.3787,39.21347"
+ id="path5213-6-8-4-9-9-56-6-28-20-8"
inkscape:connector-curvature="0"
- id="path7505"
- d="m 1374.5713,821.88451 1.1658,17.72796 h 0.34 l 1.0673,-17.72796 z"
- style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#010109;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.01549935;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ sodipodi:nodetypes="cc" />
<path
- sodipodi:nodetypes="ccccc"
+ style="fill:none;stroke:#ffffff;stroke-width:1.00000004;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Mend-367-3-5-6-0)"
+ d="m 1386.1562,953.29137 c -0.01,16.47992 -3.5377,27.95532 -16.4966,45.71352"
+ id="path5213-6-8-4-9-9-56-6-28-8-2"
inkscape:connector-curvature="0"
- id="path7594"
- d="m 1392.31,822.12981 c 0,7.79405 -7.5434,14.85118 -14.018,14.85118 v 1.34367 c 7.4212,0 14.1074,-7.62913 14.1074,-16.19485 z"
- style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#0b0b0b;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.3436662;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ sodipodi:nodetypes="cc" />
<path
- sodipodi:nodetypes="ccccc"
+ style="fill:none;stroke:#ffffff;stroke-width:1.00000004;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Mend-367-3-8-4-9)"
+ d="m 1286.1122,1044.9041 c -32.6374,7.6868 -68.0318,7.3275 -98.7961,1.9808"
+ id="path5213-6-8-4-9-9-56-6-9-6-1"
inkscape:connector-curvature="0"
- id="path7594-3"
- d="m 1388.7657,822.05276 c 0,5.76689 -5.5816,10.98852 -10.3722,10.98852 v 0.9942 c 5.4909,0 10.4382,-5.64487 10.4382,-11.98272 z"
- style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#0b0b0b;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99419165;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ sodipodi:nodetypes="cc" />
<path
- sodipodi:nodetypes="ccccc"
+ style="fill:none;stroke:#f6fcf6;stroke-width:1.00000004;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Mend-367-3-5-2-0)"
+ d="m 1099.1838,1002.8716 c -10.8263,-13.3296 -17.2825,-22.994 -19.3174,-41.9076"
+ id="path5213-6-8-4-9-9-56-6-28-7-2"
inkscape:connector-curvature="0"
- id="path7594-36"
- d="m 1385.327,822.06555 c 0,3.80652 -3.6842,7.25313 -6.8462,7.25313 v 0.65624 c 3.6244,0 6.8899,-3.72599 6.8899,-7.90937 z"
- style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#0b0b0b;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.65623033;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ sodipodi:nodetypes="cc" />
+ <g
+ transform="translate(0.00410028,-36.452254)"
+ id="g7243">
+ <g
+ id="g28835"
+ transform="translate(81.09879,-12.221496)">
+ <text
+ id="text3021-8-4-1-8-8-2-7"
+ y="981.17542"
+ x="1222.7643"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans';-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ style="font-size:25.60000038px;line-height:1.25;stroke-width:1.06666672"
+ y="981.17542"
+ x="1222.7643"
+ id="tspan3023-4-0-1-9-63-8-7"
+ sodipodi:role="line">Bike</tspan></text>
+ <ellipse
+ ry="29.092394"
+ rx="67.643234"
+ cy="986.1272"
+ cx="1248.0287"
+ id="path3639-4-4-9-5"
+ style="fill:none;stroke:#000000;stroke-width:3.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <text
+ id="text3021-8-4-1-8-8-2-7-4"
+ y="1005.0751"
+ x="1202.3188"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans';-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ style="font-size:25.60000038px;line-height:1.25;stroke-width:1.06666672"
+ y="1005.0751"
+ x="1202.3188"
+ id="tspan3023-4-0-1-9-63-8-7-8"
+ sodipodi:role="line">Flasher</tspan></text>
+ </g>
+ <g
+ id="g28877"
+ transform="translate(-82.541209,-37.878365)">
+ <text
+ id="text3021-8-4-1-8-8-2-7-2"
+ y="1087.1008"
+ x="1357.3134"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans';-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ style="font-size:25.60000038px;line-height:1.25;stroke-width:1.06666672"
+ y="1087.1008"
+ x="1357.3134"
+ id="tspan3023-4-0-1-9-63-8-7-89"
+ sodipodi:role="line">Party</tspan></text>
+ <ellipse
+ ry="29.092394"
+ rx="67.643234"
+ cy="1091.3002"
+ cx="1388.598"
+ id="path3639-4-4-9-5-3"
+ style="fill:none;stroke:#000000;stroke-width:3.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <text
+ id="text3021-8-4-1-8-8-2-7-4-6"
+ y="1111.7531"
+ x="1345.8983"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans';-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ style="font-size:25.60000038px;line-height:1.25;stroke-width:1.06666672"
+ y="1111.7531"
+ x="1345.8983"
+ id="tspan3023-4-0-1-9-63-8-7-8-8"
+ sodipodi:role="line">Strobe</tspan></text>
+ </g>
+ <g
+ id="g28919"
+ transform="translate(-88.581451,-166.13611)">
+ <text
+ id="text3021-8-4-1-8-8-2-7-2-2"
+ y="1219.2247"
+ x="1200.4392"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans';-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ style="font-size:25.60000038px;line-height:1.25;stroke-width:1.06666672"
+ y="1219.2247"
+ x="1200.4392"
+ id="tspan3023-4-0-1-9-63-8-7-89-1"
+ sodipodi:role="line">Tactical</tspan></text>
+ <ellipse
+ ry="29.092394"
+ rx="67.643234"
+ cy="1218.9089"
+ cx="1247.527"
+ id="path3639-4-4-9-5-3-0"
+ style="fill:none;stroke:#000000;stroke-width:3.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <text
+ id="text3021-8-4-1-8-8-2-7-4-6-5"
+ y="1239.3618"
+ x="1204.8273"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans';-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ style="font-size:25.60000038px;line-height:1.25;stroke-width:1.06666672"
+ y="1239.3618"
+ x="1204.8273"
+ id="tspan3023-4-0-1-9-63-8-7-8-8-1"
+ sodipodi:role="line">Strobe</tspan></text>
+ </g>
+ <g
+ id="g28961"
+ transform="translate(-2.2028768,-134.13011)">
+ <text
+ id="text3021-8-4-1-8-8-2-7-2-2-0"
+ y="1109.4977"
+ x="1088.8826"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:21.33333397px;line-height:0%;font-family:'DejaVu Sans';-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ style="font-size:21.33333397px;line-height:1.25;stroke-width:1.06666672"
+ y="1109.4977"
+ x="1088.8826"
+ id="tspan3023-4-0-1-9-63-8-7-89-1-8"
+ sodipodi:role="line">Lightning</tspan></text>
+ <ellipse
+ ry="29.092394"
+ rx="67.643234"
+ cy="1109.5366"
+ cx="1139.1631"
+ id="path3639-4-4-9-5-3-0-5"
+ style="fill:none;stroke:#000000;stroke-width:3.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <text
+ id="text3021-8-4-1-8-8-2-7-4-6-5-0"
+ y="1131.0537"
+ x="1106.3962"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:21.33333397px;line-height:0%;font-family:'DejaVu Sans';-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ style="font-size:21.33333397px;line-height:1.25;stroke-width:1.06666672"
+ y="1131.0537"
+ x="1106.3962"
+ id="tspan3023-4-0-1-9-63-8-7-8-8-1-6"
+ sodipodi:role="line">Storm</tspan></text>
+ </g>
+ <g
+ id="g5944"
+ transform="translate(2.1928969,2.1881554)">
+ <text
+ id="text3021-8-4-1-8-8-2-7-2-2-0-6"
+ y="923.39539"
+ x="1182.9138"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25.60000038px;line-height:0%;font-family:'DejaVu Sans';-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ xml:space="preserve"><tspan
+ style="font-size:25.60000038px;line-height:1.25;stroke-width:1.06666672"
+ y="923.39539"
+ x="1182.9138"
+ id="tspan3023-4-0-1-9-63-8-7-89-1-8-7"
+ sodipodi:role="line">Candle</tspan></text>
+ <ellipse
+ ry="29.092394"
+ rx="67.643234"
+ cy="913.85162"
+ cx="1227.4263"
+ id="path3639-4-4-9-5-3-0-5-5"
+ style="fill:none;stroke:#000000;stroke-width:3.20000005;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+ </g>
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path5213-6-8-4-9-9-8-3-5"
+ d="m 1262.9626,853.74322 c 45.3646,10.29118 76.432,-7.96445 88.9489,-15.20313"
+ style="fill:none;stroke:#000000;stroke-width:2.13333344;stroke-miterlimit:4;stroke-dasharray:4.26666689, 4.26666689;stroke-dashoffset:2.13333344;stroke-opacity:1;marker-end:url(#Arrow1Mend-88-1)" />
+ <text
+ id="text39623-3"
+ y="857.24713"
+ x="1342.4323"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:14.66666698px;line-height:110.00000238%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ id="tspan39625-1"
+ y="857.24713"
+ x="1342.4323"
+ sodipodi:role="line">+30 min</tspan></text>
+ <g
+ id="g7705">
+ <circle
+ style="opacity:1;fill:url(#linearGradient7569);fill-opacity:1;stroke:url(#linearGradient7692);stroke-width:1.715;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path7491"
+ cx="1375.8579"
+ cy="821.88452"
+ r="22.470001" />
+ <ellipse
+ style="opacity:1;fill:#fcfcfd;fill-opacity:1;stroke:none;stroke-width:1.83983243;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path7491-8"
+ cx="1375.8579"
+ cy="821.88452"
+ rx="20.29092"
+ ry="20.7346" />
+ <path
+ style="opacity:1;fill:url(#linearGradient7538);fill-opacity:1;stroke:none;stroke-width:1.84021866;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path7491-5"
+ sodipodi:type="arc"
+ sodipodi:cx="-821.88452"
+ sodipodi:cy="1375.8579"
+ sodipodi:rx="20.743311"
+ sodipodi:ry="20.29092"
+ sodipodi:start="0"
+ sodipodi:end="3.1415927"
+ sodipodi:open="true"
+ d="m -801.14121,1375.8579 a 20.743311,20.29092 0 0 1 -10.37166,17.5725 20.743311,20.29092 0 0 1 -20.74331,0 20.743311,20.29092 0 0 1 -10.37165,-17.5725"
+ transform="rotate(-90)" />
+ <path
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#7b7b7b;stroke-width:1.3436662;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 1355.307,821.88451 h 3.8436"
+ id="path7493"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#7b7b7b;stroke-width:1.3436662;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 1396.1468,821.88451 h -3.3507"
+ id="path7495"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#7b7b7b;stroke-width:1.3436662;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 1375.8579,801.14199 v 3.54788"
+ id="path7497"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#7b7b7b;stroke-width:1.3436662;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 1375.8579,842.61913 v -3.64646"
+ id="path7499"
+ inkscape:connector-curvature="0" />
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#010109;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.01549935;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 1374.5713,821.88451 1.1658,17.72796 h 0.34 l 1.0673,-17.72796 z"
+ id="path7505"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#0b0b0b;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.3436662;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 1392.31,822.12981 c 0,7.79405 -7.5434,14.85118 -14.018,14.85118 v 1.34367 c 7.4212,0 14.1074,-7.62913 14.1074,-16.19485 z"
+ id="path7594"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#0b0b0b;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99419165;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 1388.7657,822.05276 c 0,5.76689 -5.5816,10.98852 -10.3722,10.98852 v 0.9942 c 5.4909,0 10.4382,-5.64487 10.4382,-11.98272 z"
+ id="path7594-3"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#0b0b0b;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.65623033;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m 1385.327,822.06555 c 0,3.80652 -3.6842,7.25313 -6.8462,7.25313 v 0.65624 c 3.6244,0 6.8899,-3.72599 6.8899,-7.90937 z"
+ id="path7594-36"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ </g>
</g>
+ <path
+ style="fill:none;stroke:#ffffff;stroke-width:1.00000004;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Mend-367-9-6)"
+ d="m 1499.2534,277.65781 c 49.5295,21.01119 54.6565,-32.82142 113.6548,0"
+ id="path5213-6-8-4-9-9-56-7-15"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#fcfffc;stroke-width:1.00000004;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:2.9862002;stroke-opacity:1;marker-end:url(#Arrow1Mend-367-9-2)"
+ d="m 1498.1078,321.38191 c 49.5295,21.0112 54.6565,-32.82141 113.6548,0"
+ id="path5213-6-8-4-9-9-9-29-90-6"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#ffffff;stroke-width:1.00000004;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Mend-367-6-0-0)"
+ d="m 1131.0344,258.42719 c 48.1809,-3.99296 64.2076,-2.68523 79.9712,-42.47521 42.8072,-108.05255 133.489,-146.164071 131.2384,-34.5044"
+ id="path5213-6-8-4-9-9-9-29-5-2-7"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="csc" />
+ <path
+ style="fill:none;stroke:#ffffff;stroke-width:1.00000004;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Mend-79-0-6)"
+ d="m 1159.4045,270.23739 c 108.4581,4.22547 23.1574,-88.17063 154.3238,-89.5992"
+ id="path5213-6-8-4-9-9-8-2-0-3"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <g
+ transform="translate(980.51459,-148.00986)"
+ id="g23629-5-4">
+ <ellipse
+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:4.26666689;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path3639-2-0-8"
+ cx="140.59442"
+ cy="435.21741"
+ rx="48.48732"
+ ry="29.092394" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.06666672"
+ x="112.51038"
+ y="444.62402"
+ id="text3021-8-9-7"><tspan
+ sodipodi:role="line"
+ id="tspan3023-4-6-0"
+ x="112.51038"
+ y="444.62402"
+ style="font-size:25.60000038px;line-height:1.25;stroke-width:1.06666672">OFF</tspan></text>
+ </g>
+ <path
+ style="fill:none;stroke:#ffffff;stroke-width:1.00000004;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Mend-367-9-8-2)"
+ d="m 1364.0175,147.54301 c 29.3791,49.77199 28.7391,140.19451 -0.7576,180.57634"
+ id="path5213-6-8-4-9-9-56-7-1-5"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#ffffff;stroke-width:1.00000004;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Mend-62-70-9)"
+ d="M 1419.75,188.60753 V 372.1669"
+ id="path5213-6-8-2-4-1"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <g
+ id="g25632">
+ <path
+ sodipodi:nodetypes="csc"
+ inkscape:connector-curvature="0"
+ id="path5213-6-8-4-9-9-9-4-6-4-2-3-7"
+ d="m 1284.876,826.56171 c 75.92,10.10449 72.6994,-54.50393 12.2633,-55.89492 -51.6628,-1.18906 -74.3675,75.06672 15.6104,66.18339"
+ style="fill:none;stroke:#ffffff;stroke-width:1.00000004;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Mend-31-1-0-9-9-9)" />
+ </g>
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path5213-6-8-4-9-9-56-6-28-7-0"
+ d="M 23.378604,46.366264 C 12.552304,33.036664 6.0961038,23.372264 4.0612038,4.458664"
+ style="fill:none;stroke:#009d00;stroke-width:2.13333344;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Mend-367-3-5-2-2)" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path5213-6-8-4-9-9-56-6-28-7-29"
+ d="M 23.378604,46.366264 C 12.552304,33.036664 6.0961038,23.372264 4.0612038,4.458664"
+ style="fill:none;stroke:#009d00;stroke-width:2.13333344;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow1Mend-367-3-5-2-5)" />
</g>
</svg>
diff --git a/spaghetti-monster/anduril/anduril.txt b/spaghetti-monster/anduril/anduril.txt
index f0f0b4d..3e0328c 100644
--- a/spaghetti-monster/anduril/anduril.txt
+++ b/spaghetti-monster/anduril/anduril.txt
@@ -21,7 +21,7 @@ From off:
* 7 clicks: Change aux LED mode used in "off" mode.
(the modes are usually off/low/high/blinking)
-In steady mode:
+In steady / ramping mode:
* 1 click: off
* Hold: ramp up
* Click, hold: ramp down
@@ -30,19 +30,17 @@ In steady mode:
* 4 clicks: configure current ramp
Smooth ramp config mode:
- - Setting 1: memory on/off (not implemented yet)
- * Setting 2: low end
+ * Setting 1: low end
(click N times to set ramp floor to level N)
- * Setting 3: high end
+ * Setting 2: high end
(click N times to set ramp ceiling to level "151 - N")
Discrete ramp config mode:
- - Setting 1: memory on/off (not implemented yet)
- * Setting 2: low end
+ * Setting 1: low end
(click N times to set ramp floor to level N)
- * Setting 3: high end
+ * Setting 2: high end
(click N times to set ramp ceiling to level "151 - N")
- * Setting 4: number of levels in discrete ramp
+ * Setting 3: number of levels in discrete ramp
(click N times to make discrete mode have N stair-steps)
(minimum 2, maximum 150)
@@ -96,7 +94,6 @@ Discrete ramp config mode:
* 1 click: off
* 2 clicks: battcheck mode
* 4 clicks: thermal config mode
- - Hold: thermal calibration mode
Thermal config mode:
* Setting 1: calibrate sensor:
@@ -106,10 +103,6 @@ Discrete ramp config mode:
* Setting 2: temperature limit:
At buzz, click N times to set thermal limit to roughly 30 C + N.
- Thermal calibration mode:
- - Hold until hot: set new ceiling value
- - ... don't hold: blink out current ceiling value and exit
-
Lockout mode:
* Hold: momentary moon
* 4 clicks: exit lockout (return to regular "off" mode)
@@ -127,24 +120,33 @@ Muggle mode:
* Hold: Ramp up / down.
* 6 clicks: Exit muggle mode.
-Indicator LED support:
+Indicator LED / aux LED support:
+
+ The indicator LED (button LED), if there is one, tracks the brightness
+ of the main LED(s) during use. It'll be off, low, or high depending
+ on whether the main emitter is off, using only the first power
+ channel, or using a higher level.
- The indicator LED, if there is one, tracks the brightness of the main
- LED(s) during use. It'll be off, low, or high depending on whether
- the main emitter is off, using only the first power channel, or using
- a higher level.
+ If front-facing aux LEDs are present, they stay off while the main
+ light is on. They only turn on when the main emitters are off.
The indicator LED can stay on when the light is in the "off" state or
- lockout state. The user can configure each state to be low, high, or
- off. To configure it:
+ "lockout" state. These modes can have different settings, to make it
+ easier to see which one the light is in. To configure it:
+
+ 1. Go to the standby mode you want to configure. This is either
+ "off" or "lockout".
+ 2. In "off" mode, click 7 times to switch to the next aux LED mode.
+ Or in "lockout" mode, click 3 times.
+ 3. Repeat step 2 until the desired mode is reached.
+
+ The available aux LED / indicator LED modes vary depending on the type
+ of light, but they typically have the following modes:
- 1. Go to lockout mode. (4 clicks)
- 2. Click 3 times, optionally holding the third press, to change the
- value:
- * 3 fast clicks: Change lockout mode button brightness.
- * Hold the third click: Change regular "off" mode button
- brightness. Let go when desired level is reached.
- 3. Exit lockout mode. (4 clicks)
+ - Off
+ - Low
+ - High
+ - Blinking
TODO:
@@ -168,3 +170,4 @@ TODO:
- candle mode: smoother adjustments?
- make sunset mode timer and brightness configurable?
- make beacon mode actually sleep between pulses
+ - add a toggle for memory?
diff --git a/spaghetti-monster/anduril/build-all.sh b/spaghetti-monster/anduril/build-all.sh
index 34df732..c355f1e 100755
--- a/spaghetti-monster/anduril/build-all.sh
+++ b/spaghetti-monster/anduril/build-all.sh
@@ -2,23 +2,10 @@
UI=anduril
-for TARGET in \
- BLF_GT \
- BLF_GT_MINI \
- BLF_Q8 \
- EMISAR_D1 \
- EMISAR_D1S \
- EMISAR_D4 \
- EMISAR_D4_219C \
- EMISAR_D4S \
- EMISAR_D4S_219C \
- FF_PL47 \
- FF_ROT66 \
- FF_ROT66_219 \
- FW3A \
- SOFIRN_SP36 \
- ; do
- echo "===== $TARGET ====="
- ../../../bin/build.sh 85 "$UI" "-DFSM_${TARGET}_DRIVER"
- mv -f "$UI".hex "$UI".$TARGET.hex
+for TARGET in cfg-*.h ; do
+ NAME=$(echo "$TARGET" | perl -ne '/cfg-(.*).h/ && print "$1\n";')
+ echo "===== $NAME ====="
+ echo ../../../bin/build.sh 85 "$UI" "-DCONFIGFILE=${TARGET}"
+ ../../../bin/build.sh 85 "$UI" "-DCONFIGFILE=${TARGET}"
+ mv -f "$UI".hex "$UI".$NAME.hex
done
diff --git a/spaghetti-monster/anduril/cfg-blf-gt-mini.h b/spaghetti-monster/anduril/cfg-blf-gt-mini.h
index 885024a..3728f98 100644
--- a/spaghetti-monster/anduril/cfg-blf-gt-mini.h
+++ b/spaghetti-monster/anduril/cfg-blf-gt-mini.h
@@ -1,4 +1,5 @@
// BLF/Lumintop GT Mini config options for Anduril
+#include "hwdef-BLF_GT_Mini.h"
// Same as an Emisar D1S, except it has a lighted button
#include "cfg-emisar-d1s.h"
diff --git a/spaghetti-monster/anduril/cfg-blf-gt.h b/spaghetti-monster/anduril/cfg-blf-gt.h
index a29d7e7..b8f4d6d 100644
--- a/spaghetti-monster/anduril/cfg-blf-gt.h
+++ b/spaghetti-monster/anduril/cfg-blf-gt.h
@@ -1,4 +1,5 @@
// BLF GT config options for Anduril
+#include "hwdef-BLF_GT.h"
// the button lights up
#define USE_INDICATOR_LED
diff --git a/spaghetti-monster/anduril/cfg-blf-q8.h b/spaghetti-monster/anduril/cfg-blf-q8.h
index 1b9b971..970fedb 100644
--- a/spaghetti-monster/anduril/cfg-blf-q8.h
+++ b/spaghetti-monster/anduril/cfg-blf-q8.h
@@ -1,4 +1,5 @@
// BLF Q8 config options for Anduril
+#include "hwdef-BLF_Q8.h"
// the button lights up
#define USE_INDICATOR_LED
@@ -6,6 +7,11 @@
#define USE_INDICATOR_LED_WHILE_RAMPING
// enable blinking indicator LED while off
#define TICK_DURING_STANDBY
+#define STANDBY_TICK_SPEED 3 // every 0.128 s
+#define USE_FANCIER_BLINKING_INDICATOR
+// off mode: high (2)
+// lockout: blinking (3)
+#define INDICATOR_LED_DEFAULT_MODE ((3<<2) + 2)
// copied from Emisar D4 ramp
// ../../bin/level_calc.py 1 65 7135 1 0.8 150
diff --git a/spaghetti-monster/anduril/cfg-emisar-d1.h b/spaghetti-monster/anduril/cfg-emisar-d1.h
index d35480c..35e91db 100644
--- a/spaghetti-monster/anduril/cfg-emisar-d1.h
+++ b/spaghetti-monster/anduril/cfg-emisar-d1.h
@@ -1,4 +1,6 @@
// Emisar D1 config options for Anduril
+#include "hwdef-Emisar_D1.h"
+// same as Emisar D4, mostly
#include "cfg-emisar-d4.h"
// stop panicking at ~75% power or ~1000 lm (D1 has a decent power-to-thermal-mass ratio)
diff --git a/spaghetti-monster/anduril/cfg-emisar-d1s.h b/spaghetti-monster/anduril/cfg-emisar-d1s.h
index eb98c2e..56200a2 100644
--- a/spaghetti-monster/anduril/cfg-emisar-d1s.h
+++ b/spaghetti-monster/anduril/cfg-emisar-d1s.h
@@ -1,4 +1,6 @@
// Emisar D1S config options for Anduril
+#include "hwdef-Emisar_D1S.h"
+// same as Emisar D4, mostly
#include "cfg-emisar-d4.h"
// stop panicking at ~90% power or ~1200 lm (D1S has a good power-to-thermal-mass ratio)
diff --git a/spaghetti-monster/anduril/cfg-emisar-d4-219c.h b/spaghetti-monster/anduril/cfg-emisar-d4-219c.h
index 55ae1eb..cf245a2 100644
--- a/spaghetti-monster/anduril/cfg-emisar-d4-219c.h
+++ b/spaghetti-monster/anduril/cfg-emisar-d4-219c.h
@@ -1,7 +1,6 @@
// Emisar D4-219C config options for Anduril
// same as D4S but with FET modes limited to 80% power
// to avoid destroying the LEDs
-#define FSM_EMISAR_D4_DRIVER
#include "cfg-emisar-d4.h"
#undef PWM2_LEVELS
diff --git a/spaghetti-monster/anduril/cfg-emisar-d4.h b/spaghetti-monster/anduril/cfg-emisar-d4.h
index e83c62d..2f4df49 100644
--- a/spaghetti-monster/anduril/cfg-emisar-d4.h
+++ b/spaghetti-monster/anduril/cfg-emisar-d4.h
@@ -1,4 +1,5 @@
// Emisar D4 config options for Anduril
+#include "hwdef-Emisar_D4.h"
// ../../bin/level_calc.py 1 65 7135 1 0.8 150
// ... mixed with this:
diff --git a/spaghetti-monster/anduril/cfg-emisar-d4s-219c.h b/spaghetti-monster/anduril/cfg-emisar-d4s-219c.h
index c02274d..0c68bc4 100644
--- a/spaghetti-monster/anduril/cfg-emisar-d4s-219c.h
+++ b/spaghetti-monster/anduril/cfg-emisar-d4s-219c.h
@@ -1,7 +1,6 @@
// Emisar D4S-219C config options for Anduril
// same as D4S but with FET modes limited to 80% power
// to avoid destroying the LEDs
-#define FSM_EMISAR_D4S_DRIVER
#include "cfg-emisar-d4s.h"
#undef PWM2_LEVELS
diff --git a/spaghetti-monster/anduril/cfg-emisar-d4s.h b/spaghetti-monster/anduril/cfg-emisar-d4s.h
index ef55668..e26634a 100644
--- a/spaghetti-monster/anduril/cfg-emisar-d4s.h
+++ b/spaghetti-monster/anduril/cfg-emisar-d4s.h
@@ -1,4 +1,5 @@
// Emisar D4S config options for Anduril
+#include "hwdef-Emisar_D4S.h"
// the button lights up
#define USE_INDICATOR_LED
@@ -8,6 +9,8 @@
#endif
// enable blinking indicator LED while off
#define TICK_DURING_STANDBY
+#define STANDBY_TICK_SPEED 3 // every 0.128 s
+#define USE_FANCIER_BLINKING_INDICATOR
#ifdef RAMP_LENGTH
#undef RAMP_LENGTH
diff --git a/spaghetti-monster/anduril/cfg-ff-pl47-219.h b/spaghetti-monster/anduril/cfg-ff-pl47-219.h
new file mode 100644
index 0000000..3ded2aa
--- /dev/null
+++ b/spaghetti-monster/anduril/cfg-ff-pl47-219.h
@@ -0,0 +1,7 @@
+// Fireflies PL47-219B config options for Anduril
+// same as PL47 but with FET modes limited to 67% power
+// to avoid destroying the LEDs
+#include "cfg-ff-pl47.h"
+
+#undef PWM2_LEVELS
+#define PWM2_LEVELS 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,4,5,6,7,8,9,10,11,12,13,15,16,17,19,20,22,23,25,27,28,30,31,33,35,37,39,41,43,45,47,50,52,55,57,60,63,65,68,71,74,77,80,83,87,90,93,97,101,105,108,112,116,121,125,129,134,139,143,148,153,159,164,169
diff --git a/spaghetti-monster/anduril/cfg-ff-pl47.h b/spaghetti-monster/anduril/cfg-ff-pl47.h
index 2e5647d..8e21013 100644
--- a/spaghetti-monster/anduril/cfg-ff-pl47.h
+++ b/spaghetti-monster/anduril/cfg-ff-pl47.h
@@ -1,4 +1,5 @@
// Fireflies PL47 config options for Anduril
+#include "hwdef-FF_PL47.h"
// the button lights up
#define USE_INDICATOR_LED
diff --git a/spaghetti-monster/anduril/cfg-ff-rot66-219.h b/spaghetti-monster/anduril/cfg-ff-rot66-219.h
index 46ceb9f..efaad94 100644
--- a/spaghetti-monster/anduril/cfg-ff-rot66-219.h
+++ b/spaghetti-monster/anduril/cfg-ff-rot66-219.h
@@ -1,6 +1,5 @@
// Fireflies ROT66-219 (7x7135) config options for Anduril
// same as regular ROT66, but calibrated for Nichia 219B with 7x7135 chips
-#define FSM_FF_ROT66_DRIVER
#include "cfg-ff-rot66.h"
// driver is a FET+N+1,
diff --git a/spaghetti-monster/anduril/cfg-ff-rot66.h b/spaghetti-monster/anduril/cfg-ff-rot66.h
index 165b2ba..78d7f66 100644
--- a/spaghetti-monster/anduril/cfg-ff-rot66.h
+++ b/spaghetti-monster/anduril/cfg-ff-rot66.h
@@ -1,4 +1,5 @@
// Fireflies ROT66 (14x7135) config options for Anduril
+#include "hwdef-FF_ROT66.h"
// the button lights up
#define USE_INDICATOR_LED
diff --git a/spaghetti-monster/anduril/cfg-fw3a.h b/spaghetti-monster/anduril/cfg-fw3a.h
index efa70ae..dd77137 100644
--- a/spaghetti-monster/anduril/cfg-fw3a.h
+++ b/spaghetti-monster/anduril/cfg-fw3a.h
@@ -1,4 +1,5 @@
// FW3A config options for Anduril
+#include "hwdef-FW3A.h"
// ../../bin/level_calc.py 1 65 7135 1 0.8 150
// ... mixed with this:
diff --git a/spaghetti-monster/anduril/cfg-sofirn-sp36.h b/spaghetti-monster/anduril/cfg-sofirn-sp36.h
index f6f7447..1150a62 100644
--- a/spaghetti-monster/anduril/cfg-sofirn-sp36.h
+++ b/spaghetti-monster/anduril/cfg-sofirn-sp36.h
@@ -1,15 +1,18 @@
// Sofirn SP36 (small Q8) config options for Anduril
+// same as the BLF Q8, mostly
+#include "cfg-blf-q8.h"
// voltage readings were a little high with the Q8 value
+#undef VOLTAGE_FUDGE_FACTOR
#define VOLTAGE_FUDGE_FACTOR 5 // add 0.25V, not 0.35V
-#define FSM_BLF_Q8_DRIVER
-#include "cfg-blf-q8.h"
-
// the high button LED mode on this light uses too much power
// off mode: low (1)
// lockout: blinking (3)
+#ifdef INDICATOR_LED_DEFAULT_MODE
+#undef INDICATOR_LED_DEFAULT_MODE
#define INDICATOR_LED_DEFAULT_MODE ((3<<2) + 1)
+#endif
// don't blink during the ramp; the button LED brightness is sufficient
// to indicate which power channel(s) are being used
diff --git a/spaghetti-monster/baton/baton.c b/spaghetti-monster/baton/baton.c
index d138297..8a80134 100644
--- a/spaghetti-monster/baton/baton.c
+++ b/spaghetti-monster/baton/baton.c
@@ -17,7 +17,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#define FSM_EMISAR_D4_DRIVER
+#include "hwdef-Emisar_D4.h"
#define USE_LVP
#define USE_THERMAL_REGULATION
#define USE_DELAY_MS
diff --git a/spaghetti-monster/darkhorse/darkhorse.c b/spaghetti-monster/darkhorse/darkhorse.c
index d76afc2..e613f55 100644
--- a/spaghetti-monster/darkhorse/darkhorse.c
+++ b/spaghetti-monster/darkhorse/darkhorse.c
@@ -17,7 +17,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#define FSM_EMISAR_D4_DRIVER
+#include "hwdef-Emisar_D4.h"
#define USE_LVP
#define USE_THERMAL_REGULATION
#define DEFAULT_THERM_CEIL 45
@@ -263,6 +263,7 @@ uint8_t strobe_beacon_state(Event event, uint16_t arg) {
return MISCHIEF_MANAGED;
}
// 1 click (initially): cancel current blink
+ // FIXME: this is no longer necessary; FSM does this automatically now
if (event == EV_click1_release) {
interrupt_nice_delays();
return MISCHIEF_MANAGED;
diff --git a/spaghetti-monster/fsm-adc.c b/spaghetti-monster/fsm-adc.c
index 2ec630c..8decd9d 100644
--- a/spaghetti-monster/fsm-adc.c
+++ b/spaghetti-monster/fsm-adc.c
@@ -51,7 +51,7 @@ inline void ADC_off() {
static inline uint8_t calc_voltage_divider(uint16_t value) {
// use 9.7 fixed-point to get sufficient precision
uint16_t adc_per_volt = ((ADC_44<<7) - (ADC_22<<7)) / (44-22);
- // incoming value is 14.2 fixed-point, so shift it 2 bits less
+ // incoming value is 8.2 fixed-point, so shift it 2 bits less
uint8_t result = ((value<<5) / adc_per_volt) + VOLTAGE_FUDGE_FACTOR;
return result;
}
diff --git a/spaghetti-monster/meteor/meteor.c b/spaghetti-monster/meteor/meteor.c
index a50b034..5e925e2 100644
--- a/spaghetti-monster/meteor/meteor.c
+++ b/spaghetti-monster/meteor/meteor.c
@@ -18,7 +18,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#define FSM_EMISAR_D4_DRIVER
+#include "hwdef-Emisar_D4.h"
#define USE_LVP
#define USE_THERMAL_REGULATION
#define DEFAULT_THERM_CEIL 45
diff --git a/spaghetti-monster/momentary/momentary.c b/spaghetti-monster/momentary/momentary.c
index 0372b3d..26acd44 100644
--- a/spaghetti-monster/momentary/momentary.c
+++ b/spaghetti-monster/momentary/momentary.c
@@ -19,7 +19,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#define FSM_EMISAR_D4_DRIVER
+#include "hwdef-Emisar_D4.h"
#define USE_LVP
#define USE_DEBUG_BLINK
#define USE_DELAY_4MS
diff --git a/spaghetti-monster/ramping-ui/ramping-ui.c b/spaghetti-monster/ramping-ui/ramping-ui.c
index 234cdf4..18f488d 100644
--- a/spaghetti-monster/ramping-ui/ramping-ui.c
+++ b/spaghetti-monster/ramping-ui/ramping-ui.c
@@ -17,7 +17,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#define FSM_EMISAR_D4_DRIVER
+#include "hwdef-Emisar_D4.h"
#define USE_LVP
#define USE_THERMAL_REGULATION
#define DEFAULT_THERM_CEIL 32
diff --git a/spaghetti-monster/rampingios/build-all.sh b/spaghetti-monster/rampingios/build-all.sh
index 5b75fe4..106dc15 100755
--- a/spaghetti-monster/rampingios/build-all.sh
+++ b/spaghetti-monster/rampingios/build-all.sh
@@ -1,18 +1,13 @@
#!/bin/sh
-cp -av ../anduril/cfg*.h .
+cp -av ../anduril/cfg-emisar*.h .
UI=rampingiosv3
-for TARGET in \
- EMISAR_D1 \
- EMISAR_D1S \
- EMISAR_D4 \
- EMISAR_D4_219C \
- EMISAR_D4S \
- EMISAR_D4S_219C \
- ; do
- echo "===== $TARGET ====="
- ../../../bin/build.sh 85 "$UI" "-DFSM_${TARGET}_DRIVER"
- mv -f "$UI".hex "$UI".$TARGET.hex
+for TARGET in cfg-*.h ; do
+ NAME=$(echo "$TARGET" | perl -ne '/cfg-(.*).h/ && print "$1\n";')
+ echo "===== $NAME ====="
+ echo ../../../bin/build.sh 85 "$UI" "-DCONFIGFILE=${TARGET}"
+ ../../../bin/build.sh 85 "$UI" "-DCONFIGFILE=${TARGET}"
+ mv -f "$UI".hex "$UI".$NAME.hex
done
diff --git a/spaghetti-monster/rampingios/rampingiosv3.c b/spaghetti-monster/rampingios/rampingiosv3.c
index 4142121..399bcf0 100644
--- a/spaghetti-monster/rampingios/rampingiosv3.c
+++ b/spaghetti-monster/rampingios/rampingiosv3.c
@@ -18,18 +18,8 @@
*/
/********* User-configurable options *********/
-// Physical driver type (uncomment one of the following or define it at the gcc command line)
-//#define FSM_BLF_GT_DRIVER
-//#define FSM_BLF_GT_MINI_DRIVER
-//#define FSM_BLF_Q8_DRIVER
-//#define FSM_EMISAR_D1_DRIVER
-//#define FSM_EMISAR_D1S_DRIVER
-//#define FSM_EMISAR_D4_DRIVER
-//#define FSM_EMISAR_D4_219C_DRIVER
-//#define FSM_EMISAR_D4S_DRIVER
-//#define FSM_EMISAR_D4S_219C_DRIVER
-//#define FSM_FF_ROT66_DRIVER
-//#define FSM_FW3A_DRIVER
+// Anduril config file name (set it here or define it at the gcc command line)
+//#define CONFIGFILE cfg-emisar-d4s.h
#define USE_LVP // FIXME: won't build when this option is turned off
@@ -57,40 +47,8 @@
//#define BATTCHECK_4bars // FIXME: breaks build
/***** specific settings for known driver types *****/
-#if defined(FSM_BLF_GT_DRIVER)
-#include "cfg-blf-gt.h"
-
-#elif defined(FSM_BLF_GT_MINI_DRIVER)
-#include "cfg-blf-gt-mini.h"
-
-#elif defined(FSM_BLF_Q8_DRIVER)
-#include "cfg-blf-q8.h"
-
-#elif defined(FSM_EMISAR_D1_DRIVER)
-#include "cfg-emisar-d1.h"
-
-#elif defined(FSM_EMISAR_D1S_DRIVER)
-#include "cfg-emisar-d1s.h"
-
-#elif defined(FSM_EMISAR_D4_219C_DRIVER)
-#include "cfg-emisar-d4-219c.h"
-
-#elif defined(FSM_EMISAR_D4_DRIVER)
-#include "cfg-emisar-d4.h"
-
-#elif defined(FSM_EMISAR_D4S_219C_DRIVER)
-#include "cfg-emisar-d4s-219c.h"
-
-#elif defined(FSM_EMISAR_D4S_DRIVER)
-#include "cfg-emisar-d4s.h"
-
-#elif defined(FSM_FF_ROT66_DRIVER)
-#include "cfg-ff-rot66.h"
-
-#elif defined(FSM_FW3A_DRIVER)
-#include "cfg-fw3a.h"
-
-#endif
+#include "tk.h"
+#include incfile(CONFIGFILE)
// thermal properties, if not defined per-driver
@@ -316,11 +274,6 @@ uint8_t off_state(Event event, uint16_t arg) {
set_state(steady_state, memorized_level);
return MISCHIEF_MANAGED;
}
- // 2 clicks (initial press): off, to prep for later events
- else if (event == EV_click2_press) {
- set_level(0);
- return MISCHIEF_MANAGED;
- }
// click, hold: go to highest level (ceiling) (for ramping down)
else if (event == EV_click2_hold) {
set_state(steady_state, MAX_LEVEL);
@@ -331,6 +284,11 @@ uint8_t off_state(Event event, uint16_t arg) {
set_state(steady_state, MAX_LEVEL);
return MISCHIEF_MANAGED;
}
+ // 3 clicks (initial press): off, to prep for later events
+ else if (event == EV_click3_press) {
+ set_level(0);
+ return MISCHIEF_MANAGED;
+ }
#ifdef USE_BATTCHECK
// 3 clicks: battcheck mode / blinky mode group 1
else if (event == EV_3clicks) {
@@ -1196,9 +1154,6 @@ void loop() {
StatePtr state = current_state;
- #ifdef USE_DYNAMIC_UNDERCLOCKING
- auto_clock_speed();
- #endif
if (0) {}
#ifdef USE_BATTCHECK
diff --git a/spaghetti-monster/werner/build-all.sh b/spaghetti-monster/werner/build-all.sh
index 43879bb..87d4f0d 100755
--- a/spaghetti-monster/werner/build-all.sh
+++ b/spaghetti-monster/werner/build-all.sh
@@ -4,16 +4,10 @@ cp -av ../anduril/cfg*.h .
UI=werner
-for TARGET in \
- BLF_GT \
- BLF_Q8 \
- EMISAR_D1 \
- EMISAR_D1S \
- EMISAR_D4 \
- EMISAR_D4S \
- FW3A \
- ; do
- echo "===== $TARGET ====="
- ../../../bin/build.sh 85 "$UI" "-DFSM_${TARGET}_DRIVER"
- mv -f "$UI".hex "$UI".$TARGET.hex
+for TARGET in cfg-*.h ; do
+ NAME=$(echo "$TARGET" | perl -ne '/cfg-(.*).h/ && print "$1\n";')
+ echo "===== $NAME ====="
+ echo ../../../bin/build.sh 85 "$UI" "-DCONFIGFILE=${TARGET}"
+ ../../../bin/build.sh 85 "$UI" "-DCONFIGFILE=${TARGET}"
+ mv -f "$UI".hex "$UI".$NAME.hex
done
diff --git a/spaghetti-monster/werner/werner.c b/spaghetti-monster/werner/werner.c
index b6cdf12..7c47cd7 100644
--- a/spaghetti-monster/werner/werner.c
+++ b/spaghetti-monster/werner/werner.c
@@ -20,10 +20,7 @@
/********* User-configurable options *********/
// Physical driver type (uncomment one of the following or define it at the gcc command line)
-//#define FSM_EMISAR_D4_DRIVER
-//#define FSM_BLF_Q8_DRIVER
-//#define FSM_FW3A_DRIVER
-//#define FSM_BLF_GT_DRIVER
+//#define CONFIGFILE cfg-emisar-d4.h
#define USE_LVP // FIXME: won't build when this option is turned off
@@ -37,21 +34,13 @@
//#define BATTCHECK_4bars // FIXME: breaks build
/***** specific settings for known driver types *****/
-#if defined(FSM_BLF_GT_DRIVER)
-#include "cfg-blf-gt.h"
-
-#elif defined(FSM_BLF_Q8_DRIVER)
-#include "cfg-blf-q8.h"
-
-#elif defined(FSM_EMISAR_D4_DRIVER)
-#include "cfg-emisar-d4.h"
-
-#elif defined(FSM_FW3A_DRIVER)
-#include "cfg-fw3a.h"
-
+#ifdef CONFIGFILE
+#include "tk.h"
+#include incfile(CONFIGFILE)
+#else
+#error You need to define CONFIGFILE
#endif
-
// thermal properties, if not defined per-driver
#ifndef MIN_THERM_STEPDOWN
#define MIN_THERM_STEPDOWN MAX_1x7135 // lowest value it'll step down to
diff --git a/tk-attiny.h b/tk-attiny.h
index 54856bf..3c985f2 100644
--- a/tk-attiny.h
+++ b/tk-attiny.h
@@ -61,6 +61,11 @@
#include <avr/interrupt.h>
/******************** I/O pin and register layout ************************/
+#ifdef HWDEFFILE
+#include "tk.h"
+#include incfile(HWDEFFILE)
+#endif
+
#if 0 // placeholder
#elif defined(NANJG_LAYOUT)
@@ -75,42 +80,10 @@
#elif defined(FERRERO_ROCHER_LAYOUT)
#include "hwdef-Ferrero_Rocher.h"
-#elif defined(FSM_BLF_GT_DRIVER)
-#include "hwdef-BLF_GT.h"
-
-#elif defined(FSM_BLF_GT_MINI_DRIVER)
-#include "hwdef-BLF_GT_Mini.h"
-
-#elif defined(FSM_BLF_Q8_DRIVER)
-#include "hwdef-BLF_Q8.h"
-
-#elif defined(FSM_EMISAR_D4_DRIVER)
-#include "hwdef-Emisar_D4.h"
-
-#elif defined(FSM_EMISAR_D4S_DRIVER)
-#include "hwdef-Emisar_D4S.h"
-
-#elif defined(FSM_EMISAR_D1_DRIVER)
-#include "hwdef-Emisar_D1.h"
-
-#elif defined(FSM_EMISAR_D1S_DRIVER)
-#include "hwdef-Emisar_D1S.h"
-
-#elif defined(FSM_FF_PL47_DRIVER)
-#include "hwdef-FF_PL47.h"
-
-#elif defined(FSM_FF_ROT66_DRIVER)
-#include "hwdef-FF_ROT66.h"
-
-#elif defined(FSM_FW3A_DRIVER)
-#include "hwdef-FW3A.h"
-
-#elif defined(FSM_TKSABER_DRIVER)
-#include "hwdef-TK_Saber.h"
+#endif // no more recognized driver types
-#else
+#ifndef LAYOUT_DEFINED
#error Hey, you need to define an I/O pin layout.
-
-#endif // no more recognized driver types
+#endif
#endif // TK_ATTINY_H
diff --git a/tk.h b/tk.h
new file mode 100644
index 0000000..b61db08
--- /dev/null
+++ b/tk.h
@@ -0,0 +1,17 @@
+#ifndef TK_H
+#define TK_H
+
+/////
+// tk.h
+// misc tricks which need to be available before other includes,
+// but which don't need to be repeated in every source file
+////
+
+// create a way to include files defined at the command line,
+// like with "gcc -DCONFIGFILE=foo.h"
+#define incfile2(s) #s
+#define incfile(s) incfile2(s)
+// use it like this:
+//#include incfile(CONFIGFILE)
+
+#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.