mirror of
https://gitlab.dit.htwk-leipzig.de/phillip.kuehne/dezibot.git
synced 2025-05-19 11:01:46 +02:00
99 lines
3.3 KiB
C++
99 lines
3.3 KiB
C++
#include "Communication.h"
|
|
|
|
Scheduler userScheduler; // to control your personal task
|
|
painlessMesh mesh;
|
|
uint32_t Communication::groupNumber = 0;
|
|
|
|
// User-defined callback function pointer
|
|
void (*Communication::userCallback)(String &msg) = nullptr;
|
|
|
|
void Communication::sendMessage(String msg) {
|
|
String data = String(groupNumber) + "#" + msg;
|
|
mesh.sendBroadcast(data);
|
|
}
|
|
|
|
// Needed for painless library
|
|
void Communication::receivedCallback(uint32_t from, String &msg) {
|
|
int separatorIndex = msg.indexOf('#');
|
|
if (separatorIndex != -1) {
|
|
String groupNumberStr = msg.substring(0, separatorIndex);
|
|
uint32_t num = groupNumberStr.toInt();
|
|
String restOfMsg = msg.substring(separatorIndex + 1);
|
|
|
|
Serial.printf("startHere: Received from %u groupNumber=%u msg=%s\n", from,
|
|
num, restOfMsg.c_str());
|
|
|
|
if (groupNumber != num)
|
|
return;
|
|
|
|
// Execute user-defined callback if it is set
|
|
if (userCallback) {
|
|
userCallback(restOfMsg);
|
|
}
|
|
}
|
|
}
|
|
|
|
void newConnectionCallback(uint32_t nodeId) {
|
|
Serial.printf("--> startHere: New Connection, nodeId = %u\n", nodeId);
|
|
}
|
|
|
|
void changedConnectionCallback() { Serial.printf("Changed connections\n"); }
|
|
|
|
void nodeTimeAdjustedCallback(int32_t offset) {
|
|
Serial.printf("Adjusted time %u. Offset = %d\n", mesh.getNodeTime(), offset);
|
|
}
|
|
|
|
void vTaskUpdate(void *pvParameters) {
|
|
for (;;) {
|
|
if (PowerManager::waitForCurrentAllowance(
|
|
PowerParameters::PowerConsumers::WIFI,
|
|
PowerParameters::CurrentConsumptions::CURRENT_WIFI_PEAK +
|
|
PowerParameters::CurrentConsumptions::CURRENT_WIFI_BASE,
|
|
MESH_MAX_EXECUTION_DELAY_MS, NULL)) {
|
|
mesh.update();
|
|
} else {
|
|
ESP_LOGW(TAG, "Skipping mesh update after not being granted power");
|
|
}
|
|
PowerManager::waitForCurrentAllowance(
|
|
PowerParameters::PowerConsumers::WIFI,
|
|
PowerParameters::CurrentConsumptions::CURRENT_WIFI_BASE,
|
|
MESH_MAX_EXECUTION_DELAY_MS, NULL);
|
|
}
|
|
}
|
|
|
|
void Communication::setGroupNumber(uint32_t number) { groupNumber = number; }
|
|
|
|
// Method to set the user-defined callback function
|
|
void Communication::onReceive(void (*callbackFunc)(String &msg)) {
|
|
userCallback = callbackFunc;
|
|
}
|
|
|
|
void Communication::begin(void) {
|
|
Serial.begin(115200);
|
|
|
|
// mesh.setDebugMsgTypes( ERROR | MESH_STATUS | CONNECTION | SYNC |
|
|
// COMMUNICATION | GENERAL | MSG_TYPES | REMOTE ); // all types on
|
|
mesh.setDebugMsgTypes(
|
|
ERROR |
|
|
STARTUP); // set before init() so that you can see startup messages
|
|
if (!PowerManager::waitForCurrentAllowance(
|
|
PowerParameters::PowerConsumers::WIFI,
|
|
PowerParameters::CurrentConsumptions::CURRENT_WIFI_BASE,
|
|
MESH_MAX_EXECUTION_DELAY_MS, NULL)) {
|
|
ESP_LOGE(TAG, "Failed to get power for mesh initialization");
|
|
Serial.println("Failed to get power for mesh initialization");
|
|
}
|
|
mesh.init(MESH_PREFIX, MESH_PASSWORD, &userScheduler, MESH_PORT);
|
|
mesh.onReceive(&receivedCallback);
|
|
mesh.onNewConnection(&newConnectionCallback);
|
|
mesh.onChangedConnections(&changedConnectionCallback);
|
|
mesh.onNodeTimeAdjusted(&nodeTimeAdjustedCallback);
|
|
|
|
static uint8_t ucParameterToPass;
|
|
TaskHandle_t xHandle = NULL;
|
|
|
|
xTaskCreate(vTaskUpdate, "vTaskMeshUpdate", 4096, &ucParameterToPass,
|
|
tskIDLE_PRIORITY, &xHandle);
|
|
configASSERT(xHandle);
|
|
};
|