summaryrefslogtreecommitdiffhomepage
path: root/tracker-trackhat/camera.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tracker-trackhat/camera.cpp')
-rw-r--r--tracker-trackhat/camera.cpp126
1 files changed, 126 insertions, 0 deletions
diff --git a/tracker-trackhat/camera.cpp b/tracker-trackhat/camera.cpp
new file mode 100644
index 00000000..dd1f3d3a
--- /dev/null
+++ b/tracker-trackhat/camera.cpp
@@ -0,0 +1,126 @@
+#include "trackhat.hpp"
+#include "compat/sleep.hpp"
+#include <cstdio>
+
+namespace trackhat_impl {
+
+TH_ErrorCode log_error(TH_ErrorCode error, const char* source,
+ const char* file, int line, const char* function)
+{
+ if (error == TH_ERROR_DEVICE_ALREADY_OPEN)
+ error = TH_SUCCESS;
+ if (error)
+ {
+ auto logger = QMessageLogger(file, line, function).warning();
+ logger << "tracker/trackhat: error" << (void*)-error << "in" << source;
+ }
+ return error;
+}
+
+} // ns trackhat_impl
+
+pt_camera::result trackhat_camera::get_info() const
+{
+ return {true, get_desired() };
+}
+
+pt_camera_info trackhat_camera::get_desired() const
+{
+ pt_camera_info ret = {};
+
+ ret.fov = sensor_fov;
+ ret.fps = 250;
+ ret.res_x = sensor_size;
+ ret.res_y = sensor_size;
+
+ return ret;
+}
+
+QString trackhat_camera::get_desired_name() const
+{
+ return QStringLiteral("TrackHat sensor");
+}
+
+QString trackhat_camera::get_active_name() const
+{
+ return get_desired_name();
+}
+
+void trackhat_camera::set_fov(pt_camera::f) {}
+void trackhat_camera::show_camera_settings() {}
+
+trackhat_camera::trackhat_camera()
+{
+ s.set_raii_dtor_state(false);
+ t.set_raii_dtor_state(false);
+
+ for (auto* slider : { &t.exposure, /*&t.threshold,*/ })
+ {
+ QObject::connect(slider, options::value_::value_changed<options::slider_value>(),
+ &sig, &trackhat_impl::setting_receiver::settings_changed,
+ Qt::DirectConnection);
+ }
+}
+
+trackhat_camera::~trackhat_camera()
+{
+ stop();
+}
+
+pt_camera::result trackhat_camera::get_frame(pt_frame& frame_)
+{
+ if (!device.ensure_connected())
+ goto error;
+
+ if (sig.test_and_clear() && !init_regs())
+ goto error;
+
+ set_pt_options();
+
+ {
+ trackHat_ExtendedPoints_t points;
+ if (!!th_check(trackHat_GetDetectedPointsExtended(&*device, &points)))
+ goto error;
+ auto& frame = *frame_.as<trackhat_frame>();
+ frame.init_points(points, t.min_pt_size, t.max_pt_size);
+ }
+
+ return {true, get_desired()};
+
+error:
+ stop();
+ return {false, {}};
+}
+
+static void log_handler(const char* file, int line, const char* function, char level, const char* str, size_t len)
+{
+ if (level != 'E')
+ return;
+ char file_[128];
+ snprintf(file_, std::size(file_), "trackhat/%s", file);
+ auto logger = QMessageLogger(file_, line, function).debug();
+ logger << "tracker/trackhat:";
+ logger.noquote() << QLatin1String(str, (int)len);
+}
+
+bool trackhat_camera::start(const pt_settings&)
+{
+ trackHat_SetDebugHandler(log_handler);
+
+ if constexpr(debug_mode)
+ trackHat_EnableDebugMode();
+ else
+ trackHat_DisableDebugMode();
+
+ if (!device.ensure_device_exists())
+ return false;
+
+ set_pt_options();
+
+ return true;
+}
+
+void trackhat_camera::stop()
+{
+ device.disconnect();
+}