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/* Effective register count for reading d: md_point_words, or — when the
64 * mapping sets length_ref (§11.7.1) — the decoded value of the referenced
65 * point, clamped to length_words as an upper bound. Performs a read. */
66md_err_t md_dev_point_words(md_dev_t *dev, const md_point_desc_t *d, uint16_t *words);
67
68/* Resolved register offset of d (SunSpec discovery included). Used by the
69 * command executor (§11.7) for chunked raw-window access. */
71
72/* Raw register-space accessors at a resolved offset (no descriptor sizing). */
73md_err_t md_dev_read_raw(md_dev_t *dev, uint8_t space, uint16_t off, uint16_t n,
74 uint16_t *out);
75md_err_t md_dev_write_raw(md_dev_t *dev, uint8_t space, uint16_t off, uint16_t n,
76 const uint16_t *words);
77
78/* Pre-parsed descriptor variants: skip the by-id document walk when you
79 * hold a descriptor already (generated code, hot loops). */
83 size_t cap, size_t *out_len);
84
85#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_write_raw(md_dev_t *dev, uint8_t space, uint16_t off, uint16_t n, const uint16_t *words)
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_raw(md_dev_t *dev, uint8_t space, uint16_t off, uint16_t n, uint16_t *out)
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_point_words(md_dev_t *dev, const md_point_desc_t *d, uint16_t *words)
md_err_t md_dev_point_offset(md_dev_t *dev, const md_point_desc_t *d, uint16_t *off)
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:90
Definition str.h:13
Definition transport.h:19
Definition codec.h:30