Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "SnailRunner.h"
- /*! Anschlüsse des Roboters an den TX Controller.
- * Eingänge:
- * I1 : Farbsensor hinten
- * I4 : Farbsensor unten
- * I6 : Ultraschallsensor
- * I7 : Kontaktsensor
- * I8 : Akkuspannung
- * C1 : Impulszähler rechter Motor
- * C2 : Impulszähler linker Motor
- *
- * Ausgänge:
- * M1 : Rechter Motor
- * M2 : Linker Motor
- * O5 : Rechte Lampe
- * O6 : Linke Lampe
- * O7 : Front Lampen
- * O8 : Controller Lampe
- */
- const bool DEBUG_SNAIL = FALSE;
- #define INPUT_COLOUR_BACK I1
- #define INPUT_COLOUR_DOWN I4
- #define INPUT_ULTRASONIC I6
- #define INPUT_ULTRASONIC_SIDE I5
- #define INPUT_PUSH_BUTTON I7
- #define INPUT_ACCU_LEVEL I8
- #define COUNTER_RIGHT_MOTOR C1
- #define COUNTER_LEFT_MOTOR C2
- #define OUTPUT_RIGHT_MOTOR M1
- #define OUTPUT_LEFT_MOTOR M2
- #define OUTPUT_LAMP_RIGHT O5
- #define OUTPUT_LAMP_LEFT O6
- #define OUTPUT_LAMPS_FRONT O7
- #define OUTPUT_LAMP_CONTROLLER O8
- /* --Diese Informationen sind für die Log-Datei zur Information. */
- #define INFO_MOTOR_LEFT "MOTOR COUNTER|LEFT"
- #define INFO_MOTOR_RIGHT "MOTOR COUNTER|RIGHT"
- #define INFO_COLOUR_BACK "COLOUR|BACK"
- #define INFO_COLOUR_DOWN "COLOUR|FRONT, DOWN"
- #define INFO_DISTANCE "DISTANCE|AHEAD"
- #define INFO_DISTANCE_SIDE "DISTANCE|SIDE"
- #define INFO_ACCU_LEVEL "ANALOG|POWER SUPPLY, ACCU LEVEL"
- #define INFO_BUTTON "BUTTON|PUSH BUTTON, RIGHT"
- typedef std::tuple<int, int, double> driveDataType;
- SnailRunner::SnailRunner() : leftmotor(INFO_MOTOR_LEFT), rightmotor(INFO_MOTOR_RIGHT), speed(300),
- colourSensorback(INFO_COLOUR_BACK),
- colourSensordown(INFO_COLOUR_DOWN),
- distance(INFO_DISTANCE),
- distanceSide(INFO_DISTANCE_SIDE),
- accuLevel(ANALOG_10KV, I1, INFO_ACCU_LEVEL),
- pushButton(INFO_BUTTON),
- ex_state(0), bm_state(0), st_state(0), ob_state(0), mission(EXPLORE_MISSION) {}
- SnailRunner::~SnailRunner(void) {
- delete bm_state;
- delete ex_state;
- delete st_state;
- }
- bool SnailRunner::construct(TxControllerSupervision* controller) {
- bool retvalue = Model::construct(controller);
- /* --Sensoren konfigurieren. */
- if (retvalue == true && distance.connect(INPUT_ULTRASONIC, controller) == false)
- retvalue = false;
- if (retvalue == true && distanceSide.connect(INPUT_ULTRASONIC_SIDE, controller) == false)
- retvalue = false;
- if (retvalue == true && colourSensorback.connect(INPUT_COLOUR_BACK, controller) == false)
- retvalue = false;
- if (retvalue == true && colourSensordown.connect(INPUT_COLOUR_DOWN, controller) == false)
- retvalue = false;
- if (retvalue == true && accuLevel.connect(INPUT_ACCU_LEVEL, controller) == false)
- retvalue = false;
- if (retvalue == true && pushButton.connect(INPUT_PUSH_BUTTON, controller) == false)
- retvalue = false;
- /* --Aktoren konfigurieren. */
- /* --Motoren. */
- if (retvalue == true &&
- (leftmotor.connect(OUTPUT_LEFT_MOTOR, COUNTER_LEFT_MOTOR, controller) == false ||
- rightmotor.connect(OUTPUT_RIGHT_MOTOR, COUNTER_RIGHT_MOTOR, controller) == false))
- retvalue = false;
- else
- /* --Synchronisation der Motoren. */
- leftmotor.synchronize(&rightmotor);
- /* --Lampen. */
- if (retvalue == true &&
- (lamp_control.connect(OUTPUT_LAMP_CONTROLLER, controller) == false ||
- lamp_front.connect(OUTPUT_LAMPS_FRONT, controller) == false ||
- lamp_left.connect(OUTPUT_LAMP_LEFT, controller) == false ||
- lamp_right.connect(OUTPUT_LAMP_RIGHT, controller) == false))
- retvalue = false;
- /* --Zustandsmaschine erzeugen. */
- ex_state = new ExploreStateMachine(this);
- bm_state = new BrownianMotionStateMachine(this);
- st_state = new StartStateMachine(this);
- ob_state = new ObstacleStateMachine(this);
- /* --Interne Attribute setzen. */
- starter = 1; // Start-/Schlusslaeufer ( 1 = Startlaeufer )
- startDirection = 1;
- maxCorners = 8;
- speed = 270;
- last_colour_down = colourdown().value();
- last_dis = ahead().value();
- thresholdColourBlack = 2100;
- thresholdColourGrey = 1800;
- thresholdColourWhite = 900;
- corners = 0;
- rounds = 0;
- maxRounds = 2;
- obstacle = false;
- obstacleTurns = 0;
- driveDistanceImpulse = 0;
- grey = 0;
- /* Zeitmessung */
- time_t starttime;
- time_t endtime;
- time(&starttime);
- time(&endtime);
- std::list<driveDataType> driveDataList;
- //list<double> ColourList = { 2000,2000,2000,2000,2000,2000,2000,2000,2000,2000 };
- double quardSlope = 1;
- return retvalue;
- }
- void SnailRunner::saveLogFile() {
- double timediff = difftime(endtime, starttime);
- }
- void SnailRunner::setCorners(int val) {
- corners = val;
- }
- void SnailRunner::setRounds(int val) {
- rounds = val;
- }
- void SnailRunner::setMaxRounds(int val) {
- maxRounds = val;
- }
- int SnailRunner::getRounds() {
- return rounds;
- }
- int SnailRunner::getMaxRounds() {
- return maxRounds;
- }
- void SnailRunner::setThresholdBlack(int val) {
- thresholdColourBlack = val;
- }
- void SnailRunner::setThresholdGrey(int val) {
- thresholdColourGrey = val;
- }
- void SnailRunner::setThresholdWhite(int val) {
- thresholdColourWhite = val;
- }
- int SnailRunner::getThresholdBlack() {
- return thresholdColourBlack;
- }
- int SnailRunner::getThresholdGrey() {
- return thresholdColourGrey;
- }
- int SnailRunner::getThresholdWhite() {
- return thresholdColourWhite;
- }
- void SnailRunner::setStarter(int val) {
- starter = val;
- }
- int SnailRunner::getStarter() {
- return starter;
- }
- void SnailRunner::setObstacleDetected(bool val) {
- obstacle = val;
- }
- bool SnailRunner::getObstacleDetected() {
- return obstacle;
- }
- bool SnailRunner::forward(double val, RunUnit unit) {
- return leftmotor.turnOn(val, unit, speed, LEFT, LEFT);
- }
- bool SnailRunner::backward(double val, RunUnit unit) {
- return leftmotor.turnOn(val, unit, speed, RIGHT, RIGHT);
- }
- bool SnailRunner::turnleft(double val, RunUnit unit) {
- return leftmotor.turnOn(val, unit, speed, LEFT, RIGHT);
- }
- bool SnailRunner::turnright(double val, RunUnit unit) {
- return leftmotor.turnOn(val, unit, speed, RIGHT, LEFT);
- }
- void SnailRunner::setObstacleTurns(int val) {
- obstacleTurns = val;
- }
- int SnailRunner::getObstacleTurns() {
- return obstacleTurns;
- }
- void SnailRunner::setSpeed(int val) {
- speed = val;
- }
- void SnailRunner::addDriveDistance(int val) {
- driveDistanceImpulse += val;
- }
- void SnailRunner::resetDriveDistance() {
- driveDistanceImpulse = 0;
- }
- void SnailRunner::turn(double degree) {
- const double WHEEL_DIAMETER = 0.052;
- const double AXLE_DISTANCE = 0.15;
- const double PI = 3.1415;
- const double GEAR_RATIO = 2.0;
- double WHEEL = WHEEL_DIAMETER * PI;
- double CM_IMPULSE = (WHEEL / GEAR_RATIO) / 75;
- double path = 0;
- path = ((PI * (AXLE_DISTANCE / 2)) * (abs(degree) / 180));
- /*
- int debug = 0;
- debug = (path / CM_IMPULSE);
- */
- if (degree > 0) {
- turnleft(path / CM_IMPULSE);
- turnright(path / CM_IMPULSE);
- }
- else {
- turnright(path / CM_IMPULSE);
- turnleft(path / CM_IMPULSE);
- }
- }
- // Maximale Ecken fuer Exploremission eingeben.
- void SnailRunner::setMaxCorners(int val) {
- maxCorners = val + 1;
- }
- // Maximale Ecken fuer Exploremission auslesen.
- int SnailRunner::getMaxCorners() {
- return maxCorners;
- }
- // Startrichtung fuer Startmission eingeben.
- void SnailRunner::setStartDirection(int val) {
- startDirection = val;
- }
- // Startrichtung fuer Startmission auslesen.
- int SnailRunner::getStartDirection() {
- return startDirection;
- }
- bool SnailRunner::stop() {
- return leftmotor.turnOff();
- }
- /*! Diese Methode wird aufgerufen, wenn ein oder mehrere Motoren
- * am Roboter gestoppt sind. Dieses kann passieren, wenn (i) der
- * vorgegebene Wert vomn Drehimpulsen erreicht ist, oder (ii) der
- * Motor explizit gestoppt wurde.
- *
- * Die Methode überprüft, ob Motor 1 und/oder Motor2 angehalten hat
- * und erzeugt dass Ereignis "IS_STOPPED", welches dann in der
- * Zustandsmaschine zu einer Transition (Zustandswechsel) führt.
- * Das Verhalten des Roboters ist in den Dateien Mission.{cpp|h}
- * beschrieben. */
- void SnailRunner::onMotorStopped(Bitfield bfield) {
- // --Überprüfe, ob die Motoren gestoppt sind.
- if (bfield&((1 << OUTPUT_LEFT_MOTOR) | (1 << OUTPUT_RIGHT_MOTOR)))
- // --Überprüfe welche Mission.
- if (mission == MOTION_MISSION)
- bm_state->handle(BrownianMotionStateMachine::Event::IS_STOPPED);
- else if (mission == EXPLORE_MISSION)
- ex_state->handle(ExploreStateMachine::Event::IS_STOPPED);
- else if (mission == START_MISSION)
- st_state->handle(StartStateMachine::Event::IS_STOPPED);
- else if (mission == OBSTACLE_MISSION)
- ob_state->handle(ObstacleStateMachine::Event::IS_STOPPED);
- }
- /*! Diese Methode überprüft bestimmte Sensoreingänge. Wenn Schwellenwerte
- * überschritten werden, dann werden Ereignisse erzeugt und diese
- * einer Zustandsmaschine übergeben. In der Zustandsmaschine wird dann
- * eine Transition durchgeführt (in Abhängigkeit der Mission).
- *
- * Mission 1 (Spurverfolgung)
- * Wenn der Farbwert (THRESHOLD_COLOR) unterschritten wird, dann wird das
- * Ereignis OFF_TRAIL ausgelöst. Liegt der aktuelle Farbwert wieder über
- * dem Schwellenwert, dann wird das Ereignis ON_TRAIL ausgelöst.
- *
- * Mission 2 (Braunsche Bewegung)
- * Wenn der Distanzwert (THRESHOLD_DISTANCE_LOW) unterschritten wird, dann
- * wird das Ereignis WALL_AHEAD ausgelöst. Liegt der aktuelle Distanzwert
- * wieder oberhalb von THRESHOLD_DISTANCE_HIGH, dann wird das Ereignis
- * CLEAR_VIEW ausgelöst.
- *
- * Das eigentliche Verhalten des Roboters ist in den Zustandsmaschinen in
- * den Dateien Mission.{cpp|h} beschrieben.
- */
- double calcSlope(list<double> &list) {
- std::list<double>::iterator iterator;
- double slope = 0.0;
- double quardSlope = 0.0;
- double sum = 0.0;
- if (list.size() >= 5) { list.pop_back(); }
- for (iterator = list.begin(); iterator != list.end(); ++iterator) {
- sum += *iterator;
- }
- //slope = (sum / list.size()) / list.front();
- slope = list.front() / list.back();
- quardSlope = slope * slope;
- return quardSlope;
- }
- void SnailRunner::onInputChanged(Bitfield bfield) {
- int THRESHOLD_COLOR = 2000;
- int THRESHOLD_COLOR_BLACK = this->getThresholdBlack();
- int THRESHOLD_COLOR_GREY = this->getThresholdGrey();
- int THRESHOLD_COLOR_WHITE = this->getThresholdWhite();
- const int THRESHOLD_DISTANCE_LOW = 12;
- const int THRESHOLD_DISTANCE_HIGH = 17;
- const int THRESHOLD_DISTANCE_SIDE_LOW = 7;
- const int THRESHOLD_DISTANCE_SIDE_HIGH = 15;
- if (bfield&(1 << INPUT_COLOUR_DOWN)) {
- if (mission == EXPLORE_MISSION) {
- // --Überprüfe, ob Schwellenwert überschritten.
- int col = colourdown().value();
- //ColourList.push_front(col);
- //quardSlope = calcSlope(ColourList);
- //cout << "QUARD STEIGUNG : " << quardSlope << endl;
- //cout << colourdown().value() << endl;
- /*
- if (quardSlope < 0.6) {
- ex_state->handle(ExploreStateMachine::Event::ON_TRAIL);
- cout << endl << "ON_TRAIL" << endl;
- } else if (quardSlope >= 0.6 && quardSlope < 0.8) {
- ex_state->handle(ExploreStateMachine::Event::GREY_DETECTED);
- cout << endl << "GREY_DETECTED" << endl;
- } else if (quardSlope >= 0.8 && quardSlope < 1.5) {
- } else if (quardSlope >= 1.5) {
- ex_state->handle(ExploreStateMachine::Event::OFF_TRAIL);
- cout << endl << "OFF_TRAIL" << endl;
- }
- */
- /*
- if (quardSlope >= 1.5) {
- ex_state->handle(ExploreStateMachine::Event::ON_TRAIL);
- cout << endl << "ON_TRAIL" << endl;
- }
- if (quardSlope < 1.5 && quardSlope >= 0.8 ) {
- }
- if (SnailRunner::ex_state->state() == ExploreStateMachine::State::FOUND && corners >= 1) {
- if (quardSlope < 0.8 && quardSlope >= 0.55) {
- if (grey >= 5 && col > THRESHOLD_COLOR_GREY && col < THRESHOLD_COLOR_BLACK) {
- ex_state->handle(ExploreStateMachine::Event::GREY_DETECTED);
- cout << endl << "GREY_DETECTED" << endl;
- grey = 0;
- }
- else {
- grey++;
- }
- }
- }
- if (quardSlope < 0.55) {
- ex_state->handle(ExploreStateMachine::Event::OFF_TRAIL);
- cout << endl << "OFF_TRAIL" << endl;
- }
- *//*
- if ((quardSlope > 2.5 || quardSlope < 0.85) && (colourdown().value() < THRESHOLD_COLOR_BLACK) && (SnailRunner::ex_state->state() == ExploreStateMachine::State::FOUND) && (corners >= 4)) {
- ex_state->handle(ExploreStateMachine::Event::GREY_DETECTED);
- cout << endl << "GREY_DETECTED" << endl;
- } else if (col<THRESHOLD_COLOR_BLACK && last_colour_down>THRESHOLD_COLOR_BLACK) {
- ex_state->handle(ExploreStateMachine::Event::ON_TRAIL);
- cout << endl << "ON_TRAIL" << endl;
- } else if (col > THRESHOLD_COLOR_BLACK && last_colour_down < THRESHOLD_COLOR_BLACK) {
- ex_state->handle(ExploreStateMachine::Event::OFF_TRAIL);
- cout << endl << "OFF_TRAIL" << endl;
- }
- */
- if (col < THRESHOLD_COLOR_BLACK && last_colour_down > THRESHOLD_COLOR_BLACK) {
- ex_state->handle(ExploreStateMachine::Event::ON_TRAIL);
- if (DEBUG_SNAIL) { cout << endl << "ON_TRAIL" << endl; }
- }
- else if (col > THRESHOLD_COLOR_BLACK && last_colour_down < THRESHOLD_COLOR_BLACK) {
- ex_state->handle(ExploreStateMachine::Event::OFF_TRAIL);
- if (DEBUG_SNAIL) { cout << endl << "OFF_TRAIL" << endl; }
- }
- last_colour_down = col;
- }
- }
- if (bfield&(1 << INPUT_COLOUR_DOWN)) {
- if (mission == EXPLORE_MISSION) {
- // --Überprüfe, ob Schwellenwert überschritten.
- int col = colourdown().value();
- if (corners >= 4 && (SnailRunner::ex_state->state() == ExploreStateMachine::State::HAND_OVER)) {
- if (col < THRESHOLD_COLOR_GREY) {
- cout << col << endl;
- cout << THRESHOLD_COLOR_GREY << endl;
- ex_state->handle(ExploreStateMachine::Event::WHITE_DETECTED);
- if (DEBUG_SNAIL) { cout << endl << "WHITE_DETECTED" << endl; }
- cout << "White Detected" << endl;
- }
- }
- last_colour_down = col;
- }
- }
- if (bfield&(1 << INPUT_COLOUR_DOWN)) {
- if (mission == OBSTACLE_MISSION) {
- // --Überprüfe, ob Schwellenwert überschritten.
- int col = colourdown().value();
- if (col < THRESHOLD_COLOR_BLACK && last_colour_down > THRESHOLD_COLOR_BLACK) {
- ob_state->handle(ObstacleStateMachine::Event::ON_TRAIL);
- if (DEBUG_SNAIL) { cout << endl << "ON_TRAIL" << endl; }
- }
- else if (col > THRESHOLD_COLOR_BLACK && last_colour_down < THRESHOLD_COLOR_BLACK) {
- ob_state->handle(ObstacleStateMachine::Event::OFF_TRAIL);
- if (DEBUG_SNAIL) { cout << endl << "OFF_TRAIL" << endl; }
- }
- last_colour_down = col;
- }
- }
- if (bfield&(1 << INPUT_COLOUR_BACK)) {
- if (mission == EXPLORE_MISSION) {
- // --Überprüfe, ob Schwellenwert überschritten.
- if (colourback().value() < 400) {
- ex_state->handle(ExploreStateMachine::Event::GET_SIGNAL);
- if (DEBUG_SNAIL) { cout << endl << "GET_SIGNAL" << endl; }
- }
- }
- }
- if (bfield&(1 << INPUT_ULTRASONIC)) {
- if (mission == EXPLORE_MISSION) {
- // --Überprüfe, ob Schwellwert überschritten.
- int us = ahead().value();
- //cout << "WALL CORNERS : " << corners << "-----------------------------" << endl;
- if (corners < 4) {
- if (us >= THRESHOLD_DISTANCE_HIGH && last_dis < THRESHOLD_DISTANCE_HIGH) {
- ex_state->handle(ExploreStateMachine::Event::CLEAR_VIEW);
- if (DEBUG_SNAIL) { cout << endl << "CLEAR_VIEW" << endl; }
- } else if (us < THRESHOLD_DISTANCE_LOW && last_dis >= THRESHOLD_DISTANCE_LOW) {
- ex_state->handle(ExploreStateMachine::Event::WALL_AHEAD);
- if (DEBUG_SNAIL) { cout << endl << "WALL_AHEAD" << endl; }
- }
- last_dis = us;
- }
- }
- }
- if (bfield&(1 << INPUT_ULTRASONIC)) {
- if (mission == EXPLORE_MISSION) {
- // --Überprüfe, ob Schwellwert überschritten.
- int us = ahead().value();
- //cout << "RUNNER CORNERS : " << corners << "-----------------------------" << endl;
- if (corners >= 4) {
- if (us >= THRESHOLD_DISTANCE_HIGH && last_dis < THRESHOLD_DISTANCE_HIGH) {
- ex_state->handle(ExploreStateMachine::Event::RUNNER_CLEAR);
- if (DEBUG_SNAIL) { cout << endl << "RUNNER_CLEAR" << endl; }
- } else if (us < THRESHOLD_DISTANCE_LOW && last_dis >= THRESHOLD_DISTANCE_LOW) {
- ex_state->handle(ExploreStateMachine::Event::RUNNER_AHEAD);
- if (DEBUG_SNAIL) { cout << endl << "RUNNER_AHEAD" << endl; }
- }
- last_dis = us;
- }
- }
- }
- if (bfield&(1 << INPUT_ULTRASONIC)) {
- if (mission == START_MISSION) {
- // --Überprüfe, ob Schwellwert überschritten.
- int us = ahead().value();
- if (us >= THRESHOLD_DISTANCE_HIGH && last_dis < THRESHOLD_DISTANCE_HIGH)
- st_state->handle(StartStateMachine::Event::CLEAR_VIEW);
- else if (us < THRESHOLD_DISTANCE_LOW && last_dis >= THRESHOLD_DISTANCE_LOW)
- st_state->handle(StartStateMachine::Event::WALL_AHEAD);
- last_dis = us;
- }
- }
- if (bfield&(1 << INPUT_ULTRASONIC_SIDE)) {
- if (mission == OBSTACLE_MISSION) {
- // --Überprüfe, ob Schwellwert überschritten.
- int us = side().value();
- if (us >= THRESHOLD_DISTANCE_SIDE_HIGH && last_dis < THRESHOLD_DISTANCE_SIDE_HIGH) {
- if (getObstacleTurns() < 1) {
- ob_state->handle(ObstacleStateMachine::Event::SIDE_CLEAR);
- if (DEBUG_SNAIL) { cout << endl << "SIDE_CLEAR" << endl; }
- } else {
- ob_state->handle(ObstacleStateMachine::Event::SIDE_CLEAR_END);
- if (DEBUG_SNAIL) { cout << endl << "SIDE_CLEAR_END" << endl; }
- setObstacleTurns(0);
- }
- }
- else if (us < THRESHOLD_DISTANCE_SIDE_LOW && last_dis >= THRESHOLD_DISTANCE_SIDE_LOW) {
- ob_state->handle(ObstacleStateMachine::Event::SIDE_DETECTED);
- if (DEBUG_SNAIL) { cout << endl << "SIDE_DETECTED" << endl; }
- }
- last_dis = us;
- }
- }
- if (bfield&(1 << INPUT_COLOUR_DOWN)) {
- if (mission == OBSTACLE_MISSION) {
- // --Überprüfe, ob Schwellenwert überschritten.
- int ob_col = colourdown().value();
- if (ob_col<THRESHOLD_COLOR_BLACK && last_colour_down>THRESHOLD_COLOR_BLACK) {
- ob_state->handle(ObstacleStateMachine::Event::ON_TRAIL);
- if (DEBUG_SNAIL) { cout << endl << "ON_TRAIL" << endl; }
- }
- else if (ob_col>THRESHOLD_COLOR_BLACK && last_colour_down<THRESHOLD_COLOR_BLACK) {
- ob_state->handle(ObstacleStateMachine::Event::OFF_TRAIL);
- if (DEBUG_SNAIL) { cout << endl << "OFF_TRAIL" << endl; }
- }
- last_colour_down = ob_col;
- }
- }
- if (bfield&(1 << INPUT_COLOUR_DOWN)) {
- if (mission == START_MISSION) {
- // --Überprüfe, ob Schwellenwert überschritten.
- int st_col = colourdown().value();
- if (st_col<THRESHOLD_COLOR_BLACK && last_colour_down>THRESHOLD_COLOR_BLACK) {
- st_state->handle(StartStateMachine::Event::ON_TRAIL);
- }
- else if (st_col>THRESHOLD_COLOR_BLACK && last_colour_down<THRESHOLD_COLOR_BLACK) {
- st_state->handle(StartStateMachine::Event::OFF_TRAIL);
- }
- last_colour_down = st_col;
- }
- }
- }
- /*! Diese Methode wird zum Beginn des reaktiven Modus des Roboters ausgeführt.
- * Es wird die Controller-Lampe angeschaltet und dann in den ersten Zustand der
- * jeweiligen Zustandsmaschine gewechselt. */
- void SnailRunner::onStart() {
- lampcontroller().on();
- if (mission == MOTION_MISSION)
- bm_state->start();
- else if (mission == EXPLORE_MISSION)
- ex_state->start();
- else if (mission == START_MISSION)
- st_state->start();
- else if (mission == OBSTACLE_MISSION)
- ob_state->start();
- }
- /*! Diese Methode wird beim Beenden des reaktiven Modus des Roboters ausgeführt.
- * Es wird die blaue Lampe wieder ausgeschaltet. */
- void SnailRunner::onStop() {
- lampcontroller().off();
- stop();
- }
- void SnailRunner::onCounterChanged(Bitfield /*bfield*/) {}
- void SnailRunner::writeDataToFile(std::ofstream& output, int filenumber) {
- output << "Dateinummer : " << filenumber;
- }
- string SnailRunner::printFileDate() {
- struct tm ltm;
- time_t now = time(0);
- time(&now);
- localtime_s(<m, &now);
- string time = to_string(ltm.tm_mday) + "." + to_string(ltm.tm_mon) + " - " + to_string(ltm.tm_hour) + ":" + to_string(ltm.tm_min);
- return time;
- }
- void SnailRunner::initializeCalibrationFile() {
- std::ifstream file("calibration.csv");
- if (file.good()) {
- std::cout << "KALIBRIERUNGSDATEI GEFUNDEN" << std::endl;
- std::cout << "KALIBRIERUNGDATEN WERDEN GELESEN" << std::endl << std::endl;
- std::string line;
- std::getline(file, line);
- std::getline(file, line);
- setThresholdBlack(atoi(line.c_str()));
- std::getline(file, line);
- std::getline(file, line);
- setThresholdGrey(atoi(line.c_str()));
- std::getline(file, line);
- std::getline(file, line);
- setThresholdWhite(atoi(line.c_str()));
- std::getline(file, line);
- std::getline(file, line);
- setStarter(atoi(line.c_str()));
- std::getline(file, line);
- std::getline(file, line);
- setMaxRounds(atoi(line.c_str()));
- std::getline(file, line);
- std::getline(file, line);
- setStartDirection(atoi(line.c_str()));
- } else {
- std::cout << "KEINE KALIBRIERUNGSDATEI GEFUNDEN" << std::endl;
- std::cout << "NEUE DATEI MIT DEFAULTWERTEN WURDE ERSTELLT" << std::endl;
- std::ofstream file("calibration.csv");
- file << "THRESHOLD_BLACK" << std::endl << getThresholdBlack() << std::endl;
- file << "THRESHOLD_GREY" << std::endl << getThresholdGrey() << std::endl;
- file << "THRESHOLD_WHITE" << std::endl << getThresholdWhite() << std::endl;
- file << "STARTER" << std::endl << getStarter() << std::endl;
- file << "ROUNDS" << std::endl << getRounds() << std::endl;
- file << "DIRECTION" << std::endl << getStartDirection() << std::endl;
- }
- }
- std::ofstream SnailRunner::initializeLogFile() {
- const std::string filename_prefix = "snail_05_";
- const std::string filetype = ".txt";
- std::string filename = "";
- std::string lastfile = "";
- bool exit = false;
- int filenumber = 1;
- filename = filename_prefix + std::to_string(filenumber) + filetype;
- if (filenumber <= 9) {
- filename = filename_prefix + "00" + std::to_string(filenumber) + filetype;
- } else if (filenumber <= 99) {
- filename = filename_prefix + "0" + std::to_string(filenumber) + filetype;
- } else {
- filename = filename_prefix + std::to_string(filenumber) + filetype;
- }
- // Pruefen ob schon Logdateien vorhanden sind. Wenn ja dann aktuellste ermitteln.
- do {
- std::ifstream file;
- file.open(filename, std::ios::in);
- if (file.good()) {
- lastfile = filename;
- filenumber += 1;
- if (filenumber <= 9) {
- filename = filename_prefix + "00" + std::to_string(filenumber) + filetype;
- } else if (filenumber <= 99) {
- filename = filename_prefix + "0" + std::to_string(filenumber) + filetype;
- } else {
- filename = filename_prefix + std::to_string(filenumber) + filetype;
- }
- } else {
- exit = true;
- file.close();
- if (lastfile.empty()) { lastfile = "keine"; }
- std::cout << "Vorhandene Datei : " << lastfile << std::endl;
- std::cout << "Neue Datei : " << filename << std::endl;
- }
- } while (!exit);
- // Werte aus Datei lesen, falls vorhanden.
- if (!lastfile.empty()) {
- std::ifstream input;
- input.open(lastfile, std::ios::in);
- std::string inputline;
- std::getline(input, inputline);
- std::cout << inputline;
- input.close();
- }
- //std::cout << filenumber;
- std::ofstream output;
- output.open(filename, std::ios::out);
- /*
- if (datei.good()) {
- std::cout << "Datei wurde gefunden... Daten werden gelesen..." << std::endl;
- }
- else {
- std::cout << "Datei nicht vorhanden... wird jetzt erstellt..." << std::endl;
- datei.open(filename, std::ios::out);
- }
- */
- return output;
- }
- std::string SnailRunner::printTime() {
- struct tm ltm;
- time_t now = time(0);
- time(&now);
- localtime_s(<m, &now);
- string time;
- if (ltm.tm_min <= 9) {
- string time = to_string(ltm.tm_hour) + ":" + "0" + to_string(ltm.tm_min);
- return time;
- } else {
- string time = to_string(ltm.tm_hour) + ":" + to_string(ltm.tm_min);
- return time;
- }
- }
- std::string SnailRunner::printDate() {
- struct tm ltm;
- time_t now = time(0);
- time(&now);
- localtime_s(<m, &now);
- string time = to_string(ltm.tm_mday) + "." + to_string(ltm.tm_mon) + "." + to_string(1900+ltm.tm_year);
- return time;
- }
- void SnailRunner::WriteLogFile() {
- cout << "WRITE LOG FILE" << endl;
- /* Uhrzeit und Datum */
- std::ofstream file = initializeLogFile();
- file << std::setw(20) << std::left << "Datum :" << printDate() << std::endl;
- file << std::setw(20) << std::left << "Uhrzeit :" << printTime() << std::endl << std::endl;
- /* Fahrtrichtung */
- file << std::setw(20) << std::left << "Fahrtrichtung :";
- /* FAHRTRICHTUNG AUS ROBOTEROBJEKT LADEN*/
- if (getStartDirection() == 1) {
- file << "Rechts";
- } else {
- file << "Links";
- }
- file << std::endl;
- /* Runden */
- file << std::setw(20) << std::left << "Runden :";
- /* RUNDEN AUS ROBOTEROBJEKT AUSLESEN */
- if (true) {
- file << getMaxRounds();
- }
- file << std::endl;
- /* Runden */
- file << std::setw(20) << std::left << "Startposition :";
- /* RUNDEN AUS ROBOTEROBJEKT AUSLESEN */
- if (getStarter() == 1) {
- file << "Startlaeufer";
- } else {
- file << "Schlusslaeufer";
- }
- file << std::endl;
- /* Runden */
- file << std::setw(20) << std::left << "Hindernisse :";
- /* RUNDEN AUS ROBOTEROBJEKT AUSLESEN */if (true) {
- file << "1 Kleines";
- } else {
- file << "1 Großes";
- }
- file << std::endl << std::endl;
- /* Fahrdaten ausgeben */
- file << std::setw(15) << std::left << "Fahrzeit [s]";
- file << std::setw(15) << std::left << "Strecke [cm]";
- file << std::setw(15) << std::left << "Geschwindigkeit [cm/s]" << std::endl;;
- file.imbue(std::locale("german")); // Komma statt Dezimalpunkt in der Ausgabe
- if (driveDataList.size() != 0) {
- for (std::list<driveDataType>::iterator iterator = driveDataList.begin(); iterator != driveDataList.end(); iterator++) {
- file << std::setw(15) << std::left << std::get<0>(*iterator);
- file << std::setw(15) << std::left << std::get<1>(*iterator);
- file << std::setw(12) << std::get<2>(*iterator) << std::endl;
- }
- }
- file.close();
- }
- void SnailRunner::saveRound() {
- driveDataList.push_back(driveDataType((endtime - starttime), (driveDistanceImpulse / 10.0), (driveDistanceImpulse / 10.0) / (endtime - starttime)));
- }
- void SnailRunner::startTime() {
- starttime = time(0);
- }
- void SnailRunner::stopTime() {
- endtime = time(0);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement