ProtoCore v0.0.2
Deterministic, zero-heap network stack for embedded targets
Loading...
Searching...
No Matches
powerlink.cpp
Go to the documentation of this file.
1// Copyright (C) 2026 Douglas Quigg (dstroy0) <dquigg123@gmail.com>
2// SPDX-License-Identifier: AGPL-3.0-or-later
3
4/**
5 * @file powerlink.cpp
6 * @brief Ethernet POWERLINK basic frame codec (see powerlink.h).
7 */
8
10
11#if PC_ENABLE_POWERLINK
12
13#include <string.h>
14
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)
17{
18 if (!out || (payload_len && !payload))
19 {
20 return 0;
21 }
22 size_t n = 3 + payload_len;
23 if (n > cap)
24 {
25 return 0;
26 }
27 out[0] = msg_type;
28 out[1] = dest;
29 out[2] = source;
30 if (payload_len)
31 {
32 memcpy(out + 3, payload, payload_len);
33 }
34 return n;
35}
36
37size_t pc_epl_soc(uint8_t source, uint8_t *out, size_t cap)
38{
39 return pc_epl_build(Epl::EPL_MSG_SOC, Epl::EPL_NODE_BROADCAST, source, nullptr, 0, out, cap);
40}
41
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)
43{
44 return pc_epl_build(Epl::EPL_MSG_PREQ, dest_cn, source, pdo, pdo_len, out, cap);
45}
46
47size_t pc_epl_pres(uint8_t source_cn, const uint8_t *pdo, size_t pdo_len, uint8_t *out, size_t cap)
48{
49 return pc_epl_build(Epl::EPL_MSG_PRES, Epl::EPL_NODE_BROADCAST, source_cn, pdo, pdo_len, out, cap);
50}
51
52size_t pc_epl_soa(uint8_t source, const uint8_t *payload, size_t payload_len, uint8_t *out, size_t cap)
53{
54 return pc_epl_build(Epl::EPL_MSG_SOA, Epl::EPL_NODE_BROADCAST, source, payload, payload_len, out, cap);
55}
56
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)
58{
59 return pc_epl_build(Epl::EPL_MSG_ASND, dest, source, payload, payload_len, out, cap);
60}
61
62bool pc_epl_parse(const uint8_t *frame, size_t len, EplFrame *out)
63{
64 if (!frame || !out || len < 3)
65 {
66 return false;
67 }
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)
71 {
72 return false;
73 }
74 out->msg_type = mt;
75 out->dest = frame[1];
76 out->source = frame[2];
77 out->payload = (len > 3) ? (frame + 3) : nullptr;
78 out->payload_len = len - 3;
79 return true;
80}
81
82#endif // PC_ENABLE_POWERLINK