15size_t detws_ocit_build(uint8_t msg_type, uint16_t object_type, uint16_t instance, uint8_t data_type,
16 const uint8_t *value,
size_t value_len, uint8_t *out,
size_t cap)
18 if (!out || (value_len && !value))
20 size_t n = 6 + value_len;
24 out[1] = (uint8_t)(object_type >> 8);
25 out[2] = (uint8_t)object_type;
26 out[3] = (uint8_t)(instance >> 8);
27 out[4] = (uint8_t)instance;
30 memcpy(out + 6, value, value_len);
34size_t detws_ocit_set_u16(uint16_t object_type, uint16_t instance, uint16_t value, uint8_t *out,
size_t cap)
36 uint8_t v[2] = {(uint8_t)(value >> 8), (uint8_t)value};
37 return detws_ocit_build(OcitMsgType::OCIT_MSG_SET, object_type, instance, OcitType::OCIT_TYPE_UINT16, v, 2, out,
41bool detws_ocit_parse(
const uint8_t *msg,
size_t len, OcitMsg *out)
43 if (!msg || !out || len < 6)
45 out->msg_type = msg[0];
46 out->object_type = (uint16_t)((msg[1] << 8) | msg[2]);
47 out->instance = (uint16_t)((msg[3] << 8) | msg[4]);
48 out->data_type = msg[5];
49 out->value = (len > 6) ? (msg + 6) :
nullptr;
50 out->value_len = len - 6;
54uint16_t detws_ocit_value_u16(
const OcitMsg *m)
56 if (!m || m->data_type != OcitType::OCIT_TYPE_UINT16 || m->value_len < 2 || !m->value)
58 return (uint16_t)((m->value[0] << 8) | m->value[1]);
OCIT-Outstations message codec (DETWS_ENABLE_OCIT).