25#ifndef DETERMINISTICESPASYNCWEBSERVER_CANOPEN_H
26#define DETERMINISTICESPASYNCWEBSERVER_CANOPEN_H
30#if DETWS_ENABLE_CANOPEN
39#define CANOPEN_COB_NMT 0x000u
40#define CANOPEN_COB_SYNC 0x080u
41#define CANOPEN_COB_EMCY 0x080u
42#define CANOPEN_COB_TIME 0x100u
43#define CANOPEN_COB_TPDO1 0x180u
44#define CANOPEN_COB_RPDO1 0x200u
45#define CANOPEN_COB_TPDO2 0x280u
46#define CANOPEN_COB_RPDO2 0x300u
47#define CANOPEN_COB_TPDO3 0x380u
48#define CANOPEN_COB_RPDO3 0x400u
49#define CANOPEN_COB_TPDO4 0x480u
50#define CANOPEN_COB_RPDO4 0x500u
51#define CANOPEN_COB_SDO_TX 0x580u
52#define CANOPEN_COB_SDO_RX 0x600u
53#define CANOPEN_COB_HEARTBEAT 0x700u
54#define CANOPEN_FUNC_MASK 0x780u
55#define CANOPEN_NODE_MASK 0x07Fu
58#define CANOPEN_NMT_START 0x01u
59#define CANOPEN_NMT_STOP 0x02u
60#define CANOPEN_NMT_PRE_OP 0x80u
61#define CANOPEN_NMT_RESET_NODE 0x81u
62#define CANOPEN_NMT_RESET_COMM 0x82u
65#define CANOPEN_STATE_BOOTUP 0x00u
66#define CANOPEN_STATE_STOPPED 0x04u
67#define CANOPEN_STATE_OPERATIONAL 0x05u
68#define CANOPEN_STATE_PRE_OP 0x7Fu
71#define CANOPEN_SDO_CCS_DOWNLOAD 1u
72#define CANOPEN_SDO_CCS_UPLOAD 2u
73#define CANOPEN_SDO_SCS_UPLOAD 2u
74#define CANOPEN_SDO_SCS_DOWNLOAD 3u
75#define CANOPEN_SDO_ABORT 4u
78#define CANOPEN_ABORT_TOGGLE 0x05030000u
79#define CANOPEN_ABORT_TIMEOUT 0x05040000u
80#define CANOPEN_ABORT_NO_OBJECT 0x06020000u
81#define CANOPEN_ABORT_NO_SUBINDEX 0x06090011u
82#define CANOPEN_ABORT_GENERAL 0x08000000u
85enum class CanopenType : uint8_t
87 CANOPEN_T_UNKNOWN = 0,
108struct CanopenSdoResponse
123bool canopen_build_nmt(
CanFrame *out, uint8_t command, uint8_t node_id);
126bool canopen_build_sync(
CanFrame *out);
129bool canopen_build_heartbeat(
CanFrame *out, uint8_t node_id, uint8_t state);
132bool canopen_build_emcy(
CanFrame *out, uint8_t node_id, uint16_t error_code, uint8_t error_reg,
const uint8_t msef[5]);
135bool canopen_build_tpdo(
CanFrame *out, uint8_t pdo_num, uint8_t node_id,
const uint8_t *data, uint8_t len);
138bool canopen_build_rpdo(
CanFrame *out, uint8_t pdo_num, uint8_t node_id,
const uint8_t *data, uint8_t len);
141bool canopen_build_sdo_read(
CanFrame *out, uint8_t node_id, uint16_t index, uint8_t sub);
144bool canopen_build_sdo_write(
CanFrame *out, uint8_t node_id, uint16_t index, uint8_t sub,
const uint8_t *data,
148bool canopen_build_sdo_abort(
CanFrame *out, uint8_t node_id, uint16_t index, uint8_t sub, uint32_t abort_code,
154bool canopen_parse(
const CanFrame *f, CanopenMsg *out);
157bool canopen_parse_emcy(
const CanFrame *f, uint8_t *node_id, uint16_t *error_code, uint8_t *error_reg, uint8_t msef[5]);
160bool canopen_parse_heartbeat(
const CanFrame *f, uint8_t *node_id, uint8_t *state);
163bool canopen_parse_sdo_response(
const CanFrame *f, CanopenSdoResponse *out);
User-facing configuration for DeterministicESPAsyncWebServer.
Shared CAN 2.0 frame type for the CAN-based industrial codecs (one source of truth).