#pragma once #include "base.hpp" #include #include struct DT1TestStatusDetailed { std::optional failureStatus; std::optional emergencyStatus; std::optional emergencyMode; std::optional feature; bool testInProgress = false; bool lampFailure = false; bool batteryFailure = false; bool functionTestActive = false; bool durationTestActive = false; bool testDone = false; bool identifyActive = false; bool physicalSelectionActive = false; }; class DaliDT1DeviceStatus { public: explicit DaliDT1DeviceStatus(int raw) : raw_(raw & 0xFF) {} int raw() const { return raw_; } bool controlGearFailure() const { return bit(0x01); } bool controlGearOk() const { return !controlGearFailure(); } bool lampFailure() const { return bit(0x02); } bool lampPoweredByEmergencyGear() const { return bit(0x04); } bool arcPowerBit3() const { return bit(0x08); } bool arcPowerBit4() const { return bit(0x10); } bool resetState() const { return bit(0x20); } bool missingShortAddress() const { return bit(0x40); } bool arcPowerBit7() const { return bit(0x80); } private: int raw_ = 0; bool bit(int mask) const { return (raw_ & mask) != 0; } }; class DaliDT1EmergencyStatus { public: explicit DaliDT1EmergencyStatus(int raw) : raw_(raw & 0xFF) {} int raw() const { return raw_; } bool inhibitMode() const { return bit(0x01); } bool functionTestResultValid() const { return bit(0x02); } bool durationTestResultValid() const { return bit(0x04); } bool batteryFullyCharged() const { return bit(0x08); } bool functionTestRequestPending() const { return bit(0x10); } bool durationTestRequestPending() const { return bit(0x20); } bool identificationActive() const { return bit(0x40); } bool physicallySelected() const { return bit(0x80); } bool batteryChargingInProgress() const { return !batteryFullyCharged(); } private: int raw_ = 0; bool bit(int mask) const { return (raw_ & mask) != 0; } }; class DaliDT1 { public: explicit DaliDT1(DaliBase& base); bool enableDT1(); bool startDT1Test(int a, int t = 1); std::optional getDT1EmergencyMode(int a); std::optional getDT1Feature(int a); std::optional getDT1FailureStatus(int a); std::optional getDT1Status(int a); std::optional getDT1SelfTestStatus(int a); std::optional getDT1TestStatusDetailed(int a); bool performDT1Test(int a, int timeout = 5); bool rest(int a); bool inhibit(int a); bool reLightOrResetInhibit(int a); bool startFunctionTestCmd(int a); bool startDurationTestCmd(int a); bool stopTest(int a); bool resetFunctionTestDoneFlag(int a); bool resetDurationTestDoneFlag(int a); bool resetLampTime(int a); bool resetStatusFlags(int a); bool resetLampOperationTime(int a); bool resetTestResults(int a); bool storeEmergencyLevel(int a, int level); bool storeTestDelayTimeHighByte(int a, int highByte); bool storeTestDelayTimeLowByte(int a, int lowByte); bool storeFunctionTestIntervalDays(int a, int days); bool storeDurationTestIntervalWeeks(int a, int weeks); bool storeTestDelayTime16(int a, int quartersOfHour); bool storeProlongTimeMinutes(int a, int minutes); bool storeRatedDurationMinutes(int a, int minutes); bool storeEmergencyMinLevel(int a, int level); bool storeEmergencyMaxLevel(int a, int level); bool startIdentification(int a); bool performDTRSelectedFunction(int a, const std::optional& dtr0 = std::nullopt, const std::optional& dtr1 = std::nullopt); std::optional getExtendedVersionDT1(int a); std::optional getEmergencyLevel(int a); std::optional getEmergencyMinLevel(int a); std::optional getEmergencyMaxLevel(int a); std::optional getProlongTimeMinutes(int a); std::optional getFunctionTestIntervalDays(int a); std::optional getDurationTestIntervalWeeks(int a); std::optional getDurationTestResult(int a); std::optional getLampEmergencyTimeMinutes(int a); std::optional getRatedDurationMinutes(int a); std::optional getDeviceStatus(int a); std::optional getEmergencyStatusDecoded(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); };