[Bf-blender-cvs] [22570c0ab4] HMD_viewport: - Updated OpenHMD with fixes from their master (commit 2379647)

Joey Ferwerda noreply at git.blender.org
Thu Feb 23 20:06:09 CET 2017


Commit: 22570c0ab4e81adb1a68c35a2b31a3a5f12541af
Author: Joey Ferwerda
Date:   Thu Feb 23 20:04:56 2017 +0100
Branches: HMD_viewport
https://developer.blender.org/rB22570c0ab4e81adb1a68c35a2b31a3a5f12541af

- Updated OpenHMD with fixes from their master (commit 2379647)

===================================================================

M	extern/openhmd/CMakeLists.txt
M	extern/openhmd/include/openhmd.h
M	extern/openhmd/src/drv_android/android.c
M	extern/openhmd/src/drv_dummy/dummy.c
M	extern/openhmd/src/drv_external/external.c
M	extern/openhmd/src/drv_oculus_rift/packet.c
M	extern/openhmd/src/drv_oculus_rift/rift.c
M	extern/openhmd/src/drv_oculus_rift/rift.h
M	extern/openhmd/src/fusion.c
M	extern/openhmd/src/omath.c
M	extern/openhmd/src/omath.h
M	extern/openhmd/src/openhmd.c
M	extern/openhmd/src/openhmdi.h
M	extern/openhmd/src/platform-posix.c
M	extern/openhmd/src/platform-win32.c
M	extern/openhmd/src/platform.h
A	extern/openhmd/src/queue.c
A	extern/openhmd/src/queue.h

===================================================================

diff --git a/extern/openhmd/CMakeLists.txt b/extern/openhmd/CMakeLists.txt
index 7792c6fcdc..6dfef7a707 100644
--- a/extern/openhmd/CMakeLists.txt
+++ b/extern/openhmd/CMakeLists.txt
@@ -33,6 +33,7 @@ set(SRC
 	src/omath.c
 	src/platform-posix.c
 	src/fusion.c
+	src/queue.c
 )
 
 # TODO: Either remove this or move to main CMakeLists.txt
