From ec8034fbb0bf0f8f73871e40b70a4e0d577e4a9a Mon Sep 17 00:00:00 2001
From: Ryan Pavlik <ryan.pavlik@collabora.com>
Date: Mon, 24 Jun 2019 18:34:53 -0500
Subject: [PATCH] d/mt: Also refactor the filter objects the same way.

---
 .../drivers/montrack/filters/common/filter.c  |  31 ++---
 .../drivers/montrack/filters/common/filter.h  |  83 ++++++++++----
 .../montrack/filters/filter_opencv_kalman.cpp | 108 +++++++++---------
 .../montrack/filters/filter_opencv_kalman.h   |  27 +----
 src/xrt/drivers/montrack/mt_device.c          |  12 +-
 src/xrt/drivers/montrack/mt_device.h          |   2 +-
 6 files changed, 133 insertions(+), 130 deletions(-)

diff --git a/src/xrt/drivers/montrack/filters/common/filter.c b/src/xrt/drivers/montrack/filters/common/filter.c
index 003dc92bc..e9b1c03d2 100644
--- a/src/xrt/drivers/montrack/filters/common/filter.c
+++ b/src/xrt/drivers/montrack/filters/common/filter.c
@@ -4,32 +4,14 @@
 
 #include "util/u_misc.h"
 
-filter_instance_t*
+struct filter_instance*
 filter_create(filter_type_t t)
 {
-	filter_instance_t* i = U_TYPED_CALLOC(filter_instance_t);
-	if (i) {
-		switch (t) {
-		case FILTER_TYPE_OPENCV_KALMAN:
-			i->tracker_type = t;
-			i->filter_configure = filter_opencv_kalman_configure;
-			i->filter_get_state = filter_opencv_kalman_get_state;
-			i->filter_predict_state =
-			    filter_opencv_kalman_predict_state;
-			i->filter_set_state = filter_opencv_kalman_set_state;
-			i->filter_queue = filter_opencv_kalman_queue;
-			i->internal_instance = (filter_internal_instance_ptr)
-			    filter_opencv_kalman_create(i);
-			break;
-		case FILTER_TYPE_NONE:
-		default:
-			free(i);
-			return NULL;
-			break;
-		}
-		return i;
+	switch (t) {
+	case FILTER_TYPE_OPENCV_KALMAN: return filter_opencv_kalman_create();
+	case FILTER_TYPE_NONE:
+	default: return NULL;
 	}
-	return NULL;
 }
 
 bool
@@ -37,7 +19,8 @@ filters_test()
 {
 
 	// create a filter
-	filter_instance_t* filter = filter_create(FILTER_TYPE_OPENCV_KALMAN);
+	struct filter_instance* filter =
+	    filter_create(FILTER_TYPE_OPENCV_KALMAN);
 	if (!filter) {
 		return false;
 	}
diff --git a/src/xrt/drivers/montrack/filters/common/filter.h b/src/xrt/drivers/montrack/filters/common/filter.h
index 34ae5e6ee..6e7c108d4 100644
--- a/src/xrt/drivers/montrack/filters/common/filter.h
+++ b/src/xrt/drivers/montrack/filters/common/filter.h
@@ -1,15 +1,14 @@
 #ifndef FILTER_H
 #define FILTER_H
+
 #include <xrt/xrt_defines.h>
-#include <../auxiliary/util/u_time.h>
-#include <../optical_tracking/common/tracker.h>
+#include "util/u_time.h"
 
-typedef void* filter_instance_ptr;
-typedef void* filter_internal_instance_ptr;
 typedef void* filter_configuration_ptr;
-typedef void* filter_state_ptr;
 
-typedef struct filter_state
+struct filter_instance;
+
+struct filter_state
 {
 	struct xrt_pose pose;
 	bool has_position;
@@ -19,7 +18,7 @@ typedef struct filter_state
 	struct xrt_quat angular_velocity;
 	struct xrt_quat angular_accel;
 	timepoint_ns timestamp;
-} filter_state_t;
+};
 
 
 typedef enum filter_type
@@ -28,28 +27,62 @@ typedef enum filter_type
 	FILTER_TYPE_OPENCV_KALMAN
 } filter_type_t;
 
