GPS北斗双模技术应用开发研究—数据结构扩展

 GPS北斗双模技术应用开发研究—数据结构扩展

 

          还是从gps.h头文件入手,首先 GpsSvStatus结构体需要改造,GpsSvStatus当时设计的时候是考虑存储gps卫星信息的,但是我们现在是要存储双模的数据,因此我们需要扩展这个数据结构,那怎么扩展呢?

  当然要代价小一点,不能完全推倒重来的,笔者想到的就是增加一个北斗卫星数量的变量,以及北斗的epemeris、almanac、还有一个定位的mask,以前数据结构里面的成员全部用着gps存储,这样就相互独立了,但是sv_list笔者就偷懒共用了,只是把这个数组扩大一倍,后半部分存储北斗卫星信息,这样的话第一步就算完成了。基本如下:

 /** Maximum number of SVs for gps_sv_status_callback(). */
-#define GPS_MAX_SVS 32
+#define GPS_MAX_SVS 64

 /** Requested operational mode for GPS operation. */
 typedef uint32_t GpsPositionMode;
@@ -306,6 +306,25 @@ typedef struct {
      * were used for computing the most recent position fix.
      */
     uint32_t    used_in_fix_mask;
+
+       /** Number of  bd SVs currently visible. */
+    int         bd_num_svs;
+
+    /** Represents a bit mask indicating which SVs
+     * have ephemeris data.
+     */
+    uint32_t    bd_ephemeris_mask;
+
+    /** Represents a bit mask indicating which SVs
+     * have almanac data.
+     */
+    uint32_t    bd_almanac_mask;
+
+    /**
+     * Represents a bit mask indicating which SVs
+     * were used for computing the most recent position fix.
+     */
+    uint32_t    bd_used_in_fix_mask;
 } GpsSvStatus;

        解析本身的难度不大,依葫芦画瓢罢了,都是固定的。那就看一下GSV怎么解析的吧!如下:

