22#ifndef DETERMINISTICESPASYNCWEBSERVER_CIA402_H
23#define DETERMINISTICESPASYNCWEBSERVER_CIA402_H
27#if DETWS_ENABLE_CIA402
34#define CIA402_OD_ERROR_CODE 0x603Fu
35#define CIA402_OD_CONTROLWORD 0x6040u
36#define CIA402_OD_STATUSWORD 0x6041u
37#define CIA402_OD_QUICK_STOP_OPTION 0x605Au
38#define CIA402_OD_MODES_OF_OPERATION 0x6060u
39#define CIA402_OD_MODES_DISPLAY 0x6061u
40#define CIA402_OD_POSITION_ACTUAL 0x6064u
41#define CIA402_OD_VELOCITY_ACTUAL 0x606Cu
42#define CIA402_OD_TARGET_TORQUE 0x6071u
43#define CIA402_OD_TORQUE_ACTUAL 0x6077u
44#define CIA402_OD_TARGET_POSITION 0x607Au
45#define CIA402_OD_PROFILE_VELOCITY 0x6081u
46#define CIA402_OD_PROFILE_ACCEL 0x6083u
47#define CIA402_OD_PROFILE_DECEL 0x6084u
48#define CIA402_OD_TARGET_VELOCITY 0x60FFu
49#define CIA402_OD_SUPPORTED_MODES 0x6502u
52enum class Cia402Mode : int8_t
60 interpolated_position = 7,
61 cyclic_sync_position = 8,
62 cyclic_sync_velocity = 9,
63 cyclic_sync_torque = 10,
67enum class Cia402State : uint8_t
69 not_ready_to_switch_on,
75 fault_reaction_active,
81enum class Cia402Command : uint8_t
95 static constexpr uint16_t switch_on = 0x0001;
96 static constexpr uint16_t enable_voltage = 0x0002;
97 static constexpr uint16_t quick_stop = 0x0004;
98 static constexpr uint16_t enable_operation = 0x0008;
99 static constexpr uint16_t fault_reset = 0x0080;
100 static constexpr uint16_t halt = 0x0100;
106 static constexpr uint16_t ready_to_switch_on = 0x0001;
107 static constexpr uint16_t switched_on = 0x0002;
108 static constexpr uint16_t operation_enabled = 0x0004;
109 static constexpr uint16_t fault = 0x0008;
110 static constexpr uint16_t voltage_enabled = 0x0010;
111 static constexpr uint16_t quick_stop = 0x0020;
112 static constexpr uint16_t switch_on_disabled = 0x0040;
113 static constexpr uint16_t warning = 0x0080;
114 static constexpr uint16_t remote = 0x0200;
115 static constexpr uint16_t target_reached = 0x0400;
116 static constexpr uint16_t internal_limit = 0x0800;
122Cia402State cia402_state(uint16_t statusword);
126uint16_t cia402_controlword(Cia402Command cmd);
131uint16_t cia402_enable_sequence(Cia402State state);
134static inline bool cia402_target_reached(uint16_t sw)
136 return (sw & Cia402Sw::target_reached) != 0;
139static inline bool cia402_has_fault(uint16_t sw)
141 return (sw & Cia402Sw::fault) != 0;
144static inline bool cia402_warning(uint16_t sw)
146 return (sw & Cia402Sw::warning) != 0;
149static inline bool cia402_voltage_enabled(uint16_t sw)
151 return (sw & Cia402Sw::voltage_enabled) != 0;
154static inline bool cia402_remote(uint16_t sw)
156 return (sw & Cia402Sw::remote) != 0;
159static inline bool cia402_internal_limit(uint16_t sw)
161 return (sw & Cia402Sw::internal_limit) != 0;
167bool cia402_sdo_set_controlword(
CanFrame *out, uint8_t node, uint16_t controlword);
169bool cia402_sdo_set_mode(
CanFrame *out, uint8_t node, Cia402Mode mode);
171bool cia402_sdo_set_target_position(
CanFrame *out, uint8_t node, int32_t position);
173bool cia402_sdo_set_target_velocity(
CanFrame *out, uint8_t node, int32_t velocity);
175bool cia402_sdo_set_target_torque(
CanFrame *out, uint8_t node, int16_t torque);
178bool cia402_sdo_read(
CanFrame *out, uint8_t node, uint16_t index, uint8_t sub);
182bool cia402_sdo_get_u16(
const CanFrame *f, uint16_t want_index, uint16_t *value);
184bool cia402_sdo_get_i32(
const CanFrame *f, uint16_t want_index, int32_t *value);
190size_t cia402_pack_command(uint8_t *buf,
size_t cap, uint16_t controlword, int32_t target);
194bool cia402_unpack_status(
const uint8_t *buf,
size_t len, uint16_t *statusword, int32_t *actual);
User-facing configuration for DeterministicESPAsyncWebServer.
CANopen (CiA 301) application-layer message codec (DETWS_ENABLE_CANOPEN).