Add a struct for gpio interrupt information 89/138389/3
authorjino.cho <jino.cho@samsung.com>
Tue, 11 Jul 2017 11:13:33 +0000 (20:13 +0900)
committerjino cho <jino.cho@samsung.com>
Thu, 13 Jul 2017 01:52:46 +0000 (01:52 +0000)
This patch adds gpio isr callback data deliverd via gpio_isr_cb().
A gpio isr callback data is delivered as a structure, which contains
the pin number, the pin value, and the timestamp(ms)  when the gpio
interrupt occurred.

Change-Id: Iee60dc4d33fe856d46fda83c487ed27d8d1fadae
Signed-off-by: jino.cho <jino.cho@samsung.com>
include/peripheral_io.h
src/peripheral_gdbus_gpio.c
src/peripheral_gpio.c
src/peripheral_io.xml
test/peripheral-io-test.c

index bba13cad6bb343f3078bc180eb82699c084ae329..d697a559bff1a84e3c1e3c79000c8d57a8d4d777 100644 (file)
@@ -73,6 +73,19 @@ typedef enum {
        PERIPHERAL_GPIO_EDGE_BOTH,      /**< Interrupt on rising & falling */
 } peripheral_gpio_edge_e;
 
+/**
+ * @brief Gpio isr callback data delivered via gpio_isr_cb().
+ * @details A gpio isr callback data is delivered as a structure, which contains
+ *          the pin number, the pin value, and the timestamp of the gpio interrupt
+ *          in microseconds.
+ * @since_tizen 4.0
+ */
+typedef struct {
+       int pin;
+       int value;
+       unsigned long long timestamp;
+} gpio_isr_cb_s;
+
 /**
  * @brief The handle to the gpio pin
  * @since_tizen 4.0
@@ -225,12 +238,13 @@ int peripheral_gpio_set_edge_mode(peripheral_gpio_h gpio, peripheral_gpio_edge_e
  * @brief Called when the gpio interrupt is triggered.
  * @since_tizen 4.0
  *
+ * @param[in] data The gpio isr callback data
  * @param[in] user_data The user data passed from the callback registration function
  *
  * @see peripheral_gpio_register_cb()
  * @see peripheral_gpio_unregister_cb()
  */
-typedef void(*gpio_isr_cb)(void *user_data);
+typedef void(*gpio_isr_cb)(gpio_isr_cb_s *data, void *user_data);
 
 /**
  * @brief Registers a callback function to be invoked when the gpio interrupt is triggered.
index 1c1fb1c885c29b24dd306051f474299c6c8f33e7..b476e4706fc2274d978ddb3886bb5ef3fbb8e59a 100644 (file)
 #include "peripheral_internal.h"
 #include "peripheral_io_gdbus.h"
 
-extern int peripheral_gpio_isr_callback(int pin);
-void handle_gpio_changed(PeripheralIoGdbusGpio *gpio, gint pin, gint state, gpointer user_data);
+extern int peripheral_gpio_isr_callback(int pin, int value, unsigned long long timestamp);
+
+void handle_gpio_changed(
+               PeripheralIoGdbusGpio *gpio,
+               gint pin,
+               gint value,
+               guint64 timestamp,
+               gpointer user_data);
 
 PeripheralIoGdbusGpio *gpio_proxy = NULL;
 
@@ -68,13 +74,14 @@ void gpio_proxy_deinit()
 void handle_gpio_changed(
                PeripheralIoGdbusGpio *gpio,
                gint pin,
-               gint state,
+               gint value,
+               guint64 timestamp,
                gpointer user_data)
 {
        if (!gpio)
                return;
 
-       peripheral_gpio_isr_callback(pin);
+       peripheral_gpio_isr_callback(pin, value, timestamp);
 }
 
 int peripheral_gdbus_gpio_open(peripheral_gpio_h gpio)
index 6c64b9805ec257765addcc79585c09dda89e09f1..8a7ccdf5c8c6896c7dcf6fc2b5bfd938e48b3185 100644 (file)
@@ -33,18 +33,22 @@ typedef struct {
 
 static GList *gpio_isr_list = NULL;
 
-int peripheral_gpio_isr_callback(int pin)
+int peripheral_gpio_isr_callback(int pin, int value, unsigned long long timestamp)
 {
        GList *link;
        gpio_isr_data_s *isr_data;
+       gpio_isr_cb_s cb_data;
 
        link = gpio_isr_list;
        while (link) {
                isr_data = (gpio_isr_data_s*)link->data;
 
                if (isr_data->pin == pin) {
+                       cb_data.pin = pin;
+                       cb_data.value = value;
+                       cb_data.timestamp = timestamp;
                        if (isr_data->callback)
-                               isr_data->callback(isr_data->user_data);
+                               isr_data->callback(&cb_data, isr_data->user_data);
                        return PERIPHERAL_ERROR_NONE;
                }
                link = g_list_next(link);
index 16b3cd2b55f148372988bf6f4b3d59e8f492dbd7..878fb5c91e176e79b437d9ffdcf32893d5bd1ca9 100644 (file)
@@ -50,7 +50,8 @@
                </method>
                <signal name='GpioChanged'>
                        <arg type='i' name='pin'/>
-                       <arg type='i' name='state'/>
+                       <arg type='i' name='value'/>
+                       <arg type='t' name='timestamp'/>
                </signal>
        </interface>
        <interface name="org.tizen.peripheral_io.i2c">
index 4ccbbe1c7de70595af3e6cc29ba2f232ffedcd97..cb62e2a84f082bb9e4ce3486c6202baacdeeac54 100644 (file)
@@ -103,7 +103,7 @@ error:
        return ret;
 }
 
-void gpio_irq_test_isr(void *user_data)
+void gpio_irq_test_isr(gpio_isr_cb_s *data, void *user_data)
 {
        int pin;
        peripheral_gpio_h gpio = user_data;
@@ -249,7 +249,7 @@ error:
 #define MMA7455_YOUT8 0x07 //Register for reading the Y-Axis
 #define MMA7455_ZOUT8 0x08 //Register for reading the Z-Axis
 
-static void i2c_mma7455_isr(void *user_data)
+static void i2c_mma7455_isr(gpio_isr_cb_s *data, void *user_data)
 {
        peripheral_i2c_h i2c = user_data;
        uint8_t x_pos, y_pos, z_pos;