Использование датчика близости
Проверим поддерживается ли датчик близости
Когда звонит телефон, и вы подносите телефон близко к вашему лицу, экран телефона отключается. Эта пример работы датчика близости. Используйте панель управления для проверки датчика близости в эмуляторе.
Создайте новый проект 'SensorProximity.' введите следующие изменения в файл исходного кода.
#include "sensorproximity.h" #include <sensor.h> typedef struct appdata { Evas_Object *win; Evas_Object *conform; Evas_Object *label0; Evas_Object *label1; } appdata_s;
Добавьте две функции выше функции create_base_gui().
static void show_is_supported(appdata_s *ad) { char buf[PATH_MAX]; bool is_supported = false; sensor_is_supported(SENSOR_PROXIMITY, amp;is_supported); sprintf(buf, "Proximity Sensor is %s", is_supported ? "support" : "not support"); elm_object_text_set(ad->label0, buf); } static void my_box_pack(Evas_Object *box, Evas_Object *child, double h_weight, double v_weight, double h_align, double v_align) { /* create a frame we shall use as padding around the child widget */ Evas_Object *frame = elm_frame_add(box); /* use the medium padding style. there is "pad_small", "pad_medium", * "pad_large" and "pad_huge" available as styles in addition to the * "default" frame style */ elm_object_style_set(frame, "pad_medium"); /* set the input weight/aling on the frame insted of the child */ evas_object_size_hint_weight_set(frame, h_weight, v_weight); evas_object_size_hint_align_set(frame, h_align, v_align); { /* tell the child that is packed into the frame to be able to expand */ evas_object_size_hint_weight_set(child, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); /* fill the expanded area (above) as opposaed to center in it */ evas_object_size_hint_align_set(child, EVAS_HINT_FILL, EVAS_HINT_FILL); /* actually put the child in the frame and show it */ evas_object_show(child); elm_object_content_set(frame, child); } /* put the frame into the box instead of the child directly */ elm_box_pack_end(box, frame); /* show the frame */ evas_object_show(frame); }
show_is_supported() - эта функция, которая определяет поддерживается ли устройство и выводит информацию в метку.
Нам нужно вызвать функцию show_is_supported() при запуске приложения. Для этого добавим следующий код в функцию create_base_gui().
/* Conformant */ ad->conform = elm_conformant_add(ad->win); elm_win_indicator_mode_set(ad->win, ELM_WIN_INDICATOR_SHOW); elm_win_indicator_opacity_set(ad->win, ELM_WIN_INDICATOR_OPAQUE); evas_object_size_hint_weight_set(ad->conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_win_resize_object_add(ad->win, ad->conform); evas_object_show(ad->conform); { /* child object - indent to how relationship */ Evas_Object * box, *btn; /* A box to put things in verticallly - default mode for box */ box = elm_box_add(ad->win); evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_object_content_set(ad->conform, box); evas_object_show(box); { /* child object - indent to how relationship */ /* Label-0 */ ad->label0 = elm_label_add(ad->conform); elm_object_text_set(ad->label0, "Msg - "); my_box_pack(box, ad->label0, 1.0, 0.0, -1.0, 0.0); /* Label-1 */ ad->label1 = elm_label_add(ad->conform); elm_object_text_set(ad->label1, "Value - "); my_box_pack(box, ad->label1, 1.0, 1.0, -1.0, 0.0); } } /* Show window after base gui is set up */ evas_object_show(ad->win); show_is_supported(ad); }
Запустите проект. Убедитесь в том, что в метке выводится сообщение 'Proximity Sensor is supported.'
Запрос события сенсора близости
Далее, мы реализуем возможность отображать значение расстояния на экране, когда детектор близости обнаружит объект. Добавьте структуру, связанную с сенсором, в начало файла.
typedef struct appdata { Evas_Object *win; Evas_Object *conform; Evas_Object *label0; Evas_Object *label1; } appdata_s; typedef struct _sensor_info { sensor_h sensor; /**< Sensor handle */ sensor_listener_h sensor_listener; } sensorinfo; static sensorinfo sensor_info;
Добавьте две функции выше create_base_gui().
static void _new_sensor_value(sensor_h sensor, sensor_event_s *sensor_data, void *user_data) { if( sensor_data->value_count < 1 ) return; char buf[PATH_MAX]; appdata_s *ad = (appdata_s*)user_data; sprintf(buf, "Distance : %0.1f", sensor_data->values[0]); elm_object_text_set(ad->label1, buf); } static void start_proximity_sensor(appdata_s *ad) { sensor_error_e err = SENSOR_ERROR_NONE; sensor_get_default_sensor(SENSOR_PROXIMITY, amp;sensor_info.sensor); err = sensor_create_listener(sensor_info.sensor, amp;sensor_info.sensor_listener); sensor_listener_set_event_cb(sensor_info.sensor_listener, 100, _new_sensor_value, ad); sensor_listener_start(sensor_info.sensor_listener); }
_new_sensor_value() - это функция вызова собыия сенсора близости.
sensor_listener_start(sensor_listener_h) - это API, запускающее слушатель. Сделаем так, чтобы слушатель событий сенсора детектора близости запускался автоматически. Добавьте функцию выше create_base_gui() function.
/* Show window after base gui is set up */ evas_object_show(ad->win); show_is_supported(ad); start_proximity_sensor(ad); }
Запустите пример. Отрегулируйте расстояние до объекта в панели управления эмулятора.