Example for most simple Tizen IOT Communication API
authorjunkyu han <junkyu.han@samsung.com>
Wed, 5 Jul 2017 11:51:38 +0000 (20:51 +0900)
committerJin Yoon <jinny.yoon@samsung.com>
Fri, 7 Jul 2017 05:30:55 +0000 (14:30 +0900)
Change-Id: I5007b62207a8606351b966882501b8aff6358c3d

15 files changed:
CMakeLists.txt
inc/model.h
inc/model/model_illuminance_sensor.h [new file with mode: 0644]
inc/model/model_infrared_motion_sensor.h
inc/model/model_infrared_obstacle_avoidance_sensor.h
inc/model/model_touch_sensor.h
inc/model/model_ultrasonic_sensor.h
inc/model_internal.h [new file with mode: 0644]
src/controller.c
src/model.c
src/model/model_illuminance_sensor.c [new file with mode: 0644]
src/model/model_infrared_motion_sensor.c
src/model/model_infrared_obstacle_avoidance_sensor.c
src/model/model_touch_sensor.c
src/model/model_ultrasonic_sensor.c

index d2c376c..9953f4a 100644 (file)
@@ -34,10 +34,11 @@ ADD_EXECUTABLE(${PROJECT_NAME}
        ${PROJECT_ROOT_DIR}/src/controller.c
        ${PROJECT_ROOT_DIR}/src/connectivity.c
        ${PROJECT_ROOT_DIR}/src/model.c
-       ${PROJECT_ROOT_DIR}/src/model/model_ultrasonic_sensor.c
+       ${PROJECT_ROOT_DIR}/src/model/model_illuminance_sensor.c
        ${PROJECT_ROOT_DIR}/src/model/model_infrared_motion_sensor.c
        ${PROJECT_ROOT_DIR}/src/model/model_infrared_obstacle_avoidance_sensor.c
        ${PROJECT_ROOT_DIR}/src/model/model_touch_sensor.c
+       ${PROJECT_ROOT_DIR}/src/model/model_ultrasonic_sensor.c
 )
 #${PROJECT_ROOT_DIR}/src/connectivity.c
 
index bf31673..6cf1869 100644 (file)
 #ifndef __POSITION_FINDER_MODEL_H__
 #define __POSITION_FINDER_MODEL_H__
 
-enum sensor_type {
-       SENSOR_TYPE_ULTRASONIC,
-       SENSOR_TYPE_INFRARED_MOTION, /* HC_SR501 */
-       SENSOR_TYPE_INFRARED_OBSTACLE_AVOIDANCE,
-       SENSOR_TYPE_TOUCH,
-};
-typedef enum sensor_type sensor_type_e;
+#include <peripheral_io.h>
 
-typedef struct _model_sensor_s model_sensor_s;
-typedef model_sensor_s *model_sensor_h;
-
-extern int model_init(const char *id, sensor_type_e sensor_type, int gpio_num1, int gpio_num2, model_sensor_h *out_info);
-extern void model_fini(model_sensor_h info);
-
-extern int model_read_int_value(model_sensor_h info, int *out_value);
-extern int model_read_double_value(model_sensor_h info, double *out_value);
-
-extern int model_list_add_sensor(model_sensor_h info);
-extern int model_list_remove_sensor(model_sensor_h info);
-extern int model_list_get_sensor(const char *id, model_sensor_h *out_info);
-extern int model_list_foreach(void (*cb)(model_sensor_h info));
+#include "model_internal.h"
+#include "model/model_illuminance_sensor.h"
+#include "model/model_infrared_motion_sensor.h"
+#include "model/model_infrared_obstacle_avoidance_sensor.h"
+#include "model/model_touch_sensor.h"
+#include "model/model_ultrasonic_sensor.h"
 
 #endif /* __POSITION_FINDER_MODEL_H__ */
diff --git a/inc/model/model_illuminance_sensor.h b/inc/model/model_illuminance_sensor.h
new file mode 100644 (file)
index 0000000..19eef2d
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Contact: Jin Yoon <jinny.yoon@samsung.com>
+ *          Geunsun Lee <gs86.lee@samsung.com>
+ *          Eunyoung Lee <ey928.lee@samsung.com>
+ *          Junkyu Han <junkyu.han@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __POSITION_FINDER_MODEL_ILLUMINANCE_SENSOR_H__
+#define __POSITION_FINDER_MODEL_ILLUMINANCE_SENSOR_H__
+
+/* You have to use this illuminance sensor ONLY ONE in the pi board */
+extern int model_read_illuminance_sensor(int i2c_bus, int *out_value);
+extern void model_close_illuminance_sensor(void);
+
+#endif /* __POSITION_FINDER_MODEL_ILLUMINANCE_SENSOR_H__ */
+
index f0f9c88..fabd14b 100644 (file)
@@ -22,9 +22,7 @@
 #ifndef __POSITION_FINDER_MODEL_INFRARED_MOTION_SENSOR_H__
 #define __POSITION_FINDER_MODEL_INFRARED_MOTION_SENSOR_H__
 
