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:
12 enum class Command {
16 kHrdStreaming = 3,
24 // DEPRECATED: kInternalEncoder1Singleturn = 12,
26 kReserved = 255
27 };
28
40 OsCommand(Cia402Drive& cia402_drive, uint8_t* command_bytes,
41 uint32_t timeout_in_ms = 1000, bool auto_abort = false,
42 bool wait = true,
43 const std::function<void()>& started_callback = {},
44 const std::function<void(uint8_t)>& progress_callback = {});
45
56 explicit OsCommand(
57 Cia402Drive& cia402_drive, uint32_t timeout_in_ms = 1000,
58 bool auto_abort = false, bool wait = true,
59 const std::function<void()>& started_callback = {},
60 const std::function<void(uint8_t)>& progress_callback = {});
61
80 OsCommand(Cia402Drive& cia402_drive, Command command,
81 uint8_t command_byte_1 = 0, uint8_t command_byte_2 = 0,
82 uint8_t command_byte_3 = 0, uint8_t command_byte_4 = 0,
83 uint8_t command_byte_5 = 0, uint8_t command_byte_6 = 0,
84 uint8_t command_byte_7 = 0, uint32_t timeout_in_ms = 1000,
85 bool auto_abort = false, bool wait = true,
86 const std::function<void()>& started_callback = {},
87 const std::function<void(uint8_t)>& progress_callback = {});
88
95
101 void set_command(const std::string& command);
102
108 void set_command(uint8_t* command_bytes);
109
122 void set_command(Command command, uint8_t command_byte_1 = 0,
123 uint8_t command_byte_2 = 0, uint8_t command_byte_3 = 0,
124 uint8_t command_byte_4 = 0, uint8_t command_byte_5 = 0,
125 uint8_t command_byte_6 = 0, uint8_t command_byte_7 = 0);
126
132 void set_command_uint32_value(uint32_t value);
133
139 void set_timeout(uint32_t timeout_in_ms);
140
150 void set_auto_abort(bool auto_abort);
151
159 void set_wait(bool wait);
160
166 uint8_t* response_data();
167
173 uint8_t get_uint8_response_data();
174
180 uint16_t get_uint16_response_data();
181
187 uint32_t get_uint32_response_data();
188
194 uint8_t get_error_code();
195
196 private:
197 enum class Status : uint8_t {
198 kCompletedNoErrorNoReply = 0,
199 kCompletedNoErrorWithReply = 1,
200 kCompletedWithErrorNoReply = 2,
201 kCompletedWithErrorWithReply = 3,
202 kInProgress0 = 100,
203 kInProgress100 = 200,
204 kCmdInProgress = 255
205 };
206
207 enum class GeneralError {
208 kNotAllowed = 251,
209 kAborted = 252,
210 kTimeout = 253,
211 kUnsupported = 254,
212 kReserved = 255
213 };
214
215 enum class HrdStreamingError : uint8_t {
216 kInitialization = 0,
217 kStreaming = 1,
218 kDurationValue = 2,
219 kDataIndexValue = 3,
220 kActionValue = 4
221 };
222
223 enum class OpenPhaseDetectionError : uint8_t {
224 kOpenTerminalA = 0,
225 kOpenTerminalB = 1,
226 kOpenTerminalC = 2,
227 kOpenFetAHigh = 3,
228 kOpenFetALow = 4,
229 kOpenFetBHigh = 5,
230 kOpenFetBLow = 6,
231 kOpenFetCHigh = 7,
232 kOpenFetCLow = 8,
233 };
234
235 enum class PolePairDetectionError : uint8_t { kCurrentAmplitude = 0 };
236
237 enum class PhaseResistanceMeasurementError : uint8_t {
238 kCurrentAmplitude = 0
239 };
240
241 enum class PhaseInductanceMeasurementError : uint8_t {
242 kCurrentAmplitude = 0
243 };
244
245 const std::map<Command, std::map<uint8_t, MotionMasterError::Error>>
246 command_error_map_ = {
248 {{to_integral(HrdStreamingError::kInitialization),
249 MotionMasterError::Error::kHrdStreamInitFailed},
250 {to_integral(HrdStreamingError::kStreaming),
251 MotionMasterError::Error::kHrdStreamStreamingFailed},
252 {to_integral(HrdStreamingError::kDurationValue),
253 MotionMasterError::Error::kHrdStreamDurationValue},
254 {to_integral(HrdStreamingError::kDataIndexValue),
255 MotionMasterError::Error::kHrdStreamDataIndexValue},
256 {to_integral(HrdStreamingError::kActionValue),
257 MotionMasterError::Error::kHrdStreamActionValue}}},
259 {{to_integral(OpenPhaseDetectionError::kOpenTerminalA),
260 MotionMasterError::Error::kOpenPhaseDetectionOpenTerminalA},
261 {to_integral(OpenPhaseDetectionError::kOpenTerminalB),
262 MotionMasterError::Error::kOpenPhaseDetectionOpenTerminalB},
263 {to_integral(OpenPhaseDetectionError::kOpenTerminalC),
264 MotionMasterError::Error::kOpenPhaseDetectionOpenTerminalC},
265 {to_integral(OpenPhaseDetectionError::kOpenFetAHigh),
266 MotionMasterError::Error::kOpenPhaseDetectionOpenFetAHigh},
267 {to_integral(OpenPhaseDetectionError::kOpenFetALow),
268 MotionMasterError::Error::kOpenPhaseDetectionOpenFetALow},
269 {to_integral(OpenPhaseDetectionError::kOpenFetBHigh),
270 MotionMasterError::Error::kOpenPhaseDetectionOpenFetBHigh},
271 {to_integral(OpenPhaseDetectionError::kOpenFetBLow),
272 MotionMasterError::Error::kOpenPhaseDetectionOpenFetBLow},
273 {to_integral(OpenPhaseDetectionError::kOpenFetCHigh),
274 MotionMasterError::Error::kOpenPhaseDetectionOpenFetCHigh},
275 {to_integral(OpenPhaseDetectionError::kOpenFetCLow),
276 MotionMasterError::Error::kOpenPhaseDetectionOpenFetCLow}}},
278 {{to_integral(PolePairDetectionError::kCurrentAmplitude),
279 MotionMasterError::Error::kPolePairDetectionCurrentAmplitude}}},
281 {{to_integral(PhaseResistanceMeasurementError::kCurrentAmplitude),
282 MotionMasterError::Error::
283 kPhaseResistanceMeasurementCurrentAmplitude}}},
285 {{to_integral(PhaseInductanceMeasurementError::kCurrentAmplitude),
286 MotionMasterError::Error::
287 kPhaseInductanceMeasurementCurrentAmplitude}}}};
288
289 Cia402Drive& cia402_drive_;
290
291 // OS command mutexes mapped by their CiA402 device IDs
292 static inline std::unordered_map<int32_t, std::mutex>
293 cia402_drive_id_to_mutex_map_;
294
295 std::string command_;
296 std::string response_;
297 Status status_;
298
299 uint32_t timeout_in_ms_;
300 bool auto_abort_;
301 bool wait_;
302
303 const std::function<void()>& started_callback_;
304 const std::function<void(uint8_t)>& progress_callback_;
305};
Definition: cia402_drive.h:48
Definition: motion_master_error.h:6
Definition: os_command.h:10
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:439
Command
Definition: os_command.h:12
void set_command(const std::string &command)
Set the OS command as a string (of bytes)
Definition: os_command.cc:336
uint8_t get_error_code()
Get the OS command response error code.
Definition: os_command.cc:473
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:407
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:375
uint8_t * value
Definition: co_dictionary.h:9
auto to_integral(T e)
Return an integral type value of an enum class.
Definition: util.h:992