Previously stop_cycle_effect() was called on every tag removal,
which froze the cycle when a non-cycle tag was removed. Now the
removal logic has three distinct paths:
1. Cycle tag removed → stop cycle, restore other pads
2. Non-cycle tag removed while cycle still active → do nothing,
let the cycle thread keep controlling all pads
3. Normal removal (no cycle) → just turn off the pad
When a tag with a cycle effect is removed, other pads were left
frozen in whatever color the cycle left them at. Now:
- Pads with active tags get their lighting theme re-applied
- Pads with no tags get turned off properly
- apply_tag_color() now uses reader.apply_effect() with speed param
- on_tag_remove() properly stops cycle effect before turning off pad
- Updated help text to document "cycle" effect option
- Works with tag_colors.json: set "effect": "cycle" for revolving lights
- Changed apply_tag_color() to accept pad parameter
- LED effects now apply to tag.pad instead of Pad.ALL
- Tag removal only turns off the specific pad, not all pads
- Added active_pads tracking dictionary
- Added speed parameter support from tag_colors.json
- Tag detection turns ALL LEDs off immediately
- Server success shows CENTER blue blink (150ms)
- Theme effects (pulse/flash/solid) apply to ALL pads
- External tag_colors.json for customizable per-tag themes
- Debounce logic preserves theme effect even when skipping server