Files
dali_cpp/include/bridge.hpp
T

66 lines
2.0 KiB
C++

#pragma once
#include "base.hpp"
#include "bridge_model.hpp"
#include "dali_comm.hpp"
#include "dt1.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::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_;
DaliDT8 dt8_;
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;
};