免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 765 | 回复: 0
打印 上一主题 下一主题

GPS 研究一 (Android2.3) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-20 09:44 |只看该作者 |倒序浏览
(红字表示2.3的变化)
Framework:
1.frameworks/base/location/java/android/location
这里主要是用来被App调用的,API包是android.location。
2.frameworks/base/location/java/com/android/internal/location
这个目录是Framework对Location服务的内部实现。
3.framework\services\java\com\android\server
这个目录只有一个文件
|-- LocationManagerService.java
是Location服务对内部实现的一种封装。
JNI:
2.2
frameworks/base/core/jni/android_location_GpsLocationProvider.cpp
2.3
/framework/base/services/jni/com_android_server_location_GpsLocationProvider.cpp

JNI层只有一个文件,起到承上启下的作用。上层承接Framework,下层调用HAL层具体硬件抽象实现。
HAL:Hardware Abstract Layer 硬件抽象层
hardware\libhardware_legacy\gps
hardware\libhardware_legacy\include\hardware_legacy\gps.h
HAL层相当于一个linux应用程序接口,通过open,close等操作,操作硬件设备。Android的源代码只实现了模拟器的gps接口,具体在文件gps_qemu.c中。在2.2版本中提供了对QCOM公司的gps的实现,在以下目录:
\hardware\qcom
下面介绍几个重要的数据结构:

1. GpsInterface接口是gps模块中最重要的数据结构,它是底层驱动实现的接口,如果要porting到自己的板子上,就需要实现这些接口。该接口的定义在gps.h中,模拟器实现在gps_qemu.c中
  1. /** Represents the standard GPS interface. */  
  2. typedef struct {  
  3.     /** set to sizeof(GpsInterface) */  
  4.     size_t          size;  
  5.     /** 
  6.      * Opens the interface and provides the callback routines 
  7.      * to the implemenation of this interface. 
  8.      */  
  9.     int   (*init)( GpsCallbacks* callbacks );  
  10.   
  11.     /** Starts navigating. */  
  12.     int   (*start)( void );  
  13.   
  14.     /** Stops navigating. */  
  15.     int   (*stop)( void );  
  16.   
  17.     /** Closes the interface. */  
  18.     void  (*cleanup)( void );  
  19.   
  20.     /** Injects the current time. */  
  21.     int   (*inject_time)(GpsUtcTime time, int64_t timeReference,  
  22.                          int uncertainty);  
  23.   
  24.     /** Injects current location from another location provider 
  25.      *  (typically cell ID). 
  26.      *  latitude and longitude are measured in degrees 
  27.      *  expected accuracy is measured in meters 
  28.      */  
  29.     int  (*inject_location)(double latitude, double longitude, float accuracy);  
  30.   
  31.     /** 
  32.      * Specifies that the next call to start will not use the 
  33.      * information defined in the flags. GPS_DELETE_ALL is passed for 
  34.      * a cold start. 
  35.      */  
  36.     void  (*delete_aiding_data)(GpsAidingData flags);  
  37.   
  38.     /** 
  39.      * min_interval represents the time between fixes in milliseconds. 
  40.      * preferred_accuracy represents the requested fix accuracy in meters. 
  41.      * preferred_time represents the requested time to first fix in milliseconds. 
  42.      */  
  43.     int   (*set_position_mode)(GpsPositionMode mode, GpsPositionRecurrence recurrence,  
  44.             uint32_t min_interval, uint32_t preferred_accuracy, uint32_t preferred_time);  
  45.   
  46.     /** Get a pointer to extension information. */  
  47.     const void* (*get_extension)(const char* name);  
  48. } GpsInterface;  
2.GpsCallbacks回调函数 这个是回调函数结构体,定义也在gps.h中。它们的实现是在com_android_server_location_GpsLocationProvider.cpp中,google已经实现了,我们不需要做任何动作。 2.2
  1. /** GPS callback structure. */  
  2. typedef struct {  
  3.     /** set to sizeof(GpsCallbacks) */  
  4.     size_t      size;  
  5.     gps_location_callback location_cb;  
  6.     gps_status_callback status_cb;  
  7.     gps_sv_status_callback sv_status_cb;  
  8.     gps_nmea_callback nmea_cb;  
  9. } GpsCallbacks;  
2.3 中 多加入了 以下几个回调函数

  1. gps_set_capabilities set_capabilities_cb;  
  2. gps_acquire_wakelock acquire_wakelock_cb;  
  3. gps_release_wakelock release_wakelock_cb;  
  4. gps_create_thread create_thread_cb;  

 

3. GpsLocation 表示Locatin数据信息,底层驱动获得Location的raw信息,通常是nmea码,然后通过解析就得到了location信息。 其中Android2.3比android2.2多加入了 size 属性 以获取其大小。
  1. /** Represents a location. */  
  2. typedef struct {  
  3.     /** set to sizeof(GpsLocation) */  
  4.     size_t          size;  
  5.     /** Contains GpsLocationFlags bits. */  
  6.     uint16_t        flags;  
  7.     /** Represents latitude in degrees. */  
  8.     double          latitude;  
  9.     /** Represents longitude in degrees. */  
  10.     double          longitude;  
  11.     /** Represents altitude in meters above the WGS 84 reference 
  12.      * ellipsoid. */  
  13.     double          altitude;  
  14.     /** Represents speed in meters per second. */  
  15.     float           speed;  
  16.     /** Represents heading in degrees. */  
  17.     float           bearing;  
  18.     /** Represents expected accuracy in meters. */  
  19.     float           accuracy;  
  20.     /** Timestamp for the location fix. */  
  21.     GpsUtcTime      timestamp;  
  22. } GpsLocation;  
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP