# IdleLEDs

Having LED effects on the keyboard can be exceptionally helpful. However, having
the effects - or lights, in general - on all the time, even when the keyboard is
otherwise idle, is perhaps not the best. When one leaves the keyboard, locks the
computer, what use are the LED effects then?

One could turn them off manually, but... that's too easy to forget, and why do
something the firmware could do for us anyway? What if the LEDs turned
themselves off after some configurable idle time? Say, if one did not press any
keys for the past ten minutes, just shut 'em off.

This is exactly what the `IdleLEDs` plugin does.

## Using the plugin

The plugin comes with reasonable defaults (see below), and can be used out of
the box, without any further configuration:

```c++
#include <Kaleidoscope.h>
#include <Kaleidoscope-LEDControl.h>
#include <Kaleidoscope-LEDEffect-Rainbow.h>
#include <Kaleidoscope-IdleLEDs.h>

KALEIDOSCOPE_INIT_PLUGINS(LEDControl, IdleLEDs, LEDEffectRainbowWave);

void setup (void) {
  Kaleidoscope.setup ();
}
```

Because the plugin needs to know about key events, it is best to make it one of
the first plugins, so it can catch all of them, before any other plugin would
have a chance to consume key events.

It is also possible to enable run-time configuration via he `Focus` plugin, and
persistent storage of such settings. To do that, one has to use the
`PersistentIdleLEDs` object instead, provided by the plugin:

```c++
#include <Kaleidoscope.h>
#include <Kaleidoscope-LEDControl.h>
#include <Kaleidoscope-LEDEffect-Rainbow.h>
#include <Kaleidoscope-EEPROM-Settings.h>
#include <Kaleidoscope-FocusSerial.h>
#include <Kaleidoscope-IdleLEDs.h>

KALEIDOSCOPE_INIT_PLUGINS(
  EEPROMSettings,
  Focus,
  LEDControl,
  PersistentIdleLEDs,
  LEDEffectRainbowWave
);

void setup (void) {
  Kaleidoscope.setup ();
}
```

## Plugin Properties

The plugin provides two objects, `IdleLEDs`, and `PersistentIdleLEDs`, both with
the following properties and methods.

### `.idle_time_limit`

> Property storing the amount of time that can pass without a single key being
> pressed before the plugin considers the keyboard idle and turns off the LEDs.
> Value is expressed in milliseconds.

> Defaults to 600000 milliseconds (10 minutes).

> Provided for compatibility reasons. It is recommended to use one of the
> methods below instead of setting this property directly. If using
> `PersistentIdleLEDs`, setting this property will not persist the value to
> storage. Use `.setIdleTimeoutSeconds()` if persistence is desired.

### `.idleTimeoutSeconds()`

> Returns the amount of time (in seconds) that can pass without a single key
> being pressed before the plugin considers the keyboard idle and turns off the
> LEDs.

### `.setIdleTimeoutSeconds(uint32_t new_limit)`

> Sets the amount of time (in seconds) that can pass without a single key being
> pressed before the plugin considers the keyboard idle and turns off the LEDs.
>
> Setting the timeout to 0 will disable the plugin until it is set to a higher
> value.

## Focus commands

The plugin provides a single [Focus][FocusSerial] command, but only when using
the `PersistentIdleLEDs` variant:

 [FocusSerial]: FocusSerial.md

### `idleleds.time_limit [seconds]`

> Sets the idle time limit to `seconds`, when called with an argument. Returns
> the current limit (in seconds) when called without any.
>
> Setting the timeout to 0 will disable the plugin until it is set to a higher
> value.

## Dependencies

* [Kaleidoscope-LEDControl](LEDControl.md)

### Optional dependencies

* [Kaleidoscope-EEPROM-Settings](EEPROM-Settings.md)
* [FocusSerial](FocusSerial.md)

## Further reading

Starting from the [example][plugin:example] is the recommended way of getting
started with the plugin.

 [plugin:example]: /examples/LEDs/IdleLEDs/IdleLEDs.ino