iio: Add new event type gesture and use direction for single and double tap
authorJagath Jog J <jagathjog1996@gmail.com>
Wed, 31 Aug 2022 06:31:16 +0000 (12:01 +0530)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Mon, 5 Sep 2022 17:08:42 +0000 (18:08 +0100)
Add new event type for tap called gesture and the direction can be used
to differentiate single and double tap. This may be used by accelerometer
sensors to express single and double tap events. For directional tap,
modifiers like IIO_MOD_(X/Y/Z) can be used along with singletap and
doubletap direction.

Signed-off-by: Jagath Jog J <jagathjog1996@gmail.com>
Link: https://lore.kernel.org/r/20220831063117.4141-2-jagathjog1996@gmail.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Documentation/ABI/testing/sysfs-bus-iio
drivers/iio/industrialio-event.c
include/linux/iio/types.h
include/uapi/linux/iio/types.h
tools/iio/iio_event_monitor.c

index 80e8a38d1ee2f633737a5e2f78c262a96a5d94af..66e81c48ee21a5782991fd99f263cdd69aaf1923 100644 (file)
@@ -2068,3 +2068,72 @@ Description:
                individual channels. If multiple channels are enabled in a scan,
                then the sampling_frequency of the scan may be computed from the
                per channel sampling frequencies.
