26#ifndef PROTOCORE_CANOPEN_H
27#define PROTOCORE_CANOPEN_H
31#if PROTOCORE_ENABLE_CANOPEN
42#define CANOPEN_COB_NMT 0x000u
43#define CANOPEN_COB_SYNC 0x080u
44#define CANOPEN_COB_EMCY 0x080u
45#define CANOPEN_COB_TIME 0x100u
46#define CANOPEN_COB_TPDO1 0x180u
47#define CANOPEN_COB_RPDO1 0x200u
48#define CANOPEN_COB_TPDO2 0x280u
49#define CANOPEN_COB_RPDO2 0x300u
50#define CANOPEN_COB_TPDO3 0x380u
51#define CANOPEN_COB_RPDO3 0x400u
52#define CANOPEN_COB_TPDO4 0x480u
53#define CANOPEN_COB_RPDO4 0x500u
54#define CANOPEN_COB_SDO_TX 0x580u
55#define CANOPEN_COB_SDO_RX 0x600u
56#define CANOPEN_COB_HEARTBEAT 0x700u
57#define CANOPEN_FUNC_MASK 0x780u
58#define CANOPEN_NODE_MASK 0x07Fu
61#define CANOPEN_NMT_START 0x01u
62#define CANOPEN_NMT_STOP 0x02u
63#define CANOPEN_NMT_PRE_OP 0x80u
64#define CANOPEN_NMT_RESET_NODE 0x81u
65#define CANOPEN_NMT_RESET_COMM 0x82u
68#define CANOPEN_STATE_BOOTUP 0x00u
69#define CANOPEN_STATE_STOPPED 0x04u
70#define CANOPEN_STATE_OPERATIONAL 0x05u
71#define CANOPEN_STATE_PRE_OP 0x7Fu
74#define CANOPEN_SDO_CCS_DOWNLOAD 1u
75#define CANOPEN_SDO_CCS_UPLOAD 2u
76#define CANOPEN_SDO_SCS_UPLOAD 2u
77#define CANOPEN_SDO_SCS_DOWNLOAD 3u
78#define CANOPEN_SDO_ABORT 4u
81#define CANOPEN_ABORT_TOGGLE 0x05030000u
82#define CANOPEN_ABORT_TIMEOUT 0x05040000u
83#define CANOPEN_ABORT_NO_OBJECT 0x06020000u
84#define CANOPEN_ABORT_NO_SUBINDEX 0x06090011u
85#define CANOPEN_ABORT_GENERAL 0x08000000u
88#define CANOPEN_TIME_LEN 6
91#define CANOPEN_TIME_MS_MASK 0x0FFFFFFFu
94#define CANOPEN_SDO_SEG_DATA 7
99 CANOPEN_T_UNKNOWN = 0,
136 uint32_t ms_since_midnight;
137 uint16_t days_since_1984;
158} CanopenBuildNmtArgs;
164} CanopenBuildSyncArgs;
170 uint32_t ms_since_midnight;
171 uint16_t days_since_1984;
172} CanopenBuildTimeArgs;
180} CanopenBuildHeartbeatArgs;
190} CanopenBuildEmcyArgs;
200} CanopenBuildTpdoArgs;
210} CanopenBuildRpdoArgs;
219} CanopenBuildSdoReadArgs;
230} CanopenBuildSdoWriteArgs;
241} CanopenBuildSdoAbortArgs;
255 uint16_t *error_code;
258} CanopenParseEmcyArgs;
266} CanopenParseHeartbeatArgs;
273} CanopenParseTimeArgs;
279 CanopenSdoResponse *out;
280} CanopenParseSdoResponseArgs;
290} CanopenBuildSdoDownloadInitArgs;
301} CanopenBuildSdoDownloadSegmentArgs;
309} CanopenBuildSdoUploadSegmentReqArgs;
319} CanopenParseSdoSegmentArgs;
327} CanopenSdoReasmInitArgs;
337} CanopenSdoReasmFeedArgs;
401 CanopenBuildNmtArgs build_nmt_args;
402 CanopenBuildSyncArgs build_sync_args;
403 CanopenBuildTimeArgs build_time_args;
404 CanopenBuildHeartbeatArgs build_heartbeat_args;
405 CanopenBuildEmcyArgs build_emcy_args;
406 CanopenBuildTpdoArgs build_tpdo_args;
407 CanopenBuildRpdoArgs build_rpdo_args;
408 CanopenBuildSdoReadArgs build_sdo_read_args;
409 CanopenBuildSdoWriteArgs build_sdo_write_args;
410 CanopenBuildSdoAbortArgs build_sdo_abort_args;
411 CanopenParseArgs parse_args;
412 CanopenParseEmcyArgs parse_emcy_args;
413 CanopenParseHeartbeatArgs parse_heartbeat_args;
414 CanopenParseTimeArgs parse_time_args;
415 CanopenParseSdoResponseArgs parse_sdo_response_args;
416 CanopenBuildSdoDownloadInitArgs build_sdo_download_init_args;
417 CanopenBuildSdoDownloadSegmentArgs build_sdo_download_segment_args;
418 CanopenBuildSdoUploadSegmentReqArgs build_sdo_upload_segment_req_args;
419 CanopenParseSdoSegmentArgs parse_sdo_segment_args;
420 CanopenSdoReasmInitArgs sdo_reasm_init_args;
421 CanopenSdoReasmFeedArgs sdo_reasm_feed_args;
426extern CanopenVars CanopenV;
431 void (*
const build_nmt)(uint8_t *work);
432 void (*
const build_sync)(uint8_t *work);
433 void (*
const build_time)(uint8_t *work);
434 void (*
const build_heartbeat)(uint8_t *work);
435 void (*
const build_emcy)(uint8_t *work);
436 void (*
const build_tpdo)(uint8_t *work);
437 void (*
const build_rpdo)(uint8_t *work);
438 void (*
const build_sdo_read)(uint8_t *work);
439 void (*
const build_sdo_write)(uint8_t *work);
440 void (*
const build_sdo_abort)(uint8_t *work);
441 void (*
const parse)(uint8_t *work);
442 void (*
const parse_emcy)(uint8_t *work);
443 void (*
const parse_heartbeat)(uint8_t *work);
444 void (*
const parse_time)(uint8_t *work);
445 void (*
const parse_sdo_response)(uint8_t *work);
446 void (*
const build_sdo_download_init)(uint8_t *work);
447 void (*
const build_sdo_download_segment)(uint8_t *work);
448 void (*
const build_sdo_upload_segment_req)(uint8_t *work);
449 void (*
const parse_sdo_segment)(uint8_t *work);
450 void (*
const sdo_reasm_init)(uint8_t *work);
451 void (*
const sdo_reasm_feed)(uint8_t *work);
456void protocore_canopen_build_nmt(uint8_t *work);
457void protocore_canopen_build_sync(uint8_t *work);
458void protocore_canopen_build_time(uint8_t *work);
459void protocore_canopen_build_heartbeat(uint8_t *work);
460void protocore_canopen_build_emcy(uint8_t *work);
461void protocore_canopen_build_tpdo(uint8_t *work);
462void protocore_canopen_build_rpdo(uint8_t *work);
463void protocore_canopen_build_sdo_read(uint8_t *work);
464void protocore_canopen_build_sdo_write(uint8_t *work);
465void protocore_canopen_build_sdo_abort(uint8_t *work);
466void protocore_canopen_parse(uint8_t *work);
467void protocore_canopen_parse_emcy(uint8_t *work);
468void protocore_canopen_parse_heartbeat(uint8_t *work);
469void protocore_canopen_parse_time(uint8_t *work);
470void protocore_canopen_parse_sdo_response(uint8_t *work);
471void protocore_canopen_build_sdo_download_init(uint8_t *work);
472void protocore_canopen_build_sdo_download_segment(uint8_t *work);
473void protocore_canopen_build_sdo_upload_segment_req(uint8_t *work);
474void protocore_canopen_parse_sdo_segment(uint8_t *work);
475void protocore_canopen_sdo_reasm_init(uint8_t *work);
476void protocore_canopen_sdo_reasm_feed(uint8_t *work);
482static const CanopenNs Canopen __attribute__((unused)) = {
483 .build_nmt = protocore_canopen_build_nmt,
484 .build_sync = protocore_canopen_build_sync,
485 .build_time = protocore_canopen_build_time,
486 .build_heartbeat = protocore_canopen_build_heartbeat,
487 .build_emcy = protocore_canopen_build_emcy,
488 .build_tpdo = protocore_canopen_build_tpdo,
489 .build_rpdo = protocore_canopen_build_rpdo,
490 .build_sdo_read = protocore_canopen_build_sdo_read,
491 .build_sdo_write = protocore_canopen_build_sdo_write,
492 .build_sdo_abort = protocore_canopen_build_sdo_abort,
493 .parse = protocore_canopen_parse,
494 .parse_emcy = protocore_canopen_parse_emcy,
495 .parse_heartbeat = protocore_canopen_parse_heartbeat,
496 .parse_time = protocore_canopen_parse_time,
497 .parse_sdo_response = protocore_canopen_parse_sdo_response,
498 .build_sdo_download_init = protocore_canopen_build_sdo_download_init,
499 .build_sdo_download_segment = protocore_canopen_build_sdo_download_segment,
500 .build_sdo_upload_segment_req = protocore_canopen_build_sdo_upload_segment_req,
501 .parse_sdo_segment = protocore_canopen_parse_sdo_segment,
502 .sdo_reasm_init = protocore_canopen_sdo_reasm_init,
503 .sdo_reasm_feed = protocore_canopen_sdo_reasm_feed,
PROTO_ENUM_PACKED
Application protocol spoken on a listener port or connection slot.
Shared CAN 2.0 frame type for the CAN-based industrial codecs (one source of truth).
#define PROTOCORE_BEGIN_DECLS
Give a header's declarations C linkage, so their symbol names carry no parameter types.
_Bool proto_bool
The truth value.
#define PROTOCORE_END_DECLS