forked from lubosz/python-openhmd
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Rift.cpp
103 lines (84 loc) · 2.57 KB
/
Rift.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include <time.h>
#include <sys/time.h>
#include <stdio.h>
#include "Rift.h"
Rift::Rift() {
rotation = std::vector<float>(4);
ctx = ohmd_ctx_create();
// Probe for devices
num_devices = ohmd_ctx_probe(ctx);
if(num_devices < 0){
printf("failed to probe devices: %s\n", ohmd_ctx_get_error(ctx));
return;
}
// Open default device (0)
hmd = ohmd_list_open_device(ctx, 0);
if(!hmd){
printf("failed to open device: %s\n", ohmd_ctx_get_error(ctx));
return;
}
}
Rift::~Rift() {
ohmd_ctx_destroy(ctx);
}
void Rift::printDeviceInfo() {
printf("num devices: %d\n\n", num_devices);
// Print device information
for(int i = 0; i < num_devices; i++){
printf("device %d\n", i);
printf(" vendor: %s\n", ohmd_list_gets(ctx, i, OHMD_VENDOR));
printf(" product: %s\n", ohmd_list_gets(ctx, i, OHMD_PRODUCT));
printf(" path: %s\n\n", ohmd_list_gets(ctx, i, OHMD_PATH));
}
// Print hardware information for the opened device
int ivals[2];
ohmd_device_geti(hmd, OHMD_SCREEN_HORIZONTAL_RESOLUTION, ivals);
ohmd_device_geti(hmd, OHMD_SCREEN_VERTICAL_RESOLUTION, ivals + 1);
printf("resolution: %i x %i\n", ivals[0], ivals[1]);
print("hsize:", 1, OHMD_SCREEN_HORIZONTAL_SIZE);
print("vsize:", 1, OHMD_SCREEN_VERTICAL_SIZE);
print("lens separation:", 1, OHMD_LENS_HORIZONTAL_SEPARATION);
print("lens vcenter:", 1, OHMD_LENS_VERTICAL_POSITION);
print("left eye fov:", 1, OHMD_LEFT_EYE_FOV);
print("right eye fov:", 1, OHMD_RIGHT_EYE_FOV);
print("left eye aspect:", 1, OHMD_LEFT_EYE_ASPECT_RATIO);
print("right eye aspect:", 1, OHMD_RIGHT_EYE_ASPECT_RATIO);
print("distortion k:", 6, OHMD_DISTORTION_K);
printf("\n");
}
void Rift::inputLoop() {
// Ask for n rotation quaternions
for(int i = 0; i < 10000; i++){
poll();
printSensors();
}
}
void Rift::printSensors() {
printf("rotation quat:");
for(int i = 0; i < 4; i++)
printf("%f ", rotation[i]);
printf("\n");
}
void Rift::poll() {
float rot[4];
ohmd_ctx_update(ctx);
ohmd_device_getf(hmd, OHMD_ROTATION_QUAT, rot);
for(int i = 0; i < 4; i++)
rotation[i] = rot[i];
sleep(.01);
}
void Rift::sleep(double seconds) {
struct timespec sleepfor;
sleepfor.tv_sec = (time_t)seconds;
sleepfor.tv_nsec = (long)((seconds - sleepfor.tv_sec) * 1000000000.0);
nanosleep(&sleepfor, NULL);
}
// gets float values from the device and prints them
void Rift::print(std::string name, int len, ohmd_float_value val) {
float f[len];
ohmd_device_getf(hmd, val, f);
printf("%-20s", name.c_str());
for(int i = 0; i < len; i++)
printf("%f ", f[i]);
printf("\n");
}