Files
Tony 1550ab15d6 Enhance bridge operation handling and improve JSON conversion
- Added new bridge operations to the bridgeOperationToString and bridgeOperationFromString functions for better command recognition.
- Implemented a fromCjson function to convert cJSON objects to DaliValue, supporting various data types including arrays and objects.
- Introduced isKnownBridgeRequestKey function to filter out unknown keys in bridge requests.
- Refactored handleDownlink to utilize the new fromCjson function for value and metadata extraction, improving code clarity and maintainability.
- Updated response creation to use a more structured approach with DaliValue's toJson method.

Signed-off-by: Tony <tonylu@tony-cloud.com>
2026-05-04 09:45:15 +08:00

75 lines
2.2 KiB
C++

#pragma once
#include "base.hpp"
#include "addr.hpp"
#include "bridge_model.hpp"
#include "dali_comm.hpp"
#include "dt1.hpp"
#include "dt4.hpp"
#include "dt5.hpp"
#include "dt6.hpp"
#include "dt8.hpp"
#include <map>
#include <optional>
#include <string>
#include <vector>
struct DaliBridgeRequest {
std::string sequence;
std::string modelID;
std::optional<BridgeOperation> operation;
std::optional<int> rawAddress;
std::optional<int> rawCommand;
std::optional<int> shortAddress;
DaliValue value;
DaliValue::Object metadata;
};
struct DaliBridgeResult {
std::string sequence;
std::string modelID;
BridgeOperation operation = BridgeOperation::unknown;
bool ok = false;
std::optional<int> data;
std::string error;
DaliValue::Object metadata;
DaliValue::Array results;
DaliValue::Object toJson() const;
};
class DaliBridgeEngine {
public:
explicit DaliBridgeEngine(DaliComm& comm);
bool upsertModel(const BridgeModel& model);
bool removeModel(const std::string& modelID);
const BridgeModel* findModel(const std::string& modelID) const;
std::vector<BridgeModel> listModels() const;
DaliBridgeResult execute(const DaliBridgeRequest& request);
private:
DaliComm& comm_;
DaliBase base_;
DaliDT1 dt1_;
DaliDT4 dt4_;
DaliDT5 dt5_;
DaliDT6 dt6_;
DaliDT8 dt8_;
DaliAddr addr_;
std::map<std::string, BridgeModel> models_;
DaliBridgeResult executeResolved(const DaliBridgeRequest& request,
const BridgeModel* model,
BridgeOperation operation);
std::optional<int> resolveTargetAddress(const DaliBridgeRequest& request,
const BridgeModel* model) const;
std::optional<int> resolveRawAddress(const DaliBridgeRequest& request,
const BridgeModel* model) const;
std::optional<int> resolveRawCommand(const DaliBridgeRequest& request,
const BridgeModel* model) const;
std::optional<int> resolveIntValue(const DaliBridgeRequest& request, const BridgeModel* model) const;
std::optional<double> resolveDoubleValue(const DaliBridgeRequest& request) const;
};