diff --git a/extern/openhmd/include/openhmd.h b/extern/openhmd/include/openhmd.h
index dafb806411..5468fb55b9 100644
--- a/extern/openhmd/include/openhmd.h
+++ b/extern/openhmd/include/openhmd.h
@@ -44,6 +44,7 @@ typedef enum {
 	OHMD_S_UNKNOWN_ERROR = -1,
 	OHMD_S_INVALID_PARAMETER = -2,
 	OHMD_S_UNSUPPORTED = -3,
+	OHMD_S_INVALID_OPERATION = -4,
 
 	/** OHMD_S_USER_RESERVED and below can be used for user purposes, such as errors within ohmd wrappers, etc. */
 	OHMD_S_USER_RESERVED = -16384,
@@ -125,6 +126,14 @@ typedef enum {
 	/** int[1] (get): Physical vertical resolution of the device screen. */
 	OHMD_SCREEN_VERTICAL_RESOLUTION       =  1,
 
+	/** int[1] (get): Get number of events waiting in digital input event queue. */
+	OHMD_BUTTON_EVENT_COUNT               =  2,
+	/** int[1] (get): Get if the there was an overflow in the event queue causing events to be dropped. */
+	OHMD_BUTTON_EVENT_OVERFLOW            =  3,
+	/** int[1] (get): Get the number of physical digital input buttons on the device. */
+	OHMD_BUTTON_COUNT                     =  4,
+	/** int[2] (get): Performs an event pop action. Format: [button_index, button_state], where button_state is either OHMD_BUTTON_DOWN or OHMD_BUTTON_UP */
+	OHMD_BUTTON_POP_EVENT                 =  5,
 } ohmd_int_value;
 
 /** A collection of data information types used for setting information with ohmd_set_data(). */
@@ -146,6 +155,14 @@ typedef enum {
 	OHMD_IDS_AUTOMATIC_UPDATE = 0,
 } ohmd_int_settings;
 
+/** Button states for digital input events. */
+typedef enum {
+	/** Button was pressed. */
+	OHMD_BUTTON_DOWN = 0,
+	/** Button was released. */
+	OHMD_BUTTON_UP   = 1
+} ohmd_button_state;
+
 /** An opaque pointer to a context structure. */
 typedef struct ohmd_context ohmd_context;
 
diff --git a/extern/openhmd/src/drv_android/android.c b/extern/openhmd/src/drv_android/android.c
index d021a21b89..9ba3e3fb76 100644
--- a/extern/openhmd/src/drv_android/android.c
+++ b/extern/openhmd/src/drv_android/android.c
@@ -191,8 +191,8 @@ static ohmd_device* open_device(ohmd_driver* driver, ohmd_device_desc* desc)
 	priv->base.properties.vsize = 0.093600f;
 	priv->base.properties.hres = 1280;
 	priv->base.properties.vres = 800;
-	priv->base.properties.lens_sep = 0.063500;
-	priv->base.properties.lens_vpos = 0.046800;
+	priv->base.properties.lens_sep = 0.063500f;
+	priv->base.properties.lens_vpos = 0.046800f;
 	priv->base.properties.fov = DEG_TO_RAD(125.5144f);
 	priv->base.properties.ratio = (1280.0f / 800.0f) / 2.0f;
 
diff --git a/extern/openhmd/src/drv_dummy/dummy.c b/extern/openhmd/src/drv_dummy/dummy.c
index 2b5436ef62..9f9adf84d4 100644
--- a/extern/openhmd/src/drv_dummy/dummy.c
+++ b/extern/openhmd/src/drv_dummy/dummy.c
@@ -66,10 +66,11 @@ static ohmd_device* open_device(ohmd_driver* driver, ohmd_device_desc* desc)
 	priv->base.properties.vsize = 0.093600f;
 	priv->base.properties.hres = 1280;
 	priv->base.properties.vres = 800;
-	priv->base.properties.lens_sep = 0.063500;
-	priv->base.properties.lens_vpos = 0.046800;
+	priv->base.properties.lens_sep = 0.063500f;
+	priv->base.properties.lens_vpos = 0.046800f;
 	priv->base.properties.fov = DEG_TO_RAD(125.5144f);
 	priv->base.properties.ratio = (1280.0f / 800.0f) / 2.0f;
+	priv->base.properties.digital_button_count = 4;
 
 	// calculate projection eye projection matrices from the device properties
 	ohmd_calc_default_proj_matrices(&priv->base.properties);
diff --git a/extern/openhmd/src/drv_external/external.c b/extern/openhmd/src/drv_external/external.c
index a675e333c3..7e4340567e 100644
--- a/extern/openhmd/src/drv_external/external.c
+++ b/extern/openhmd/src/drv_external/external.c
@@ -84,8 +84,8 @@ static ohmd_device* open_device(ohmd_driver* driver, ohmd_device_desc* desc)
 	priv->base.properties.vsize = 0.093600f;
 	priv->base.properties.hres = 1280;
 	priv->base.properties.vres = 800;
-	priv->base.properties.lens_sep = 0.063500;
-	priv->base.properties.lens_vpos = 0.046800;
+	priv->base.properties.lens_sep = 0.063500f;
+	priv->base.properties.lens_vpos = 0.046800f;
 	priv->base.properties.fov = DEG_TO_RAD(125.5144f);
 	priv->base.properties.ratio = (1280.0f / 800.0f) / 2.0f;
 
@@ -130,9 +130,8 @@ ohmd_driver* ohmd_create_external_drv(ohmd_context* ctx)
 
 	drv->get_device_list = get_device_list;
 	drv->open_device = open_device;
-	drv->get_device_list = get_device_list;
-	drv->open_device = open_device;
 	drv->destroy = destroy_driver;
+	drv->ctx = ctx;
 
 	return drv;
 }
