diff --git a/include/device.hpp b/include/device.hpp index 37a97c9..202af16 100644 --- a/include/device.hpp +++ b/include/device.hpp @@ -55,6 +55,8 @@ struct DaliDt8State { std::optional mirek; std::optional mirekMin; std::optional mirekMax; + std::optional physicalMirekMin; + std::optional physicalMirekMax; std::optional> rgbwaf; std::optional> primaryN; diff --git a/include/dt8.hpp b/include/dt8.hpp index b55d7b8..5a2616d 100644 --- a/include/dt8.hpp +++ b/include/dt8.hpp @@ -99,6 +99,8 @@ class DaliDT8 { std::optional getMaxColorTemperature(int a); std::optional getPhysicalMinColorTemperature(int a); std::optional getPhysicalMaxColorTemperature(int a); + std::optional getColourTempLimitRaw(int address, int limitType); + std::optional getColourTempLimit(int address, int limitType); bool setColourRaw(int addr, int x1, int y1); diff --git a/src/device.cpp b/src/device.cpp index 1f93677..66c1699 100644 --- a/src/device.cpp +++ b/src/device.cpp @@ -145,6 +145,8 @@ DaliDt8State DaliDt8State::fromJson(const DaliValue::Object* json) { s.mirek = getObjectInt(*json, "mirek"); s.mirekMin = getObjectInt(*json, "mirekMin"); s.mirekMax = getObjectInt(*json, "mirekMax"); + s.physicalMirekMin = getObjectInt(*json, "physicalMirekMin"); + s.physicalMirekMax = getObjectInt(*json, "physicalMirekMax"); s.rgbwaf = asIntList(getObjectValue(*json, "rgbwaf")); s.primaryN = asIntList(getObjectValue(*json, "primaryN")); return s; @@ -174,6 +176,8 @@ DaliValue::Object DaliDt8State::toJson() const { if (mirek.has_value()) out["mirek"] = mirek.value(); if (mirekMin.has_value()) out["mirekMin"] = mirekMin.value(); if (mirekMax.has_value()) out["mirekMax"] = mirekMax.value(); + if (physicalMirekMin.has_value()) out["physicalMirekMin"] = physicalMirekMin.value(); + if (physicalMirekMax.has_value()) out["physicalMirekMax"] = physicalMirekMax.value(); if (rgbwaf.has_value()) out["rgbwaf"] = toIntArray(rgbwaf); if (primaryN.has_value()) out["primaryN"] = toIntArray(primaryN); return out; diff --git a/src/dt8.cpp b/src/dt8.cpp index bb1a340..76393e3 100644 --- a/src/dt8.cpp +++ b/src/dt8.cpp @@ -5,6 +5,28 @@ #include #include +namespace { +int colourTempLimitQuerySelector(int limitType) { + switch (limitType & 0xFF) { + case 0: + return 128; + case 1: + return 130; + case 2: + return 129; + case 3: + return 131; + default: + return (limitType & 0x01) == 0 ? 128 : 130; + } +} + +std::optional kelvinFromMirek(std::optional mirek) { + if (!mirek.has_value() || mirek.value() == 0) return std::nullopt; + return static_cast(std::floor(1000000.0 / static_cast(mirek.value()))); +} +} // namespace + DaliDT8::DaliDT8(DaliBase& base) : base_(base) {} bool DaliDT8::enableDT8() { return base_.dtSelect(8); } @@ -104,6 +126,14 @@ std::optional DaliDT8::getPhysicalMaxColorTemperature(int a) { return static_cast(std::floor(1000000.0 / static_cast(mirek.value()))); } +std::optional DaliDT8::getColourTempLimitRaw(int address, int limitType) { + return getColourRaw(address, colourTempLimitQuerySelector(limitType)); +} + +std::optional DaliDT8::getColourTempLimit(int address, int limitType) { + return kelvinFromMirek(getColourTempLimitRaw(address, limitType)); +} + bool DaliDT8::setColourRaw(int addr, int x1, int y1) { const int x1L = x1 & 0xFF; const int y1L = y1 & 0xFF;