Enhance DaliDT8: add RGBWAF control modes and methods for temporary color scene storage

Signed-off-by: Tony <tonylu@tony-cloud.com>
This commit is contained in:
Tony
2026-06-07 01:09:37 +08:00
parent 439a2078ba
commit 440dbd1757
2 changed files with 41 additions and 0 deletions
+14
View File
@@ -96,6 +96,12 @@ enum class Dt8PreferredColorType {
rgbwaf, rgbwaf,
}; };
enum class Dt8RgbwafControlMode {
channelControl = 0,
colorControl = 1,
standardizedColorControl = 2,
};
class DaliDT8 { class DaliDT8 {
public: public:
explicit DaliDT8(DaliBase& base); explicit DaliDT8(DaliBase& base);
@@ -125,7 +131,14 @@ class DaliDT8 {
bool setTemporaryPrimaryDimLevel(int a, int n, double level); bool setTemporaryPrimaryDimLevel(int a, int n, double level);
bool setTemporaryRGBDimLevels(int a, int r, int g, int b); bool setTemporaryRGBDimLevels(int a, int r, int g, int b);
bool setTemporaryWAFDimLevels(int a, int w, int amber, int freecolour); bool setTemporaryWAFDimLevels(int a, int w, int amber, int freecolour);
static int rgbwafControlValue(bool red = false, bool green = false, bool blue = false,
bool white = false, bool amber = false, bool freecolour = false,
Dt8RgbwafControlMode mode = Dt8RgbwafControlMode::channelControl);
bool setTemporaryRGBWAFControl(int a, int control); bool setTemporaryRGBWAFControl(int a, int control);
bool setTemporaryRGBWAFChannelControl(int a, bool red = false, bool green = false,
bool blue = false, bool white = false, bool amber = false,
bool freecolour = false,
Dt8RgbwafControlMode mode = Dt8RgbwafControlMode::channelControl);
bool setTemporaryRGBWAFDimLevels(int a, int r, int g, int b, int w, int amber, bool setTemporaryRGBWAFDimLevels(int a, int r, int g, int b, int w, int amber,
int freecolour, int control); int freecolour, int control);
bool setTemporaryColourMask(int a); bool setTemporaryColourMask(int a);
@@ -215,6 +228,7 @@ class DaliDT8 {
int white = 0, int amber = 0, int freecolour = 254, int white = 0, int amber = 0, int freecolour = 254,
int rgbwafControl = -1, int rgbwafControl = -1,
int gateway = -1); int gateway = -1);
bool storeCurrentTemporaryColourAsScene(int address, int scene, int brightness);
bool storePowerOnLevelSnapshot(int address, int level); bool storePowerOnLevelSnapshot(int address, int level);
bool storePowerOnLevelColorSnapshot(int address, int level, int r, int g, int b, bool storePowerOnLevelColorSnapshot(int address, int level, int r, int g, int b,
Dt8PreferredColorType preferredColorType = Dt8PreferredColorType::xy); Dt8PreferredColorType preferredColorType = Dt8PreferredColorType::xy);
+27
View File
@@ -240,6 +240,18 @@ bool DaliDT8::setTemporaryWAFDimLevels(int a, int w, int amber, int freecolour)
base_.dtSelect(8) && base_.sendExtCmd(addr, DALI_CMD_DT8_SET_TEMPORARY_WAF_DIM_LEVELS); base_.dtSelect(8) && base_.sendExtCmd(addr, DALI_CMD_DT8_SET_TEMPORARY_WAF_DIM_LEVELS);
} }
int DaliDT8::rgbwafControlValue(bool red, bool green, bool blue, bool white, bool amber,
bool freecolour, Dt8RgbwafControlMode mode) {
int value = static_cast<int>(mode) << 6;
if (red) value |= 0x01;
if (green) value |= 0x02;
if (blue) value |= 0x04;
if (white) value |= 0x08;
if (amber) value |= 0x10;
if (freecolour) value |= 0x20;
return value & 0xFF;
}
bool DaliDT8::setTemporaryRGBWAFControl(int a, int control) { bool DaliDT8::setTemporaryRGBWAFControl(int a, int control) {
const int storedControl = std::clamp(control, 0, 254); const int storedControl = std::clamp(control, 0, 254);
const int addr = a * 2 + 1; const int addr = a * 2 + 1;
@@ -247,6 +259,13 @@ bool DaliDT8::setTemporaryRGBWAFControl(int a, int control) {
base_.sendExtCmd(addr, DALI_CMD_DT8_SET_TEMPORARY_RGBWAF_CONTROL); base_.sendExtCmd(addr, DALI_CMD_DT8_SET_TEMPORARY_RGBWAF_CONTROL);
} }
bool DaliDT8::setTemporaryRGBWAFChannelControl(int a, bool red, bool green, bool blue,
bool white, bool amber, bool freecolour,
Dt8RgbwafControlMode mode) {
return setTemporaryRGBWAFControl(
a, rgbwafControlValue(red, green, blue, white, amber, freecolour, mode));
}
bool DaliDT8::setTemporaryRGBWAFDimLevels(int a, int r, int g, int b, int w, int amber, bool DaliDT8::setTemporaryRGBWAFDimLevels(int a, int r, int g, int b, int w, int amber,
int freecolour, int control) { int freecolour, int control) {
return setTemporaryRGBDimLevels(a, r, g, b) && setTemporaryWAFDimLevels(a, w, amber, freecolour) && return setTemporaryRGBDimLevels(a, r, g, b) && setTemporaryWAFDimLevels(a, w, amber, freecolour) &&
@@ -456,6 +475,14 @@ bool DaliDT8::storeSceneSnapshot(int address, int scene, int brightness,
return base_.dtSelect(8) && base_.storeDTRAsSceneBright(address, sceneIndex); return base_.dtSelect(8) && base_.storeDTRAsSceneBright(address, sceneIndex);
} }
bool DaliDT8::storeCurrentTemporaryColourAsScene(int address, int scene, int brightness) {
const int sceneBrightness = std::clamp(brightness, 0, 255);
const int sceneIndex = std::clamp(scene, 0, 15);
if (!base_.setDTR(sceneBrightness)) return false;
// DT SELECT is one-shot and SET DTR consumes any earlier selection.
return base_.dtSelect(8) && base_.storeDTRAsSceneBright(address, sceneIndex);
}
bool DaliDT8::storePowerOnLevelSnapshot(int address, int level) { bool DaliDT8::storePowerOnLevelSnapshot(int address, int level) {
const int storedLevel = std::clamp(level, 0, 254); const int storedLevel = std::clamp(level, 0, 254);
// DT SELECT is one-shot and SET DTR consumes any earlier selection. // DT SELECT is one-shot and SET DTR consumes any earlier selection.