66 lines
2.8 KiB
Diff
66 lines
2.8 KiB
Diff
|
From eba0aca224c18624b7e398171fb8688728baf398 Mon Sep 17 00:00:00 2001
|
||
|
From: =?UTF-8?q?Guido=20G=C3=BCnther?= <agx@sigxcpu.org>
|
||
|
Date: Sat, 21 Dec 2019 14:31:51 +0100
|
||
|
Subject: [PATCH] light: Support sensors using raw values as well
|
||
|
|
||
|
E.g. the vcnl4000 class devices reports a raw value and a scale
|
||
|
to calculate lux.
|
||
|
---
|
||
|
data/80-iio-sensor-proxy.rules | 1 +
|
||
|
src/drv-iio-poll-light.c | 16 ++++++++++++++--
|
||
|
2 files changed, 15 insertions(+), 2 deletions(-)
|
||
|
|
||
|
diff --git a/data/80-iio-sensor-proxy.rules b/data/80-iio-sensor-proxy.rules
|
||
|
index 06040dc..5bcb207 100644
|
||
|
--- a/data/80-iio-sensor-proxy.rules
|
||
|
+++ b/data/80-iio-sensor-proxy.rules
|
||
|
@@ -9,6 +9,7 @@ SUBSYSTEM=="iio", TEST=="in_accel_x_raw", TEST=="in_accel_y_raw", TEST=="in_acce
|
||
|
SUBSYSTEM=="iio", TEST=="scan_elements/in_accel_x_en", TEST=="scan_elements/in_accel_y_en", TEST=="scan_elements/in_accel_z_en", ENV{IIO_SENSOR_PROXY_TYPE}="iio-buffer-accel"
|
||
|
SUBSYSTEM=="iio", TEST=="scan_elements/in_rot_from_north_magnetic_tilt_comp_en", ENV{IIO_SENSOR_PROXY_TYPE}="iio-buffer-compass"
|
||
|
SUBSYSTEM=="iio", TEST=="in_illuminance_input", ENV{IIO_SENSOR_PROXY_TYPE}="iio-poll-als"
|
||
|
+SUBSYSTEM=="iio", TEST=="in_illuminance_raw", ENV{IIO_SENSOR_PROXY_TYPE}="iio-poll-als"
|
||
|
SUBSYSTEM=="iio", TEST=="scan_elements/in_intensity_both_en", ENV{IIO_SENSOR_PROXY_TYPE}="iio-buffer-als"
|
||
|
SUBSYSTEM=="input", ENV{ID_INPUT_ACCELEROMETER}=="1", ENV{IIO_SENSOR_PROXY_TYPE}="input-accel"
|
||
|
|
||
|
diff --git a/src/drv-iio-poll-light.c b/src/drv-iio-poll-light.c
|
||
|
index d0da7df..a7423c6 100644
|
||
|
--- a/src/drv-iio-poll-light.c
|
||
|
+++ b/src/drv-iio-poll-light.c
|
||
|
@@ -24,6 +24,8 @@ typedef struct DrvData {
|
||
|
char *input_path;
|
||
|
guint interval;
|
||
|
guint timeout_id;
|
||
|
+
|
||
|
+ double scale;
|
||
|
} DrvData;
|
||
|
|
||
|
static DrvData *drv_data = NULL;
|
||
|
@@ -55,8 +57,8 @@ light_changed (gpointer user_data)
|
||
|
g_error_free (error);
|
||
|
return G_SOURCE_CONTINUE;
|
||
|
}
|
||
|
-
|
||
|
- readings.level = level;
|
||
|
+ readings.level = level * drv_data->scale;
|
||
|
+ g_debug ("Light read from IIO: %lf, (scale %lf)", level, drv_data->scale);
|
||
|
|
||
|
/* Even though the IIO kernel API declares in_intensity* values as unitless,
|
||
|
* we use Microsoft's hid-sensors-usages.docx which mentions that Windows 8
|
||
|
@@ -125,6 +127,16 @@ iio_poll_light_open (GUdevDevice *device,
|
||
|
drv_data->input_path = g_build_filename (g_udev_device_get_sysfs_path (device),
|
||
|
"in_illuminance_input",
|
||
|
NULL);
|
||
|
+ if (!g_file_test (drv_data->input_path, G_FILE_TEST_EXISTS)) {
|
||
|
+ g_free (drv_data->input_path);
|
||
|
+ drv_data->input_path = g_build_filename (g_udev_device_get_sysfs_path (device),
|
||
|
+ "in_illuminance_raw",
|
||
|
+ NULL);
|
||
|
+ }
|
||
|
+
|
||
|
+ drv_data->scale = g_udev_device_get_sysfs_attr_as_double (device, "in_illuminance_scale");
|
||
|
+ if (drv_data->scale == 0.0)
|
||
|
+ drv_data->scale = 1.0;
|
||
|
|
||
|
return TRUE;
|
||
|
}
|