39 lines
1.0 KiB
C++
39 lines
1.0 KiB
C++
#include "frbhmbasic.hh"
|
|
|
|
|
|
|
|
Result FRBHMBasic::compute(const Request &_request)
|
|
{
|
|
request = &_request ;
|
|
|
|
// Select the closest point in SS
|
|
closest_in_ss = &select_point(_request) ;
|
|
|
|
compute_ap_distance_circles() ;
|
|
Point3D position(multilaterate_2d(closest_in_ss->get_z())) ;
|
|
|
|
return Result(position, name) ;
|
|
}
|
|
|
|
|
|
/* TODO:
|
|
* It is ugly to duplicate this function from FBCM. We should find a
|
|
* trick to do it prettier. The thing is that FBCM::estimate_distance()
|
|
* will not call FRBHMBasic::friis_index() but FBCM::friis_index(),
|
|
* which is wrong in our case.
|
|
*/
|
|
float FRBHMBasic::estimate_distance(const Measurement &measurement)
|
|
{
|
|
double constant_term = make_constant_term(measurement) ;
|
|
const float &average_ss = measurement.get_average_ss() ;
|
|
const AccessPoint *ap = measurement.get_ap() ;
|
|
return pow(10, (constant_term - average_ss) /
|
|
(10 * friis_index(ap))) ;
|
|
}
|
|
|
|
|
|
inline float FRBHMBasic::friis_index(const AccessPoint *const ap) const
|
|
{
|
|
return closest_in_ss->friis_index_for_ap(ap->get_mac_addr()) ;
|
|
}
|