0a25713ceb
Fork temporarily iio-sensor-proxy from Alpine to add support for Qualcomm Snapdragon Sensor Core (SSC) sensors through libssc.
157 lines
4.2 KiB
Diff
157 lines
4.2 KiB
Diff
From 20ab71eb279869eec770c497aed6832b64c7df15 Mon Sep 17 00:00:00 2001
|
|
From: Dylan Van Assche <me@dylanvanassche.be>
|
|
Date: Mon, 24 Apr 2023 18:29:15 +0200
|
|
Subject: [PATCH 5/7] compass: support SSC compass sensor
|
|
|
|
---
|
|
src/drv-ssc-compass.c | 112 +++++++++++++++++++++++++++++++++++++++++
|
|
src/iio-sensor-proxy.c | 1 +
|
|
src/meson.build | 1 +
|
|
3 files changed, 114 insertions(+)
|
|
create mode 100644 src/drv-ssc-compass.c
|
|
|
|
diff --git a/src/drv-ssc-compass.c b/src/drv-ssc-compass.c
|
|
new file mode 100644
|
|
index 0000000..7a367b3
|
|
--- /dev/null
|
|
+++ b/src/drv-ssc-compass.c
|
|
@@ -0,0 +1,112 @@
|
|
+/*
|
|
+ * Copyright (c) 2023 Dylan Van Assche
|
|
+ *
|
|
+ * This program is free software; you can redistribute it and/or modify it
|
|
+ * under the terms of the GNU General Public License version 3 as published by
|
|
+ * the Free Software Foundation.
|
|
+ */
|
|
+
|
|
+#include "drivers.h"
|
|
+
|
|
+#include <fcntl.h>
|
|
+#include <unistd.h>
|
|
+#include <string.h>
|
|
+#include <errno.h>
|
|
+#include <stdio.h>
|
|
+#include <stdlib.h>
|
|
+#include <gio/gio.h>
|
|
+#include <libssc-sensor.h>
|
|
+#include <libssc-sensor-compass.h>
|
|
+
|
|
+#define UDEV_DEVICE_NAME "fastrpc-"
|
|
+
|
|
+typedef struct DrvData {
|
|
+ SSCSensorCompass *sensor;
|
|
+ guint measurement_id;
|
|
+} DrvData;
|
|
+
|
|
+static gboolean
|
|
+ssc_compass_discover (GUdevDevice *device)
|
|
+{
|
|
+ if (!drv_check_udev_sensor_type (device, "ssc-compass", NULL))
|
|
+ return FALSE;
|
|
+
|
|
+ g_debug ("Found SSC compass at %s", g_udev_device_get_sysfs_path (device));
|
|
+ return TRUE;
|
|
+}
|
|
+
|
|
+static void
|
|
+measurement_cb (SSCSensorCompass *sensor, gfloat azimuth, gpointer user_data)
|
|
+{
|
|
+ SensorDevice *sensor_device = user_data;
|
|
+ CompassReadings readings;
|
|
+
|
|
+ readings.heading = azimuth;
|
|
+
|
|
+ sensor_device->callback_func (sensor_device, (gpointer) &readings, sensor_device->user_data);
|
|
+}
|
|
+
|
|
+static SensorDevice *
|
|
+ssc_compass_open (GUdevDevice *device)
|
|
+{
|
|
+ SensorDevice *sensor_device;
|
|
+ DrvData *drv_data;
|
|
+ g_autoptr (GError) error = NULL;
|
|
+
|
|
+ sensor_device = g_new0 (SensorDevice, 1);
|
|
+ sensor_device->priv = g_new0 (DrvData, 1);
|
|
+ drv_data = (DrvData *) sensor_device->priv;
|
|
+
|
|
+ /* Create sensor */
|
|
+ drv_data->sensor = ssc_sensor_compass_new_sync (NULL, &error);
|
|
+ if (!drv_data->sensor) {
|
|
+ g_warning ("Creating SSC compass sensor failed: %s", error ? error->message : "UNKNOWN");
|
|
+ return NULL;
|
|
+ }
|
|
+ g_object_get (drv_data->sensor,
|
|
+ SSC_SENSOR_NAME, &sensor_device->name,
|
|
+ NULL);
|
|
+
|
|
+ /* Start listening for measurements */
|
|
+ drv_data->measurement_id = g_signal_connect (drv_data->sensor,
|
|
+ "measurement",
|
|
+ G_CALLBACK (measurement_cb),
|
|
+ sensor_device);
|
|
+
|
|
+ /* Enable sensor */
|
|
+ if (!ssc_sensor_compass_open_sync (drv_data->sensor, NULL, &error)) {
|
|
+ g_warning ("Opening SSC compass sensor failed: %s", error ? error->message : "UNKNOWN");
|
|
+ g_object_unref (sensor_device);
|
|
+ return NULL;
|
|
+ }
|
|
+
|
|
+ return sensor_device;
|
|
+}
|
|
+
|
|
+static void
|
|
+ssc_compass_close (SensorDevice *sensor_device)
|
|
+{
|
|
+ g_autoptr (GError) error = NULL;
|
|
+ DrvData *drv_data = (DrvData *) sensor_device->priv;
|
|
+
|
|
+ /* Stop listening for measurements */
|
|
+ g_warn_if_fail (drv_data->measurement_id > 0);
|
|
+ g_signal_handler_disconnect (drv_data->sensor, drv_data->measurement_id);
|
|
+
|
|
+ /* Disable sensor */
|
|
+ if (!ssc_sensor_compass_close_sync (drv_data->sensor, NULL, &error))
|
|
+ g_warning ("Closing SSC compass sensor failed: %s", error ? error->message : "UNKNOWN");
|
|
+
|
|
+ g_clear_object (&drv_data->sensor);
|
|
+ g_clear_pointer (&sensor_device->priv, g_free);
|
|
+ g_free (sensor_device);
|
|
+}
|
|
+
|
|
+SensorDriver ssc_compass = {
|
|
+ .driver_name = "SSC compass sensor",
|
|
+ .type = DRIVER_TYPE_COMPASS,
|
|
+
|
|
+ .discover = ssc_compass_discover,
|
|
+ .open = ssc_compass_open,
|
|
+ .close = ssc_compass_close,
|
|
+};
|
|
diff --git a/src/iio-sensor-proxy.c b/src/iio-sensor-proxy.c
|
|
index 644e835..5414677 100644
|
|
--- a/src/iio-sensor-proxy.c
|
|
+++ b/src/iio-sensor-proxy.c
|
|
@@ -77,6 +77,7 @@ static const SensorDriver * const drivers[] = {
|
|
&ssc_proximity,
|
|
&ssc_light,
|
|
&ssc_accel,
|
|
+ &ssc_compass,
|
|
#endif
|
|
};
|
|
|
|
diff --git a/src/meson.build b/src/meson.build
|
|
index e44338b..08b25e6 100644
|
|
--- a/src/meson.build
|
|
+++ b/src/meson.build
|
|
@@ -38,6 +38,7 @@ sources = [
|
|
'drv-ssc-proximity.c',
|
|
'drv-ssc-light.c',
|
|
'drv-ssc-accel.c',
|
|
+ 'drv-ssc-compass.c',
|
|
'iio-buffer-utils.c',
|
|
'accel-mount-matrix.c',
|
|
'accel-scale.c',
|
|
--
|
|
2.40.0
|
|
|