GPS 북 두 쌍 모델 기술 응용 개발 연구 - 데이터 구조 확장
11591 단어 android
gps. h 헤더 파일 부터 시작 하 는 것 이 좋 습 니 다. 우선 GpsSVstatus 구조 체 는 개조 가 필요 합 니 다. GpsSVstatus 는 당시 gps 위성 정 보 를 저장 하 는 것 을 고려 했 지만 우 리 는 지금 쌍 모델 의 데 이 터 를 저장 해 야 하기 때문에 이 데이터 구 조 를 확장 해 야 합 니 다. 어떻게 확장 합 니까?
물론 대가 가 작 아야 한다. 완전히 무 너 뜨 려 서 는 안 된다. 필 자 는 북두칠성 의 수량 변 수 를 증가 시 키 고 북두칠성 의 epemeris, almanac, 그리고 포 지 셔 닝 마스크 를 생각 했다. 예전 에 데이터 구조 안의 구성원 들 은 모두 gps 로 저장 했다. 그러면 서로 독립 되 었 다. 그러나 svlist 필 자 는 게 으 름 을 피 워 공용 했다. 이 수 조 를 배로 늘 리 고 후반 부 에 북두칠성 위성 정 보 를 저장 하면 첫 단 계 는 완성 된다.기본적으로 다음 과 같다.
/** 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
", 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
", 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 안에 있 는 안 드 로 이 드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];
이것 은 이미 자바 부분 입 니 다. 대부분 을 완 성 했 습 니 다. 뒤에 후반 의 처 리 를 다시 이야기 하고 많은 도로 가 안에 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.