From 083c892247f6031183647b23e2e3eeabb5d16156 Mon Sep 17 00:00:00 2001 From: Jinhyung Choi Date: Fri, 27 Jun 2014 23:00:31 +0900 Subject: [PATCH] sensor: added rotation vector device Change-Id: If2beb2e08eeaf7acb3835ac626669f3f596ef4eb Signed-off-by: Jinhyung Choi --- tizen/src/hw/maru_virtio_sensor.c | 46 +++++++++++++++++++++++++++-- tizen/src/hw/maru_virtio_sensor.h | 24 +++++++++++---- tizen/src/skin/maruskin_operation.c | 28 ++++++++++++++++++ 3 files changed, 89 insertions(+), 9 deletions(-) diff --git a/tizen/src/hw/maru_virtio_sensor.c b/tizen/src/hw/maru_virtio_sensor.c index a45716fe08..1153ff893b 100644 --- a/tizen/src/hw/maru_virtio_sensor.c +++ b/tizen/src/hw/maru_virtio_sensor.c @@ -27,8 +27,6 @@ * */ -#include - #include "hw/pci/pci.h" #include "maru_device_ids.h" @@ -40,13 +38,14 @@ MULTI_DEBUG_CHANNEL(qemu, virtio-sensor); #define SENSOR_DEVICE_NAME "sensor" #define _MAX_BUF 1024 -#define __MAX_BUF_SENSOR 32 +#define __MAX_BUF_SENSOR 128 static QemuMutex accel_mutex; static QemuMutex geo_mutex; static QemuMutex gyro_mutex; static QemuMutex light_mutex; static QemuMutex proxi_mutex; +static QemuMutex rot_mutex; static char accel_xyz [__MAX_BUF_SENSOR] = {'0',',','9','8','0','6','6','5',',','0'}; static int accel_enable = 0; @@ -72,6 +71,10 @@ static int proxi_vo = 8; static int proxi_enable = 0; static int proxi_delay = 200000000; +static char rot_quad [__MAX_BUF_SENSOR] = {'2','3','6','2',',','-','1','4','0',',','-','8','4','7','0',',','9','9','9','9','6','1',',','4', 0}; +static int rot_enable = 0; +static int rot_delay = 200000000; + VirtIOSENSOR* vsensor; static int sensor_capability = 0; @@ -102,6 +105,9 @@ static type_action get_action(enum sensor_types type) case sensor_type_proxi: action = ACTION_PROXI; break; + case sensor_type_rotation_vector: + action = ACTION_ROTATION; + break; default: break; } @@ -236,6 +242,21 @@ static void __set_sensor_data (enum sensor_types type, char* data, int len) sscanf(data, "%d", &proxi_delay); qemu_mutex_unlock(&proxi_mutex); break; + case sensor_type_rotation_vector: + qemu_mutex_lock(&rot_mutex); + strcpy(rot_quad, data); + qemu_mutex_unlock(&rot_mutex); + break; + case sensor_type_rotation_vector_enable: + qemu_mutex_lock(&rot_mutex); + sscanf(data, "%d", &rot_enable); + qemu_mutex_unlock(&rot_mutex); + break; + case sensor_type_rotation_vector_delay: + qemu_mutex_lock(&rot_mutex); + sscanf(data, "%d", &rot_delay); + qemu_mutex_unlock(&rot_mutex); + break; case sensor_type_mag: qemu_mutex_lock(&geo_mutex); strcpy(geo_tesla, data); @@ -372,6 +393,21 @@ static void __get_sensor_data(enum sensor_types type, char* msg_info) sprintf(msg_info, "%d", proxi_delay); qemu_mutex_unlock(&proxi_mutex); break; + case sensor_type_rotation_vector: + qemu_mutex_lock(&rot_mutex); + strcpy(msg_info, rot_quad); + qemu_mutex_unlock(&rot_mutex); + break; + case sensor_type_rotation_vector_enable: + qemu_mutex_lock(&rot_mutex); + sprintf(msg_info, "%d", rot_enable); + qemu_mutex_unlock(&rot_mutex); + break; + case sensor_type_rotation_vector_delay: + qemu_mutex_lock(&rot_mutex); + sprintf(msg_info, "%d", rot_delay); + qemu_mutex_unlock(&rot_mutex); + break; default: return; } @@ -480,6 +516,8 @@ static int set_capability(char* sensor) return sensor_cap_light; } else if (!strncmp(sensor, SENSOR_NAME_PROXI, 5)) { return sensor_cap_proxi; + } else if (!strncmp(sensor, SENSOR_NAME_ROT, 3)) { + return sensor_cap_rotation_vector; } else if (!strncmp(sensor, SENSOR_NAME_HAPTIC, 6)) { return sensor_cap_haptic; } else { @@ -528,6 +566,7 @@ static void virtio_sensor_realize(DeviceState *dev, Error **errp) qemu_mutex_init(&geo_mutex); qemu_mutex_init(&light_mutex); qemu_mutex_init(&proxi_mutex); + qemu_mutex_init(&rot_mutex); vsensor->vq = virtio_add_queue(&vsensor->vdev, 64, virtio_sensor_vq); @@ -548,6 +587,7 @@ static void virtio_sensor_unrealize(DeviceState *dev, Error **errp) qemu_mutex_destroy(&geo_mutex); qemu_mutex_destroy(&light_mutex); qemu_mutex_destroy(&proxi_mutex); + qemu_mutex_destroy(&rot_mutex); virtio_cleanup(vdev); } diff --git a/tizen/src/hw/maru_virtio_sensor.h b/tizen/src/hw/maru_virtio_sensor.h index 382c0c48ea..7912eb0fdb 100644 --- a/tizen/src/hw/maru_virtio_sensor.h +++ b/tizen/src/hw/maru_virtio_sensor.h @@ -64,18 +64,22 @@ enum sensor_types { sensor_type_proxi, sensor_type_proxi_enable, sensor_type_proxi_delay, + sensor_type_rotation_vector, + sensor_type_rotation_vector_enable, + sensor_type_rotation_vector_delay, sensor_type_mag, sensor_type_tilt, sensor_type_max }; enum sensor_capabilities { - sensor_cap_accel = 0x01, - sensor_cap_geo = 0x02, - sensor_cap_gyro = 0x04, - sensor_cap_light = 0x08, - sensor_cap_proxi = 0x10, - sensor_cap_haptic = 0x20 + sensor_cap_accel = 0x01, + sensor_cap_geo = 0x02, + sensor_cap_gyro = 0x04, + sensor_cap_light = 0x08, + sensor_cap_proxi = 0x10, + sensor_cap_rotation_vector = 0x20, + sensor_cap_haptic = 0x40 }; #define MESSAGE_TYPE_SENSOR "sensor" @@ -87,6 +91,7 @@ enum sensor_capabilities { #define ACTION_MAG 112 #define ACTION_LIGHT 113 #define ACTION_PROXI 114 +#define ACTION_ROTATION 115 #define ATTRIBUTE_NAME_SENSORS "sensors" @@ -95,6 +100,7 @@ enum sensor_capabilities { #define SENSOR_NAME_GEO "geo" #define SENSOR_NAME_LIGHT "light" #define SENSOR_NAME_PROXI "proxi" +#define SENSOR_NAME_ROT "rot" #define SENSOR_NAME_HAPTIC "haptic" #define SENSOR_CAP_TOKEN "&" @@ -128,6 +134,9 @@ void req_sensor_data(enum sensor_types type, enum request_cmd req, char* data, i #define get_sensor_proxi() \ req_sensor_data(sensor_type_proxi, request_get, NULL, 0); +#define get_sensor_rotation() \ + req_sensor_data(sensor_type_rotation_vector, request_get, NULL, 0); + #define set_sensor_accel(data, len) \ req_sensor_data(sensor_type_accel, request_set, data, len); @@ -146,6 +155,9 @@ void req_sensor_data(enum sensor_types type, enum request_cmd req, char* data, i #define set_sensor_mag(data, len) \ req_sensor_data(sensor_type_mag, request_set, data, len); +#define set_sensor_rotation_vector(data, len) \ + req_sensor_data(sensor_type_rotation_vector, request_set, data, len); + #ifdef __cplusplus } #endif diff --git a/tizen/src/skin/maruskin_operation.c b/tizen/src/skin/maruskin_operation.c index b97a9bf87d..50d9851400 100644 --- a/tizen/src/skin/maruskin_operation.c +++ b/tizen/src/skin/maruskin_operation.c @@ -40,6 +40,7 @@ #include "hw/maru_brightness.h" #include "hw/maru_virtio_hwkey.h" #include "hw/maru_virtio_touchscreen.h" +#include "hw/maru_virtio_sensor.h" #include "maru_display.h" #include "emulator.h" #include "debug_ch.h" @@ -316,6 +317,33 @@ void do_scale_event(double scale_factor) void do_rotation_event(int rotation_type) { INFO("do_rotation_event rotation_type : %d\n", rotation_type); +#if 1 + char *rotation; + + static char rot_0 [] = {'2','3','6','2',',','-','1','4','0',',','-','8','4','7','0',',','9','9','9','9','6','1',',','4', 0}; + static char rot_90 [] = {'-','9','9','4',',','-','4','2','0','8',',','-','7','0','3','2','1','1',',','9','1','8','2','7','9',',','4', 0}; + static char rot_180 [] = {'1','6','2','2',',','5','6','5','8',',','9','9','9','9','4','5',',','8','6','2','6',',','4', 0}; + static char rot_270 [] = {'1','4','1','6','8',',','1','6','0','4','6',',','7','0','9','8','6','0',',','7','0','4','0','1','6',',','4', 0}; + + switch (rotation_type) { + case ROTATION_PORTRAIT: + rotation = rot_0; + break; + case ROTATION_LANDSCAPE: + rotation = rot_90; + break; + case ROTATION_REVERSE_PORTRAIT: + rotation = rot_180; + break; + case ROTATION_REVERSE_LANDSCAPE: + rotation = rot_270; + break; + default: + return; + } + + set_sensor_rotation_vector(rotation, strlen(rotation)); +#endif #if 1 int x = 0, y = 0, z = 0; -- 2.34.1