11#if PC_ENABLE_POWERLINK
15size_t pc_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))
22 size_t n = 3 + payload_len;
32 memcpy(out + 3, payload, payload_len);
37size_t pc_epl_soc(uint8_t source, uint8_t *out,
size_t cap)
39 return pc_epl_build(Epl::EPL_MSG_SOC, Epl::EPL_NODE_BROADCAST, source,
nullptr, 0, out, cap);
42size_t pc_epl_preq(uint8_t dest_cn, uint8_t source,
const uint8_t *pdo,
size_t pdo_len, uint8_t *out,
size_t cap)
44 return pc_epl_build(Epl::EPL_MSG_PREQ, dest_cn, source, pdo, pdo_len, out, cap);
47size_t pc_epl_pres(uint8_t source_cn,
const uint8_t *pdo,
size_t pdo_len, uint8_t *out,
size_t cap)
49 return pc_epl_build(Epl::EPL_MSG_PRES, Epl::EPL_NODE_BROADCAST, source_cn, pdo, pdo_len, out, cap);
52size_t pc_epl_soa(uint8_t source,
const uint8_t *payload,
size_t payload_len, uint8_t *out,
size_t cap)
54 return pc_epl_build(Epl::EPL_MSG_SOA, Epl::EPL_NODE_BROADCAST, source, payload, payload_len, out, cap);
57size_t pc_epl_asnd(uint8_t dest, uint8_t source,
const uint8_t *payload,
size_t payload_len, uint8_t *out,
size_t cap)
59 return pc_epl_build(Epl::EPL_MSG_ASND, dest, source, payload, payload_len, out, cap);
62bool pc_epl_parse(
const uint8_t *frame,
size_t len, EplFrame *out)
64 if (!frame || !out || len < 3)
68 uint8_t mt = frame[0];
69 if (mt != Epl::EPL_MSG_SOC && mt != Epl::EPL_MSG_PREQ && mt != Epl::EPL_MSG_PRES && mt != Epl::EPL_MSG_SOA &&
70 mt != Epl::EPL_MSG_ASND)
76 out->source = frame[2];
77 out->payload = (len > 3) ? (frame + 3) :
nullptr;
78 out->payload_len = len - 3;
Ethernet POWERLINK (EPSG) basic frame codec (PC_ENABLE_POWERLINK).