[Positioning] +CalibrationRequest, -CalibrationMeasurement

Delete class CalibrationMeasurement and add class CalibrationRequest:
the ReferencePoint must be linked by the Request, not by each
Measurement of the Request.

Adapt ReferencePoint to link a CalibrationRequest instead of a
CalibrationMeasurement.

Request:
- Destructor is now virtual to allow polymorphism.
- Reactivate tests on get_measurements() and set_measurements().
This commit is contained in:
Matteo Cypriani 2010-02-16 19:31:25 +01:00
parent a5aa1af433
commit ce92f0979e
12 changed files with 278 additions and 255 deletions

View File

@ -30,7 +30,7 @@ LDFLAGS = -lm -lrt -lboost_program_options
TARGET = owlps-positioning
OBJ = posutil.o stock.o timestamp.o point3d.o referencepoint.o \
waypoint.o building.o area.o wifidevice.o accesspoint.o \
mobile.o measurement.o calibrationmeasurement.o request.o \
mobile.o measurement.o request.o calibrationrequest.o \
configuration.o userinterface.o input.o \
inputcsv.o inputlogcsv.o
OBJ_NOTEST = posexcept.o
@ -66,8 +66,8 @@ wifidevice.o: posutil.o
accesspoint.o: wifidevice.o point3d.o
mobile.o: wifidevice.o
measurement.o: accesspoint.o
calibrationmeasurement.o: measurement.o referencepoint.o
request.o: timestamp.o measurement.o
calibrationrequest.o: request.o referencepoint.o
inputcsv.o: inputmedium.hh request.o stock.o
inputlogcsv.o: inputlogmedium.hh request.o
input.o: posexcept.o

View File

@ -1,29 +0,0 @@
#include "calibrationmeasurement.hh"
/* *** Operators *** */
const CalibrationMeasurement&
CalibrationMeasurement::operator=(const CalibrationMeasurement &cm)
{
if (this == &cm)
return *this ;
this->Measurement::operator=(cm) ;
reference_point = cm.reference_point ;
return *this ;
}
bool CalibrationMeasurement::operator==(const CalibrationMeasurement &cm)
{
if (this == &cm)
return true ;
return
this->Measurement::operator==(cm) &&
reference_point == cm.reference_point ;
}

View File

@ -1,84 +0,0 @@
#ifndef _OWLPS_POSITIONING_CALIBRATIONMEASUREMENT_HH_
#define _OWLPS_POSITIONING_CALIBRATIONMEASUREMENT_HH_
class ReferencePoint ;
#include "measurement.hh"
/// Represents a Measurement that constructed from calibration Request
class CalibrationMeasurement: public Measurement
{
protected:
/// The reference point the mobile calibrates
ReferencePoint *reference_point ;
public:
/// \brief Constructs a CalibrationMeasurement from an AccessPoint, a
/// list of signal strengths and a ReferencePoint (or default constructor)
CalibrationMeasurement(const AccessPoint *_ap = NULL,
const std::vector<int> &_ss_list = std::vector<int>(),
ReferencePoint *_reference_point = NULL):
Measurement(_ap, _ss_list), reference_point(_reference_point) {}
/// Copy constructor
CalibrationMeasurement(const CalibrationMeasurement &cm):
Measurement(cm), reference_point(cm.reference_point) {}
/// Constructs a CalibrationMeasurement from a Measurement
CalibrationMeasurement(const Measurement &m):
Measurement(m), reference_point(NULL) {}
~CalibrationMeasurement(void) {} ///< Destructor (do nothing)
/** @name Read accessors */
//@{
/// #reference_point read accessor
ReferencePoint* get_reference_point(void) const ;
//@}
/** @name Write accessors */
//@{
/// #reference_point write accessor
void set_reference_point(const ReferencePoint *_rp) ;
//@}
/** @name Operators */
//@{
const CalibrationMeasurement& operator=(const CalibrationMeasurement &cm) ;
bool operator==(const CalibrationMeasurement &cm) ;
bool operator!=(const CalibrationMeasurement &cm) ;
//@}
} ;
/* *** Read accessors *** */
inline ReferencePoint* CalibrationMeasurement::get_reference_point(void) const
{
return reference_point ;
}
/* *** Write accessors *** */
inline void CalibrationMeasurement::set_reference_point(
const ReferencePoint *_rp)
{
reference_point = const_cast<ReferencePoint*>(_rp) ;
}
/* *** Operators *** */
inline bool CalibrationMeasurement::operator!=(const CalibrationMeasurement &cm)
{
return !(*this == cm) ;
}
#endif // _OWLPS_POSITIONING_CALIBRATIONMEASUREMENT_HH_

