В настоящее время я пытаюсь подключить сигнал 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-сервера.