26#ifndef PROTOCORE_CANOPEN_H
27#define PROTOCORE_CANOPEN_H
40#define CANOPEN_COB_NMT 0x000u
41#define CANOPEN_COB_SYNC 0x080u
42#define CANOPEN_COB_EMCY 0x080u
43#define CANOPEN_COB_TIME 0x100u
44#define CANOPEN_COB_TPDO1 0x180u
45#define CANOPEN_COB_RPDO1 0x200u
46#define CANOPEN_COB_TPDO2 0x280u
47#define CANOPEN_COB_RPDO2 0x300u
48#define CANOPEN_COB_TPDO3 0x380u
49#define CANOPEN_COB_RPDO3 0x400u
50#define CANOPEN_COB_TPDO4 0x480u
51#define CANOPEN_COB_RPDO4 0x500u
52#define CANOPEN_COB_SDO_TX 0x580u
53#define CANOPEN_COB_SDO_RX 0x600u
54#define CANOPEN_COB_HEARTBEAT 0x700u
55#define CANOPEN_FUNC_MASK 0x780u
56#define CANOPEN_NODE_MASK 0x07Fu
59#define CANOPEN_NMT_START 0x01u
60#define CANOPEN_NMT_STOP 0x02u
61#define CANOPEN_NMT_PRE_OP 0x80u
62#define CANOPEN_NMT_RESET_NODE 0x81u
63#define CANOPEN_NMT_RESET_COMM 0x82u
66#define CANOPEN_STATE_BOOTUP 0x00u
67#define CANOPEN_STATE_STOPPED 0x04u
68#define CANOPEN_STATE_OPERATIONAL 0x05u
69#define CANOPEN_STATE_PRE_OP 0x7Fu
72#define CANOPEN_SDO_CCS_DOWNLOAD 1u
73#define CANOPEN_SDO_CCS_UPLOAD 2u
74#define CANOPEN_SDO_SCS_UPLOAD 2u
75#define CANOPEN_SDO_SCS_DOWNLOAD 3u
76#define CANOPEN_SDO_ABORT 4u
79#define CANOPEN_ABORT_TOGGLE 0x05030000u
80#define CANOPEN_ABORT_TIMEOUT 0x05040000u
81#define CANOPEN_ABORT_NO_OBJECT 0x06020000u
82#define CANOPEN_ABORT_NO_SUBINDEX 0x06090011u
83#define CANOPEN_ABORT_GENERAL 0x08000000u
86enum class CanopenType : uint8_t
88 CANOPEN_T_UNKNOWN = 0,
109struct CanopenSdoResponse
122#define CANOPEN_TIME_LEN 6
124#define CANOPEN_TIME_MS_MASK 0x0FFFFFFFu
130 uint32_t ms_since_midnight;
131 uint16_t days_since_1984;
137bool pc_canopen_build_nmt(
CanFrame *out, uint8_t command, uint8_t node_id);
140bool pc_canopen_build_sync(
CanFrame *out);
144bool pc_canopen_build_time(
CanFrame *out, uint32_t ms_since_midnight, uint16_t days_since_1984);
147bool pc_canopen_build_heartbeat(
CanFrame *out, uint8_t node_id, uint8_t state);
150bool pc_canopen_build_emcy(
CanFrame *out, uint8_t node_id, uint16_t error_code, uint8_t error_reg,
151 const uint8_t msef[5]);
154bool pc_canopen_build_tpdo(
CanFrame *out, uint8_t pdo_num, uint8_t node_id,
const uint8_t *data, uint8_t len);
157bool pc_canopen_build_rpdo(
CanFrame *out, uint8_t pdo_num, uint8_t node_id,
const uint8_t *data, uint8_t len);
160bool pc_canopen_build_sdo_read(
CanFrame *out, uint8_t node_id, uint16_t index, uint8_t sub);
163bool pc_canopen_build_sdo_write(
CanFrame *out, uint8_t node_id, uint16_t index, uint8_t sub,
const uint8_t *data,
167bool pc_canopen_build_sdo_abort(
CanFrame *out, uint8_t node_id, uint16_t index, uint8_t sub, uint32_t abort_code,
173bool pc_canopen_parse(
const CanFrame *f, CanopenMsg *out);
176bool pc_canopen_parse_emcy(
const CanFrame *f, uint8_t *node_id, uint16_t *error_code, uint8_t *error_reg,
180bool pc_canopen_parse_heartbeat(
const CanFrame *f, uint8_t *node_id, uint8_t *state);
184bool pc_canopen_parse_time(
const CanFrame *f, CanopenTime *out);
187bool pc_canopen_parse_sdo_response(
const CanFrame *f, CanopenSdoResponse *out);
195#define CANOPEN_SDO_SEG_DATA 7
201bool pc_canopen_build_sdo_download_init(
CanFrame *out, uint8_t node_id, uint16_t index, uint8_t sub,
202 uint32_t total_size);
209bool pc_canopen_build_sdo_download_segment(
CanFrame *out, uint8_t node_id,
bool toggle,
const uint8_t *data,
210 uint8_t len,
bool last);
213bool pc_canopen_build_sdo_upload_segment_req(
CanFrame *out, uint8_t node_id,
bool toggle);
219bool pc_canopen_parse_sdo_segment(
const CanFrame *f,
bool *toggle, uint8_t *data, uint8_t *len,
bool *last);
222struct CanopenSdoReasm
232void pc_canopen_sdo_reasm_init(CanopenSdoReasm *r, uint8_t *buf,
size_t cap);
239bool pc_canopen_sdo_reasm_feed(CanopenSdoReasm *r,
const uint8_t *data, uint8_t len,
bool toggle,
bool last);
Shared CAN 2.0 frame type for the CAN-based industrial codecs (one source of truth).
User-facing configuration for ProtoCore.