aboutsummaryrefslogtreecommitdiffstats
path: root/community/iio-sensor-proxy/292.patch
blob: d5c7b0d487ffe149702e79625afaee7d61796384 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
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;
 }
-- 
2.24.1