moddef-cpp
Idiomatic C++ runtime for ModDef
Loading...
Searching...
No Matches
transport.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: Apache-2.0
2
11#ifndef MODDEF_TRANSPORT_HPP
12#define MODDEF_TRANSPORT_HPP
13
14#include <cstdint>
15#include <span>
16
17#include "moddef/error.hpp"
18
19extern "C" {
20#include "moddef/transport.h"
21}
22
23namespace moddef {
24
28class Transport {
29 public:
30 virtual ~Transport() = default;
31
32 virtual Result<void> read_holding(std::uint16_t offset, std::span<std::uint16_t> out) = 0;
33 virtual Result<void> read_input(std::uint16_t offset, std::span<std::uint16_t> out) = 0;
34 virtual Result<void> read_coils(std::uint16_t offset, std::span<bool> out) = 0;
35 virtual Result<void> read_discrete(std::uint16_t offset, std::span<bool> out) = 0;
36 virtual Result<void> write_holding(std::uint16_t offset,
37 std::span<const std::uint16_t> words) = 0;
38 virtual Result<void> write_coil(std::uint16_t offset, bool on) = 0;
39};
40
41namespace detail {
42
43inline md_err_t status_of(const Result<void>& r) noexcept {
44 return r ? MD_OK : to_c(r.error());
45}
46
47inline md_err_t c_read_holding(void* ctx, std::uint16_t off, std::uint16_t n, std::uint16_t* out) {
48 return status_of(static_cast<Transport*>(ctx)->read_holding(off, {out, n}));
49}
50inline md_err_t c_read_input(void* ctx, std::uint16_t off, std::uint16_t n, std::uint16_t* out) {
51 return status_of(static_cast<Transport*>(ctx)->read_input(off, {out, n}));
52}
53inline md_err_t c_read_coils(void* ctx, std::uint16_t off, std::uint16_t n, bool* out) {
54 return status_of(static_cast<Transport*>(ctx)->read_coils(off, {out, n}));
55}
56inline md_err_t c_read_discrete(void* ctx, std::uint16_t off, std::uint16_t n, bool* out) {
57 return status_of(static_cast<Transport*>(ctx)->read_discrete(off, {out, n}));
58}
59inline md_err_t c_write_holding(void* ctx, std::uint16_t off, std::uint16_t n,
60 const std::uint16_t* w) {
61 return status_of(static_cast<Transport*>(ctx)->write_holding(off, {w, n}));
62}
63inline md_err_t c_write_coil(void* ctx, std::uint16_t off, bool on) {
64 return status_of(static_cast<Transport*>(ctx)->write_coil(off, on));
65}
66
67// Build a C transport table bound to `t`.
68inline md_transport_t bind(Transport& t) noexcept {
69 md_transport_t ct{};
70 ct.ctx = &t;
71 ct.read_holding = c_read_holding;
72 ct.read_input = c_read_input;
73 ct.read_coils = c_read_coils;
74 ct.read_discrete = c_read_discrete;
75 ct.write_holding = c_write_holding;
76 ct.write_coil = c_write_coil;
77 return ct;
78}
79
80} // namespace detail
81
82} // namespace moddef
83
84#endif // MODDEF_TRANSPORT_HPP
Blocking register-level transport.
Definition transport.hpp:28
virtual ~Transport()=default
virtual Result< void > write_holding(std::uint16_t offset, std::span< const std::uint16_t > words)=0
virtual Result< void > read_holding(std::uint16_t offset, std::span< std::uint16_t > out)=0
virtual Result< void > read_discrete(std::uint16_t offset, std::span< bool > out)=0
virtual Result< void > read_input(std::uint16_t offset, std::span< std::uint16_t > out)=0
virtual Result< void > write_coil(std::uint16_t offset, bool on)=0
virtual Result< void > read_coils(std::uint16_t offset, std::span< bool > out)=0
Error type and Result<T> (spec §26.3/§26.4, §32).
md_err_t c_read_input(void *ctx, std::uint16_t off, std::uint16_t n, std::uint16_t *out)
Definition transport.hpp:50
md_err_t c_read_holding(void *ctx, std::uint16_t off, std::uint16_t n, std::uint16_t *out)
Definition transport.hpp:47
md_err_t c_write_coil(void *ctx, std::uint16_t off, bool on)
Definition transport.hpp:63
md_err_t c_read_coils(void *ctx, std::uint16_t off, std::uint16_t n, bool *out)
Definition transport.hpp:53
md_err_t c_read_discrete(void *ctx, std::uint16_t off, std::uint16_t n, bool *out)
Definition transport.hpp:56
md_err_t c_write_holding(void *ctx, std::uint16_t off, std::uint16_t n, const std::uint16_t *w)
Definition transport.hpp:59
md_transport_t bind(Transport &t) noexcept
Definition transport.hpp:68
md_err_t status_of(const Result< void > &r) noexcept
Definition transport.hpp:43
Definition device.hpp:28
std::expected< T, Error > Result
The canonical result type across the API; Result<void> for actions.
Definition error.hpp:53
md_err_t to_c(Error e) noexcept
Definition error.hpp:47