${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
#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__ */
--- /dev/null
+/*
+ * 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__ */
+
#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__ */
#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__ */
#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__ */
#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__ */
--- /dev/null
+/*
+ * 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__ */
#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;
}
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);
}
* 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];
}
--- /dev/null
+/*
+ * 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;
+}
#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);
#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);
#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);
#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);
_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;
}