diff --git a/owlps-positioning/cfg/owlps-positioning.cfg b/owlps-positioning/cfg/owlps-positioning.cfg index 2a57570..ead103c 100644 --- a/owlps-positioning/cfg/owlps-positioning.cfg +++ b/owlps-positioning/cfg/owlps-positioning.cfg @@ -63,6 +63,13 @@ csv-file = /tmp/owlps-positioning.log # request is compared directly to each calibration request. #radar-average-reference-points = false +# With the RADAR algorithm, do not select reference points on which an +# AP is sit, as far as possible (i.e. if there are reference points +# where no AP sits). This is useful if you are using autocalibration +# and want to select only the generated reference points. +# The default is false. +#radar-ignore-ap-reference-points = false + # Generate reference points from the (auto)calibration requests # received. #generate-reference-points = false diff --git a/owlps-positioning/src/stock.cc b/owlps-positioning/src/stock.cc index ceb8ee2..d9aca8a 100644 --- a/owlps-positioning/src/stock.cc +++ b/owlps-positioning/src/stock.cc @@ -387,13 +387,31 @@ closest_reference_point(const Request &request) "Cannot search for the closest reference point: reference points'" " list is empty!") ; + bool ignore_aps = Configuration::bool_value( + "positioning.radar-ignore-ap-reference-points") ; unordered_set::const_iterator i = reference_points.begin() ; + + if (ignore_aps) + { + // Fast-forward to the next non-AP reference point + while (i != reference_points.end() && is_ap_coordinate(*i)) + ++i ; + + // No non-AP reference point was found, we are forced to consider + // the AP reference points + if (i == reference_points.end()) + ignore_aps = false ; + } + float distance = i->ss_square_distance(request) ; unordered_set::const_iterator closest = i ; for (++i ; i != reference_points.end() ; ++i) { + if (ignore_aps && is_ap_coordinate(*i)) + continue ; + float tmp_distance = i->ss_square_distance(request) ; if (tmp_distance < distance) { @@ -673,13 +691,32 @@ closest_calibration_request(const Request &request) "Cannot search for the closest calibration request: calibration" " requests' list is empty!") ; + bool ignore_aps = Configuration::bool_value( + "positioning.radar-ignore-ap-reference-points") ; unordered_set::const_iterator i = calibration_requests.begin() ; + + if (ignore_aps) + { + // Fast-forward to the next non-AP reference point + while (i != calibration_requests.end() && + is_ap_coordinate(*i->get_reference_point())) + ++i ; + + // No non-AP reference point was found, we are forced to consider + // the AP reference points + if (i == calibration_requests.end()) + ignore_aps = false ; + } + float distance = i->ss_square_distance(request) ; unordered_set::const_iterator closest = i ; for (++i ; i != calibration_requests.end() ; ++i) { + if (ignore_aps && is_ap_coordinate(*i->get_reference_point())) + continue ; + float tmp_distance = i->ss_square_distance(request) ; if (tmp_distance < distance) { diff --git a/owlps-positioning/src/userinterface.cc b/owlps-positioning/src/userinterface.cc index 5bc2726..d735580 100644 --- a/owlps-positioning/src/userinterface.cc +++ b/owlps-positioning/src/userinterface.cc @@ -204,6 +204,10 @@ void UserInterface::fill_positioning_options() po::value()->default_value(0.5), "When generating reference points, this distance (in meters) will" " separate each point to the next.") + ("positioning.radar-ignore-ap-reference-points", + po::value()->default_value(false), + "With the RADAR algorithm, try to avoid selecting the reference" + " points which are coordinates of an AP.") ("positioning.accept-new-calibration-requests", po::value()->default_value(false), "Add the calibration requests received during the run-time to"