diff --git a/include/Version.h b/include/Version.h index bca35fc..6672895 100644 --- a/include/Version.h +++ b/include/Version.h @@ -1,9 +1,9 @@ // AUTO GENERATED FILE, DO NOT EDIT #ifndef VERSION - #define VERSION "0.1.10" + #define VERSION "0.8.20" #endif #ifndef BUILD_TIMESTAMP - #define BUILD_TIMESTAMP "2023-08-07 22:02:51.554203" + #define BUILD_TIMESTAMP "2023-08-08 14:33:17.266785" #endif \ No newline at end of file diff --git a/src/SpecialMenus/driveModi/ManualDrive/menuManualDrive.cpp b/src/SpecialMenus/driveModi/ManualDrive/menuManualDrive.cpp index 4b37fcb..e122de6 100644 --- a/src/SpecialMenus/driveModi/ManualDrive/menuManualDrive.cpp +++ b/src/SpecialMenus/driveModi/ManualDrive/menuManualDrive.cpp @@ -27,45 +27,53 @@ void MenuManualControl::printPage() const { break; case 1: - lineOne = "Speed: "; - lineOne.concat(this->manualControl->getMaxSpeed()); - lineTwo = "Increase by 0.1"; + lineOne = "Input mode:"; + if (this->manualControl->getInputMode() == ManualControl::InputMode::Analog) + lineTwo = "Analog"; + else + lineTwo = "Digital"; break; case 2: lineOne = "Speed: "; lineOne.concat(this->manualControl->getMaxSpeed()); - lineTwo = "Decrease by 0.1"; + lineTwo = "Increase by 0.1"; break; case 3: - lineOne = "RotSpeed: "; - lineOne.concat(this->manualControl->getMaxRotation()); - lineTwo = "Increase by 0.1"; + lineOne = "Speed: "; + lineOne.concat(this->manualControl->getMaxSpeed()); + lineTwo = "Decrease by 0.1"; break; case 4: lineOne = "RotSpeed: "; lineOne.concat(this->manualControl->getMaxRotation()); - lineTwo = "Decrease by 0.1"; + lineTwo = "Increase by 0.1"; break; case 5: + lineOne = "RotSpeed: "; + lineOne.concat(this->manualControl->getMaxRotation()); + lineTwo = "Decrease by 0.1"; + break; + + case 6: lineOne = "Dutycycle Left:"; lineTwo.concat(this->manualControl->getDutycycleLeft()); break; - case 6: + case 7: lineOne = "Dutycycle Right:"; lineTwo.concat(this->manualControl->getDutycycleRight()); break; - case 7: + case 8: lineOne = "Azimuth:"; lineTwo.concat(this->driveManager->getNavigation()->getAzimuth()); break; - case 8: { + case 9: { UBX_NAV_PVT_data_t* gpsData = this->driveManager->getNavigation()->getUbxData(); lineOne = "magDec: "; lineTwo = "magAcc: "; @@ -91,28 +99,31 @@ void MenuManualControl::init() { this->firstPrint = false; this->driveManager->changeModus(Modi::ManualControl); this->manualControl = (ManualControl*) this->driveManager->getDriveModiPtr(); - this->setCountPages(9); + this->setCountPages(10); this->updateDelay = 500; } void MenuManualControl::runCommand() const { switch (this->getCurrentPage()) { - case 1: - this->manualControl->increaseMaxSpeed(); + this->manualControl->switchInputMode(); break; case 2: - this->manualControl->decreaseMaxSpeed(); + this->manualControl->increaseMaxSpeed(); break; case 3: - this->manualControl->increaseMaxRotation(); + this->manualControl->decreaseMaxSpeed(); break; case 4: this->manualControl->increaseMaxRotation(); break; + + case 5: + this->manualControl->increaseMaxRotation(); + break; default: break; diff --git a/src/driveModi/Modi/ManualControl/manualControl.cpp b/src/driveModi/Modi/ManualControl/manualControl.cpp index 385f06b..a8f3643 100644 --- a/src/driveModi/Modi/ManualControl/manualControl.cpp +++ b/src/driveModi/Modi/ManualControl/manualControl.cpp @@ -26,14 +26,30 @@ void ManualControl::loop() { if (this->caliCompass) this->caliCompass->loop(); - if (millis() - this->lastMillis < delay) { + if (millis() - this->lastMillis < delay) return; + + switch (this->inputMode) { + case InputMode::Analog : + this->analogControl(); + break; + + case InputMode::Digital : + this->digitalControl(); + break; + + default: + break; } - this->runManualControl(); + this->lastMillis = millis(); } -void ManualControl::runManualControl() { +void ManualControl::switchInputMode() { + this->inputMode = (this->inputMode == InputMode::Analog) ? InputMode::Digital : InputMode::Analog; +} + +void ManualControl::analogControl() { // Have to be int16_t to avoid overflow (int8_t = 255 - 127 = -128) int16_t y = this->input->x - 127; int16_t x = this->input->y - 127; @@ -49,3 +65,25 @@ void ManualControl::runManualControl() { value_per_step = this->max_rotation * 2 / 256; this->moveControl->setRotationSpeed(x * value_per_step); } + +void ManualControl::digitalControl() { + int16_t y = this->input->x - 127; + int16_t x = this->input->y - 127; + + if (y > 120) + this->moveControl->setSpeed(-this->max_speed); + else if (y < -120) + this->moveControl->setSpeed(this->max_speed); + else + this->moveControl->setSpeed(0); + + if (x > 120) + this->moveControl->setRotationSpeed(this->max_rotation); + else if (x < -120) + this->moveControl->setRotationSpeed(-this->max_rotation); + else + this->moveControl->setRotationSpeed(0); + + if (this->directionChangeWrapper && (x > 120 || x < -120)) + this->directionChangeWrapper->action(); +} diff --git a/src/driveModi/Modi/ManualControl/manualControl.h b/src/driveModi/Modi/ManualControl/manualControl.h index d64062b..ad70d2d 100644 --- a/src/driveModi/Modi/ManualControl/manualControl.h +++ b/src/driveModi/Modi/ManualControl/manualControl.h @@ -16,6 +16,11 @@ #include "controlPadInput.h" #include "calibrateCompass.h" +class DirectionChangeWrapper { + public: + virtual void action() = 0; +}; + /** * @brief Drive the Rover with a Joystick * @@ -26,6 +31,11 @@ */ class ManualControl : public DriveModi { public: + enum class InputMode : uint8_t { + Analog, + Digital + }; + ManualControl(MoveControl *moveControl, const ControlPadInput *input); /** @@ -35,7 +45,7 @@ class ManualControl : public DriveModi { ~ManualControl(); /** - * @brief Calls runManualControl() to update all values. + * @brief Calls analogControl() to update all values. * * This function should be called every mainloop. If the delay is not reached, than the * functions returns immediately. @@ -44,12 +54,6 @@ class ManualControl : public DriveModi { */ void loop() override; - /** - * @brief Noramly called repeatedly by loop() to calcluate new values. - * Set new values for speed and rotation in moveControl - */ - void runManualControl(); - /** * @brief Set the min delay between each loop * @@ -79,6 +83,11 @@ class ManualControl : public DriveModi { void setCalibrateCompass(CalibrateCompass* val = nullptr) { this->caliCompass = val; } + void switchInputMode(); + void setInputMode(InputMode mode) { this->inputMode = mode; } + InputMode getInputMode() const { return this->inputMode; } + void setDirectionChangeCallback(DirectionChangeWrapper* callback) { this->directionChangeWrapper = callback; } + uint16_t getDutycycleLeft() const { return this->moveControl->getDutycycleLeft(); } uint16_t getDutycycleRight() const { return this->moveControl->getDutycycleRight(); } @@ -87,11 +96,20 @@ class ManualControl : public DriveModi { const ControlPadInput* input; private: + /** + * @brief Noramly called repeatedly by loop() to calcluate new values. + * Set new values for speed and rotation in moveControl + */ + void analogControl(); + void digitalControl(); + uint32_t lastMillis = 0; uint8_t delay = 10; double max_speed = 1; double max_rotation = 7; CalibrateCompass* caliCompass = nullptr; + DirectionChangeWrapper* directionChangeWrapper = nullptr; + InputMode inputMode = InputMode::Analog; }; #endif // MANUAL_CONTROL_H diff --git a/version b/version index 345f8cc..e12118d 100644 --- a/version +++ b/version @@ -1 +1 @@ -0.1.10 \ No newline at end of file +0.8.20 \ No newline at end of file