6 #ifndef MOTORCORTEX_CORE_DRIVE_SERCOS_FSM_DATA_H
7 #define MOTORCORTEX_CORE_DRIVE_SERCOS_FSM_DATA_H
11 #include "drive_command.h"
12 #include "drive_state.h"
13 #include "drive_mode.h"
14 #include "drive_utils.h"
50 enum SercosCommandBits {
51 SERCOS_CMD_OPMODE_BIT1 = 8,
52 SERCOS_CMD_OPMODE_BIT2 = 9,
53 SERCOS_CMD_OPMODE_BIT3 = 11,
55 SERCOS_CMD_DRIVE_HALT = 13,
56 SERCOS_CMD_DRIVE_ENABLE = 14,
57 SERCOS_CMD_DRIVE_ON = 15
60 enum SercosCommandOpMode {
67 SERCOS_CMD_OPMODE_PRIMARY = 0,
68 SERCOS_CMD_OPMODE_SECONDARY1 = 1,
69 SERCOS_CMD_OPMODE_SECONDARY2 = 2,
70 SERCOS_CMD_OPMODE_SECONDARY3 = 3,
71 SERCOS_CMD_OPMODE_SECONDARY4 = 8,
72 SERCOS_CMD_OPMODE_SECONDARY5 = 9,
73 SERCOS_CMD_OPMODE_SECONDARY6 = 10,
74 SERCOS_CMD_OPMODE_SECONDARY7 = 11
106 enum SercosStatusBits {
107 SERCOS_STATUS_OPMODE_BIT1 = 8,
108 SERCOS_STATUS_OPMODE_BIT2 = 9,
109 SERCOS_STATUS_OPMODE_BIT3 = 10,
110 SERCOS_STATUS_CLASS3_DIAG_MSG = 11,
111 SERCOS_STATUS_CLASS3_DIAG_WARNING = 12,
112 SERCOS_STATUS_CLASS3_DIAG_ERROR = 13,
113 SERCOS_STATUS_OPERATION_BIT1 = 14,
114 SERCOS_STATUS_OPERATION_BIT2 = 15,
117 enum SercosStatusOpMode {
118 SERCOS_STATUS_OPMODE_PRIMARY = 0,
119 SERCOS_STATUS_OPMODE_SECONDARY1 = 1,
120 SERCOS_STATUS_OPMODE_SECONDARY2 = 2,
121 SERCOS_STATUS_OPMODE_SECONDARY3 = 3,
122 SERCOS_STATUS_OPMODE_SECONDARY4 = 4,
123 SERCOS_STATUS_OPMODE_SECONDARY5 = 5,
124 SERCOS_STATUS_OPMODE_SECONDARY6 = 6,
125 SERCOS_STATUS_OPMODE_SECONDARY7 = 7,
128 enum SercosStatusOperation {
129 SERCOS_STATUS_NOT_READY_FOR_POWER_ON = 0,
130 SERCOS_STATUS_READY_FOR_POWER_ON = 1,
131 SERCOS_STATUS_READY_FOR_OP = 2,
132 SERCOS_STATUS_IN_OPERATION = 3
136 explicit SercosFsmData(std::string name) : fsm_name{std::move(name)} {};
138 const std::string fsm_name;
139 DriveState drive_state{DriveState::DRIVE_STATE_OFF};
140 bool upload_error_code{};
141 unsigned int sercos_cmd{SERCOS_CMD_OPMODE_PRIMARY};
142 unsigned int sercos_mode{SERCOS_CMD_OPMODE_PRIMARY};
143 unsigned int sercos_state{};
148 double disable_voltage{1};
149 double quick_stop{1};
150 double disable_operation{1};
151 double enable_operation{1};
152 double upload_code{0.01};
156 inline SercosStatusOperation sercosStatusOperation(
unsigned int sercos_state) {
163 unsigned int status = ((sercos_state >> SERCOS_STATUS_OPERATION_BIT1) & 1u) +
164 2 * ((sercos_state >> SERCOS_STATUS_OPERATION_BIT2) & 1u);
165 return static_cast<SercosStatusOperation
>(status);
168 inline SercosStatusOpMode sercosStatusActualMode(
unsigned int sercos_state) {
174 unsigned int mode = ((sercos_state >> SERCOS_STATUS_OPMODE_BIT1) & 1u) +
175 2 * ((sercos_state >> SERCOS_STATUS_OPMODE_BIT2) & 1u) +
176 4 * ((sercos_state >> SERCOS_STATUS_OPMODE_BIT3) & 1u);
178 return static_cast<SercosStatusOpMode
>(mode);
181 inline unsigned int sercosSetOpMode(
unsigned int sercos_cmd, SercosCommandOpMode op_mode) {
187 unsigned int mode = op_mode << SERCOS_CMD_OPMODE_BIT1;
188 sercos_cmd = clearBit(sercos_cmd, SERCOS_CMD_OPMODE_BIT1, SERCOS_CMD_OPMODE_BIT2, SERCOS_CMD_OPMODE_BIT3);
197 #endif //MOTORCORTEX_CORE_DRIVE_SERCOS_FSM_DATA_H