// -*- tab-width: 4; Mode: C++; c-basic-offset: 4; indent-tabs-mode: t -*- // // This is free software; you can redistribute it and/or modify it under // the terms of the GNU Lesser General Public License as published by the // Free Software Foundation; either version 2.1 of the License, or (at // your option) any later version. // /// /// @file AP_Common.h /// @brief Common definitions and utility routines for the ArduPilot /// libraries. /// #ifndef _AP_COMMON_H #define _AP_COMMON_H #include #include "include/menu.h" /// simple menu subsystem #include "c++.h" // c++ additions #include "AP_Vector.h" #include "AP_Loop.h" //////////////////////////////////////////////////////////////////////////////// /// @name Warning control //@{ // // Turn on/off warnings of interest. // // These warnings are normally suppressed by the Arduino IDE, // but with some minor hacks it's possible to have warnings // emitted. This helps greatly when diagnosing subtle issues. // #pragma GCC diagnostic warning "-Wall" #pragma GCC diagnostic warning "-Wextra" #pragma GCC diagnostic warning "-Wlogical-op" #pragma GCC diagnostic ignored "-Wredundant-decls" // Make some dire warnings into errors // // Some warnings indicate questionable code; rather than let // these slide, we force them to become errors so that the // developer has to find a safer alternative. // #pragma GCC diagnostic error "-Wfloat-equal" // The following is strictly for type-checking arguments to printf_P calls // in conjunction with a suitably modified Arduino IDE; never define for // production as it generates bad code. // #if PRINTF_FORMAT_WARNING_DEBUG # undef PSTR # define PSTR(_x) _x // help the compiler with printf_P # define float double // silence spurious format warnings for %f #else // This is a workaround for GCC bug c++/34734. // // The C++ compiler normally emits many spurious warnings for the use // of PSTR (even though it generates correct code). This workaround // has an equivalent effect but avoids the warnings, which otherwise // make finding real issues difficult. // # undef PROGMEM # define PROGMEM __attribute__(( section(".progmem.data") )) # undef PSTR # define PSTR(s) (__extension__({static prog_char __c[] PROGMEM = (s); &__c[0];})) #endif //@} //////////////////////////////////////////////////////////////////////////////// /// @name Types /// /// Data structures and types used throughout the libraries and applications. /// //@{ struct Location { uint8_t id; ///< command id uint8_t p1; ///< param 1 int32_t alt; ///< param 2 - Altitude in centimeters (meters * 100) int32_t lat; ///< param 3 - Lattitude * 10**7 int32_t lng; ///< param 4 - Longitude * 10**7 }; /** * The parameter template class. This class * implements get/set/save/load etc for the * abstract template type. */ template class AP_Var { public: /** * The default constrcutor */ AP_Var(type data, const char * name = "", bool sync=false) : _data(data), _name(name), _sync(sync) { } /** * Set the variable value */ void set(type val) { _data = val; if (_sync) save(); } /** * Get the variable value. */ type get() { if (_sync) load(); return _data; } /** * Set the variable value as a float */ void setAsFloat(float val) { set((type)val); } /** * Get the variable as a float */ float getAsFloat() { return (float)get(); } /** * Save a variable to eeprom */ virtual void save() { } /** * Load a variable from eeprom */ virtual void load() { } /** * Get the name. This is useful for ground stations. */ const char * getName() { return _name; } /** * If sync is true the a load will always occure before a get and a save will always * occure before a set. */ bool getSync() { return _sync; } void setSync(bool sync) { _sync = sync; } protected: type _data; /** The data that is stored on the heap */ const char * _name; /** The variable name, useful for gcs and terminal output */ bool _sync; /** Whether or not to call save/load on get/set */ }; //@} //////////////////////////////////////////////////////////////////////////////// /// @name Conversions /// /// Conversion macros and factors. /// //@{ /// XXX this should probably be replaced with radians()/degrees(), but their /// inclusion in wiring.h makes doing that here difficult. #define ToDeg(x) (x*57.2957795131) // *180/pi //@} #endif // _AP_COMMON_H