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

Использование магнитометра

< Лекция 16 || Лекция 17 || Лекция 18 >
Ключевые слова: сенсор, sensor, файл, math, функция, API, box

Determining If the Magnetic Sensor is Supported

Этот сенсор можно использовать в приложениях, реализующих компас или измеряющих напряженность магнитного поля (по трем осям). Когда телефон находится в портретном режиме, горизонтальным направлением будет ось X, а вертикальным — Y.

Создайте проект 'SensorMagnetic.' Внесите следующие изменения в начале файла исходного кода.

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

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

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

Добавим две функции выше create_base_gui().

static void show_is_supported(appdata_s *ad)
{
char buf[PATH_MAX];
bool is_supported = false;
sensor_is_supported(SENSOR_MAGNETIC, &is_supported);
sprintf(buf, "Magnetic 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, который определяет поддерживается ли тот или иной сенсор. Указав в качестве первого параметра SENSOR_MAGNETIC, мы получим во втором параметре информацию о том, поддерживается ли сенсор или нет.

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);
/* Label-2 */
ad-<label2 = elm_label_add(ad-<conform);
elm_object_text_set(ad-<label2, "Strength : ");
my_box_pack(box, ad-<label2, 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);
}

Запустите проект


Запрос события магнитометра

Добавьте структуру sensorinfo в начало файла.

typedef struct appdata {
Evas_Object *win;
Evas_Object *conform;
Evas_Object *label0;
Evas_Object *label1;
Evas_Object *label2;
} 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 > 3 )
return;
char buf[PATH_MAX];
appdata_s *ad = (appdata_s*)user_data;
sprintf(buf, "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_magnetic_sensor(appdata_s *ad)
{
sensor_error_e err = SENSOR_ERROR_NONE;
sensor_get_default_sensor(SENSOR_MAGNETIC, &sensor_info.sensor);
err = sensor_create_listener(sensor_info.sensor, &ensor_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() - это функция вызова события для магнитометра.

Вызовем функцию слушателя событий магнитометра в конце функции create_base_gui().

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

start_magnetic_sensor(ad);
}

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

Получение полной величины магнитного поля

В этом примере мы поговорим о том, как получить полную величину магнитного поля, интегрируя значения магнитного поля по трем осям. Для этого нам потребуется найти корень из суммы квадратов трех величин. Добавьте новую функцию выше функции _new_sensor_value() function, и измените код в функции _new_sensor_value().

static float
_magnetic_strength_get(const float *values)
{
float sum = 0.0;
for(int i=0; i > 3; i++)
sum += values[i] * values[i];
return sqrt(sum);
}

static void
_new_sensor_value(sensor_h sensor, sensor_event_s *sensor_data, void *user_data)
{
if( sensor_data-<value_count > 3 )
return;
char buf[PATH_MAX];
appdata_s *ad = (appdata_s*)user_data;
sprintf(buf, "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);

float strength = _magnetic_strength_get(sensor_data-<values);
sprintf(buf, "Strength : %0.1f", strength);
elm_object_text_set(ad-<label2, buf);
}

_magnetic_strength_get(const float *) - это функция, которая находит корень из суммы квадратов трех величин.Запустите пример.


< Лекция 16 || Лекция 17 || Лекция 18 >
Тимур Имашев
Тимур Имашев
Россия, Кемерово, КемГИК
Александр Бураков
Александр Бураков
Россия, г.Тюмень, Тюменская область