View File

@ -0,0 +1,40 @@
#include "calibrationrequest.hh"
/* *** Write accessors *** */
void CalibrationRequest::clear()
{
Request::clear() ;
reference_point = NULL ;
}
/* *** Operators *** */
const CalibrationRequest&
CalibrationRequest::operator=(const CalibrationRequest &source)
{
if (this == &source)
return *this ;
this->Request::operator=(source) ;
reference_point = source.reference_point ;
return *this ;
}
bool CalibrationRequest::operator==(const CalibrationRequest &source)
{
if (this == &source)
return true ;
return
this->Request::operator==(source) &&
reference_point == source.reference_point ;
}

View File

@ -0,0 +1,83 @@
#ifndef _OWLPS_POSITIONING_CALIBRATIONREQUEST_HH_
#define _OWLPS_POSITIONING_CALIBRATIONREQUEST_HH_
class ReferencePoint ;
#include "request.hh"
/// Represents a calibration Request sent by a mobile
class CalibrationRequest: public Request
{
protected:
/// The reference point the mobile calibrates
ReferencePoint *reference_point ;
public:
CalibrationRequest(void): reference_point(NULL) {}
/// Copy constructor
CalibrationRequest(const CalibrationRequest &source):
Request(source), reference_point(source.reference_point) {}
/// \brief Constructs a CalibrationRequest from a Request and
/// (possibly) a ReferencePoint)
CalibrationRequest(const Request &source,
ReferencePoint *_reference_point = NULL):
Request(source), reference_point(_reference_point) {}
~CalibrationRequest(void) {}
/** @name Read accessors */
//@{
/// #reference_point read accessor
ReferencePoint* get_reference_point(void) const ;
//@}
/** @name Write accessors */
//@{
/// #reference_point write accessor
void set_reference_point(const ReferencePoint *_rp) ;
/// Reinitialises all attributes
void clear(void) ;
//@}
/** @name Operators */
//@{
const CalibrationRequest& operator=(const CalibrationRequest &source) ;
bool operator==(const CalibrationRequest &source) ;
bool operator!=(const CalibrationRequest &source) ;
//@}
} ;
/* *** Read accessors *** */
inline ReferencePoint* CalibrationRequest::get_reference_point(void) const
{
return reference_point ;
}
/* *** Write accessors *** */
inline void CalibrationRequest::set_reference_point(
const ReferencePoint *_rp)
{
reference_point = const_cast<ReferencePoint*>(_rp) ;
}
/* *** Operators *** */
inline bool CalibrationRequest::operator!=(const CalibrationRequest &source)
{
return !(*this == source) ;
}
#endif // _OWLPS_POSITIONING_CALIBRATIONREQUEST_HH_

View File

