diff --git a/src/SpecialMenus/driveModi/Autopilot/menuAutopilot.cpp b/src/SpecialMenus/driveModi/Autopilot/menuAutopilot.cpp index f146790..9496435 100644 --- a/src/SpecialMenus/driveModi/Autopilot/menuAutopilot.cpp +++ b/src/SpecialMenus/driveModi/Autopilot/menuAutopilot.cpp @@ -210,15 +210,15 @@ void MenuAutopilot::runCommand() const { case 6: if (this->targetFreezed) { this->targetFreezed = false; - this->driveManager->getNavigation()->freezeTargetPoint(false); + this->autopilot->getNavigation()->freezeTargetPoint(false); } else { this->targetFreezed = true; - this->driveManager->getNavigation()->freezeTargetPoint(); + this->autopilot->getNavigation()->freezeTargetPoint(); } break; case 7: - this->minDistance = this->driveManager->getNavigation()->increaseMinDistanceToReachPoint(); + this->minDistance = this->autopilot->getNavigation()->increaseMinDistanceToReachPoint(); break; default: @@ -229,7 +229,7 @@ void MenuAutopilot::runCommand() const { void MenuAutopilot::runCommandNo() const { switch (this->getCurrentPage()) { case 7: - this->minDistance = this->driveManager->getNavigation()->decreaseMinDistanceToReachPoint(); + this->minDistance = this->autopilot->getNavigation()->decreaseMinDistanceToReachPoint(); break; default: @@ -247,9 +247,11 @@ void MenuAutopilot::update() { void MenuAutopilot::init() { this->setCountPages(8); - this->driveManager->changeModus(Modi::Autopilot); - this->autopilot = (Autopilot*) this->driveManager->getDriveModiPtr(); + this->autopilot = new Autopilot(); + this->driveManager->changeModus(this->autopilot); this->routeInfo = this->autopilot->getRouteInfo(); - this->driveManager->getNavigation()->increaseMinDistanceToReachPoint(); - this->minDistance = this->driveManager->getNavigation()->decreaseMinDistanceToReachPoint(); + + //dirty hack to get the val, can be better!!! TODO + this->autopilot->getNavigation()->increaseMinDistanceToReachPoint(); + this->minDistance = this->autopilot->getNavigation()->decreaseMinDistanceToReachPoint(); } diff --git a/src/SpecialMenus/driveModi/Autopilot/menuAutopilot.h b/src/SpecialMenus/driveModi/Autopilot/menuAutopilot.h index f662459..c83669d 100644 --- a/src/SpecialMenus/driveModi/Autopilot/menuAutopilot.h +++ b/src/SpecialMenus/driveModi/Autopilot/menuAutopilot.h @@ -13,6 +13,7 @@ #define MENU_AUTOPILOT_DRIVE_H #include "SpecialMenus/driveModi/menuDriveMode.h" +#include "driveModi/Modi/Autopilot/autopilot.h" /** * @brief A class to print informations about the Autopilot diff --git a/src/SpecialMenus/driveModi/CalibrateCompass/menuCalibrateCompass.cpp b/src/SpecialMenus/driveModi/CalibrateCompass/menuCalibrateCompass.cpp index 9069641..3b9ac35 100644 --- a/src/SpecialMenus/driveModi/CalibrateCompass/menuCalibrateCompass.cpp +++ b/src/SpecialMenus/driveModi/CalibrateCompass/menuCalibrateCompass.cpp @@ -110,8 +110,8 @@ void MenuCalibrateCompass::printPage() const { void MenuCalibrateCompass::init() { this->firstPrint = false; - this->driveManager->changeModus(Modi::CalibrateCompass); - this->caliCompassMode = (CalibrateCompassM*) this->driveManager->getDriveModiPtr(); + this->caliCompassMode = new CalibrateCompassM(); + this->driveManager->changeModus(this->caliCompassMode); this->caliCompass = new CalibrateCompass(this->caliCompassMode->getSensorData()->getRealCompass()); this->setCountPages(11); this->updateDelay = 500; diff --git a/src/SpecialMenus/driveModi/CaptureRoute/menuCaptureRoute.cpp b/src/SpecialMenus/driveModi/CaptureRoute/menuCaptureRoute.cpp index 5a81821..ff7508d 100644 --- a/src/SpecialMenus/driveModi/CaptureRoute/menuCaptureRoute.cpp +++ b/src/SpecialMenus/driveModi/CaptureRoute/menuCaptureRoute.cpp @@ -94,7 +94,7 @@ void MenuCaptureRoute::printPage() const { case 7: lineOne = "Current minimal"; - if (this->driveManager->getNavigation()->getMinAccuracy() >= Point::Accuracy::twoDigOfCM) + if (this->captureRoute->getNavigation()->getMinAccuracy() >= Point::Accuracy::twoDigOfCM) lineTwo = "accuracy is high"; else lineTwo = "accuracy is low"; @@ -118,10 +118,10 @@ void MenuCaptureRoute::runCommand() const { switch (this->getCurrentPage()) { case 7: - if (this->driveManager->getNavigation()->getMinAccuracy() >= Point::Accuracy::twoDigOfCM) - this->driveManager->getNavigation()->setMinAccuracy(Point::Accuracy::none); + if (this->captureRoute->getNavigation()->getMinAccuracy() >= Point::Accuracy::twoDigOfCM) + this->captureRoute->getNavigation()->setMinAccuracy(Point::Accuracy::none); else - this->driveManager->getNavigation()->setMinAccuracy(Point::Accuracy::twoDigOfCM); + this->captureRoute->getNavigation()->setMinAccuracy(Point::Accuracy::twoDigOfCM); break; default: @@ -132,7 +132,7 @@ void MenuCaptureRoute::runCommand() const { void MenuCaptureRoute::init() { this->setCountPages(8); this->updateDelay = 500; - this->driveManager->changeModus(Modi::CaptureRoute); - this->captureRoute = (CaptureRoute*) this->driveManager->getDriveModiPtr(); + this->captureRoute = new CaptureRoute(); + this->driveManager->changeModus(this->captureRoute); } diff --git a/src/SpecialMenus/driveModi/CaptureRoute/menuCaptureRoute.h b/src/SpecialMenus/driveModi/CaptureRoute/menuCaptureRoute.h index 3f321ea..04136c7 100644 --- a/src/SpecialMenus/driveModi/CaptureRoute/menuCaptureRoute.h +++ b/src/SpecialMenus/driveModi/CaptureRoute/menuCaptureRoute.h @@ -12,6 +12,7 @@ #define MENU_MANUAL_DRIVE_H #include "SpecialMenus/driveModi/menuDriveMode.h" +#include "driveModi/Modi/CaptureRoute/captureRoute.h" /** * @brief A class to print informations about the Autopilot diff --git a/src/SpecialMenus/driveModi/ManualDrive/menuManualDrive.cpp b/src/SpecialMenus/driveModi/ManualDrive/menuManualDrive.cpp index f77d6c3..b704d9b 100644 --- a/src/SpecialMenus/driveModi/ManualDrive/menuManualDrive.cpp +++ b/src/SpecialMenus/driveModi/ManualDrive/menuManualDrive.cpp @@ -56,8 +56,8 @@ void MenuManualControl::printPage() const { void MenuManualControl::init() { this->firstPrint = false; - this->driveManager->changeModus(Modi::ManualControl); - this->manualControl = (ManualControl*) this->driveManager->getDriveModiPtr(); + this->manualControl = new ManualControl(); + this->driveManager->changeModus(this->manualControl); this->setCountPages(4); this->updateDelay = 500; } diff --git a/src/SpecialMenus/driveModi/ManualDrive/menuManualDrive.h b/src/SpecialMenus/driveModi/ManualDrive/menuManualDrive.h index 2b1c3d8..7ad8449 100644 --- a/src/SpecialMenus/driveModi/ManualDrive/menuManualDrive.h +++ b/src/SpecialMenus/driveModi/ManualDrive/menuManualDrive.h @@ -13,7 +13,7 @@ #define MENU_MANUAL_DRIVE_H #include "SpecialMenus/driveModi/menuDriveMode.h" -#include "calibrateCompass.h" +#include "driveModi/Modi/ManualControl/manualControl.h" /** * @brief A class to print informations about the class ManualControl diff --git a/src/SpecialMenus/driveModi/TestMode/menuTestMode.cpp b/src/SpecialMenus/driveModi/TestMode/menuTestMode.cpp index 18a40d1..6b268cb 100644 --- a/src/SpecialMenus/driveModi/TestMode/menuTestMode.cpp +++ b/src/SpecialMenus/driveModi/TestMode/menuTestMode.cpp @@ -74,8 +74,8 @@ void MenuTestMode::no() { } void MenuTestMode::init() { - this->driveManager->changeModus(Modi::TestMode); - this->testMode = (TestMode*) this->driveManager->getDriveModiPtr(); + this->testMode = new TestMode(); + this->driveManager->changeModus(this->testMode); testMode->setMaxSpeed(1); testMode->setMaxRotation(8); diff --git a/src/SpecialMenus/driveModi/menuDriveMode.cpp b/src/SpecialMenus/driveModi/menuDriveMode.cpp index 76b0bf3..ab42129 100644 --- a/src/SpecialMenus/driveModi/menuDriveMode.cpp +++ b/src/SpecialMenus/driveModi/menuDriveMode.cpp @@ -18,7 +18,7 @@ MenuDriveMode::MenuDriveMode(DriveManager* driveManager) { void MenuDriveMode::left() { this->firstPrint = true; this->configureOnLeave(); - this->driveManager->changeModus(Modi::Off); + this->driveManager->changeModus(); if (parentMenu) { this->parentMenu->printMenu(); this->leaved = true; diff --git a/src/driveModi/Modi/Autopilot/autopilot.cpp b/src/driveModi/Modi/Autopilot/autopilot.cpp index 41b454f..7671518 100644 --- a/src/driveModi/Modi/Autopilot/autopilot.cpp +++ b/src/driveModi/Modi/Autopilot/autopilot.cpp @@ -26,12 +26,11 @@ void DirectionChangeSignal::action() { } -Autopilot::Autopilot(DriveModiParams params, Navigation* navigation) - : ManualControl(params) { +Autopilot::Autopilot() { this->setInputMode(ManualControl::InputMode::Digital); this->directionChangeSignal = new DirectionChangeSignal(this); this->setDirectionChangeCallback(this->directionChangeSignal); - this->navigation = navigation; + this->navigation = new Navigation(this->sensorData); this->init(); } diff --git a/src/driveModi/Modi/Autopilot/autopilot.h b/src/driveModi/Modi/Autopilot/autopilot.h index ea64ac1..3a709be 100644 --- a/src/driveModi/Modi/Autopilot/autopilot.h +++ b/src/driveModi/Modi/Autopilot/autopilot.h @@ -47,7 +47,7 @@ class Autopilot : public ManualControl { * @param moveControl for ManualControl * @param navigation for route instructions */ - Autopilot(DriveModiParams params, Navigation* navigation); + Autopilot(); /** * @brief Destroy the Autopilot object @@ -78,6 +78,7 @@ class Autopilot : public ManualControl { * @return State */ State getState() const { return this->state; } + Navigation* getNavigation() const { return this->navigation; } /** * @brief Tells if there are new informations to display diff --git a/src/driveModi/Modi/CalibrateCompass/calibrateCompassM.cpp b/src/driveModi/Modi/CalibrateCompass/calibrateCompassM.cpp index d2e195b..5dcdadd 100644 --- a/src/driveModi/Modi/CalibrateCompass/calibrateCompassM.cpp +++ b/src/driveModi/Modi/CalibrateCompass/calibrateCompassM.cpp @@ -11,7 +11,6 @@ #include "calibrateCompassM.h" -CalibrateCompassM::CalibrateCompassM(DriveModiParams params) : ManualControl(params) {} void CalibrateCompassM::setCalibrateCompass(CalibrateCompass *caliCompass) { if (caliCompass) { diff --git a/src/driveModi/Modi/CalibrateCompass/calibrateCompassM.h b/src/driveModi/Modi/CalibrateCompass/calibrateCompassM.h index b101721..753bbc1 100644 --- a/src/driveModi/Modi/CalibrateCompass/calibrateCompassM.h +++ b/src/driveModi/Modi/CalibrateCompass/calibrateCompassM.h @@ -18,8 +18,6 @@ class CalibrateCompassM : public ManualControl { public: - CalibrateCompassM(DriveModiParams params); - void setCalibrateCompass(CalibrateCompass* caliCompass = nullptr); private: diff --git a/src/driveModi/Modi/CaptureRoute/captureRoute.cpp b/src/driveModi/Modi/CaptureRoute/captureRoute.cpp index 4ab4864..703b201 100644 --- a/src/driveModi/Modi/CaptureRoute/captureRoute.cpp +++ b/src/driveModi/Modi/CaptureRoute/captureRoute.cpp @@ -11,9 +11,8 @@ #include "driveModi/Modi/CaptureRoute/captureRoute.h" -CaptureRoute::CaptureRoute(DriveModiParams params, Navigation* navigation) - : ManualControl(params) { - this->navigation = navigation; +CaptureRoute::CaptureRoute() { + this->navigation = new Navigation(this->sensorData); this->navigation->getRoute()->clear(); this->sensorData->getNtripClient()->setAutoReconnect(true); this->routeInfo = navigation->getRouteInfo(); diff --git a/src/driveModi/Modi/CaptureRoute/captureRoute.h b/src/driveModi/Modi/CaptureRoute/captureRoute.h index 0916cee..44b3a4e 100644 --- a/src/driveModi/Modi/CaptureRoute/captureRoute.h +++ b/src/driveModi/Modi/CaptureRoute/captureRoute.h @@ -27,13 +27,7 @@ */ class CaptureRoute : public ManualControl { public: - /** - * @brief Construct a new Capture Route object - * - * @param moveControl for ManualControl - * @param navigation to add Points - */ - CaptureRoute(DriveModiParams params, Navigation* navigation); + CaptureRoute(); /** * @brief Destroy the Capture Route object @@ -56,6 +50,7 @@ class CaptureRoute : public ManualControl { */ RouteInfo getRouteInfo() const { return this->routeInfo; } Navigation::Status getLastStatus() const { return this->status; } + Navigation* getNavigation() const { return this->navigation; } /** * @brief Get the distance to the last saved oint diff --git a/src/driveModi/Modi/ManualControl/manualControl.h b/src/driveModi/Modi/ManualControl/manualControl.h index 138c573..bcda7df 100644 --- a/src/driveModi/Modi/ManualControl/manualControl.h +++ b/src/driveModi/Modi/ManualControl/manualControl.h @@ -33,8 +33,6 @@ class ManualControl : public DriveModi { Digital }; - ManualControl(DriveModiParams params) : DriveModi(params){}; - void switchInputMode(); void setInputMode(InputMode mode) { this->inputMode = mode; } InputMode getInputMode() const { return this->inputMode; } diff --git a/src/driveModi/Modi/TestMode/testMode.cpp b/src/driveModi/Modi/TestMode/testMode.cpp index 921e45e..5f5cada 100644 --- a/src/driveModi/Modi/TestMode/testMode.cpp +++ b/src/driveModi/Modi/TestMode/testMode.cpp @@ -10,15 +10,6 @@ */ #include "testMode.h" -TestMode::TestMode(DriveModiParams params, Navigation* navigation) - : DriveModi(params) { - this->navigation = navigation; -} - -TestMode::~TestMode() { - this->moveControl->setDrivingStatus(MoveControl::Status::Stop); -} - void TestMode::run() { if (this->maneuver == Maneuver::Turn) { uint16_t delta = abs(this->azimuth - this->getSensorData()->getRealAzimuth()); diff --git a/src/driveModi/Modi/TestMode/testMode.h b/src/driveModi/Modi/TestMode/testMode.h index abfe21f..bae19de 100644 --- a/src/driveModi/Modi/TestMode/testMode.h +++ b/src/driveModi/Modi/TestMode/testMode.h @@ -38,15 +38,6 @@ class TestMode : public DriveModi { Drive }; - /** - * @brief Construct a new Test Mode object - * - * @param moveControl - * @param navigation - */ - TestMode(DriveModiParams params, Navigation* navigation); - ~TestMode(); - bool drive(int16_t cm = 0, int16_t degree = 0); /** diff --git a/src/driveModi/driveManager.cpp b/src/driveModi/driveManager.cpp index 5d7dc0f..1631264 100644 --- a/src/driveModi/driveManager.cpp +++ b/src/driveModi/driveManager.cpp @@ -25,59 +25,21 @@ DriveManager::DriveManager(DriveModiParams params){ this->init(); } -DriveManager::~DriveManager() { - delete this->navigation; -} - -void DriveManager::changeModus(Modi modus) { - this->currentModus = modus; - +void DriveManager::changeModus(DriveModi* modus) { if (this->currentModusPtr) { this->removeChildComponent(this->currentModusPtr); delete this->currentModusPtr; + this->currentModusPtr = nullptr; } - //Reset Route to first point - this->navigation->startNavigation(); - switch (modus) { - case Modi::Off: - this->currentModusPtr = nullptr; - break; - - case Modi::ManualControl: { - this->currentModusPtr = new ManualControl(this->driveModiParams); - } - break; - - case Modi::CaptureRoute: { - this->currentModusPtr = new CaptureRoute(this->driveModiParams, this->navigation); - } - break; - - case Modi::Autopilot: { - this->currentModusPtr = new Autopilot(this->driveModiParams, this->navigation); - } - break; - - case Modi::TestMode: { - this->currentModusPtr = new TestMode(driveModiParams, this->navigation); - } - break; - - default: - this->currentModusPtr = nullptr; - break; - } + this->currentModusPtr = modus; if (this->currentModusPtr) + this->currentModusPtr->activate(this->driveModiParams); this->addChildComponent(this->currentModusPtr); } void DriveManager::init() { - this->navigation = new Navigation(this->driveModiParams.sensorData); - this->addChildComponent(this->driveModiParams.moveControl); - this->addChildComponent(this->navigation); this->activateOnlyChilds(); } - diff --git a/src/driveModi/driveManager.h b/src/driveModi/driveManager.h index b0e3215..f62c4e2 100644 --- a/src/driveModi/driveManager.h +++ b/src/driveModi/driveManager.h @@ -12,38 +12,14 @@ #ifndef DRIVE_MANAGER_H #define DRIVE_MANAGER_H -#include -#include - #include "moveControl.h" #include "driveModi/driveModi.h" #include "navigation.h" #include "config.h" -#include "networkConfig.h" -#include "debugTimes.h" #include "controlPadInput.h" #include "component.h" #include "sensorData.h" -// All Drive Modi -#include "driveModi/Modi/ManualControl/manualControl.h" -#include "driveModi/Modi/CaptureRoute/captureRoute.h" -#include "driveModi/Modi/Autopilot/autopilot.h" -#include "driveModi/Modi/TestMode/testMode.h" - -/** - * @brief An enum to choose the DriveMode - * - */ -enum class Modi { - Off, - ManualControl, - CalibrateCompass, - CaptureRoute, - Autopilot, - TestMode -}; - class DriveManager : public Component { public: /** @@ -70,14 +46,7 @@ class DriveManager : public Component { * * @param modus */ - void changeModus(Modi modus); - - /** - * @brief Get the Navigation object - * - * @return Navigation* - */ - Navigation* getNavigation() const {return this->navigation;} + void changeModus(DriveModi* modus = nullptr); /** * @brief Get the DriveModi Ptr object @@ -91,20 +60,14 @@ class DriveManager : public Component { */ DriveModi* getDriveModiPtr() const { return this->currentModusPtr; } - /** - * @brief Get the DriveModi enum - * - * @return Modi - */ - Modi getDriveModi() const { return this->currentModus; } + + bool isActive() const { return this->currentModusPtr; } private: void run() override {}; void init(); - Modi currentModus = Modi::Off; DriveModi *currentModusPtr = nullptr; - Navigation* navigation; DriveModiParams driveModiParams; }; diff --git a/src/driveModi/driveModi.cpp b/src/driveModi/driveModi.cpp index f07e6fe..fb0aa25 100644 --- a/src/driveModi/driveModi.cpp +++ b/src/driveModi/driveModi.cpp @@ -1,17 +1,7 @@ #include "driveModi.h" -DriveModi::DriveModi(MoveControl* moveControl, ControlPadInput* input, SensorData* sensorData) { - this->moveControl = moveControl; - this->input = input; - this->sensorData = sensorData; - this->init(); -} - -DriveModi::DriveModi(DriveModiParams params){ - this->moveControl = params.moveControl; - this->input = params.input; - this->sensorData = params.sensorData; - this->init(); +DriveModi::DriveModi() { + this->loopDelay = 0; } DriveModi::~DriveModi() { @@ -20,6 +10,20 @@ DriveModi::~DriveModi() { this->moveControl->setDrivingStatus(MoveControl::Status::Stop); } +void DriveModi::activate(MoveControl* moveControl, ControlPadInput* input, SensorData* sensorData) { + this->moveControl = moveControl; + this->input = input; + this->sensorData = sensorData; + this->init(); +} + +void DriveModi::activate(DriveModiParams params){ + this->moveControl = params.moveControl; + this->input = params.input; + this->sensorData = params.sensorData; + this->init(); +} + void DriveModi::init() { this->moveControl->setDrivingStatus(MoveControl::Status::Drive); this->loopDelay = 40; diff --git a/src/driveModi/driveModi.h b/src/driveModi/driveModi.h index b2267c3..46bbb5a 100644 --- a/src/driveModi/driveModi.h +++ b/src/driveModi/driveModi.h @@ -31,12 +31,14 @@ struct DriveModiParams { */ class DriveModi : public Component { public: - DriveModi(MoveControl* moveControl, ControlPadInput* input, SensorData* sensorData); - DriveModi(DriveModiParams); + DriveModi(); virtual ~DriveModi(); const SensorData* getSensorData() const { return this->sensorData; } + void activate(MoveControl* moveControl, ControlPadInput* input, SensorData* sensorData); + void activate(DriveModiParams params); + /** * @brief Set the max speed * diff --git a/src/main.cpp b/src/main.cpp index 0044b6f..09b1ec8 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -224,7 +224,8 @@ void makeMenu() { MenuCalibrateCompass* comp_m = new MenuCalibrateCompass(driveManager); MenuGPS* gps_m = new MenuGPS(sensorData); MenuSysteminformation* sys_m = new MenuSysteminformation(mainBattery); - MenuRoute* rout_m = new MenuRoute(driveManager->getNavigation()->getRoute()); + //TODO: Wie bekommt jeder die dumme Route? + MenuRoute* rout_m = new MenuRoute(new Route()); auto_m->setUpdateDelay(1000); gps_m->setUpdateDelay(1000);