GPS北鬥雙模技術應用開發研究—資料結構擴充,gps開發研究

來源:互聯網
上載者:User

GPS北鬥雙模技術應用開發研究—資料結構擴充,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 400r->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部分了,完成了大半了,後面再講後半段的處理,也還有很多的道道在裡面。


 

   

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.