-extern int model_init_infrared_motion_sensor(int gpio_num, void **peripheral_info);
-extern void model_fini_infrared_motion_sensor(void *peripheral_info);
-
-extern int model_read_infrared_motion_sensor(void *peripheral_info, int *out_value);
+extern void model_close_infrared_motion_sensor(int sensor_index);
+extern int model_read_infrared_motion_sensor(int pin_num, int *out_value);
 
 #endif /* __POSITION_FINDER_MODEL_INFRARED_MOTION_SENSOR_H__ */
index 630d5e4..348ca90 100644 (file)
@@ -22,9 +22,7 @@
 #ifndef __POSITION_FINDER_MODEL_INFRARED_OBSTACLE_AVOIDANCE_SENSOR_H__
 #define __POSITION_FINDER_MODEL_INFRARED_OBSTACLE_AVOIDANCE_SENSOR_H__
 
-extern int model_init_infrared_obstacle_avoidance_sensor(int gpio_num, void **peripheral_info);
-extern void model_fini_infrared_obstacle_avoidance_sensor(void *peripheral_info);
-
-extern int model_read_infrared_obstacle_avoidance_sensor(void *peripheral_info, int *out_value);
+extern void model_close_infrared_obstacle_avoidance_sensor(int pin_num);
+extern int model_read_infrared_obstacle_avoidance_sensor(int pin_num, int *out_value);
 
 #endif /* __POSITION_FINDER_MODEL_INFRARED_OBSTACLE_AVOIDANCE_SENSOR_H__ */
index 96f568c..d3f9f53 100644 (file)
@@ -22,9 +22,7 @@
 #ifndef __POSITION_FINDER_MODEL_TOUCH_SENSOR_H__
 #define __POSITION_FINDER_MODEL_TOUCH_SENSOR_H__
 
-extern int model_init_touch_sensor(int gpio_num, void **peripheral_info);
-extern void model_fini_touch_sensor(void *peripheral_info);
-
-extern int model_read_touch_sensor(void *peripheral_info, int *out_value);
+extern void model_close_touch_sensor(int pin_num);
+extern int model_read_touch_sensor(int pin_num, int *out_value);
 
 #endif /* __POSITION_FINDER_MODEL_TOUCH_SENSOR_H__ */
index f2717f3..401f37c 100644 (file)
@@ -22,8 +22,7 @@
 #ifndef __POSITION_FINDER_MODEL_ULTRASONIC_SENSOR_H__
 #define __POSITION_FINDER_MODEL_ULTRASONIC_SENSOR_H__
 
-extern int model_init_ultrasonic_sensor(int gpio_num1, int gpio_num2, void **peripheral_info);
-extern void model_fini_ultrasonic_sensor(void *peripheral_info);
-extern int model_read_ultrasonic_sensor(void *peripheral_info, double *value);
+extern void model_close_ultrasonic_sensor(int echo_pin_num, int trig_pin_num);
+extern int model_read_ultrasonic_sensor(int echo_pin_num, int trig_pin_num, double *out_value);
 
 #endif /* __POSITION_FINDER_MODEL_ULTRASONIC_SENSOR_H__ */
diff --git a/inc/model_internal.h b/inc/model_internal.h
new file mode 100644 (file)
index 0000000..ea73236
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Contact: Jin Yoon <jinny.yoon@samsung.com>
+ *          Geunsun Lee <gs86.lee@samsung.com>
+ *          Eunyoung Lee <ey928.lee@samsung.com>
+ *          Junkyu Han <junkyu.han@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __POSITION_FINDER_MODEL_INTERNAL_H__
+#define __POSITION_FINDER_MODEL_INTERNAL_H__
+
+#include <peripheral_io.h>
+
+#define PIN_MAX 40
+
+struct _model_s {
+       int opened;
+       peripheral_gpio_h sensor_h;
+};
+typedef struct _model_s model_s;
+
+extern model_s *model_get_info(int pin_num);
+
+#endif /* __POSITION_FINDER_MODEL_INTERNAL_H__ */
index ca6408b..27c3015 100644 (file)
 #include "controller.h"
 #include "model.h"
 
+#define I2C_BUS_1 0x1
 #define GPIO_NOT_USED -1
-#define GPIO_ULTRASONIC_TRIG_NUM 20
-#define GPIO_ULTRASONIC_ECHO_NUM 21
-#define GPIO_INFRARED_MOTION_NUM 4
+#define GPIO_ULTRASONIC_TRIG_NUM_1 20
+#define GPIO_ULTRASONIC_ECHO_NUM_1 21
+#define GPIO_INFRARED_MOTION_NUM_1 4
+#define I2C_ILLUMINANCE_FIRST_PIN_1 3
 
 typedef struct app_data_s {
-       model_sensor_h sensor_info;
-       Ecore_Timer *getter_timer;
-       void *event;
+       Ecore_Timer *getter_timer[PIN_MAX];
 } app_data;
 