-typedef struct _filter_instance
+typedef struct tracker_measurement tracker_measurement_t;
+
+struct filter_instance
 {
 	filter_type_t tracker_type;
-	bool (*filter_queue)(filter_instance_ptr inst,
-	                     tracker_measurement_t* measurement);
-	bool (*filter_set_state)(filter_instance_ptr inst,
-	                         filter_state_ptr state);
-	bool (*filter_get_state)(filter_instance_ptr inst,
-	                         filter_state_ptr state);
-	bool (*filter_predict_state)(filter_instance_ptr inst,
-	                             filter_state_t* state,
-	                             timepoint_ns time);
-	bool (*filter_configure)(filter_instance_ptr inst,
-	                         filter_configuration_ptr config);
-	filter_internal_instance_ptr internal_instance;
-} filter_instance_t;
-
-filter_instance_t*
+	bool (*queue)(struct filter_instance* inst,
+	              tracker_measurement_t* measurement);
+	bool (*set_state)(struct filter_instance* inst,
+	                  struct filter_state* state);
+	bool (*get_state)(struct filter_instance* inst,
+	                  struct filter_state* state);
+	bool (*predict_state)(struct filter_instance* inst,
+	                      struct filter_state* state,
+	                      timepoint_ns time);
+	bool (*configure)(struct filter_instance* inst,
+	                  filter_configuration_ptr config);
+	void (*destroy)(struct filter_instance* inst);
+};
+
+struct filter_instance*
 filter_create(filter_type_t t);
-bool
-filter_destroy(filter_instance_t* inst);
+
 bool
 filters_test();
 
+static inline void
+filter_destroy(struct filter_instance* inst)
+{
+	inst->destroy(inst);
+}
+
+static inline bool
+filter_queue(struct filter_instance* inst, tracker_measurement_t* measurement)
+{
+	return inst->queue(inst, measurement);
+}
+static inline bool
+filter_set_state(struct filter_instance* inst, struct filter_state* state)
+{
+	return inst->set_state(inst, state);
+}
+static inline bool
+filter_get_state(struct filter_instance* inst, struct filter_state* state)
+{
+	return inst->get_state(inst, state);
+}
+static inline bool
+filter_predict_state(struct filter_instance* inst,
+                     struct filter_state* state,
+                     timepoint_ns time)
+{
+	return inst->predict_state(inst, state, time);
+}
+static inline bool
+filter_configure(struct filter_instance* inst, filter_configuration_ptr config)
+{
+	return inst->configure(inst, config);
+}
 #endif // FILTER_H
diff --git a/src/xrt/drivers/montrack/filters/filter_opencv_kalman.cpp b/src/xrt/drivers/montrack/filters/filter_opencv_kalman.cpp
index 4e4e3f669..d535096f9 100644
--- a/src/xrt/drivers/montrack/filters/filter_opencv_kalman.cpp
+++ b/src/xrt/drivers/montrack/filters/filter_opencv_kalman.cpp
@@ -1,12 +1,14 @@
 
 #include <opencv2/opencv.hpp>
 
+#include "../optical_tracking/common/tracker.h"
 #include "filter_opencv_kalman.h"
 
 #include "util/u_misc.h"
 
