Опубликован: 22.12.2015 | Уровень: для всех | Доступ: платный
Лекция 14:

Использование датчика ускорения

< Лекция 13 || Лекция 14 || Лекция 15 >

Определение того, поддерживается ли детектор ускорения

С помощью датчика ускорения можно измерять встряхивание телефона в направлении осей X-, Y-, и Z.

Создайте новый проект ‘SensorAcceleration.’ Добавьте изменения в файл исходного кода.

#include "sensoracceleration.h"
#include <sensor.h>
typedef struct appdata {
Evas_Object *win;
Evas_Object *conform;
Evas_Object *label0;
Evas_Object *label1;
Evas_Object *label2;
} appdata_s;

sensor.h — это файл заголовка с различными сенсорными библиотеками

Добавьте код выше create_base_gui()

static void show_is_supported(appdata_s *ad)
{
char buf[PATH_MAX];
bool is_supported = false;
sensor_is_supported(SENSOR_ACCELEROMETER, &is_supported);
sprintf(buf, "Acceleration 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() определяет поддерживается ли детектор ускорения. Результат отображается в метке.

sensor_is_supported(sensor_type_e, bool *) - это API, который запрашивает поддерживается ли детектор ускорения.

my_box_pack() - это функция, которая добавляет контролы к контейнеру Box.

Добавьте код к функции 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, 0.0, -1.0, 0.0);
}
}

/* Show window after base gui is set up */
evas_object_show(ad>win);

show_is_supported(ad);
}

Мы добавили две метки. Кроме того, ы подключили функцию, которая определяет поддерживается ли сенсор. Запустите пример.


Запрос событий для сенсора ускорения

Далее, мы реализуем функцию запроса соответствующего события, когда мы трясем телефоном. Добавьте структуру и глобальную переменную в начало файла исходного кода.

#include "sensoracceleration.h"
#include <sensor.h>

typedef struct
{
sensor_h sensor;
/**< Sensor handle */
sensor_listener_h sensor_listener;
} sensorinfo;

typedef struct appdata {
Evas_Object *win;
Evas_Object *conform;
Evas_Object *label0;
Evas_Object *label1;
Evas_Object *label2;

sensorinfo sensor_info;
} appdata_s;

sensorinfo — это структура, которая включает в себя тип сенсорного объекта и переменную слушателя события.

sensor_info — это глобальная переменная структуры sensorinfo.

Для запроса сенсорного события запускается слушатель. Мы запросим событие сенсора ускорения с помощью объекта sensor и слушателя события. создайте две новые функции выше create_base_gui().

static void
_new_sensor_value(sensor_h sensor, sensor_event_s *sensor_data, void *user_data)
{
appdata_s *ad = user_data;
char buf[1024];
if (sensor_data->value_count < 3)
{
elm_object_text_set(ad->label2, "Gathering data...");
return;
}
snprintf(buf, sizeof(buf), "Value - X : %0.1f / Y : %0.1f / Z : %0.1f", sensor_data->values[0], sensor_data->values[1], sensor_data->values[2]);
elm_object_text_set(ad->label1, buf);
}

static void
start_acceleration_sensor(appdata_s *ad)
{
sensor_error_e err = SENSOR_ERROR_NONE;
err = sensor_get_default_sensor(SENSOR_ACCELEROMETER, &ad->sensor_info.sensor);
if (err != SENSOR_ERROR_NONE)
goto error_check;
err = sensor_create_listener(ad->sensor_info.sensor, &ad->sensor_info.sensor_listener);
if (err != SENSOR_ERROR_NONE)
goto error_check;
sensor_listener_set_event_cb(ad->sensor_info.sensor_listener, 100, _new_sensor_value, ad);
sensor_listener_start(ad->sensor_info.sensor_listener);
error_check:
if (err != SENSOR_ERROR_NONE)
{
const char *msg;
char fullmsg[1024];
switch (err)
{
case SENSOR_ERROR_IO_ERROR: msg = "I/O error"; break;
case SENSOR_ERROR_INVALID_PARAMETER: msg = "Invalid parameter"; break;
case SENSOR_ERROR_NOT_SUPPORTED: msg = "The sensor type is not supported in the current device"; break;
case SENSOR_ERROR_PERMISSION_DENIED: msg = "Permission denied"; break;
case SENSOR_ERROR_OUT_OF_MEMORY: msg = "Out of memory"; break;
case SENSOR_ERROR_NOT_NEED_CALIBRATION: msg = "Sensor doesn't need calibration"; break;
case SENSOR_ERROR_OPERATION_FAILED: msg = "Operation failed"; break;
default: msg = "Unknown error"; break;
}
snprintf(fullmsg, sizeof(fullmsg), "<align=center>An error occurred:<br/>%s</>", msg);
elm_object_text_set(ad->label1, "No data");
elm_object_text_set(ad->label2, fullmsg);
}
}

_new_sensor_value() - это функция вызова события для сенсора ускорения. Выводим значение сенсора на экран. Сенсорные данные передаются второму параметру.

Введите строчку в конце функции create_base_gui().

/* Show window after base gui is set up */
evas_object_show(ad->win);
show_is_supported(ad);
start_acceleration_sensor(ad);
}

Запустите пример. Откройте панель управления в эмуляторе.

< Лекция 13 || Лекция 14 || Лекция 15 >