android陀螺仪手机垂直角度,Android设备中实现陀螺仪(Orientation Sensor)
//加入需要的宏定义
#define ID_BASE SENSORS_HANDLE_BASE
#define ID_ACCELERATION (ID_BASE+0)
#define ID_MAGNETIC_FIELD (ID_BASE+1)
#define ID_ORIENTATION (ID_BASE+2)
#define S_HANDLE_ACCELEROMETER (1<
#define S_HANDLE_MAGNETIC_FIELD (1<
#define S_HANDLE_ORIENTATION (1<
#define SENSORS_NUM 4
#define SUPPORTED_SENSORS ((1<
//在 sensor_t sensors_list[] 中添加两个sensor的信息,
//这些只是一些Sensor的信息,应用程序可以获取到。
#ifdef MAGNETIC_FIELD
{
name : "XXX 3-axis Magnetic field sensor",
vendor : "XXX company",
version : 1,
handle : S_HANDLE_MAGNETIC_FIELD,
type : SENSOR_TYPE_MAGNETIC_FIELD,
maxRange : 600.0f,//最大范围
resolution : 30.0f,//最小分辨率
power : 6.7f,//这个不太懂
},
#endif
#ifdef ORIENTATION
{
name: "XXX Orientation sensor",
vendor: "XXX company",
version: 1,
handle: S_HANDLE_ORIENTATION,
type: SENSOR_TYPE_ORIENTATION,
maxRange: 360,
resolution: 0.1,
power: 20,
},
#endif
//定义一个结构来保存orientation的信息
static struct orientation{
float azimuth;
float pitch;
float roll;
}orientation;
//在 control__open_data_source()函数中打开设备
static native_handle_t*
control__open_data_source(struct sensors_control_device_t *dev)
{
SensorControl* ctl = (void*)dev;
native_handle_t* handle;
int fd_m = open (MAGNETIC_DATA_DEVICE, O_RDONLY);
LOGD ("Open Magnetic Data source: %d, %d/n", fd_m, errno);
if (fd_m>= 0)
{
dev->fd[ID_MAGNETIC_FIELD] = dup(fd_m);
}
return handle;
}
//实现数据的打开和关闭函数
static int
data__data_open(struct sensors_data_device_t *dev, native_handle_t* handle)
{
struct sensors_data_context_t *dev;
dev = (struct sensors_data_context_t *)device;
for(int i=0 ;i
{
dev->fd[i] = dup(handle->data[i]);
}
native_handle_close(handle);
native_handle_delete(handle);
return 0;
}
static int
data__data_close(struct sensors_data_device_t *dev)
{
struct sensors_data_context_t *dev;
dev = (struct sensors_data_context_t *)device;
for(int i=0 ;i
{
if (dev->fd[i] >= 0)
{
close(dev->fd[i]);
}
dev->fd[i] = -1;
}
return 0;
}
//最关键的poll函数
static int
data__poll(struct sensors_data_device_t *dev, sensors_data_t* values)
{
SensorData* data = (void*)dev;
int fd = data->events_fd;
//判断设备是否打开
if(dev->fd[ID_MAGNETIC_FIELD] < 0)
{
LOGD("In %s dev[%d] is not open!/n",__FUNCTION__ ,ID_MAGNETIC_FIELD);
return -1;
}
pollfd pfd[SENSORS_NUM] =
{
//省略其他sensor代码
{
fd: dev->fd[ID_MAGNETIC_FIELD],
events: POLLIN,
revents: 0
},
//省略其他sensor代码
};
int err = poll (pfd, SENSORS_NUM, s_timeout);
unsigned int mask = SUPPORTED_SENSORS;
static unsigned int poll_flag=0;
if(poll_flag==0)
{
poll_flag = mask;
}
//省略其他sensor
if(poll_flag&(1<
{
if((pfd[ID_MAGNETIC_FIELD].revents&POLLIN) == POLLIN)
{
char rawData[6];
err = read (dev->fd[ID_MAGNETIC_FIELD], &rawData, sizeof(rawData));
if(err<0)
{
LOGE("read magnetic field ret:%d errno:%d/n", err, errno);
return err;
}
struct timespec t;
clock_gettime(CLOCK_REALTIME, &t);
data->time = timespec_to_ns(&t);
data->sensor = SENSOR_TYPE_MAGNETIC_FIELD;
data->magnetic.status = SENSOR_STATUS_ACCURACY_HIGH;
//上报的数据单位要转换成 uTesla
data->magnetic.x = ( (rawData[1] << 8 ) | rawData[0])/ MAGNETIC_CONVERT;
data->magnetic.y = ( (rawData[3] << 8 ) | rawData[2])/ MAGNETIC_CONVERT;
data->magnetic.z = ( (rawData[5] << 8 ) | rawData[4])/ MAGNETIC_CONVERT;
//把陀螺仪需要的数据计算出来,用atan2(),头文件要加上#include
float azimuth = atan2( (float)(data->magnetic.x ),(float)(data->magnetic.y) );
if(azimuth<0)
{
azimuth = 360 - fabs(azimuth*180/PI);
}
else
{
azimuth = azimuth*180/PI;
}
orientation.azimuth = 360-azimuth;
//rotation around the X axis.+180~-180 degree
orientation.pitch = atan2( (float)(data->magnetic.y ),(float)(data->magnetic.z)
)*180/PI;
//rotation around the Y axis +90~-90 degree
float roll = atan2( (float)(data->magnetic.x ),(float)(data->magnetic.z) )
*180/PI;
if (roll > 90)
{
roll = -(180.0-roll);
}
else if (roll < -90)
{
roll = 180 + roll;
}
orientation.roll = roll;
}
return S_HANDLE_MAGNETIC_FIELD;
}
if(poll_flag&(1<
{
//数据已经计算好了直接上报就行
struct timespec t;
clock_gettime(CLOCK_REALTIME, &t);
data->time = timespec_to_ns(&t);
data->sensor = SENSOR_TYPE_ORIENTATION;
data->orientation.azimuth = orientation.azimuth;
data->orientation.pitch = orientation.pitch;
data->orientation.roll = orientation.roll;
poll_flag &= ~(1<
return S_HANDLE_ORIENTATION;
}
}
android陀螺仪手机垂直角度,Android设备中实现陀螺仪(Orientation Sensor)相关推荐
- android10蓝牙搜不到ble设备_Android BLE程序在Android 10手机搜不到设备问题分析
前言 前一阵帮别人做个蓝牙的Android程序,调试的好好的, 用的自己的老手机,android 5.1.8.0的都是好好的能够搜索,但是交付过去,对方的华为p30 Android 10手机就是不行, ...
- android设置手机震动强度,android 控制震动强度
转载文章请注明出处:http://blog.csdn.net/dangxw_/article/details/17957175 android 控制手机震动的类为Vibrator 他所提供的方法只有四 ...
- android 自定义textview 垂直滚动,Android中TextView如何实现水平和垂直滚动
一.只想让TextView显示一行,但是文字超过TextView的长度怎么办? 在开头显示省略号 android:singleLine="true" android:ellipsi ...
- 【Android系统】虚拟按键 平板设备中重叠的问题
问题背景:做的机器是平板,屏是横屏(分辨率是width > height, 1280*720 这种).Android 9源码编译的vbmeta, vendor, system下进去,虚拟按键(b ...
- android获取手机a标签,Android获得手机UserAgent的源码
就在我们使用安卓手机接通Pc的时候,或者使用的有些app比如我们企业营销团队就在使用的app引号精灵,以前老版本就需要开启USB开发者调试模式下使用,现就在新版本不需要了,如果手机没有开启USB开发者 ...
- android获取手机资源文件,android MediaStore 读取手机文件
背景:项目需求,聊天界面需要发送文件.所以,仿qq开发文件组件,以供所有项目使用 目标:记录组件开发中的一次技术积累,与大家分享 前言: 大家可以打开qq,聊天界面底部九宫格中有"文件&qu ...
- android 读取手机存储数据恢复,Android智能手机数据恢复方法浅析
曾琪 罗慧瑜 摘要:根据数据丢失的原因,Android智能手机数据恢复方法分为两大类:物理恢复和软件恢复.物理恢复一般是由于手机进水.摔坏等无法开机情况下的芯片级恢复,而软件恢复则大多因为逻辑损坏.该 ...
- 手机银行一 android,工商手机银行 for Android v1.0.1.6 中文官方安装版
具有优秀的界面和流程设计,工行手机银行是工商银行为Android手机客户量身订制的金融创新产品.它具备三大特征:丰富的产品功能.良好的用户体验和完备的安全监控. android手机银行风格在保持稳重和 ...
- android换手机通讯录,神奇Android通讯录3.1互碰手机换名片
iPhone版QQ通讯录的"对碰换名片"功能备受用户喜爱,Android版QQ通讯录3.1也加入对碰换名片功能,让名片交换更简单:此外,为了让手机好友之间找到网聊的 感觉,该版本还 ...
最新文章
- 培养积极状态的八个方法
- Android开发:图文分析 Handler通信机制 的工作原理
- Linux性能测试 ss命令
- 窗体控件绑定泛型数组 0104 c#
- 本博客体系系列篇(一)
- Git fatal: empty string is not a valid pathspec, please use . instead if you meant to match
- flex + tomcat + myEclipse环境配置与使用(四)
- php工资条发放源码,如何通过邮箱批量单独发放工资条?(非常详细的图文指导,一看就懂)[腾讯企业邮箱]-腾曦网络...
- Xshell6、Xftp6【官方免费版】下载
- 虚拟机如何使用计算机中文件,从电脑往虚拟机复制文件如何操作_怎么把电脑上东西复制到虚拟机...
- 读懂用户运营体系:用户分层和分群
- 学会jQuery 不用买书
- debugger位置不对_console / debugger / alter
- 动态注册 Module
- Basemap绘制地图
- 一篇文章让你了解互联网公司的职位架构以及职能
- 华为云SNAT 操作(脚本执行)
- 时间转换 取模(秒转化成分钟) 65秒转为1分5秒
- 博途v17与winCC安装流程与踩坑记录
- 朴素贝叶斯的三个常用模型:高斯(GaussianNB)、多项式(multinomial model)、伯努利(Bernoulli model)