前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android上GNSS Hal服务解析

Android上GNSS Hal服务解析

作者头像
李小白是一只喵
发布2020-06-03 10:50:48
2.7K0
发布2020-06-03 10:50:48
举报
文章被收录于专栏:算法微时光

GPS HAL实现

源码路径:hardware/libhardware/include/hardware/gps.h

gps.h定义了各种常量和信息,包括定位模式、状态等,并同时给JNI层调用的接口。对于GPS的具体实现,需要跟具体的GPS驱动来定,因为某些GPS设备能直接输出所需要的NMEA数据,有的则需要自己实现解析才能得到。

gps.h中重要的结构体解析
  • GpsLocation结构体
代码语言:javascript
复制
typedef struct {
    // set to sizeof(GpsLocation) */
    size_t          size;
    //标志位. */
    uint16_t        flags;
    //维度
    double          latitude;
    //经度
    double          longitude;
    //以WSG 84坐标系统表示高度信息
    double          altitude;
    //速度
    float           speed;
    //方向
    float           bearing;
    //精确度
    float           accuracy;
    //时间戳
    GpsUtcTime      timestamp;
} GpsLocation;

GpsLocation用于表示GPS的定位信息.

  • GpsStatus
代码语言:javascript
复制
typedef struct {
    size_t          size;
    GpsStatusValue status;
} GpsStatus;

GpsStatus表示状态信息

  • GpsSvInfo
代码语言:javascript
复制
typedef struct {
    /** set to sizeof(GpsSvInfo) */
    size_t          size;
    /**伪差分 */
    int     prn;
    /**信噪比 */
    float   snr;
    /**海拔 */
    float   elevation;
    /**方向 */
    float   azimuth;
} GpsSvInfo;

GpsSvInfo表示卫星信息

  • GpsSvStatus
代码语言:javascript
复制
typedef struct {
    /** set to sizeof(GpsSvStatus) */
    size_t size;
    int num_svs;
    GpsSvInfo sv_list[GPS_MAX_SVS];
    uint32_t ephemeris_mask;
    uint32_t almanac_mask;
    uint32_t used_in_fix_mask;
} GpsSvStatus;
  • 重要的结构体GpsInterface
代码语言:javascript
复制
typedef struct {
    //
    size_t          size;
    //初始化GPS时设置回调函数的结构体GpsCallbacks
    int   (*init)( GpsCallbacks* callbacks );
    //开始导航
    int   (*start)( void );
    //停止导航
    int   (*stop)( void );
    //关闭接口
    void  (*cleanup)( void );
    //置入当前时间
    int   (*inject_time)(GpsUtcTime time, int64_t timeReference,int uncertainty);
    //置入位置信息
    int  (*inject_location)(double latitude, double longitude, float accuracy);
    //删除帮助数据
    void  (*delete_aiding_data)(GpsAidingData flags);
    //设置位置模式
    int   (*set_position_mode)(GpsPositionMode mode, GpsPositionRecurrence recurrence,uint32_t min_interval, uint32_t preferred_accuracy, uint32_t preferred_time);
    //得到扩展信息指针
    const void* (*get_extension)(const char* name);
} GpsInterface;
  • GpsCallbacks 初始化函数init被调用的时候,会传入一个GpsCallbacks指针,它是一个包含多个回调函数的结构体
代码语言:javascript
复制
typedef void (* gps_location_callback)(GpsLocation* location);
typedef void (* gps_status_callback)(GpsStatus* status);
typedef void (* gps_sv_status_callback)(GpsSvStatus* sv_info);
typedef void (* gps_nmea_callback)(GpsUtcTime timestamp, const char* nmea, int length);
typedef void (* gps_set_capabilities)(uint32_t capabilities);
typedef void (* gps_acquire_wakelock)();
typedef void (* gps_release_wakelock)();
typedef void (* gps_request_utc_time)();
typedef pthread_t (* gps_create_thread)(const char* name, void (*start)(void *), void* arg);
typedef struct {
    size_t      size;
    gps_location_callback location_cb;
    gps_status_callback status_cb;
    gps_sv_status_callback sv_status_cb;
    gps_nmea_callback nmea_cb;
    gps_set_capabilities set_capabilities_cb;
    gps_acquire_wakelock acquire_wakelock_cb;
    gps_release_wakelock release_wakelock_cb;
    gps_create_thread create_thread_cb;
    gps_request_utc_time request_utc_time_cb;
} GpsCallbacks;

