GPSD испытывает проблемы с привязкой PPS к времени (Ublox ZED-F9P) - PullRequest
0 голосов
/ 30 мая 2019

В настоящее время я пытаюсь подключить сигнал PPS от GPS-приемника, такого как UBlox ZED-F9P, к Raspberry Pi с Ubuntu Mate 18.04 и GPSD.Я проверил, что есть модули ядра PPS и что RPi действительно обнаруживает сигнал PPS с помощью команды:

$ ppstest /dev/pps0
trying PPS source "/dev/pps0"
found PPS source "/dev/pps0"
ok, found 1 source(s), now start fetching data...
source 0 - assert 1559136628.231481270, sequence: 631 - clear  0.000000000, sequence: 0                   │
...

Теперь проблема в том, что когда я запускаю GPSD, я получаю следующие ошибки:

$ gpsd -nND8 /dev/ttyACM0 /dev/pps0
...
gpsd:PROG: KPPS:/dev/pps0 Assert cycle:  999997, duration:       0 @  1559136675.231397794
gpsd:RAW: PPS:/dev/pps0 Assert pps-detect invisible pulse
gpsd:PROG: PPS:/dev/pps0 Assert cycle:  999997, duration:       0 @  1559136675.231397794
gpsd:PROG: PPS:/dev/pps0 Assert rejected missing last_fixtime
gpsd:PROG: KPPS:/dev/pps0 assert  1559136676.231395175, sequence: 679, clear   0.000000000, sequence: 0 -
 using: assert
...

, немного углубившись в исходный код, показывает, что у GPSD возникают проблемы с привязкой импульса PPS ко времени.Как объясняется в (gpsd/ppsthread.c) при расчете смещения (разницы) между системным временем и временем GPS в момент импульса.

/*
 * If there has not yet been any valid in-band time stashed
 * from the GPS when the PPS event was asserted, we can do
 * nothing further.  gpsd can not tell what second this pulse is
 * in reference to.
 *
 * Some GPSes like Garmin always send a PPS, valid or not.
 * Other GPSes like some uBlox may only send PPS when time is valid.
 * It is common to get PPS, and no fixtime, while autobauding.
 */
/* FIXME, some GPS, like Skytraq, may output a the fixtime so
 * late in the cycle as to be ambiguous. */
if (last_fixtime.real.tv_sec == 0) {
    /* probably should log computed offset just for grins here */
    ok = false;
    log = "missing last_fixtime\n";
} else if ( ok && last_second_used >= last_fixtime.real.tv_sec ) {
    /* uh, oh, this second already handled */
    ok = false;
    log = "this second already handled\n";
}

if ( !ok ) {
    /* can not use this pulse, reject and retry */
    thread_context->log_hook(thread_context, THREAD_PROG,
        "PPS:%s %.10s ignored %.100s",
        thread_context->devicename, edge_str,  log);
    continue;
}

Мой вопрос здесь заключается в том, как мнерешить эту проблему, чтобы я мог использовать GPSD с Chrony для настройки NTP-сервера.

...