HC_API.h Source File

1 [[PREPROC_HEADER_GUARD_BEGIN]]
2 
3 
4 #include <condition_variable>
5 #include <deque>
6 #include <iostream>
7 #include <math.h>
8 #include <memory>
9 #include <mutex>
10 #include <string>
11 #include <thread>
12 #include <unordered_map>
13 #include <vector>
14 #include <functional>
15 
16 
17 [[PREPROC_NOPROC_START]]
18 #ifdef _WIN32 // Windows platform
19 #ifdef HC_EXPORTS// Define this when building the DLL
20 #define HC_API __declspec(dllexport)
21 #else
22 #define HC_API __declspec(dllimport)
23 #endif
24 #else // Non-Windows platforms (Linux, macOS, etc.)
25 #ifdef HC_EXPORTS// Define this when building the shared library
26 #define HC_API __attribute__((visibility("default")))
27 #else
28 #define HC_API
29 #endif
30 #endif
31 [[PREPROC_NOPROC_END]]
32 
33 
34 #define HC_LOG_DEVICE_NAME_LEN (20)
35 
36 #define HC_SWIG_SHAREDPTR(CLASSNAME)
37 
38 #define HC_CLASS_META(CLASSNAME) \
39  HC_SWIG_SHAREDPTR(CLASSNAME) \
40  static std::string staticClassName() { return #CLASSNAME "\0"; } \
41  virtual std::string className() override { return #CLASSNAME "\0"; } \
42 
43 #define HC_CLASS_META_BASE(CLASSNAME) \
44  HC_SWIG_SHAREDPTR(CLASSNAME) \
45  static std::string staticClassName() { return #CLASSNAME "\0"; } \
46  virtual std::string className() { return #CLASSNAME "\0"; } \
47 
48 #define HC_CLASS_META_BASIC_FACTORY_BASE(CLASSNAME) \
49  virtual std::shared_ptr<CLASSNAME> createSharedPtr() { return std::make_shared<CLASSNAME>(); }
50 
51 #define HC_CLASS_META_BASIC_FACTORY(CLASSNAME, BASECLASSNAME) \
52  virtual std::shared_ptr<BASECLASSNAME> createSharedPtr() override { return std::make_shared<CLASSNAME>(); }
53 
54 #define HC_CLASS_DEVICECOMMANDPACKAGE_META(CLASSNAME) \
55  HC_CLASS_META_BASIC_FACTORY(CLASSNAME, DeviceCommandPackage) \
56  HC_CLASS_META(CLASSNAME) \
57 
58 #define HC_CLASS_DEVICEINFO_META(CLASSNAME, COMMANDSTATUSNAME) COMMANDSTATUSNAME* addCommand(DeviceCommandPackage* package) { auto cs = api->addDeviceCommandDevId(this->apiDeviceId, package); return dynamic_cast<COMMANDSTATUSNAME*>(cs); }
59 
60 #define HC_CLASS_META_NO_BINDINGS(CLASSNAME)//ignore class in python generation.
61 
62 
63 
64 namespace spdlog {
65  class logger;
66 }
67 
68 
73 namespace ControlAPI {
74 
77  int HC_API throwTestException();
78 
81  int HC_API raiseTestSIGSEG();
82 
84  void HC_API printTestMessage();
85 
87  void HC_API printTestErrorMessage();
88 
90  void HC_API printTestErrorThrowMessage();
91 
92 #ifdef HC_API_MACRO_EXCLUDE_DOCS
93  void HC_API signalHandler(int signum);
94 #endif
95 
99  std::string HC_API logLocation(int index);
100 
103  void HC_API addLogPath(std::string logFilePath);
104 
105 
106 
107  std::string HC_API getRuntimeLibraryPath();
108 
109 
110  std::string HC_API getRuntimeDependancyPath();
111 
112 #ifdef HC_API_MACRO_EXCLUDE_DOCS
113  void HC_API basicPointerTest(int* number_in_out);
114 
115  class HC_API ICTestObj { public: virtual ~ICTestObj() = default; int n = 0; };
116  class HC_API ICDerivedTestObj : public ICTestObj {public: virtual ~ICDerivedTestObj() = default; int m = 0;};
117  void HC_API basicObjectTest(ICTestObj* obj);
118 #endif
119 
120 #if defined(HC_API_FEATURE_NETWORKING)
121  void HC_API networkMQTTConnect(std::string brokerHostName, int port = 1883);
128 
133  void HC_API networkMQTTDisconnect();
134 #endif
135 
136 
137 #ifdef HC_API_MACRO_EXCLUDE_DOCS
138 #ifdef HC_API_MATLAB_BUILD
139 
140 
141  int HC_API matlabArrayTest2(ICTestObj objArray[], int len);
142 #endif
143 #endif
144 
145 
146 
147  struct HC_API HardwareInfo {
148  HC_SWIG_SHAREDPTR(HardwareInfo)
149  int apiDeviceId = -1;
150  std::string alias;
151  };
152 
154  struct HC_API PhysicalAxisControlInfo {
155  HC_SWIG_SHAREDPTR(PhysicalAxisControlInfo)
156  float minPosLimit = 0;
157  float maxPosLimit = 0;
158 
159  float minVelLimit = 1.0f;
160  float maxVelLimit = 50.0f;
161 
162  float minAccLimit = 1.0f;
163  float maxAccLimit = 10.0f;
164 
165  bool isRadial = false;
166 
167  bool submittedToApi = false;
168  };
169 
171  class CommandStatus;
172  class HC_API CommandStateInfo {
173  public:
174  HC_CLASS_META_BASE(CommandStateInfo)
175  HC_SWIG_SHAREDPTR(CommandStateInfo)
176  virtual ~CommandStateInfo() = default;
177 
178 #ifdef HC_API_FEATURE_NETWORKING
179  virtual void cacheOnNetwork(CommandStatus* commandStatus);
184 #endif
185 
189  float percentFinished = 0.0f;
190  };
191 
192 
193 
194 
195 
197  class HC_API ApiCommandPackage {
198  public:
199  HC_CLASS_META_BASE(ApiCommandPackage)
200  HC_SWIG_SHAREDPTR(ApiCommandPackage)
201  friend class ControlSystem;
202 
203  virtual ~ApiCommandPackage() = default;
204 
205 
206 #ifdef HC_API_MACRO_EXCLUDE_DOCS
207  virtual std::shared_ptr<CommandStateInfo> createCommandStateInfo();
210  virtual std::shared_ptr<CommandStatus> createCommandStatus();
211 #endif
212 
213 
215  std::string alias;
216 
217 
218  private:
219  bool submitted = false;
220  };
221 
222 
226  class HC_API DeviceCommandPackage : public ApiCommandPackage {
227  public:
228  HC_CLASS_META(DeviceCommandPackage)
229  HC_SWIG_SHAREDPTR(DeviceCommandPackage)
230  HC_CLASS_META_BASIC_FACTORY_BASE(DeviceCommandPackage)
231  virtual ~DeviceCommandPackage() = default;
232 
233  friend class CommandStatus_Internals;
234 
237  virtual void cloneFrom(DeviceCommandPackage* other);
238 
239 #ifdef HC_API_MACRO_EXCLUDE_DOCS
240 #ifdef HC_API_FEATURE_NETWORKING
241  virtual void syncFromNetwork(CommandStatus* command);
245 #endif
246  virtual void copyFromStateInfo(CommandStateInfo* other);
249 #endif
250 
251 
255  virtual DeviceCommandPackage* prepareUpdatePackage();
256 
257 
260  void markUpdatePackageReady();
261 
264  bool continuous = false;
265 
266 
267 
268  private:
269  #ifdef HC_API_MACRO_EXCLUDE_DOCS
270  bool updatePackageReady = false;
271  std::shared_ptr<DeviceCommandPackage> updatePackage = nullptr;
272  void copyFromUpdatePackage();
273  #endif
274  };
275 
276 
279  public:
280  HC_CLASS_DEVICECOMMANDPACKAGE_META(MovementCommandPackage)
282  virtual ~MovementCommandPackage() = default;
283 
284 
285  virtual void cloneFrom(DeviceCommandPackage* other) override;
286 #ifdef HC_API_MACRO_EXCLUDE_DOCS
287 #ifdef HC_API_FEATURE_NETWORKING
288  virtual void syncFromNetwork(CommandStatus* command) override;
289 #endif
290  virtual std::shared_ptr<CommandStateInfo> createCommandStateInfo() override;
291 
292 
293 
294 #endif
295 
296 
297  enum Units {
298  Units_Millimeters,
299  Units_Degrees
300  };
301 
302 
304  float disp_target = 0.0f;
305 
307  float vel_target = 0.0f;
308 
310  float acc_target = 0.0f;
311 
313  bool disp_absolute = true;
314 
316  bool trackDisp = true;
317 
319  bool trackVel = true;
320 
322  bool trackAcc = true;
323 
325  Units units;
326 
327  };
328 
329 
332  public:
333  HC_CLASS_DEVICECOMMANDPACKAGE_META(MonitorCommandPackage)
334  virtual ~MonitorCommandPackage() = default;
335  };
336 
339  public:
340  HC_CLASS_META(TimeDelayDeviceCommand)
341  HC_SWIG_SHAREDPTR(TimeDelayDeviceCommand)
342  virtual ~TimeDelayDeviceCommand() = default;
343 
344 
345 
349  float time_s = 5.0f;
350  };
351 
354  public:
355  HC_CLASS_META(SynchronizeDeviceCommand)
356  HC_SWIG_SHAREDPTR(SynchronizeDeviceCommand)
357  friend class DeviceController;
358  friend class ControlSystem;
359 
360 
362 
363 
364  virtual ~SynchronizeDeviceCommand() = default;
365 
366 
367  protected:
368 #ifdef HC_API_MACRO_EXCLUDE_DOCS
369  int numDevices = 0;
370  int deviceWaitCounter = 0;
371 
372  std::shared_ptr<std::condition_variable> synchronizationNotification;
373  std::shared_ptr<std::mutex> synchronizationMutex;
374 #endif
375  };
376 
377 
378 
379 
380 
381 
382 
383 
384 
386  class HC_API MovementStateInfo : public CommandStateInfo {
387  public:
388  HC_CLASS_META(MovementStateInfo)
389  HC_SWIG_SHAREDPTR(MovementStateInfo)
390  virtual ~MovementStateInfo() = default;
391 
392 #ifdef HC_API_MACRO_EXCLUDE_DOCS
393 #ifdef HC_API_FEATURE_NETWORKING
394  virtual void cacheOnNetwork(CommandStatus* commandStatus) override;
395 #endif
396 #endif
397 
398  float referencePos = 0.0f;
399 
400 
401  float currentTargetPos = 0.0f;
402 
403 
404  float currentPos = 0.0f;
405 
406 
407  float currentTargetVel = 0.0f;
408 
409 
410  float currentVel = 0.0f;
411 
412 
413  float currentTargetAcc = 0.0f;
414 
415 
416  float currentAcc = 0.0f;
417 
418 
419  int signedDir = 0;
420 
421 
422  bool homing = false;
423 
424 
425  bool isHomed = false;
426  };
429  public:
430  HC_CLASS_META_BASE(CommandStatusControlMethods)
431 
432 
433  virtual bool runFull() = 0;
437 
438 
443  virtual bool runASync() = 0;
444 
449  virtual bool initialize() = 0;
450 
451 
457  virtual bool update(bool stepped = false) = 0;
458 
459 
460 
465  virtual bool waitUpdateReady() = 0;
466 
467 
472  virtual bool waitUpdateReadyOrFinished() = 0;
473 
474 
475 
479  virtual void waitFinished() = 0;
480 
481 
483  virtual void stop() = 0;
484 
486  virtual bool isBusy() const = 0;
487 
488 
489  virtual bool isUpdateStepReady() const = 0;
490 
492  virtual bool isFinished() const = 0;
493 
495  virtual bool isCancelled() const = 0;
496 
497 
498  virtual bool isSuccessful() const = 0;
499  };
500 
501 
502 
503 
504  class CommandStatus_Internals;
505  class ControlSystem;
506  class DeviceInfo;
507  class DeviceController;
510  public:
511  HC_CLASS_META(CommandStatus)
512  HC_SWIG_SHAREDPTR(CommandStatus)
513 
514  friend class ControlSystem;
515  friend class ControlSystem_Internals;
516  friend class CommandStatus_Internals;
517  friend class DeviceController;
518  friend class DeviceInfo;
519 
520  CommandStatus();
521  virtual ~CommandStatus();
522 
523 
524 
525  virtual bool runFull() override;
526  virtual bool runASync() override;
527  virtual bool initialize() override;
528  virtual bool update(bool stepped = false) override;
529  virtual bool waitUpdateReady() override;
530  virtual bool waitUpdateReadyOrFinished() override;
531  virtual void waitFinished() override;
532  virtual void stop() override;
533  virtual bool isBusy() const override;
534  virtual bool isUpdateStepReady() const override;
535  virtual bool isFinished() const override;
536  virtual bool isCancelled() const override;
537  virtual bool isSuccessful() const override;
538 
539 
540  int apiId() const;
541  int deviceApiId() const;
542 
547  CommandStateInfo *stateInfo();
548 
549 
554  DeviceCommandPackage *commandPackage();
555 
556 
561  ControlSystem *controlSystem();
562 
563 
568  DeviceInfo *deviceInfo();
569 
570 
575  DeviceController *deviceController();
576 
577 
579  std::string alias;
580 
581 
582 
583 
584 #ifdef HC_API_MACRO_EXCLUDE_DOCS
585 
586 
587 
589  std::shared_ptr<CommandStatus> nextCommand = nullptr;
591  std::shared_ptr<CommandStatus> prevCommand = nullptr;
593  DeviceCommandPackage* commandPackage_ = nullptr;
594 
595 
596 
597  std::shared_ptr<CommandStatus_Internals> internals;
598 
599  bool busy = false;
600  bool cancelled = false;
601  bool failed = false;
602 
603 #endif
604  private:
606  std::shared_ptr<CommandStateInfo> stateInfo_;
607 
608  bool autoAdvance = true;
609  bool finished = false;
610 
611 
612 
613 
614  bool preUpdateWaiting = false;
615 
616  int apiCommandId = -1;
617  int apiDeviceId = -1;
618 
619  ControlSystem *system = nullptr;
620  DeviceInfo *device = nullptr;
621  };
622 
623  class ControlSystem;
624  class DeviceController;
625  class DeviceInfo_Internal;
626 
628  class HC_API DeviceInfo : public HardwareInfo {
629  public:
630  HC_CLASS_META_BASE(DeviceInfo)
631  HC_SWIG_SHAREDPTR(DeviceInfo)
632  DeviceInfo();
633  virtual ~DeviceInfo();
634 
635  friend class ControlSystem;
636  friend class DeviceController;
637  friend class CommandStatus;
638 
639  #ifdef HC_API_MACRO_EXCLUDE_DOCS
640 
641  CommandStatus* activeCommand = nullptr;
642  #endif
643  bool preLoopCommandCheck(bool checkCancelled = true);
644 
646  bool isConnected() const;
647 
650  void setEnableCommandLogging(bool enable);
651 
654  void setCommandLoggingLevel(int level);
655 
656  bool commandLoggingEnabled() const;
657  int commandLoggingLevel() const;
658 
659 
660 
661  virtual DeviceCommandPackage* initializeCommand(DeviceCommandPackage* commandPackage);
662 
663 
664  CommandStatus* addCommandGeneric(DeviceCommandPackage* package);
665 
667  DeviceController *deviceController() ;
668 
670  ControlSystem *controlSystem();
671 
672  protected:
673  #ifdef HC_API_MACRO_EXCLUDE_DOCS
674 
675  std::shared_ptr<DeviceInfo_Internal> internal;
676 
677 
679  DeviceController *controller = nullptr;
680 
682  ControlSystem* api = nullptr;
683 
684  bool connected = false;
685  bool loggingEnabled = true;
686  int loggingLevel = 0;
687  #endif
688  };
689 
691  class HC_API CommandCallbacks {
692  public:
693  HC_CLASS_META_BASE(CommandCallbacks)
694  HC_SWIG_SHAREDPTR(CommandCallbacks)
695  virtual ~CommandCallbacks() = default;
696 
698  virtual void onCommandFinished(CommandStatus *commandStatus, DeviceInfo *deviceInfo);
699 
701  virtual void onCommandUpdate(CommandStatus *commandStatus, DeviceInfo *deviceInfo);
702  };
703 
704 
706  class HC_API LoggerFunctionality {
707  public:
708  HC_CLASS_META_BASE(LoggerFunctionality)
709  HC_SWIG_SHAREDPTR(LoggerFunctionality)
710 
711  virtual ~LoggerFunctionality() = default;
712 
713  std::shared_ptr<spdlog::logger> getLogger();
714 
715  std::string loggerName();
716 
717 
718  protected:
719  std::shared_ptr<spdlog::logger> logger;
720  ControlSystem* controlSystem = nullptr;
721 
722  };
723 
724  class ControlSystem_Internals;
727  class HC_API ControlSystem : public LoggerFunctionality {
728  public:
729  HC_CLASS_META(ControlSystem)
730  HC_SWIG_SHAREDPTR(ControlSystem)
731 
732  friend class LoggerFunctionality;
733  friend class ControlSystem_Internals;
734 
735  ControlSystem();
736  ControlSystem(ControlSystem& system);
737  virtual ~ControlSystem();
738 
739 
741  void addDeviceController(DeviceController* controller);
742 
743 
745  virtual void initializeDevices();
746 
748  virtual void initializeController(DeviceController* controller);
749 
754  virtual void unInitialize();
755 
757  void muteConsole();
758 
760  void unMuteConsole();
761 
762 
763 
765  CommandStatus *delay(std::string deviceAlias, float time_s);
767  CommandStatus *delay(DeviceInfo *devInfo, float time_s);
768 
770  CommandStatus* addDeviceCommand(DeviceInfo* device, DeviceCommandPackage* package);
771 
772 
774  CommandStatus* addDeviceCommandAlias(std::string deviceAlias, DeviceCommandPackage* package);
775 
777  CommandStatus *addDeviceCommandDevId(int deviceId, DeviceCommandPackage* package);
778 
779 
781  DeviceInfo *getDeviceFromAlias(std::string deviceAlias);
782 
784  DeviceController *getControllerFromAlias(std::string controllerAlias);
785 
786 
787 
788 #ifndef HC_API_MATLAB_PUBLIC_INTERFACE
789  void runFullCommandListSeq(std::vector<CommandStatus *> commandList);
794 
799  void runFullCommandListParallel(std::vector<CommandStatus *> commandList);
800 
805  void runASyncCommandList(std::vector<CommandStatus *> commandList);
806 
811  void waitFinishedCommandList(std::vector<CommandStatus *> commandList);
812 #endif
813 
814 
816  void setCommandCallback(std::shared_ptr<CommandCallbacks> callbackObj);
817 
818 
819 #ifdef HC_API_MACRO_EXCLUDE_DOCS
820  std::shared_ptr<ControlSystem_Internals> internals;
821 
822 #endif
823 
824  protected:
825 #ifdef HC_API_MACRO_EXCLUDE_DOCS
826 
827 
828  void issueNewCommands();
829 
830 
831  void packagePreCheck(DeviceCommandPackage *package);
832 
833 
834  DeviceInfo *getDeviceFromDeviceId(int deviceId);
835  DeviceController *getControllerFromDeviceId(int deviceId);
836 
837  CommandStatus* getBusyCommandFromDeviceId(int deviceId);
838  int getDeviceIdFromAlias(std::string alias);
839 
840 
841  std::vector<DeviceInfo*> getAllDevices();
842 
843 
844  virtual CommandStatus* addDeviceCommand_Alias(std::string deviceAlias, DeviceCommandPackage* package);
845  virtual CommandStatus* addDeviceCommand_Id(int deviceId, DeviceCommandPackage* package);
846 
847 
848 
849  std::shared_ptr<CommandCallbacks> mCallbackObj;
850 
851 
852 
853 #endif
854  };
855 
856 
858  class HC_API DeviceController : public LoggerFunctionality {
859  public:
860  HC_CLASS_META(DeviceController)
861  HC_SWIG_SHAREDPTR(DeviceController)
862 
863  friend class DeviceInfo;
864  friend class ControlSystem;
865 
866  virtual ~DeviceController();
867 
868 
869 #ifdef HC_API_MACRO_EXCLUDE_DOCS
870 
871 
872  virtual bool init();
873 
874 
875  virtual bool deInit();
876 
877  virtual bool issueCommand(CommandStatus* command);
878 
879  DeviceInfo* getDeviceInfoFromDeviceId(int apiDeviceId);
880 #endif
881 
883  virtual bool checkCommandPackage(int deviceId, DeviceCommandPackage* package);
884 
885 
890  void addDeviceInfo(DeviceInfo* dev);
891 
893  void removeDeviceInfo(DeviceInfo* dev);
894 
895 
897  void setDisconnectCallback(std::function<void(bool)> callback);
898 
899 
900 
902  std::string alias;
903 
905  std::string port;
906 
910  virtual void disconnect(bool expected = false);
911 
913  bool isConnected() { return connected; }
914 
916  int apiId() { return apiUniqueId; }
917 
921  void setSimulated(bool simulated);
922 
925  bool isSimulated();
926 
927 
928  protected:
929 #ifdef HC_API_MACRO_EXCLUDE_DOCS
930 
931  ControlSystem *api = nullptr;
932 
933  std::vector<DeviceInfo*> mDeviceInfoList;
934 
935 
936  float devicePollPeriodS = 0.1f;
937 
938  std::shared_ptr<std::thread> watchDogThread;
939  bool watchDogEnabled = false;
940 
941 
942  int apiUniqueId = 0;
943 
944  bool connected = false;
945 
946  bool initialized = false;
947 
948  bool simulated = false;
949 
950  std::function<void(bool)> disconnectCallback;
951 
952 #endif
953 
954 
955  };
956 
957 
958 
959 
961  HC_API MovementStateInfo *As_MovementStateInfo(CommandStateInfo *obj);
962  HC_API MovementCommandPackage *As_MovementCommandPackage(DeviceCommandPackage *obj);
963 
965  class HC_API Vector3D {
966  public:
967  Vector3D();
968  Vector3D(float x, float y, float z);
969 
970  float x;
971  float y;
972  float z;
973 
978  bool IsZero();
979  };
980 
981 }
982 
983 
984 [[PREPROC_HEADER_GUARD_END]]