diff options
| author | Selene ToyKeeper | 2019-01-23 19:04:21 -0700 |
|---|---|---|
| committer | Selene ToyKeeper | 2019-01-23 19:04:21 -0700 |
| commit | 187ce7a5b7b48e8e1643efb8567e04b7bb2bf2df (patch) | |
| tree | d6b68c6d02eed42b6fd6b9041f712baf40392b30 /spaghetti-monster | |
| parent | Updated README to point at build/flash scripts. (diff) | |
| parent | merged trunk (diff) | |
| download | anduril-187ce7a5b7b48e8e1643efb8567e04b7bb2bf2df.tar.gz anduril-187ce7a5b7b48e8e1643efb8567e04b7bb2bf2df.tar.bz2 anduril-187ce7a5b7b48e8e1643efb8567e04b7bb2bf2df.zip | |
merged past 2 months of updates from fsm branch:
Diffstat (limited to 'spaghetti-monster')
30 files changed, 1084 insertions, 533 deletions
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 |
