From 60626196d57e223170b2c4d7d04bfc345cd74a46 Mon Sep 17 00:00:00 2001 From: Matteo Cypriani Date: Wed, 29 Feb 2012 17:14:23 +0100 Subject: [PATCH] [Positioner] Option generate-single-packet-RPs The new option positioning.generate-single-packet-reference-points allows either to generate one single packet in each generated reference point, or try to match the real requests by generating packets independently. --- owlps-positioner/cfg/owlps-positioner.conf | 6 ++ owlps-positioner/src/stock.cc | 114 ++++++++++++++++----- owlps-positioner/src/userinterface.cc | 4 + 3 files changed, 96 insertions(+), 28 deletions(-) diff --git a/owlps-positioner/cfg/owlps-positioner.conf b/owlps-positioner/cfg/owlps-positioner.conf index a1080cb..762ebaa 100644 --- a/owlps-positioner/cfg/owlps-positioner.conf +++ b/owlps-positioner/cfg/owlps-positioner.conf @@ -103,6 +103,12 @@ csv-file = /tmp/owlps-positioner.log # received. #generate-reference-points = false +# With this option enabled, each generated reference point will contain +# a single packet in a single calibration request. This is the default. +# If disabled, the generated reference points will contain a series of +# packets, better matching the real requests. +#generate-single-packet-reference-points = true + # When the above option is activated, the reference points are generated # with the specified distance (in meters) between one another, in the X # and Y axis. diff --git a/owlps-positioner/src/stock.cc b/owlps-positioner/src/stock.cc index ea82d89..bfdf996 100644 --- a/owlps-positioner/src/stock.cc +++ b/owlps-positioner/src/stock.cc @@ -589,36 +589,94 @@ void Stock::generate_reference_point(const Point3D &point) float point_dst = rx_coord.distance(point) ; // Constant term double common_ss = rx->second.friis_constant_term() ; - // SS for REF1 - const ReferencePoint &ref1_rp = - get_reference_point(ref1_coord) ; - double friis_index = - ref1_rp.friis_index_for_ap(rx->second.get_mac_addr()) ; - double ref1_ss = - common_ss + - ref1.get_trx_power() + - ref1.get_antenna_gain() - - 10 * friis_index * log10(point_dst) ; - // SS for REF2 - const ReferencePoint &ref2_rp = - get_reference_point(ref2_coord) ; - friis_index = - ref2_rp.friis_index_for_ap(rx->second.get_mac_addr()) ; - double ref2_ss = - common_ss + - ref2.get_trx_power() + - ref2.get_antenna_gain() - - 10 * friis_index * log10(point_dst) ; - /* Compute the SS */ - ref1_ss = ref1_ss * ref1_percent / 100 ; - ref2_ss = ref2_ss * ref2_percent / 100 ; - double rx_ss = ref1_ss + ref2_ss ; + const string &rx_mac = rx->second.get_mac_addr() ; + const ReferencePoint &ref1_rp = get_reference_point(ref1_coord) ; + const ReferencePoint &ref2_rp = get_reference_point(ref2_coord) ; - /* Create the measurement, add it to the list */ - Measurement m(&rx->second) ; - m.add_ss(1, rx_ss) ; - measurements[rx->second.get_mac_addr()] = m ; + if (Configuration:: + bool_value("positioning.generate-single-packet-reference-points")) + { + /* Friis indexes for REF1 & REF2 */ + float ref1_friis_idx = ref1_rp.friis_index_for_ap(rx_mac) ; + float ref2_friis_idx = ref2_rp.friis_index_for_ap(rx_mac) ; + + /* SS for REF1 & REF2 */ + double ref1_ss = + common_ss + + ref1.get_trx_power() + + ref1.get_antenna_gain() - + 10 * ref1_friis_idx * log10(point_dst) ; + double ref2_ss = + common_ss + + ref2.get_trx_power() + + ref2.get_antenna_gain() - + 10 * ref2_friis_idx * log10(point_dst) ; + + /* Compute the consolidated SS */ + ref1_ss = ref1_ss * ref1_percent / 100 ; + ref2_ss = ref2_ss * ref2_percent / 100 ; + double rx_ss = ref1_ss + ref2_ss ; + + /* Create the measurement, add it to the list */ + Measurement m(&rx->second) ; + m.add_ss(1, rx_ss) ; + measurements[rx_mac] = m ; + } + else + { + const vector &ref1_cr = + ref1_rp.get_requests() ; + const Measurement *rx_measurement = NULL ; + vector::const_iterator cr ; + + // Search for the first measurement made by RX in ref1_rp + for (cr = ref1_cr.begin() ; + ! rx_measurement && cr != ref1_cr.end() ; ++cr) + rx_measurement = (*cr)->get_measurement(rx_mac) ; + + // The selected reference APs are in coverage of RX, therefore + // we should always find a measurement of RX in ref1_rp + assert(rx_measurement) ; + + for (pkt_id_t pkt_id = 1 ; pkt_id < (*cr)->get_nb_packets() ; + ++pkt_id) + { + /* Friis indexes for REF1 & REF2 */ + float ref1_friis_idx = + ref1_rp.friis_index_for_ap(rx->second.get_mac_addr(), + pkt_id) ; + if (ref1_friis_idx == 0) + continue ; // The packet pkt_id does not exist in ref1_rp + float ref2_friis_idx = + ref2_rp.friis_index_for_ap(rx->second.get_mac_addr(), + pkt_id) ; + if (ref2_friis_idx == 0) + continue ; // The packet pkt_id does not exist in ref2_rp + + /* SS for REF1 & REF2 */ + double ref1_ss = + common_ss + + ref1.get_trx_power() + + ref1.get_antenna_gain() - + 10 * ref1_friis_idx * log10(point_dst) ; + double ref2_ss = + common_ss + + ref2.get_trx_power() + + ref2.get_antenna_gain() - + 10 * ref2_friis_idx * log10(point_dst) ; + + /* Compute the consolidated SS */ + ref1_ss = ref1_ss * ref1_percent / 100 ; + ref2_ss = ref2_ss * ref2_percent / 100 ; + double rx_ss = ref1_ss + ref2_ss ; + + /* Create the measurement, add it to the list */ + Measurement m(&rx->second) ; + m.add_ss(pkt_id, rx_ss) ; + measurements[rx_mac] = m ; + } + } } /* Create the virtual mobile */ diff --git a/owlps-positioner/src/userinterface.cc b/owlps-positioner/src/userinterface.cc index 1a87a8d..542dd0e 100644 --- a/owlps-positioner/src/userinterface.cc +++ b/owlps-positioner/src/userinterface.cc @@ -242,6 +242,10 @@ void UserInterface::fill_positioning_options() po::value()->default_value(false), "Generate reference points from the (auto)calibration requests" " received.") + ("positioning.generate-single-packet-reference-points", + po::value()->default_value(true), + "Generate only one packet per reference point, instead of trying to" + " match the packets in the real requests.") ("positioning.generated-meshing-grain-x", po::value()->default_value(DEFAULT_MESHING_GRAIN), "When generating reference points, this distance (in meters) will"