Motion Master
Loading...
Searching...
No Matches
os_command.h
Go to the documentation of this file.
1#pragma once
2
3#include <chrono>
4
6#include "util.h"
7
8class Cia402Drive;
9
10class OsCommand {
11 public:
29
41 OsCommand(Cia402Drive& cia402_drive, uint8_t* command_bytes,
42 uint32_t timeout_in_ms = 1000, bool auto_abort = false,
43 bool wait = true,
44 const std::function<void()>& started_callback = {},
45 const std::function<void(uint8_t)>& progress_callback = {});
46
57 explicit OsCommand(
58 Cia402Drive& cia402_drive, uint32_t timeout_in_ms = 1000,
59 bool auto_abort = false, bool wait = true,
60 const std::function<void()>& started_callback = {},
61 const std::function<void(uint8_t)>& progress_callback = {});
62
81 OsCommand(Cia402Drive& cia402_drive, Command command,
82 uint8_t command_byte_1 = 0, uint8_t command_byte_2 = 0,
83 uint8_t command_byte_3 = 0, uint8_t command_byte_4 = 0,
84 uint8_t command_byte_5 = 0, uint8_t command_byte_6 = 0,
85 uint8_t command_byte_7 = 0, uint32_t timeout_in_ms = 1000,
86 bool auto_abort = false, bool wait = true,
87 const std::function<void()>& started_callback = {},
88 const std::function<void(uint8_t)>& progress_callback = {});
89
95 MotionMasterError run();
96
102 void set_command(const std::string& command);
103
109 void set_command(uint8_t* command_bytes);
110
123 void set_command(Command command, uint8_t command_byte_1 = 0,
124 uint8_t command_byte_2 = 0, uint8_t command_byte_3 = 0,
125 uint8_t command_byte_4 = 0, uint8_t command_byte_5 = 0,
126 uint8_t command_byte_6 = 0, uint8_t command_byte_7 = 0);
127
133 void set_command_uint32_value(uint32_t value);
134
140 void set_timeout(uint32_t timeout_in_ms);
141
151 void set_auto_abort(bool auto_abort);
152
160 void set_wait(bool wait);
161
167 uint8_t* response_data();
168
174 uint8_t get_uint8_response_data();
175
181 uint16_t get_uint16_response_data();
182
188 uint32_t get_uint32_response_data();
189
195 uint8_t get_error_code();
196
197 private:
198 enum class Status : uint8_t {
199 kCompletedNoErrorNoReply = 0,
200 kCompletedNoErrorWithReply = 1,
201 kCompletedWithErrorNoReply = 2,
202 kCompletedWithErrorWithReply = 3,
203 kInProgress0 = 100,
204 kInProgress100 = 200,
205 kCmdInProgress = 255
206 };
207
208 enum class GeneralError {
209 kNotAllowed = 251,
210 kAborted = 252,
211 kTimeout = 253,
212 kUnsupported = 254,
213 kReserved = 255
214 };
215
216 enum class HrdStreamingError : uint8_t {
217 kInitialization = 0,
218 kStreaming = 1,
219 kDurationValue = 2,
220 kDataIndexValue = 3,
221 kActionValue = 4
222 };
223
224 enum class OpenPhaseDetectionError : uint8_t {
225 kOpenTerminalA = 0,
226 kOpenTerminalB = 1,
227 kOpenTerminalC = 2,
228 kOpenFetAHigh = 3,
229 kOpenFetALow = 4,
230 kOpenFetBHigh = 5,
231 kOpenFetBLow = 6,
232 kOpenFetCHigh = 7,
233 kOpenFetCLow = 8,
234 };
235
236 enum class PolePairDetectionError : uint8_t { kCurrentAmplitude = 0 };
237
238 enum class PhaseResistanceMeasurementError : uint8_t {
239 kCurrentAmplitude = 0
240 };
241
242 enum class PhaseInductanceMeasurementError : uint8_t {
243 kCurrentAmplitude = 0
244 };
245
246 const std::map<Command, std::map<uint8_t, MotionMasterError::Error>>
247 command_error_map_ = {
249 {{to_integral(HrdStreamingError::kInitialization),
250 MotionMasterError::Error::kHrdStreamInitFailed},
251 {to_integral(HrdStreamingError::kStreaming),
252 MotionMasterError::Error::kHrdStreamStreamingFailed},
253 {to_integral(HrdStreamingError::kDurationValue),
254 MotionMasterError::Error::kHrdStreamDurationValue},
255 {to_integral(HrdStreamingError::kDataIndexValue),
256 MotionMasterError::Error::kHrdStreamDataIndexValue},
257 {to_integral(HrdStreamingError::kActionValue),
258 MotionMasterError::Error::kHrdStreamActionValue}}},
260 {{to_integral(OpenPhaseDetectionError::kOpenTerminalA),
261 MotionMasterError::Error::kOpenPhaseDetectionOpenTerminalA},
262 {to_integral(OpenPhaseDetectionError::kOpenTerminalB),
263 MotionMasterError::Error::kOpenPhaseDetectionOpenTerminalB},
264 {to_integral(OpenPhaseDetectionError::kOpenTerminalC),
265 MotionMasterError::Error::kOpenPhaseDetectionOpenTerminalC},
266 {to_integral(OpenPhaseDetectionError::kOpenFetAHigh),
267 MotionMasterError::Error::kOpenPhaseDetectionOpenFetAHigh},
268 {to_integral(OpenPhaseDetectionError::kOpenFetALow),
269 MotionMasterError::Error::kOpenPhaseDetectionOpenFetALow},
270 {to_integral(OpenPhaseDetectionError::kOpenFetBHigh),
271 MotionMasterError::Error::kOpenPhaseDetectionOpenFetBHigh},
272 {to_integral(OpenPhaseDetectionError::kOpenFetBLow),
273 MotionMasterError::Error::kOpenPhaseDetectionOpenFetBLow},
274 {to_integral(OpenPhaseDetectionError::kOpenFetCHigh),
275 MotionMasterError::Error::kOpenPhaseDetectionOpenFetCHigh},
276 {to_integral(OpenPhaseDetectionError::kOpenFetCLow),
277 MotionMasterError::Error::kOpenPhaseDetectionOpenFetCLow}}},
279 {{to_integral(PolePairDetectionError::kCurrentAmplitude),
280 MotionMasterError::Error::kPolePairDetectionCurrentAmplitude}}},
282 {{to_integral(PhaseResistanceMeasurementError::kCurrentAmplitude),
283 MotionMasterError::Error::
284 kPhaseResistanceMeasurementCurrentAmplitude}}},
286 {{to_integral(PhaseInductanceMeasurementError::kCurrentAmplitude),
287 MotionMasterError::Error::
288 kPhaseInductanceMeasurementCurrentAmplitude}}}};
289
290 Cia402Drive& cia402_drive_;
291
292 // OS command mutexes mapped by their CiA402 device IDs
293 static inline std::unordered_map<int32_t, std::mutex>
294 cia402_drive_id_to_mutex_map_;
295
296 std::string command_;
297 std::string response_;
298 Status status_;
299
300 uint32_t timeout_in_ms_;
301 bool auto_abort_;
302 bool wait_;
303
304 const std::function<void()>& started_callback_;
305 const std::function<void(uint8_t)>& progress_callback_;
306};
auto to_integral(T e)
Return an integral type value of an enum class.
Definition util.h:974
Definition cia402_drive.h:110
uint8_t * response_data()
Returns a pointer to the complete response data.
Definition os_command.cc:373
void set_command_uint32_value(uint32_t value)
Set the data payload of the OS command as an unsigned 32-bit value.
Definition os_command.cc:358
uint32_t get_uint32_response_data()
Get the unsigned 32-bit response payload if possible.
Definition os_command.cc:441
Command
Definition os_command.h:12
@ kSystemIdentification
Definition os_command.h:26
@ kTorqueConstantMeasurement
Definition os_command.h:23
@ kMotorPhaseOrderDetection
Definition os_command.h:17
@ kPolePairDetection
Definition os_command.h:20
@ kReserved
Definition os_command.h:27
@ kIcmuCalibration
Definition os_command.h:14
@ kOpenPhaseDetection
Definition os_command.h:19
@ kCommutationOffsetMeasurement
Definition os_command.h:18
@ kIgnoreBissStatusBits
Definition os_command.h:25
@ kPhaseResistanceMeasurement
Definition os_command.h:21
@ kHrdStreaming
Definition os_command.h:16
@ kPhaseInductanceMeasurement
Definition os_command.h:22
@ kEncoderRegisterCommunication
Definition os_command.h:13
@ kOpenLoopFieldMode
Definition os_command.h:15
void set_command(const std::string &command)
Set the OS command as a string (of bytes)
Definition os_command.cc:336
OsCommand(Cia402Drive &cia402_drive, uint8_t *command_bytes, uint32_t timeout_in_ms=1000, bool auto_abort=false, bool wait=true, const std::function< void()> &started_callback={}, const std::function< void(uint8_t)> &progress_callback={})
Create an OS command object.
Definition os_command.cc:11
uint8_t get_error_code()
Get the OS command response error code.
Definition os_command.cc:475
MotionMasterError run()
Run the previously initialized OS command.
Definition os_command.cc:66
void set_wait(bool wait)
Set the wait flag.
Definition os_command.cc:371
void set_timeout(uint32_t timeout_in_ms)
Set a timeout in milliseconds.
Definition os_command.cc:365
uint16_t get_uint16_response_data()
Get the unsigned 16-bit response payload if possible.
Definition os_command.cc:409
void set_auto_abort(bool auto_abort)
Set the auto abort flag.
Definition os_command.cc:369
uint8_t get_uint8_response_data()
Get the unsigned 8-bit response payload if possible.
Definition os_command.cc:377
uint8_t * value
Definition co_dictionary.h:9