#pragma once #include "base.hpp" #include class DaliDT5ConverterFeatures { public: explicit DaliDT5ConverterFeatures(int raw) : raw_(raw & 0xFF) {} int raw() const { return raw_; } bool outputRange0To10VSelectable() const { return bit(0x01); } bool internalPullUpSelectable() const { return bit(0x02); } bool outputFaultDetectionSelectable() const { return bit(0x04); } bool mainsRelay() const { return bit(0x08); } bool outputLevelQueryable() const { return bit(0x10); } bool nonLogarithmicDimmingCurveSupported() const { return bit(0x20); } bool physicalSelectionByOutputLossSupported() const { return bit(0x40); } bool physicalSelectionSwitchSupported() const { return bit(0x80); } private: int raw_ = 0; bool bit(int mask) const { return (raw_ & mask) != 0; } }; class DaliDT5FailureStatus { public: explicit DaliDT5FailureStatus(int raw) : raw_(raw & 0xFF) {} int raw() const { return raw_; } bool outputFaultDetected() const { return (raw_ & 0x01) != 0; } private: int raw_ = 0; }; class DaliDT5ConverterStatus { public: explicit DaliDT5ConverterStatus(int raw) : raw_(raw & 0xFF) {} int raw() const { return raw_; } bool zeroToTenVoltOperation() const { return (raw_ & 0x01) != 0; } bool internalPullUpOn() const { return (raw_ & 0x02) != 0; } bool nonLogarithmicDimmingCurveActive() const { return (raw_ & 0x04) != 0; } private: int raw_ = 0; }; class DaliDT5 { public: explicit DaliDT5(DaliBase& base); bool enableDT5(); bool setOutputRange1To10V(int a); bool setOutputRange0To10V(int a); bool switchOnInternalPullUp(int a); bool switchOffInternalPullUp(int a); bool storePhysicalMinimum(int a, int level); bool selectDimmingCurve(int a, int curve); bool resetConverterSettings(int a); std::optional getDimmingCurve(int a); std::optional getOutputLevelRaw(int a); std::optional getOutputLevelVolts(int a); std::optional getConverterFeatures(int a); std::optional getFailureStatus(int a); std::optional getConverterStatus(int a); std::optional getExtendedVersion(int a); private: DaliBase& base_; bool enable(); static int addrOf(int a); bool send(int a, int code); std::optional query(int a, int code); };