### About
A package to ease the control of the [blinkstick nano](https://www.blinkstick.com/products/blinkstick-nano)

Source code is at [https://github.com/weshouman/advanced_led_control](https://github.com/weshouman/advanced_led_control)

### Example
Save this example as ```test.py``` then run it as in the [Usage](#Usage) section below
```python
import advanced_led_control.models.colors as c
from advanced_led_control.models.leds import *
from advanced_led_control.models.ValueIndication import *
from advanced_led_control.models.Indicator       import *
from advanced_led_control.models.Procedure       import *

def indic1_func():
	# Indication values are best shown between 1 and 10
	value_indication = ValueIndication(c.RED, 10)
	return value_indication

def indic2_func():
	value_indication = ValueIndication(c.BLUE, NO_FLICKER)
	return value_indication

indic1 = Indicator(m_col=c.GREEN, func=indic1_func, i_time=4)
indic2 = Indicator(m_col=c.GREEN, func=indic2_func, i_time=4)

stick = blinkstick.find_first()
procedure = Procedure(stick=stick, mode_led=LED_2, quiet=10, sync_duration=10)

# Append all indicators to be run
procedure.indicators.append(indic1)
procedure.indicators.append(indic2)

# Run the specified procedure
procedure.run()
```

### Usage
This utility needs ```sudo``` to execute, as required by the ```blinkstick``` package.
If you are using a virtualenv, run
```
virtualenv -p python3 venv
pip install advanced-led-control
source venv/bin/activate
# Follow this [answer](https://stackoverflow.com/a/50335946/2730737) for why we need to use fully qualified path with sudo
sudo venv/bin/python test.py
```

#### Configuration
##### Indicator Params
- ```m_col```: the indication mode color, based on any of the color types defined below  
- ```func```: a callback that will be called to evaluate the color and flickering for the value led.
- ```brightness```: a value in range [0, 1] that gets multiplied by both the mode and value indication.
- ```i_time```: indication time, is how much time is allocated for this mode.

##### Indicator Callback
Returns
- ```color```: the indication value color, based on any of the color types defined below  
     NOTE: CSS names don't work with flickering, follow this [report](https://forums.blinkstick.com/t/python-api-colornames-not-working-with-pulse/1311?u=eng.walidshouman)
- ```flickering```: an integer that shows the speed of flickering of this color,
     the higher the value the faster the flickering.
     Recommended Values are in range [1, 20].
     Use ```NO_FLICKER``` or ```1001``` to set the led on without flickering.

##### Color Type
An indication color is either one of the 3 types
- ```RGB```: a list of 3 vals in RGB ie. [0, 10, 0].
- ```HEX```: a string ie. '#00ffff'.
- ```CSS_NAME````: a string ie. 'aliceblue'.

##### Procedure Params
- ```mode_led```: Choose between ```LED_1``` and ```LED_2```, currently ```LED_1``` isn't supported
     as the blinkstick doesn't allow flickering the second led
     while the first is set constantly.  
     Follow this [report](https://forums.blinkstick.com/t/cant-pulse-second-led-and-keep-first-on/1310?u=eng.walidshouman).

- ```quiet```: A percentage to be taken from the indication time for the stick to shutdown.  
     Setting ```quiet=0``` will disable this feature,
     and force all the indications to run consecutively.  
     Setting ```quiet=100``` is useless, as it will take all the indication time as a break!

- ```sync_duration```: Allows starting the procedure at a specific second,
    as this package is made to run for multiple machines/RPis that are working separately,
    and to avoid using communication to control the led,
    we allow sync based on real time.  
    Use a ```sync_duration``` of at least 1.2 total indication time to count for the
    delay the pulses make, and if it's less than the total indication time,
    it will be almost useless.  
    NOTE: Set ```sync_duration=0``` to disable this feature.  
    NOTE: Setting ```sync_duration``` to say 8 will start at every eighth second,
          In example, [0, 8, 16, 24, 32 ...]

### Notes
- This project was inspired by the [Pi Dramble](https://github.com/geerlingguy/raspberry-pi-dramble)
