/*
Forum: https://forum.arduino.cc/t/csv-datei-von-netzwerk-server-in-array-einlesen/1398397
Wokwi: https://wokwi.com/projects/437912715548172289
2025/07/30
ec2021
*/
// Beinhaltet Beispieldaten
// Format: char [0 .. 13] = uuid
// char [14] = Status
// char [15] = reserviert für Abschluss mit '\0'
// Beispiel: 01AABBCCDDEE010 hat den Index = 101, ist also der 102. Eintrag
// uuid = 01AABBCCDDEE01 Status = 0
// Der letzte Eintrag im Array ist bei 1000 Einträgen "09AABBCCDDEE63"
#include "data.h"
// Ermittlung der Anzahl von Datensätzen
constexpr int noOfUUIDs = sizeof(uuidData) / sizeof(uuidData[0]);
// Maximal Zeichenanzahl für die Serielle Eingabe einer UUID
constexpr int charMax = 15;
// Position des Status-Zeichens im Eintrag
constexpr int statusChar = 14;
// Länge der UUID im Eintrag
constexpr int uuidLen = 14;
// Zeichenarray für die Serielle Eingabe, charMax + 1 Zeichen für eine \0
char uuidIn[charMax + 1];
// Index in uuidIn für die nicht-blockierende Eingabe
int idx = 0;
void setup() {
Serial.begin(115200);
Serial.printf("Anzahl UUIDs %i\n", noOfUUIDs);
}
void loop() {
if (UUIDReceived()) {
Serial.printf("\nEingabe = %S\n", uuidIn);
checkUUID();
}
}
/*
Diese Funktion prüft, ob die eingegebene UUID sich in den gespeicherten UUID wiederfindet,
bricht mit dem ersten Match ab und gibt es Ergebnis aus. Im Erfolgsfall wird die Funktion
incrementStatus() aufgerufen, die den Status des gefundenen Eintrags ändert.
*/
void checkUUID() {
boolean match = false;
int matchIdx = 0;
unsigned long startTime = millis();
for (int i = 0; i < noOfUUIDs; i++) {
if (strncmp(uuidIn, uuidData[i], uuidLen) == 0) {
match = true;
matchIdx = i;
break;
}
}
if (match) {
unsigned long duration = millis() - startTime;
char status = uuidData[matchIdx][statusChar];
Serial.printf("Match found in No %i\t Status Byte = %c\t Duration = \%d\n", matchIdx + 1, status, duration);
incrementStatus(matchIdx);
} else {
Serial.println("No Match");
}
}
/*
Die folgende Funktion dient der Eingabe einer zu suchenden UUID
-> Großbuchstaben und Zahlen werden akzeptiert
-> Die Länge muss 14 Zeichen entsprechen, um ein Match erreichen zu können
*/
boolean UUIDReceived() {
if (Serial.available()) {
char c = Serial.read();
switch (c) {
case '0' ... '9':
case 'A' ... 'F':
uuidIn[idx++] = c;
break;
}
if (c == '\n' || idx >= charMax) {
uuidIn[idx] = '\0';
idx = 0;
return true;
}
}
return false;
}
/*
Die folgende Funktion erhöht den Status um jeweils 1
Nach Status == '9' geht es wieder mit '0' weiter
*/
void incrementStatus(int id) {
char status = uuidData[id][statusChar];
status++;
if (status > '9') {
status = '0';
}
uuidData[id][statusChar] = status;
}