Hermes SDK Documentation
CareTaker.hpp
Go to the documentation of this file.
1 
3 #pragma once
4 
5 #include <cstddef>
6 #include <thread>
7 #include <mutex>
8 #include <atomic>
9 #include <memory>
10 #include <map>
11 #include <set>
12 #include <chrono>
13 #include <functional>
14 
15 #include "HermesCallbackTypes.hpp"
16 
17 #include "grpc++/grpc++.h"
18 #include "protodefinitions/Devices.pb.h"
19 #include "protodefinitions/Hermes.pb.h"
20 #include "protodefinitions/Pipeline.pb.h"
21 #include "protodefinitions/Landscape.pb.h"
22 #include "protodefinitions/Session.pb.h"
23 #include "protodefinitions/ParameterSet.pb.h"
24 #include "protodefinitions/Hermes.grpc.pb.h"
25 
26 namespace zmq
27 {
28  class context_t;
29  class socket_t;
30 };
31 
32 namespace HermesSDK
33 {
34  // Set up a Doxygen group.
39  class CareTaker
40  {
41  Hermes::Protocol::Version m_version;
42  std::atomic<bool> m_isRunning;
43 
44 
45  std::wstring CareTaker::GetVersionDir();
46 
47  void DeviceDataSubscriberThreadFunction();
48  void DeviceLandscapeSubscriberThreadFunction();
49  void PolygonDataSubscriberThreadFunction();
50  void TrackingDataSubscriberThreadFunction();
51  void HeartbeatThreadFunction();
52  void RestartThreadFunction();
53 
54  bool Login();
55  bool Logout();
56  uint32_t Heartbeat();
57 
58  bool initHapticsSocket();
59 
60  static std::vector<uint8_t> Decompress( const std::vector<uint8_t> &in );
61  static size_t LzfDecompress( const std::vector<uint8_t> &in, std::vector<uint8_t> &out );
62 
63  std::shared_ptr<grpc::Channel> m_Channel;
64  std::unique_ptr<Hermes::Protocol::Hermes::Stub> m_Stub;
65 
66  const std::string m_clientName;
67  const std::string m_clientDescription;
68 
69  Hermes::Protocol::Session m_Session;
70  Hermes::Protocol::Pipeline m_Pipeline;
71  Hermes::Protocol::ServiceRoute m_Coordinator;
72 
73  std::unique_ptr<std::thread> m_deviceDataThread;
74  std::unique_ptr<std::thread> m_deviceLandscapeThread;
75  std::unique_ptr<std::thread> m_polygonDataThread;
76  std::unique_ptr<std::thread> m_trackingDataThread;
77  std::unique_ptr<std::thread> m_heartbeatThread;
78 
79  std::unique_ptr<std::thread> m_RestartThread;
80 
81  deviceDataCallback &m_dataCallback;
82  deviceLandscapeCallback &m_landscapeCallback;
83  polygonDataCallback &m_polygonDataCallback;
84  trackingDataCallback &m_trackingDataCallback;
85  filterSetupCallback &m_filterPipelineCallback;
86  errorMessageCallback &m_errorCallback;
87  connectedToCoreCallback& m_onConnectedToCoreCallback;
88  disconnectedFromCoreCallback& m_onDisconnectedFromCoreCallback;
89 
90  public:
91 
92  CareTaker( const std::string &clientName,
93  const std::string &clientInfo,
94  filterSetupCallback &_onFilterSetup,
95  deviceDataCallback &_onDeviceData,
96  deviceLandscapeCallback &_onDeviceLandscape,
97  polygonDataCallback &_onPolygonData,
98  trackingDataCallback &_onTrackingData,
99  errorMessageCallback &onError,
100  connectedToCoreCallback& _onConnectedToCore,
101  disconnectedFromCoreCallback& _onDisconnectedFromCore);
102  ~CareTaker();
103 
104  void Connect( const Hermes::Protocol::ServiceRoute& _coordinatorRoute );
105  void Stop();
106 
107  bool Rumble( uint32_t deviceId, float unitStrength, uint16_t durationInMilliseconds );
108  bool SendHapticData( uint32_t _dongleId, Hermes::Protocol::HandType _handType, const std::array<float, 5>& _powers );
109  bool GetFilterInventory( Hermes::Protocol::FilterInventory &inventory ) const;
111  bool SetPipeline( Hermes::Protocol::Pipeline *pipeline );
112  bool IsRunning();
113  bool GetCoreVersion( Hermes::Protocol::Version& version );
114 
115  bool GetAllUsers( Hermes::Protocol::UserCollection &UserCollection );
116 
117  bool UpdateTrackers(const Hermes::Protocol::TrackerData& TrackerData);
118 
119  bool AddSkeleton( Hermes::Protocol::Polygon::Skeleton &Skeleton );
120  bool RemoveSkeleton( Hermes::Protocol::Polygon::RemoveSkeletonArgs &_Args );
121  bool SetSkeletonTarget( Hermes::Protocol::Polygon::SetTargetArgs& _Args );
122  bool SetSkeletonSettings( Hermes::Protocol::Polygon::Retargeting::SettingsArgs& _Args );
123  bool AddTargetSkeleton( Hermes::Protocol::Polygon::TargetSkeleton &_Skeleton );
124  bool RemoveTargetSkeleton( std::string &_Name );
125  void UpdateTargetSkeleton( Hermes::Protocol::Polygon::TargetSkeleton &_Skeleton );
126 
127  Hermes::Protocol::Polygon::Version GetCompatiblePolygonVersion();
128  Hermes::Protocol::ServiceRoute* GetGRPCPresetPort();
129  int GetHivePort();
130  };
131 
132  // Close the Doxygen group.
134 }
HermesSDK::trackingDataCallback
std::function< void(const Hermes::Protocol::TrackerData &_data)> trackingDataCallback
Typedef to support callback for tracking data.
Definition: HermesCallbackTypes.hpp:124
Hermes::Protocol::Polygon::SetTargetArgs
Definition: Skeleton.proto:113
HermesSDK::CareTaker
Definition: CareTaker.hpp:40
HermesSDK::CareTaker::SendHapticData
bool SendHapticData(uint32_t _dongleId, Hermes::Protocol::HandType _handType, const std::array< float, 5 > &_powers)
Definition: CareTaker.cpp:449
Hermes::Protocol::FilterInventory
Definition: Pipeline.proto:17
HermesSDK::CareTaker::Stop
void Stop()
Definition: CareTaker.cpp:344
HermesSDK::connectedToCoreCallback
std::function< void(void)> connectedToCoreCallback
Typedef to support callback on connect to manus core.
Definition: HermesCallbackTypes.hpp:130
Hermes::Protocol::UserCollection
Definition: User.proto:13
Hermes::Protocol::Session
Definition: Session.proto:50
HermesSDK::CareTaker::Rumble
bool Rumble(uint32_t deviceId, float unitStrength, uint16_t durationInMilliseconds)
Definition: CareTaker.cpp:381
Hermes::Protocol::Polygon::TargetSkeleton
Definition: Skeleton.proto:99
TrackerData
All the tracker data that can be sent or received.
Definition: CoreSdkWrapperTypes.h:588
HermesCallbackTypes.hpp
HermesSDK::CareTaker::GetFilterInventory
bool GetFilterInventory(Hermes::Protocol::FilterInventory &inventory) const
Definition: CareTaker.cpp:495
HermesSDK::disconnectedFromCoreCallback
std::function< void(void)> disconnectedFromCoreCallback
Typedef to support callback on disconnect from manus core.
Definition: HermesCallbackTypes.hpp:132
Hermes::Protocol::Polygon::Version
Definition: Polygon.proto:16
HermesSDK::CareTaker::IsRunning
bool IsRunning()
Definition: CareTaker.cpp:1023
HermesSDK::deviceDataCallback
std::function< void(const Hermes::Protocol::Devices &_devices)> deviceDataCallback
Typedef to support callback for device data.
Definition: HermesCallbackTypes.hpp:118
HermesSDK::errorMessageCallback
std::function< void(const ErrorMessage &msg)> errorMessageCallback
Typedef to support callback for error messages.
Definition: HermesCallbackTypes.hpp:128
HermesSDK::CareTaker::SetPipeline
bool SetPipeline(Hermes::Protocol::Pipeline *pipeline)
Definition: CareTaker.cpp:534
Hermes::Protocol::Polygon::RemoveSkeletonArgs
Definition: Polygon.proto:22
Hermes::Protocol::Version
Definition: Version.proto:4
HermesSDK::CareTaker::GetActivePipeline
Hermes::Protocol::Pipeline * GetActivePipeline()
Definition: CareTaker.cpp:514
Hermes::Protocol::ServiceRoute
Definition: Session.proto:11
Hermes::Protocol::Pipeline
Definition: Pipeline.proto:23
HermesSDK::polygonDataCallback
std::function< void(const Hermes::Protocol::Polygon::Data &_data)> polygonDataCallback
Typedef to support callback for Polygon data.
Definition: HermesCallbackTypes.hpp:122
HermesSDK::deviceLandscapeCallback
std::function< void(const Hermes::Protocol::Hardware::DeviceLandscape &_landscape)> deviceLandscapeCallback
Typedef to support callback for landscape (connected devices) data.
Definition: HermesCallbackTypes.hpp:120
HermesSDK::CareTaker::Connect
void Connect(const Hermes::Protocol::ServiceRoute &_coordinatorRoute)
Definition: CareTaker.cpp:292
HermesSDK::filterSetupCallback
std::function< void(Hermes::Protocol::Pipeline &_pipeline)> filterSetupCallback
Typedef to support callback for filter pipeline data.
Definition: HermesCallbackTypes.hpp:126
Hermes::Protocol::Polygon::Skeleton
Definition: Skeleton.proto:82
Hermes::Protocol::Polygon::Retargeting::SettingsArgs
Definition: RetargetParameters.proto:47
Hermes::Protocol::TrackerData
Definition: Tracker.proto:27
HermesSDK::CareTaker::CareTaker
CareTaker(const std::string &clientName, const std::string &clientInfo, filterSetupCallback &_onFilterSetup, deviceDataCallback &_onDeviceData, deviceLandscapeCallback &_onDeviceLandscape, polygonDataCallback &_onPolygonData, trackingDataCallback &_onTrackingData, errorMessageCallback &onError, connectedToCoreCallback &_onConnectedToCore, disconnectedFromCoreCallback &_onDisconnectedFromCore)
Definition: CareTaker.cpp:70