working remoteControl via espNow
This commit is contained in:
Vendored
+3
@@ -85,9 +85,12 @@
|
|||||||
"ardui",
|
"ardui",
|
||||||
"blox",
|
"blox",
|
||||||
"bluedroid",
|
"bluedroid",
|
||||||
|
"CIPO",
|
||||||
|
"COPI",
|
||||||
"gast",
|
"gast",
|
||||||
"GNSS",
|
"GNSS",
|
||||||
"GPGGA",
|
"GPGGA",
|
||||||
|
"HSPI",
|
||||||
"Huus",
|
"Huus",
|
||||||
"Keine",
|
"Keine",
|
||||||
"kleiax",
|
"kleiax",
|
||||||
|
|||||||
@@ -62,7 +62,7 @@
|
|||||||
#endif // NTRIP_RTK2GO
|
#endif // NTRIP_RTK2GO
|
||||||
|
|
||||||
|
|
||||||
#define RHEDE
|
#define DORO
|
||||||
|
|
||||||
//Network config ESP32
|
//Network config ESP32
|
||||||
#ifdef ESP32BROKER
|
#ifdef ESP32BROKER
|
||||||
|
|||||||
@@ -16,58 +16,65 @@ ControlPad::ControlPad() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool ControlPad::loop() {
|
bool ControlPad::loop() {
|
||||||
this->receiveData();
|
|
||||||
|
|
||||||
if (millis() - this->lastLoopMillis < this->loopDelay)
|
if (millis() - this->lastLoopMillis < this->loopDelay)
|
||||||
return false;
|
return false;
|
||||||
this->lastLoopMillis = millis();
|
this->lastLoopMillis = millis();
|
||||||
|
|
||||||
// if(!this->connected)
|
if(!this->connected)
|
||||||
// return false;
|
return false;
|
||||||
|
|
||||||
// if (millis() - this->lastMessageReceive > this->disconnectTime) {
|
if (millis() - this->lastMessageReceive > this->disconnectTime) {
|
||||||
// this->connected = false;
|
this->connected = false;
|
||||||
// return false;
|
this->controlInput.buttons = 0;
|
||||||
// }
|
this->controlInput.x = 127;
|
||||||
|
this->controlInput.y = 127;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// if (this->menuControl && this->controlInput.buttons > 0 && this->updated)
|
if (this->lastButtons != controlInput.buttons)
|
||||||
// if (!this->firstButtonPress)
|
this->updated = true;
|
||||||
// this->menuControl->printMenu();
|
|
||||||
|
|
||||||
// if (ControlPadButton::isControlPadButtonPressed(&this->controlInput, ControlPadButton::PadButton::Left))
|
if (this->menuControl && this->controlInput.buttons > 0 && this->updated) {
|
||||||
// this->menuControl->left();
|
if (this->firstButtonPress) {
|
||||||
// else if (ControlPadButton::isControlPadButtonPressed(&this->controlInput, ControlPadButton::PadButton::Right))
|
this->menuControl->printMenu();
|
||||||
// this->menuControl->right();
|
this->firstButtonPress = false;
|
||||||
// else if (ControlPadButton::isControlPadButtonPressed(&this->controlInput, ControlPadButton::PadButton::Up))
|
std::cout << "ControlPad::loop - First menu print" << std::endl;
|
||||||
// this->menuControl->up();
|
return true;
|
||||||
// else if (ControlPadButton::isControlPadButtonPressed(&this->controlInput, ControlPadButton::PadButton::Down))
|
}
|
||||||
// this->menuControl->down();
|
|
||||||
// else if (ControlPadButton::isControlPadButtonPressed(&this->controlInput, ControlPadButton::PadButton::Yes))
|
|
||||||
// this->menuControl->yes();
|
|
||||||
// else if (ControlPadButton::isControlPadButtonPressed(&this->controlInput, ControlPadButton::PadButton::No))
|
|
||||||
// this->menuControl->no();
|
|
||||||
|
|
||||||
// this->menuControl->update();
|
if (ControlPadButton::isControlPadButtonPressed(&this->controlInput, ControlPadButton::PadButton::Left))
|
||||||
|
this->menuControl->left();
|
||||||
|
else if (ControlPadButton::isControlPadButtonPressed(&this->controlInput, ControlPadButton::PadButton::Right))
|
||||||
|
this->menuControl->right();
|
||||||
|
else if (ControlPadButton::isControlPadButtonPressed(&this->controlInput, ControlPadButton::PadButton::Up))
|
||||||
|
this->menuControl->up();
|
||||||
|
else if (ControlPadButton::isControlPadButtonPressed(&this->controlInput, ControlPadButton::PadButton::Down))
|
||||||
|
this->menuControl->down();
|
||||||
|
else if (ControlPadButton::isControlPadButtonPressed(&this->controlInput, ControlPadButton::PadButton::Yes))
|
||||||
|
this->menuControl->yes();
|
||||||
|
else if (ControlPadButton::isControlPadButtonPressed(&this->controlInput, ControlPadButton::PadButton::No))
|
||||||
|
this->menuControl->no();
|
||||||
|
|
||||||
|
this->updated = false;
|
||||||
|
this->lastButtons = controlInput.buttons;
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ControlPad::insertData(const uint8_t *data) {
|
void ControlPad::insertData(const uint8_t *data) {
|
||||||
|
this->connected = true;
|
||||||
|
this->lastMessageReceive = millis();
|
||||||
|
|
||||||
uint8_t lastCount = this->controlInput.counter + 1;
|
uint8_t lastCount = this->controlInput.counter + 1;
|
||||||
memcpy(&(this->controlInput), data, sizeof(this->controlInput));
|
memcpy(&(this->controlInput), data, sizeof(this->controlInput));
|
||||||
if (lastCount != this->controlInput.counter)
|
if (lastCount != this->controlInput.counter)
|
||||||
std::cout << "ControlPad::insertData counter wrong value" << std::endl;
|
std::cout << "ControlPad::insertData counter wrong value" << std::endl;
|
||||||
|
|
||||||
this->lastMessageReceive = millis();
|
if (this->controlInput.x > 127 - this->deadZoneX
|
||||||
std::cout << "data: " << (int) this->controlInput.counter << std::endl;
|
&& this->controlInput.x < 127 + this->deadZoneX)
|
||||||
}
|
this->controlInput.x = 127;
|
||||||
|
|
||||||
const ControlPadInput * ControlPad::getControlPadDataPtr(uint16_t maxElapsedTime) const {
|
|
||||||
if (maxElapsedTime && millis() - this->lastMessageReceive > maxElapsedTime)
|
|
||||||
return nullptr;
|
|
||||||
return &this->controlInput;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ControlPad::receiveData() {
|
|
||||||
|
|
||||||
|
if (this->controlInput.y > 127 - this->deadZoneY
|
||||||
|
&& this->controlInput.y < 127 + this->deadZoneY)
|
||||||
|
this->controlInput.y = 127;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ class ControlPad {
|
|||||||
|
|
||||||
void setMenuControl(MenuControl* menuControl) { this->menuControl = menuControl; }
|
void setMenuControl(MenuControl* menuControl) { this->menuControl = menuControl; }
|
||||||
|
|
||||||
const ControlPadInput * getControlPadDataPtr(uint16_t maxElapsedTime = 0) const;
|
const ControlPadInput * getControlPadDataPtr() const { return &this->controlInput; }
|
||||||
|
|
||||||
bool isControlPadConnected() const { return this->connected; }
|
bool isControlPadConnected() const { return this->connected; }
|
||||||
|
|
||||||
@@ -33,13 +33,13 @@ class ControlPad {
|
|||||||
MenuControl* menuControl = nullptr;
|
MenuControl* menuControl = nullptr;
|
||||||
ControlPadInput controlInput;
|
ControlPadInput controlInput;
|
||||||
|
|
||||||
void receiveData();
|
|
||||||
|
|
||||||
bool connected = false;
|
bool connected = false;
|
||||||
bool updated = false;
|
bool updated = false;
|
||||||
bool firstButtonPress = false;
|
bool firstButtonPress = true;
|
||||||
|
|
||||||
const uint8_t address[2][6] = { "rover", "ardui" };
|
uint8_t deadZoneX = 10;
|
||||||
|
uint8_t deadZoneY = 10;
|
||||||
|
uint8_t lastButtons = 0;
|
||||||
|
|
||||||
uint16_t disconnectTime = 50;
|
uint16_t disconnectTime = 50;
|
||||||
uint16_t loopDelay = 5;
|
uint16_t loopDelay = 5;
|
||||||
@@ -47,5 +47,4 @@ class ControlPad {
|
|||||||
uint32_t lastMessageReceive = 0;
|
uint32_t lastMessageReceive = 0;
|
||||||
uint32_t lastLoopMillis = 0;
|
uint32_t lastLoopMillis = 0;
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -25,17 +25,49 @@ struct ControlPadInput {
|
|||||||
class ControlPadButton {
|
class ControlPadButton {
|
||||||
public:
|
public:
|
||||||
enum PadButton {
|
enum PadButton {
|
||||||
Left,
|
Left = 4,
|
||||||
Right,
|
Right = 8,
|
||||||
Up,
|
Up = 2,
|
||||||
Down,
|
Down = 1,
|
||||||
Yes,
|
Yes = 32,
|
||||||
No,
|
No = 16,
|
||||||
Action
|
Action = 64
|
||||||
};
|
};
|
||||||
|
|
||||||
static bool isControlPadButtonPressed(const ControlPadInput *input, PadButton button) {
|
static bool isControlPadButtonPressed(const ControlPadInput *input, PadButton button) {
|
||||||
return false;
|
uint8_t buttonNum = input->buttons;
|
||||||
|
switch (button) {
|
||||||
|
case PadButton::Left :
|
||||||
|
return buttonNum & (uint8_t) PadButton::Left;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PadButton::Right :
|
||||||
|
return buttonNum & (uint8_t) PadButton::Right;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PadButton::Up :
|
||||||
|
return buttonNum & (uint8_t) PadButton::Up;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PadButton::Down :
|
||||||
|
return buttonNum & (uint8_t) PadButton::Down;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PadButton::Yes :
|
||||||
|
return buttonNum & (uint8_t) PadButton::Yes;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PadButton::No :
|
||||||
|
return buttonNum & (uint8_t) PadButton::No;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PadButton::Action :
|
||||||
|
return buttonNum & (uint8_t) PadButton::Action;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return false;;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -18,14 +18,19 @@ LcdWrapper::LcdWrapper(LiquidCrystal_I2C* lcd) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void LcdWrapper::loop() {
|
void LcdWrapper::loop() {
|
||||||
if (this->changed) {
|
if (!this->changed)
|
||||||
|
return;
|
||||||
|
|
||||||
this->lcd->clear();
|
this->lcd->clear();
|
||||||
for (uint8_t i = 0; i < DISPLAY_WRAPPER_LINES; i++) {
|
for (uint8_t i = 0; i < DISPLAY_WRAPPER_LINES; i++) {
|
||||||
this->lcd->setCursor(0, i);
|
this->lcd->setCursor(0, i);
|
||||||
this->lcd->print(this->data[i]);
|
this->lcd->print(this->data[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this->callback)
|
||||||
|
this->callback(this->data, DISPLAY_WRAPPER_LINES, DISPLAY_WRAPPER_ROWS);
|
||||||
|
|
||||||
this->changed = false;
|
this->changed = false;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void LcdWrapper::clear() {
|
void LcdWrapper::clear() {
|
||||||
|
|||||||
@@ -19,6 +19,8 @@
|
|||||||
#define DISPLAY_WRAPPER_ROWS 16
|
#define DISPLAY_WRAPPER_ROWS 16
|
||||||
#define DISPLAY_WRAPPER_LINES 2
|
#define DISPLAY_WRAPPER_LINES 2
|
||||||
|
|
||||||
|
typedef void (*LcdWrapperCallback) (const char data[][DISPLAY_WRAPPER_ROWS], uint8_t lines, uint8_t rows);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief A class for the Menu class to print information
|
* @brief A class for the Menu class to print information
|
||||||
*
|
*
|
||||||
@@ -54,6 +56,7 @@ class LcdWrapper : public DisplayWrapper {
|
|||||||
* @param line
|
* @param line
|
||||||
*/
|
*/
|
||||||
void setCursor(uint8_t row, uint8_t line) override;
|
void setCursor(uint8_t row, uint8_t line) override;
|
||||||
|
void setCallback(LcdWrapperCallback callback) { this->callback = callback; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Save the data to be printed
|
* @brief Save the data to be printed
|
||||||
@@ -65,6 +68,7 @@ class LcdWrapper : public DisplayWrapper {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
LiquidCrystal_I2C* lcd;
|
LiquidCrystal_I2C* lcd;
|
||||||
|
LcdWrapperCallback callback = nullptr;
|
||||||
char data[DISPLAY_WRAPPER_LINES][DISPLAY_WRAPPER_ROWS];
|
char data[DISPLAY_WRAPPER_LINES][DISPLAY_WRAPPER_ROWS];
|
||||||
|
|
||||||
uint8_t cursorRow = 0;
|
uint8_t cursorRow = 0;
|
||||||
|
|||||||
+18
-21
@@ -59,8 +59,9 @@ bool wifiIsActive;
|
|||||||
void i2cScanner(void);
|
void i2cScanner(void);
|
||||||
void makeMenu(void);
|
void makeMenu(void);
|
||||||
void restart(void);
|
void restart(void);
|
||||||
void recieveCallback (const uint8_t * mac, const uint8_t *incomingData, int len);
|
void receiveCallback (const uint8_t * mac, const uint8_t *incomingData, int len);
|
||||||
void sendCallback (const uint8_t *mac_addr, esp_now_send_status_t status);
|
void sendCallback (const uint8_t *mac_addr, esp_now_send_status_t status);
|
||||||
|
void lcdWrapperCallback (const char data[][DISPLAY_WRAPPER_ROWS], uint8_t lines, uint8_t rows);
|
||||||
|
|
||||||
|
|
||||||
void setup() {
|
void setup() {
|
||||||
@@ -78,7 +79,6 @@ void setup() {
|
|||||||
|
|
||||||
mainBattery = new Battery(35, 692000, 218500);
|
mainBattery = new Battery(35, 692000, 218500);
|
||||||
controlPad = new ControlPad();
|
controlPad = new ControlPad();
|
||||||
controlPad->setMenuControl(main_m);
|
|
||||||
|
|
||||||
Wire.begin(21, 19);
|
Wire.begin(21, 19);
|
||||||
Wire.setClock(400000);
|
Wire.setClock(400000);
|
||||||
@@ -104,7 +104,7 @@ void setup() {
|
|||||||
outputBuf = new OutputBuf();
|
outputBuf = new OutputBuf();
|
||||||
std::cout.rdbuf(outputBuf);
|
std::cout.rdbuf(outputBuf);
|
||||||
|
|
||||||
Network::connectEspNow(recieveCallback, sendCallback);
|
Network::connectEspNow(receiveCallback, sendCallback);
|
||||||
|
|
||||||
std::cout << "Welcome to Kleiax-Rover" << std::endl;
|
std::cout << "Welcome to Kleiax-Rover" << std::endl;
|
||||||
std::cout << "All actions from the main program run on Core -> " << xPortGetCoreID() << std::endl;
|
std::cout << "All actions from the main program run on Core -> " << xPortGetCoreID() << std::endl;
|
||||||
@@ -118,6 +118,7 @@ void setup() {
|
|||||||
lcd->setCursor(0, 1);
|
lcd->setCursor(0, 1);
|
||||||
lcd->print("Press PS-Button");
|
lcd->print("Press PS-Button");
|
||||||
lcdWrapper = new LcdWrapper(lcd);
|
lcdWrapper = new LcdWrapper(lcd);
|
||||||
|
lcdWrapper->setCallback(lcdWrapperCallback);
|
||||||
|
|
||||||
makeMenu();
|
makeMenu();
|
||||||
|
|
||||||
@@ -125,23 +126,6 @@ void setup() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void loop() {
|
void loop() {
|
||||||
static uint32_t lastMillis = 0;
|
|
||||||
if (millis() - lastMillis > 5000) {
|
|
||||||
lastMillis = millis();
|
|
||||||
char blub[] = {"Du dumme Bla"};
|
|
||||||
esp_err_t result = esp_now_send(Network::getBroadcastAddress(), (uint8_t *) blub, sizeof(blub));
|
|
||||||
|
|
||||||
if (result == ESP_OK) {
|
|
||||||
Serial.println("Sent with success");
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
Serial.println("Error sending the data");
|
|
||||||
}
|
|
||||||
// debugMqtt->sendMsg(Loglevel::info, "Alive");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (wifiIsActive) {
|
if (wifiIsActive) {
|
||||||
DebugTimes wifiTime;
|
DebugTimes wifiTime;
|
||||||
Network::checkWiFi();
|
Network::checkWiFi();
|
||||||
@@ -150,6 +134,7 @@ void loop() {
|
|||||||
}
|
}
|
||||||
driveManager->loop();
|
driveManager->loop();
|
||||||
controlPad->loop();
|
controlPad->loop();
|
||||||
|
main_m->update();
|
||||||
lcdWrapper->loop();
|
lcdWrapper->loop();
|
||||||
|
|
||||||
mainBattery->loop();
|
mainBattery->loop();
|
||||||
@@ -276,6 +261,8 @@ void makeMenu() {
|
|||||||
pidr_m->setEntry(0, "P-Part", (uint8_t) moveController.getPID(1)->GetKp());
|
pidr_m->setEntry(0, "P-Part", (uint8_t) moveController.getPID(1)->GetKp());
|
||||||
pidr_m->setEntry(1, "I-Part", (uint8_t) moveController.getPID(1)->GetKi());
|
pidr_m->setEntry(1, "I-Part", (uint8_t) moveController.getPID(1)->GetKi());
|
||||||
pidr_m->setEntry(2, "D-Part", (uint8_t) moveController.getPID(1)->GetKd());
|
pidr_m->setEntry(2, "D-Part", (uint8_t) moveController.getPID(1)->GetKd());
|
||||||
|
|
||||||
|
controlPad->setMenuControl(main_m);
|
||||||
}
|
}
|
||||||
|
|
||||||
void restart(void) {
|
void restart(void) {
|
||||||
@@ -285,7 +272,7 @@ void restart(void) {
|
|||||||
ESP.restart();
|
ESP.restart();
|
||||||
}
|
}
|
||||||
|
|
||||||
void recieveCallback (const uint8_t * mac, const uint8_t *incomingData, int len) {
|
void receiveCallback (const uint8_t * mac, const uint8_t *incomingData, int len) {
|
||||||
if (len != sizeof(ControlPadInput))
|
if (len != sizeof(ControlPadInput))
|
||||||
return;
|
return;
|
||||||
controlPad->insertData(incomingData);
|
controlPad->insertData(incomingData);
|
||||||
@@ -295,3 +282,13 @@ void sendCallback (const uint8_t *mac_addr, esp_now_send_status_t status) {
|
|||||||
if (status != ESP_NOW_SEND_SUCCESS)
|
if (status != ESP_NOW_SEND_SUCCESS)
|
||||||
std::cout << "sendCallback - Delivery Fail" << std::endl;
|
std::cout << "sendCallback - Delivery Fail" << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void lcdWrapperCallback (const char data[][DISPLAY_WRAPPER_ROWS], uint8_t lines, uint8_t rows) {
|
||||||
|
if (!controlPad->isControlPadConnected())
|
||||||
|
return;
|
||||||
|
|
||||||
|
esp_err_t result = esp_now_send(Network::getBroadcastAddress(), (uint8_t *) data, lines * rows);
|
||||||
|
|
||||||
|
if (result != ESP_OK)
|
||||||
|
Serial.println("Error sending the data");
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user