btnrf52-gps/lib/NeoGPS/extras/doc/Extending.md

53 lines
2.7 KiB
Markdown
Raw Permalink Normal View History

2020-07-08 21:46:02 +00:00
Extending NeoGPS
=========
Using features that are unique to your device fall into three categories:
#### 1. Configuring the device with special commands
Many devices allow you to configure which standard messages are emitted, or the rate at which they are emitted. It may be as simple as sending a proprietary command to the device. Simply use the NMEAGPS `send` or `send_P` method.
For example, to set the baudrate of the ublox NEO-6M gps device, send it a
`UBX,41` message:
```
gps.send_P( F("PUBX,41,1,0007,0003,19200,0") );
```
#### 2. Parsing additional message types
Some devices provide additional messages with extra information, or more efficient groupings. This will require deriving a class from `NMEAGPS`. The derived class needs to
* declare a PROGMEM table of the new message types,
* point that table back to the NMEAGPS table
* override the `parseField` method to extract information from each new message type
Please see ubxNMEA.h and .cpp for an example of adding two ublox-proprietary messages.
#### 3. Handling new protocols
Some devices provide additional protocols. They are frequently binary, which requires
fewer bytes than NMEA 0183. Because they can both be transmitted on the same port, it is
very likely that they can be distinguished at the message framing level.
For example, NMEA messages always start with a '$' and end with CR/LF. ublox messages start
with 0xB5 and 0x62 bytes, a message class and id, and a 2-byte message length. There is no
terminating character; the message completed when `length` bytes have been received.
This will require deriving a class from `NMEAGPS`. The derived class needs
to
* define new `rxState` values for the protocol state machine. These should
be unique from the NMEA state values, but they should share the IDLE state
value.
* override the `decode` method to watch for its messages. As bytes are
received, it may transition out of the IDLE state and into its own set of
state values. If the character is not valid for this protocol, it should
delegate it to the NMEAGPS base clase, which may begin processing an NMEAGPS
message. If the rxState is not one of the derived states (i.e., it is in
one of the NMEAGPS states), the character should be delegated to
NMEAGPS::decode.
* implement something like the `parseField` method if parse-in-place
behavior is desirable. This is not necessarily `virtual`, as it will only
be called from the derived `decode`.
* You are free to add methods and data members as required for handling the
protocol. Only `decode` must be overridden.
Please see ubxGPS.h and .cpp for an example of implementing the
ublox-proprietary protocol, UBX. The derived `ubloxGPS` class provides both
parse-in-place *and* buffered messages. See the `send` and `poll` methods.