From: junkyu han Date: Wed, 5 Jul 2017 11:51:38 +0000 (+0900) Subject: Example for most simple Tizen IOT Communication API X-Git-Url: http://review.tizen.org/git/?p=apps%2Fnative%2Frcc.git;a=commitdiff_plain;h=198144c15c26b02c60fb8b1268170b59535d41c1 Example for most simple Tizen IOT Communication API Change-Id: I5007b62207a8606351b966882501b8aff6358c3d --- diff --git a/CMakeLists.txt b/CMakeLists.txt index d2c376c..9953f4a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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 diff --git a/inc/model.h b/inc/model.h index bf31673..6cf1869 100644 --- a/inc/model.h +++ b/inc/model.h @@ -22,26 +22,13 @@ #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 -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 index 0000000..19eef2d --- /dev/null +++ b/inc/model/model_illuminance_sensor.h @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved + * + * Contact: Jin Yoon + * Geunsun Lee + * Eunyoung Lee + * Junkyu Han + * + * 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__ */ + diff --git a/inc/model/model_infrared_motion_sensor.h b/inc/model/model_infrared_motion_sensor.h index f0f9c88..fabd14b 100644 --- a/inc/model/model_infrared_motion_sensor.h +++ b/inc/model/model_infrared_motion_sensor.h @@ -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__ */ diff --git a/inc/model/model_infrared_obstacle_avoidance_sensor.h b/inc/model/model_infrared_obstacle_avoidance_sensor.h index 630d5e4..348ca90 100644 --- a/inc/model/model_infrared_obstacle_avoidance_sensor.h +++ b/inc/model/model_infrared_obstacle_avoidance_sensor.h @@ -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__ */ diff --git a/inc/model/model_touch_sensor.h b/inc/model/model_touch_sensor.h index 96f568c..d3f9f53 100644 --- a/inc/model/model_touch_sensor.h +++ b/inc/model/model_touch_sensor.h @@ -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__ */ diff --git a/inc/model/model_ultrasonic_sensor.h b/inc/model/model_ultrasonic_sensor.h index f2717f3..401f37c 100644 --- a/inc/model/model_ultrasonic_sensor.h +++ b/inc/model/model_ultrasonic_sensor.h @@ -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 index 0000000..ea73236 --- /dev/null +++ b/inc/model_internal.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved + * + * Contact: Jin Yoon + * Geunsun Lee + * Eunyoung Lee + * Junkyu Han + * + * 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 + +#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__ */ diff --git a/src/controller.c b/src/controller.c index ca6408b..27c3015 100644 --- a/src/controller.c +++ b/src/controller.c @@ -30,71 +30,69 @@ #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); } diff --git a/src/model.c b/src/model.c index 368f152..f9298a7 100644 --- a/src/model.c +++ b/src/model.c @@ -19,205 +19,12 @@ * limitations under the License. */ -#include -#include #include -#include -#include - -#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 index 0000000..9a0f381 --- /dev/null +++ b/src/model/model_illuminance_sensor.c @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved + * + * Contact: Jin Yoon + * Geunsun Lee + * Eunyoung Lee + * Junkyu Han + * + * 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 +#include +#include +#include + +#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; +} diff --git a/src/model/model_infrared_motion_sensor.c b/src/model/model_infrared_motion_sensor.c index d5ac82c..f606b8a 100644 --- a/src/model/model_infrared_motion_sensor.c +++ b/src/model/model_infrared_motion_sensor.c @@ -25,61 +25,31 @@ #include #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); diff --git a/src/model/model_infrared_obstacle_avoidance_sensor.c b/src/model/model_infrared_obstacle_avoidance_sensor.c index 206c05d..a63ab6a 100644 --- a/src/model/model_infrared_obstacle_avoidance_sensor.c +++ b/src/model/model_infrared_obstacle_avoidance_sensor.c @@ -25,60 +25,32 @@ #include #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); diff --git a/src/model/model_touch_sensor.c b/src/model/model_touch_sensor.c index 538cf09..ba472c5 100644 --- a/src/model/model_touch_sensor.c +++ b/src/model/model_touch_sensor.c @@ -25,59 +25,34 @@ #include #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); diff --git a/src/model/model_ultrasonic_sensor.c b/src/model/model_ultrasonic_sensor.c index b6f05bf..0d2ae75 100644 --- a/src/model/model_ultrasonic_sensor.c +++ b/src/model/model_ultrasonic_sensor.c @@ -25,97 +25,80 @@ #include #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; }