Skip to content

Commit 714c966

Browse files
committed
Gesture and System component changes.
1 parent 194daa4 commit 714c966

File tree

4 files changed

+81
-87
lines changed

4 files changed

+81
-87
lines changed

inc/osvr/Common/GestureComponent.h

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ namespace common {
7070
/// Required to ensure that allocation and deallocation stay on the same
7171
/// side of a DLL line.
7272
static OSVR_COMMON_EXPORT shared_ptr<GestureComponent>
73-
create(common::SystemComponent *systemComponent);
73+
create(common::SystemComponent &systemComponent);
7474

7575
/// @brief Message from server to client, containing Gesture data.
7676
messages::GestureRecord gestureRecord;
@@ -90,9 +90,12 @@ namespace common {
9090
OSVR_COMMON_EXPORT OSVR_GestureID getGestureID(const char *gestureName);
9191

9292
private:
93-
GestureComponent(common::SystemComponent *systemComponent);
9493

95-
virtual void m_parentSet();
94+
explicit GestureComponent(common::SystemComponent &systemComponent);
95+
96+
void m_parentSet() override;
97+
98+
util::StringID m_getStringID(std::string const& str);
9699

97100
static int VRPN_CALLBACK m_handleGestureRecord(void *userdata,
98101
vrpn_HANDLERPARAM p);
@@ -102,12 +105,11 @@ namespace common {
102105
OSVR_ChannelCount m_numSensor;
103106
std::vector<GestureHandler> m_cb;
104107

105-
// name to ID map used by the server
106-
// RegisteredStringMap m_gestureNameMap;
107-
MapPtr m_gestureNameMap;
108-
109108
/// @brief System device component
110-
common::SystemComponent *m_systemComponent;
109+
common::SystemComponent &m_systemComponent;
110+
111+
/// name to ID map used by the server
112+
GestureDataPtr m_gestureNameMap;
111113
};
112114

113115
} // namespace common

inc/osvr/Common/SystemComponent.h

Lines changed: 19 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -40,15 +40,12 @@
4040
#include <vrpn_BaseClass.h>
4141

4242
// Standard includes
43-
// - none
43+
#include <vector>
44+
#include <string>
4445

4546
namespace osvr {
4647
namespace common {
4748

48-
struct MapData {
49-
SerializedStringMap serializedMap;
50-
};
51-
5249
namespace messages {
5350
class RoutesFromServer : public MessageRegistration<RoutesFromServer> {
5451
public:
@@ -95,8 +92,8 @@ namespace common {
9592
CorrelatedStringMap corrMap;
9693
};
9794

98-
typedef shared_ptr<RegStringMapData> MapPtr;
99-
95+
using GestureMapData = std::vector<std::string>;
96+
using GestureDataPtr = shared_ptr<RegStringMapData>;
10097
typedef shared_ptr<SystemComponent> SystemComponentPtr;
10198

10299
/// @brief BaseDevice component, to be used only with the "OSVR" special
@@ -136,38 +133,37 @@ namespace common {
136133

137134
typedef std::function<void(Json::Value const &,
138135
util::time::TimeValue const &)> JsonHandler;
139-
OSVR_COMMON_EXPORT void registerReplaceTreeHandler(JsonHandler cb);
136+
OSVR_COMMON_EXPORT void
137+
registerReplaceTreeHandler(JsonHandler const &cb);
140138

141139
OSVR_COMMON_EXPORT void sendReplacementTree(PathTree &tree);
142140

143-
/// @brief Request a copy of MapPtr to the name to ID map
144-
OSVR_COMMON_EXPORT MapPtr getRegStringMap();
141+
/// @brief Get shared ownership of the gesture map data structures
142+
OSVR_COMMON_EXPORT GestureDataPtr getGestureMap();
145143

146144
/// @brief Message from server to client, containing registeredStringMap
147-
messages::RegisteredStringMapRecord regStringMap;
145+
messages::RegisteredStringMapRecord gestureStringMap;
148146

149-
OSVR_COMMON_EXPORT void sendRegisteredStringMap();
147+
OSVR_COMMON_EXPORT void sendGestureMap();
150148

151-
typedef std::function<void(MapData const &,
152-
util::time::TimeValue const &)>
153-
RegisteredStringMapHandler;
149+
typedef std::function<void(GestureMapData const &)> GestureMapHandler;
154150
OSVR_COMMON_EXPORT void
155-
registerStringMapHandler(RegisteredStringMapHandler cb);
151+
registerGestureMapHandler(GestureMapHandler const &cb);
156152

157153
private:
158154
SystemComponent();
159155
virtual void m_parentSet();
160156

161-
static int VRPN_CALLBACK
162-
m_handleReplaceTree(void *userdata, vrpn_HANDLERPARAM p);
157+
static int VRPN_CALLBACK m_handleReplaceTree(void *userdata,
158+
vrpn_HANDLERPARAM p);
163159
std::vector<JsonHandler> m_replaceTreeHandlers;
164160

165-
static int VRPN_CALLBACK
166-
m_handleRegStringMap(void *userdata, vrpn_HANDLERPARAM p);
167-
std::vector<RegisteredStringMapHandler> m_cb_map;
161+
static int VRPN_CALLBACK m_handleRegStringMap(void *userdata,
162+
vrpn_HANDLERPARAM p);
163+
std::vector<GestureMapHandler> m_cb_map;
168164

169-
// name to ID map used by the server
170-
MapPtr m_nameToIDMap;
165+
// name to ID map used by the gesture interface class
166+
GestureDataPtr m_nameToIDMap;
171167

172168
/// @brief Common component for system device
173169
common::CommonComponent *m_commonComponent;

src/osvr/Common/GestureComponent.cpp

Lines changed: 30 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#include <osvr/Common/Serialization.h>
3030
#include <osvr/Common/Buffer.h>
3131
#include <osvr/Util/Verbosity.h>
32+
#include <osvr/Util/PredefinedGesturesXMacroC.h>
3233

3334
// Library/third-party includes
3435
// - none
@@ -75,33 +76,37 @@ namespace common {
7576
} // namespace messages
7677

7778
shared_ptr<GestureComponent>
78-
GestureComponent::create(common::SystemComponent *systemComponent) {
79+
GestureComponent::create(common::SystemComponent &systemComponent) {
7980
shared_ptr<GestureComponent> ret(new GestureComponent(systemComponent));
8081
return ret;
8182
}
8283

83-
GestureComponent::GestureComponent(
84-
common::SystemComponent *systemComponent) {
85-
// Add system component and gesture map
86-
m_systemComponent = systemComponent;
87-
m_gestureNameMap = m_systemComponent->getRegStringMap();
84+
GestureComponent::GestureComponent(common::SystemComponent &systemComponent)
85+
: m_systemComponent(systemComponent),
86+
m_gestureNameMap(m_systemComponent.getGestureMap()) {
8887

8988
// populate the gesture map
90-
m_gestureNameMap->map.registerStringID(OSVR_GESTURE_SWIPE_LEFT);
91-
m_gestureNameMap->map.registerStringID(OSVR_GESTURE_SWIPE_RIGHT);
92-
m_gestureNameMap->map.registerStringID(OSVR_GESTURE_SCROLL_UP);
93-
m_gestureNameMap->map.registerStringID(OSVR_GESTURE_SCROLL_DOWN);
94-
m_gestureNameMap->map.registerStringID(OSVR_GESTURE_SINGLE_TAP);
95-
m_gestureNameMap->map.registerStringID(OSVR_GESTURE_DOUBLE_TAP);
96-
m_gestureNameMap->map.registerStringID(OSVR_GESTURE_PINCH);
97-
m_gestureNameMap->map.registerStringID(OSVR_GESTURE_FINGER_SPREAD);
98-
m_gestureNameMap->map.registerStringID(OSVR_GESTURE_CIRCLE);
99-
m_gestureNameMap->map.registerStringID(OSVR_GESTURE_LONG_PRESS);
100-
m_gestureNameMap->map.registerStringID(OSVR_GESTURE_OPEN_HAND);
101-
m_gestureNameMap->map.registerStringID(OSVR_GESTURE_CLOSED_HAND);
89+
#define OSVR_X(GESTURE) m_getStringID(GESTURE);
90+
OSVR_GESTURE_X()
91+
#undef OSVR_X
92+
93+
#if 0
94+
m_getStringID(OSVR_GESTURE_SWIPE_LEFT);
95+
m_getStringID(OSVR_GESTURE_SWIPE_RIGHT);
96+
m_getStringID(OSVR_GESTURE_SCROLL_UP);
97+
m_getStringID(OSVR_GESTURE_SCROLL_DOWN);
98+
m_getStringID(OSVR_GESTURE_SINGLE_TAP);
99+
m_getStringID(OSVR_GESTURE_DOUBLE_TAP);
100+
m_getStringID(OSVR_GESTURE_PINCH);
101+
m_getStringID(OSVR_GESTURE_FINGER_SPREAD);
102+
m_getStringID(OSVR_GESTURE_CIRCLE);
103+
m_getStringID(OSVR_GESTURE_LONG_PRESS);
104+
m_getStringID(OSVR_GESTURE_OPEN_HAND);
105+
m_getStringID(OSVR_GESTURE_CLOSED_HAND);
106+
#endif
102107

103108
// send out an updated map
104-
m_systemComponent->sendRegisteredStringMap();
109+
m_systemComponent.sendGestureMap();
105110
}
106111

107112
void GestureComponent::sendGestureData(OSVR_GestureState gestureState,
@@ -135,6 +140,10 @@ namespace common {
135140
return 0;
136141
}
137142

143+
util::StringID GestureComponent::m_getStringID(std::string const &str) {
144+
return m_gestureNameMap->map.getStringID(str);
145+
}
146+
138147
void GestureComponent::registerGestureHandler(GestureHandler handler) {
139148
if (m_cb.empty()) {
140149
m_registerHandler(&GestureComponent::m_handleGestureRecord, this,
@@ -149,13 +158,11 @@ namespace common {
149158

150159
OSVR_GestureID GestureComponent::getGestureID(const char *gestureName) {
151160

152-
OSVR_GestureID gestureID =
153-
m_gestureNameMap->map.getStringID(gestureName).value();
161+
OSVR_GestureID gestureID = m_getStringID(gestureName).value();
154162

155163
// if we just inserted new gesture ID then send gesture map
156164
if (m_gestureNameMap->map.isModified()) {
157-
m_gestureNameMap->map.clearModifiedFlag();
158-
m_systemComponent->sendRegisteredStringMap();
165+
m_systemComponent.sendGestureMap();
159166
}
160167
return gestureID;
161168
}

src/osvr/Common/SystemComponent.cpp

Lines changed: 22 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -97,22 +97,16 @@ namespace common {
9797

9898
class RegisteredStringMapRecord::MessageSerialization {
9999
public:
100-
MessageSerialization(SerializedStringMap serializedMap)
101-
: m_serializedMap(serializedMap) {}
100+
explicit MessageSerialization(RegisteredStringMap const &myMap)
101+
: m_data(myMap.getEntries()) {}
102102

103-
MessageSerialization() {}
103+
MessageSerialization() = default;
104104

105-
template <typename T> void processMessage(T &p) {
106-
p(m_serializedMap);
107-
}
108-
MapData getData() const {
109-
MapData ret;
110-
ret.serializedMap = m_serializedMap;
111-
return ret;
112-
}
105+
template <typename T> void processMessage(T &p) { p(m_data); }
106+
GestureMapData const &getData() const { return m_data; }
113107

114108
private:
115-
SerializedStringMap m_serializedMap;
109+
GestureMapData m_data;
116110
};
117111
const char *RegisteredStringMapRecord::identifier() {
118112
return "com.osvr.system.regstringmaprecord";
@@ -128,7 +122,8 @@ namespace common {
128122
return ret;
129123
}
130124

131-
SystemComponent::SystemComponent() : m_nameToIDMap(new RegStringMapData) {}
125+
SystemComponent::SystemComponent()
126+
: m_nameToIDMap(make_shared<RegStringMapData>()) {}
132127

133128
void SystemComponent::sendRoutes(std::string const &routes) {
134129
Buffer<> buf;
@@ -164,35 +159,32 @@ namespace common {
164159
m_getParent().sendPending(); // forcing this since it will cause
165160
// shuffling of remotes on the client.
166161
}
167-
void SystemComponent::registerReplaceTreeHandler(JsonHandler cb) {
162+
void SystemComponent::registerReplaceTreeHandler(JsonHandler const &cb) {
168163
if (m_replaceTreeHandlers.empty()) {
169164
m_registerHandler(&SystemComponent::m_handleReplaceTree, this,
170165
treeOut.getMessageType());
171166
}
172167
m_replaceTreeHandlers.push_back(cb);
173168
}
174169

175-
MapPtr SystemComponent::getRegStringMap() { return m_nameToIDMap; }
176-
177-
void SystemComponent::sendRegisteredStringMap() {
170+
GestureDataPtr SystemComponent::getGestureMap() { return m_nameToIDMap; }
178171

172+
void SystemComponent::sendGestureMap() {
173+
m_nameToIDMap->map.clearModifiedFlag();
179174
Buffer<> buf;
180-
// serialize the map before sending it
181-
SerializedStringMap serializedMap = m_nameToIDMap->map.getMap();
182-
183-
messages::RegisteredStringMapRecord::MessageSerialization msg(
184-
serializedMap);
175+
auto msg = messages::RegisteredStringMapRecord::MessageSerialization{
176+
m_nameToIDMap->map};
185177
serialize(buf, msg);
186-
m_getParent().packMessage(buf, regStringMap.getMessageType());
178+
m_getParent().packMessage(buf, gestureStringMap.getMessageType());
187179
}
188180

189-
void SystemComponent::registerStringMapHandler(
190-
RegisteredStringMapHandler handler) {
181+
void
182+
SystemComponent::registerGestureMapHandler(GestureMapHandler const &cb) {
191183
if (m_cb_map.empty()) {
192184
m_registerHandler(&SystemComponent::m_handleRegStringMap, this,
193-
regStringMap.getMessageType());
185+
gestureStringMap.getMessageType());
194186
}
195-
m_cb_map.push_back(handler);
187+
m_cb_map.push_back(cb);
196188
}
197189

198190
void SystemComponent::m_parentSet() {
@@ -201,16 +193,13 @@ namespace common {
201193
// connection(ping) occurs
202194
m_commonComponent =
203195
m_getParent().addComponent(osvr::common::CommonComponent::create());
204-
OSVR_TimeValue now;
205-
osvrTimeValueGetNow(&now);
206-
m_commonComponent->registerPingHandler(
207-
[&] { sendRegisteredStringMap(); });
208196

209197
m_getParent().registerMessageType(routesOut);
210198
m_getParent().registerMessageType(appStartup);
211199
m_getParent().registerMessageType(routeIn);
212200
m_getParent().registerMessageType(treeOut);
213-
m_getParent().registerMessageType(regStringMap);
201+
m_getParent().registerMessageType(gestureStringMap);
202+
m_commonComponent->registerPingHandler([&] { sendGestureMap(); });
214203
}
215204

216205
int SystemComponent::m_handleReplaceTree(void *userdata,
@@ -238,7 +227,7 @@ namespace common {
238227
auto timestamp = util::time::fromStructTimeval(p.msg_time);
239228

240229
for (auto const &cb : self->m_cb_map) {
241-
cb(data, timestamp);
230+
cb(data);
242231
}
243232
return 0;
244233
}

0 commit comments

Comments
 (0)