initial commit

This commit is contained in:
Tony
2026-03-26 12:04:08 +08:00
commit 7e8ac7f566
31 changed files with 4304 additions and 0 deletions

129
include/dt1.hpp Normal file
View File

@@ -0,0 +1,129 @@
#pragma once
#include "base.hpp"
#include <cstdint>
#include <optional>
struct DT1TestStatusDetailed {
std::optional<int> failureStatus;
std::optional<int> emergencyStatus;
std::optional<int> emergencyMode;
std::optional<int> 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<int> getDT1EmergencyMode(int a);
std::optional<int> getDT1Feature(int a);
std::optional<int> getDT1FailureStatus(int a);
std::optional<int> getDT1Status(int a);
std::optional<int> getDT1SelfTestStatus(int a);
std::optional<DT1TestStatusDetailed> 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<int>& dtr0 = std::nullopt,
const std::optional<int>& dtr1 = std::nullopt);
std::optional<int> getExtendedVersionDT1(int a);
std::optional<int> getEmergencyLevel(int a);
std::optional<int> getEmergencyMinLevel(int a);
std::optional<int> getEmergencyMaxLevel(int a);
std::optional<int> getProlongTimeMinutes(int a);
std::optional<int> getFunctionTestIntervalDays(int a);
std::optional<int> getDurationTestIntervalWeeks(int a);
std::optional<int> getDurationTestResult(int a);
std::optional<int> getLampEmergencyTimeMinutes(int a);
std::optional<int> getRatedDurationMinutes(int a);
std::optional<DaliDT1DeviceStatus> getDeviceStatus(int a);
std::optional<DaliDT1EmergencyStatus> getEmergencyStatusDecoded(int a);
private:
DaliBase& base_;
bool enable();
static int addrOf(int a);
bool send(int a, int code);
std::optional<int> query(int a, int code);
};