GPSD чтение hdop

Заранее спасибо,

Это правильный способ, как получить hdop и другие данные из режима наблюдателя от gpsd (версия gpsd-2.37)?

Приведенный ниже код работает нормально, но у меня нет опыта работы с gpsd, и я не уверен, правильно ли я вызываю функции:

  • gps_query (gpsHandle, «w + \ n»);

  • gps_query (gpsHandle, «q \ n»);

  • gpsProcess ( &newGpsData) -> gps_poll ( &newGpsData)

это правильно.

Редактировать № 1:
Я добавил логирование для внутреннего потока gpsd, чтобы выяснить, что при запуске
«gps_query (gpsHandle,» q \ n «);» это добавит одну строку
«GPSD, Q = 9 0,00 3,73 1,89 2,82 6,52» и «gps_unpack» проанализирует его с помощью

sscanf(sp, "Q=%d %lf %lf %lf %lf %lf",
&gpsdata->satellites_used,
&gpsdata->pdop,
&gpsdata->hdop,
&gpsdata->vdop,
&gpsdata->tdop,
&gpsdata->gdop);

Спасибо
январь

gps_query(gpsHandle, "w+\n");      // Place in watcher mode
for (;;)
{
if ( gpsProcess( &newGpsData ) )
{
syslog( LOG_INFO, "jlazar gpsProcess reported event, ""online = %d, status = %d, sats = %d, used = %d",
(int)newGpsData.online, newGpsData.status, newGpsData.satellites, newGpsData.satellites_used );
syslog( LOG_INFO, "jlazar gpsProcess if pdop=%f, hdop=%f, vdop=%f, tdop=%f, gdop=%f",
newGpsData.pdop, newGpsData.hdop, newGpsData.vdop, newGpsData.tdop, newGpsData.gdop );
// double pdop, hdop, vdop, tdop, gdop; /* Dilution of precision */
pthread_mutex_lock( &gpsInfo_mutex );

gpsInfoCache.online          = (newGpsData.online != 0);
gpsInfoCache.status          = newGpsData.status;               // Assumes GPS_SERVICE_STATUS_* constants in gps_services.h match STATUS_* constants in gps.h
gpsInfoCache.satellites_used = newGpsData.satellites_used;
gpsInfoCache.satellites      = newGpsData.satellites;
gpsInfoCache.ROCCorrection = getAverageROCCorrection( getROCCorrection( newGpsData.hdop ) );

if ( gpsInfoCache.status != GPS_SERVICE_STATUS_NO_FIX )
{
time_t gpsTime;
struct tm tmTime;
/* Convert latitude */
latlon                  = newGpsData.fix.latitude;
latlon                 *= DEG_TO_MSEC;  /* convert to milliseconds */
gpsInfoCache.lat_msec   = (int)(latlon);
/* Convert longitude */
latlon                  = newGpsData.fix.longitude;
latlon                 *= DEG_TO_MSEC;  /* convert to milliseconds */
gpsInfoCache.lon_msec   = (int)(latlon);

gpsInfoCache.heading    = (int)newGpsData.fix.track;
gpsInfoCache.velocity   = (int)(newGpsData.fix.speed * MPS_TO_KNOTS * 1000);
gpsInfoCache.avgVelocity = getAverageSpeed(gpsInfoCache.velocity);

gpsTime                 = (time_t)newGpsData.fix.time;
gmtime_r(&gpsTime, &tmTime);
// syslog( LOG_INFO, "pollGpsd() Got Fix %d, %d", gpsInfoCache.lat_msec, gpsInfoCache.lon_msec );
}
else
{
gpsInfoCache.lat_msec   = 0;
gpsInfoCache.lon_msec   = 0;
gpsInfoCache.avgVelocity = getAverageSpeed(0);

//                  syslog( LOG_INFO, "pollGpsd() Got No Fix" );
}

pthread_mutex_unlock( &gpsInfo_mutex );
}

gps_query( gpsHandle, "q\n" ); // a count of satellites used in the last fix, and  five  dimensionless  dilution-of-precision  (DOP) numbers  --  spherical,  horizontal,  vertical,  time, and total geometric
sleepMs( 1000 );
}

0

Решение

Это работает на новых выпусках gpsd? потому что они перешли на интерфейс JSON для связи с gpsd.

Если вы работаете над старым выпуском, попробуйте увидеть функции libgps.c и gps_unpack.

gps_unpack отформатирует сообщение в прикладной программе. попробуйте получить информацию hdop, она должна быть одной из структур спутниковой информации.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]