Separated NMEA GSV for GPS and GLONASS
Generate GPGSV and GLGSV sentence separately rather than combination according to satelite prn number. CRs-Fixed: 491156 Change-Id: Ie2bc60ae680a75cbe95702a7f842c1546a3a2f21
This commit is contained in:
parent
b1e5bb90ac
commit
05b385d8e0
1 changed files with 132 additions and 25 deletions
|
@ -29,7 +29,10 @@
|
||||||
|
|
||||||
#define LOG_NDDEBUG 0
|
#define LOG_NDDEBUG 0
|
||||||
#define LOG_TAG "LocSvc_eng_nmea"
|
#define LOG_TAG "LocSvc_eng_nmea"
|
||||||
|
#define GPS_PRN_START 1
|
||||||
|
#define GPS_PRN_END 32
|
||||||
|
#define GLONASS_PRN_START 65
|
||||||
|
#define GLONASS_PRN_END 96
|
||||||
#include <loc_eng.h>
|
#include <loc_eng.h>
|
||||||
#include <loc_eng_nmea.h>
|
#include <loc_eng_nmea.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
@ -605,12 +608,33 @@ void loc_eng_nmea_generate_sv(loc_eng_data_s_type *loc_eng_data_p,
|
||||||
char* pMarker = sentence;
|
char* pMarker = sentence;
|
||||||
int lengthRemaining = sizeof(sentence);
|
int lengthRemaining = sizeof(sentence);
|
||||||
int length = 0;
|
int length = 0;
|
||||||
|
int svCount = svStatus.num_svs;
|
||||||
|
int sentenceCount = 0;
|
||||||
|
int sentenceNumber = 1;
|
||||||
|
int svNumber = 1;
|
||||||
|
int gpsCount = 0;
|
||||||
|
int glnCount = 0;
|
||||||
|
|
||||||
|
//Count GPS SVs for saparating GPS from GLONASS and throw others
|
||||||
|
|
||||||
|
for(svNumber=1; svNumber <= svCount; svNumber++) {
|
||||||
|
if( (svStatus.sv_list[svNumber-1].prn >= GPS_PRN_START)&&
|
||||||
|
(svStatus.sv_list[svNumber-1].prn <= GPS_PRN_END) )
|
||||||
|
{
|
||||||
|
gpsCount++;
|
||||||
|
}
|
||||||
|
else if( (svStatus.sv_list[svNumber-1].prn >= GLONASS_PRN_START) &&
|
||||||
|
(svStatus.sv_list[svNumber-1].prn <= GLONASS_PRN_END) )
|
||||||
|
{
|
||||||
|
glnCount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// ------------------
|
// ------------------
|
||||||
// ------$GPGSV------
|
// ------$GPGSV------
|
||||||
// ------------------
|
// ------------------
|
||||||
|
|
||||||
if (svStatus.num_svs <= 0)
|
if (gpsCount <= 0)
|
||||||
{
|
{
|
||||||
// no svs in view, so just send a blank $GPGSV sentence
|
// no svs in view, so just send a blank $GPGSV sentence
|
||||||
strlcpy(sentence, "$GPGSV,1,1,0,", sizeof(sentence));
|
strlcpy(sentence, "$GPGSV,1,1,0,", sizeof(sentence));
|
||||||
|
@ -619,12 +643,9 @@ void loc_eng_nmea_generate_sv(loc_eng_data_s_type *loc_eng_data_p,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
int svCount = svStatus.num_svs;
|
svNumber = 1;
|
||||||
int sentenceCount = svCount / 4;
|
sentenceNumber = 1;
|
||||||
if (svStatus.num_svs % 4)
|
sentenceCount = gpsCount/4 + (gpsCount % 4 != 0);
|
||||||
sentenceCount++;
|
|
||||||
int sentenceNumber = 1;
|
|
||||||
int svNumber = 1;
|
|
||||||
|
|
||||||
while (sentenceNumber <= sentenceCount)
|
while (sentenceNumber <= sentenceCount)
|
||||||
{
|
{
|
||||||
|
@ -642,7 +663,10 @@ void loc_eng_nmea_generate_sv(loc_eng_data_s_type *loc_eng_data_p,
|
||||||
pMarker += length;
|
pMarker += length;
|
||||||
lengthRemaining -= length;
|
lengthRemaining -= length;
|
||||||
|
|
||||||
for (int i=0; (svNumber <= svCount) && (i < 4); i++, svNumber++)
|
for (int i=0; (svNumber <= svCount) && (i < 4); svNumber++)
|
||||||
|
{
|
||||||
|
if( (svStatus.sv_list[svNumber-1].prn >= GPS_PRN_START) &&
|
||||||
|
(svStatus.sv_list[svNumber-1].prn <= GPS_PRN_END) )
|
||||||
{
|
{
|
||||||
length = snprintf(pMarker, lengthRemaining,",%02d,%02d,%03d,",
|
length = snprintf(pMarker, lengthRemaining,",%02d,%02d,%03d,",
|
||||||
svStatus.sv_list[svNumber-1].prn,
|
svStatus.sv_list[svNumber-1].prn,
|
||||||
|
@ -670,14 +694,97 @@ void loc_eng_nmea_generate_sv(loc_eng_data_s_type *loc_eng_data_p,
|
||||||
pMarker += length;
|
pMarker += length;
|
||||||
lengthRemaining -= length;
|
lengthRemaining -= length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
length = loc_eng_nmea_put_checksum(sentence, sizeof(sentence));
|
length = loc_eng_nmea_put_checksum(sentence, sizeof(sentence));
|
||||||
loc_eng_nmea_send(sentence, length, loc_eng_data_p);
|
loc_eng_nmea_send(sentence, length, loc_eng_data_p);
|
||||||
sentenceNumber++;
|
sentenceNumber++;
|
||||||
|
|
||||||
|
} //while
|
||||||
|
|
||||||
|
} //if
|
||||||
|
|
||||||
|
// ------------------
|
||||||
|
// ------$GLGSV------
|
||||||
|
// ------------------
|
||||||
|
|
||||||
|
if (glnCount <= 0)
|
||||||
|
{
|
||||||
|
// no svs in view, so just send a blank $GLGSV sentence
|
||||||
|
strlcpy(sentence, "$GLGSV,1,1,0,", sizeof(sentence));
|
||||||
|
length = loc_eng_nmea_put_checksum(sentence, sizeof(sentence));
|
||||||
|
loc_eng_nmea_send(sentence, length, loc_eng_data_p);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
svNumber = 1;
|
||||||
|
sentenceNumber = 1;
|
||||||
|
sentenceCount = glnCount/4 + (glnCount % 4 != 0);
|
||||||
|
|
||||||
|
while (sentenceNumber <= sentenceCount)
|
||||||
|
{
|
||||||
|
pMarker = sentence;
|
||||||
|
lengthRemaining = sizeof(sentence);
|
||||||
|
|
||||||
|
length = snprintf(pMarker, lengthRemaining, "$GLGSV,%d,%d,%02d",
|
||||||
|
sentenceCount, sentenceNumber, svCount);
|
||||||
|
|
||||||
|
if (length < 0 || length >= lengthRemaining)
|
||||||
|
{
|
||||||
|
LOC_LOGE("NMEA Error in string formatting");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
pMarker += length;
|
||||||
|
lengthRemaining -= length;
|
||||||
|
|
||||||
|
for (int i=0; (svNumber <= svCount) && (i < 4); svNumber++)
|
||||||
|
{
|
||||||
|
if( (svStatus.sv_list[svNumber-1].prn >= GLONASS_PRN_START) &&
|
||||||
|
(svStatus.sv_list[svNumber-1].prn <= GLONASS_PRN_END) ) {
|
||||||
|
|
||||||
|
length = snprintf(pMarker, lengthRemaining,",%02d,%02d,%03d,",
|
||||||
|
svStatus.sv_list[svNumber-1].prn,
|
||||||
|
(int)(0.5 + svStatus.sv_list[svNumber-1].elevation), //float to int
|
||||||
|
(int)(0.5 + svStatus.sv_list[svNumber-1].azimuth)); //float to int
|
||||||
|
|
||||||
|
if (length < 0 || length >= lengthRemaining)
|
||||||
|
{
|
||||||
|
LOC_LOGE("NMEA Error in string formatting");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pMarker += length;
|
||||||
|
lengthRemaining -= length;
|
||||||
|
|
||||||
|
if (svStatus.sv_list[svNumber-1].snr > 0)
|
||||||
|
{
|
||||||
|
length = snprintf(pMarker, lengthRemaining,"%02d",
|
||||||
|
(int)(0.5 + svStatus.sv_list[svNumber-1].snr)); //float to int
|
||||||
|
|
||||||
|
if (length < 0 || length >= lengthRemaining)
|
||||||
|
{
|
||||||
|
LOC_LOGE("NMEA Error in string formatting");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pMarker += length;
|
||||||
|
lengthRemaining -= length;
|
||||||
|
}
|
||||||
|
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
length = loc_eng_nmea_put_checksum(sentence, sizeof(sentence));
|
||||||
|
loc_eng_nmea_send(sentence, length, loc_eng_data_p);
|
||||||
|
sentenceNumber++;
|
||||||
|
|
||||||
|
} //while
|
||||||
|
|
||||||
|
}//if
|
||||||
|
|
||||||
if (svStatus.used_in_fix_mask == 0)
|
if (svStatus.used_in_fix_mask == 0)
|
||||||
{ // No sv used, so there will be no position report, so send
|
{ // No sv used, so there will be no position report, so send
|
||||||
|
|
Loading…
Reference in a new issue