if ( !memcmp(tok.p, "GSV", 3) ) {
        int noSatellites;
        Token  satellite_to_view;

		is_beidou = !memcmp(ptr, "BD", 2);
        satellite_to_view = nmea_tokenizer_get(tzer, 3);
        noSatellites = str2int(satellite_to_view.p, satellite_to_view.end);
        ALOGV(">>>is_beidou (%d) GSV satellite_to_view=%d", is_beidou, noSatellites);
        if (noSatellites > 0 ) { //tmp
            int sentence, totalSentences, curr, i, bd_cur;
            Token  num_of_msg;
            Token  no;
            num_of_msg    = nmea_tokenizer_get(tzer, 1);
            no            = nmea_tokenizer_get(tzer, 2);

            sentence = str2int(no.p, no.end);
            totalSentences = str2int(num_of_msg.p, num_of_msg.end);
            D(">>>gsv_index=%d,gsv_total=%d",sentence, totalSentences);

            if (sentence == 1 && !is_beidou) {
                r->sv_status.num_svs = 0;
                r->sv_status.ephemeris_mask = 0ul;
                r->sv_status.almanac_mask = 0ul;
                r->sv_status.bd_num_svs= 0;
                r->sv_status.bd_ephemeris_mask= 0ul;
                r->sv_status.bd_almanac_mask= 0ul;
			}

            curr = r->sv_status.num_svs;
			bd_cur = r->sv_status.bd_num_svs + 32;
            i = 0;

            while (i < 4 && (r->sv_status.num_svs < noSatellites ||
				               (is_beidou && r->sv_status.bd_num_svs < noSatellites))) {
                int prn;
                Token    tok_prn = nmea_tokenizer_get(tzer, i * 4 + 4);
                Token    tok_elevation = nmea_tokenizer_get(tzer, i * 4 + 5);
                Token    tok_azimuth = nmea_tokenizer_get(tzer, i * 4 + 6);
                Token    tok_snr = nmea_tokenizer_get(tzer, i * 4 + 7);

                prn = str2int(tok_prn.p, tok_prn.end);
                if (prn <= 0) { i += 1; continue; }

                if(is_beidou) {
				    if(prn > 400)
					    prn -= 400;//M8 BD base 400

					r->sv_status.sv_list[bd_cur].prn = prn;

					r->sv_status.sv_list[bd_cur].elevation = str2float(tok_elevation.p, tok_elevation.end);
					r->sv_status.sv_list[bd_cur].azimuth = str2float(tok_azimuth.p, tok_azimuth.end);
					r->sv_status.sv_list[bd_cur].snr = str2float(tok_snr.p, tok_snr.end);
					r->sv_status.bd_ephemeris_mask|= (1ul << (prn-1));
					r->sv_status.bd_almanac_mask|= (1ul << (prn-1));

					r->sv_status.bd_num_svs+= 1;// bd num
	                r->sv_status.num_svs += 1;//total num
	                if(r->sv_status.sv_list[bd_cur].snr > 0)
                       ALOGV("**bd_cur=%d num_svs:%d prn:%d snr=%f\n", bd_cur, r->sv_status.num_svs,
                                r->sv_status.sv_list[bd_cur].prn,r->sv_status.sv_list[bd_cur].snr);
                    bd_cur += 1;

                } else {
	                r->sv_status.sv_list[curr].prn = prn;

	                r->sv_status.sv_list[curr].elevation = str2float(tok_elevation.p, tok_elevation.end);
	                r->sv_status.sv_list[curr].azimuth = str2float(tok_azimuth.p, tok_azimuth.end);
	                r->sv_status.sv_list[curr].snr = str2float(tok_snr.p, tok_snr.end);
	                r->sv_status.ephemeris_mask |= (1ul << (prn-1));
	                r->sv_status.almanac_mask |= (1ul << (prn-1));

	                r->sv_status.num_svs += 1;

				if(r->sv_status.sv_list[curr].snr > 0)
                    ALOGV("##curr=%d num_svs:%d prn:%d snr=%f\n", curr, r->sv_status.num_svs,
                                r->sv_status.sv_list[curr].prn,r->sv_status.sv_list[curr].snr);
                    curr += 1;
                }

                i += 1;
            }

     
        其他的GGA这些双模不双模都是一样的。下面我们看看在JNI里面,android_location_GpsLocationProvider_read_sv_status上报的各个卫星的情况的,显示他的接口也是需要改造的,要扩展,如下:

@@ -465,17 +465,34 @@ static jint android_location_GpsLocationProvider_read_sv_status(JNIEnv* env, job
     jfloat* elev = env->GetFloatArrayElements(elevArray, 0);
     jfloat* azim = env->GetFloatArrayElements(azumArray, 0);
     jint* mask = env->GetIntArrayElements(maskArray, 0);
+       int i, j;

     int num_svs = sGpsSvStatus.num_svs;
-    for (int i = 0; i < num_svs; i++) {
+    int bd_num_svs = sGpsSvStatus.bd_num_svs;
+
+       //gps info
+    for (i = 0; i < (num_svs - bd_num_svs); i++) {
         prns[i] = sGpsSvStatus.sv_list[i].prn;
         snrs[i] = sGpsSvStatus.sv_list[i].snr;
         elev[i] = sGpsSvStatus.sv_list[i].elevation;
         azim[i] = sGpsSvStatus.sv_list[i].azimuth;
     }
+
+    //bd info
+    for (j = 0; j < bd_num_svs; j++) {
+        prns[i+j] = sGpsSvStatus.sv_list[32+j].prn;
+        snrs[i+j] = sGpsSvStatus.sv_list[32+j].snr;
+        elev[i+j] = sGpsSvStatus.sv_list[32+j].elevation;
+        azim[i+j] = sGpsSvStatus.sv_list[32+j].azimuth;
+    }
+
     mask[0] = sGpsSvStatus.ephemeris_mask;
     mask[1] = sGpsSvStatus.almanac_mask;
     mask[2] = sGpsSvStatus.used_in_fix_mask;
+    mask[3] = bd_num_svs;
+    mask[4] = sGpsSvStatus.bd_ephemeris_mask;
+    mask[5] = sGpsSvStatus.bd_almanac_mask;
+    mask[6] = sGpsSvStatus.bd_used_in_fix_mask;

    这个JNI接口直接就得了gps的location provider了,同样要扩展

@@ -1285,7 +1285,9 @@ public class GpsLocationProvider implements LocationProviderInterface {
                 try {
                     listener.mListener.onSvStatusChanged(svCount, mSvs, mSnrs,
                             mSvElevations, mSvAzimuths, mSvMasks[EPHEMERIS_MASK],
-                            mSvMasks[ALMANAC_MASK], mSvMasks[USED_FOR_FIX_MASK]);
+                            mSvMasks[ALMANAC_MASK], mSvMasks[USED_FOR_FIX_MASK],
+                            mSvMasks[BD_SVS_NUM], mSvMasks[BD_EPHEMERIS_MASK],
+                            mSvMasks[BD_ALMANAC_MASK],mSvMasks[BD_USED_FOR_FIX_MASK]);
                 } catch (RemoteException e) {
                     Log.w(TAG, "RemoteException in reportSvInfo");
                     mListeners.remove(listener);
@@ -1296,22 +1298,33 @@ public class GpsLocationProvider implements LocationProviderInterface {
         }

         if (VERBOSE) {
-            Log.v(TAG, "SV count: " + svCount +
+            Log.d(TAG, "SV count: " + svCount +
                     " ephemerisMask: " + Integer.toHexString(mSvMasks[EPHEMERIS_MASK]) +
                     " almanacMask: " + Integer.toHexString(mSvMasks[ALMANAC_MASK]));
             for (int i = 0; i < svCount; i++) {
-                Log.v(TAG, "sv: " + mSvs[i] +
+                               if(i < (svCount - mSvMasks[BD_SVS_NUM])){
+                Log.d(TAG, "sv: " + mSvs[i] +
                         " snr: " + mSnrs[i]/10 +
                         " elev: " + mSvElevations[i] +
                         " azimuth: " + mSvAzimuths[i] +
                         ((mSvMasks[EPHEMERIS_MASK] & (1 << (mSvs[i] - 1))) == 0 ? "  " : " E") +
                         ((mSvMasks[ALMANAC_MASK] & (1 << (mSvs[i] - 1))) == 0 ? "  " : " A") +
                         ((mSvMasks[USED_FOR_FIX_MASK] & (1 << (mSvs[i] - 1))) == 0 ? "" : "U"));
+            } else {
+
+                           Log.d(TAG, "BD sv: " + mSvs[i] +
+                                       " BD snr: " + mSnrs[i]/10 +
+                                       " BD elev: " + mSvElevations[i] +
+                                       " BD azimuth: " + mSvAzimuths[i] +
+                                       ((mSvMasks[BD_EPHEMERIS_MASK] & (1 << (mSvs[i] - 1))) == 0 ? "  " : " E") +
+                                       ((mSvMasks[BD_ALMANAC_MASK] & (1 << (mSvs[i] - 1))) == 0 ? "  " : " A") +
+                                       ((mSvMasks[BD_USED_FOR_FIX_MASK] & (1 << (mSvs[i] - 1))) == 0 ? "" : "U"));
+               }
             }
         }

         // return number of sets used in fix instead of total
-        updateStatus(mStatus, Integer.bitCount(mSvMasks[USED_FOR_FIX_MASK]));
+        updateStatus(mStatus, (Integer.bitCount(mSvMasks[USED_FOR_FIX_MASK] + Integer.bitCount(mSvMasks[BD_USED_FOR_FIX_MASK]))));

         if (mNavigating && mStatus == LocationProvider.AVAILABLE && mLastFixTime > 0 &&
             System.currentTimeMillis() - mLastFixTime > RECENT_FIX_TIMEOUT) {
@@ -1895,17 +1908,21 @@ public class GpsLocationProvider implements LocationProviderInterface {
     }

     // for GPS SV statistics
-    private static final int MAX_SVS = 32;
+    private static final int MAX_SVS = 64;
     private static final int EPHEMERIS_MASK = 0;
     private static final int ALMANAC_MASK = 1;
     private static final int USED_FOR_FIX_MASK = 2;
+    private static final int BD_SVS_NUM = 3;
+    private static final int BD_EPHEMERIS_MASK = 4;
+    private static final int BD_ALMANAC_MASK = 5;
+    private static final int BD_USED_FOR_FIX_MASK = 6;

     // preallocated arrays, to avoid memory allocation in reportStatus()
     private int mSvs[] = new int[MAX_SVS];
     private float mSnrs[] = new float[MAX_SVS];
     private float mSvElevations[] = new float[MAX_SVS];
     private float mSvAzimuths[] = new float[MAX_SVS];
-    private int mSvMasks[] = new int[3];
+    private int mSvMasks[] = new int[7];
     private int mSvCount;
     // preallocated to avoid memory allocation in reportNmea()
     private byte[] mNmeaBuffer = new byte[120];

   这就已经都java部分了,完成了大半了,后面再讲后半段的处理,也还有很多的道道在里面。

 

   

 

 

时间: 2024-10-13 09:26:41

GPS北斗双模技术应用开发研究—数据结构扩展的相关文章

GPS北斗双模技术应用开发研究--几个基本关键词

        最近在调试GPS北斗双模,目前已经都调试通了,下面就来说一下涉及的几个关键词.         GPS:   GPS是英文Global Positioning System(全球定位系统)的简称.GPS起始于1958年美国军方的一个项目,1964年投入使用.20世纪70年代,美国陆海空三军联合研制了新一代卫星定位系统GPS .主要目的是为陆海空三大领域提供实时.全天候和全球性的导航服务,并用于情报搜集.核爆监测和应急通讯等一些军事目的,经过20余年的研究实验,耗资300亿美元,到

GPS北斗双模技术应用开发研究--数据解析

         上一篇文章大家介绍了几个重要的概念,那下面我们就来解析一下这样的双模输出log,在解析之前我们来看看各个重要标准字段的意义.笔者在实际开发中只用到了其中的四个,分别是GGA,GSA,GSV,RMC,GLL,当然还有其他一些字段,感觉有些是重复的,根据需要解析就好了.下面就分别介绍一下: $XXGGA,(1),(2),(3),(4),(5),(6),(7),(8),(9),M,(10),M,(11),(12)*hh(CR)(LF) 各部分所对应的含义为: (1)定位UTC时间:0

基于多相检测方法研究酿造微生物群落关键技术的开发与应用

从四川省科技厅获悉,四川省郫县http://www.aliyun.com/zixun/aggregation/537.html" style="line-height: 1.6;">豆瓣股份有限公司与四川大学等多家单位共同完成的"基于多相检测方法研究酿造微生物群落关键技术的开发与应用"项目,获得了"2011年四川省科技进步一等奖".此项成果的取得为公司在2012年实现销售收入3亿元的奋斗目标和今后冲刺资本市场增加了新的筹码. 据从

王东风亲自为湖北省北斗产业技术创新战略联盟揭牌

湖北省北斗产业技术创新战略联盟(以下简称"北斗联盟")组建于今年5月,由从事北斗相关行业的企业.事业单位.科研院所共同发起成立,现有发起单位18家,理事/会员单位42家,总产值近300亿元,华为.腾讯均是其成员单位. 北斗卫星导航系统作为我国自主研发.独立运行的卫星导航系统,目前正处于大力发展.快速成长的爆发期,其技术含量高.产业链长.带动性强,加之市场空间广阔.政策推动力度强.经济社会效益庞大,必将成为解决卫星导航产业转型升级的重要突破口.根据中国卫星导航定位协会预测,到2015年,

语音读取文档技术java技术的开发

问题描述 语音读取文档技术java技术的开发 我想做一个语音读取,电子书的开发软件 ,就是想问问,现在的这些软件开发的优缺点在什么地方? 解决方案 主要的难题是朗读,毕竟机器的智能不如人类,读起来会有些不像. 另外就是电子书的阅读体验不同于纸质书,所以需要优化.举一个简单的例子,人翻阅纸质书寻找一个有插图的章节,可能一秒钟看100页,很快就找到了. 可是电脑的速度有限,你做电子书加载页面肯定有延迟,就达不到这样的流畅度.

高德地图JavaScript API开发研究

原文:高德地图JavaScript API开发研究 高德地图JavaScript API是一套用JavaScript 语言编写的应用程序接口,可以通过各种API接口向地图添加内容,创建功能丰富.交互性强的地图应用.高德地图JavaScript API 提供了大量的实用工具和富有特色的插件功能,并提供了搜索和路线规划等服务. 1.首先 2.然后 3.最后就是看官方文档开发 高德地图API使用介绍:http://lbs.amap.com/api/javascript-api/guide-2/map_

演讲实录丨汤劲松 Quanergy固态激光雷达与智能驾驶感知技术的开发

Quanergy固态激光雷达与智能驾驶感知技术的开发 汤劲松  Quanergy Systems Inc. 亚洲业务发展总监  汤劲松:很高兴认识中国人工智能学会的各位领导,我们刚刚李院士也跟我们谈了很多的前景,中国这边将来会有很大的发展,我们也相信国内跟美国.欧洲这几块是很大的未来自动驾驶和ADAS发展最前沿的地方,我们公司总部在美国硅谷,现在界限也比较小,我们认为我们有很强的中国籍,我在这边负责国内的工作,我们公司其中有一位创始人他是中国人,就是华裔的余博士,本来我们是要到亚洲出差,但是这次

广东成立北斗应用技术支持中心

南方日报讯(记者/戴远程实习生/赵晓娜)作为国内自主设计和建设的"北斗卫星导航系统"民用产业化的先行试点,广东省北斗应用技术支持中心3月26日正式落户广州科学城.广东省经济和信息化委员会副主任邹生称,广东将出台多项措施,为北斗系统大规模应用取得系统化的应用经验,并迅速推进北斗导航系统的民用产业化. 据悉,中国自主设计和建设的"北斗卫星导航系统",已经成为目前世界上能够独立提供服务的三大卫星导航系统之一.北斗应用技术支持中心主任张文华透露,广东在珠江三角洲地区拥有完整

基于App Inventor 2应用环境的高校云资源开发研究

基于App Inventor 2应用环境的高校云资源开发研究 江国粹 通过对App Inventor 2应用开发环境的分析,基于我国高校云资源开发现状,指出目前高校云资源开发的不足,提出有效构建开放式云资源的思路,以期给高校云资源及云计算教育开发的研究者及实践者提供有益的借鉴和参考. 基于App Inventor 2应用环境的高校云资源开发研究