Hi zusammen,
ich brauch mal wieder einen Denkanstoß... ich hoffe ich kann mein Problem eindeutig beschreiben.
Angenommen, ich habe folgendes Szenario:
"meinefunktion()" benötigt zwei oder mehr Werte, die nur von "nebenfunktion()" berechnet werden können. Da eine Funktion ja immer nur einen Rückgaberwert haben kann, "nebenfunktion()" aber in dem Fall zwei oder mehrere Rückgabewerte bereitstellen soll, habe ich es aktuell so gelöst, dass die Rückgabewerte in globale Variablen geschrieben werden, um dann wieder in "meinefunktion()" zu Verfügung zu stehen.
Das funktioniert soweit auch prima.
Aber: Ich denk mir gerade, ob es nicht zu Problemen führen kann, wenn zeitgleich 10 Personen den Button 1 drücken und 10 Personen den Button 2? Kommt der liebe ESP dann nicht evtl. durcheinander, weil die globalen Variablen dann zeitgleich mit unterschiedlichen Werten befüllt werden? Ich behaupt jetzt einfach mal ja - und dass das so auch schlecht gelöst ist.
Aber: Ich komme auf keine andere Lösung grad. Am besten wäre es natürlich, wenn eine Funktion auch einen Array als Rückgabewert liefern könnte, aber Google hat mir grad schon "Nein" gesagt.
Ach ja: In meinem Fall wollen wir annehmen, dass "nebenfunktion()" an verschiedenen Stellen des Sketchs benötigt wird und daher die darin enthaltenen Berechnungen nicht direkt in "meinefunktion()" integriert werden sollen. Denn dann wäre es ja einfach
Hier mal ein stark vereinfachtes Beispiel:
#include <WiFi.h>
#include <WebServer.h>
WebServer server(80);
#include <ArduinoJson.h>
// Verbindungskrimskrams
unsigned long connTimer=0;
unsigned long dauer = 10000;
const char ssid[14] = "Meine SSID";
const char password[21] = "MeinPasswort";
// Hier sehe ich das Problem, dass diese Variablen
// durch zeitliche Überschneidungen beim Funktionsaufruf u.U. falsch/durcheinander befüllt werden
uint16_t ergebnis_eins = 0;
uint16_t ergebnis_zwei = 0;
static const char indexPage[] PROGMEM = R"=====(
<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0">
</head>
<body>
<button type='button' onclick='meinefunktion(2, 3);'>Button 1</button>
<button type='button' onclick='meinefunktion(4, 5);'>Button 2</button>
</body>
</html>
<script>
function meinefunktion(wert_eins, wert_zwei) {
var xmlhttp;
var url="/meinefunktion?wert_eins="+wert_eins+"&wert_zwei="+wert_zwei;
xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function(){
if (xmlhttp.readyState == 4 && xmlhttp.status == 200){
let obj = JSON.parse(xmlhttp.responseText);
console.log(obj.rueckgabewert_eins);
console.log(obj.rueckgabewert_zwei);
}
}
xmlhttp.open("GET", url, true);
xmlhttp.send();
}
</script>
)=====";
void display_root() {
const char * httpType PROGMEM = "text/html";
server.send_P(200, httpType, indexPage);
}
void setup() {
delay(2000);
Serial.begin(115200);
// Erstverbindung aufbauen
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
connTimer = millis();
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.println(WiFi.localIP());
server.on("/", display_root);
server.on("/meinefunktion", meinefunktion);
server.begin();
}
void loop() {
server.handleClient();
}
void meinefunktion() {
StaticJsonDocument<48> doc;
String output="";
uint16_t wert_eins = server.arg("wert_eins").toInt();
uint16_t wert_zwei = server.arg("wert_zwei").toInt();
// Berechnungen in Nebenfunktion durchführen
nebenfunktion(wert_eins, wert_zwei);
// Mit Ergebnissen aus Nebenfunktion weiterarbeiten
uint16_t rueckgabewert_eins=ergebnis_eins +10;
uint16_t rueckgabewert_zwei=ergebnis_eins +20;
doc["rueckgabewert_eins"] = rueckgabewert_eins;
doc["rueckgabewert_zwei"] = rueckgabewert_zwei;
serializeJson(doc, output);
server.send(200, "application/json", output);
}
void nebenfunktion(uint16_t wert_eins, uint16_t wert_zwei) {
// Ergebnisse in globale Variablen schreiben, sodass die Werte anschließend
// in "meinefunktion()" weiterverwendet werden können
ergebnis_eins=wert_eins * 10;
ergebnis_zwei=wert_zwei * 10;
}
Kann man sowas besser/smarter lösen?
Ich bin mit meinem Latein & meinem C++ am Ende.
LG Daniel