#include "dt4.hpp" #include "dali_define.hpp" #include #include DaliDT4::DaliDT4(DaliBase& base) : base_(base) {} bool DaliDT4::enable() { return base_.dtSelect(4); } int DaliDT4::addrOf(int a) { return a * 2 + 1; } std::optional DaliDT4::query(int a, int code) { if (!enable()) return std::nullopt; return base_.queryCmd(static_cast(addrOf(a)), static_cast(code)); } std::optional DaliDT4::queryYesNo(int a, int code) { const auto value = query(a, code); if (!value.has_value()) return std::nullopt; return value.value() != 0; } bool DaliDT4::enableDT4() { return enable(); } bool DaliDT4::referenceSystemPower(int a) { return enable() && base_.sendExtCmd(addrOf(a), DALI_CMD_DT4_REFERENCE_SYSTEM_POWER); } bool DaliDT4::selectDimmingCurve(int a, int curve) { const int value = std::clamp(curve, 0, 255); return base_.setDTR(value) && enable() && base_.sendExtCmd(addrOf(a), DALI_CMD_DT4_SELECT_DIMMING_CURVE); } std::optional DaliDT4::getDimmingCurve(int a) { return query(a, DALI_CMD_DT4_QUERY_DIMMING_CURVE); } std::optional DaliDT4::getDimmerStatus(int a) { const auto raw = query(a, DALI_CMD_DT4_QUERY_DIMMER_STATUS); if (!raw.has_value()) return std::nullopt; return DaliDT4DimmerStatus(raw.value()); } std::optional DaliDT4::getFeatures(int a) { const auto raw1 = query(a, DALI_CMD_DT4_QUERY_FEATURES); if (!raw1.has_value()) return std::nullopt; const auto raw2 = base_.getDTR(a); const auto raw3 = base_.getDTR1(a); if (!raw2.has_value() || !raw3.has_value()) return std::nullopt; return DaliDT4Features(raw1.value(), raw2.value(), raw3.value()); } std::optional DaliDT4::getFailureStatus(int a) { const auto raw1 = query(a, DALI_CMD_DT4_QUERY_FAILURE_STATUS); if (!raw1.has_value()) return std::nullopt; const auto raw2 = base_.getDTR1(a); if (!raw2.has_value()) return std::nullopt; return DaliDT4FailureStatus(raw1.value(), raw2.value()); } std::optional DaliDT4::getDimmerTemperatureRaw(int a) { return query(a, DALI_CMD_DT4_QUERY_DIMMER_TEMPERATURE); } std::optional DaliDT4::getDimmerTemperatureCelsius(int a) { const auto raw = getDimmerTemperatureRaw(a); if (!raw.has_value() || raw.value() == 0xFF) return std::nullopt; return raw.value() - 40; } std::optional DaliDT4::getRmsSupplyVoltageRaw(int a) { return query(a, DALI_CMD_DT4_QUERY_RMS_SUPPLY_VOLTAGE); } std::optional DaliDT4::getRmsSupplyVoltageVolts(int a) { const auto raw = getRmsSupplyVoltageRaw(a); if (!raw.has_value() || raw.value() == 0xFF) return std::nullopt; return raw.value() * 2.0; } std::optional DaliDT4::getSupplyFrequencyRaw(int a) { return query(a, DALI_CMD_DT4_QUERY_SUPPLY_FREQUENCY); } std::optional DaliDT4::getSupplyFrequencyHertz(int a) { const auto raw = getSupplyFrequencyRaw(a); if (!raw.has_value() || raw.value() == 0xFF) return std::nullopt; return raw.value() * 0.5; } std::optional DaliDT4::getRmsLoadVoltageRaw(int a) { return query(a, DALI_CMD_DT4_QUERY_RMS_LOAD_VOLTAGE); } std::optional DaliDT4::getRmsLoadVoltageVolts(int a) { const auto raw = getRmsLoadVoltageRaw(a); if (!raw.has_value() || raw.value() == 0xFF) return std::nullopt; return raw.value() * 2.0; } std::optional DaliDT4::getRmsLoadCurrentRaw(int a) { return query(a, DALI_CMD_DT4_QUERY_RMS_LOAD_CURRENT); } std::optional DaliDT4::getRmsLoadCurrentPercent(int a) { const auto raw = getRmsLoadCurrentRaw(a); if (!raw.has_value() || raw.value() == 0xFF) return std::nullopt; return raw.value() * 0.5; } std::optional DaliDT4::getRealLoadPowerRaw(int a) { const auto high = query(a, DALI_CMD_DT4_QUERY_REAL_LOAD_POWER); if (!high.has_value()) return std::nullopt; const auto low = base_.getDTR(a); if (!low.has_value()) return std::nullopt; return ((high.value() & 0xFF) << 8) | (low.value() & 0xFF); } std::optional DaliDT4::getRealLoadPowerWatts(int a) { const auto raw = getRealLoadPowerRaw(a); if (!raw.has_value() || raw.value() == 0xFFFF) return std::nullopt; return raw.value() * 0.25; } std::optional DaliDT4::getLoadRatingRaw(int a) { return query(a, DALI_CMD_DT4_QUERY_LOAD_RATING); } std::optional DaliDT4::getLoadRatingAmps(int a) { const auto raw = getLoadRatingRaw(a); if (!raw.has_value() || raw.value() == 0xFF) return std::nullopt; return raw.value() * 0.15; } std::optional DaliDT4::isReferenceRunning(int a) { return queryYesNo(a, DALI_CMD_DT4_QUERY_REFERENCE_RUNNING); } std::optional DaliDT4::isReferenceMeasurementFailed(int a) { return queryYesNo(a, DALI_CMD_DT4_QUERY_REFERENCE_MEASUREMENT_FAILED); } std::optional DaliDT4::getExtendedVersion(int a) { return query(a, DALI_CMD_DT4_QUERY_EXTENDED_VERSION); }