3(3)                          GPSD Documentation                          3(3)



NAME
       libgps - C service library for communicating with the GPS daemon

SYNOPSIS
       C:

       #include <gps.h>


       struct gps_data_t *gps_open(intaf, char *server, char * port);

       int gps_open_r(char *server, char * port, struct gps_data_t *gpsdata);

       int gps_send(struct gps_data_t *gpsdata, char *fmt...);

       void gps_set_raw_hook(struct gps_data_t *gpsdata,
                             void (*hook)(struct gps_data_t *, char *buf, size_t len));

       int gps_poll(struct gps_data_t *gpsdata);

       bool gps_waiting(struct gps_data_t *gpsdata);

       void gps_close(struct gps_data_t *gpsdata);

       int gps_stream(struct gps_data_t *gpsdata, unsigned intflags,
                      void *data);

       char *gps_errstr(int err);


                        Python:

                        import gps

                        session = gps.gps(host="localhost", port="2947")

                        session.set_raw_hook(raw_hook)

                        session.stream(flags=WATCH_JSON)

                        for report in session:
                            process(report)

                        del session


DESCRIPTION
       libgps is a service library which supports communicating with an
       instance of the gpsd(8); link it with the linker option -lgps.

           Warning
           Take care to conditionalize your code on the major and minor API
           version symbols in gps.h; ideally, force a compilation failure if
           GPSD_API_MAJOR_VERSION is not a version you recognize. See the GPSD
           project website for more information on the protocol and API
           changes.

       Calling gps_open() initializes a GPS-data structure to hold the data
       collected by the GPS, and returns a socket attached to gpsd(1).
       gps_open() returns NULL on errors. errno is set depending on the error
       returned from the the socket layer; see gps.h for values and
       explanations. The host address may be a DNS name, an IPv4 dotted quad,
       or an IPV6 address; the library will do the right thing for any of
       these.

       gps_open_r() is a reentrent-friendly version that puts the session
       storage where you wish to allocate it. It returns 0 on success and -1
       on failure, with errno set appropriately.

       gps_close() ends the session.

       gps_send() writes a command to the daemon. The second argument must be
       a format string containing elements from the command set documented at
       gpsd(1). It may have % elements as for sprintf(3), which will be filled
       in from any following arguments. This function returns a -1 if there
       was a Unix-level write error, otherwise 0. Please read the LIMITATIONS
       section for additional information and cautions.

       gps_poll() accepts a response, or sequence of responses, from the
       daemon and interprets it as though it were a query response (the return
       value is as for a query).  gps_poll() returns the validity mask of the
       received structure. This function does a blocking read waiting for data
       from the daemon; it returns 0 for success, -1 with errno set on a
       Unix-level read error, -1 with errno not set if the socket to the
       daemon has closed.

       gps_waiting() can be used to check whether there is data from the
       daemon. It returns true if there is, false on no data waiting or error
       condition. It does not block waiting for input.

       gps_stream() asks gpsd to stream the reports it has at you, to be made
       available whenn you poll. It is preferable to the older-style
       (pre-2.90) way of doing this, gps_query() with a "w+" argument, because
       it insulates your code from whether your client library and your gpsd
       are using old or new protocol. The second argument is a flag mask that
       sets various policy bits; see trhe list below. Calling gps_stream()
       more than once with different flag masks is allowed.

       WATCH_DISABLE
           Disable the reporting modes specified by the other WATCH_ flags.
           Cannot be used to disable POLL_NONBLOCK.

       WATCH_ENABLE
           Disable the reporting modes specified by the other WATCH_ flags.
           This is the default.

       WATCH_JSON
           Enable JSON reporting of data. If WATCH_ENABLE is set, and no other
           WATCH flags are set, this is the default.

       WATCH_NMEA
           Enable generated pseudo-NMEA reporting on binary devices.

       WATCH_RARE
           Enable reporting of binary packets in encoded hex.

       WATCH_RAW
           Enable literal passtrough of binary packets.

       WATCH_SCALED
           When reporting AIS data, scale integer quantities to floats if they
           have a divisor or rendering formula assosiated with them.

       WATCH_NEWSTYLE
           Force issuing a JSON initialization and getting new-style
           responses. This will become the default in a future release.

       WATCH_OLDSTYLE
           Force issuing a W or R command and getting old-style responses.
           This is now the default behavior, but will be removed in a future
           release.

       WATCH_DEVICE
           Restrict watching to a speciied device, patch given as second
           argument.

       POLL_NONBLOCK
           Normally gps_poll() blocks until either there is a read error or
           some data is received from tha daemon. In this mode, gps_poll()
           returns immediately with a value of 0 if there is no input waiting.

       gps_set_raw_hook() takes a function you specify and run it
       (synchronously) on the raw data pulled by a gps_query() or gps_poll()
       call. The arguments passed to this hook will be a pointer to a
       structure containing parsed data, and a buffer containining the raw
       gpsd response.

       gps_errstr() returns an ASCII string (in English) describing the error
       indicated by a nonzero return value from gps_open().

       Consult gps.h to learn more about the data members and associated
       timestamps. Note that information will accumulate in the session
       structure over time, and the 'valid' field is not automatically zeroed
       by each poll. It is up to the client to zero that field when
       appropriate and to keep an eye on the fix and sentence timestamps.

       The Python implementation supports the same facilities as the C
       library.  gps_open() is replaced by the initialization of a gps session
       object; the other calls are methods of that object, and have the same
       names as the corresponding C functions. Resources within the session
       object will be properly released when it is garbage-collected. Note one
       limitation: POLL_NOBLOCK is not yet supported in Python; use the
       waiting() method instead.

CODE EXAMPLE
       The following is an excerpted and simplified version of the libgps
       interface code from xgps(1). The function handle_input() is a trivial
       piece of code that calls gps_poll(gpsdata).

               gpsdata = gps_open(server, port);

               build_gui(toplevel);

               gps_set_raw_hook(gpsdata, update_panel);

               (void)gps_stream(gpsdata, WATCH_ENABLE, NULL);

               (void)XtAppAddInput(app, gpsdata->gps_fd,
                       (XtPointer)XtInputReadMask, handle_input, NULL);
               (void)XtAppMainLoop(app);

               (void)gps_close(gpsdata);

LIMITATIONS
       In the C API, incautious use of gps_send() may lead to subtle bugs. In
       order to not bloat struct gps_data_t with space used by responses that
       are not expected to be shipped in close sequence with each other, the
       storage for fields associated with certain responses are combined in a
       union.

       The risky set of responses includes VERSION, DEVICELIST, RTCM2, RTCM3,
       and AIS; it may not be limited to that set. The logic of the daemon's
       watcher mode is careful to avoid dangerous sequences, but you should
       read and understand the layout of struct gps_data_t before using
       gps_send() to request any of these responses.

COMPATIBILITY
       The gps_query() supported in major versions 1 and 2 of this library has
       been removed. With the new streaming-oriented wire protocol behind this
       library, it is extremely unwise to assume that the first transmission
       from the damon after a command is shipped to it will be the reponse to
       command.

       If you must send commands to the daemon explicity, use gps_send() but
       beware that this ties your code to the GPSD wire protocol. It is not
       recommended.

       This API has been stable since GPSD 2.90, except that gps_waiting() was
       added in 2.91.

SEE ALSO
       gpsd(8), gps(1), libgpsd(3).  libgpsmm(3).

AUTHOR
       Eric S. Raymond <esr@thyrsus.com>, Thread-callback methods in the C
       binding added by Alfredo Pironti <alfredo@users.sourceforge.net>.



The GPSD Project                  14 Aug 2004                             3(3)