@ -9,12 +9,12 @@ using namespace std ;
/**
* Clears #measurements, but does not deallocate the values pointed by
* Clears #requests, but does not deallocate the values pointed by
* the elements into it.
*/
ReferencePoint::~ReferencePoint()
{
measurements.clear() ;
requests.clear() ;
}
@ -129,26 +129,26 @@ ReferencePoint::~ReferencePoint()
/* *** Operators *** */
const ReferencePoint& ReferencePoint::operator=(const ReferencePoint &rp)
const ReferencePoint& ReferencePoint::operator=(const ReferencePoint &source)
{
if (this == &rp)
if (this == &source)
return *this ;
this->Point3D::operator=(rp) ;
measurements = rp.measurements ;
this->Point3D::operator=(source) ;
requests = source.requests ;
return *this ;
}
bool ReferencePoint::operator==(const ReferencePoint &rp) const
bool ReferencePoint::operator==(const ReferencePoint &source) const
{
if (this == &rp)
if (this == &source)
return true ;
return
this->Point3D::operator==(rp) &&
measurements == rp.measurements ;
this->Point3D::operator==(source) &&
requests == source.requests ;
}
@ -158,13 +158,13 @@ ostream &operator<<(ostream &os, const ReferencePoint &rp)
// Coordinates
os << (Point3D) rp << '\n' ;
// List of measurements
if (rp.measurements.size() == 0)
os << "No measurement." << '\n' ;
// List of requests
if (rp.requests.size() == 0)
os << "No request." << '\n' ;
else
for (vector<CalibrationMeasurement*>::const_iterator
i = rp.measurements.begin() ;
i != rp.measurements.end() ; ++i)
for (vector<CalibrationRequest*>::const_iterator
i = rp.requests.begin() ;
i != rp.requests.end() ; ++i)
os << '\n' << *i ;
return os ;

View File

