Использование магнитометра
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 *) - это функция, которая находит корень из суммы квадратов трех величин.Запустите пример.