Changed the method of reading the sensor value from the ultrasonic sensor
authorEunyoung Lee <ey928.lee@samsung.com>
Fri, 21 Jul 2017 08:41:39 +0000 (17:41 +0900)
committerEunyoung Lee <ey928.lee@samsung.com>
Fri, 21 Jul 2017 08:43:48 +0000 (17:43 +0900)
Change-Id: I2ca69857c66db8c2b3ae3bbd2867cc33734d59c0

CMakeLists.txt
inc/resource/resource_ultrasonic_sensor.h
inc/resource_internal.h
packaging/org.tizen.position-finder-server.spec
src/controller.c
src/resource/resource_ultrasonic_sensor.c

index e8a5c06..7d4f9c9 100644 (file)
@@ -19,6 +19,7 @@ pkg_check_modules(APP_PKGS REQUIRED
        ecore
        eina
        iotcon
+       gio-2.0
 )
 
 FOREACH (flag ${APP_PKGS_CFLAGS})
index 76f5071..3264661 100644 (file)
@@ -22,6 +22,6 @@
 #ifndef __POSITION_FINDER_RESOURCE_ULTRASONIC_SENSOR_H__
 #define __POSITION_FINDER_RESOURCE_ULTRASONIC_SENSOR_H__
 
-extern int resource_read_ultrasonic_sensor(int echo_pin_num, int trig_pin_num, double *out_value);
+extern int resource_read_ultrasonic_sensor(int trig_pin_num, int echo_pin_num, resource_read_cb cb, void *data);
 
 #endif /* __POSITION_FINDER_RESOURCE_ULTRASONIC_SENSOR_H__ */
index 786266e..d63a63e 100644 (file)
@@ -38,6 +38,15 @@ struct _resource_s {
 };
 typedef struct _resource_s resource_s;
 
+typedef void (*resource_read_cb)(double value, void *data);
+
+struct _resource_read_cb_s {
+       resource_read_cb cb;
+       void *data;
+       int pin_num;
+};
+typedef struct _resource_read_cb_s resource_read_s;
+
 extern resource_s *resource_get_info(int pin_num);
 extern void resource_close_all(void);
 
index 19dc681..874678c 100644 (file)
@@ -14,10 +14,11 @@ BuildRequires:  pkgconfig(capi-appfw-application)
 BuildRequires:  pkgconfig(dlog)
 BuildRequires:  pkgconfig(libtzplatform-config)
 BuildRequires:  pkgconfig(capi-appfw-service-application)
-BuildRequires: pkgconfig(capi-system-peripheral-io)
-BuildRequires: pkgconfig(ecore)
-BuildRequires: pkgconfig(eina)
-BuildRequires: pkgconfig(iotcon)
+BuildRequires:  pkgconfig(capi-system-peripheral-io)
+BuildRequires:  pkgconfig(ecore)
+BuildRequires:  pkgconfig(eina)
+BuildRequires:  pkgconfig(iotcon)
+BuildRequires:  pkgconfig(gio-2.0)
 
 %description
 Server for Position Finder
index 886f712..cee20d9 100644 (file)
@@ -39,7 +39,7 @@
 #define GPIO_ULTRASONIC_ECHO_NUM_1 21
 #define GPIO_INFRARED_MOTION_NUM_1 4
 #define I2C_ILLUMINANCE_FIRST_PIN_1 3
-#define USE_MULTIPLE_SENSOR 1
+#define USE_MULTIPLE_SENSOR 0
 #define MULTIPLE_SENSOR_NUMBER 5
 
 static void _start_internal_function(void);
@@ -81,12 +81,16 @@ static Eina_Bool _infrared_motion_getter_timer(void *data)
 }
 
 #if (!USE_MULTIPLE_SENSOR)
+static void ultrasonic_sensor_read_cb(double value, void *data)
+{
+       _I("Distance : %.2fcm", value);
+}
+
 static Eina_Bool _ultrasonic_getter_timer(void *data)
 {
        double value = 0;
 
-       retv_if(resource_read_ultrasonic_sensor(GPIO_ULTRASONIC_TRIG_NUM_1, GPIO_ULTRASONIC_ECHO_NUM_1, &value) == -1, ECORE_CALLBACK_CANCEL);
-       _I("Ultra Sonic Distance is [%d cm]", value);
+       retv_if(resource_read_ultrasonic_sensor(GPIO_ULTRASONIC_TRIG_NUM_1, GPIO_ULTRASONIC_ECHO_NUM_1, ultrasonic_sensor_read_cb, NULL) == -1, ECORE_CALLBACK_CANCEL);
 
        return ECORE_CALLBACK_RENEW;
 }
index 2dd2b62..a186c11 100644 (file)
@@ -23,6 +23,7 @@
 #include <unistd.h>
 #include <peripheral_io.h>
 #include <sys/time.h>