@ -1,7 +1,7 @@
#ifndef _OWLPS_POSITIONING_REFERENCEPOINT_HH_
#define _OWLPS_POSITIONING_REFERENCEPOINT_HH_
class CalibrationMeasurement ;
class CalibrationRequest ;
#include "point3d.hh"
@ -12,10 +12,10 @@ class CalibrationMeasurement ;
class ReferencePoint: public Point3D
{
protected:
/// List of CalibrationMeasurement associated with the ReferencePoint
/** Note that \em measurements is a \em pointer list: only pointers
/// List of CalibrationRequest associated with the ReferencePoint
/** Note that \em requests is a \em pointer list: only pointers
are stored, not values. */
std::vector<CalibrationMeasurement*> measurements ;
std::vector<CalibrationRequest*> requests ;
public:
/// 3-float constructor or default constructor
@ -24,30 +24,30 @@ public:
/// Constructs a ReferencePoint from a Point3D
ReferencePoint(const Point3D &p): Point3D(p) {}
/// Copy constructor
ReferencePoint(const ReferencePoint &rp):
Point3D(rp), measurements(rp.measurements) {}
ReferencePoint(const ReferencePoint &source):
Point3D(source), requests(source.requests) {}
~ReferencePoint(void) ; ///< Destructor
/** @name Read accessors */
//@{
/// #measurements read accessor
const std::vector<CalibrationMeasurement*>& get_measurements(void) const ;
/// #requests read accessor
const std::vector<CalibrationRequest*>& get_requests(void) const ;
//@}
/** @name Write accessors */
//@{
/// Adds a Measurement to the \link #measurements measurement list\endlink
void add_measurement(const CalibrationMeasurement *cm) ;
// float get_ss_square_distance(const vector<CalibrationMeasurement> &m) const ;
/// Adds a Request to the \link #requests request list\endlink
void add_request(const CalibrationRequest *cm) ;
// float get_ss_square_distance(const vector<CalibrationRequest> &m) const ;
// bool get_power_for_ap(const string &ap_mac, float *p) const ;
//@}
/** @name Operators */
//@{
const ReferencePoint& operator=(const ReferencePoint &rp) ;
bool operator==(const ReferencePoint &rp) const ;
bool operator!=(const ReferencePoint &rp) const ;
const ReferencePoint& operator=(const ReferencePoint &source) ;
bool operator==(const ReferencePoint &source) const ;
bool operator!=(const ReferencePoint &source) const ;
//@}
/// Displays a ReferencePoint
@ -60,9 +60,9 @@ public:
inline const
std::vector<CalibrationMeasurement*>& ReferencePoint::get_measurements() const
std::vector<CalibrationRequest*>& ReferencePoint::get_requests() const
{
return measurements ;
return requests ;
}
@ -71,16 +71,16 @@ std::vector<CalibrationMeasurement*>& ReferencePoint::get_measurements() const
/**
* @param cm A pointer to the CalibrationMeasurement to add. If it is
* @param cm A pointer to the CalibrationRequest to add. If it is
* NULL, nothing will be done.
* The memory pointed by this pointer must not be deallocated before
* the ReferencePoint destruction (do \em not pass a pointer to a local
* variable!).
*/
inline void ReferencePoint::add_measurement(const CalibrationMeasurement *cm)
inline void ReferencePoint::add_request(const CalibrationRequest *cm)
{
if (cm != NULL)
measurements.push_back(const_cast<CalibrationMeasurement*>(cm)) ;
requests.push_back(const_cast<CalibrationRequest*>(cm)) ;
}
@ -88,9 +88,9 @@ inline void ReferencePoint::add_measurement(const CalibrationMeasurement *cm)
/* *** Operators *** */
inline bool ReferencePoint::operator!=(const ReferencePoint &rp) const
inline bool ReferencePoint::operator!=(const ReferencePoint &source) const
{
return !(*this == rp) ;
return !(*this == source) ;
}

View File

@ -25,21 +25,24 @@ protected:
public:
/// Constructs a Request from a list of Measurement (or default constructor)
Request(const std::tr1::unordered_map<std::string, Measurement> &_measurements
= std::tr1::unordered_map<std::string, Measurement>()) ;
Request(const std::tr1::unordered_map<std::string, Measurement>
&_measurements =
std::tr1::unordered_map<std::string, Measurement>()) ;
/// Constructs a Request from a timestamp and (possibly) a Measurement list
Request(const Timestamp &_timestamp,
const std::tr1::unordered_map<std::string, Measurement> &_measurements
= std::tr1::unordered_map<std::string, Measurement>()) ;
const std::tr1::unordered_map<std::string, Measurement>
&_measurements =
std::tr1::unordered_map<std::string, Measurement>()) ;
/// \brief Constructs a request from a mobile and a timestamp and (possibly)
/// a Measurement list
Request(const Mobile *_mobile, const Timestamp &_timestamp,
const std::tr1::unordered_map<std::string, Measurement> &_measurements
= std::tr1::unordered_map<std::string, Measurement>()) ;
const std::tr1::unordered_map<std::string, Measurement>
&_measurements =
std::tr1::unordered_map<std::string, Measurement>()) ;
/// Copy constructor
Request(const Request &source) ;
~Request(void) ; ///< Destructor
virtual ~Request(void) ;
/** @name Read accessors */
//@{

View File