diff --git a/extern/openhmd/src/drv_oculus_rift/packet.c b/extern/openhmd/src/drv_oculus_rift/packet.c
index 1bf4743aac..0e7c56fef1 100644
--- a/extern/openhmd/src/drv_oculus_rift/packet.c
+++ b/extern/openhmd/src/drv_oculus_rift/packet.c
@@ -107,11 +107,12 @@ bool decode_tracker_sensor_msg(pkt_tracker_sensor* msg, const unsigned char* buf
 	SKIP_CMD;
 	msg->num_samples = READ8;
 	msg->timestamp = READ16;
+	msg->timestamp *= 1000; // DK1 timestamps are in milliseconds
 	msg->last_command_id = READ16;
 	msg->temperature = READ16;
 
-	int actual = OHMD_MIN(msg->num_samples, 3);
-	for(int i = 0; i < actual; i++){
+	msg->num_samples = OHMD_MIN(msg->num_samples, 3);
+	for(int i = 0; i < msg->num_samples; i++){
 		decode_sample(buffer, msg->samples[i].accel);
 		buffer += 8;
 
@@ -120,7 +121,7 @@ bool decode_tracker_sensor_msg(pkt_tracker_sensor* msg, const unsigned char* buf
 	}
 
 	// Skip empty samples
-	buffer += (3 - actual) * 16;
+	buffer += (3 - msg->num_samples) * 16;
 	for(int i = 0; i < 3; i++){
 		msg->mag[i] = READ16;
 	}
@@ -138,12 +139,16 @@ bool decode_tracker_sensor_msg_dk2(pkt_tracker_sensor* msg, const unsigned char*
 	SKIP_CMD;
 	msg->last_command_id = READ16;
 	msg->num_samples = READ8;
+	/* Next is the number of samples since start, excluding the samples
+	contained in this packet */
 	buffer += 2; // unused: nb_samples_since_start
 	msg->temperature = READ16;
 	msg->timestamp = READ32;
 
-	int actual = OHMD_MIN(msg->num_samples, 2);
-	for(int i = 0; i < actual; i++){
+	/* Second sample value is junk (outdated/uninitialized) value if
+	num_samples < 2. */
+	msg->num_samples = OHMD_MIN(msg->num_samples, 2);
+	for(int i = 0; i < msg->num_samples; i++){
 		decode_sample(buffer, msg->samples[i].accel);
 		buffer += 8;
 
@@ -152,7 +157,7 @@ bool decode_tracker_sensor_msg_dk2(pkt_tracker_sensor* msg, const unsigned char*
 	}
 
 	// Skip empty samples
-	buffer += (2 - actual) * 16;
+	buffer += (2 - msg->num_samples) * 16;
 
 	for(int i = 0; i < 3; i++){
 		msg->mag[i] = READ16;
@@ -262,7 +267,7 @@ void dump_packet_tracker_sensor(const pkt_tracker_sensor* sensor)
 	LOGD("  num samples:     %u", sensor->num_samples);
 	LOGD("  magnetic field:  %i %i %i", sensor->mag[0], sensor->mag[1], sensor->mag[2]);
 
-	for(int i = 0; i < OHMD_MIN(sensor->num_samples, 3); i++){
+	for(int i = 0; i < sensor->num_samples; i++){
 		LOGD("    accel: %d %d %d", sensor->samples[i].accel[0], sensor->samples[i].accel[1], sensor->samples[i].accel[2]);
 		LOGD("    gyro:  %d %d %d", sensor->samples[i].gyro[0], sensor->samples[i].gyro[1], sensor->samples[i].gyro[2]);
 	}
diff --git a/extern/openhmd/src/drv_oculus_rift/rift.c b/extern/openhmd/src/drv_oculus_rift/rift.c
index f6399d6fca..ee045f8bea 100644
--- a/extern/openhmd/src/drv_oculus_rift/rift.c
+++ b/extern/openhmd/src/drv_oculus_rift/rift.c
@@ -29,6 +29,7 @@ typedef struct {
 	rift_coordinate_frame coordinate_frame, hw_coordinate_frame;
 	pkt_sensor_config sensor_config;
 	pkt_tracker_sensor sensor;
+	uint32_t last_imu_timestamp;
 	double last_keep_alive;
 	fusion sensor_fusion;
 	vec3f raw_mag, raw_accel, raw_gyro;
@@ -112,22 +113,26 @@ static void handle_tracker_sensor_msg(rift_priv* priv, unsigned char* buffer, in
 
 	dump_packet_tracker_sensor(s);
 
-	// TODO handle missed samples etc.
-
-	float dt = s->num_samples > 3 ? (s->num_samples - 2) * TICK_LEN : TICK_LEN;
-
 	int32_t mag32[] = { s->mag[0], s->mag[1], s->mag[2] };
 	vec3f_from_rift_vec(mag32, &priv->raw_mag);
 
-	for(int i = 0; i < OHMD_MIN(s->num_samples, 3); i++){
+	// TODO: handle overflows in a nicer way
+	float dt = TICK_LEN; // TODO: query the Rift for the sample rate
+	if (s->timestamp > priv->last_imu_timestamp)
+	{
+		dt = (s->timestamp - priv->last_imu_timestamp) / 1000000.0f;
+		dt -= (s->num_samples - 1) * TICK_LEN; // TODO: query the Rift for the sample rate
+	}
+
+	for(int i = 0; i < s->num_samples; i++){
 		vec3f_from_rift_vec(s->samples[i].accel, &priv->raw_accel);
 		vec3f_from_rift_vec(s->samples[i].gyro, &priv->raw_gyro);
 
 		ofusion_update(&priv->sensor_fusion, dt, &priv->raw_gyro, &priv->raw_accel, &priv->raw_mag);
-
-		// reset dt to tick_len for the last samples if there were more than one sample
-		dt = TICK_LEN;
+		dt = TICK_LEN; // TODO: query the Rift for the sample rate
 	}
+
+	priv->last_imu_timestamp = s->timestamp;
 }
 
 static void update_device(ohmd_device* device)
@@ -226,6 +231,8 @@ static ohmd_device* open_device(ohmd_driver* driver, ohmd_device_desc* desc)
 	if(!priv)
 		goto cleanup;
 
+	priv->last_imu_timestamp = -1;
+
 	priv->base.ctx = driver->ctx;
 
 	// Open the HID device
@@ -377,6 +384,8 @@ static void destroy_driver(ohmd_driver* drv)
 	LOGD("shutting down driver");
 	hid_exit();
 	free(drv);
+
+	ohmd_toggle_ovr_service(1); //re-enable OVRService if previously running
 }
 
 ohmd_driver* ohmd_create_oculus_rift_drv(ohmd_context* ctx)
@@ -385,6 +394,8 @@ ohmd_driver* ohmd_create_oculus_rift_drv(ohmd_context* ctx)
 	if(drv == NULL)
 		return NULL;
 
+	ohmd_toggle_ovr_service(0); //disable OVRService if running
+
 	drv->get_device_list = get_device_list;
 	drv->open_device = open_device;
 	drv->destroy = destroy_driver;
diff --git a/extern/openhmd/src/drv_oculus_rift/rift.h b/extern/openhmd/src/drv_oculus_rift/rift.h
index a176a77bb3..8a5474977c 100644
--- a/extern/openhmd/src/drv_oculus_rift/rift.h
+++ b/extern/openhmd/src/drv_oculus_rift/rift.h
@@ -63,7 +63,7 @@ typedef struct {
 
 typedef struct

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list