+#include <gio/gio.h>
 
 #include "log.h"
 #include "resource_internal.h"
@@ -41,22 +42,38 @@ void resource_close_ultrasonic_sensor(int echo_pin_num, int trig_pin_num)
        resource_get_info(trig_pin_num)->opened = 0;
 }
 
-static int _get_echo_value(int echo_pin_num)
+static void _resource_read_ultrasonic_sensor_cb(gpio_isr_cb_s *data, void *user_data)
 {
-       int ret = 0;
-       int value = 0;
+       float dist = 0;
+       static unsigned long long timestamp = 0;
+       resource_read_s *resource_read_info = user_data;
 
-       ret = peripheral_gpio_read(resource_get_info(echo_pin_num)->sensor_h, &value);
-       retv_if(ret < 0, -1);
+       ret_if(!resource_read_info);
+       ret_if(!resource_read_info->cb);
+
+       if (timestamp > 0 && data->value == 0) {
+               dist = data->timestamp - timestamp;
+               dist = (dist * 34300) / 2000000;
+               _I("Measured Distance : %0.2fcm\n", dist);
+
+               resource_read_info->cb(dist, resource_read_info->data);
+               peripheral_gpio_unregister_cb(resource_get_info(resource_read_info->pin_num)->sensor_h);
+               free(resource_read_info);
+       }
 
-       return value;
+       timestamp = data->timestamp;
 }
 
-int resource_read_ultrasonic_sensor(int trig_pin_num, int echo_pin_num, double *out_value)
+int resource_read_ultrasonic_sensor(int trig_pin_num, int echo_pin_num, resource_read_cb cb, void *data)
 {
        int ret = 0;
-       double duration = 0.0;
-       struct timeval start_time, end_time, temp_start_time, temp_end_time;
+       resource_read_s *resource_read_info = NULL;
+
+       resource_read_info = calloc(1, sizeof(resource_read_s));
+       retv_if(!resource_read_info, -1);
+       resource_read_info->cb = cb;
+       resource_read_info->data = data;
+       resource_read_info->pin_num = echo_pin_num;
 
        if (!resource_get_info(trig_pin_num)->opened) {
                _I("Ultrasonic sensor's trig is initializing...");
@@ -79,48 +96,25 @@ int resource_read_ultrasonic_sensor(int trig_pin_num, int echo_pin_num, double *
                ret = peripheral_gpio_set_direction(resource_get_info(echo_pin_num)->sensor_h, PERIPHERAL_GPIO_DIRECTION_IN);
                retv_if(ret != 0, -1);
 
+               ret = peripheral_gpio_set_edge_mode(resource_get_info(echo_pin_num)->sensor_h, PERIPHERAL_GPIO_EDGE_BOTH);
+               retv_if(ret != 0, -1);
+
                resource_get_info(echo_pin_num)->opened = 1;
        }
 
+       if (resource_get_info(echo_pin_num)->sensor_h) {
+               ret = peripheral_gpio_register_cb(resource_get_info(echo_pin_num)->sensor_h, _resource_read_ultrasonic_sensor_cb, resource_read_info);
+               retv_if(ret != 0, -1);
+       }
+
        ret = peripheral_gpio_write(resource_get_info(trig_pin_num)->sensor_h, 0);
        retv_if(ret < 0, -1);
 
-       sleep(1);
-
        ret = peripheral_gpio_write(resource_get_info(trig_pin_num)->sensor_h, 1);
        retv_if(ret < 0, -1);
 
-       usleep(10);
-
        ret = peripheral_gpio_write(resource_get_info(trig_pin_num)->sensor_h, 0);
        retv_if(ret < 0, -1);
 
-       _D("Count the distance");
-       gettimeofday(&temp_start_time, NULL);
-
-       while (_get_echo_value(echo_pin_num) == 0) {
-               gettimeofday(&temp_end_time, NULL);
-               duration = (double)temp_end_time.tv_sec + (double)(temp_end_time.tv_usec / 1000000.0)
-                       - (double)temp_start_time.tv_sec - (double)(temp_start_time.tv_usec / 1000000.0);
-               if (duration > 1.0f) {
-                       _E("Cannot get the echo value.");
-                       return -1;
-               }
-       }
-       gettimeofday(&start_time, NULL);
-
-       _D("After checking #1");
-
-       while (_get_echo_value(echo_pin_num) == 1);
-       gettimeofday(&end_time, NULL);
-
-       _D("After checking #2");
-
-       duration = (double)end_time.tv_sec + (double)(end_time.tv_usec / 1000000.0)
-               - (double)start_time.tv_sec - (double)(start_time.tv_usec / 1000000.0);
-       *out_value = duration / 2 * 340.0;
-
-       _I("Ultrasonic Sensor Value : %f", *out_value);
-
        return 0;
 }