-struct filter_opencv_kalman_instance_t
+struct filter_opencv_kalman
 {
+	struct filter_instance base;
 	bool configured;
 	opencv_filter_configuration_t configuration;
 	cv::KalmanFilter kalman_filter;
@@ -20,25 +22,23 @@ struct filter_opencv_kalman_instance_t
  * Casts the internal instance pointer from the generic opaque type to our
  * opencv_kalman internal type.
  */
-static inline filter_opencv_kalman_instance_t*
-filter_opencv_kalman_instance(filter_internal_instance_ptr ptr)
+static inline struct filter_opencv_kalman*
+filter_opencv_kalman(struct filter_instance* ptr)
 {
-	return (filter_opencv_kalman_instance_t*)ptr;
+	return (struct filter_opencv_kalman*)ptr;
 }
 
-bool
-filter_opencv_kalman__destroy(filter_instance_t* inst)
+static void
+filter_opencv_kalman_destroy(struct filter_instance* inst)
 {
-	// do nothing
-	return false;
+	free(inst);
 }
 
-bool
-filter_opencv_kalman_queue(filter_instance_t* inst,
+static bool
+filter_opencv_kalman_queue(struct filter_instance* inst,
                            tracker_measurement_t* measurement)
 {
-	filter_opencv_kalman_instance_t* internal =
-	    filter_opencv_kalman_instance(inst->internal_instance);
+	struct filter_opencv_kalman* internal = filter_opencv_kalman(inst);
 	printf("queueing measurement in filter\n");
 	internal->observation.at<float>(0, 0) = measurement->pose.position.x;
 	internal->observation.at<float>(1, 0) = measurement->pose.position.y;
@@ -48,22 +48,23 @@ filter_opencv_kalman_queue(filter_instance_t* inst,
 	return false;
 }
 bool
-filter_opencv_kalman_get_state(filter_instance_t* inst, filter_state_t* state)
+filter_opencv_kalman_get_state(struct filter_instance* inst,
+                               struct filter_state* state)
 {
 	return false;
 }
 bool
-filter_opencv_kalman_set_state(filter_instance_t* inst, filter_state_t* state)
+filter_opencv_kalman_set_state(struct filter_instance* inst,
+                               struct filter_state* state)
 {
 	return false;
 }
 bool
-filter_opencv_kalman_predict_state(filter_instance_t* inst,
-                                   filter_state_t* state,
+filter_opencv_kalman_predict_state(struct filter_instance* inst,
+                                   struct filter_state* state,
                                    timepoint_ns time)
 {
-	filter_opencv_kalman_instance_t* internal =
-	    filter_opencv_kalman_instance(inst->internal_instance);
+	struct filter_opencv_kalman* internal = filter_opencv_kalman(inst);
 	// printf("getting filtered pose\n");
 	if (!internal->running) {
 		return false;
@@ -76,11 +77,10 @@ filter_opencv_kalman_predict_state(filter_instance_t* inst,
 	return true;
 }
 bool
-filter_opencv_kalman_configure(filter_instance_t* inst,
+filter_opencv_kalman_configure(struct filter_instance* inst,
                                filter_configuration_ptr config_generic)
 {
-	filter_opencv_kalman_instance_t* internal =
-	    filter_opencv_kalman_instance(inst->internal_instance);
+	struct filter_opencv_kalman* internal = filter_opencv_kalman(inst);
 	opencv_filter_configuration_t* config =
 	    (opencv_filter_configuration_t*)config_generic;
 	internal->configuration = *config;
@@ -96,40 +96,44 @@ filter_opencv_kalman_configure(filter_instance_t* inst,
 
 
 
-filter_opencv_kalman_instance_t*
-filter_opencv_kalman_create(filter_instance_t* inst)
+struct filter_opencv_kalman*
+filter_opencv_kalman_create()
 {
-	filter_opencv_kalman_instance_t* i =
-	    U_TYPED_CALLOC(filter_opencv_kalman_instance_t);
-	if (i) {
-		float dt = 1.0;
-		i->kalman_filter.init(6, 3);
-		i->observation = cv::Mat(3, 1, CV_32F);
-		i->prediction = cv::Mat(6, 1, CV_32F);
-		i->kalman_filter.transitionMatrix =
-		    (cv::Mat_<float>(6, 6) << 1.0, 0.0, 0.0, dt, 0.0, 0.0, 0.0,
-		     1.0, 0.0, 0.0, dt, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, dt, 0.0,
-		     0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0,
-		     0.0, 0.0, 0.0, 0.0, 1.0);
+	struct filter_opencv_kalman* i =
+	    U_TYPED_CALLOC(struct filter_opencv_kalman);
+	if (!i) {
+		return NULL;
+	}
+	i->base.queue = filter_opencv_kalman_queue;
+	i->base.set_state = filter_opencv_kalman_set_state;
+	i->base.get_state = filter_opencv_kalman_get_state;
+	i->base.predict_state = filter_opencv_kalman_predict_state;
+	i->base.configure = filter_opencv_kalman_configure;
+	i->base.destroy = filter_opencv_kalman_destroy;
+	float dt = 1.0;
+	i->kalman_filter.init(6, 3);
+	i->observation = cv::Mat(3, 1, CV_32F);
+	i->prediction = cv::Mat(6, 1, CV_32F);
+	i->kalman_filter.transitionMatrix =
+	    (cv::Mat_<float>(6, 6) << 1.0, 0.0, 0.0, dt, 0.0, 0.0, 0.0, 1.0,
+	     0.0, 0.0, dt, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, dt, 0.0, 0.0, 0.0, 1.0,
+	     0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
+	     1.0);
 
-		cv::setIdentity(i->kalman_filter.measurementMatrix,
-		                cv::Scalar::all(1.0f));
-		cv::setIdentity(i->kalman_filter.errorCovPost,
-		                cv::Scalar::all(0.0f));
+	cv::setIdentity(i->kalman_filter.measurementMatrix,
+	                cv::Scalar::all(1.0f));
+	cv::setIdentity(i->kalman_filter.errorCovPost, cv::Scalar::all(0.0f));
 
-		// our filter parameters set the process and measurement noise
-		// covariances.
+	// our filter parameters set the process and measurement noise
+	// covariances.
 
-		cv::setIdentity(
-		    i->kalman_filter.processNoiseCov,
-		    cv::Scalar::all(i->configuration.process_noise_cov));
-		cv::setIdentity(
-		    i->kalman_filter.measurementNoiseCov,
-		    cv::Scalar::all(i->configuration.measurement_noise_cov));
+	cv::setIdentity(i->kalman_filter.processNoiseCov,
+	                cv::Scalar::all(i->configuration.process_noise_cov));
+	cv::setIdentity(
+	    i->kalman_filter.measurementNoiseCov,
+	    cv::Scalar::all(i->configuration.measurement_noise_cov));
 
-		i->configured = false;
-		i->running = false;
-		return i;
-	}
-	return NULL;
+	i->configured = false;
+	i->running = false;
+	return i;
 }
diff --git a/src/xrt/drivers/montrack/filters/filter_opencv_kalman.h b/src/xrt/drivers/montrack/filters/filter_opencv_kalman.h
index d4fa11c95..71f4fb933 100644
--- a/src/xrt/drivers/montrack/filters/filter_opencv_kalman.h
+++ b/src/xrt/drivers/montrack/filters/filter_opencv_kalman.h
@@ -20,28 +20,11 @@ extern "C" {
 #endif
 
 // forward declare this, as it contains C++ stuff
-typedef struct filter_opencv_kalman_instance_t filter_opencv_kalman_instance_t;
-
-
-filter_opencv_kalman_instance_t*
-filter_opencv_kalman_create(filter_instance_t* inst);
-bool
-filter_opencv_kalman__destroy(filter_instance_t* inst);
-
-bool
-filter_opencv_kalman_queue(filter_instance_t* inst,
-                           tracker_measurement_t* measurement);
-bool
-filter_opencv_kalman_get_state(filter_instance_t* inst, filter_state_t* state);
-bool
-filter_opencv_kalman_set_state(filter_instance_t* inst, filter_state_t* state);
-bool
-filter_opencv_kalman_predict_state(filter_instance_t* inst,
-                                   filter_state_t*,
-                                   timepoint_ns time);
-bool
-filter_opencv_kalman_configure(filter_instance_t* inst,
-                               filter_configuration_ptr config_generic);
+struct filter_opencv_kalman;
+
+
+struct filter_opencv_kalman*
+filter_opencv_kalman_create();
 
 #ifdef __cplusplus
 } // extern "C"
diff --git a/src/xrt/drivers/montrack/mt_device.c b/src/xrt/drivers/montrack/mt_device.c
index 84fcdfc3c..2a7a1b7ca 100644
--- a/src/xrt/drivers/montrack/mt_device.c
+++ b/src/xrt/drivers/montrack/mt_device.c
@@ -67,20 +67,20 @@ mt_device_get_tracked_pose(struct xrt_device* xdev,
 {
 	mt_device_t* md = mt_device(xdev);
 	struct xrt_pose pose;
-	filter_state_t filtered;
+	struct filter_state filtered;
 	switch (md->tracker->tracker_type) {
 	case TRACKER_TYPE_SPHERE_MONO:
 		out_relation->relation_flags = (enum xrt_space_relation_flags)(
 		    XRT_SPACE_RELATION_POSITION_VALID_BIT |
 		    XRT_SPACE_RELATION_POSITION_TRACKED_BIT);
-		md->filter->filter_predict_state(md->filter, &filtered, 0);
+		filter_predict_state(md->filter, &filtered, 0);
 		out_relation->pose = filtered.pose;
 		break;
 	case TRACKER_TYPE_SPHERE_STEREO:
 		out_relation->relation_flags = (enum xrt_space_relation_flags)(
 		    XRT_SPACE_RELATION_POSITION_VALID_BIT |
 		    XRT_SPACE_RELATION_POSITION_TRACKED_BIT);
-		md->filter->filter_predict_state(md->filter, &filtered, 0);
+		filter_predict_state(md->filter, &filtered, 0);
 		out_relation->pose = filtered.pose;
 		break;
 	case TRACKER_TYPE_UVBI:
@@ -599,7 +599,7 @@ mt_create_uvbi_hdk(mt_device_t* md)
 	return true;
 }
 #endif // XRT_HAVE_UVC_FRAMESERVER
-#endif 
+#endif
 
 bool
 mt_create_stereo_ps4(mt_device_t* md)
@@ -698,11 +698,11 @@ mt_create_stereo_ps4(mt_device_t* md)
 	filter_config.process_noise_cov = 0.1f;
 
 	md->filter = filter_create(FILTER_TYPE_OPENCV_KALMAN);
-	md->filter->filter_configure(md->filter, &filter_config);
+	filter_configure(md->filter, &filter_config);
 
 	// connect our tracker to our filter
 	md->tracker->tracker_register_measurement_callback(
-	    md->tracker, md->filter, md->filter->filter_queue);
+	    md->tracker, md->filter, md->filter->queue);
 	md->tracker->tracker_register_event_callback(md->tracker, md,
 	                                             mt_handle_event);
 
diff --git a/src/xrt/drivers/montrack/mt_device.h b/src/xrt/drivers/montrack/mt_device.h
index bafe03ea5..96c9be01e 100644
--- a/src/xrt/drivers/montrack/mt_device.h
+++ b/src/xrt/drivers/montrack/mt_device.h
@@ -31,7 +31,7 @@ typedef struct mt_device
 	// n-source trackers
 	tracker_mono_configuration_t config_mono;
 	tracker_stereo_configuration_t config_stereo;
-	filter_instance_t* filter;
+	struct filter_instance* filter;
 	bool log_verbose;
 	bool log_debug;
 } mt_device_t;
-- 
GitLab