@ -1,84 +0,0 @@
#include <cxxtest/TestSuite.h>
#include "calibrationmeasurement.hh"
class CalibrationMeasurement_test: public CxxTest::TestSuite
{
public:
void test_constructors(void)
{
// Default constructor
CalibrationMeasurement cm00 ;
std::vector<int> vi1 ;
CalibrationMeasurement cm01(NULL, vi1, NULL) ;
TS_ASSERT_EQUALS(cm00, cm01) ;
// Copy constructor
AccessPoint ap1 ;
ReferencePoint rp1 ;
CalibrationMeasurement cm1(&ap1, vi1, &rp1) ;
CalibrationMeasurement cm2(cm1) ;
TS_ASSERT_EQUALS(cm1, cm2) ;
// Measurement copy constructor
Measurement m1(&ap1, vi1) ;
CalibrationMeasurement cm3(m1) ;
TS_ASSERT_EQUALS(m1, cm3) ;
}
void test_accessors(void)
{
// Simple read accessors
AccessPoint ap1 ;
std::vector<int> vi1 ;
CalibrationMeasurement cm1(&ap1, vi1) ;
TS_ASSERT_EQUALS(cm1.get_ap(), &ap1) ;
TS_ASSERT_EQUALS(cm1.get_ss_list(), vi1) ;
TS_ASSERT_EQUALS(cm1.get_average_ss(), 0) ;
// Write & read accessors
AccessPoint ap2 ;
cm1.set_ap(&ap2) ;
TS_ASSERT_EQUALS(cm1.get_ap(), &ap2) ;
cm1.add_ss(-33) ;
cm1.add_ss(-78) ;
cm1.add_ss(-21) ;
vi1.push_back(-33) ;
vi1.push_back(-78) ;
vi1.push_back(-21) ;
TS_ASSERT_EQUALS(cm1.get_ss_list(), vi1) ;
std::vector<int> vi2 ;
vi1.push_back(-54) ;
vi1.push_back(-1) ;
cm1.set_ss_list(vi2) ;
TS_ASSERT_EQUALS(cm1.get_ss_list(), vi2) ;
cm1.clear() ;
CalibrationMeasurement cm2 ;
TS_ASSERT_EQUALS(cm1, cm2) ;
}
void test_operators(void)
{
// ==
AccessPoint ap1 ;
CalibrationMeasurement cm1(&ap1) ;
CalibrationMeasurement cm2(&ap1) ;
TS_ASSERT_EQUALS(cm1, cm2) ;
// !=
AccessPoint ap2 ;
CalibrationMeasurement cm3(&ap2) ;
TS_ASSERT_DIFFERS(cm1, cm3) ;
// =
cm2 = cm3 ;
TS_ASSERT_EQUALS(cm2, cm3) ;
}
} ;

View File

@ -0,0 +1,94 @@
#include <cxxtest/TestSuite.h>
#include "calibrationrequest.hh"
class CalibrationRequest_test: public CxxTest::TestSuite
{
public:
void test_constructors(void)
{
// Default constructor
CalibrationRequest calibrationrequest00 ;
std::vector<int> vi1 ;
CalibrationRequest calibrationrequest01(Request(), NULL) ;
TS_ASSERT_EQUALS(calibrationrequest00, calibrationrequest01) ;
// Copy constructor
Mobile mobile1 ;
Timestamp timestamp1 ;
timestamp1.now() ;
Request request1(&mobile1, timestamp1) ;
ReferencePoint referencepoint1 ;
CalibrationRequest calibrationrequest1(request1, &referencepoint1) ;
CalibrationRequest calibrationrequest2(calibrationrequest1) ;
TS_ASSERT_EQUALS(calibrationrequest1, calibrationrequest2) ;
// Request copy constructor
CalibrationRequest calibrationrequest3(request1) ;
TS_ASSERT_EQUALS(request1, calibrationrequest3) ;
}
void test_accessors(void)
{
// Note: for the moment, I leave the test of get_measurements() and
// set_measurements() to Request_test.
// Simple read accessors
Mobile mobile1 ;
Timestamp timestamp1 ;
timestamp1.now() ;
Request request1(&mobile1, timestamp1) ;
ReferencePoint referencepoint1(1,2,3) ;
CalibrationRequest calibrationrequest1(request1, &referencepoint1) ;
TS_ASSERT_EQUALS(calibrationrequest1.get_mobile(), &mobile1) ;
TS_ASSERT_EQUALS(calibrationrequest1.get_timestamp(), timestamp1) ;
TS_ASSERT_EQUALS(calibrationrequest1.get_reference_point(),
&referencepoint1) ;
// Write & read accessors
Mobile mobile2 ;
calibrationrequest1.set_mobile(&mobile2) ;
TS_ASSERT_EQUALS(calibrationrequest1.get_mobile(), &mobile2) ;
timestamp1.set_timestamp_ms(42) ;
calibrationrequest1.set_timestamp(timestamp1) ;
TS_ASSERT_EQUALS(calibrationrequest1.get_timestamp(), timestamp1) ;
ReferencePoint referencepoint2(4,3,2) ;
calibrationrequest1.set_reference_point(&referencepoint2) ;
TS_ASSERT_EQUALS(calibrationrequest1.get_reference_point(),
&referencepoint2) ;
calibrationrequest1.clear() ;
CalibrationRequest calibrationrequest2 ;
TS_ASSERT_EQUALS(calibrationrequest1, calibrationrequest2) ;
}
void test_operators(void)
{
// ==
Mobile mobile1 ;
Timestamp timestamp1 ;
timestamp1.now() ;
Request request1(&mobile1, timestamp1) ;
ReferencePoint referencepoint1 ;
CalibrationRequest calibrationrequest1(request1, &referencepoint1) ;
CalibrationRequest calibrationrequest2(request1, &referencepoint1) ;
TS_ASSERT_EQUALS(calibrationrequest1, calibrationrequest2) ;
// !=
timestamp1.now() ;
Request request2(&mobile1, timestamp1) ;
ReferencePoint referencepoint2 ;
CalibrationRequest calibrationrequest3(request2, &referencepoint2) ;
TS_ASSERT_DIFFERS(calibrationrequest1, calibrationrequest3) ;
// =
calibrationrequest2 = calibrationrequest3 ;
TS_ASSERT_EQUALS(calibrationrequest2, calibrationrequest3) ;
}
} ;

