[prev in list] [next in list] [prev in thread] [next in thread]
List: gpsd-users
Subject: Re: [gpsd-users] Valid data in gps_data_t struct
From: "Gary E. Miller" <gem () rellim ! com>
Date: 2019-05-25 20:38:43
Message-ID: 20190525133843.32780608 () rellim ! com
[Download RAW message or body]
Yo Massimiliano!
On Sat, 25 May 2019 22:15:47 +0200
Massimiliano Fago <massimiliano.fago@gmail.com> wrote:
> in some example I see this:
>
> if (newdata->set & ONLINE_SET)
> (void)fprintf(stdout, "ONLINE: %lf\n", newdata->online);
Notice that is in the gpsd daemon, not in a client!
I assume you are working on a client, not on a driver for the daemon?
If you are working on a client then you need to look at libgps_json
and some of the example clients.
> if (newdata->set & DOP_SET)
> (void)fprintf(stdout,
> "DOP: satellites %d, pdop=%lf, hdop=%lf, vdop=%lf\n",
> newdata->satellites_used, newdata->dop.pdop,
> newdata->dop.hdop, newdata->dop.vdop);
Notice that there are seven different DOP in struct dop_t. Not all
GPS provide all of them. gpsd tries to fill in the missing ones, but may
not have sufficient data to do that.
> it is correct to check "newdata->set & DOP_SET" before use the data?
Too coarse a check. Look at each one individually.
Look in gpsd_json.c starting at line 329:
if (isfinite(datap->dop.xdop) != 0)
str_appendf(reply, replylen, "\"xdop\":%.2f,", datap->dop.xdop);
if (isfinite(datap->dop.ydop) != 0)
str_appendf(reply, replylen, "\"ydop\":%.2f,", datap->dop.ydop);
[...]
Note the check for isfinite(). That is not a check for isnan(). A
subtle details that breaks a lot of software.
Here is an example, generic, but basically correct in any language
purporting IEEE 754 compliance:
a = 1.0 / 0.0
b = -1.0 / 0.0
You can divide 1.0, and -1.0, by 0.0 an infinite number of times. So the
IEEE 754 Floating Point Math says the answers are:
a == +INF
b == -INF
+INF, and -INF, are NANs, but for weird historical reasons lost in
time they both test as:
0 == isnan(+INF)
0 == isnan(-INF)
Similar to:
0 == isnan(1.0)
0 == isnan(-1.0)
There are many different NANs and one must be careful using them.
In gpsd, what we want to know is if the value is a representable
plain number. isfinite() is the test for that. Like this:
0 == isfinite(+INF)
0 == isfinite(-INF)
1 == isfinite(1.0)
1 == isfinite(-1.0)
Very few programmers understand IEEE 754. Learning and using it as
intended can seriously speed up, and improve, floating point code.
> For example if my gps is not receving data, how I can know if pps
> subtracted themselves is valid?
The answer is in your question: if you are not receiving data then it is
not only not-valid, but non-existent. The problem is that one person's
"fresh enough" is another persons "stale". So check the fix time depending
on your freshness needs.
> The data is set to nan?
Mixing apples and oranges. NAN is for floats and doubles. timespec is
integers.
RGDS
GARY
---------------------------------------------------------------------------
Gary E. Miller Rellim 109 NW Wilmington Ave., Suite E, Bend, OR 97703
gem@rellim.com Tel:+1 541 382 8588
Veritas liberabit vos. -- Quid est veritas?
"If you can't measure it, you can't improve it." - Lord Kelvin
[Attachment #3 (application/pgp-signature)]
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic