supla-device
Loading...
Searching...
No Matches
lighting_pwm_base.h
1// SPDX-FileCopyrightText: AC SOFTWARE SP. Z O.O.
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#ifndef SRC_SUPLA_CONTROL_LIGHTING_PWM_BASE_H_
5#define SRC_SUPLA_CONTROL_LIGHTING_PWM_BASE_H_
6
7#include <stdint.h>
8
9#include <supla/io/io_pin.h>
10
11#include "../action_handler.h"
12#include "../actions.h"
13#include "../channel_element.h"
14
15#define RGBW_STATE_ON_INIT_RESTORE -1
16#define RGBW_STATE_ON_INIT_OFF 0
17#define RGBW_STATE_ON_INIT_ON 1
18
19namespace Supla {
20
21class Mutex;
22
23namespace Control {
24
26 public:
27 virtual ~BrightnessAdjuster() = default;
28 virtual int adjustBrightness(int input) = 0;
29 virtual void setMaxHwValue(int maxHwValue) = 0;
30};
31
33 public:
34 explicit GeometricBrightnessAdjuster(double power = 1.505,
35 int offset = 0,
36 int maxHwValue = 1023);
37 void setMaxHwValue(int maxHwValue) override;
38 int adjustBrightness(int input) override;
39
40 private:
41 double power = 1.505;
42 int offset = 0;
43 int maxHwValue = 1023;
44};
45
46class Button;
47
49 public:
50 enum ButtonControlType : uint8_t {
51 BUTTON_FOR_RGBW,
52 BUTTON_FOR_RGB,
53 BUTTON_FOR_W,
54 BUTTON_NOT_USED
55 };
56
57 enum class AutoIterateMode : uint8_t { OFF, DIMMER, RGB, ALL };
58
59 enum class LegacyChannelFunction : uint8_t { None, RGBW, RGB, Dimmer };
60
68 explicit LightingPwmBase(LightingPwmBase *parent = nullptr);
69 virtual ~LightingPwmBase();
70
71 void purgeConfig() override;
72 Supla::ApplyConfigResult applyChannelConfig(TSD_ChannelConfig *result,
73 bool local = false) override;
74 void fillChannelConfig(void *channelConfig,
75 int *size,
76 uint8_t configType) override;
77
78 virtual void setRGBCCTValueOnDevice(uint32_t output[5], int usedOutputs) = 0;
79
80 virtual void setRGBW(int red,
81 int green,
82 int blue,
83 int colorBrightness,
84 int whiteBrightness,
85 bool toggle = false,
86 bool instant = false);
87
88 virtual void setRGBCCT(int red,
89 int green,
90 int blue,
91 int colorBrightness,
92 int whiteBrightness,
93 int whiteTemperature,
94 bool toggle = false,
95 bool instant = false);
96
97 int32_t handleNewValueFromServer(TSD_SuplaChannelNewValue *newValue) override;
98 virtual void turnOn();
99 virtual void turnOff();
100 virtual void toggle();
101 bool isOn();
102 bool isOnW();
103 bool isOnRGB();
104 void handleAction(int event, int action) override;
105 void setStep(int step);
106 void setDefaultDimmedBrightness(int dimmedBrightness);
107 void setFadeEffectTime(int timeMs);
108 void setMinIterationBrightness(uint8_t minBright);
109 void setMinMaxIterationDelay(uint16_t delayMs);
110
111 void onInit() override;
112 void iterateAlways() override;
113 void onFastTimer() override;
114 void onLoadState() override;
115 void onSaveState() override;
116 bool isStateStorageMigrationNeeded() const override;
117 void onLoadConfig(SuplaDeviceClass *) override;
118
124 void convertStorageFromLegacyChannel(LegacyChannelFunction channelFunction);
125
132
133 void attach(Supla::Control::Button *);
134
135 // Method is used by external integrations to prepare TSD_SuplaChannelNewValue
136 // value for specific channel type (i.e. to prefill durationMS field when
137 // required)
139
140 virtual LightingPwmBase &setDefaultStateOn();
141 virtual LightingPwmBase &setDefaultStateOff();
142 virtual LightingPwmBase &setDefaultStateRestore();
143 // Set mapping between interface setting of brightness and actual value
144 // set on device. Values should be between 0.0 and 1.0.
145 // I.e. if limit is set to (0.05, 1.0), then values from Supla in range
146 // 0-100% are mapped to PWM values in range 5% and 100% of hardware max.
147 LightingPwmBase &setBrightnessRatioLimits(float min, float max);
148 // Set mapping between interface setting of color brightness and actual value
149 // set on device. Values should be between 0.0 and 1.0.
150 LightingPwmBase &setColorBrightnessRatioLimits(float min, float max);
151
152 void setBrightnessAdjuster(BrightnessAdjuster *adjuster);
153 int getCurrentDimmerBrightness() const;
154 int getCurrentRGBBrightness() const;
155
163 void setChannelSuspended(bool suspended);
164 bool isChannelSuspended() const;
165
173 void setMinPwmFrequency(uint16_t minPwmFrequency);
174
182 void setMaxPwmFrequency(uint16_t maxPwmFrequency);
183
193 void setPwmFrequency(uint16_t pwmFrequency);
194
205 static uint16_t normalizePwmFrequency(uint16_t pwmFrequency,
206 uint16_t minPwmFrequency,
207 uint16_t maxPwmFrequency,
208 uint16_t stepPwmFrequency);
209
217 void setStepPwmFrequency(uint16_t stepPwmFrequency);
218
224 void setPwmResolutionBits(uint8_t pwmResolutionBits);
225
231 uint16_t getMinPwmFrequency() const;
232
238 uint16_t getMaxPwmFrequency() const;
239
245 uint16_t getPwmFrequency() const;
246
252 uint16_t getStepPwmFrequency() const;
253
257 uint8_t getPwmResolutionBits() const;
258
264 bool hasParent() const;
265
271 int getAncestorCount() const;
272
273 protected:
283 int getMissingGpioCount() const;
284
285 void setMaxHwValue(int newMaxHwValue);
286
287 uint32_t scalePwmValueForOutput(const Supla::Io::IoPin &pin,
288 uint32_t value) const;
289
290 void enableChannel();
291 void disableChannel();
292 void updateEnabledState();
293
294 uint8_t addWithLimit(int value, int addition, int limit = 255);
295 virtual void iterateDimmerRGBW(int rgbStep, int wStep);
296 // Set mapping between interface setting of brightness and actual value
297 // set on device.
298 // Input value is in range 0-100.
299 // Returns value in range 0-1023 adjusted by selected function.
300 int adjustBrightness(int value);
301
302 int getStep(int step, int target, int current) const;
303 bool calculateAndUpdate(int targetValue,
304 int16_t *hwValue,
305 int distance,
306 uint32_t *lastChangeMs,
307 const uint32_t now) const;
308
310 uint8_t red = 0; // 0 - 255
311 uint8_t green = 255; // 0 - 255
312 uint8_t blue = 0; // 0 - 255
313 uint8_t colorBrightness = 0; // 0 - 100
314 uint8_t whiteBrightness = 0; // 0 - 100
315 uint8_t whiteTemperature = 0; // 0 - 100
316 } requested;
317
319 uint8_t colorBrightness = 100; // 0 - 100
320 uint8_t whiteBrightness = 100; // 0 - 100
321 } lastNonZero;
322
324 int16_t red = -1; // 0 - maxHwValue
325 int16_t green = -1; // 0 - maxHwValue
326 int16_t blue = -1; // 0 - maxHwValue
327 int16_t colorBrightness = -1; // 0 - maxHwValue
328 int16_t brightness = -1; // 0 - maxHwValue
329 int16_t whiteTemperature = -1; // 0 - maxHwValue
330 int16_t white1Brightness = -1; // 0 - maxHwValue
331 int16_t white2Brightness = -1; // 0 - maxHwValue
332 uint16_t redDistance = 0;
333 uint16_t greenDistance = 0;
334 uint16_t blueDistance = 0;
335 uint16_t colorBrightnessDistance = 0;
336 uint16_t brightnessDistance = 0;
337 uint16_t whiteTemperatureDistance = 0;
338 } hardware;
339
340 struct TimingState {
341 uint32_t lastTick = 0;
342 uint32_t lastChangeRedMs = 0;
343 uint32_t lastChangeGreenMs = 0;
344 uint32_t lastChangeBlueMs = 0;
345 uint32_t lastChangeColorBrightnessMs = 0;
346 uint32_t lastChangeBrightnessMs = 0;
347 uint32_t lastChangeWhiteTemperatureMs = 0;
348 uint32_t lastMsgReceivedMs = 0;
349 uint32_t lastIterateDimmerTimestamp = 0;
350 uint32_t iterationDelayTimestamp = 0;
351 uint32_t lastAutoIterateStartTimestamp = 0;
352 } timing;
353
354 uint8_t buttonStep = 10; // 10
355 uint8_t defaultDimmedBrightness = 20; // 20
356 bool dimIterationDirection = false;
357 bool resetDisance = false;
358 bool instant = false;
359 bool enabled = true;
360 bool manuallySuspended = false;
361 bool initDone = false;
362 bool skipLegacyMigration = false;
363 int8_t stateOnInit = RGBW_STATE_ON_INIT_RESTORE;
364 uint8_t minIterationBrightness = 1;
365 uint8_t maxTotalHwPower = 100;
366 uint8_t usedChannels = 0;
367 LegacyChannelFunction legacyChannelFunction = LegacyChannelFunction::None;
368
369 enum ButtonControlType buttonControlType = BUTTON_FOR_RGBW;
370 enum AutoIterateMode autoIterateMode = AutoIterateMode::OFF;
371
372 float minBrightnessRatio = 0.0f;
373 float maxBrightnessRatio = 1.0f;
374 float minColorBrightnessRatio = 0.0f;
375 float maxColorBrightnessRatio = 1.0f;
376
377 uint16_t minMaxIterationDelay = 750;
378 uint16_t fadeEffect = 500;
379
380 uint16_t minPwmFrequency = 100;
381 uint16_t maxPwmFrequency = 9000;
382 uint16_t pwmFrequency = 500;
383 uint16_t stepPwmFrequency = 1;
384
385 uint16_t maxHwValue = 1023;
386 uint8_t pwmResolutionBits = 10;
387
388 uint32_t previousChannelFunction = 0;
389
390 float warmWhiteGain = 1.0;
391 float coldWhiteGain = 1.0;
392
393 BrightnessAdjuster *brightnessAdjuster = nullptr;
394 Supla::Control::Button *attachedButton = nullptr;
395 LightingPwmBase *parent = nullptr;
396 Supla::Mutex *mutex = nullptr;
397};
398
400
401}; // namespace Control
402}; // namespace Supla
403
404#endif // SRC_SUPLA_CONTROL_LIGHTING_PWM_BASE_H_
Definition SuplaDevice.h:167
Definition action_handler.h:8
Definition channel_element.h:15
Definition lighting_pwm_base.h:25
Definition button.h:21
Definition lighting_pwm_base.h:32
Definition lighting_pwm_base.h:48
int getAncestorCount() const
Returns number of ancestor instances (by parent)
Definition lighting_pwm_base.cpp:1635
void setMaxPwmFrequency(uint16_t maxPwmFrequency)
Sets maximum PWM frequency.
Definition lighting_pwm_base.cpp:1655
void setMinPwmFrequency(uint16_t minPwmFrequency)
Sets minimum PWM frequency.
Definition lighting_pwm_base.cpp:1651
LightingPwmBase(LightingPwmBase *parent=nullptr)
Constructor.
Definition lighting_pwm_base.cpp:89
uint16_t getMaxPwmFrequency() const
Returns maximum PWM frequency.
Definition lighting_pwm_base.cpp:1750
void setSkipLegacyMigration()
Disables storage conversion from legacy channel function to new.
Definition lighting_pwm_base.cpp:1647
void setStepPwmFrequency(uint16_t stepPwmFrequency)
Sets PWM frequency step.
Definition lighting_pwm_base.cpp:1659
static uint16_t normalizePwmFrequency(uint16_t pwmFrequency, uint16_t minPwmFrequency, uint16_t maxPwmFrequency, uint16_t stepPwmFrequency)
Applies the same PWM frequency validation as setPwmFrequency().
Definition lighting_pwm_base.cpp:1726
void setPwmResolutionBits(uint8_t pwmResolutionBits)
Sets PWM resolution bits and updates the remembered hardware max value.
Definition lighting_pwm_base.cpp:1663
void convertStorageFromLegacyChannel(LegacyChannelFunction channelFunction)
Enables storage conversion from legacy channel function to new.
Definition lighting_pwm_base.cpp:1566
uint16_t getPwmFrequency() const
Returns current PWM frequency.
Definition lighting_pwm_base.cpp:1754
int32_t handleNewValueFromServer(TSD_SuplaChannelNewValue *newValue) override
Handles "new value" request from server.
Definition lighting_pwm_base.cpp:240
bool isStateStorageMigrationNeeded() const override
Method called after onInit() to check if state storage migration is needed.
Definition lighting_pwm_base.cpp:1642
void setChannelSuspended(bool suspended)
Suspends or resumes channel control of the physical outputs.
Definition lighting_pwm_base.cpp:231
void onFastTimer() override
Method called on fast timer interupt.
Definition lighting_pwm_base.cpp:798
void onInit() override
Third method called on element in SuplaDevice.begin()
Definition lighting_pwm_base.cpp:1087
void setPwmFrequency(uint16_t pwmFrequency)
Sets PWM frequency and applies validation.
Definition lighting_pwm_base.cpp:1718
void onSaveState() override
Method called periodically during SuplaDevice iteration.
Definition lighting_pwm_base.cpp:1245
void purgeConfig() override
Removes all configration data related to the element from Storage::Config.
Definition lighting_pwm_base.cpp:1543
bool hasParent() const
Checks if this instance has parent.
Definition lighting_pwm_base.cpp:1631
void onLoadConfig(SuplaDeviceClass *) override
First method called on element in SuplaDevice.begin().
Definition lighting_pwm_base.cpp:1441
int getMissingGpioCount() const
Returns number of GPIO pins that are required to control this channel.
Definition lighting_pwm_base.cpp:1571
uint8_t getPwmResolutionBits() const
Returns current PWM resolution bits remembered by this lighting instance.
Definition lighting_pwm_base.cpp:1762
void iterateAlways() override
Method called on each SuplaDevice iteration.
Definition lighting_pwm_base.cpp:199
void fillSuplaChannelNewValue(TSD_SuplaChannelNewValue *value) override
Fills TSD_SuplaChannelNewValue based on current state.
Definition lighting_pwm_base.cpp:1502
void onLoadState() override
Second method called on element in SuplaDevice.begin().
Definition lighting_pwm_base.cpp:1320
uint16_t getStepPwmFrequency() const
Returns PWM frequency step.
Definition lighting_pwm_base.cpp:1758
uint16_t getMinPwmFrequency() const
Returns minimum PWM frequency.
Definition lighting_pwm_base.cpp:1746
Definition mutex.h:9
Definition lighting_pwm_base.h:323
Definition lighting_pwm_base.h:318
Definition lighting_pwm_base.h:309
Definition lighting_pwm_base.h:340
Definition io_pin.h:14
Definition proto.h:3159
Definition proto.h:1228