From c3e91d269e5d66f6bc3bf99cbb811376152efe9a Mon Sep 17 00:00:00 2001 From: Robert Marshall Date: Fri, 27 Aug 2021 09:02:35 +0100 Subject: [PATCH] Add a timer to turn off after a period of time. Move the LED name to reduce string literals. --- src/JsonLightControl.cpp | 22 +++++++++++++++++----- src/LED.cpp | 10 ++++++++-- src/Timer.cpp | 32 ++++++++++++++++++++++++++++++++ src/TimerManager.cpp | 26 ++++++++++++++++++++++++++ src/main.cpp | 15 ++++++++++----- 5 files changed, 93 insertions(+), 12 deletions(-) create mode 100644 src/Timer.cpp create mode 100644 src/TimerManager.cpp diff --git a/src/JsonLightControl.cpp b/src/JsonLightControl.cpp index d81f9fb..03ab305 100644 --- a/src/JsonLightControl.cpp +++ b/src/JsonLightControl.cpp @@ -1,13 +1,19 @@ #include "LED.cpp" +#include "TimerManager.cpp" #include #include class JsonLightControl{ std::map _leds; + TimerManager *_timers; public: - void registerLEDs(std::string name, LED *leds){ - _leds[name] = leds; + JsonLightControl(TimerManager *timers){ + _timers = timers; + } + + void registerLEDs(LED *leds){ + _leds[leds->getName()] = leds; } void action(std::string input){ @@ -21,20 +27,26 @@ public: for (int i = 0; i < lights.size(); i++) { - auto name = lights[i]["name"].as(); + auto light = lights[i]; + + auto name = light["name"].as(); if (!_leds.count(name)) continue; auto led = _leds.find(name)->second; - auto brightness = lights[i]["brightness"].as(); + auto brightness = light["brightness"].as(); led->setBrightness(brightness); - auto on = lights[i]["on"].as(); + auto on = light["on"].as(); if (on) led->on(); else led->off(); + + auto timer = light["timer"].as(); + if (timer > 0) + _timers->reset(name, timer); } } }; diff --git a/src/LED.cpp b/src/LED.cpp index adde2b7..947941d 100644 --- a/src/LED.cpp +++ b/src/LED.cpp @@ -4,7 +4,8 @@ #include #include "LEDOutput.cpp" -class LED{ +class LED { + std::string _name; LEDOutput* _output; bool _on; unsigned long _fadeDurationOn, _fadeDurationOff, _fadeStart, _fadeEnd; @@ -39,13 +40,18 @@ class LED{ } public: - LED(LEDOutput* output, unsigned long fadeDurationOn, unsigned long fadeDurationOff) { + LED(std::string name, LEDOutput* output, unsigned long fadeDurationOn, unsigned long fadeDurationOff) { + _name = name; _output = output; _fadeDurationOn = fadeDurationOn; _fadeDurationOff = fadeDurationOff; _brightness = 1.0f; } + std::string getName(){ + return _name; + } + void on(){ reset(true); } diff --git a/src/Timer.cpp b/src/Timer.cpp new file mode 100644 index 0000000..007ac3b --- /dev/null +++ b/src/Timer.cpp @@ -0,0 +1,32 @@ +#include + +class Timer{ +private: + unsigned long _interval, _lastTick; + void (*_callback)(void); + bool _running; + +public: + Timer(void (*callback)(void)){ + _callback = callback; + _running = false; + } + + void reset(unsigned long interval){ + _interval = interval; + _lastTick = millis(); + _running = true; + } + + void loop(){ + if (!_running) + return; + + unsigned long tick = millis(); + + if (tick - _lastTick >= _interval){ + _callback(); + _running = false; + } + } +}; diff --git a/src/TimerManager.cpp b/src/TimerManager.cpp new file mode 100644 index 0000000..7b4b04b --- /dev/null +++ b/src/TimerManager.cpp @@ -0,0 +1,26 @@ +#include +#include "Timer.cpp" + +class TimerManager{ + std::map _timers; + + public: + + void add(std::string name, void (*callback)(void)){ + _timers[name] = new Timer(callback); + } + + void reset(std::string name, unsigned long interval){ + if (!_timers.count(name)) + return; + _timers.find(name)->second->reset(interval); + } + + void loop(){ + for(auto iterator = _timers.begin(); iterator != _timers.end(); ++iterator) + { + auto timer = iterator->second; + timer->loop(); + } + } +}; diff --git a/src/main.cpp b/src/main.cpp index 4eadebf..4eab0ba 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -7,11 +7,12 @@ #define FADE_OUT_DURATION 2000 LEDOutput _seatingLedOutput(0, true); -LED _seatingLeds(&_seatingLedOutput, FADE_IN_DURATION, FADE_OUT_DURATION); +LED _seatingLeds("seating", &_seatingLedOutput, FADE_IN_DURATION, FADE_OUT_DURATION); LEDOutput _kitchenLedOutput(1 , true); -LED _kitchenLeds(&_kitchenLedOutput, FADE_IN_DURATION, FADE_OUT_DURATION); +LED _kitchenLeds("kitchen", &_kitchenLedOutput, FADE_IN_DURATION, FADE_OUT_DURATION); -JsonLightControl _jsonLightControl; +TimerManager _timers; +JsonLightControl _jsonLightControl(&_timers); BluetoothLEDCallback _btCallback(&_jsonLightControl); BluetoothService _btService("Van Lights", &_btCallback); @@ -24,14 +25,18 @@ void setup() { _kitchenLedOutput.attach(18); _kitchenLedOutput.attach(23); - _jsonLightControl.registerLEDs("seating", &_seatingLeds); - _jsonLightControl.registerLEDs("kitchen", &_kitchenLeds); + _timers.add(_seatingLeds.getName(), [](){ _seatingLeds.off(); }); + _timers.add(_kitchenLeds.getName(), [](){ _kitchenLeds.off(); }); + + _jsonLightControl.registerLEDs(&_seatingLeds); + _jsonLightControl.registerLEDs(&_kitchenLeds); _btService.init(); _btService.start(); } void loop() { + _timers.loop(); _seatingLeds.loop(); _kitchenLeds.loop(); }