feat: implement device name handling and update gateway name features

Signed-off-by: Tony <tonylu@tony-cloud.com>
This commit is contained in:
Tony
2026-06-12 01:26:31 +08:00
parent dceede8602
commit 40a0e8e303
11 changed files with 192 additions and 23 deletions
@@ -44,6 +44,7 @@ constexpr uint8_t kDali103QueryResponseOpcode = 0x63;
constexpr uint8_t kDali103NoResponseOpcode = 0x64;
constexpr uint8_t kDali103RawFrameOpcode = 0x65;
constexpr uint16_t kGatewayFeatureCache = 0x0040;
constexpr uint16_t kGatewayFeatureNames = 0x0080;
constexpr uint16_t kGatewayFeatureNativeCpp = 0x0100;
constexpr uint8_t kGatewayCacheOpcode = 0x39;
constexpr uint8_t kGatewayCacheProtocolVersion = 1;
@@ -252,6 +253,15 @@ void AppendPaddedName(std::vector<uint8_t>& out, std::string_view name) {
}
}
void AppendGatewayNameResponse(std::vector<uint8_t>& out, std::string_view name) {
const auto normalized = NormalizeName(name);
out.push_back(static_cast<uint8_t>(normalized.size()));
AppendStringBytes(out, normalized);
while (out.size() < 4 + kMaxNameBytes) {
out.push_back(0x00);
}
}
const char* PhyKindToString(DaliPhyKind phy_kind) {
switch (phy_kind) {
case DaliPhyKind::kNativeHardware:
@@ -865,6 +875,7 @@ void GatewayController::dispatchCommand(const std::vector<uint8_t>& command) {
if (config_.cache_supported) {
feature |= kGatewayFeatureCache;
}
feature |= kGatewayFeatureNames;
std::vector<uint8_t> payload{0x03, gateway_id};
AppendFeatureBits(payload, feature);
publishPayload(gateway_id, payload);
@@ -1624,13 +1635,19 @@ void GatewayController::handleGatewayNameCommand(uint8_t gateway_id,
const uint8_t op = command[4];
if (op == 0x00) {
const auto name = gatewayName(gateway_id);
std::vector<uint8_t> payload{0x05, gateway_id, op,
static_cast<uint8_t>(std::min(name.size(), kMaxNameBytes))};
AppendStringBytes(payload, NormalizeName(name));
std::vector<uint8_t> payload{0x05, gateway_id, op};
AppendGatewayNameResponse(payload, name);
publishPayload(gateway_id, payload);
return;
}
if (op != 0x01) {
if (op == 0x02) {
const auto name = runtime_.deviceName();
std::vector<uint8_t> payload{0x05, gateway_id, op};
AppendGatewayNameResponse(payload, name);
publishPayload(gateway_id, payload);
return;
}
if (op != 0x01 && op != 0x03) {
return;
}
@@ -1647,10 +1664,12 @@ void GatewayController::handleGatewayNameCommand(uint8_t gateway_id,
for (size_t index = 0; index < actual_len; ++index) {
name.push_back(static_cast<char>(command[6 + index]));
}
if (runtime_.setGatewayName(gateway_id, name)) {
const bool saved = op == 0x03 ? runtime_.setDeviceName(name)
: runtime_.setGatewayName(gateway_id, name);
if (saved) {
refreshRuntimeGatewayNames();
for (const auto& sink : gateway_name_sinks_) {
sink(gateway_id);
sink(op == 0x03 ? 0xff : gateway_id);
}
publishPayload(gateway_id, {0x05, gateway_id, op, 0x01});
} else {