[Positioning] Add Input & posexcept.{hh,cc}

- Add files posexcept.{hh,cc} that contains exception classes.
- Add class Input, that handles InputMedium (and InputLogMedium, in the
  future). Note that for the moment, the unit test is *very* minimal.
- UserInterface: Add options for the input medium and the CSV file.
This commit is contained in:
Matteo Cypriani 2010-02-11 17:24:21 +01:00
parent 0ddef4c747
commit fc1ceb25c7
8 changed files with 208 additions and 4 deletions

View File

@ -35,7 +35,8 @@ 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 \
inputcsv.o configuration.o userinterface.o
inputcsv.o configuration.o userinterface.o input.o
OBJ_NOTEST = posexcept.o
all: $(TARGET)
@ -61,9 +62,10 @@ measurement.o: accesspoint.o
calibrationmeasurement.o: measurement.o referencepoint.o
request.o: timestamp.o measurement.o
inputcsv.o: inputmedium.hh request.o stock.o
input.o: posexcept.o
# Specific targets
$(TARGET): $(OBJ)
$(TARGET): $(OBJ) $(OBJ_NOTEST)
$(TEST_XX): $(OBJ:%.o=$(TEST_DIR)/%_test.hh)
$(TEST_DIR)/cxxtestgen.pl --error-printer \
@ -78,7 +80,7 @@ $(TESTUTIL_OBJ): $(TESTUTIL_OBJ:.o=.cc) $(TESTUTIL_OBJ:.o=.hh)
$(GXX) $(GXXFLAGS) $(TESTSGXXFLAGS) -o $@ -c $<
$(TEST_TARGET): $(TEST_OBJ) $(TESTUTIL_OBJ)
$(LD) $(LDFLAGS) -o $@ $^ $(OBJ)
$(LD) $(LDFLAGS) -o $@ $^ $(OBJ) $(OBJ_NOTEST)
test: $(TEST_TARGET)
@$(TEST_TARGET)
@ -108,8 +110,13 @@ style:
@$(STYLE) \
$(OBJ:.o=.hh) \
$(OBJ:.o=.cc) \
$(OBJ_NOTEST:.o=.hh) \
$(OBJ_NOTEST:.o=.cc) \
inputmedium.hh \
$(OBJ:%.o=$(TEST_DIR)/%_test.hh)
check:
@$(CPPCHECK) $(OBJ:.o=.hh) $(OBJ:.o=.cc) inputmedium.hh
@$(CPPCHECK) \
$(OBJ:.o=.hh) $(OBJ:.o=.cc) \
$(OBJ_NOTEST:.o=.hh) $(OBJ_NOTEST:.o=.cc) \
inputmedium.hh

View File

@ -4,6 +4,9 @@
utilisant les champs de direction.
° Lire la direction en tant qu'entier plutôt que float ?
- Input
° Finir le test unitaire.
- Réorganisation du dépôt ?
owlps-positioning/src
owlps-positioning/include

View File

@ -0,0 +1,64 @@
#include "input.hh"
#include "inputcsv.hh"
#include "request.hh"
#include "configuration.hh"
#include "posexcept.hh"
using namespace std ;
/* *** Constructors *** */
Input::Input()
{
medium = NULL ;
initialise_input_medium() ;
}
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::get_string_value("input.medium") ;
if (medium_name == "CSV")
{
if (! Configuration::is_configured("input.csv-file"))
throw no_input_csv_file() ;
medium = new
InputCSV(Configuration::get_string_value("input.csv-file")) ;
}
else
throw input_medium_type_unknown(medium_name) ;
}
const Request& Input::get_next_request() const
{
if (medium == NULL)
throw null_input_medium() ;
return medium->get_next_request() ;
}
bool Input::eof() const
{
if (medium == NULL)
throw null_input_medium() ;
return medium->eof() ;
}

View File

@ -0,0 +1,29 @@
#ifndef _OWLPS_POSITIONING_INPUT_HH_
#define _OWLPS_POSITIONING_INPUT_HH_
class InputMedium ;
class Request ;
#include <string>
/// Handles the inputs
class Input
{
protected:
InputMedium *medium ; ///< Input medium used
void initialise_input_medium(void) ;
public:
Input(void) ;
~Input(void) ;
/** @name Operations */
//@{
const Request& get_next_request(void) const ;
bool eof(void) const ;
//@}
} ;
#endif // _OWLPS_POSITIONING_INPUT_HH_

View File

@ -0,0 +1,39 @@
#include "posexcept.hh"
using namespace std ;
/**
* @param _medium_name The medium that is unknown
*/
input_medium_type_unknown::
input_medium_type_unknown(const string &_medium_name) throw()
{
medium_name = _medium_name ;
}
const char* input_medium_type_unknown::what() const throw()
{
string message = "The specified input medium « "+ medium_name +
" » is unknown!" ;
return message.c_str() ;
}
const char* no_input_medium::what() const throw()
{
return "No input medium specified in configuration!" ;
}
const char* null_input_medium::what() const throw()
{
return "The input medium is not initialised!" ;
}
const char* no_input_csv_file::what() const throw()
{
return "No input CSV file specified in the configuration!" ;
}

View File

@ -0,0 +1,40 @@
#ifndef _OWLPS_POSITIONING_POSEXCEPT_HH_
#define _OWLPS_POSITIONING_POSEXCEPT_HH_
#include <exception>
#include <string>
class input_medium_type_unknown: public std::exception
{
private:
std::string medium_name ;
public:
input_medium_type_unknown(const std::string &_medium_name) throw() ;
~input_medium_type_unknown(void) throw() {}
const char* what(void) const throw() ;
} ;
class no_input_medium: public std::exception
{
public:
const char* what() const throw() ;
} ;
class null_input_medium: public std::exception
{
public:
const char* what() const throw() ;
} ;
class no_input_csv_file: public std::exception
{
public:
const char* what() const throw() ;
} ;
#endif // _OWLPS_POSITIONING_POSEXCEPT_HH_

View File

@ -0,0 +1,16 @@
#include <cxxtest/TestSuite.h>
#include "input.hh"
#include "posexcept.hh"
class Input_test: public CxxTest::TestSuite
{
public:
void test_constructor(void)
{
// TODO: test with a mock Configuration?
TS_ASSERT_THROWS(Input input1, no_input_medium) ;
}
} ;

View File

@ -68,9 +68,15 @@ void UserInterface::fill_cli_options()
void UserInterface::fill_file_options()
{
file_options->add_options()
// Server options
("server.port,l", po::value<int>()
->default_value(DEFAULT_LISTENING_PORT),
"Server listening port")
// Input options
("input.medium,I", po::value<string>(),
"Medium from which requests are read")
("input.csv-file,C", po::value<string>(),
"CSV file to use for input (when input.medium = CSV)")
;
}