Add Gateway Modbus component with configuration and bridge implementation
- Created CMakeLists.txt for the Gateway Modbus component. - Added header file `gateway_modbus.hpp` defining configuration structures, enums, and point structures. - Implemented the `gateway_modbus.cpp` source file containing the logic for managing Modbus points, including reading and writing operations. - Introduced utility functions for converting configurations to and from DaliValue, and for handling Modbus space and access types. - Established a bridge class to manage Modbus points and their interactions with the DaliBridgeEngine. Co-authored-by: Copilot <copilot@github.com>
This commit is contained in:
@@ -0,0 +1,147 @@
|
||||
#pragma once
|
||||
|
||||
#include "bridge.hpp"
|
||||
#include "bridge_model.hpp"
|
||||
#include "model_value.hpp"
|
||||
|
||||
#include <cstddef>
|
||||
#include <cstdint>
|
||||
#include <optional>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
namespace gateway {
|
||||
|
||||
constexpr uint16_t kGatewayModbusDefaultTcpPort = 1502;
|
||||
constexpr size_t kGatewayModbusMaxPduBytes = 252;
|
||||
constexpr uint16_t kGatewayModbusMaxReadBits = 2000;
|
||||
constexpr uint16_t kGatewayModbusMaxReadRegisters = 125;
|
||||
constexpr uint16_t kGatewayModbusMaxWriteBits = 1968;
|
||||
constexpr uint16_t kGatewayModbusMaxWriteRegisters = 123;
|
||||
|
||||
struct GatewayModbusConfig {
|
||||
std::string transport{"tcp-server"};
|
||||
std::string host;
|
||||
uint16_t port{kGatewayModbusDefaultTcpPort};
|
||||
uint8_t unit_id{1};
|
||||
};
|
||||
|
||||
enum class GatewayModbusSpace : uint8_t {
|
||||
kCoil = 1,
|
||||
kDiscreteInput = 2,
|
||||
kHoldingRegister = 3,
|
||||
kInputRegister = 4,
|
||||
};
|
||||
|
||||
enum class GatewayModbusAccess : uint8_t {
|
||||
kReadOnly = 0,
|
||||
kWriteOnly = 1,
|
||||
kReadWrite = 2,
|
||||
};
|
||||
|
||||
enum class GatewayModbusGeneratedKind : uint8_t {
|
||||
kNone = 0,
|
||||
kShortOn,
|
||||
kShortOff,
|
||||
kShortRecallMax,
|
||||
kShortRecallMin,
|
||||
kShortDiscovered,
|
||||
kShortOnline,
|
||||
kShortSupportsDt1,
|
||||
kShortSupportsDt4,
|
||||
kShortSupportsDt5,
|
||||
kShortSupportsDt6,
|
||||
kShortSupportsDt8,
|
||||
kShortGroupMaskKnown,
|
||||
kShortActualLevelKnown,
|
||||
kShortSceneKnown,
|
||||
kShortSettingsKnown,
|
||||
kShortControlGearPresent,
|
||||
kShortLampFailure,
|
||||
kShortLampPowerOn,
|
||||
kShortLimitError,
|
||||
kShortFadingCompleted,
|
||||
kShortResetState,
|
||||
kShortMissingShortAddress,
|
||||
kShortPowerSupplyFault,
|
||||
kShortBrightness,
|
||||
kShortColorTemperature,
|
||||
kShortGroupMask,
|
||||
kShortPowerOnLevel,
|
||||
kShortSystemFailureLevel,
|
||||
kShortMinLevel,
|
||||
kShortMaxLevel,
|
||||
kShortFadeTime,
|
||||
kShortFadeRate,
|
||||
kShortInventoryState,
|
||||
kShortPrimaryType,
|
||||
kShortTypeMask,
|
||||
kShortActualLevel,
|
||||
kShortSceneId,
|
||||
kShortRawStatus,
|
||||
};
|
||||
|
||||
struct GatewayModbusPoint {
|
||||
GatewayModbusSpace space{GatewayModbusSpace::kHoldingRegister};
|
||||
GatewayModbusAccess access{GatewayModbusAccess::kReadWrite};
|
||||
uint16_t address{0};
|
||||
std::string id;
|
||||
std::string name;
|
||||
bool generated{false};
|
||||
GatewayModbusGeneratedKind generated_kind{GatewayModbusGeneratedKind::kNone};
|
||||
int short_address{-1};
|
||||
std::string model_id;
|
||||
BridgeOperation operation{BridgeOperation::unknown};
|
||||
std::optional<int> bit_index;
|
||||
};
|
||||
|
||||
struct GatewayModbusPointBinding {
|
||||
std::string model_id;
|
||||
GatewayModbusSpace space{GatewayModbusSpace::kHoldingRegister};
|
||||
uint16_t address{0};
|
||||
std::string id;
|
||||
std::string name;
|
||||
bool generated{false};
|
||||
GatewayModbusGeneratedKind generated_kind{GatewayModbusGeneratedKind::kNone};
|
||||
int short_address{-1};
|
||||
GatewayModbusAccess access{GatewayModbusAccess::kReadWrite};
|
||||
};
|
||||
|
||||
std::optional<GatewayModbusConfig> GatewayModbusConfigFromValue(const DaliValue* value);
|
||||
DaliValue GatewayModbusConfigToValue(const GatewayModbusConfig& config);
|
||||
|
||||
const char* GatewayModbusSpaceToString(GatewayModbusSpace space);
|
||||
const char* GatewayModbusAccessToString(GatewayModbusAccess access);
|
||||
const char* GatewayModbusGeneratedKindToString(GatewayModbusGeneratedKind kind);
|
||||
|
||||
int GatewayModbusHumanAddressFromWire(GatewayModbusSpace space, uint16_t zero_based_address);
|
||||
std::optional<GatewayModbusSpace> GatewayModbusReadSpaceForFunction(uint8_t function_code);
|
||||
std::optional<GatewayModbusSpace> GatewayModbusWriteSpaceForFunction(uint8_t function_code);
|
||||
|
||||
class GatewayModbusBridge {
|
||||
public:
|
||||
explicit GatewayModbusBridge(DaliBridgeEngine& engine);
|
||||
|
||||
void setConfig(const GatewayModbusConfig& config);
|
||||
const GatewayModbusConfig& config() const;
|
||||
|
||||
void rebuildMap();
|
||||
std::optional<GatewayModbusPoint> findPoint(GatewayModbusSpace space,
|
||||
uint16_t address) const;
|
||||
std::vector<GatewayModbusPointBinding> describePoints() const;
|
||||
std::vector<GatewayModbusPointBinding> describeHoldingRegisters() const;
|
||||
|
||||
DaliBridgeResult readModelPoint(const GatewayModbusPoint& point) const;
|
||||
DaliBridgeResult writeRegisterPoint(const GatewayModbusPoint& point, uint16_t value) const;
|
||||
DaliBridgeResult writeCoilPoint(const GatewayModbusPoint& point, bool value) const;
|
||||
|
||||
private:
|
||||
DaliBridgeResult executeModelPoint(const GatewayModbusPoint& point,
|
||||
std::optional<int> value) const;
|
||||
|
||||
DaliBridgeEngine& engine_;
|
||||
GatewayModbusConfig config_;
|
||||
std::vector<GatewayModbusPoint> points_;
|
||||
};
|
||||
|
||||
} // namespace gateway
|
||||
Reference in New Issue
Block a user