@@ -51,19 +51,6 @@ struct DeviceData {
5151 bool sent_add_message { false };
5252};
5353
54- static const std::unordered_map<std::string, TrackerRole> CONTROLLER_TYPE_TO_POSITION{
55- {" vive_tracker_chest" , TrackerRole::CHEST},
56- {" vive_tracker_left_shoulder" , TrackerRole::LEFT_SHOULDER},
57- {" vive_tracker_right_shoulder" , TrackerRole::RIGHT_SHOULDER},
58- {" vive_tracker_left_elbow" , TrackerRole::LEFT_ELBOW},
59- {" vive_tracker_right_elbow" , TrackerRole::RIGHT_ELBOW},
60- {" vive_tracker_waist" , TrackerRole::WAIST},
61- {" vive_tracker_left_knee" , TrackerRole::LEFT_KNEE},
62- {" vive_tracker_right_knee" , TrackerRole::RIGHT_KNEE},
63- {" vive_tracker_left_foot" , TrackerRole::LEFT_FOOT},
64- {" vive_tracker_right_foot" , TrackerRole::RIGHT_FOOT},
65- };
66-
6754TrackerRole SlimeVRDriver::VRDriver::GetRoleForDevice (vr::TrackedDeviceIndex_t index) const {
6855 vr::PropertyContainerHandle_t container = vr::VRProperties ()->TrackedDeviceToPropertyContainer (index);
6956 auto device_class = vr::VRProperties ()->GetInt32Property (container, vr::Prop_DeviceClass_Int32);
@@ -108,7 +95,7 @@ void SlimeVRDriver::VRDriver::RunPoseRequestThread() {
10895 logger_->Log (" Pose request thread started" );
10996 while (!exiting_pose_request_thread_) {
11097 if (!bridge_->IsConnected ()) {
111- // If bridge not connected, assume we need to resend hmd tracker add message
98+ // If bridge not connected, assume we need to resend device add messages
11299 for (auto &device : devices) {
113100 device.sent_add_message = false ;
114101 device.status = messages::TrackerStatus_Status_DISCONNECTED;
@@ -119,7 +106,6 @@ void SlimeVRDriver::VRDriver::RunPoseRequestThread() {
119106
120107 vr::PropertyContainerHandle_t hmd_prop_container = vr::VRProperties ()->TrackedDeviceToPropertyContainer (vr::k_unTrackedDeviceIndex_Hmd);
121108 vr::TrackedDevicePose_t poses[vr::k_unMaxTrackedDeviceCount]{};
122- vr::TrackedDevicePose_t &hmd_pose = poses[vr::k_unTrackedDeviceIndex_Hmd];
123109 vr::VRServerDriverHost ()->GetRawTrackedDevicePoses (0 .0f , poses, std::size (poses));
124110
125111 vr::ETrackedPropertyError universe_error;
@@ -160,12 +146,14 @@ void SlimeVRDriver::VRDriver::RunPoseRequestThread() {
160146 vr::PropertyContainerHandle_t prop_container = vr::VRProperties ()->TrackedDeviceToPropertyContainer (index);
161147 messages::ProtobufMessage* message = google::protobuf::Arena::CreateMessage<messages::ProtobufMessage>(&arena_);
162148
149+ // Don't feed data about our own trackers, or Standable's fake ones.
163150 {
164151 vr::ETrackedPropertyError error{};
165152 auto driver_name = vr::VRProperties ()->GetStringProperty (prop_container, vr::Prop_TrackingSystemName_String, &error);
166153 if (error != vr::TrackedProp_Success) {
167154 if (error != vr::TrackedProp_InvalidDevice && error != vr::TrackedProp_UnknownProperty)
168155 logger_->Log (" Failed to get Prop_TrackingSystemName_String for device {}: {}" , index, vr::VRPropertiesRaw ()->GetPropErrorNameFromEnum (error));
156+
169157 continue ;
170158 }
171159 if (driver_name == " slimevr" || driver_name == " standable" ) continue ;
@@ -185,18 +173,22 @@ void SlimeVRDriver::VRDriver::RunPoseRequestThread() {
185173 if (error != vr::ETrackedPropertyError::TrackedProp_Success) {
186174 logger_->Log (" Failed to get device {}'s Prop_SerialNumber_String: {}" , index, vr::VRPropertiesRaw ()->GetPropErrorNameFromEnum (error));
187175 }
176+ if (serial.empty ())
177+ serial = std::format (" Device {}" , index);
188178
189179 auto name = vr::VRProperties ()->GetStringProperty (prop_container, vr::Prop_ModelNumber_String, &error);
190180 if (error != vr::ETrackedPropertyError::TrackedProp_Success) {
191181 logger_->Log (" Failed to get device {}'s Prop_ModelNumber_String: {}" , index, vr::VRPropertiesRaw ()->GetPropErrorNameFromEnum (error));
192182 }
183+ if (name.empty ())
184+ name = std::format (" Device {}" , index);
193185
194186 auto manufacturer = vr::VRProperties ()->GetStringProperty (prop_container, vr::Prop_ManufacturerName_String, &error);
195187 if (error != vr::ETrackedPropertyError::TrackedProp_Success) {
196188 logger_->Log (" Failed to get device {}'s Prop_ManufacturerName_String: {}" , index, vr::VRPropertiesRaw ()->GetPropErrorNameFromEnum (error));
197189 }
198-
199- logger_-> Log ( " Props for device {}: serial={}, model={}, manufacturer={} " , index, serial, name, manufacturer) ;
190+ if (manufacturer. empty ())
191+ name = " OpenVR " ;
200192
201193 TrackerRole role = GetRoleForDevice (index);
202194
@@ -205,9 +197,9 @@ void SlimeVRDriver::VRDriver::RunPoseRequestThread() {
205197 message->set_allocated_tracker_added (tracker_added);
206198 tracker_added->set_tracker_id (index);
207199 tracker_added->set_tracker_role (role);
208- tracker_added->set_tracker_serial (serial. empty () ? std::format ( " Device {} " , index) : serial );
209- tracker_added->set_tracker_name (name. empty () ? std::format ( " Device {} " , index) : name );
210- tracker_added->set_manufacturer (manufacturer. empty () ? " OpenVR " : manufacturer );
200+ tracker_added->set_tracker_serial (serial);
201+ tracker_added->set_tracker_name (name);
202+ tracker_added->set_manufacturer (manufacturer);
211203 bridge_->SendBridgeMessage (*message);
212204
213205 device.sent_add_message = true ;
@@ -276,13 +268,12 @@ void SlimeVRDriver::VRDriver::RunPoseRequestThread() {
276268
277269 auto now = std::chrono::steady_clock::now ();
278270 if (std::chrono::duration_cast<std::chrono::milliseconds>(now - battery_sent_at_).count () > 100 ) {
279- vr::ETrackedPropertyError err;
280- if (vr::VRProperties ()->GetBoolProperty (prop_container, vr::Prop_DeviceProvidesBatteryStatus_Bool, &err)) {
281- messages::Battery* hmdBattery = google::protobuf::Arena::CreateMessage<messages::Battery>(&arena_);
282- message->set_allocated_battery (hmdBattery);
283- hmdBattery->set_tracker_id (index);
284- hmdBattery->set_battery_level (vr::VRProperties ()->GetFloatProperty (prop_container, vr::Prop_DeviceBatteryPercentage_Float, &err) * 100 );
285- hmdBattery->set_is_charging (vr::VRProperties ()->GetBoolProperty (prop_container, vr::Prop_DeviceIsCharging_Bool, &err));
271+ if (vr::VRProperties ()->GetBoolProperty (prop_container, vr::Prop_DeviceProvidesBatteryStatus_Bool)) {
272+ messages::Battery* battery = google::protobuf::Arena::CreateMessage<messages::Battery>(&arena_);
273+ message->set_allocated_battery (battery);
274+ battery->set_tracker_id (index);
275+ battery->set_battery_level (vr::VRProperties ()->GetFloatProperty (prop_container, vr::Prop_DeviceBatteryPercentage_Float) * 100 .f );
276+ battery->set_is_charging (vr::VRProperties ()->GetBoolProperty (prop_container, vr::Prop_DeviceIsCharging_Bool));
286277 bridge_->SendBridgeMessage (*message);
287278 }
288279 battery_sent_at_ = now;
0 commit comments