11#if DETWS_ENABLE_POWERLINK
15size_t detws_epl_build(uint8_t msg_type, uint8_t dest, uint8_t source,
const uint8_t *payload,
size_t payload_len,
16 uint8_t *out,
size_t cap)
18 if (!out || (payload_len && !payload))
20 size_t n = 3 + payload_len;
27 memcpy(out + 3, payload, payload_len);
31size_t detws_epl_soc(uint8_t source, uint8_t *out,
size_t cap)
33 return detws_epl_build(Epl::EPL_MSG_SOC, Epl::EPL_NODE_BROADCAST, source,
nullptr, 0, out, cap);
36size_t detws_epl_preq(uint8_t dest_cn, uint8_t source,
const uint8_t *pdo,
size_t pdo_len, uint8_t *out,
size_t cap)
38 return detws_epl_build(Epl::EPL_MSG_PREQ, dest_cn, source, pdo, pdo_len, out, cap);
41size_t detws_epl_pres(uint8_t source_cn,
const uint8_t *pdo,
size_t pdo_len, uint8_t *out,
size_t cap)
43 return detws_epl_build(Epl::EPL_MSG_PRES, Epl::EPL_NODE_BROADCAST, source_cn, pdo, pdo_len, out, cap);
46bool detws_epl_parse(
const uint8_t *frame,
size_t len, EplFrame *out)
48 if (!frame || !out || len < 3)
50 uint8_t mt = frame[0];
51 if (mt != Epl::EPL_MSG_SOC && mt != Epl::EPL_MSG_PREQ && mt != Epl::EPL_MSG_PRES && mt != Epl::EPL_MSG_SOA &&
52 mt != Epl::EPL_MSG_ASND)
56 out->source = frame[2];
57 out->payload = (len > 3) ? (frame + 3) :
nullptr;
58 out->payload_len = len - 3;
Ethernet POWERLINK (EPSG) basic frame codec (DETWS_ENABLE_POWERLINK).