From 5e02d9baaaf0d82d7122e7d64ff4b78d9d6d18bb Mon Sep 17 00:00:00 2001 From: Tony Date: Mon, 15 Jun 2026 17:01:44 +0800 Subject: [PATCH] Enhance DaliBase and BridgeModel: add readMemoryLocation method and support for readMemoryIdentity operation Signed-off-by: Tony --- include/base.hpp | 1 + include/bridge_model.hpp | 3 ++- src/base.cpp | 10 ++++++++++ src/bridge.cpp | 1 + src/bridge_model.cpp | 7 ++++++- 5 files changed, 20 insertions(+), 2 deletions(-) diff --git a/include/base.hpp b/include/base.hpp index 4c28f2b..211ea0a 100644 --- a/include/base.hpp +++ b/include/base.hpp @@ -72,6 +72,7 @@ class DaliBase { std::optional getDTR(int a); std::optional getDTR1(int a); std::optional getDTR2(int a); + std::optional readMemoryLocation(int a, int bank, int location); bool copyCurrentBrightToDTR(int a); // Colour value helpers (DT8 plumbing) diff --git a/include/bridge_model.hpp b/include/bridge_model.hpp index 2ea412d..5216d54 100644 --- a/include/bridge_model.hpp +++ b/include/bridge_model.hpp @@ -121,6 +121,7 @@ enum class BridgeOperation { setColourRGBCW = 81, setColourRGBWAF = 82, setTemporaryRGBWAFDimLevels = 83, + readMemoryIdentity = 84, }; enum class BridgeValueEncoding { @@ -195,4 +196,4 @@ const char* bridgeOperationToString(BridgeOperation operation); BridgeOperation bridgeOperationFromString(const std::string& value); const char* bridgeValueEncodingToString(BridgeValueEncoding encoding); -BridgeValueEncoding bridgeValueEncodingFromString(const std::string& value); \ No newline at end of file +BridgeValueEncoding bridgeValueEncodingFromString(const std::string& value); diff --git a/src/base.cpp b/src/base.cpp index ba3fa67..22320a1 100644 --- a/src/base.cpp +++ b/src/base.cpp @@ -112,6 +112,16 @@ std::optional DaliBase::getDTR1(int a) { return query(a, DALI_CMD_QUERY_CON std::optional DaliBase::getDTR2(int a) { return query(a, DALI_CMD_QUERY_CONTENT_DTR2); } +std::optional DaliBase::readMemoryLocation(int a, int bank, int location) { + if (!setDTR1(bank & 0xFF)) { + return std::nullopt; + } + if (!setDTR(location & 0xFF)) { + return std::nullopt; + } + return query(a, DALI_CMD_READ_MEMORY_LOCATION); +} + bool DaliBase::copyCurrentBrightToDTR(int a) { return sendExtCmd(encodeCmdAddr(a), DALI_CMD_STORE_ACTUAL_LEVEL_IN_THE_DTR); } diff --git a/src/bridge.cpp b/src/bridge.cpp index 59e4bc6..7f43fe7 100644 --- a/src/bridge.cpp +++ b/src/bridge.cpp @@ -164,6 +164,7 @@ bool isReadOperation(BridgeOperation operation) { case BridgeOperation::dt1GetRatedDuration: case BridgeOperation::dt1GetExtendedVersion: case BridgeOperation::dt1GetEmergencyDeviceType: + case BridgeOperation::readMemoryIdentity: return true; default: return false; diff --git a/src/bridge_model.cpp b/src/bridge_model.cpp index ebc144a..cdedc0d 100644 --- a/src/bridge_model.cpp +++ b/src/bridge_model.cpp @@ -478,6 +478,8 @@ const char* bridgeOperationToString(BridgeOperation operation) { return "dt1_get_extended_version"; case BridgeOperation::dt1GetEmergencyDeviceType: return "dt1_get_emergency_device_type"; + case BridgeOperation::readMemoryIdentity: + return "read_memory_identity"; case BridgeOperation::unknown: default: return "unknown"; @@ -623,6 +625,9 @@ BridgeOperation bridgeOperationFromString(const std::string& value) { if (normalized == "dt1_get_emergency_device_type" || normalized == "dt1_get_type") { return BridgeOperation::dt1GetEmergencyDeviceType; } + if (normalized == "read_memory_identity" || normalized == "get_memory_identity") { + return BridgeOperation::readMemoryIdentity; + } if (normalized == "search_address_range") return BridgeOperation::searchAddressRange; if (normalized == "allocate_all_short_addresses" || normalized == "allocate_all_addr") { return BridgeOperation::allocateAllShortAddresses; @@ -655,4 +660,4 @@ BridgeValueEncoding bridgeValueEncodingFromString(const std::string& value) { if (normalized == "percentage") return BridgeValueEncoding::percentage; if (normalized == "kelvin") return BridgeValueEncoding::kelvin; return BridgeValueEncoding::none; -} \ No newline at end of file +}