View File

@ -1,7 +1,7 @@
#include <cxxtest/TestSuite.h>
#include "referencepoint.hh"
#include "calibrationmeasurement.hh"
#include "calibrationrequest.hh"
class ReferencePoint_test: public CxxTest::TestSuite
{
@ -40,15 +40,15 @@ public:
TS_ASSERT_EQUALS(rp1.get_z(), 5) ;
// Write & read accessors
CalibrationMeasurement cm1, cm2, cm3 ;
rp1.add_measurement(&cm1) ;
rp1.add_measurement(&cm2) ;
rp1.add_measurement(&cm3) ;
std::vector<CalibrationMeasurement*> vcm1 ;
vcm1.push_back(&cm1) ;
vcm1.push_back(&cm2) ;
vcm1.push_back(&cm3) ;
TS_ASSERT_EQUALS(rp1.get_measurements(), vcm1) ;
CalibrationRequest calibrationrequest1, calibrationrequest2, calibrationrequest3 ;
rp1.add_request(&calibrationrequest1) ;
rp1.add_request(&calibrationrequest2) ;
rp1.add_request(&calibrationrequest3) ;
std::vector<CalibrationRequest*> vcr1 ;
vcr1.push_back(&calibrationrequest1) ;
vcr1.push_back(&calibrationrequest2) ;
vcr1.push_back(&calibrationrequest3) ;
TS_ASSERT_EQUALS(rp1.get_requests(), vcr1) ;
rp1.set_x(42) ;
TS_ASSERT_EQUALS(rp1.get_x(), 42) ;
rp1.set_y(321) ;

View File

@ -40,7 +40,7 @@ public:
Request r1(&mob1, current_time, measurements) ;
TS_ASSERT_EQUALS(r1.get_mobile(), &mob1) ;
TS_ASSERT_EQUALS(r1.get_timestamp(), current_time) ;
//TS_ASSERT_EQUALS(r1.get_measurements(), measurements) ;
TS_ASSERT_EQUALS(r1.get_measurements(), measurements) ;
// Write & read accessors
Mobile mob2 ;
@ -55,7 +55,7 @@ public:
Measurement meas2(&ap2) ;
measurements["aa:bb:cc:dd:ee:02"] = meas2 ;
r1.set_measurements(measurements) ;
//TS_ASSERT_EQUALS(r1.get_measurements(), measurements) ;
TS_ASSERT_EQUALS(r1.get_measurements(), measurements) ;
// clear()
r1.clear() ;