MAV'RIC
|
00001 /******************************************************************************* 00002 * Copyright (c) 2009-2016, MAV'RIC Development Team 00003 * All rights reserved. 00004 * 00005 * Redistribution and use in source and binary forms, with or without 00006 * modification, are permitted provided that the following conditions are met: 00007 * 00008 * 1. Redistributions of source code must retain the above copyright notice, 00009 * this list of conditions and the following disclaimer. 00010 * 00011 * 2. Redistributions in binary form must reproduce the above copyright notice, 00012 * this list of conditions and the following disclaimer in the documentation 00013 * and/or other materials provided with the distribution. 00014 * 00015 * 3. Neither the name of the copyright holder nor the names of its contributors 00016 * may be used to endorse or promote products derived from this software without 00017 * specific prior written permission. 00018 * 00019 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 00020 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00021 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 00022 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 00023 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 00024 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 00025 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 00026 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 00027 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 00028 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 00029 * POSSIBILITY OF SUCH DAMAGE. 00030 ******************************************************************************/ 00031 00032 /******************************************************************************* 00033 * \file gps_hub.hpp 00034 * 00035 * \author MAV'RIC Team 00036 * \author Julien Lecoeur 00037 * 00038 * \brief Hub for GPS redundancy 00039 * 00040 ******************************************************************************/ 00041 00042 00043 #ifndef GPS_HUB_HPP_ 00044 #define GPS_HUB_HPP_ 00045 00046 #include "drivers/gps.hpp" 00047 00048 00054 template<uint32_t N> 00055 class Gps_hub: public Gps 00056 { 00057 public: 00058 static_assert(N >= 1, "Need at least one GPS"); 00059 00063 Gps_hub(std::array<Gps*, N> gps_list): 00064 gps_list_(gps_list), 00065 current_gps_(gps_list_[0]) 00066 {}; 00067 00074 bool update(void) 00075 { 00076 bool ret = false; 00077 00078 // Update all gps 00079 for (size_t i = 0; i < N; i++) 00080 { 00081 ret |= gps_list_[i]->update(); 00082 } 00083 00084 // Choose which one is best 00085 for (size_t i = 0; i < N; i++) 00086 { 00087 if (gps_list_[i]->healthy()) 00088 { 00089 if ((gps_list_[i]->fix() > current_gps_->fix()) 00090 || ((gps_list_[i]->fix() == current_gps_->fix()) && (gps_list_[i]->num_sats() > current_gps_->num_sats()))) 00091 { 00092 current_gps_ = gps_list_[i]; 00093 } 00094 } 00095 } 00096 00097 return ret; 00098 }; 00099 00105 bool init(void) 00106 { 00107 bool ret = false; 00108 00109 // Init all gps 00110 for (size_t i = 0; i < N; i++) 00111 { 00112 ret |= gps_list_[i]->init(); 00113 } 00114 00115 return ret; 00116 }; 00117 00118 00122 void configure(void) 00123 { 00124 // Configure all gps 00125 for (size_t i = 0; i < N; i++) 00126 { 00127 gps_list_[i]->configure(); 00128 } 00129 }; 00130 00131 00137 float last_update_us(void) const 00138 { 00139 return current_gps_->last_update_us(); 00140 }; 00141 00142 00148 float last_position_update_us(void) const 00149 { 00150 return current_gps_->last_position_update_us(); 00151 }; 00152 00153 00159 float last_velocity_update_us(void) const 00160 { 00161 return current_gps_->last_velocity_update_us(); 00162 }; 00163 00164 00170 global_position_t position_gf(void) const 00171 { 00172 return current_gps_->position_gf(); 00173 }; 00174 00175 00181 float horizontal_position_accuracy(void) const 00182 { 00183 return current_gps_->horizontal_position_accuracy(); 00184 }; 00185 00186 00192 float vertical_position_accuracy(void) const 00193 { 00194 return current_gps_->vertical_position_accuracy(); 00195 }; 00196 00197 00203 std::array<float, 3> velocity_lf(void) const 00204 { 00205 return current_gps_->velocity_lf(); 00206 }; 00207 00208 00214 float velocity_accuracy(void) const 00215 { 00216 return current_gps_->velocity_accuracy(); 00217 }; 00218 00219 00225 float heading(void) const 00226 { 00227 return current_gps_->heading(); 00228 }; 00229 00230 00236 float heading_accuracy(void) const 00237 { 00238 return current_gps_->heading_accuracy(); 00239 }; 00240 00241 00247 uint8_t num_sats(void) const 00248 { 00249 return current_gps_->num_sats(); 00250 }; 00251 00252 00258 gps_fix_t fix(void) const 00259 { 00260 return current_gps_->fix(); 00261 }; 00262 00263 00269 bool healthy(void) const 00270 { 00271 return current_gps_->healthy(); 00272 }; 00273 00274 protected: 00275 std::array<Gps*, N> gps_list_; 00276 Gps* current_gps_; 00277 }; 00278 00279 00280 #endif /* GPS_HUB_HPP_ */