[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[gpsd-users] Issue (bug) in the PPS detection code
From: |
Sidney Cadot |
Subject: |
[gpsd-users] Issue (bug) in the PPS detection code |
Date: |
Wed, 14 Nov 2012 11:02:37 +0100 |
Hi all,
I found an issue in the PPS-handling code of GPSD version 3.7.
In line 638 of ntpshm.c, the bit mask "PPS_LINE_TIOC" is defined that
specifies all serial lines to be monitored for potential PPS.
In line 726, the "state" is requested via ioctl(). Then, line 732 does this:
state = (int)((state & PPS_LINE_TIOC) != 0);
This effectively ORs all the bits specified in the PPS_LINE_TIOC
variable into a single bit. This single bit is then monitored for
changes and is a candidate PPS.
The problem is this: line 732 quietly assumes that the non-PPS bits in
the masks are fixed to zero (otherwise, the OR will always yield 1).
However, I am currently looking at a platform where the RING and DCD
bits are fixed to 1. This means that state will never be anything
other that 1, which prevents the PPS (that's incoming on the CTS line
in my case) from being used.
A better way of handling this, I think, would be to let 'state' and
'last_state' reflect the state off ALL bits in the PPS_LINE_MASK, and
do something like:
any_rising_edge = (~last_state & state) != 0;
any_falling_edge = ( last_state & ~state) != 0;
... and then work with those.
Regards, Sidney
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [gpsd-users] Issue (bug) in the PPS detection code,
Sidney Cadot <=