#include "multilaterationalgorithm.hh" #include "minmax.hh" #include "mobile.hh" using namespace std ; using std::tr1::unordered_map ; /* *** Constructors *** */ MultilaterationAlgorithm::MultilaterationAlgorithm(): request(NULL) { // Will be changed when other multilateration methods will be // implemented multilateration_method = new MinMax(Point3D(-0.5, -0.5, 0), Point3D(10, 31.5, 6)) ; // FIXME: minmax start and 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(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 &measurements = request->get_measurements() ; for (unordered_map::const_iterator i = measurements.begin() ; i != measurements.end() ; ++i) ap_distances[i->second.get_ap()] = estimate_distance(i->second) ; }