owlps/owlps-positioning/src/multilaterationalgorithm.cc

88 lines
2.0 KiB
C++

#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.minmax-start") ||
! Configuration::is_configured("positioning.minmax-stop"))
throw missing_configuration(
"You want to use MinMax, but either positioning.minmax-start or"
" positioning.minmax-stop is not defined!") ;
Point3D minmax_start(
Configuration::string_value("positioning.minmax-start")) ;
Point3D minmax_stop(
Configuration::string_value("positioning.minmax-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) ;
assert(request->get_mobile()) ;
const AccessPoint *ap = measurement.get_ap() ;
assert(ap) ;
return
ap->get_trx_power() +
ap->get_antenna_gain() +
20 * log10(
static_cast<double>(PosUtil::LIGHT_SPEED) /
ap->get_frequency() /
(4 * M_PI)
) +
request->get_mobile()->get_antenna_gain() ;
}
Result MultilaterationAlgorithm::compute(const Request &_request)
{
request = &_request ;
compute_ap_distance_circles() ;
Point3D position(multilaterate()) ;
return Result(position, name) ;
}
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) ;
}