owlps/owlps-positioning/src/multilaterationalgorithm.cc

91 lines
2.1 KiB
C++

/*
* This file is part of the Owl Positioning System (OwlPS).
* OwlPS is a project of the University of Franche-Comté
* (Université de Franche-Comté), France.
*/
#include "multilaterationalgorithm.hh"
#include "minmax.hh"
#include "mobile.hh"
#include "configuration.hh"
#include "posexcept.hh"
using namespace std ;
using std::tr1::unordered_map ;
/* *** Constructors *** */
MultilaterationAlgorithm::MultilaterationAlgorithm():
request(NULL)
{
// Will be changed when other multilateration methods will be
// implemented.
if (! Configuration::is_configured("positioning.area-start") ||
! Configuration::is_configured("positioning.area-stop"))
throw missing_configuration(
"You want to use MinMax, but either positioning.area-start or"
" positioning.area-stop is not defined!") ;
Point3D minmax_start(
Configuration::string_value("positioning.area-start")) ;
Point3D minmax_stop(
Configuration::string_value("positioning.area-stop")) ;
multilateration_method = new MinMax(minmax_start, minmax_stop) ;
}
MultilaterationAlgorithm::~MultilaterationAlgorithm()
{
delete multilateration_method ;
}
/* *** Operations *** */
double MultilaterationAlgorithm::
make_constant_term(const Measurement &measurement)
{
assert(request) ;
const Mobile *mobile = request->get_mobile() ;
assert(mobile) ;
const AccessPoint *ap = measurement.get_ap() ;
assert(ap) ;
return
ap->friis_constant_term() +
mobile->get_antenna_gain() +
mobile->get_trx_power() ;
}
Result MultilaterationAlgorithm::compute(const Request &_request)
{
request = &_request ;
compute_ap_distance_circles() ;
Point3D position(multilaterate()) ;
return Result(request, name, position) ;
}
void MultilaterationAlgorithm::compute_ap_distance_circles()
{
ap_distances.clear() ;
const unordered_map<string, Measurement> &measurements =
request->get_measurements() ;
for (unordered_map<string, Measurement>::const_iterator i =
measurements.begin() ; i != measurements.end() ; ++i)
ap_distances[i->second.get_ap()] = estimate_distance(i->second) ;
}