Init函数会注册这些回调函数,当触发某个状态时可以通过该回调函数像JNI层相应函数,JNI在回调到java层,完成数据的回调通知。

  • GpsXtraInterface 它的作用是GPS定义的一个增强,当GPS没有搜索到卫星时候,通过网络下载数据,可以让GPS快速找到当前可以使用的卫星信息.
代码语言:javascript
复制
typedef void (* gps_xtra_download_request)();

typedef pthread_t (* gps_create_thread)(const char* name, void (*start)(void *), void* arg);

typedef struct {
    gps_xtra_download_request download_request_cb;
    gps_create_thread create_thread_cb;
} GpsXtraCallbacks;

typedef struct {
    size_t          size;
    int  (*init)( GpsXtraCallbacks* callbacks );
    //植入XTRA数据到GPS
    int  (*inject_xtra_data)( char* data, int length );
} GpsXtraInterface;

inject_xtra_data函通过网络下载的Xtra数据植入GPS中,同样在init函数中设置回调结构体GpsXtraCallbacks,作为下载Xtra数据的会的回调函数。

  • gps_device_t Gps设备结构体
代码语言:javascript
复制
struct gps_device_t {
    struct hw_device_t common;
    //获取Gps硬件接口
    const GpsInterface* (*get_gps_interface)(struct gps_device_t* dev);

};

实现get_gps_interface方法在gps.c中,去实现查找具体的硬件接口,如果设备没有GPS硬件,可以模拟GPS接口,这样应用程序就不会因为没有硬件支持而挂掉。

GNSS HAL实现

源码路径:/hardware/interfaces/gnss

  • GnssConstellationType
代码语言:javascript
复制
/**
 * 卫星信息
 */

@export(name="", value_prefix="GNSS_CONSTELLATION_")
enum GnssConstellationType : uint8_t {
    UNKNOWN = 0,
    GPS     = 1,
    SBAS    = 2,
    GLONASS = 3,
    QZSS    = 4,
    BEIDOU  = 5,
    GALILEO = 6,
};

针对各种的导航卫星.

  • GnssLocation
代码语言:javascript
复制
/** Represents a location. */
struct GnssLocation {
    /** Contains GnssLocationFlags bits. */
    bitfield<GnssLocationFlags> gnssLocationFlags;

    /** Represents latitude in degrees. */
    double latitudeDegrees;

    /** Represents longitude in degrees. */
    double longitudeDegrees;

    /**
     * Represents altitude in meters above the WGS 84 reference ellipsoid.
     */
    double altitudeMeters;

    /** Represents speed in meters per second. */
    float speedMetersPerSec;

    /** Represents heading in degrees. */
    float bearingDegrees;

    /**
    * Represents expected horizontal position accuracy, radial, in meters
    * (68% confidence).
    */
    float horizontalAccuracyMeters;

    /**
    * Represents expected vertical position accuracy in meters
    * (68% confidence).
    */
    float verticalAccuracyMeters;

    /**
    * Represents expected speed accuracy in meter per seconds
    * (68% confidence).
    */
    float speedAccuracyMetersPerSecond;

    /**
    * Represents expected bearing accuracy in degrees
    * (68% confidence).
    */
    float bearingAccuracyDegrees;

    /** Timestamp for the location fix. */
    GnssUtcTime timestamp;
};

返回到jni层的gps位置信息.

参考

android HAL框架

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • GPS HAL实现
    • gps.h中重要的结构体解析
    • GNSS HAL实现
    • 参考
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档