supla-device
Loading...
Searching...
No Matches
lighting_pwm_base.h
1/*
2 Copyright (C) AC SOFTWARE SP. Z O.O.
3
4 This program is free software; you can redistribute it and/or
5 modify it under the terms of the GNU General Public License
6 as published by the Free Software Foundation; either version 2
7 of the License, or (at your option) any later version.
8
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17*/
18
19#ifndef SRC_SUPLA_CONTROL_LIGHTING_PWM_BASE_H_
20#define SRC_SUPLA_CONTROL_LIGHTING_PWM_BASE_H_
21
22#include <stdint.h>
23
24#include "../action_handler.h"
25#include "../actions.h"
26#include "../channel_element.h"
27
28#define RGBW_STATE_ON_INIT_RESTORE -1
29#define RGBW_STATE_ON_INIT_OFF 0
30#define RGBW_STATE_ON_INIT_ON 1
31
32namespace Supla {
33namespace Control {
34
36 public:
37 virtual ~BrightnessAdjuster() = default;
38 virtual int adjustBrightness(int input) = 0;
39 virtual void setMaxHwValue(int maxHwValue) = 0;
40};
41
42class GeometricBrightnessAdjuster : public BrightnessAdjuster {
43 public:
44 explicit GeometricBrightnessAdjuster(double power = 1.505,
45 int offset = 0,
46 int maxHwValue = 1023);
47 void setMaxHwValue(int maxHwValue) override;
48 int adjustBrightness(int input) override;
49
50 private:
51 double power = 1.505;
52 int offset = 0;
53 int maxHwValue = 1023;
54};
55
56class Button;
57
58class LightingPwmBase : public ChannelElement, public ActionHandler {
59 public:
60 enum ButtonControlType : uint8_t {
61 BUTTON_FOR_RGBW,
62 BUTTON_FOR_RGB,
63 BUTTON_FOR_W,
64 BUTTON_NOT_USED
65 };
66
67 enum class AutoIterateMode : uint8_t { OFF, DIMMER, RGB, ALL };
68
69 enum class LegacyChannelFunction : uint8_t { None, RGBW, RGB, Dimmer };
70
78 explicit LightingPwmBase(LightingPwmBase *parent = nullptr);
79 virtual ~LightingPwmBase() = default;
80
81 void purgeConfig() override;
82 Supla::ApplyConfigResult applyChannelConfig(TSD_ChannelConfig *result,
83 bool local = false) override;
84 void fillChannelConfig(void *channelConfig,
85 int *size,
86 uint8_t configType) override;
87
88 virtual void setRGBCCTValueOnDevice(uint32_t output[5], int usedOutputs) = 0;
89
90 virtual void setRGBW(int red,
91 int green,
92 int blue,
93 int colorBrightness,
94 int whiteBrightness,
95 bool toggle = false,
96 bool instant = false);
97
98 virtual void setRGBCCT(int red,
99 int green,
100 int blue,
101 int colorBrightness,
102 int whiteBrightness,
103 int whiteTemperature,
104 bool toggle = false,
105 bool instant = false);
106
107 int32_t handleNewValueFromServer(TSD_SuplaChannelNewValue *newValue) override;
108 virtual void turnOn();
109 virtual void turnOff();
110 virtual void toggle();
111 bool isOn();
112 bool isOnW();
113 bool isOnRGB();
114 void handleAction(int event, int action) override;
115 void setStep(int step);
116 void setDefaultDimmedBrightness(int dimmedBrightness);
117 void setFadeEffectTime(int timeMs);
118 void setMinIterationBrightness(uint8_t minBright);
119 void setMinMaxIterationDelay(uint16_t delayMs);
120
121 void onInit() override;
122 void iterateAlways() override;
123 void onFastTimer() override;
124 void onLoadState() override;
125 void onSaveState() override;
126 bool isStateStorageMigrationNeeded() const override;
127 void onLoadConfig(SuplaDeviceClass *) override;
128
134 void convertStorageFromLegacyChannel(LegacyChannelFunction channelFunction);
135
142
143 void attach(Supla::Control::Button *);
144
145 // Method is used by external integrations to prepare TSD_SuplaChannelNewValue
146 // value for specific channel type (i.e. to prefill durationMS field when
147 // required)
149
150 virtual LightingPwmBase &setDefaultStateOn();
151 virtual LightingPwmBase &setDefaultStateOff();
152 virtual LightingPwmBase &setDefaultStateRestore();
153 // Set mapping between interface setting of brightness and actual value
154 // set on device. Values should be between 0.0 and 1.0.
155 // I.e. if limit is set to (0.05, 1.0), then values from Supla in range
156 // 0-100% are mapped to PWM values in range 5% and 100% of hardware max.
157 LightingPwmBase &setBrightnessRatioLimits(float min, float max);
158 // Set mapping between interface setting of color brightness and actual value
159 // set on device. Values should be between 0.0 and 1.0.
160 LightingPwmBase &setColorBrightnessRatioLimits(float min, float max);
161
162 void setBrightnessAdjuster(BrightnessAdjuster *adjuster);
163 int getCurrentDimmerBrightness() const;
164 int getCurrentRGBBrightness() const;
165 void setMaxHwValue(int newMaxHwValue);
166
174 void setMinPwmFrequency(uint16_t minPwmFrequency);
175
183 void setMaxPwmFrequency(uint16_t maxPwmFrequency);
184
194 void setPwmFrequency(uint16_t pwmFrequency);
195
203 void setStepPwmFrequency(uint16_t stepPwmFrequency);
204
210 uint16_t getMinPwmFrequency() const;
211
217 uint16_t getMaxPwmFrequency() const;
218
224 uint16_t getPwmFrequency() const;
225
231 uint16_t getStepPwmFrequency() const;
232
238 bool hasParent() const;
239
245 int getAncestorCount() const;
246
247 protected:
257 int getMissingGpioCount() const;
258
259 void enableChannel();
260 void disableChannel();
261 void updateEnabledState();
262
263 uint8_t addWithLimit(int value, int addition, int limit = 255);
264 virtual void iterateDimmerRGBW(int rgbStep, int wStep);
265 // Set mapping between interface setting of brightness and actual value
266 // set on device.
267 // Input value is in range 0-100.
268 // Returns value in range 0-1023 adjusted by selected function.
269 int adjustBrightness(int value);
270
271 int getStep(int step, int target, int current) const;
272 bool calculateAndUpdate(int targetValue,
273 int16_t *hwValue,
274 int distance,
275 uint32_t *lastChangeMs,
276 const uint32_t now) const;
277
279 uint8_t red = 0; // 0 - 255
280 uint8_t green = 255; // 0 - 255
281 uint8_t blue = 0; // 0 - 255
282 uint8_t colorBrightness = 0; // 0 - 100
283 uint8_t whiteBrightness = 0; // 0 - 100
284 uint8_t whiteTemperature = 0; // 0 - 100
285 } requested;
286
288 uint8_t colorBrightness = 100; // 0 - 100
289 uint8_t whiteBrightness = 100; // 0 - 100
290 } lastNonZero;
291
293 int16_t red = -1; // 0 - maxHwValue
294 int16_t green = -1; // 0 - maxHwValue
295 int16_t blue = -1; // 0 - maxHwValue
296 int16_t colorBrightness = -1; // 0 - maxHwValue
297 int16_t brightness = -1; // 0 - maxHwValue
298 int16_t whiteTemperature = -1; // 0 - maxHwValue
299 int16_t white1Brightness = -1; // 0 - maxHwValue
300 int16_t white2Brightness = -1; // 0 - maxHwValue
301 uint16_t redDistance = 0;
302 uint16_t greenDistance = 0;
303 uint16_t blueDistance = 0;
304 uint16_t colorBrightnessDistance = 0;
305 uint16_t brightnessDistance = 0;
306 uint16_t whiteTemperatureDistance = 0;
307 } hardware;
308
309 struct TimingState {
310 uint32_t lastTick = 0;
311 uint32_t lastChangeRedMs = 0;
312 uint32_t lastChangeGreenMs = 0;
313 uint32_t lastChangeBlueMs = 0;
314 uint32_t lastChangeColorBrightnessMs = 0;
315 uint32_t lastChangeBrightnessMs = 0;
316 uint32_t lastChangeWhiteTemperatureMs = 0;
317 uint32_t lastMsgReceivedMs = 0;
318 uint32_t lastIterateDimmerTimestamp = 0;
319 uint32_t iterationDelayTimestamp = 0;
320 uint32_t lastAutoIterateStartTimestamp = 0;
321 } timing;
322
323 uint8_t buttonStep = 10; // 10
324 uint8_t defaultDimmedBrightness = 20; // 20
325 bool dimIterationDirection = false;
326 bool resetDisance = false;
327 bool instant = false;
328 bool enabled = true;
329 bool initDone = false;
330 bool skipLegacyMigration = false;
331 int8_t stateOnInit = RGBW_STATE_ON_INIT_RESTORE;
332 uint8_t minIterationBrightness = 1;
333 uint8_t maxTotalHwPower = 100;
334 uint8_t usedChannels = 0;
335 LegacyChannelFunction legacyChannelFunction = LegacyChannelFunction::None;
336
337 enum ButtonControlType buttonControlType = BUTTON_FOR_RGBW;
338 enum AutoIterateMode autoIterateMode = AutoIterateMode::OFF;
339
340 uint16_t maxHwValue = 1023;
341 float minBrightnessRatio = 0.0f;
342 float maxBrightnessRatio = 1.0f;
343 float minColorBrightnessRatio = 0.0f;
344 float maxColorBrightnessRatio = 1.0f;
345
346 uint16_t minMaxIterationDelay = 750;
347 uint16_t fadeEffect = 500;
348
349 uint16_t minPwmFrequency = 100;
350 uint16_t maxPwmFrequency = 9000;
351 uint16_t pwmFrequency = 500;
352 uint16_t stepPwmFrequency = 1;
353
354 uint32_t previousChannelFunction = 0;
355
356 float warmWhiteGain = 1.0;
357 float coldWhiteGain = 1.0;
358
359 BrightnessAdjuster *brightnessAdjuster = nullptr;
360 Supla::Control::Button *attachedButton = nullptr;
361 LightingPwmBase *parent = nullptr;
362};
363
364using RGBCCTBase = LightingPwmBase;
365
366}; // namespace Control
367}; // namespace Supla
368
369#endif // SRC_SUPLA_CONTROL_LIGHTING_PWM_BASE_H_
Definition SuplaDevice.h:162
Definition action_handler.h:21
Definition lighting_pwm_base.h:35
Definition button.h:34
Definition lighting_pwm_base.h:58
int getAncestorCount() const
Returns number of ancestor instances (by parent).
Definition lighting_pwm_base.cpp:1598
void setMaxPwmFrequency(uint16_t maxPwmFrequency)
Sets maximum PWM frequency.
Definition lighting_pwm_base.cpp:1618
void setMinPwmFrequency(uint16_t minPwmFrequency)
Sets minimum PWM frequency.
Definition lighting_pwm_base.cpp:1614
LightingPwmBase(LightingPwmBase *parent=nullptr)
Constructor.
Definition lighting_pwm_base.cpp:101
uint16_t getMaxPwmFrequency() const
Returns maximum PWM frequency.
Definition lighting_pwm_base.cpp:1648
void setSkipLegacyMigration()
Disables storage conversion from legacy channel function to new.
Definition lighting_pwm_base.cpp:1610
void setStepPwmFrequency(uint16_t stepPwmFrequency)
Sets PWM frequency step.
Definition lighting_pwm_base.cpp:1622
void convertStorageFromLegacyChannel(LegacyChannelFunction channelFunction)
Enables storage conversion from legacy channel function to new.
Definition lighting_pwm_base.cpp:1533
uint16_t getPwmFrequency() const
Returns current PWM frequency.
Definition lighting_pwm_base.cpp:1652
int32_t handleNewValueFromServer(TSD_SuplaChannelNewValue *newValue) override
Handles "new value" request from server.
Definition lighting_pwm_base.cpp:221
bool isStateStorageMigrationNeeded() const override
Method called after onInit() to check if state storage migration is needed.
Definition lighting_pwm_base.cpp:1605
void onFastTimer() override
Method called on fast timer interupt.
Definition lighting_pwm_base.cpp:765
void onInit() override
Third method called on element in SuplaDevice.begin().
Definition lighting_pwm_base.cpp:1054
void setPwmFrequency(uint16_t pwmFrequency)
Sets PWM frequency and applies validation.
Definition lighting_pwm_base.cpp:1626
void onSaveState() override
Method called periodically during SuplaDevice iteration.
Definition lighting_pwm_base.cpp:1212
void purgeConfig() override
Removes all configration data related to the element from Storage::Config.
Definition lighting_pwm_base.cpp:1510
bool hasParent() const
Checks if this instance has parent.
Definition lighting_pwm_base.cpp:1594
void onLoadConfig(SuplaDeviceClass *) override
First method called on element in SuplaDevice.begin().
Definition lighting_pwm_base.cpp:1408
int getMissingGpioCount() const
Returns number of GPIO pins that are required to control this channel.
Definition lighting_pwm_base.cpp:1538
void iterateAlways() override
Method called on each SuplaDevice iteration.
Definition lighting_pwm_base.cpp:198
void fillSuplaChannelNewValue(TSD_SuplaChannelNewValue *value) override
Fills TSD_SuplaChannelNewValue based on current state.
Definition lighting_pwm_base.cpp:1469
void onLoadState() override
Second method called on element in SuplaDevice.begin().
Definition lighting_pwm_base.cpp:1287
uint16_t getStepPwmFrequency() const
Returns PWM frequency step.
Definition lighting_pwm_base.cpp:1656
uint16_t getMinPwmFrequency() const
Returns minimum PWM frequency.
Definition lighting_pwm_base.cpp:1644
Definition lighting_pwm_base.h:292
Definition lighting_pwm_base.h:287
Definition lighting_pwm_base.h:278
Definition lighting_pwm_base.h:309
Definition proto.h:3074
Definition proto.h:1199