//加入需要的宏定义

#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)相关推荐

  1. android10蓝牙搜不到ble设备_Android BLE程序在Android 10手机搜不到设备问题分析

    前言 前一阵帮别人做个蓝牙的Android程序,调试的好好的, 用的自己的老手机,android 5.1.8.0的都是好好的能够搜索,但是交付过去,对方的华为p30 Android 10手机就是不行, ...

  2. android设置手机震动强度,android 控制震动强度

    转载文章请注明出处:http://blog.csdn.net/dangxw_/article/details/17957175 android 控制手机震动的类为Vibrator 他所提供的方法只有四 ...

  3. android 自定义textview 垂直滚动,Android中TextView如何实现水平和垂直滚动

    一.只想让TextView显示一行,但是文字超过TextView的长度怎么办? 在开头显示省略号 android:singleLine="true" android:ellipsi ...

  4. 【Android系统】虚拟按键 平板设备中重叠的问题

    问题背景:做的机器是平板,屏是横屏(分辨率是width > height, 1280*720 这种).Android 9源码编译的vbmeta, vendor, system下进去,虚拟按键(b ...

  5. android获取手机a标签,Android获得手机UserAgent的源码

    就在我们使用安卓手机接通Pc的时候,或者使用的有些app比如我们企业营销团队就在使用的app引号精灵,以前老版本就需要开启USB开发者调试模式下使用,现就在新版本不需要了,如果手机没有开启USB开发者 ...

  6. android获取手机资源文件,android MediaStore 读取手机文件

    背景:项目需求,聊天界面需要发送文件.所以,仿qq开发文件组件,以供所有项目使用 目标:记录组件开发中的一次技术积累,与大家分享 前言: 大家可以打开qq,聊天界面底部九宫格中有"文件&qu ...

  7. android 读取手机存储数据恢复,Android智能手机数据恢复方法浅析

    曾琪 罗慧瑜 摘要:根据数据丢失的原因,Android智能手机数据恢复方法分为两大类:物理恢复和软件恢复.物理恢复一般是由于手机进水.摔坏等无法开机情况下的芯片级恢复,而软件恢复则大多因为逻辑损坏.该 ...

  8. 手机银行一 android,工商手机银行 for Android v1.0.1.6 中文官方安装版

    具有优秀的界面和流程设计,工行手机银行是工商银行为Android手机客户量身订制的金融创新产品.它具备三大特征:丰富的产品功能.良好的用户体验和完备的安全监控. android手机银行风格在保持稳重和 ...

  9. android换手机通讯录,神奇Android通讯录3.1互碰手机换名片

    iPhone版QQ通讯录的"对碰换名片"功能备受用户喜爱,Android版QQ通讯录3.1也加入对碰换名片功能,让名片交换更简单:此外,为了让手机好友之间找到网聊的 感觉,该版本还 ...

最新文章

  1. 培养积极状态的八个方法
  2. Android开发:图文分析 Handler通信机制 的工作原理
  3. Linux性能测试 ss命令
  4. 窗体控件绑定泛型数组 0104 c#
  5. 本博客体系系列篇(一)
  6. Git fatal: empty string is not a valid pathspec, please use . instead if you meant to match
  7. flex + tomcat + myEclipse环境配置与使用(四)
  8. php工资条发放源码,如何通过邮箱批量单独发放工资条?(非常详细的图文指导,一看就懂)[腾讯企业邮箱]-腾曦网络...
  9. Xshell6、Xftp6【官方免费版】下载
  10. 虚拟机如何使用计算机中文件,从电脑往虚拟机复制文件如何操作_怎么把电脑上东西复制到虚拟机...
  11. 读懂用户运营体系:用户分层和分群
  12. 学会jQuery 不用买书
  13. debugger位置不对_console / debugger / alter
  14. 动态注册 Module
  15. Basemap绘制地图
  16. 一篇文章让你了解互联网公司的职位架构以及职能
  17. 华为云SNAT 操作(脚本执行)
  18. 时间转换 取模(秒转化成分钟) 65秒转为1分5秒
  19. 博途v17与winCC安装流程与踩坑记录
  20. 朴素贝叶斯的三个常用模型:高斯(GaussianNB)、多项式(multinomial model)、伯努利(Bernoulli model)

热门文章

  1. mint系统用wine打开exe文件
  2. 乐普生物通过聆讯:预计年亏10亿 海通证券与阳光人寿是股东
  3. 使用nginx做负载均衡
  4. KBQA知识总结(学习笔记)
  5. oop 编程是什么?
  6. mysql innodb_large_prefix
  7. XML, XMLHttpRequest
  8. controller实现
  9. C语言解决经典问题约瑟夫环--数组
  10. Verilog流水线CPU设计(超详细)