-static Eina_Bool _ultrasonic_getter_timer(void *data)
+static Eina_Bool _infrared_motion_getter_timer(void *data)
 {
-       app_data *ad = data;
-
-#if 1
        int value = 0;
-       retv_if(model_read_int_value(ad->sensor_info, &value) == -1, ECORE_CALLBACK_CANCEL);
-       _I("Ultrasonic Value is [%d]", value);
-#else
-       double value = 0.0;
-       retv_if(model_read_double_value(ad->sensor_info, &value) == -1, ECORE_CALLBACK_RENEW);
-       _I("Value is [%f]", value);
-#endif
+
+       retv_if(model_read_infrared_motion_sensor(GPIO_INFRARED_MOTION_NUM_1, &value) == -1, ECORE_CALLBACK_CANCEL);
+       _I("Infrared Motion Value is [%d]", value);
 
        return ECORE_CALLBACK_RENEW;
 }
 
-static Eina_Bool _infrared_motion_getter_timer(void *data)
+static Eina_Bool _ultrasonic_getter_timer(void *data)
 {
-       app_data *ad = data;
+       double value = 0;
 
-#if 1
+       retv_if(model_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);
+
+       return ECORE_CALLBACK_RENEW;
+}
+
+static Eina_Bool _illuminance_getter_timer(void *data)
+{
        int value = 0;
-       retv_if(model_read_int_value(ad->sensor_info, &value) == -1, ECORE_CALLBACK_CANCEL);
-       _I("Infrared Motion Value is [%d]", value);
-#else
-       double value = 0.0;
-       retv_if(model_read_double_value(ad->sensor_info, &value) == -1, ECORE_CALLBACK_RENEW);
-       _I("Value is [%f]", value);
-#endif
+
+       retv_if(model_read_illuminance_sensor(I2C_BUS_1, &value) == -1, ECORE_CALLBACK_CANCEL);
+       _I("Ultra Sonic Distance is [%d lux]", value);
 
        return ECORE_CALLBACK_RENEW;
 }
 
 static bool service_app_create(void *data)
 {
-       model_sensor_h sensor_info = NULL;
        app_data *ad = data;
 
-       retv_if(model_init("Ultrasonic", SENSOR_TYPE_ULTRASONIC, GPIO_ULTRASONIC_TRIG_NUM, GPIO_ULTRASONIC_ECHO_NUM, &sensor_info) == -1, false);
-       ad->sensor_info = sensor_info;
-
-       ad->getter_timer = ecore_timer_add(3.0, _ultrasonic_getter_timer, ad);
-       if (!ad->getter_timer) {
-               _D("Failed to add getter timer");
+       /* One Pin Sensor */
+       ad->getter_timer[GPIO_INFRARED_MOTION_NUM_1] = ecore_timer_add(3.0, _infrared_motion_getter_timer, ad);
+       if (!ad->getter_timer[GPIO_INFRARED_MOTION_NUM_1]) {
+               _D("Failed to add infrared motion getter timer");
                return false;
        }
 
-       retv_if(model_init("Infrared_motion", SENSOR_TYPE_INFRARED_MOTION, GPIO_INFRARED_MOTION_NUM, GPIO_NOT_USED, &sensor_info) == -1, false);
-       ad->sensor_info = sensor_info;
+       /* Two Pins Sensor */
+       ad->getter_timer[GPIO_ULTRASONIC_TRIG_NUM_1] = ecore_timer_add(1.0, _ultrasonic_getter_timer, ad);
+       if (!ad->getter_timer[GPIO_ULTRASONIC_TRIG_NUM_1]) {
+               _D("Failed to add ultra sonic getter timer");
+               return false;
+       }
 
-       ad->getter_timer = ecore_timer_add(3.0, _infrared_motion_getter_timer, ad);
-       if (!ad->getter_timer) {
-               _D("Failed to add getter timer");
+       /* I2C Protocol Sensor */
+       ad->getter_timer[I2C_ILLUMINANCE_FIRST_PIN_1] = ecore_timer_add(1.0, _illuminance_getter_timer, ad);
+       if (!ad->getter_timer[I2C_ILLUMINANCE_FIRST_PIN_1]) {
+               _D("Failed to add ultra sonic getter timer");
                return false;
        }
 
@@ -104,8 +102,15 @@ static bool service_app_create(void *data)
 static void service_app_terminate(void *data)
 {
        app_data *ad = (app_data *)data;
-       ecore_timer_del(ad->getter_timer);
-       model_fini(ad->sensor_info);
+
+       for (int i = 0; i < PIN_MAX; i++) {
+               if (ad->getter_timer[i]) {
+                       ecore_timer_del(ad->getter_timer[i]);
+               }
+       }
+       model_close_infrared_motion_sensor(GPIO_INFRARED_MOTION_NUM_1);
+       model_close_ultrasonic_sensor(GPIO_ULTRASONIC_TRIG_NUM_1, GPIO_ULTRASONIC_ECHO_NUM_1);
+       model_close_illuminance_sensor();
        free(ad);
 }
 
index 368f152..f9298a7 100644 (file)
  * limitations under the License.
  */
 
-#include <stdlib.h>
-#include <unistd.h>
 #include <peripheral_io.h>
-#include <sys/time.h>
-#include <Eina.h>
-
-#include "log.h"
 #include "model.h"
-#include "model/model_ultrasonic_sensor.h"
-#include "model/model_infrared_motion_sensor.h"
-#include "model/model_infrared_obstacle_avoidance_sensor.h"
-#include "model/model_touch_sensor.h"
-
-struct _model_sensor_s {
-       char *id;
-       sensor_type_e sensor_type;
-       int gpio_num[2];
-       void *peripheral_info;
-};
-static struct {
-       Eina_List *list;
-} model_s;
-
-int model_init(const char *id, sensor_type_e sensor_type, int gpio_num1, int gpio_num2, model_sensor_h *out_info)
-{
-       model_sensor_h info = NULL;
-       int ret = -1;
-
-       retv_if(!id, -1);
-
-       info = calloc(1, sizeof(model_sensor_s));
-       retv_if(!info, -1);
-       *out_info = info;
-
-       info->sensor_type = sensor_type;
-       info->id = strdup(id);
-       goto_if(!info->id, error);
-
-       info->gpio_num[0] = gpio_num1;
-       info->gpio_num[1] = gpio_num2;
-       goto_if(gpio_num1 == -1, error);
-
-       switch (sensor_type) {
-       case SENSOR_TYPE_ULTRASONIC:
-               goto_if(gpio_num2 == -1, error);
-               ret = model_init_ultrasonic_sensor(gpio_num1, gpio_num2, &info->peripheral_info);
-               break;
-       case SENSOR_TYPE_INFRARED_MOTION:
-               ret = model_init_infrared_motion_sensor(gpio_num1, &info->peripheral_info);
-               break;
-       case SENSOR_TYPE_INFRARED_OBSTACLE_AVOIDANCE:
-               ret = model_init_infrared_obstacle_avoidance_sensor(gpio_num1, &info->peripheral_info);
-               break;
-       case SENSOR_TYPE_TOUCH:
-               ret = model_init_touch_sensor(gpio_num1, &info->peripheral_info);
-               break;
-       default:
-               break;
-       }
-
-       goto_if(ret != 0, error);
-
-       return 0;
-
-error:
-       if (info->id) free(info->id);
-       if (info) free(info);
-       *out_info = NULL;
-       return -1;
-}
-
-void model_fini(model_sensor_h info)
-{
-       ret_if(!info);
-
-       switch (info->sensor_type) {
-       case SENSOR_TYPE_ULTRASONIC:
-               model_fini_ultrasonic_sensor(info->peripheral_info);
-               break;
-       case SENSOR_TYPE_INFRARED_MOTION:
-               model_fini_infrared_motion_sensor(info->peripheral_info);
-               break;
-       case SENSOR_TYPE_INFRARED_OBSTACLE_AVOIDANCE:
-               model_fini_infrared_obstacle_avoidance_sensor(info->peripheral_info);
-               break;
-       case SENSOR_TYPE_TOUCH:
-               model_fini_touch_sensor(info->peripheral_info);
-               break;
-       default:
-               break;
-       }
-
-       free(info->id);
-       free(info);
-}
-
-int model_read_int_value(model_sensor_h info, int *out_value)
-{
-       int ret = 0;
-
-       switch (info->sensor_type) {
-       case SENSOR_TYPE_ULTRASONIC:
-               ret = model_read_infrared_obstacle_avoidance_sensor(info, out_value);
-               break;
-       case SENSOR_TYPE_INFRARED_MOTION:
-               ret = model_read_infrared_motion_sensor(info, out_value);
-               break;
-       case SENSOR_TYPE_TOUCH:
-               ret = model_read_touch_sensor(info, out_value);
-               break;
-       default:
-               break;
-       }
-
-       if (ret < 0) {
-               _E("Something wrong in the result[%d]", ret);
-               return -1;
-       }
-
-       return 0;
-}
-
-int model_read_double_value(model_sensor_h info, double *out_value)
-{
-       int ret = 0;
-
-       switch (info->sensor_type) {
-       case SENSOR_TYPE_ULTRASONIC:
-               ret = model_read_ultrasonic_sensor(info, out_value);
-               break;
-       default:
-               _E("There is no data to retrieve");
-               break;
-       }
-
-       if (ret < 0) {
-               _E("Something wrong in the result[%d]", ret);
-               return -1;
-       }
-
-       return 0;
-}
-
-int model_list_add_sensor(model_sensor_h info)
-{
-       Eina_List *l, *ln;
-       model_sensor_h temp = NULL;
 
-       retv_if(!info, -1);
-       retv_if(!info->id, -1);
+static model_s model_info[PIN_MAX] = { 0, };
 
-       EINA_LIST_FOREACH_SAFE(model_s.list, l, ln, temp) {
-               retv_if(!temp->id, -1);
-               if (!strcmp(temp->id, info->id)) {
-                       _E("That id[%s] already exists.", info->id);
-                       return -1;
-               }
-       }
-       model_s.list = eina_list_append(model_s.list, info);
-       return 0;
-}
-
-int model_list_remove_sensor(model_sensor_h info)
+model_s *model_get_info(int pin_num)
 {
-       retv_if(!info, -1);
-       model_s.list = eina_list_remove(model_s.list, info);
-       return 0;
-}
-
-int model_list_get_sensor(const char *id, model_sensor_h *out_info)
-{
-       Eina_List *l, *ln;
-       model_sensor_h temp = NULL;
-
-       retv_if(!id, -1);
-
-       EINA_LIST_FOREACH_SAFE(model_s.list, l, ln, temp) {
-               retv_if(!temp->id, -1);
-               if (!strcmp(temp->id, id)) {
-                       _E("That id[%s] already exists.", id);
-                       *out_info = temp;
-                       return 0;
-               }
-       }
-
-       *out_info = NULL;
-       return -1;
-}
-
-int model_list_foreach(void (*cb)(model_sensor_h info))
-{
-       Eina_List *l, *ln;
-       model_sensor_h temp = NULL;
-
-       retv_if(!cb, -1);
-
-       EINA_LIST_FOREACH_SAFE(model_s.list, l, ln, temp) {
-               cb(temp);
-       }
-
-       return 0;
+       return &model_info[pin_num];
 }
diff --git a/src/model/model_illuminance_sensor.c b/src/model/model_illuminance_sensor.c
new file mode 100644 (file)
index 0000000..9a0f381
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Contact: Jin Yoon <jinny.yoon@samsung.com>
+ *          Geunsun Lee <gs86.lee@samsung.com>
+ *          Eunyoung Lee <ey928.lee@samsung.com>
+ *          Junkyu Han <junkyu.han@samsung.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdlib.h>
+#include <unistd.h>
+#include <peripheral_io.h>
+#include <sys/time.h>
+
+#include "log.h"
+#include "model_internal.h"
+
+#define I2C_PIN_MAX 28
+/* I2C */
+#define GY30_ADDR 0x23 /* Address of GY30 light sensor */
+#define GY30_CONT_HIGH_RES_MODE 0x10 /* Start measurement at 11x resolution. Measurement time is approx 120mx */
+#define GY30_CONSTANT_NUM (1.2)
+
+static struct {
+       int opened;
+       peripheral_i2c_h sensor_h;
+} model_sensor_s;
+
+void model_close_illuminance_sensor(void)
+{
+       ret_if(!model_sensor_s.opened);
+
+       _I("Infrared Motion Sensor is finishing...");
+       peripheral_i2c_close(model_sensor_s.sensor_h);
+       model_sensor_s.opened = 0;
+}
+
+/* You have to use this illuminance sensor ONLY ONE in the pi board */
+int model_read_illuminance_sensor(int i2c_bus, int *out_value)
+{
+       int ret = PERIPHERAL_ERROR_NONE;
+       unsigned char buf[10] = { 0, };
+
+       if (!model_sensor_s.opened) {
+               ret = peripheral_i2c_open(i2c_bus, GY30_ADDR, &model_sensor_s.sensor_h);
+               retv_if(!model_sensor_s.sensor_h, -1);
+               model_sensor_s.opened = 1;
+       }
+
+       ret = peripheral_i2c_write_byte(model_sensor_s.sensor_h, GY30_CONT_HIGH_RES_MODE);
+       retv_if(ret < 0, -1);
+
+       ret = peripheral_i2c_read(model_sensor_s.sensor_h, buf, 2);
+       retv_if(ret < 0, -1);
+
+       *out_value = (buf[0] << 8 | buf[1]) / GY30_CONSTANT_NUM; // Just Sum High 8bit and Low 8bit
+
+       _I("Infrared Motion Sensor Value : %d", *out_value);
+
+       return 0;
+}
index d5ac82c..f606b8a 100644 (file)
 #include <sys/time.h>
 
 #include "log.h"
-#include "model/model_infrared_motion_sensor.h"
+#include "model_internal.h"
 
-struct _model_infrared_motion_sensor_s {
-       peripheral_gpio_h gpio;
-};
-typedef struct _model_infrared_motion_sensor_s model_infrared_motion_sensor_s;
-
-void model_fini_infrared_motion_sensor(void *peripheral_info)
+void model_close_infrared_motion_sensor(int pin_num)
 {
-       model_infrared_motion_sensor_s *info = peripheral_info;
-
-       ret_if(!info);
+       ret_if(!model_get_info(pin_num)->opened);
 
        _I("Infrared Motion Sensor is finishing...");
-
-
-       if (info->gpio)
-               peripheral_gpio_close(info->gpio);
-
-       free(info);
+       model_get_info(pin_num)->opened = 0;
 }
 
-int model_init_infrared_motion_sensor(int gpio_num, void **peripheral_info)
+int model_read_infrared_motion_sensor(int pin_num, int *out_value)
 {
-       model_infrared_motion_sensor_s *info = NULL;
-       int ret = 0;
-
-       _I("Infrared Motion Sensor is initializing...");
+       int ret = PERIPHERAL_ERROR_NONE;
 
-       info = calloc(1, sizeof(model_infrared_motion_sensor_s));
-       retv_if(!info, -1);
-       *peripheral_info = info;
+       if (!model_get_info(pin_num)->opened) {
+               ret = peripheral_gpio_open(pin_num, &model_get_info(pin_num)->sensor_h);
+               retv_if(!model_get_info(pin_num)->sensor_h, -1);
 
-       ret = peripheral_gpio_open(gpio_num, &info->gpio);
-       goto_if(ret != 0, error);
-       goto_if(!info->gpio, error);
+               ret = peripheral_gpio_set_direction(model_get_info(pin_num)->sensor_h, PERIPHERAL_GPIO_DIRECTION_IN);
+               retv_if(ret != 0, -1);
 
-       ret = peripheral_gpio_set_direction(info->gpio, PERIPHERAL_GPIO_DIRECTION_IN);
-       goto_if(ret != 0, error);
-
-       return 0;
-
-error:
-       model_fini_infrared_motion_sensor(info);
-       free(info);
-       *peripheral_info = NULL;
-       return -1;
-}
-
-int model_read_infrared_motion_sensor(void *peripheral_info, int *out_value)
-{
-       model_infrared_motion_sensor_s *info = peripheral_info;
-       int ret = 0;
+               model_get_info(pin_num)->opened = 1;
+       }
 
-       ret = peripheral_gpio_read(info->gpio, out_value);
+       ret = peripheral_gpio_read(model_get_info(pin_num)->sensor_h, out_value);
        retv_if(ret < 0, -1);
 
        _I("Infrared Motion Sensor Value : %d", *out_value);
index 206c05d..a63ab6a 100644 (file)
 #include <sys/time.h>
 
 #include "log.h"
-#include "model/model_infrared_obstacle_avoidance_sensor.h"
+#include "model_internal.h"
 
-
-struct _model_infrared_obstacle_avoidance_sensor_s {
-       peripheral_gpio_h gpio;
-};
-typedef struct _model_infrared_obstacle_avoidance_sensor_s model_infrared_obstacle_avoidance_sensor_s;
-
-void model_fini_infrared_obstacle_avoidance_sensor(void *peripheral_info)
+void model_close_infrared_obstacle_avoidance_sensor(int pin_num)
 {
-       model_infrared_obstacle_avoidance_sensor_s *info = peripheral_info;
+       ret_if(!model_get_info(pin_num)->opened);
 
        _I("Infrared Obstacle Avoidance Sensor is finishing...");
-       ret_if(!info);
-
-       if (info->gpio)
-               peripheral_gpio_close(info->gpio);
-
-       free(info);
+       peripheral_gpio_close(model_get_info(pin_num)->sensor_h);
+       model_get_info(pin_num)->opened = 0;
 }
 
-int model_init_infrared_obstacle_avoidance_sensor(int gpio_num, void **peripheral_info)
+int model_read_infrared_obstacle_avoidance_sensor(int pin_num, int *out_value)
 {
-       model_infrared_obstacle_avoidance_sensor_s *info = NULL;
-       int ret = 0;
-
-       _I("Infrared Obstacle Avoidance is initializing...");
-
-       info = calloc(1, sizeof(model_infrared_obstacle_avoidance_sensor_s));
-       retv_if(!info, -1);
-       *peripheral_info = info;
+       int ret = PERIPHERAL_ERROR_NONE;
 
-       ret = peripheral_gpio_open(gpio_num, &info->gpio);
-       goto_if(ret != 0, error);
-       goto_if(!info->gpio, error);
+       if (!model_get_info(pin_num)->opened) {
+               ret = peripheral_gpio_open(pin_num, &model_get_info(pin_num)->sensor_h);
+               retv_if(!model_get_info(pin_num)->sensor_h, -1);
 
-       ret = peripheral_gpio_set_direction(info->gpio, PERIPHERAL_GPIO_DIRECTION_IN);
-       goto_if(ret != 0, error);
+               ret = peripheral_gpio_set_direction(model_get_info(pin_num)->sensor_h, PERIPHERAL_GPIO_DIRECTION_IN);
+               retv_if(ret != 0, -1);
 
-       return 0;
-
-error:
-       model_fini_infrared_obstacle_avoidance_sensor(info);
-       free(info);
-       *peripheral_info = NULL;
-       return -1;
-}
-
-int model_read_infrared_obstacle_avoidance_sensor(void *peripheral_info, int *out_value)
-{
-       model_infrared_obstacle_avoidance_sensor_s *info = peripheral_info;
-       int ret = 0;
+               model_get_info(pin_num)->opened = 1;
+       }
 
-       ret = peripheral_gpio_read(info->gpio, out_value);
+       ret = peripheral_gpio_read(model_get_info(pin_num)->sensor_h, out_value);
        retv_if(ret < 0, -1);
 
        _I("Infrared Obstacle Avoidance Sensor Value : %d", *out_value);
index 538cf09..ba472c5 100644 (file)
 #include <sys/time.h>
 
 #include "log.h"
-#include "model/model_touch_sensor.h"
+#include "model_internal.h"
 
-struct _model_touch_sensor_s {
-       peripheral_gpio_h gpio;
-};
-typedef struct _model_touch_sensor_s model_touch_sensor_s;
-
-void model_fini_touch_sensor(void *peripheral_info)
+void model_close_touch_sensor(int pin_num)
 {
-       model_touch_sensor_s *info = peripheral_info;
+       ret_if(!model_get_info(pin_num)->opened);
 
        _I("Touch Sensor is finishing...");
-       ret_if(!info);
-
-       if (info->gpio)
-               peripheral_gpio_close(info->gpio);
-
-       free(info);
+       peripheral_gpio_close(model_get_info(pin_num)->sensor_h);
+       model_get_info(pin_num)->opened = 0;
 }
 
-int model_init_touch_sensor(int gpio_num, void **peripheral_info)
+int model_read_touch_sensor(int pin_num, int *out_value)
 {
-       model_touch_sensor_s *info = NULL;
-       int ret = 0;
+       int ret = PERIPHERAL_ERROR_NONE;
 
-       _I("Touch is initializing...");
+       if (!model_get_info(pin_num)->opened) {
+               _I("Touch sensor is initializing...");
 
-       info = calloc(1, sizeof(model_touch_sensor_s));
-       retv_if(!info, -1);
-       *peripheral_info = info;
+               ret = peripheral_gpio_open(pin_num, &model_get_info(pin_num)->sensor_h);
+               retv_if(!model_get_info(pin_num)->sensor_h, -1);
 
-       ret = peripheral_gpio_open(gpio_num, &info->gpio);
-       goto_if(ret != 0, error);
-       goto_if(!info->gpio, error);
+               ret = peripheral_gpio_set_direction(model_get_info(pin_num)->sensor_h, PERIPHERAL_GPIO_DIRECTION_IN);
+               retv_if(ret != 0, -1);
 
-       ret = peripheral_gpio_set_direction(info->gpio, PERIPHERAL_GPIO_DIRECTION_IN);
-       goto_if(ret != 0, error);
-
-       return 0;
-
-error:
-       model_fini_touch_sensor(info);
-       free(info);
-       *peripheral_info = NULL;
-       return -1;
-}
-
-int model_read_touch_sensor(void *peripheral_info, int *out_value)
-{
-       model_touch_sensor_s *info = peripheral_info;
-       int ret = 0;
+               model_get_info(pin_num)->opened = 1;
+       }
 
-       ret = peripheral_gpio_read(info->gpio, out_value);
+       ret = peripheral_gpio_read(model_get_info(pin_num)->sensor_h, out_value);
        retv_if(ret < 0, -1);
 
        _I("Touch Sensor Value : %d", *out_value);
index b6f05bf..0d2ae75 100644 (file)
 #include <sys/time.h>
 
 #include "log.h"
+#include "model_internal.h"
 
-struct _model_ultrasonic_s {
-       peripheral_gpio_h trig_gpio;
-       peripheral_gpio_h echo_gpio;
-};
-typedef struct _model_ultrasonic_s model_ultrasonic_s;
-
-void model_fini_ultrasonic_sensor(void *peripheral_info)
+void model_close_ultrasonic_sensor(int echo_pin_num, int trig_pin_num)
 {
-       model_ultrasonic_s *info = peripheral_info;
-
-       ret_if(!info);
-
-       if (info->echo_gpio)
-               peripheral_gpio_close(info->echo_gpio);
-
-       if (info->trig_gpio)
-               peripheral_gpio_close(info->trig_gpio);
-
-       free(info);
-}
-
-int model_init_ultrasonic_sensor(int gpio_num1, int gpio_num2, void **peripheral_info)
-{
-       model_ultrasonic_s *info = NULL;
-       int ret = 0;
-
-       _I("Ultrasonic Sensor is initializing...");
-
-       info = calloc(1, sizeof(model_ultrasonic_s));
-       retv_if(!info, -1);
-       *peripheral_info = info;
-
-       ret = peripheral_gpio_open(gpio_num1, &info->trig_gpio);
-       goto_if(ret != 0, error);
-       goto_if(!info->trig_gpio, error);
-
-       ret = peripheral_gpio_set_direction(info->trig_gpio, PERIPHERAL_GPIO_DIRECTION_OUT);
-       goto_if(ret != 0, error);
+       ret_if(!model_get_info(echo_pin_num)->opened);
+       ret_if(!model_get_info(trig_pin_num)->opened);
 
-       ret = peripheral_gpio_open(gpio_num2, &info->echo_gpio);
-       goto_if(ret != 0, error);
-       goto_if(!info->echo_gpio, error);
+       _I("Ultrasonic sensor is finishing...");
 
-       ret = peripheral_gpio_set_direction(info->echo_gpio, PERIPHERAL_GPIO_DIRECTION_IN);
-       goto_if(ret != 0, error);
+       peripheral_gpio_close(model_get_info(echo_pin_num)->sensor_h);
+       peripheral_gpio_close(model_get_info(trig_pin_num)->sensor_h);
 
-       return 0;
-
-error:
-       model_fini_ultrasonic_sensor(info);
-       free(info);
-       *peripheral_info = NULL;
-       return -1;
+       model_get_info(echo_pin_num)->opened = 0;
+       model_get_info(trig_pin_num)->opened = 0;
 }
 
-static int _get_echo_value(model_ultrasonic_s *info)
+static int _get_echo_value(int echo_pin_num)
 {
        int ret = 0;
        int value = 0;
 
-       ret = peripheral_gpio_read(info->echo_gpio, &value);
+       ret = peripheral_gpio_read(model_get_info(echo_pin_num)->sensor_h, &value);
        retv_if(ret < 0, -1);
 
        return value;
 }
 
-int model_read_ultrasonic_sensor(void *peripheral_info, double *value)
+int model_read_ultrasonic_sensor(int echo_pin_num, int trig_pin_num, double *out_value)
 {
-       model_ultrasonic_s *info = peripheral_info;
        int ret = 0;
        double duration = 0.0;
        struct timeval start_time, end_time, temp_start_time, temp_end_time;
 
-       ret = peripheral_gpio_write(info->trig_gpio, 0);
+       if (!model_get_info(echo_pin_num)->opened) {
+               _I("Ultrasonic sensor is initializing...");
+
+               ret = peripheral_gpio_open(echo_pin_num, &model_get_info(echo_pin_num)->sensor_h);
+               retv_if(!model_get_info(echo_pin_num)->sensor_h, -1);
+
+               ret = peripheral_gpio_set_direction(model_get_info(echo_pin_num)->sensor_h, PERIPHERAL_GPIO_DIRECTION_IN);
+               retv_if(ret != 0, -1);
+
+               model_get_info(echo_pin_num)->opened = 1;
+       }
+
+       if (!model_get_info(trig_pin_num)->opened) {
+               _I("Ultrasonic sensor is initializing...");
+
+               ret = peripheral_gpio_open(trig_pin_num, &model_get_info(trig_pin_num)->sensor_h);
+               retv_if(!model_get_info(trig_pin_num)->sensor_h, -1);
+
+               ret = peripheral_gpio_set_direction(model_get_info(trig_pin_num)->sensor_h, PERIPHERAL_GPIO_DIRECTION_IN);
+               retv_if(ret != 0, -1);
+
+               model_get_info(trig_pin_num)->opened = 1;
+       }
+
+       ret = peripheral_gpio_write(model_get_info(trig_pin_num)->sensor_h, 0);
        retv_if(ret < 0, -1);
 
        sleep(1);
 
-       ret = peripheral_gpio_write(info->trig_gpio, 1);
+       ret = peripheral_gpio_write(model_get_info(trig_pin_num)->sensor_h, 1);
        retv_if(ret < 0, -1);
 
        usleep(10);
 
-       ret = peripheral_gpio_write(info->trig_gpio, 0);
+       ret = peripheral_gpio_write(model_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(info) == 0) {
+       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);
@@ -128,14 +111,16 @@ int model_read_ultrasonic_sensor(void *peripheral_info, double *value)
 
        _D("After checking #1");
 
-       while (_get_echo_value(info) == 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);
-       *value = duration / 2 * 340.0;
+       *out_value = duration / 2 * 340.0;
+
+       _I("Ultrasonic Sensor Value : %f", *out_value);
 
        return 0;
 }