first build
This commit is contained in:
@@ -20,20 +20,6 @@ SensorData::SensorData() {
|
|||||||
this->loopDelay = 50;
|
this->loopDelay = 50;
|
||||||
}
|
}
|
||||||
|
|
||||||
SensorData::~SensorData() {
|
|
||||||
if (this->ntripClient)
|
|
||||||
delete this->ntripClient;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SensorData::enableNtrip(String host, uint16_t port, String mountPoint, String user, String password) {
|
|
||||||
this->ntripClient = new NTRIPClient(this->gnss, host.c_str(), port, mountPoint.c_str(), user.c_str(), password.c_str());
|
|
||||||
this->ntripClient->gpsConfiguration();
|
|
||||||
this->ntripClient->loop();
|
|
||||||
this->ntripClient->setActivated(false);
|
|
||||||
this->isNtripInit = true;
|
|
||||||
this->addChildComponent(this->ntripClient);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SensorData::enableGnss(SPIClass* spiPort, uint8_t csPin) {
|
void SensorData::enableGnss(SPIClass* spiPort, uint8_t csPin) {
|
||||||
this->gnss = new SFE_UBLOX_GNSS();
|
this->gnss = new SFE_UBLOX_GNSS();
|
||||||
if (this->gnss->begin(*spiPort, csPin, 4000000) == false) {
|
if (this->gnss->begin(*spiPort, csPin, 4000000) == false) {
|
||||||
|
|||||||
@@ -22,7 +22,6 @@
|
|||||||
#include <QMC5883LCompass.h>
|
#include <QMC5883LCompass.h>
|
||||||
// Gyroskop
|
// Gyroskop
|
||||||
#include "calcAzimuth.h"
|
#include "calcAzimuth.h"
|
||||||
#include "ntripClient.h"
|
|
||||||
|
|
||||||
#include "point.h"
|
#include "point.h"
|
||||||
class Sensors;
|
class Sensors;
|
||||||
@@ -30,9 +29,7 @@ class Sensors;
|
|||||||
class SensorData : public Component {
|
class SensorData : public Component {
|
||||||
public:
|
public:
|
||||||
SensorData();
|
SensorData();
|
||||||
~SensorData();
|
|
||||||
|
|
||||||
void enableNtrip(String host, uint16_t port, String mountPoint, String user, String password);
|
|
||||||
void enableGnss(SPIClass* spiPort, uint8_t csPin);
|
void enableGnss(SPIClass* spiPort, uint8_t csPin);
|
||||||
void enableGnss();
|
void enableGnss();
|
||||||
void enableRealCompass();
|
void enableRealCompass();
|
||||||
@@ -50,7 +47,6 @@ class SensorData : public Component {
|
|||||||
|
|
||||||
CalcAzimuth* getCalcCompass() const { return this->calcCompass; }
|
CalcAzimuth* getCalcCompass() const { return this->calcCompass; }
|
||||||
QMC5883LCompass* getRealCompass() const { return this->realCompass; }
|
QMC5883LCompass* getRealCompass() const { return this->realCompass; }
|
||||||
NTRIPClient* getNtripClient() const { return this->ntripClient; }
|
|
||||||
|
|
||||||
// static
|
// static
|
||||||
/**
|
/**
|
||||||
@@ -71,19 +67,10 @@ class SensorData : public Component {
|
|||||||
QMC5883LCompass* realCompass = nullptr;
|
QMC5883LCompass* realCompass = nullptr;
|
||||||
CalcAzimuth* calcCompass = nullptr;
|
CalcAzimuth* calcCompass = nullptr;
|
||||||
SFE_UBLOX_GNSS* gnss = nullptr;
|
SFE_UBLOX_GNSS* gnss = nullptr;
|
||||||
NTRIPClient* ntripClient = nullptr;
|
|
||||||
|
|
||||||
UBX_NAV_PVT_data_t* gnssData;
|
UBX_NAV_PVT_data_t* gnssData;
|
||||||
Point currentPosition;
|
Point currentPosition;
|
||||||
|
|
||||||
char* host;
|
|
||||||
char* mountPoint;
|
|
||||||
char* user;
|
|
||||||
char* password;
|
|
||||||
|
|
||||||
bool isNtripInit = false;
|
|
||||||
|
|
||||||
uint16_t port;
|
|
||||||
int16_t realAzimuth = INT16_MAX;
|
int16_t realAzimuth = INT16_MAX;
|
||||||
int16_t calcAzimuth = INT16_MAX;
|
int16_t calcAzimuth = INT16_MAX;
|
||||||
|
|
||||||
|
|||||||
@@ -14,7 +14,6 @@
|
|||||||
MenuGPS::MenuGPS(SensorData* sensorData) :
|
MenuGPS::MenuGPS(SensorData* sensorData) :
|
||||||
MenuInformationSites(10) {
|
MenuInformationSites(10) {
|
||||||
this->sensorData = sensorData;
|
this->sensorData = sensorData;
|
||||||
// this->ntripClient = this->navigation->getNTRIPClient();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MenuGPS::printPage() const {
|
void MenuGPS::printPage() const {
|
||||||
@@ -65,20 +64,7 @@ void MenuGPS::printPage() const {
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 3: {
|
case 3:
|
||||||
// NTRIPClientStates status = this->ntripClient->getClientState();
|
|
||||||
// lineOne = "NTRIP Client is";
|
|
||||||
|
|
||||||
// if (status == NTRIPClientStates::pushData)
|
|
||||||
// lineTwo = "enabled";
|
|
||||||
// else if (status == NTRIPClientStates::notAvailable)
|
|
||||||
// lineTwo = "not available";
|
|
||||||
// else
|
|
||||||
// lineTwo = "disabled";
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 4:
|
|
||||||
lineOne = "Fix type:";
|
lineOne = "Fix type:";
|
||||||
if (fixType == 0)
|
if (fixType == 0)
|
||||||
lineTwo = "None";
|
lineTwo = "None";
|
||||||
@@ -96,7 +82,7 @@ void MenuGPS::printPage() const {
|
|||||||
lineTwo = "UNKNOWN";
|
lineTwo = "UNKNOWN";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 5: {
|
case 4: {
|
||||||
lineOne = "Carrier Solution";
|
lineOne = "Carrier Solution";
|
||||||
uint8_t carrSoln = gpsData->flags.bits.carrSoln;
|
uint8_t carrSoln = gpsData->flags.bits.carrSoln;
|
||||||
if (carrSoln == 0)
|
if (carrSoln == 0)
|
||||||
@@ -110,7 +96,7 @@ void MenuGPS::printPage() const {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 6:
|
case 5:
|
||||||
lineOne = "Hrizntl Accuracy";
|
lineOne = "Hrizntl Accuracy";
|
||||||
if (fixType) {
|
if (fixType) {
|
||||||
lineTwo = "";
|
lineTwo = "";
|
||||||
@@ -119,7 +105,7 @@ void MenuGPS::printPage() const {
|
|||||||
lineTwo = "0";
|
lineTwo = "0";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 7:
|
case 6:
|
||||||
lineOne = "magDec: ";
|
lineOne = "magDec: ";
|
||||||
lineTwo = "magAcc: ";
|
lineTwo = "magAcc: ";
|
||||||
if (fixType) {
|
if (fixType) {
|
||||||
@@ -131,7 +117,7 @@ void MenuGPS::printPage() const {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 8:
|
case 7:
|
||||||
lineOne = "Azimuth: ";
|
lineOne = "Azimuth: ";
|
||||||
lineTwo = "";
|
lineTwo = "";
|
||||||
lineTwo.concat(this->sensorData->getRealAzimuth());
|
lineTwo.concat(this->sensorData->getRealAzimuth());
|
||||||
@@ -144,16 +130,3 @@ void MenuGPS::printPage() const {
|
|||||||
|
|
||||||
this->print(lineOne, lineTwo);
|
this->print(lineOne, lineTwo);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MenuGPS::runCommand() const {
|
|
||||||
switch (this->getCurrentPage()) {
|
|
||||||
case 3: {
|
|
||||||
// // std::cout << "MenuGPS::runCommand " << this->ntripClient->getClientState() << std::endl;
|
|
||||||
// if (this->ntripClient->getClientState() == NTRIPClientStates::pushData)
|
|
||||||
// this->ntripClient->setActivated(false);
|
|
||||||
// else if (this->ntripClient->getClientState() != NTRIPClientStates::notAvailable)
|
|
||||||
// this->ntripClient->setActivated(true);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -16,7 +16,6 @@
|
|||||||
|
|
||||||
#include "menuInformationSites.h"
|
#include "menuInformationSites.h"
|
||||||
#include "sensorData.h"
|
#include "sensorData.h"
|
||||||
#include "ntripClient.h"
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief A class to print informations about the GPS object
|
* @brief A class to print informations about the GPS object
|
||||||
@@ -33,9 +32,7 @@ class MenuGPS : public MenuInformationSites {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
void printPage() const override;
|
void printPage() const override;
|
||||||
void runCommand() const override;
|
|
||||||
|
|
||||||
// NTRIPClient* ntripClient;
|
|
||||||
SensorData* sensorData;
|
SensorData* sensorData;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,306 +0,0 @@
|
|||||||
/**
|
|
||||||
* @file menuRoute.cpp
|
|
||||||
* @author Alexander Klein (alex@kleiax.de)
|
|
||||||
* @brief Contains the implementation of the classes MenuActionRoute, MenuRoute and MenuRouteWrapper.
|
|
||||||
* @version 0.1
|
|
||||||
* @date 2022-12-28
|
|
||||||
*
|
|
||||||
* @copyright Copyright (c) 2022
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "menuRoute.h"
|
|
||||||
|
|
||||||
MenuActionRoute::MenuActionRoute(MenuRoute* menuRoute, DataFunction dataFunction) {
|
|
||||||
this->menuRoute = menuRoute;
|
|
||||||
this->dataFunction = dataFunction;
|
|
||||||
}
|
|
||||||
|
|
||||||
void MenuActionRoute::action() {
|
|
||||||
(this->menuRoute->*this->dataFunction)(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
MenuRoute::MenuRoute(Route* route) {
|
|
||||||
this->route = route;
|
|
||||||
}
|
|
||||||
|
|
||||||
MenuRoute::~MenuRoute() {
|
|
||||||
if (isInit)
|
|
||||||
delete this->mainMenu;
|
|
||||||
}
|
|
||||||
|
|
||||||
void MenuRoute::printMenu() {
|
|
||||||
if (!this->isInit) {
|
|
||||||
this->isInit = true;
|
|
||||||
this->init();
|
|
||||||
}
|
|
||||||
|
|
||||||
this->mainMenu->printMenu();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void MenuRoute::down() {
|
|
||||||
if (blockInput) return;
|
|
||||||
this->mainMenu->down();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MenuRoute::up() {
|
|
||||||
if (blockInput) return;
|
|
||||||
this->mainMenu->up();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MenuRoute::right() {
|
|
||||||
if (blockInput) return;
|
|
||||||
this->mainMenu->right();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MenuRoute::left() {
|
|
||||||
if (blockInput) return;
|
|
||||||
if (this->mainMenu->isInSubmenu())
|
|
||||||
this->mainMenu->left();
|
|
||||||
else
|
|
||||||
this->parentMenu->printMenu();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MenuRoute::yes() {
|
|
||||||
if (blockInput) return;
|
|
||||||
this->mainMenu->yes();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MenuRoute::no() {
|
|
||||||
if (blockInput) return;
|
|
||||||
if (this->mainMenu->isInSubmenu())
|
|
||||||
this->mainMenu->no();
|
|
||||||
else
|
|
||||||
this->left();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void MenuRoute::init() {
|
|
||||||
// auto dummy = []() {
|
|
||||||
// std::cout << "Dummy in Action" <<std::endl;
|
|
||||||
// };
|
|
||||||
|
|
||||||
this->mainMenu = new Menu;
|
|
||||||
MenuRoutePoints* pointsMenu = new MenuRoutePoints(this->route);
|
|
||||||
|
|
||||||
this->mainMenu->setLcd(this->lcd);
|
|
||||||
pointsMenu->setLcd(this->lcd);
|
|
||||||
|
|
||||||
MenuIntInput* importWrapper = new MenuIntInput(1, new MenuRouteWrapper(this, &MenuRoute::importRoute));
|
|
||||||
MenuIntInput* exportWrapper = new MenuIntInput(1, new MenuRouteWrapper(this, &MenuRoute::exportRoute));
|
|
||||||
MenuIntInput* deleteWrapper = new MenuIntInput(1, new MenuRouteWrapper(this, &MenuRoute::deleteRoute));
|
|
||||||
MenuActionRoute* clearWrapper = new MenuActionRoute(this, &MenuRoute::clearRoute);
|
|
||||||
|
|
||||||
importWrapper->setLcd(this->lcd);
|
|
||||||
importWrapper->setMinMax(0, 100);
|
|
||||||
importWrapper->setPrintParentMenu(false);
|
|
||||||
importWrapper->setEntry(0, "Import Route");
|
|
||||||
|
|
||||||
exportWrapper->setLcd(this->lcd);
|
|
||||||
exportWrapper->setMinMax(0, 100);
|
|
||||||
exportWrapper->setPrintParentMenu(false);
|
|
||||||
exportWrapper->setEntry(0, "Export Route");
|
|
||||||
|
|
||||||
deleteWrapper->setLcd(this->lcd);
|
|
||||||
deleteWrapper->setMinMax(0, 100);
|
|
||||||
deleteWrapper->setPrintParentMenu(false);
|
|
||||||
deleteWrapper->setEntry(0, "Delete Route");
|
|
||||||
|
|
||||||
this->mainMenu->addEntry(new MenuAction("Points", pointsMenu));
|
|
||||||
this->mainMenu->addEntry(new MenuAction("Clear", clearWrapper));
|
|
||||||
this->mainMenu->addEntry(new MenuAction("Import", importWrapper));
|
|
||||||
this->mainMenu->addEntry(new MenuAction("Export", exportWrapper));
|
|
||||||
this->mainMenu->addEntry(new MenuAction("Delete", deleteWrapper));
|
|
||||||
}
|
|
||||||
|
|
||||||
void MenuRoute::importRoute(uint8_t routeNumber) {
|
|
||||||
this->blockInput = true;
|
|
||||||
|
|
||||||
String lineOne = "";
|
|
||||||
String lineTwo = "";
|
|
||||||
|
|
||||||
if (WiFi.status() != WL_CONNECTED) {
|
|
||||||
lineOne = "Not connected to";
|
|
||||||
lineTwo = "the WiFi.";
|
|
||||||
this->print(lineOne, lineTwo);
|
|
||||||
this->blockInput = false;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ESP.getMaxAllocHeap() < JSON_DOCUMENT_SIZE_ROUTE) {
|
|
||||||
lineOne = "Not enough mem";
|
|
||||||
lineTwo = "for Json obj";
|
|
||||||
this->print(lineOne, lineTwo);
|
|
||||||
this->blockInput = false;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
WiFiClient client;
|
|
||||||
HTTPClient http;
|
|
||||||
DynamicJsonDocument doc(JSON_DOCUMENT_SIZE_ROUTE);
|
|
||||||
|
|
||||||
String host = "http://rover.kleiax.de/api/";
|
|
||||||
host.concat(routeNumber);
|
|
||||||
http.begin(client, host);
|
|
||||||
int httpResponseCode = http.GET();
|
|
||||||
|
|
||||||
lineOne = "Import complete";
|
|
||||||
lineTwo = "Code: ";
|
|
||||||
|
|
||||||
if (httpResponseCode == 202)
|
|
||||||
deserializeJson(doc, http.getStream());
|
|
||||||
else
|
|
||||||
lineOne = "HTTP Error";
|
|
||||||
|
|
||||||
lineTwo.concat(httpResponseCode);
|
|
||||||
this->print(lineOne, lineTwo);
|
|
||||||
|
|
||||||
if (httpResponseCode <= 0) {
|
|
||||||
this->blockInput = false;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint16_t totalPoints = doc["amountPoints"];
|
|
||||||
|
|
||||||
this->route->clear();
|
|
||||||
for (uint16_t i = 0; i < totalPoints; i++) {
|
|
||||||
Point::Coordinates coords;
|
|
||||||
coords.lat = doc["points"][i][0].as<double>();
|
|
||||||
coords.lon = doc["points"][i][1].as<double>();
|
|
||||||
this->route->addPointToRoute(Point(coords, true));
|
|
||||||
}
|
|
||||||
|
|
||||||
this->blockInput = false;
|
|
||||||
http.end();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MenuRoute::exportRoute(uint8_t routeNumber) {
|
|
||||||
this->blockInput = true;
|
|
||||||
uint16_t totalPoints = this->route->getRouteInfo().totalPoints;
|
|
||||||
|
|
||||||
String lineOne = "";
|
|
||||||
String lineTwo = "";
|
|
||||||
|
|
||||||
if (WiFi.status() != WL_CONNECTED) {
|
|
||||||
lineOne = "Not connected to";
|
|
||||||
lineTwo = "the WiFi.";
|
|
||||||
this->print(lineOne, lineTwo);
|
|
||||||
this->blockInput = false;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ESP.getMaxAllocHeap() < JSON_DOCUMENT_SIZE_ROUTE) {
|
|
||||||
lineOne = "Not enough mem";
|
|
||||||
lineTwo = "for Json obj";
|
|
||||||
this->print(lineOne, lineTwo);
|
|
||||||
this->blockInput = false;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
DynamicJsonDocument doc(JSON_DOCUMENT_SIZE_ROUTE);
|
|
||||||
doc["number"] = routeNumber;
|
|
||||||
doc["amountPoints"] = totalPoints;
|
|
||||||
|
|
||||||
Point::Coordinates coords = this->route->startRoute().getCoordinates();
|
|
||||||
doc["points"][0][0] = coords.lat;
|
|
||||||
doc["points"][0][1] = coords.lon;
|
|
||||||
for (uint16_t i = 1; i < totalPoints; i++) {
|
|
||||||
coords = this->route->getNextPoint().getCoordinates();
|
|
||||||
doc["points"][i][0] = coords.lat;
|
|
||||||
doc["points"][i][1] = coords.lon;
|
|
||||||
}
|
|
||||||
String jsonData;
|
|
||||||
serializeJson(doc, jsonData);
|
|
||||||
|
|
||||||
WiFiClient client;
|
|
||||||
HTTPClient http;
|
|
||||||
|
|
||||||
http.begin(client, "http://rover.kleiax.de/api/");
|
|
||||||
http.addHeader("Content-Type", "application/json");
|
|
||||||
int httpResponseCode = http.POST(jsonData);
|
|
||||||
|
|
||||||
if (httpResponseCode == 201)
|
|
||||||
lineOne = "Export complete";
|
|
||||||
else
|
|
||||||
lineOne = "HTTP Error";
|
|
||||||
lineTwo = "Code: ";
|
|
||||||
lineTwo.concat(httpResponseCode);
|
|
||||||
this->print(lineOne, lineTwo);
|
|
||||||
this->blockInput = false;
|
|
||||||
|
|
||||||
http.end();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MenuRoute::deleteRoute(uint8_t routeNumber) {
|
|
||||||
this->blockInput = true;
|
|
||||||
|
|
||||||
String lineOne = "";
|
|
||||||
String lineTwo = "";
|
|
||||||
|
|
||||||
if (WiFi.status() != WL_CONNECTED) {
|
|
||||||
lineOne = "Not connected to";
|
|
||||||
lineTwo = "the WiFi.";
|
|
||||||
this->print(lineOne, lineTwo);
|
|
||||||
this->blockInput = false;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ESP.getMaxAllocHeap() < JSON_DOCUMENT_SIZE_ROUTE) {
|
|
||||||
lineOne = "Not enough mem";
|
|
||||||
lineTwo = "for Json obj";
|
|
||||||
this->print(lineOne, lineTwo);
|
|
||||||
this->blockInput = false;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
WiFiClient client;
|
|
||||||
HTTPClient http;
|
|
||||||
DynamicJsonDocument doc(JSON_DOCUMENT_SIZE_ROUTE);
|
|
||||||
|
|
||||||
String host = "http://rover.kleiax.de/api/";
|
|
||||||
host.concat(routeNumber);
|
|
||||||
http.begin(client, host);
|
|
||||||
int httpResponseCode = http.sendRequest("DELETE");
|
|
||||||
|
|
||||||
lineOne = "Delete complete";
|
|
||||||
lineTwo = "Code: ";
|
|
||||||
|
|
||||||
if (httpResponseCode == 202)
|
|
||||||
deserializeJson(doc, http.getStream());
|
|
||||||
else
|
|
||||||
lineOne = "HTTP Error";
|
|
||||||
|
|
||||||
lineTwo.concat(httpResponseCode);
|
|
||||||
this->print(lineOne, lineTwo);
|
|
||||||
|
|
||||||
this->blockInput = false;
|
|
||||||
http.end();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MenuRoute::clearRoute(uint8_t none) {
|
|
||||||
this->route->clear();
|
|
||||||
this->print("Currente route", "deleted...");
|
|
||||||
}
|
|
||||||
|
|
||||||
MenuRouteWrapper::MenuRouteWrapper(MenuRoute* menuRoute, DataFunction dataFunction) {
|
|
||||||
this->menuRoute = menuRoute;
|
|
||||||
this->dataFunction = dataFunction;
|
|
||||||
}
|
|
||||||
|
|
||||||
void MenuRouteWrapper::action(int16_t* values, uint8_t length) {
|
|
||||||
if (length < 1) {
|
|
||||||
std::cout << "Error in MenuRouteWrapper::action" << std::endl;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (values[0] < 0)
|
|
||||||
values[0] = 0;
|
|
||||||
|
|
||||||
if (values[0] > UINT8_MAX)
|
|
||||||
values[0] = UINT8_MAX;
|
|
||||||
|
|
||||||
(this->menuRoute->*this->dataFunction)(values[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,158 +0,0 @@
|
|||||||
/**
|
|
||||||
* @file menuRoute.h
|
|
||||||
* @author Alexander Klein (alex@kleiax.de)
|
|
||||||
* @brief Contains a classes to handles routes with the user input.
|
|
||||||
* @version 0.1
|
|
||||||
* @date 2022-12-28
|
|
||||||
*
|
|
||||||
* @copyright Copyright (c) 2022
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef MENU_ROUTE_H
|
|
||||||
#define MENU_ROUTE_H
|
|
||||||
|
|
||||||
#include <Arduino.h>
|
|
||||||
#include <ArduinoJson.h>
|
|
||||||
#include <WiFi.h>
|
|
||||||
#include <HTTPClient.h>
|
|
||||||
|
|
||||||
#include "route.h"
|
|
||||||
#include "menu.h"
|
|
||||||
#include "menuControl.h"
|
|
||||||
#include "menuIntInput.h"
|
|
||||||
#include "menuRoutePoints.h"
|
|
||||||
|
|
||||||
#define JSON_DOCUMENT_SIZE_ROUTE 4096
|
|
||||||
|
|
||||||
class MenuRoute;
|
|
||||||
typedef void (MenuRoute::*DataFunction)(uint8_t);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief MenuActionWrapper to call DataFunctions
|
|
||||||
*
|
|
||||||
* This class should be used to call importRoute,
|
|
||||||
* exportRoute and clearRoute over the Menu.
|
|
||||||
*/
|
|
||||||
class MenuActionRoute : public MenuActionWrapper {
|
|
||||||
public:
|
|
||||||
/**
|
|
||||||
* @brief Construct a new Menu Action Route object
|
|
||||||
*
|
|
||||||
* @param menuRoute
|
|
||||||
* @param dataFunction like exportRoute
|
|
||||||
*/
|
|
||||||
MenuActionRoute(MenuRoute* menuRoute, DataFunction dataFunction);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Runs the given DataFunction
|
|
||||||
*/
|
|
||||||
void action() override;
|
|
||||||
|
|
||||||
private:
|
|
||||||
MenuRoute* menuRoute;
|
|
||||||
DataFunction dataFunction;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Handles routes
|
|
||||||
*
|
|
||||||
* With this menu the user can import, export and delete routes.
|
|
||||||
*/
|
|
||||||
class MenuRoute : public MenuControl {
|
|
||||||
public:
|
|
||||||
/**
|
|
||||||
* @brief Construct a new Menu Route object
|
|
||||||
*
|
|
||||||
* @param route
|
|
||||||
*/
|
|
||||||
MenuRoute(Route* route);
|
|
||||||
~MenuRoute();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Prints the last informations
|
|
||||||
*
|
|
||||||
* On first call this function calls the init function.
|
|
||||||
* On every call this functions call the printMenu function from
|
|
||||||
* the mainMenu of this class.
|
|
||||||
*/
|
|
||||||
void printMenu() override;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @name User Inputs
|
|
||||||
* @brief Inputs given by the parentMenu
|
|
||||||
*/
|
|
||||||
///@{
|
|
||||||
void down() override;
|
|
||||||
void up() override;
|
|
||||||
void right() override;
|
|
||||||
void left() override;
|
|
||||||
void yes() override;
|
|
||||||
void no() override;
|
|
||||||
///@}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Import a Route.
|
|
||||||
*
|
|
||||||
* The functions tries to pull the given route id from the RoverApi.
|
|
||||||
*
|
|
||||||
* @param routeNumber id
|
|
||||||
*/
|
|
||||||
void importRoute(uint8_t routeNumber);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Export a Route.
|
|
||||||
*
|
|
||||||
* The functions tries to push the current route to the RoverApi.
|
|
||||||
*
|
|
||||||
* @param routeNumber id
|
|
||||||
*/
|
|
||||||
void exportRoute(uint8_t routeNumber);
|
|
||||||
|
|
||||||
void deleteRoute(uint8_t routeNumber);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Delete the current Route.
|
|
||||||
*
|
|
||||||
* @param none this param is not be used.
|
|
||||||
*/
|
|
||||||
void clearRoute(uint8_t none);
|
|
||||||
|
|
||||||
private:
|
|
||||||
void init();
|
|
||||||
|
|
||||||
Route* route;
|
|
||||||
Menu* mainMenu;
|
|
||||||
|
|
||||||
bool isInit = false;
|
|
||||||
bool blockInput = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief MenuRouteWrapper to call DataFunctions with numeric user input
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
class MenuRouteWrapper : public MenuIntInputWrapper {
|
|
||||||
public:
|
|
||||||
/**
|
|
||||||
* @brief Construct a new Menu Route Wrapper object.
|
|
||||||
*
|
|
||||||
* @param menuRoute
|
|
||||||
* @param dataFunction
|
|
||||||
*/
|
|
||||||
MenuRouteWrapper(MenuRoute* menuRoute, DataFunction dataFunction);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Calls the given DataFunction.
|
|
||||||
*
|
|
||||||
* @param values The value to be given to the DataFunction.
|
|
||||||
* @param length Number of values, should be 1.
|
|
||||||
*/
|
|
||||||
void action(int16_t* values, uint8_t length) override;
|
|
||||||
|
|
||||||
private:
|
|
||||||
MenuRoute* menuRoute;
|
|
||||||
DataFunction dataFunction = nullptr;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // MENU_ROUTE_H
|
|
||||||
@@ -1,76 +0,0 @@
|
|||||||
/**
|
|
||||||
* @file menuRoutePoints.cpp
|
|
||||||
* @author Alexander Klein (alex@kleiax.de)
|
|
||||||
* @brief Contains the implementation of the class MenuRoutePoints.
|
|
||||||
* @version 0.1
|
|
||||||
* @date 2022-12-28
|
|
||||||
*
|
|
||||||
* @copyright Copyright (c) 2022
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "menuRoutePoints.h"
|
|
||||||
|
|
||||||
MenuRoutePoints::MenuRoutePoints(Route *route) : MenuInformationSites() {
|
|
||||||
this->route = route;
|
|
||||||
}
|
|
||||||
|
|
||||||
void MenuRoutePoints::init() {
|
|
||||||
uint16_t amountPoints = this->route->getRouteInfo().totalPoints;
|
|
||||||
if (amountPoints > UINT8_MAX)
|
|
||||||
this->error = true;
|
|
||||||
else
|
|
||||||
this->setCountPages(amountPoints);
|
|
||||||
}
|
|
||||||
|
|
||||||
void MenuRoutePoints::printPage() const {
|
|
||||||
uint8_t currentPage = this->getCurrentPage();
|
|
||||||
if (this->lastPageNumber == currentPage)
|
|
||||||
return;
|
|
||||||
|
|
||||||
String lineOne = "N ";
|
|
||||||
String lineTwo = "E ";
|
|
||||||
|
|
||||||
if (this->error) {
|
|
||||||
lineOne = "Error: To much";
|
|
||||||
lineTwo = "points are given";
|
|
||||||
this->print(lineOne, lineTwo);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
RouteInfo info = this->route->getRouteInfo();
|
|
||||||
if (info.totalPoints == 0) {
|
|
||||||
lineOne = "No Points are";
|
|
||||||
lineTwo = "available";
|
|
||||||
this->print(lineOne, lineTwo);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Point p;
|
|
||||||
if (currentPage == 0)
|
|
||||||
p = this->route->startRoute();
|
|
||||||
else if (this->lastPageNumber - 1 == currentPage)
|
|
||||||
p = this->route->getPreviousPoint();
|
|
||||||
else if (this->lastPageNumber + 1 == currentPage)
|
|
||||||
p = this->route->getNextPoint();
|
|
||||||
else if (currentPage == this->getCountPages() - 1)
|
|
||||||
p = this->route->endRoute();
|
|
||||||
else
|
|
||||||
std::cout << "Error in: MenuRoutePoints::printPage()" << std::endl;
|
|
||||||
|
|
||||||
char buf[20];
|
|
||||||
char* string;
|
|
||||||
|
|
||||||
info = this->route->getRouteInfo();
|
|
||||||
string = dtostrf(p.getLatitude(), 9, 7, buf);
|
|
||||||
lineOne.concat(string);
|
|
||||||
lineOne.concat(" ");
|
|
||||||
lineOne.concat(info.currentPoint);
|
|
||||||
// lineOne.concat(currentPage);
|
|
||||||
string = dtostrf(p.getLongitude(), 9, 7, buf);
|
|
||||||
lineTwo.concat(string);
|
|
||||||
lineTwo.concat(" ");
|
|
||||||
lineTwo.concat(info.totalPoints);
|
|
||||||
// std::cout << "MenuRoutePoints::printPage currentPage: " << (int) currentPage << std::endl;
|
|
||||||
this->print(lineOne, lineTwo);
|
|
||||||
}
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
/**
|
|
||||||
* @file menuRoutePoints.h
|
|
||||||
* @author Alexander Klein (alex@kleiax.de)
|
|
||||||
* @brief Contains a class to print the coordinates of a Route.
|
|
||||||
* @version 0.1
|
|
||||||
* @date 2022-12-28
|
|
||||||
*
|
|
||||||
* @copyright Copyright (c) 2022
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef MENU_ROUTE_POINTS_H
|
|
||||||
#define MENU_ROUTE_POINTS_H
|
|
||||||
|
|
||||||
#include "navigation.h"
|
|
||||||
#include "route.h"
|
|
||||||
#include "menuInformationSites.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Prints coordinates of Route side by side.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
class MenuRoutePoints : public MenuInformationSites {
|
|
||||||
public:
|
|
||||||
/**
|
|
||||||
* @brief Construct a new Menu Route Points object
|
|
||||||
*
|
|
||||||
* @param route
|
|
||||||
*/
|
|
||||||
MenuRoutePoints(Route *route);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Configure the base class MenuInformationSites
|
|
||||||
*
|
|
||||||
* Set the amount of pages.
|
|
||||||
*/
|
|
||||||
void init () override;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Prints the the coordinates of the current Point.
|
|
||||||
*/
|
|
||||||
void printPage() const override;
|
|
||||||
|
|
||||||
private:
|
|
||||||
Route* route;
|
|
||||||
bool error = false;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // MENU_ROUTE_POINTS_H
|
|
||||||
@@ -10,10 +10,8 @@
|
|||||||
*/
|
*/
|
||||||
#include "testMode.h"
|
#include "testMode.h"
|
||||||
|
|
||||||
TestMode::TestMode(DriveModiParams params, Navigation* navigation)
|
TestMode::TestMode(DriveModiParams params)
|
||||||
: DriveModi(params) {
|
: DriveModi(params) {}
|
||||||
this->navigation = navigation;
|
|
||||||
}
|
|
||||||
|
|
||||||
TestMode::~TestMode() {
|
TestMode::~TestMode() {
|
||||||
this->moveControl->setDrivingStatus(MoveControl::Status::Stop);
|
this->moveControl->setDrivingStatus(MoveControl::Status::Stop);
|
||||||
|
|||||||
@@ -14,7 +14,6 @@
|
|||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
#include "moveControl.h"
|
#include "moveControl.h"
|
||||||
#include "navigation.h"
|
|
||||||
#include "driveModi/driveModi.h"
|
#include "driveModi/driveModi.h"
|
||||||
|
|
||||||
|
|
||||||
@@ -42,9 +41,8 @@ class TestMode : public DriveModi {
|
|||||||
* @brief Construct a new Test Mode object
|
* @brief Construct a new Test Mode object
|
||||||
*
|
*
|
||||||
* @param moveControl
|
* @param moveControl
|
||||||
* @param navigation
|
|
||||||
*/
|
*/
|
||||||
TestMode(DriveModiParams params, Navigation* navigation);
|
TestMode(DriveModiParams params);
|
||||||
~TestMode();
|
~TestMode();
|
||||||
|
|
||||||
bool drive(int16_t cm = 0, int16_t degree = 0);
|
bool drive(int16_t cm = 0, int16_t degree = 0);
|
||||||
@@ -106,7 +104,6 @@ class TestMode : public DriveModi {
|
|||||||
void run() override;
|
void run() override;
|
||||||
bool engineInit(int16_t powerPercentage, int16_t seconds);
|
bool engineInit(int16_t powerPercentage, int16_t seconds);
|
||||||
|
|
||||||
Navigation* navigation;
|
|
||||||
Maneuver maneuver = Maneuver::None;
|
Maneuver maneuver = Maneuver::None;
|
||||||
int16_t maneuverValueOne = 0;
|
int16_t maneuverValueOne = 0;
|
||||||
int16_t maneuverValueTwo = 0;
|
int16_t maneuverValueTwo = 0;
|
||||||
|
|||||||
@@ -25,10 +25,6 @@ DriveManager::DriveManager(DriveModiParams params){
|
|||||||
this->init();
|
this->init();
|
||||||
}
|
}
|
||||||
|
|
||||||
DriveManager::~DriveManager() {
|
|
||||||
delete this->navigation;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DriveManager::changeModus(Modi modus) {
|
void DriveManager::changeModus(Modi modus) {
|
||||||
this->currentModus = modus;
|
this->currentModus = modus;
|
||||||
|
|
||||||
@@ -36,8 +32,6 @@ void DriveManager::changeModus(Modi modus) {
|
|||||||
this->removeChildComponent(this->currentModusPtr);
|
this->removeChildComponent(this->currentModusPtr);
|
||||||
delete this->currentModusPtr;
|
delete this->currentModusPtr;
|
||||||
}
|
}
|
||||||
//Reset Route to first point
|
|
||||||
this->navigation->startNavigation();
|
|
||||||
|
|
||||||
switch (modus) {
|
switch (modus) {
|
||||||
case Modi::Off:
|
case Modi::Off:
|
||||||
@@ -49,18 +43,8 @@ void DriveManager::changeModus(Modi modus) {
|
|||||||
}
|
}
|
||||||
break;
|
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: {
|
case Modi::TestMode: {
|
||||||
this->currentModusPtr = new TestMode(driveModiParams, this->navigation);
|
this->currentModusPtr = new TestMode(driveModiParams);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -74,10 +58,7 @@ void DriveManager::changeModus(Modi modus) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void DriveManager::init() {
|
void DriveManager::init() {
|
||||||
this->navigation = new Navigation(this->driveModiParams.sensorData);
|
|
||||||
|
|
||||||
this->addChildComponent(this->driveModiParams.moveControl);
|
this->addChildComponent(this->driveModiParams.moveControl);
|
||||||
this->addChildComponent(this->navigation);
|
|
||||||
this->activateOnlyChilds();
|
this->activateOnlyChilds();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,6 @@
|
|||||||
|
|
||||||
#include "moveControl.h"
|
#include "moveControl.h"
|
||||||
#include "driveModi/driveModi.h"
|
#include "driveModi/driveModi.h"
|
||||||
#include "navigation.h"
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "networkConfig.h"
|
#include "networkConfig.h"
|
||||||
#include "debugTimes.h"
|
#include "debugTimes.h"
|
||||||
@@ -27,8 +26,6 @@
|
|||||||
|
|
||||||
// All Drive Modi
|
// All Drive Modi
|
||||||
#include "driveModi/Modi/ManualControl/manualControl.h"
|
#include "driveModi/Modi/ManualControl/manualControl.h"
|
||||||
#include "driveModi/Modi/CaptureRoute/captureRoute.h"
|
|
||||||
#include "driveModi/Modi/Autopilot/autopilot.h"
|
|
||||||
#include "driveModi/Modi/TestMode/testMode.h"
|
#include "driveModi/Modi/TestMode/testMode.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -46,13 +43,6 @@ enum class Modi {
|
|||||||
|
|
||||||
class DriveManager : public Component {
|
class DriveManager : public Component {
|
||||||
public:
|
public:
|
||||||
/**
|
|
||||||
* @brief Construct a new Drive Manager object
|
|
||||||
*
|
|
||||||
* Creates a Navigation object
|
|
||||||
*
|
|
||||||
* @param moveControl
|
|
||||||
*/
|
|
||||||
DriveManager(MoveControl *moveControl, const SensorData* sensorData, const ControlPadInput *input);
|
DriveManager(MoveControl *moveControl, const SensorData* sensorData, const ControlPadInput *input);
|
||||||
DriveManager(DriveModiParams params);
|
DriveManager(DriveModiParams params);
|
||||||
|
|
||||||
@@ -72,13 +62,6 @@ class DriveManager : public Component {
|
|||||||
*/
|
*/
|
||||||
void changeModus(Modi modus);
|
void changeModus(Modi modus);
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Get the Navigation object
|
|
||||||
*
|
|
||||||
* @return Navigation*
|
|
||||||
*/
|
|
||||||
Navigation* getNavigation() const {return this->navigation;}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Get the DriveModi Ptr object
|
* @brief Get the DriveModi Ptr object
|
||||||
*
|
*
|
||||||
@@ -104,7 +87,6 @@ class DriveManager : public Component {
|
|||||||
|
|
||||||
Modi currentModus = Modi::Off;
|
Modi currentModus = Modi::Off;
|
||||||
DriveModi *currentModusPtr = nullptr;
|
DriveModi *currentModusPtr = nullptr;
|
||||||
Navigation* navigation;
|
|
||||||
DriveModiParams driveModiParams;
|
DriveModiParams driveModiParams;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -38,13 +38,10 @@
|
|||||||
#include "menu.h"
|
#include "menu.h"
|
||||||
#include "menuAction.h"
|
#include "menuAction.h"
|
||||||
#include "SpecialMenus/driveModi/ManualDrive/menuManualDrive.h"
|
#include "SpecialMenus/driveModi/ManualDrive/menuManualDrive.h"
|
||||||
#include "SpecialMenus/driveModi/CaptureRoute/menuCaptureRoute.h"
|
|
||||||
#include "SpecialMenus/driveModi/Autopilot/menuAutopilot.h"
|
|
||||||
#include "SpecialMenus/driveModi/TestMode/menuTestMode.h"
|
#include "SpecialMenus/driveModi/TestMode/menuTestMode.h"
|
||||||
#include "SpecialMenus/driveModi/CalibrateCompass/menuCalibrateCompass.h"
|
#include "SpecialMenus/driveModi/CalibrateCompass/menuCalibrateCompass.h"
|
||||||
#include "SpecialMenus/Systeminformation/menuSysteminformation.h"
|
#include "SpecialMenus/Systeminformation/menuSysteminformation.h"
|
||||||
#include "SpecialMenus/PID/menuPidSettings.h"
|
#include "SpecialMenus/PID/menuPidSettings.h"
|
||||||
#include "SpecialMenus/Route/menuRoute.h"
|
|
||||||
#include "SpecialMenus/GPS/menuGPS.h"
|
#include "SpecialMenus/GPS/menuGPS.h"
|
||||||
|
|
||||||
MoveControl moveController;
|
MoveControl moveController;
|
||||||
@@ -218,33 +215,25 @@ void makeMenu() {
|
|||||||
MenuIntInput* pidl_m = new MenuIntInput(3, new MenuPidSettings(moveController.getPID(0)));
|
MenuIntInput* pidl_m = new MenuIntInput(3, new MenuPidSettings(moveController.getPID(0)));
|
||||||
MenuIntInput* pidr_m = new MenuIntInput(3, new MenuPidSettings(moveController.getPID(1)));
|
MenuIntInput* pidr_m = new MenuIntInput(3, new MenuPidSettings(moveController.getPID(1)));
|
||||||
MenuManualControl* man_m = new MenuManualControl(driveManager);
|
MenuManualControl* man_m = new MenuManualControl(driveManager);
|
||||||
MenuCaptureRoute* cap_m = new MenuCaptureRoute(driveManager);
|
|
||||||
MenuAutopilot* auto_m = new MenuAutopilot(driveManager);
|
|
||||||
MenuTestMode* testM_m = new MenuTestMode(driveManager);
|
MenuTestMode* testM_m = new MenuTestMode(driveManager);
|
||||||
MenuCalibrateCompass* comp_m = new MenuCalibrateCompass(driveManager);
|
MenuCalibrateCompass* comp_m = new MenuCalibrateCompass(driveManager);
|
||||||
MenuGPS* gps_m = new MenuGPS(sensorData);
|
MenuGPS* gps_m = new MenuGPS(sensorData);
|
||||||
MenuSysteminformation* sys_m = new MenuSysteminformation(mainBattery);
|
MenuSysteminformation* sys_m = new MenuSysteminformation(mainBattery);
|
||||||
MenuRoute* rout_m = new MenuRoute(driveManager->getNavigation()->getRoute());
|
|
||||||
|
|
||||||
auto_m->setUpdateDelay(1000);
|
|
||||||
gps_m->setUpdateDelay(1000);
|
gps_m->setUpdateDelay(1000);
|
||||||
sys_m->setUpdateDelay(1500);
|
sys_m->setUpdateDelay(1500);
|
||||||
|
|
||||||
// Entry for the main menu
|
// Entry for the main menu
|
||||||
main_m->addEntry(new MenuAction("Mode", mode_m));
|
main_m->addEntry(new MenuAction("Mode", mode_m));
|
||||||
main_m->addEntry(new MenuAction("GPS", gps_m));
|
main_m->addEntry(new MenuAction("GPS", gps_m));
|
||||||
main_m->addEntry(new MenuAction("Route", rout_m));
|
|
||||||
main_m->addEntry(new MenuAction("PID", pid_m));
|
main_m->addEntry(new MenuAction("PID", pid_m));
|
||||||
main_m->addEntry(new MenuAction("Systeminfo", sys_m));
|
main_m->addEntry(new MenuAction("Systeminfo", sys_m));
|
||||||
main_m->addEntry(new MenuAction("Restart", restart));
|
main_m->addEntry(new MenuAction("Restart", restart));
|
||||||
|
|
||||||
// Entry for the mode Menu
|
// Entry for the mode Menu
|
||||||
mode_m->addEntry(new MenuAction("Manual Control", man_m));
|
mode_m->addEntry(new MenuAction("Manual Control", man_m));
|
||||||
mode_m->addEntry(new MenuAction("Capture Route", cap_m));
|
|
||||||
mode_m->addEntry(new MenuAction("Autopilot", auto_m));
|
|
||||||
mode_m->addEntry(new MenuAction("Gauge Compass", comp_m));
|
mode_m->addEntry(new MenuAction("Gauge Compass", comp_m));
|
||||||
mode_m->addEntry(new MenuAction("Test Mode", testM_m));
|
mode_m->addEntry(new MenuAction("Test Mode", testM_m));
|
||||||
mode_m->addEntry(new MenuAction("Consol Control", dummy));
|
|
||||||
|
|
||||||
// Entry for the PID Menu
|
// Entry for the PID Menu
|
||||||
pid_m->addEntry(new MenuAction("Left", pidl_m));
|
pid_m->addEntry(new MenuAction("Left", pidl_m));
|
||||||
|
|||||||
Reference in New Issue
Block a user