+
+What:          /sys/.../events/in_accel_gesture_singletap_en
+What:          /sys/.../events/in_accel_gesture_doubletap_en
+KernelVersion: 6.1
+Contact:       linux-iio@vger.kernel.org
+Description:
+               Device generates an event on a single or double tap.
+
+What:          /sys/.../events/in_accel_gesture_singletap_value
+What:          /sys/.../events/in_accel_gesture_doubletap_value
+KernelVersion: 6.1
+Contact:       linux-iio@vger.kernel.org
+Description:
+               Specifies the threshold value that the device is comparing
+               against to generate the tap gesture event. The lower
+               threshold value increases the sensitivity of tap detection.
+               Units and the exact meaning of value are device-specific.
+
+What:          /sys/.../events/in_accel_gesture_tap_value_available
+KernelVersion: 6.1
+Contact:       linux-iio@vger.kernel.org
+Description:
+               Lists all available threshold values which can be used to
+               modify the sensitivity of the tap detection.
+
+What:          /sys/.../events/in_accel_gesture_singletap_reset_timeout
+What:          /sys/.../events/in_accel_gesture_doubletap_reset_timeout
+KernelVersion: 6.1
+Contact:       linux-iio@vger.kernel.org
+Description:
+               Specifies the timeout value in seconds for the tap detector
+               to not to look for another tap event after the event as
+               occurred. Basically the minimum quiet time between the two
+               single-tap's or two double-tap's.
+
+What:          /sys/.../events/in_accel_gesture_tap_reset_timeout_available
+KernelVersion: 6.1
+Contact:       linux-iio@vger.kernel.org
+Description:
+               Lists all available tap reset timeout values. Units in seconds.
+
+What:          /sys/.../events/in_accel_gesture_doubletap_tap2_min_delay
+KernelVersion: 6.1
+Contact:       linux-iio@vger.kernel.org
+Description:
+               Specifies the minimum quiet time in seconds between the two
+               taps of a double tap.
+
+What:          /sys/.../events/in_accel_gesture_doubletap_tap2_min_delay_available
+KernelVersion: 6.1
+Contact:       linux-iio@vger.kernel.org
+Description:
+               Lists all available delay values between two taps in the double
+               tap. Units in seconds.
+
+What:          /sys/.../events/in_accel_gesture_tap_maxtomin_time
+KernelVersion: 6.1
+Contact:       linux-iio@vger.kernel.org
+Description:
+               Specifies the maximum time difference allowed between upper
+               and lower peak of tap to consider it as the valid tap event.
+               Units in seconds.
+
+What:          /sys/.../events/in_accel_gesture_tap_maxtomin_time_available
+KernelVersion: 6.1
+Contact:       linux-iio@vger.kernel.org
+Description:
+               Lists all available time values between upper peak to lower
+               peak. Units in seconds.
index 0e205689496536d9362c69408152f970b2456c12..3d78da2531a9a2c7d5992d2fb5e762341ab4309b 100644 (file)
@@ -231,12 +231,15 @@ static const char * const iio_ev_type_text[] = {
        [IIO_EV_TYPE_MAG_ADAPTIVE] = "mag_adaptive",
        [IIO_EV_TYPE_CHANGE] = "change",
        [IIO_EV_TYPE_MAG_REFERENCED] = "mag_referenced",
+       [IIO_EV_TYPE_GESTURE] = "gesture",
 };
 
 static const char * const iio_ev_dir_text[] = {
        [IIO_EV_DIR_EITHER] = "either",
        [IIO_EV_DIR_RISING] = "rising",
-       [IIO_EV_DIR_FALLING] = "falling"
+       [IIO_EV_DIR_FALLING] = "falling",
+       [IIO_EV_DIR_SINGLETAP] = "singletap",
+       [IIO_EV_DIR_DOUBLETAP] = "doubletap",
 };
 
 static const char * const iio_ev_info_text[] = {
@@ -247,6 +250,8 @@ static const char * const iio_ev_info_text[] = {
        [IIO_EV_INFO_HIGH_PASS_FILTER_3DB] = "high_pass_filter_3db",
        [IIO_EV_INFO_LOW_PASS_FILTER_3DB] = "low_pass_filter_3db",
        [IIO_EV_INFO_TIMEOUT] = "timeout",
+       [IIO_EV_INFO_RESET_TIMEOUT] = "reset_timeout",
+       [IIO_EV_INFO_TAP2_MIN_DELAY] = "tap2_min_delay",
 };
 
 static enum iio_event_direction iio_ev_attr_dir(struct iio_dev_attr *attr)
index 27143b03909d0e31340b8c0dad901466dbf28234..82faa98c719a00fc638a2830d69760e12e883921 100644 (file)
@@ -17,6 +17,8 @@ enum iio_event_info {
        IIO_EV_INFO_HIGH_PASS_FILTER_3DB,
        IIO_EV_INFO_LOW_PASS_FILTER_3DB,
        IIO_EV_INFO_TIMEOUT,
+       IIO_EV_INFO_RESET_TIMEOUT,
+       IIO_EV_INFO_TAP2_MIN_DELAY,
 };
 
 #define IIO_VAL_INT 1
index 472cead10d8d63630687d93a49ebdd895add30e6..913864221ac490ee009084d495daf4e41507ac96 100644 (file)
@@ -105,6 +105,7 @@ enum iio_event_type {
        IIO_EV_TYPE_MAG_ADAPTIVE,
        IIO_EV_TYPE_CHANGE,
        IIO_EV_TYPE_MAG_REFERENCED,
+       IIO_EV_TYPE_GESTURE,
 };
 
 enum iio_event_direction {
@@ -112,6 +113,8 @@ enum iio_event_direction {
        IIO_EV_DIR_RISING,
        IIO_EV_DIR_FALLING,
        IIO_EV_DIR_NONE,
+       IIO_EV_DIR_SINGLETAP,
+       IIO_EV_DIR_DOUBLETAP,
 };
 
 #endif /* _UAPI_IIO_TYPES_H_ */
index 2f4581658859979e82ecac61db23dc0c6b35bab7..b3b3ea399f673fb1e7ab8571c5c48bb04a5ccef0 100644 (file)
@@ -69,12 +69,15 @@ static const char * const iio_ev_type_text[] = {
        [IIO_EV_TYPE_MAG_ADAPTIVE] = "mag_adaptive",
        [IIO_EV_TYPE_CHANGE] = "change",
        [IIO_EV_TYPE_MAG_REFERENCED] = "mag_referenced",
+       [IIO_EV_TYPE_GESTURE] = "gesture",
 };
 
 static const char * const iio_ev_dir_text[] = {
        [IIO_EV_DIR_EITHER] = "either",
        [IIO_EV_DIR_RISING] = "rising",
-       [IIO_EV_DIR_FALLING] = "falling"
+       [IIO_EV_DIR_FALLING] = "falling",
+       [IIO_EV_DIR_SINGLETAP] = "singletap",
+       [IIO_EV_DIR_DOUBLETAP] = "doubletap",
 };
 
 static const char * const iio_modifier_names[] = {
@@ -227,6 +230,7 @@ static bool event_is_known(struct iio_event_data *event)
        case IIO_EV_TYPE_THRESH_ADAPTIVE:
        case IIO_EV_TYPE_MAG_ADAPTIVE:
        case IIO_EV_TYPE_CHANGE:
+       case IIO_EV_TYPE_GESTURE:
                break;
        default:
                return false;
@@ -236,6 +240,8 @@ static bool event_is_known(struct iio_event_data *event)
        case IIO_EV_DIR_EITHER:
        case IIO_EV_DIR_RISING:
        case IIO_EV_DIR_FALLING:
+       case IIO_EV_DIR_SINGLETAP:
+       case IIO_EV_DIR_DOUBLETAP:
        case IIO_EV_DIR_NONE:
                break;
        default: