#ifndef NEOGPS_CFG
#define NEOGPS_CFG
// Copyright (C) 2014-2017, SlashDevin
//
// This file is part of NeoGPS
//
// NeoGPS is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// NeoGPS is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with NeoGPS. If not, see .
//------------------------------------------------------------------------
// Enable/disable packed data structures.
//
// Enabling packed data structures will use two less-portable language
// features of GCC to reduce RAM requirements. Although it was expected to slightly increase execution time and code size, the reverse is true on 8-bit AVRs: the code is smaller and faster with packing enabled.
//
// Disabling packed data structures will be very portable to other
// platforms. NeoGPS configurations will use slightly more RAM, and on
// 8-bit AVRs, the speed is slightly slower, and the code is slightly
// larger. There may be no choice but to disable packing on processors
// that do not support packed structures.
//
// There may also be compiler-specific switches that affect packing and the
// code which accesses packed members. YMMV.
#include
#ifdef __AVR__
#define NEOGPS_PACKED_DATA
#endif
//------------------------------------------------------------------------
// Based on the above define, choose which set of packing macros should
// be used in the rest of the NeoGPS package. Do not change these defines.
#ifdef NEOGPS_PACKED_DATA
// This is for specifying the number of bits to be used for a
// member of a struct. Booleans are typically one bit.
#define NEOGPS_BF(b) :b
// This is for requesting the compiler to pack the struct or class members
// "as closely as possible". This is a compiler-dependent interpretation.
#define NEOGPS_PACKED __attribute__((packed))
#else
// Let the compiler do whatever it wants.
#define NEOGPS_PACKED
#define NEOGPS_BF(b)
#endif
//------------------------------------------------------------------------
// Accommodate C++ compiler and IDE changes.
//
// Declaring constants as class data instead of instance data helps avoid
// collisions with #define names, and allows the compiler to perform more
// checks on their usage.
//
// Until C++ 10 and IDE 1.6.8, initialized class data constants
// were declared like this:
//
// static const = ;
//
// Now, non-simple types (e.g., float) must be declared as
//
// static constexpr = ;
//
// The good news is that this allows the compiler to optimize out an
// expression that is "promised" to be "evaluatable" as a constant.
// The bad news is that it introduces a new language keyword, and the old
// code raises an error.
//
// TODO: Evaluate the requirement for the "static" keyword.
// TODO: Evaluate using a C++ version preprocessor symbol for the #if.
// #if __cplusplus >= 201103L (from XBee.h)
//
// The CONST_CLASS_DATA define will expand to the appropriate keywords.
//
#if ( \
(ARDUINO < 10606) | \
((10700 <= ARDUINO) & (ARDUINO <= 10799 )) | \
((107000 <= ARDUINO) & (ARDUINO <= 107999)) \
) \
& \
!defined(ESP8266) // PlatformIO Pull Request #82
#define CONST_CLASS_DATA static const
#else
#define CONST_CLASS_DATA static constexpr
#endif
//------------------------------------------------------------------------
// The PROGMEM definitions are not correct for Zero, MKR1000 and
// earlier versions of Teensy boards
#if defined(ARDUINO_SAMD_MKRZERO) | \
defined(ARDUINO_SAMD_ZERO) | \
defined(ARDUINO_SAM_DUE) | \
defined(ARDUINO_ARCH_ARC32) | \
defined(__TC27XX__) | \
defined(NRF52) | \
(defined(TEENSYDUINO) && (TEENSYDUINO < 139))
#undef pgm_read_ptr
#define pgm_read_ptr(addr) (*(const void **)(addr))
#endif
#endif