Hekateros  3.4.3
RoadNarrows Robotics Robot Arm Project
hekMonitor.h
Go to the documentation of this file.
1 ////////////////////////////////////////////////////////////////////////////////
2 //
3 // Package: Hekateros
4 //
5 // Library: libhekateros
6 //
7 // File: hekRobot.h
8 //
9 /*! \file
10  *
11  * $LastChangedDate: 2015-05-01 14:30:09 -0600 (Fri, 01 May 2015) $
12  * $Rev: 3974 $
13  *
14  * \brief Hekateros Monitor Class interface.
15  *
16  * \author Robin Knight (robin.knight@roadnarrows.com)
17  * \author Daniel Packard (daniel@roadnarrows.com)
18  *
19  * \copyright
20  * \h_copy 2014-2017. RoadNarrows LLC.\n
21  * http://www.roadnarrows.com\n
22  * All Rights Reserved
23  */
24 /*
25  * @EulaBegin@
26  *
27  * Unless otherwise stated explicitly, all materials contained are copyrighted
28  * and may not be used without RoadNarrows LLC's written consent,
29  * except as provided in these terms and conditions or in the copyright
30  * notice (documents and software) or other proprietary notice provided with
31  * the relevant materials.
32  *
33  * IN NO EVENT SHALL THE AUTHOR, ROADNARROWS LLC, OR ANY
34  * MEMBERS/EMPLOYEES/CONTRACTORS OF ROADNARROWS OR DISTRIBUTORS OF THIS SOFTWARE
35  * BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR
36  * CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS
37  * DOCUMENTATION, EVEN IF THE AUTHORS OR ANY OF THE ABOVE PARTIES HAVE BEEN
38  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
39  *
40  * THE AUTHORS AND ROADNARROWS LLC SPECIFICALLY DISCLAIM ANY WARRANTIES,
41  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
42  * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN
43  * "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO
44  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
45  *
46  * @EulaEnd@
47  */
48 ////////////////////////////////////////////////////////////////////////////////
49 
50 #ifndef _HEK_MONITOR_H
51 #define _HEK_MONITOR_H
52 
53 /*!
54  * \brief Define if Heketeros has RN system board with I/O expander.
55  *
56  * \note The original system board is deprecated. However a newer version may
57  * be resurected at a future time, so keep the code.
58  */
59 #undef HEK_HAS_SYS_BOARD
60 
61 /*!
62  * \brief Define if Hekateros has Arduino compatible I/O device.
63  */
64 #define HEK_HAS_ARDUINO
65 
66 #include <sys/types.h>
67 #include <sys/time.h>
68 #include <pthread.h>
69 
70 #include "rnr/rnrconfig.h"
71 #include "rnr/units.h"
72 
73 #ifdef HEK_HAS_SYS_BOARD
74 #include "rnr/i2c.h"
75 #endif // HEK_HAS_SYS_BOARD
76 
77 #include <string>
78 #include <map>
79 
80 #include "Dynamixel/Dynamixel.h"
81 #include "Dynamixel/DynaComm.h"
82 #include "Dynamixel/DynaServo.h"
83 #include "Dynamixel/DynaChain.h"
84 #include "Dynamixel/DynaBgThread.h"
85 
86 #include "Hekateros/hekateros.h"
87 #include "Hekateros/hekUtils.h"
88 #include "Hekateros/hekDesc.h"
89 #include "Hekateros/hekJoint.h"
90 #include "Hekateros/hekKin.h"
91 #include "Hekateros/hekState.h"
92 #include "Hekateros/hekUno.h"
93 #include "Hekateros/hekSysBoard.h"
94 
95 namespace hekateros
96 {
97  /*!
98  * \brief \h_hek power, joint limits, and alarm monitoring class.
99  */
101  {
102  public:
103  /*!
104  * \brief Map of optical limit switches for all joints in all kinematic
105  * chains.
106  *
107  * \termblock
108  * \term key: \termdata i/o expander bit mask \endterm
109  * \term mapped type: \termdata joint optical limit data \endterm
110  * \endtermblock
111  */
112  typedef map<int, HekJointOptical> MapOpticalLimits;
113 
114  /*!
115  * \brief \h_hek internal monitor states.
116  */
118  {
119  MonStateIdInit, ///< power on and/or (re)initializing
120  MonStateIdRunNormal, ///< running in normal mode
121  MonStateIdRunAlarmed, ///< running in alarmed mode
122  MonStateIdHalting, ///< halting
123  MonStateIdHalted ///< halted
124  };
125 
126  /*!
127  * \brief monitor thread states.
128  */
130  {
132  MonThStateIdIdle, ///< no work
133  MonThStateIdRun, ///< process thread work
134  MonThStateIdExit ///< exit/no thread
135  };
136 
137  /*!
138  * \brief Default constructor.
139  */
140  HekMonitor();
141 
142  /*!
143  * \brief Destructor.
144  */
145  virtual ~HekMonitor();
146 
147  /*!
148  * \brief Open resources to monitor hardware.
149  *
150  * Creates monitor thread.
151  *
152  * \param uHekHwVer \h_hek hardware version.
153  * \param strDevArduino Arduino serial device name.
154  * \param nBaudRateArduino Arduino baud rate.
155  *
156  * \copydoc doc_return_std
157  */
158  int open(uint_t uHekHwVer,
159  const std::string &strDevArduino = HekDevArduino,
160  int nBaudRateArduino = HekBaudRateArduino);
161 
162  /*!
163  * \brief Close resources to monitor hardware.
164  *
165  * Cancels monitor thread.
166  *
167  * \copydoc doc_return_std
168  */
169  int close();
170 
171 
172  // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
173  // Monitoring Thread Control
174  // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
175 
176  /*!
177  * \brief Start monitoring added objects.
178  *
179  * \param fHz Monitoring hertz.
180  *
181  * \copydoc doc_return_std
182  */
183  int start(double fHz=30.0);
184 
185  /*!
186  * \brief Stop monitoring.
187  *
188  * \copydoc doc_return_std
189  */
190  int stop();
191 
192 
193  // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
194  // Objects to Monitor
195  // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
196 
197  /*!
198  * \brief Add servo chain to monitor for alarms and health.
199  *
200  * \warn Only add when monitor thread does not exist or is in the idle
201  * state.
202  *
203  * \param pDynaChain Pointer to dynamixel chain.
204  */
205  void addServoChainToMonitor(DynaChain *pDynaChain)
206  {
207  m_pDynaChain = pDynaChain;
208  }
209 
210  /*!
211  * \brief Add any joint limit switches to quick look-up map.
212  *
213  * \warn Only add when monitor thread does not exist or is in the idle
214  * state.
215  *
216  * \param [in] pSpecJoint Pointer to joint spcecification.
217  * \param [in] pJoint Pointer to associated master servo joint.
218  *
219  * \copydoc doc_return_std
220  */
221  int addJointLimitsToMonitor(HekSpecJoint_T *pSpecJoint,
222  HekRobotJoint *pJoint);
223 
224  /*!
225  * \brief Add kinematics for safety control.
226  *
227  * \warn Only add when monitor thread does not exist or is in the idle
228  * state.
229  *
230  * \param pKin Pointer to kinematics.
231  */
233  {
234  m_pKin = pKin;
235  }
236 
237 
238  // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
239  // Monitoring State & Conditions
240  // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
241 
242  /*!
243  * \brief Get the current monitor state.
244  *
245  * \return \ref MonStateId enum value.
246  */
248  {
249  return m_eMonState;
250  }
251 
252  /*!
253  * \brief Mark alarm condition.
254  *
255  * \param bAlarm \h_hek is [not] alarmed.
256  */
257  void markAlarmCond(bool bAlarmedCond);
258 
259  /*!
260  * \brief Mark emergency stop condition.
261  *
262  * \param bEStopCond \h_hek is [not] in emergency stop condition.
263  */
264  void markEStopCond(bool bEStopCond);
265 
266  /*!
267  * \brief Mark motors are powered condition.
268  *
269  * \param bPoweredCond \h_hek servo motors are [not] powered.
270  */
271  void markPoweredCond(bool bPoweredCond)
272  {
273  m_bPoweredCond = bPoweredCond;
274  }
275 
276 
277  // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
278  // Basic I/O
279  // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
280 
281  /*!
282  * \brief Read firmware version.
283  *
284  * \return Version number
285  */
286  byte_t readFwVersion();
287 
288  /*!
289  * \brief Read joint limit switch states.
290  *
291  * \return Limit switch bit values.
292  */
293  byte_t readLimitSwitches();
294 
295  /*!
296  * \brief Read End Effector GPIO states.
297  *
298  * \return GPIO bit values.
299  */
300  byte_t readEEGpio();
301 
302  /*!
303  * \brief Read one End Effector GPIO pin state.
304  *
305  * \param byPin GPIO pin.
306  *
307  * \copydoc doc_return_std
308  */
309  byte_t readEEGpioPin(byte_t byPin);
310 
311  /*!
312  * \brief Write state to one End Effector GPIO pin.
313  *
314  * \param byPin GPIO pin.
315  * \param byVal GPIO pin new value. 0 or 1.
316  *
317  * \copydoc doc_return_std
318  */
319  int writeEEGpioPin(byte_t byPin, byte_t byVal);
320 
321  /*!
322  * \brief Configure End Effector GPIO pin direction.
323  *
324  * \param byPin GPIO pin.
325  * \param cDir 'i' == input, 'o' == output.
326  *
327  * \copydoc doc_return_std
328  */
329  int configEEGpioPin(byte_t byPin, char cDir);
330 
331  /*!
332  * \brief Write alarm LED.
333  *
334  * \param bState On/off state of LED.
335  */
336  void writeAlarmLED(bool bState);
337 
338  /*!
339  * \brief Write CPU status LED.
340  *
341  * \param bState On/off state of LED.
342  */
343  void writeStatusLED(bool bState)
344  {
345  }
346 
347  /*!
348  * \brief Write system is halting.
349  */
351  {
352  }
353 
354  /*!
355  * \brief Test interface.
356  *
357  * Diagnostics printed to stderr.
358  */
359  void testInterface();
360 
361 
362  // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
363  // Attribute Methods
364  // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
365 
366  /*!
367  * \brief Get monitoring alarm condition.
368  *
369  * \return Returns true or false.
370  */
372  {
373  return m_bAlarmCond;
374  }
375 
376  /*!
377  * \brief Get monitoring emergency stop condition.
378  *
379  * \return Returns true or false.
380  */
382  {
383  return m_bEStopCond;
384  }
385 
386  /*!
387  * \brief Get motors are powered condition.
388  *
389  * \return Returns true or false.
390  */
392  {
393  return m_bPoweredCond;
394  }
395 
396  /*!
397  * \brief Get joint limits information.
398  *
399  * \param byMask Limit switch bit mask (index).
400  *
401  * \return Return pointer to limit switch information.
402  */
404  {
405  return &(m_opticalLimits[byMask].m_limit);
406  }
407 
408  /*!
409  * \brief Get current limit switch bit values.
410  *
411  * \return Bits.
412  */
414  {
415  return m_byLimitBits;
416  }
417 
418  /*!
419  * \brief Get current End Effector auxilliary bit values.
420  *
421  * \return Bits.
422  */
423  byte_t getEEAuxBits()
424  {
425  return m_byEEAuxBits;
426  }
427 
428  /*!
429  * \brief Get current joint limit tri-state.
430  *
431  * \param pJoint Joint.
432  * \param nLimit Joint limit switch index.
433  *
434  * \return Return \ref HekTriState value.
435  */
436  HekTriState getJointLimitTriState(HekRobotJoint *pJoint, int nLimit);
437 
438  protected:
439  // state
440  MonStateId m_eMonState; ///< \h_hek monitor state
441  bool m_bIsOpen; ///< hardware is [not] open
442  bool m_bEStopCond; ///< estop condition
443  bool m_bAlarmCond; ///< alarm condition
444  bool m_bPoweredCond; ///< power to motors condition
445 
446  // objects monitored
447  DynaChain *m_pDynaChain; ///< dynamixel servo chain alarms
448  MapOpticalLimits m_opticalLimits; ///< joint optical limits map
449  HekKinematics *m_pKin; ///< kinematics
450 
451  // monitor hardware interface
452 #if defined(HEK_HAS_ARDUINO)
453  HekUno m_hwif; ///< arduino compatible subproc i/f
454 #elif defined(HEK_HAS_SYS_BOARD)
455  HekSysBoard m_hwif; ///< system board w/ I/O expansion i/f
456  // gpio
457 #endif // hardware interface
458 
459  byte_t m_byLimitBits; ///< limit bit state
460  byte_t m_byEEAuxBits; ///< end effector auxilliary bit state
461 
462  // monitor thread control
463  MonThStateId m_eMonThState; ///< monitoring thread state
464  MonThStateId m_eMonThStateOld; ///< monitoring thread old state
465  double m_fHz; ///< monitoring hertz
466  struct timespec m_tPeriod; ///< derived monitoring period
467  struct timespec m_tStart; ///< start time for next monitor work
468  pthread_mutex_t m_mutexMon; ///< monitor mutex
469  pthread_cond_t m_condMon; ///< monitor condition
470  pthread_t m_threadMon; ///< monitor pthread identifier
471 
472  // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
473  // Monitor Thread Methods
474  // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
475 
476  /*!
477  * \brief Lock the monitor thread mutex.
478  *
479  * The calling thread will block while waiting for the mutex to become
480  * available. Once locked, the monitor thread will block.
481  *
482  * The lock()/unlock() primitives provide a safe mechanism safely access
483  * monitor resources.
484  *
485  * \par Context:
486  * Any.
487  */
488  void lock()
489  {
490  pthread_mutex_lock(&m_mutexMon);
491  }
492 
493 
494  /*!
495  * \brief Unlock the monitor thread mutex.
496  *
497  * The monitor thread will be available to run.
498  *
499  * \par Context:
500  * Any.
501  */
502  void unlock()
503  {
504  pthread_mutex_unlock(&m_mutexMon);
505  }
506 
507  /*!
508  * \brief Create the monitor thread.
509  *
510  * \par Context:
511  * Calling thread.
512  *
513  * \copydoc doc_return_std
514  */
515  int createMonThread();
516 
517  /*!
518  * \brief Destroy the monitor thread.
519  *
520  * \par Context:
521  * Calling thread.
522  */
523  void destroyMonThread();
524 
525  /*!
526  * \brief Signal monitor thread of new state.
527  *
528  * \param eNewState Monitor thread's new state.
529  */
530  void signalMonThread(MonThStateId eNewState);
531 
532  /*!
533  * \brief Monitor thread block wait in idle state.
534  */
535  void idleWait();
536 
537  /*!
538  * \brief Monitor thread block timed wait in run state.
539  */
540  void runWait();
541 
542  /*!
543  * \brief Get thread state name string.
544  *
545  * \param eNewState Monitor thread's new state.
546  *
547  * \return State name string.
548  */
549  const char *getThStateName(MonThStateId eNewState);
550 
551  /*!
552  * \brief Monitor thread.
553  *
554  * \param pArg Thread argument (point to HekMonitor object).
555  *
556  * \return Returns NULL on thread exit.
557  */
558  static void *monThread(void *pArg);
559 
560  /*!
561  * \brief Monitor joint (optical) limits for state transitions.
562  *
563  * Any limited rotation joint will be stopped when an optical limit switch
564  * transitions from lit to blocked.
565  */
566  void monJointLimits();
567 
568  /*!
569  * \brief Monitor End Effector auxillary I/O.
570  */
571  void monEEAuxIO();
572 
573  /*!
574  * \brief Monitor servos for alarms.
575  */
576  void monServoAlarms();
577  };
578 
579 } // namespace hekateros
580 
581 
582 #endif // _HEK_MONITOR_H
byte_t readEEGpio()
Read End Effector GPIO states.
Definition: hekMonitor.cxx:435
void runWait()
Monitor thread block timed wait in run state.
Definition: hekMonitor.cxx:581
pthread_mutex_t m_mutexMon
monitor mutex
Definition: hekMonitor.h:468
bool m_bAlarmCond
alarm condition
Definition: hekMonitor.h:443
byte_t getJointLimitBits()
Get current limit switch bit values.
Definition: hekMonitor.h:413
HekOpticalLimit_T * getJointLimitInfo(byte_t byMask)
Get joint limits information.
Definition: hekMonitor.h:403
void idleWait()
Monitor thread block wait in idle state.
Definition: hekMonitor.cxx:568
bool m_bIsOpen
hardware is [not] open
Definition: hekMonitor.h:441
map< int, HekJointOptical > MapOpticalLimits
Map of optical limit switches for all joints in all kinematic chains.
Definition: hekMonitor.h:112
HekTriState getJointLimitTriState(HekRobotJoint *pJoint, int nLimit)
Get current joint limit tri-state.
Definition: hekMonitor.cxx:499
HekDesc - Hekateros full robotic manipulator descripition class interface.
void markEStopCond(bool bEStopCond)
Mark emergency stop condition.
Definition: hekMonitor.cxx:403
void monJointLimits()
Monitor joint (optical) limits for state transitions.
Definition: hekMonitor.cxx:681
int getPoweredCond()
Get motors are powered condition.
Definition: hekMonitor.h:391
Operational robotic joint description class.
Definition: hekJoint.h:80
HekUno m_hwif
arduino compatible subproc i/f
Definition: hekMonitor.h:453
Optical limit switch.
Definition: hekOptical.h:148
pthread_t m_threadMon
monitor pthread identifier
Definition: hekMonitor.h:470
int stop()
Stop monitoring.
Definition: hekMonitor.cxx:328
Hekateros Robot State classes interface.
void writeStartHaltingSystem()
Write system is halting.
Definition: hekMonitor.h:350
<b><i>Hekateros</i></b> Arduino Uno compatible I/O board class interface.
void addServoChainToMonitor(DynaChain *pDynaChain)
Add servo chain to monitor for alarms and health.
Definition: hekMonitor.h:205
HekTriState
<b><i>Hekateros</i></b> tri-state type.
Definition: hekateros.h:479
void addKinematicsToMonitor(HekKinematics *pKin)
Add kinematics for safety control.
Definition: hekMonitor.h:232
MonStateId
<b><i>Hekateros</i></b> internal monitor states.
Definition: hekMonitor.h:117
The Hekateros kinematics and dynamics class interface.
Hekateros joint classes interfaces.
MonStateId m_eMonState
<b><i>Hekateros</i></b> monitor state
Definition: hekMonitor.h:440
MonStateId getMonState()
Get the current monitor state.
Definition: hekMonitor.h:247
struct timespec m_tStart
start time for next monitor work
Definition: hekMonitor.h:467
int getEStopCond()
Get monitoring emergency stop condition.
Definition: hekMonitor.h:381
MonThStateId m_eMonThState
monitoring thread state
Definition: hekMonitor.h:463
struct timespec m_tPeriod
derived monitoring period
Definition: hekMonitor.h:466
double m_fHz
monitoring hertz
Definition: hekMonitor.h:465
HekKinematics * m_pKin
kinematics
Definition: hekMonitor.h:449
bool m_bEStopCond
estop condition
Definition: hekMonitor.h:442
DynaChain * m_pDynaChain
dynamixel servo chain alarms
Definition: hekMonitor.h:447
const char * getThStateName(MonThStateId eNewState)
Get thread state name string.
Definition: hekMonitor.cxx:604
int addJointLimitsToMonitor(HekSpecJoint_T *pSpecJoint, HekRobotJoint *pJoint)
Add any joint limit switches to quick look-up map.
Definition: hekMonitor.cxx:355
void markAlarmCond(bool bAlarmedCond)
Mark alarm condition.
Definition: hekMonitor.cxx:396
power on and/or (re)initializing
Definition: hekMonitor.h:119
Top-level package include file.
void monEEAuxIO()
Monitor End Effector auxillary I/O.
Definition: hekMonitor.cxx:747
int configEEGpioPin(byte_t byPin, char cDir)
Configure End Effector GPIO pin direction.
Definition: hekMonitor.cxx:463
int close()
Close resources to monitor hardware.
Definition: hekMonitor.cxx:253
static void * monThread(void *pArg)
Monitor thread.
Definition: hekMonitor.cxx:623
void signalMonThread(MonThStateId eNewState)
Signal monitor thread of new state.
Definition: hekMonitor.cxx:557
int open(uint_t uHekHwVer, const std::string &strDevArduino=HekDevArduino, int nBaudRateArduino=HekBaudRateArduino)
Open resources to monitor hardware.
Definition: hekMonitor.cxx:216
byte_t readFwVersion()
Read firmware version.
void unlock()
Unlock the monitor thread mutex.
Definition: hekMonitor.h:502
const int HekBaudRateArduino
arduino baudrate
Definition: hekateros.h:456
HekMonitor()
Default constructor.
Definition: hekMonitor.cxx:180
MapOpticalLimits m_opticalLimits
joint optical limits map
Definition: hekMonitor.h:448
void writeStatusLED(bool bState)
Write CPU status LED.
Definition: hekMonitor.h:343
MonThStateId
monitor thread states.
Definition: hekMonitor.h:129
<b><i>Hekateros</i></b> power, joint limits, and alarm monitoring class.
Definition: hekMonitor.h:100
void markPoweredCond(bool bPoweredCond)
Mark motors are powered condition.
Definition: hekMonitor.h:271
byte_t m_byLimitBits
limit bit state
Definition: hekMonitor.h:459
Hekateros common utilities.
void lock()
Lock the monitor thread mutex.
Definition: hekMonitor.h:488
bool m_bPoweredCond
power to motors condition
Definition: hekMonitor.h:444
const char *const HekDevArduino
arduino device name
Definition: hekateros.h:447
byte_t readLimitSwitches()
Read joint limit switch states.
Definition: hekMonitor.cxx:420
int start(double fHz=30.0)
Start monitoring added objects.
Definition: hekMonitor.cxx:290
void writeAlarmLED(bool bState)
Write alarm LED.
Definition: hekMonitor.cxx:476
Robotic joint specification.
Definition: hekSpec.h:139
byte_t readEEGpioPin(byte_t byPin)
Read one End Effector GPIO pin state.
byte_t getEEAuxBits()
Get current End Effector auxilliary bit values.
Definition: hekMonitor.h:423
void testInterface()
Test interface.
Definition: hekMonitor.cxx:485
void destroyMonThread()
Destroy the monitor thread.
Definition: hekMonitor.cxx:545
<b><i>Hekateros</i></b> original system board.
int getAlarmCond()
Get monitoring alarm condition.
Definition: hekMonitor.h:371
virtual ~HekMonitor()
Destructor.
Definition: hekMonitor.cxx:208
The <b><i>Hekateros</i></b> namespace encapsulates all <b><i>Hekateros</i></b> related constructs...
Definition: hekateros.h:56
void monServoAlarms()
Monitor servos for alarms.
Definition: hekMonitor.cxx:751
MonThStateId m_eMonThStateOld
monitoring thread old state
Definition: hekMonitor.h:464
pthread_cond_t m_condMon
monitor condition
Definition: hekMonitor.h:469
int createMonThread()
Create the monitor thread.
Definition: hekMonitor.cxx:522
int writeEEGpioPin(byte_t byPin, byte_t byVal)
Write state to one End Effector GPIO pin.
Definition: hekMonitor.cxx:450
byte_t m_byEEAuxBits
end effector auxilliary bit state
Definition: hekMonitor.h:460