Skip to content

Commit ce80726

Browse files
authored
Display SlimeVR Tracker Battery Life (#41)
1 parent 7097018 commit ce80726

6 files changed

Lines changed: 63 additions & 7 deletions

File tree

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,14 @@ compile_commands.json
1111
CTestTestfile.cmake
1212
_deps
1313
CMakeUserPresets.json
14+
vcpkg_installed/
1415

1516
### CMake Patch ###
1617
# External projects
1718
*-prefix/
1819

1920
### vscode ###
21+
.vs
2022
.vscode/*
2123
!.vscode/settings.json
2224
!.vscode/tasks.json
@@ -26,3 +28,4 @@ CMakeUserPresets.json
2628

2729
# Project-specific
2830
build/*
31+
out/

src/IVRDevice.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ namespace SlimeVRDriver {
6363
virtual void PositionMessage(messages::Position& position) = 0;
6464
virtual void StatusMessage(messages::TrackerStatus& status) = 0;
6565

66+
virtual void BatteryMessage(messages::Battery& battery) = 0;
67+
6668
~IVRDevice() = default;
6769
};
6870
};

src/TrackerDevice.cpp

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,32 @@ void SlimeVRDriver::TrackerDevice::PositionMessage(messages::Position &position)
7979
this->last_pose_ = pose;
8080
}
8181

82+
void SlimeVRDriver::TrackerDevice::BatteryMessage(messages::Battery &battery)
83+
{
84+
if (this->device_index_ == vr::k_unTrackedDeviceIndexInvalid)
85+
return;
86+
87+
// Get the properties handle
88+
auto props = GetDriver()->GetProperties()->TrackedDeviceToPropertyContainer(this->device_index_);
89+
90+
vr::ETrackedPropertyError err;
91+
92+
// Set that the tracker reports battery level in case it has not already been set to true
93+
// It's a given that the tracker supports reporting battery life because otherwise a BatteryMessage would not be received
94+
if (vr::VRProperties()->GetBoolProperty(props, vr::Prop_DeviceProvidesBatteryStatus_Bool, &err) != true) {
95+
vr::VRProperties()->SetBoolProperty(props, vr::Prop_DeviceProvidesBatteryStatus_Bool, true);
96+
}
97+
98+
if (battery.is_charging()) {
99+
vr::VRProperties()->SetBoolProperty(props, vr::Prop_DeviceIsCharging_Bool, true);
100+
} else {
101+
vr::VRProperties()->SetBoolProperty(props, vr::Prop_DeviceIsCharging_Bool, false);
102+
}
103+
104+
// Set the battery Level; 0 = 0%, 1 = 100%
105+
vr::VRProperties()->SetFloatProperty(props, vr::Prop_DeviceBatteryPercentage_Float, battery.battery_level());
106+
}
107+
82108
void SlimeVRDriver::TrackerDevice::StatusMessage(messages::TrackerStatus &status)
83109
{
84110
auto pose = this->last_pose_;
@@ -141,15 +167,15 @@ vr::EVRInitError SlimeVRDriver::TrackerDevice::Activate(uint32_t unObjectId)
141167
GetDriver()->GetProperties()->SetStringProperty(props, vr::Prop_RenderModelName_String, "{htc}/rendermodels/vr_tracker_vive_1_0");
142168

143169
// Set the icon
144-
GetDriver()->GetProperties()->SetStringProperty(props, vr::Prop_NamedIconPathDeviceReady_String, "{slimevr}/icons/tracker_status_ready.b4bfb144.png");
170+
GetDriver()->GetProperties()->SetStringProperty(props, vr::Prop_NamedIconPathDeviceReady_String, "{slimevr}/icons/tracker_status_ready.png");
145171

146172
GetDriver()->GetProperties()->SetStringProperty(props, vr::Prop_NamedIconPathDeviceOff_String, "{slimevr}/icons/tracker_status_off.png");
147-
GetDriver()->GetProperties()->SetStringProperty(props, vr::Prop_NamedIconPathDeviceSearching_String, "{slimevr}/icons/tracker_status_ready.b4bfb144.png");
148-
GetDriver()->GetProperties()->SetStringProperty(props, vr::Prop_NamedIconPathDeviceSearchingAlert_String, "{slimevr}/icons/tracker_status_ready_alert.b4bfb144.png");
149-
GetDriver()->GetProperties()->SetStringProperty(props, vr::Prop_NamedIconPathDeviceReadyAlert_String, "{slimevr}/icons/tracker_status_ready_alert.b4bfb144.png");
150-
GetDriver()->GetProperties()->SetStringProperty(props, vr::Prop_NamedIconPathDeviceNotReady_String, "{slimevr}/icons/tracker_status_off.png");
151-
GetDriver()->GetProperties()->SetStringProperty(props, vr::Prop_NamedIconPathDeviceStandby_String, "{slimevr}/icons/tracker_status_standby.b4bfb144.png");
152-
GetDriver()->GetProperties()->SetStringProperty(props, vr::Prop_NamedIconPathDeviceAlertLow_String, "{slimevr}/icons/tracker_status_ready_low.b4bfb144.png");
173+
GetDriver()->GetProperties()->SetStringProperty(props, vr::Prop_NamedIconPathDeviceSearching_String, "{slimevr}/icons/tracker_status_ready.png");
174+
GetDriver()->GetProperties()->SetStringProperty(props, vr::Prop_NamedIconPathDeviceSearchingAlert_String, "{slimevr}/icons/tracker_status_ready_alert.png");
175+
GetDriver()->GetProperties()->SetStringProperty(props, vr::Prop_NamedIconPathDeviceReadyAlert_String, "{slimevr}/icons/tracker_status_ready_alert.png");
176+
GetDriver()->GetProperties()->SetStringProperty(props, vr::Prop_NamedIconPathDeviceNotReady_String, "{slimevr}/icons/tracker_status_error.png");
177+
GetDriver()->GetProperties()->SetStringProperty(props, vr::Prop_NamedIconPathDeviceStandby_String, "{slimevr}/icons/tracker_status_standby.png");
178+
GetDriver()->GetProperties()->SetStringProperty(props, vr::Prop_NamedIconPathDeviceAlertLow_String, "{slimevr}/icons/tracker_status_ready_low.png");
153179

154180
// Automatically select vive tracker roles and set hints for games that need it (Beat Saber avatar mod, for example)
155181
auto roleHint = getViveRoleHint(trackerRole);

src/TrackerDevice.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ namespace SlimeVRDriver {
2222
TrackerDevice(std::string serial, int deviceId, TrackerRole trackerRole);
2323
~TrackerDevice() = default;
2424

25+
virtual void BatteryMessage(messages::Battery &battery);
26+
2527
// Inherited via IVRDevice
2628
virtual std::string GetSerial() override;
2729
virtual void Update() override;

src/VRDriver.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,12 @@ void SlimeVRDriver::VRDriver::RunFrame()
8484
if (device != this->devices_by_id.end()) {
8585
device->second->StatusMessage(status);
8686
}
87+
} else if (message->has_battery()) {
88+
messages::Battery bat = message->battery();
89+
auto device = this->devices_by_id.find(bat.tracker_id());
90+
if (device != this->devices_by_id.end()) {
91+
device->second->BatteryMessage(bat);
92+
}
8793
}
8894
}
8995

@@ -167,6 +173,16 @@ void SlimeVRDriver::VRDriver::RunFrame()
167173
hmdPosition->set_qw((float) q.w);
168174

169175
sendBridgeMessage(*message, *this);
176+
177+
vr::ETrackedPropertyError err;
178+
if (vr::VRProperties()->GetBoolProperty(vr::VRProperties()->TrackedDeviceToPropertyContainer(0), vr::Prop_DeviceProvidesBatteryStatus_Bool, &err) == true) {
179+
messages::Battery* hmdBattery = google::protobuf::Arena::CreateMessage<messages::Battery>(&arena);
180+
message->set_allocated_battery(hmdBattery);
181+
hmdBattery->set_tracker_id(0);
182+
hmdBattery->set_battery_level(vr::VRProperties()->GetFloatProperty(vr::VRProperties()->TrackedDeviceToPropertyContainer(0), vr::Prop_DeviceBatteryPercentage_Float, &err) * 100);
183+
hmdBattery->set_is_charging(vr::VRProperties()->GetBoolProperty(vr::VRProperties()->TrackedDeviceToPropertyContainer(0), vr::Prop_DeviceIsCharging_Bool, &err));
184+
sendBridgeMessage(*message, *this);
185+
}
170186
} else {
171187
// If bridge not connected, assume we need to resend hmd tracker add message
172188
sentHmdAddMessage = false;

src/bridge/ProtobufMessages.proto

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,11 +103,18 @@ message TrackerStatus {
103103
optional Confidence confidence = 4;
104104
}
105105

106+
message Battery {
107+
int32 tracker_id = 1;
108+
float battery_level = 2;
109+
bool is_charging = 3;
110+
}
111+
106112
message ProtobufMessage {
107113
oneof message {
108114
Position position = 1;
109115
UserAction user_action = 2;
110116
TrackerAdded tracker_added = 3;
111117
TrackerStatus tracker_status = 4;
118+
Battery battery = 5;
112119
}
113120
}

0 commit comments

Comments
 (0)