owlps/owlps-positioning/src/inputdatareader.cc

203 lines
4.8 KiB
C++

#include "inputdatareader.hh"
#include "accesspointsreadercsv.hh"
#include "topologyreadercsv.hh"
#include "inputcsv.hh"
#include "calibrationrequest.hh"
#include "configuration.hh"
#include "posexcept.hh"
#include "stock.hh"
#include <iostream>
using namespace std ;
/* *** Constructors *** */
InputDataReader::InputDataReader()
{
read_access_points() ;
read_topology() ;
read_reference_points() ;
}
InputDataReader::~InputDataReader()
{
for (vector<InputMedium*>::const_iterator i =
reference_points_media.begin() ;
i != reference_points_media.end() ; ++i)
delete *i ;
reference_points_media.clear() ;
}
/* *** Access points *** */
void InputDataReader::read_access_points()
{
if (! Configuration::is_configured("data-input.ap-medium"))
return ;
initialise_access_points_media() ;
}
void InputDataReader::initialise_access_points_media()
{
const vector<string> &media_names =
Configuration::string_vector_value("data-input.ap-medium") ;
for (vector<string>::const_iterator i = media_names.begin() ;
i != media_names.end() ; ++i)
{
if (*i == "CSV")
initialise_access_points_csv() ;
else
throw bad_configuration(
"Access points input medium type unknown « "+ *i +" »") ;
}
}
void InputDataReader::initialise_access_points_csv()
{
if (! Configuration::is_configured("data-input.ap-csv-file"))
throw missing_configuration(
"No input CSV file specified for access points") ;
AccessPointsReaderCSV(
Configuration::string_value("data-input.ap-csv-file")) ;
}
/* *** Topology *** */
void InputDataReader::read_topology()
{
if (! Configuration::is_configured("data-input.topology-medium"))
return ;
initialise_topology_media() ;
}
void InputDataReader::initialise_topology_media()
{
const vector<string> &media_names =
Configuration::string_vector_value("data-input.topology-medium") ;
for (vector<string>::const_iterator i = media_names.begin() ;
i != media_names.end() ; ++i)
{
if (*i == "CSV")
initialise_topology_csv() ;
else
throw bad_configuration(
"Topology input medium type unknown « "+ *i +" »") ;
}
}
void InputDataReader::initialise_topology_csv()
{
if (! Configuration::is_configured("data-input.areas-csv-file"))
throw missing_configuration(
"No topology input CSV file specified for areas") ;
if (! Configuration::is_configured("data-input.waypoints-csv-file"))
throw missing_configuration(
"No topology input CSV file specified for waypoints") ;
TopologyReaderCSV(
Configuration::string_value("data-input.areas-csv-file"),
Configuration::string_value("data-input.waypoints-csv-file")) ;
}
/* *** Reference points *** */
void InputDataReader::read_reference_points()
{
if (! Configuration::is_configured("data-input.reference-points-medium"))
return ;
initialise_reference_points_media() ;
read_from_reference_points_media() ;
}
void InputDataReader::initialise_reference_points_media()
{
const vector<string> &media_names =
Configuration::string_vector_value("data-input.reference-points-medium") ;
for (vector<string>::const_iterator i = media_names.begin() ;
i != media_names.end() ; ++i)
{
if (*i == "CSV")
initialise_reference_points_csv() ;
else
throw bad_configuration(
"Reference points input medium type unknown « "+ *i +" »") ;
}
}
void InputDataReader::initialise_reference_points_csv()
{
if (! Configuration::is_configured("data-input.reference-points-csv-file"))
throw missing_configuration(
"No reference points input CSV file is configured") ;
reference_points_media.push_back(
new InputCSV(
Configuration::string_value("data-input.reference-points-csv-file"))) ;
}
void InputDataReader::read_from_reference_points_media()
{
for (vector<InputMedium*>::const_iterator i =
reference_points_media.begin() ;
i != reference_points_media.end() ; ++i)
{
while (! (*i)->eof())
{
Request &request =
const_cast<Request&>((*i)->get_next_request()) ;
if (! request)
continue ;
CalibrationRequest *calibration_request =
dynamic_cast<CalibrationRequest*>(&request) ;
if (calibration_request == NULL)
cerr << "Warning! Invalid calibration request at line "
<< (*i)->get_current_line_nb() << endl ;
else
stock_calibration_request(*calibration_request) ;
}
}
}
void InputDataReader::
stock_calibration_request(const CalibrationRequest &request) const
{
const CalibrationRequest &calibration_request =
Stock::find_create_calibration_request(request) ;
calibration_request.reference_point_backward_link() ;
}