Instrument Neutral Distributed Interface INDI 2.2.5
lx200_OnStep.h
Go to the documentation of this file.
1/*
2 LX200 OnStep
3 based on LX200 Classic azwing ([email protected])
4 Contributors:
5 James Lancaster https://github.com/james-lan
6 Ray Wells https://github.com/blueshawk
7 Jamie Flinn https://github.com/jamiecflinn
8
9 Copyright (C) 2003-2026 Jasem Mutlaq ([email protected])-2021 (Contributors, above)
10
11 This library is free software; you can redistribute it and/or
12 modify it under the terms of the GNU Lesser General Public
13 License as published by the Free Software Foundation; either
14 version 2.1 of the License, or (at your option) any later version.
15
16 This library is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 Lesser General Public License for more details.
20
21 You should have received a copy of the GNU Lesser General Public
22 License along with this library; if not, write to the Free Software
23 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24
25 ===========================================
26
27 Version 1.26: Fix issues due to migration to new INDI properties.
28 Version 1.25: Refactor driver to use INDI new properties.
29 Version 1.24: During manual slew, only send back RA & DE.
30 Version not yet updated/No INDI release:
31 Version 1.22
32 - fixed #:AW#" and ":MP#" commands by using getCommandSingleCharResponse instead of sendOnStepCommandBlind
33 Version 1.21
34 - fixed Onstep returning '9:9' when 9 star alignment is achieved thanks to Howard Dutton
35 Version 1.20
36 - fixed wrong messages due to different return with OnStepX
37 - fixed Focuser Temperature not shown on Ekos
38 - fixed Weather settings (P/T/Hr) when no sensor present
39 - minor typos
40 Version 1.19
41 - fixed typo on debug information saying error instead of nbchar causing confusion
42 - fixed Autoflip Off update
43 - fixed Elevation Limits update (was not read from OnStep) and format set to integer and gage for setup
44 - fixed minutes passed meridian not showing actual values
45 - fixed missing slewrates defineProperty and deleteProperty causing redefinitions of overrides
46 - todo focuser stops working after some time ??? could not yet reproduce
47 - fixed poll and update slew rates
48 - todo poll and update maximum slew speed SmartWebServer=>Settings
49 Version 1.18
50 - implemented Focuser T° compensation in FOCUSER TAB
51 - Minor fixes
52 Version 1.17
53 - fixed setMaxElevationLimit / setMinElevationLimit
54 Version 1.16
55 - fixed uninitialized UTC structure thanks to Norikyu
56 Version 1.15
57 - Fixed setUTCOffset after change in lx200driver to comply with OnStep format :SG[sHH]#
58 Version 1.14
59 - Modified range for Minutes Pas Meridian East and West to -180 .. +180
60 - Modified debug messages Minutes Pas Meridian (Was B"acklash ...)
61
62 Version 1.13
63 - Timeouts and misc errors due to new behavior of SWS (SmartWebServer)
64 - - Timeouts still at 100ms for USB connections, if on a TCP/network connection timeout reverts to 2 sec.
65 - Improvements to Focuser and Rotator polling
66 - Focuser doesn't show up if not detected (Regression fixed)
67
68 Past Versions:
69
70 Version 1.12: (INDI 1.9.3)
71 - New timeout functions in INDI which significantly reduce startup times waiting for detection to fail. (Min time before was 1 second, current timeout for those is now set to 100 ms (100000 us which works well even with an Arduino Mega (Ramps) setup)
72 - Cleanup and completely control TrackState. (Should eliminate various issues.)
73 - Behind the scenes: More consistent command declarations (Should eliminate a type of error that's happened in the past when changing commands.)
74 - Don't report capability for PierSide and PEC unless supported (This will cause a call to updateProperties so a bunch of messages will be repeated.)
75 - From the last, move where the SlewRate values are defined to updateProperties, vs initProperties so that the extra calls to updateProperties don't mangle it.
76 - TMC driver reports are now human readable.
77 - Detects OnStep or OnStepX version (doesn't do much with it.)
78
79
80 Version 1.11: (INDI 1.9.2)
81 - Fixed one issue with tracking (Jamie Flinn/jamiecflinn)
82 Version 1.10: (finalized: INDI 1.9.1)
83 - Weather support for setting temperature/humidity/pressure, values will be overridden in OnStep by any sensor values.
84 - Ability to swap primary focuser.
85 - High precision on location, and not overriding GPS even when marked for Mount > KStars.
86 - Added Rotator & De-Rotator Support
87 - TMC_SPI status reported (RAW) on the Status Tab. (ST = Standstill, Ox = open load A/B, Gx = grounded A/B, OT = Overtemp Shutdown, PW = Overtemp Prewarning)
88 - Manage OnStep Auxiliary Feature Names in Output Tab
89
90 Version 1.9:
91 - Weather support for Reading temperature/humidity/pressure (Values are Read-Only)
92 - Bugfix: Slew speed
93
94 Version 1.8:
95 - Bugfixes for FORK mounted scopes
96
97 Version 1.7:
98 - Added support for Reporting Guide rate (to PHD2 among others)
99 - Updated Error codes to match up with Android/SHC (Unknown reserved for unknown, so Unspecified = Unknown on other platforms)
100 - Added descriptions to SlewRate to match, slider kept which matches OnStep values
101 - Support for up to 9 stars for alignment
102 - Changed align so the last step isn't the (Optional) Write to EEPROM
103 - Added support for polar adjustments, without having to redo the entire model. (:MP# command)
104 - Support for Full Compensation/Refraction only, and 1/2 Axis tracking
105 - Cleanups
106
107 Version 1.6: Additional Functions
108 - James Lan fixed Meredian Flip and Home Pause buttons
109 - Cleaned Comments from previon versions
110 - Updated lastError Codes
111 - azwing typo minutes ' > second ''for Alignment Error
112
113 Version 1.5: Cleaning and Align Code Tuning
114 - James Lan Align Code
115 - Cleaning out debug messages
116 - Fix some TrackState inconsistencies with Ekos
117 - removing old Align Code
118 - fixing reversed Alt/Azm coorection values
119
120 Version 1.4: Tuning
121 - James Lan implementation of High Precision Tracking
122 - James lan Focuser Code
123 - James lan PEC
124 - James Lan Alignment
125 - Azwing set all com variable length to RB_MAX_LEN otherwise crash due to overflow
126 - Azwing set local variable size to RB_MAX_LEN otherwise erased by overflow preventing Align and other stuf to work
127 - James Lan Align Tab implementation
128 - Azwing Removed Alignment in main tab
129 - Azwing minor typo fixes
130 - Azwing reworked TrackState especially for parking/unparking
131
132 Version 1.3: Complete rework of interface and functionalities
133 - Telescope Status using :GU#
134 - Parking Management
135 - Star Alignment
136 - Tracking Frequency
137 - Focuser rework
138
139 Version 1.2: Initial issue
140
141*/
142
143#pragma once
144
145#include "lx200generic.h"
146#include "lx200driver.h"
147#include "indicom.h"
148#include "indifocuserinterface.h"
149#include "indiweatherinterface.h"
150#include "indirotatorinterface.h"
152#include "indipropertytext.h"
153#include "indipropertyswitch.h"
154#include "indipropertynumber.h"
155
156#include <cstring>
157#include <unistd.h>
158#include <termios.h>
159#include <stdlib.h>
160
161#define RB_MAX_LEN 64
162#define CMD_MAX_LEN 32
163
164#define PORTS_COUNT 10
165#define STARTING_PORT 0
166
168
170enum RateCompensation {RC_NONE, RC_REFR_RA, RC_REFR_BOTH, RC_FULL_RA, RC_FULL_BOTH}; //To allow for using one variable instead of two in the future
171
173
175
177{
178 public:
179 LX200_OnStep();
181
182 virtual const char *getDefaultName() override;
183 virtual bool initProperties() override;
184 virtual void ISGetProperties(const char *dev) override;
185 virtual bool updateProperties() override;
186 virtual bool ISNewNumber(const char *dev, const char *name, double values[], char *names[], int n) override;
187 virtual bool ISNewSwitch(const char *dev, const char *name, ISState *states, char *names[], int n) override;
188 virtual bool Handshake() override;
189
190 protected:
191 virtual void getBasicData() override;
192 virtual bool Park() override;
193 virtual bool UnPark() override;
194 virtual bool SetCurrentPark() override;
195 virtual bool SetDefaultPark() override;
196 virtual bool SetTrackEnabled(bool enabled) override;
197 virtual bool updateLocation(double latitude, double longitude, double elevation) override;
198 virtual bool setLocalDate(uint8_t days, uint8_t months, uint16_t years) override;
199 virtual bool ReadScopeStatus() override;
200 virtual int setSiteLongitude(int fd, double Long);
201 virtual int setSiteLatitude(int fd, double Long);
202 virtual bool SetTrackRate(double raRate, double deRate) override;
203 virtual void slewError(int slewCode) override;
204 virtual bool Sync(double ra, double dec) override;
205
206 virtual bool MoveNS(INDI_DIR_NS dir, TelescopeMotionCommand command) override;
207 virtual bool MoveWE(INDI_DIR_WE dir, TelescopeMotionCommand command) override;
208
209 virtual bool saveConfigItems(FILE *fp) override;
210 virtual void Init_Outputs();
211
212 //Mount information
214 /* 0 = EQ mount (Presumed default for most things.)
215 * 1 = Fork
216 * 2 = Fork Alt
217 * 3 = Alt Azm
218 */
219
220 virtual bool sendScopeTime() override;
221 virtual bool sendScopeLocation() override;
222 virtual bool setUTCOffset(double offset) override; //azwing fix after change in lx200driver.cpp
223
224 // Goto
225 virtual bool Goto(double ra, double dec) override;
226
227 //FocuserInterface
228
229 IPState MoveFocuser(FocusDirection dir, int speed, uint16_t duration) override;
230 IPState MoveAbsFocuser (uint32_t targetTicks) override;
231 IPState MoveRelFocuser (FocusDirection dir, uint32_t ticks) override;
232 bool AbortFocuser () override;
233
234 //End FocuserInterface
235
236 //RotatorInterface
237
238 IPState MoveRotator(double angle) override;
239 IPState HomeRotator() override;
240 bool AbortRotator() override;
241 bool SetRotatorBacklash (int32_t steps) override;
242 bool SetRotatorBacklashEnabled(bool enabled) override;
243
244 // Homing
245 virtual IPState ExecuteHomeAction(TelescopeHomeAction action) override;
246
247 //End RotatorInterface
248
249 //PECInterface
250 //axis 0=RA, 1=DEC, others?
251 IPState StopPECPlayback (int axis);
252 IPState StartPECPlayback (int axis);
253 IPState ClearPECBuffer (int axis);
254 IPState StartPECRecord (int axis);
255 IPState SavePECBuffer (int axis);
256 IPState PECStatus (int axis);
257 IPState ReadPECBuffer (int axis);
258 IPState WritePECBuffer (int axis);
259 bool ISPECRecorded (int axis);
260 bool OSPECEnabled = false;
261 bool OSPECviaGU = false; //Older versions use :QZ# for PEC status, new can use the standard :GU#/:Gu#
262 //End PECInterface
263
264
265 //NewGeometricAlignment
266 IPState AlignStartGeometric(int stars);
267
278 virtual bool UpdateAlignStatus();
279 virtual bool UpdateAlignErr();
280 //End NewGeometricAlignment
281 bool OSAlignCompleted = false;
282
283 //Outputs
285 IPState OSDisableOutput(int output);
286 bool OSGetOutputState(int output);
287
288 // Reset slew rate labels
289 void initSlewRates();
290
291 bool sendOnStepCommand(const char *cmd);
292 bool sendOnStepCommandBlind(const char *cmd);
293 int flushIO(int fd);
294 int getCommandSingleCharResponse(int fd, char *data, const char *cmd); //Reimplemented from getCommandString
295 int getCommandSingleCharErrorOrLongResponse(int fd, char *data, const char *cmd); //Reimplemented from getCommandString
296 int getCommandDoubleResponse(int fd, double *value, char *data,
297 const char *cmd); //Reimplemented from getCommandString Will return a double, and raw value.
298 int getCommandIntResponse(int fd, int *value, char *data, const char *cmd);
299 int setMinElevationLimit(int fd, int min);
300 int OSUpdateFocuser(); //Return = 0 good, -1 = Communication error
301 int OSUpdateRotator(); //Return = 0 good, -1 = Communication error
302
304
308
313
315
317
318 long int OSTimeoutSeconds = 0;
319 long int OSTimeoutMicroSeconds = 100000;
320
321 // OnStep Status controls
323
324 bool TMCDrivers = true; //Set to false if it doesn't detect TMC_SPI reporting. (Small delay on connection/first update)
325 bool OSHighPrecision = false;
326
327 // Focuser controls
328 // Focuser 1
329 bool OSFocuser1 = false;
331
332 // Focus T° Compensation
337 // End Focus T° Compensation
338
341
342 // Focuser 2
343 //ISwitchVectorProperty OSFocus2SelSP;
344 //ISwitch OSFocus2SelS[2];
345 bool OSFocuser2 = false;
349
350 //Rotator - Some handled by RotatorInterface, but that's mostly for rotation only, absolute, and... very limited.
351 bool OSRotator1 = false; //Change to false after detection code
353
355
356 int IsTracking = 0;
357 uint32_t m_RememberPollingPeriod {1000};
358
359 // Reticle +/- Buttons
361
362 // Align Buttons
368
369 // ISwitchVectorProperty SetHomeSP;
370 // ISwitch SetHomeS[2];
371
374
381 INDI::PropertyNumber OSPECRWValuesNP {2}; //Current Index and User Index
382
390
391 // Note: OSOutput1SP and OSOutput2SP are deprecated in favor of OutputPorts_NP
392
394 bool OSHasOutputs = true;
395
397
400
401
404
407 uint8_t PECStatusGU = 0;
408 uint8_t ParkStatusGU = 0;
409
410 // Weather support
411 // NOTE: Much is handled by WeatherInterface, these controls are mainly for setting values which are not detected
412 // As of right now, if there is a sensor the values will be overwritten on the next update
414 true; //This can fail on some processors and take the timeout before an update, so if it fails, don't check again.
415
419 //Not sure why this would be used, but will feed to it from site settings
421
422 //This is updated via other commands, as such I'm going to ignore it like some others do.
423 virtual IPState updateWeather() override
424 {
425 return IPS_OK;
426 }
427
432 virtual void SyncParkStatus(bool isparked) override;
433
439 virtual void SetParked(bool isparked) override;
440
445 // #define DEBUG_TRACKSTATE
446 void PrintTrackState();
447
448 private:
449 int currentCatalog;
450 int currentSubCatalog;
451};
Provides interface to implement weather reporting and safety monitoring functionality.
bool AbortRotator() override
AbortRotator Abort all motion.
char OldOSStat[RB_MAX_LEN]
IPState ClearPECBuffer(int axis)
virtual bool Goto(double ra, double dec) override
Move the scope to the supplied RA and DEC coordinates.
INDI::PropertyNumber OSSetTemperatureNP
IPState PECStatus(int axis)
virtual void Init_Outputs()
virtual bool MoveNS(INDI_DIR_NS dir, TelescopeMotionCommand command) override
Start or Stop the telescope motion in the direction dir.
int getCommandSingleCharResponse(int fd, char *data, const char *cmd)
IPState MoveFocuser(FocusDirection dir, int speed, uint16_t duration) override
MoveFocuser the focuser in a particular direction with a specific speed for a finite duration.
INDI::PropertyNumber OSPECRWValuesNP
int getCommandDoubleResponse(int fd, double *value, char *data, const char *cmd)
INDI::PropertySwitch TFCCompensationSP
uint8_t PECStatusGU
virtual IPState ExecuteHomeAction(TelescopeHomeAction action) override
Execute a homing action.
INDI::PropertyNumber OutputPorts_NP
int getCommandIntResponse(int fd, int *value, char *data, const char *cmd)
virtual bool ISNewNumber(const char *dev, const char *name, double values[], char *names[], int n) override
Process the client newNumber command.
OnStepVersion OnStepMountVersion
virtual bool setLocalDate(uint8_t days, uint8_t months, uint16_t years) override
IPState AlignDone()
INDI::PropertyNumber MaxSlewRateNP
INDI::PropertySwitch SolarSP
IPState OSDisableOutput(int output)
INDI::PropertySwitch HomePauseSP
INDI::PropertySwitch DeepSkyCatalogSP
INDI::PropertyNumber GuideRateNP
virtual bool setUTCOffset(double offset) override
INDI::PropertyNumber TFCDeadbandNP
INDI::PropertyNumber ElevationLimitNP
bool ISPECRecorded(int axis)
INDI::PropertyText VersionTP
INDI::PropertySwitch OSRotatorDerotateSP
IPState OSEnableOutput(int output)
INDI::PropertyNumber ObjectNoNP
INDI::PropertySwitch OSPECStatusSP
IPState AlignStartGeometric(int stars)
IPState StartPECPlayback(int axis)
bool SetRotatorBacklash(int32_t steps) override
SetRotatorBacklash Set the Rotatorer backlash compensation value.
uint32_t m_RememberPollingPeriod
virtual bool UnPark() override
Unpark the telescope if already parked.
IPState StopPECPlayback(int axis)
IPState SavePECBuffer(int axis)
INDI::PropertySwitch OSNAlignWriteSP
bool OSAlignCompleted
virtual bool saveConfigItems(FILE *fp) override
saveConfigItems Save specific properties in the provide config file handler. Child class usually over...
INDI::PropertyNumber minutesPastMeridianNP
INDI::PropertyNumber OSPECCurrentIndexNP
virtual bool MoveWE(INDI_DIR_WE dir, TelescopeMotionCommand command) override
Move the telescope in the direction dir.
virtual bool Sync(double ra, double dec) override
Set the telescope current RA and DEC coordinates to the supplied RA and DEC coordinates.
INDI::PropertyText OnstepStatTP
virtual void getBasicData() override
virtual bool SetDefaultPark() override
SetDefaultPark Set default coordinates/encoders value as the desired parking position.
IPState MoveRelFocuser(FocusDirection dir, uint32_t ticks) override
MoveFocuser the focuser to an relative position.
bool sendOnStepCommand(const char *cmd)
INDI::PropertySwitch OSFocus2RateSP
int flushIO(int fd)
INDI::PropertySwitch OSNAlignSP
virtual int setSiteLongitude(int fd, double Long)
long int OSTimeoutMicroSeconds
uint8_t ParkStatusGU
IPState MoveAbsFocuser(uint32_t targetTicks) override
MoveFocuser the focuser to an absolute position.
IPState AlignAddStar()
AlignStartGeometric starts the OnStep Multistar align process.
INDI::PropertyNumber TFCCoefficientNP
virtual bool SetTrackEnabled(bool enabled) override
SetTrackEnabled Engages or disengages mount tracking. If there are no tracking modes available,...
IPState AlignWrite()
INDI::PropertySwitch OSFocus1InitializeSP
MountType OSMountType
INDI::PropertyNumber OSPECUserIndexNP
virtual bool initProperties() override
Called to initialize basic properties required all the time.
char OSPier[RB_MAX_LEN]
INDI::PropertySwitch TrackAxisSP
bool sendOnStepCommandBlind(const char *cmd)
IPState StartPECRecord(int axis)
bool OSSupports_bitfield_Gu
virtual int setSiteLatitude(int fd, double Long)
long int OSTimeoutSeconds
virtual void SyncParkStatus(bool isparked) override
SyncParkStatus Update the state and switches for parking.
virtual bool sendScopeLocation() override
INDI::PropertyNumber BacklashNP
char OSNAlignStat[RB_MAX_LEN]
int setMinElevationLimit(int fd, int min)
IPState ReadPECBuffer(int axis)
IPState WritePECBuffer(int axis)
INDI::PropertyText OSNAlignErrTP
char OldOSPier[RB_MAX_LEN]
IPState HomeRotator() override
HomeRotator Go to home position.
INDI::PropertyNumber OSSetHumidityNP
virtual bool Park() override
Park the telescope to its home position.
virtual void slewError(int slewCode) override
INDI::PropertyNumber OSSetAltitudeNP
bool SetRotatorBacklashEnabled(bool enabled) override
SetRotatorBacklashEnabled Enables or disables the Rotator backlash compensation.
INDI::PropertyText ObjectInfoTP
INDI::PropertySwitch ReticSP
char OSStat[RB_MAX_LEN]
INDI::PropertySwitch StarCatalogSP
int getCommandSingleCharErrorOrLongResponse(int fd, char *data, const char *cmd)
virtual bool UpdateAlignErr()
INDI::PropertySwitch OSPECRecordSP
virtual bool SetTrackRate(double raRate, double deRate) override
SetTrackRate Set custom tracking rates.
INDI::PropertyNumber FocusTemperatureNP
INDI::PropertyNumber OSFocus2TargNP
INDI::PropertySwitch OSPECReadSP
INDI::PropertySwitch OSFocus2MotionSP
virtual bool sendScopeTime() override
bool OSGetOutputState(int output)
virtual bool UpdateAlignStatus()
INDI::PropertySwitch OSFocusSelectSP
IPState MoveRotator(double angle) override
MoveRotator Go to specific angle.
void PrintTrackState()
PrintTrackState will print to the debug log the status of TrackState if DEBUG_TRACKSTATE is defined o...
virtual bool ISNewSwitch(const char *dev, const char *name, ISState *states, char *names[], int n) override
Process the client newSwitch command.
INDI::PropertyText OSNAlignTP
virtual const char * getDefaultName() override
INDI::PropertySwitch OSPECIndexSP
virtual void ISGetProperties(const char *dev) override
define the driver's properties to the client. Usually, only a minimum set of properties are defined t...
INDI::PropertySwitch FrequencyAdjustSP
virtual void SetParked(bool isparked) override
SetParked Change the mount parking status. The data park file (stored in ~/.indi/ParkData....
INDI::PropertySwitch OSNAlignPolarRealignSP
virtual IPState updateWeather() override
updateWeather Update weather conditions from device or service. The function should not change the st...
INDI::PropertySwitch OSNAlignStarsSP
INDI::PropertySwitch PreferredPierSideSP
INDI::PropertySwitch OSRotatorRateSP
virtual bool Handshake() override
perform handshake with device to check communication
bool OSSeparate_Pulse_Guide_Rate
INDI::PropertyNumber OSSetPressureNP
INDI::PropertySwitch TrackCompSP
virtual bool updateLocation(double latitude, double longitude, double elevation) override
Update telescope location settings.
virtual bool updateProperties() override
Called when connected state changes, to add/remove properties.
virtual bool ReadScopeStatus() override
Read telescope status.
bool AbortFocuser() override
AbortFocuser all focus motion.
virtual bool SetCurrentPark() override
SetCurrentPark Set current coordinates/encoders value as the desired parking position.
INDI::PropertySwitch AutoFlipSP
double ra
double dec
#define min(a, b)
ISState
Switch state.
Definition indiapi.h:148
IPState
Property state.
Definition indiapi.h:158
@ IPS_OK
Definition indiapi.h:160
INDI_DIR_WE
INDI_DIR_NS
Implementations for common driver routines.
int fd
MountType
@ MOUNTTYPE_GEM
@ MOUNTTYPE_ALTAZ
@ MOUNTTYPE_FORK
@ MOUNTTYPE_FORK_ALT
RateCompensation
@ RC_REFR_BOTH
@ RC_FULL_BOTH
@ RC_NONE
@ RC_FULL_RA
@ RC_REFR_RA
#define RB_MAX_LEN
OnStepVersion
@ OSV_OnStepV4
@ OSV_OnStepV3
@ OSV_OnStepV5
@ OSV_UNKNOWN
@ OSV_OnStepV1or2
@ OSV_OnStepX
ResponseErrors
@ RES_ERR_FORMAT
Errors
@ ERR_GOTO_ERR_ABOVE_OVERHEAD
@ ERR_GOTO_ERR_PARK
@ ERR_MERIDIAN
@ ERR_GOTO_ERR_OUTSIDE_LIMITS
@ ERR_GOTO_ERR_BELOW_HORIZON
@ ERR_LIMIT_SENSE
@ ERR_DEC
@ ERR_NONE
@ ERR_GOTO_ERR_GOTO
@ ERR_UNDER_POLE
@ ERR_ALT_MAX
@ ERR_GOTO_ERR_IN_MOTION
@ ERR_GOTO_ERR_UNSPECIFIED
@ ERR_SYNC
@ ERR_ALT_MIN
@ ERR_GOTO_ERR_STANDBY
@ ERR_AZM
@ ERR_UNSPECIFIED
@ ERR_PARK
@ ERR_GOTO_ERR_NONE
@ ERR_GOTO_ERR_HARDWARE_FAULT
@ ERR_MOTOR_FAULT
@ ERR_GOTO_SYNC
#define PORTS_COUNT
uint8_t cmd[4]
Definition pwc-ioctl.h:2