diff --git a/README.md b/README.md index 8442406..40b5ca8 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,7 @@ Dali dali(comm); ```cpp dali.base.setBright(5, 200); // direct arc power control +dali.base.setBright(5, 128, true); // direct arc power with logarithmic curve dali.base.off(5); dali.base.dtSelect(8); dali.dt8.setColorTemperature(5, 4000); // Kelvin @@ -71,6 +72,9 @@ DaliBridgeRequest request; request.modelID = "line-1-brightness"; request.value = 180; engine.execute(request); + +request.value = DaliValue::Object{{"value", 128}, {"logarithmicCurve", true}}; +engine.execute(request); // set_brightness with app-side logarithmic curve ``` ### Supported Bridge Operations @@ -95,6 +99,9 @@ engine.execute(request); - `start_emergency_function_test` - `stop_emergency_test` +`set_brightness` and `set_brightness_percent` accept optional +`logarithmicCurve` / `logarithmic_curve` boolean request fields. + Query-style operations return `data` when available and may include decoded flags in `meta`. ## Notes diff --git a/include/base.hpp b/include/base.hpp index 239b05c..4c28f2b 100644 --- a/include/base.hpp +++ b/include/base.hpp @@ -50,8 +50,8 @@ class DaliBase { // Brightness helpers int brightnessToLog(int brightness) const; int logToBrightness(int logValue) const; - bool setBright(int a, int b); - bool setBrightPercentage(int a, double b); + bool setBright(int a, int b, bool logarithmicCurve = false); + bool setBrightPercentage(int a, double b, bool logarithmicCurve = false); bool stopFade(int a); bool off(int a); bool on(int a); diff --git a/src/base.cpp b/src/base.cpp index d569a96..ba3fa67 100644 --- a/src/base.cpp +++ b/src/base.cpp @@ -68,16 +68,18 @@ int DaliBase::logToBrightness(int logValue) const { return static_cast(val); } -bool DaliBase::setBright(int a, int b) { - int bright = std::clamp(b, 0, 254); +bool DaliBase::setBright(int a, int b, bool logarithmicCurve) { + const int inputBright = std::clamp(b, 0, 254); + const int bright = logarithmicCurve ? std::clamp(brightnessToLog(inputBright), 0, 254) + : inputBright; const auto addr = encodeArcAddr(a); return comm_.sendCmd(addr, static_cast(bright)); } -bool DaliBase::setBrightPercentage(int a, double b) { +bool DaliBase::setBrightPercentage(int a, double b, bool logarithmicCurve) { int bright = static_cast(b * 254.0 / 100.0); bright = std::clamp(bright, 0, 254); - return setBright(a, bright); + return setBright(a, bright, logarithmicCurve); } bool DaliBase::stopFade(int a) { return sendCmd(encodeCmdAddr(a), DALI_CMD_STOP_FADE); } diff --git a/src/bridge.cpp b/src/bridge.cpp index 6b650ba..59e4bc6 100644 --- a/src/bridge.cpp +++ b/src/bridge.cpp @@ -649,13 +649,16 @@ DaliBridgeResult DaliBridgeEngine::executeResolved(const DaliBridgeRequest& requ result.error = "missing target address"; return result; } + const bool logarithmicCurve = + boolParam(request, {"logarithmicCurve", "logarithmic_curve", "logCurve", "log_curve"}) + .value_or(false); if (operation == BridgeOperation::setBrightness) { const auto value = resolveIntValue(request, model); if (!value.has_value()) { result.error = "missing value"; return result; } - result.ok = base_.setBright(address.value(), value.value()); + result.ok = base_.setBright(address.value(), value.value(), logarithmicCurve); result.data = value.value(); } else if (operation == BridgeOperation::setBrightnessPercent) { const auto value = resolveDoubleValue(request); @@ -663,7 +666,7 @@ DaliBridgeResult DaliBridgeEngine::executeResolved(const DaliBridgeRequest& requ result.error = "missing value"; return result; } - result.ok = base_.setBrightPercentage(address.value(), value.value()); + result.ok = base_.setBrightPercentage(address.value(), value.value(), logarithmicCurve); result.data = static_cast(std::lround(value.value())); } else if (operation == BridgeOperation::on) { result.ok = base_.on(address.value());