owlps/owlps-positioning/src/input.cc

132 lines
2.7 KiB
C++
Raw Normal View History

#include "input.hh"
#include "inputcsv.hh"
#include "inputlogcsv.hh"
#include "calibrationrequest.hh"
#include "configuration.hh"
#include "posexcept.hh"
#include "stock.hh"
using namespace std ;
/* *** Constructors *** */
Input::Input()
{
medium = NULL ;
initialise_input_medium() ;
initialise_log_media() ;
}
Input::~Input()
{
delete medium ;
}
/* *** Operations *** */
void Input::initialise_input_medium()
{
if (! Configuration::is_configured("input.medium"))
throw no_input_medium() ;
const string &medium_name =
Configuration::string_value("input.medium") ;
if (medium_name == "CSV")
{
if (! Configuration::is_configured("input.csv-file"))
throw no_input_csv_file() ;
medium = new
InputCSV(Configuration::string_value("input.csv-file")) ;
}
else
throw input_medium_type_unknown(medium_name) ;
}
void Input::initialise_log_media()
{
if (! Configuration::is_configured("log.medium"))
return ;
if (Configuration::value_exists_in_string_vector("log.medium", "none"))
return ;
const vector<string> &media_names =
Configuration::string_vector_value("log.medium") ;
for (vector<string>::const_iterator i = media_names.begin() ;
i != media_names.end() ; ++i)
{
if (*i == "CSV")
initialise_log_csv() ;
else
throw input_medium_type_unknown(*i) ;
}
}
void Input::initialise_log_csv()
{
if (! Configuration::is_configured("log.csv-file"))
throw no_log_csv_file() ;
log_media.push_back(
new InputLogCSV(
Configuration::string_value("log.csv-file"))) ;
}
const Request& Input::get_next_request() const
{
if (! eof())
{
const Request &request = medium->get_next_request() ;
add_request_to_stock(request) ;
log_current_request() ;
}
return medium->get_current_request() ;
}
bool Input::eof() const
{
if (medium == NULL)
throw null_input_medium() ;
return medium->eof() ;
}
void Input::add_request_to_stock(const Request &request) const
{
// For the moment we add only the CalibrationRequests to the Stock
const CalibrationRequest *calibration_request =
dynamic_cast<const CalibrationRequest*>(&request) ;
if (calibration_request == NULL)
return ;
// Add request to the Stock
const CalibrationRequest &stock_calibration_request =
Stock::find_create_calibration_request(*calibration_request) ;
// Add the request to the request list of its reference point
stock_calibration_request.reference_point_backward_link() ;
}
void Input::log_current_request() const
{
for (vector<InputLogMedium*>::const_iterator i = log_media.begin() ;
i != log_media.end() ; ++i)
(*i)->log_request(medium->get_current_request()) ;
}