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

2.6 KiB

Tradeoffs

There's a price for everything, hehe...

Configurability means that the code is littered with #ifdef sections.

I've tried to increase white space and organization to make it more readable, but let's be honest... conditional compilation is ugly.

Accumulating parts means knowing which parts are valid.

Before accessing a part, you must check its valid flag. Fortunately, this adds only one bit per member. See Streamers.cpp for an example of accessing every data member. That file also shows how to accommodate different builds: all references to 'gps_fix' members are wrapped with conditional compilation #ifdef/#endif statements. If you do not plan to support multiple configurations, you do not need to use #ifdef/#endif statements.

Parsing without buffers, or in place, means that you must be more careful about when you access data items.

In general, using the fix-oriented methods available and read are atomically safe. You can access any parts of your fix structure, at any time.

If you are using the advanced character-oriented methods:

  • You must wait to access the internal gps.fix() until after the entire sentence has been parsed.
  • Only 3 example programs use these methods: NMEAblink, NMEAorder and NMEAdiagnostic. These examples simply decode until a sentence is COMPLETED. See GPSloop() in NMEAdiagnostic.ino.
  • Member function gps.is_safe() can also be used to determine when it is safe to access the internal gps.fix().
  • Received data errors can cause invalid field values to be set in the internal fix before the CRC is fully computed. The CRC will catch most of those, and the internal fix members will then be marked as invalid.

Accumulating parts into one fix means less RAM but more complicated code

By enabling one of the merging methods, fixes will accumulate data from all received sentences. The code required to implement those different techniques is more complicated than simply setting a structure member.

You are not restricted from having other instances of fix; you can copy or merge a some or all of a new fix into another copy if you want.

Full C++ OO implementation is more advanced than most Arduino libraries.

You've been warned! ;)

"fast, good, cheap... pick two."

Although most of the RAM reduction is due to eliminating buffers, some of it is from trading RAM for additional code (see Nominal Program Space above). And, as I mentioned, the readabilty (i.e., goodness) suffers from its configurability.