feat: implement device name handling and update gateway name features
Signed-off-by: Tony <tonylu@tony-cloud.com>
This commit is contained in:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user