moddef-c
Loading...
Searching...
No Matches
device.h
Go to the documentation of this file.
1// SPDX-License-Identifier: Apache-2.0
2
3/* Device driver layer (spec §32.4): binds a transport to one device profile
4 * inside a parsed document view for point reads/writes.
5 *
6 * SunSpec model_relative_offset resolves against the model *ID register*
7 * (offset 0 = model id, 1 = length, data at 2+) per spec §7.3 — the same
8 * convention as every other ModDef implementation. Resolved bases are
9 * cached per discovery block in fixed slots (MD_MAX_DISCOVERY, default 4;
10 * override with -DMD_MAX_DISCOVERY=n).
11 *
12 * Register windows read into a fixed stack buffer of MD_MAX_POINT_WORDS
13 * registers (default 64 — larger than any registry point; strings cap at
14 * MD_MAX_POINT_WORDS words too). */
15#ifndef MODDEF_DEVICE_H
16#define MODDEF_DEVICE_H
17
18#include "moddef/codec.h"
19#include "moddef/doc.h"
20#include "moddef/transport.h"
21
22#ifndef MD_MAX_DISCOVERY
23#define MD_MAX_DISCOVERY 4
24#endif
25
26#ifndef MD_MAX_POINT_WORDS
27#define MD_MAX_POINT_WORDS 64
28#endif
29
30typedef struct md_dev {
34 uint8_t base_valid; /* bitmask over slots */
36
37/* Bind a transport to the named profile in doc (empty id = first). */
38md_err_t md_dev_init(md_dev_t *dev, const md_doc_t *doc, md_str_t device_id,
39 const md_transport_t *t);
40
41/* Read and decode one point by id (numeric/bool/flags/fields/datetime). */
43
44/* Read a string point into buf (NUL-terminated). */
45md_err_t md_dev_read_string(md_dev_t *dev, md_str_t point_id, char *buf, size_t cap,
46 size_t *out_len);
47
48/* Encode and write a value; validates access mode and §11.4 constraints. */
50
51static inline md_err_t md_dev_write_f64(md_dev_t *dev, md_str_t point_id, double f)
52{
53 md_value_t v = md_value_f64(f);
54 return md_dev_write(dev, point_id, &v);
55}
56
57static inline md_err_t md_dev_write_i64(md_dev_t *dev, md_str_t point_id, int64_t i)
58{
59 md_value_t v = md_value_i64(i);
60 return md_dev_write(dev, point_id, &v);
61}
62
63/* Pre-parsed descriptor variants: skip the by-id document walk when you
64 * hold a descriptor already (generated code, hot loops). */
68 size_t cap, size_t *out_len);
69
70#endif /* MODDEF_DEVICE_H */
md_err_t md_dev_init(md_dev_t *dev, const md_doc_t *doc, md_str_t device_id, const md_transport_t *t)
md_err_t md_dev_write(md_dev_t *dev, md_str_t point_id, const md_value_t *v)
md_err_t md_dev_read_string_desc(md_dev_t *dev, const md_point_desc_t *d, char *buf, size_t cap, size_t *out_len)
#define MD_MAX_DISCOVERY
Definition device.h:23
md_err_t md_dev_read(md_dev_t *dev, md_str_t point_id, md_value_t *out)
md_err_t md_dev_write_desc(md_dev_t *dev, const md_point_desc_t *d, const md_value_t *v)
md_err_t md_dev_read_string(md_dev_t *dev, md_str_t point_id, char *buf, size_t cap, size_t *out_len)
md_err_t md_dev_read_desc(md_dev_t *dev, const md_point_desc_t *d, md_value_t *out)
struct md_dev md_dev_t
enum md_err md_err_t
Definition device.h:30
uint16_t model_base[MD_MAX_DISCOVERY]
Definition device.h:33
const md_transport_t * t
Definition device.h:32
uint8_t base_valid
Definition device.h:34
md_devprof_t prof
Definition device.h:31
Definition doc.h:24
Definition doc.h:19
Definition desc.h:79
Definition str.h:13
Definition transport.h:19
Definition codec.h:30