Skip to content

Commit 4a97d81

Browse files
Update SoftPathElectronics.cpp
1 parent 96a9ecb commit 4a97d81

File tree

1 file changed

+106
-52
lines changed

1 file changed

+106
-52
lines changed

src/SoftPathElectronics.cpp

Lines changed: 106 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -21,18 +21,20 @@
2121
* This library is licensed for personal, non-commercial use only. Commercial use, reproduction, or redistribution without
2222
* prior written consent is prohibited.
2323
*/
24-
2524
#include "SoftPathElectronics.h"
2625

26+
// Konstruktor
2727
CustomKeyboard::CustomKeyboard() {
28-
_debug = false;
28+
_debug = false; // Setzen Sie dies auf 'true', um Debugging zu aktivieren
2929
_lastKey = -1;
3030
_resetRequired = false;
3131
_pressed = false;
3232
}
3333

34+
// Initialisierung der Tastatur
3435
void CustomKeyboard::setupKeyboard() {
3536
Serial.begin(115200);
37+
// Entfernen der 'while (!Serial) { ; }' Zeile, um Hängenbleiben zu vermeiden
3638

3739
if (!readBoolWithPrompt("Haben Sie alle Sicherheitshinweise gelesen? (y/n):")) {
3840
Serial.println("Bitte lesen Sie die Sicherheitshinweise, bevor Sie fortfahren.");
@@ -54,26 +56,43 @@ void CustomKeyboard::setupKeyboard() {
5456

5557
_debounceMode = readBoolWithPrompt("Soll eine Taste erst gezählt werden, wenn der analoge Wert zwischendurch 0 war? (y/n):");
5658

59+
// Initialisieren des Pins
60+
pinMode(_pin, INPUT);
61+
5762
Serial.println("Starte Tastenkalibrierung...");
5863
for (int i = 0; i < _numKeys; i++) {
5964
while (true) {
6065
calibrateKey(i);
61-
Serial.print("Möchtest du zu Taste ");
66+
Serial.print("Taste ");
6267
Serial.print(i + 1);
63-
Serial.println(" fortfahren oder 'redo' eingeben? (Enter für fortfahren / redo eingeben):");
64-
while (Serial.available() == 0) {}
68+
Serial.println(" wurde kalibriert.");
69+
70+
if (i < _numKeys - 1) {
71+
Serial.print("Möchtest du mit Taste ");
72+
Serial.print(i + 2);
73+
Serial.print(" fortfahren oder 'redo' eingeben für Taste ");
74+
Serial.print(i + 1);
75+
Serial.println("? (Enter für fortfahren / redo eingeben):");
76+
} else {
77+
Serial.println("Kalibrierung abgeschlossen.");
78+
}
79+
80+
while (Serial.available() == 0) {
81+
// Warten auf Benutzereingabe
82+
}
6583
String input = Serial.readStringUntil('\n');
6684
input.trim();
6785
if (input.equalsIgnoreCase("redo")) {
68-
continue;
86+
continue; // Wiederhole die Kalibrierung der aktuellen Taste
6987
}
70-
break;
88+
break; // Gehe zur nächsten Taste
7189
}
7290
}
73-
Serial.println("Kalibrierung abgeschlossen.");
91+
Serial.println("Kalibrierung aller Tasten abgeschlossen.");
7492
printKey();
7593
}
7694

95+
// Kalibriert eine einzelne Taste
7796
void CustomKeyboard::calibrateKey(int keyIndex) {
7897
int value1, value2;
7998

@@ -93,14 +112,15 @@ void CustomKeyboard::calibrateKey(int keyIndex) {
93112
}
94113
}
95114

115+
// Liest einen einzelnen Tastendruck-Wert
96116
int CustomKeyboard::readKeyValue() {
97-
std::vector<int> values;
117+
int count = 0;
98118
int value;
99119

100120
while (true) {
101121
value = readAnalogValue();
102-
if (value > 0) {
103-
values.push_back(value);
122+
if (value > 0 && count < MAX_SAMPLES) {
123+
_values[count++] = value;
104124
}
105125
if (Serial.available() > 0) {
106126
String input = Serial.readStringUntil('\n');
@@ -109,70 +129,100 @@ int CustomKeyboard::readKeyValue() {
109129
}
110130
}
111131

112-
return calculateRobustMean(values);
132+
return calculateRobustMean(_values, count);
113133
}
114134

115-
int CustomKeyboard::calculateRobustMean(std::vector<int>& values) {
116-
if (values.size() < 3) {
117-
long sum = 0;
118-
for (int value : values) {
119-
sum += value;
135+
// Berechnet den robusten Mittelwert (Median-basierte Methode)
136+
int CustomKeyboard::calculateRobustMean(int* values, int count) {
137+
if (count == 0) {
138+
return 0;
139+
}
140+
141+
// Sortieren der Werte (Bubble Sort)
142+
for (int i = 0; i < count - 1; i++) {
143+
for (int j = 0; j < count - i - 1; j++) {
144+
if (values[j] > values[j + 1]) {
145+
int temp = values[j];
146+
values[j] = values[j + 1];
147+
values[j + 1] = temp;
148+
}
120149
}
121-
return sum / values.size();
122150
}
123151

124-
std::sort(values.begin(), values.end());
125-
int median = values[values.size() / 2];
152+
// Berechnung des Medians
153+
int median;
154+
if (count % 2 == 0) {
155+
median = (values[count / 2 - 1] + values[count / 2]) / 2;
156+
} else {
157+
median = values[count / 2];
158+
}
126159

127-
int sum = 0;
128-
int count = 0;
129-
for (int value : values) {
130-
if (abs(value - median) < _tolerance) {
131-
sum += value;
132-
count++;
160+
// Summieren der Werte innerhalb der Toleranz um den Median
161+
long sum = 0;
162+
int validCount = 0;
163+
for (int i = 0; i < count; i++) {
164+
if (abs(values[i] - median) < _tolerance) {
165+
sum += values[i];
166+
validCount++;
133167
}
134168
}
135169

136-
return (count > 0) ? (sum / count) : median;
170+
if (validCount > 0) {
171+
return sum / validCount;
172+
} else {
173+
return median;
174+
}
137175
}
138176

177+
// Liest den analogen Wert vom angegebenen Pin
139178
int CustomKeyboard::readAnalogValue() {
140-
return analogRead(_pin); // Reads the analog value from the specified pin
179+
return analogRead(_pin);
141180
}
142181

182+
// Liest eine boolesche Eingabe vom Benutzer (y/n)
143183
bool CustomKeyboard::readBoolWithPrompt(String prompt) {
144184
char value;
145185
while (true) {
146186
promptUser(prompt);
147-
if (Serial.available() > 0) {
148-
value = Serial.read();
149-
while (Serial.available() > 0) {
150-
Serial.read(); // Clear the buffer
151-
}
152-
if (value == 'y' || value == 'Y') {
153-
return true;
154-
} else if (value == 'n' || value == 'N') {
155-
return false;
156-
}
187+
while (Serial.available() == 0) {
188+
// Warten auf Eingabe
189+
}
190+
value = Serial.read();
191+
while (Serial.available() > 0) {
192+
Serial.read(); // Puffer leeren
193+
}
194+
if (value == 'y' || value == 'Y') {
195+
return true;
196+
} else if (value == 'n' || value == 'N') {
197+
return false;
198+
} else {
199+
Serial.println("Ungültige Eingabe. Bitte 'y' oder 'n' eingeben.");
157200
}
158201
}
159202
}
160203

204+
// Liest eine Ganzzahl vom Benutzer
161205
int CustomKeyboard::readIntWithPrompt(String prompt) {
162-
int value;
206+
int value = 0;
163207
while (true) {
164208
promptUser(prompt);
165-
if (Serial.available() > 0) {
166-
value = Serial.parseInt();
167-
while (Serial.available() > 0) {
168-
Serial.read(); // Clear the buffer
169-
}
209+
while (Serial.available() == 0) {
210+
// Warten auf Eingabe
211+
}
212+
value = Serial.parseInt();
213+
while (Serial.available() > 0) {
214+
Serial.read(); // Puffer leeren
215+
}
216+
if (value != 0) {
170217
break;
218+
} else {
219+
Serial.println("Ungültige Eingabe. Bitte eine gültige Zahl eingeben.");
171220
}
172221
}
173222
return value;
174223
}
175224

225+
// Gibt die konfigurierten Schlüsselwerte aus
176226
void CustomKeyboard::printKey() {
177227
Serial.print("Key: ");
178228
Serial.print(_pin);
@@ -183,44 +233,45 @@ void CustomKeyboard::printKey() {
183233
Serial.print(" ");
184234
Serial.print(_debounceMode ? 1 : 0);
185235
Serial.print(" ");
186-
for (int i = 0; i < 16; i++) {
236+
for (int i = 0; i < _numKeys; i++) { // Nur bis _numKeys iterieren
187237
Serial.print(_keyValues[i]);
188238
Serial.print(" ");
189239
}
190240
Serial.println();
191241
}
192242

243+
// Zeigt eine Nachricht an und wartet auf Benutzereingabe
193244
void CustomKeyboard::promptUser(String message) {
194245
Serial.println(message);
195-
while (Serial.available() == 0) {}
196246
}
197247

248+
// Initialisiert die Tastatur mit gespeicherten Schlüsselwerten
198249
void CustomKeyboard::setupKey(const String& key) {
199-
int values[20] = {0}; // Initialize all to zero
250+
int values[20] = {0}; // Alle Werte mit 0 initialisieren
200251
int index = 0;
201252
int startIndex = 0;
202253
int spaceIndex = key.indexOf(' ', startIndex);
203254

204-
// Parse the key string and fill the values array
255+
// Parse des Key-Strings und Füllen des values-Arrays
205256
while (spaceIndex != -1 && index < 20) {
206257
String token = key.substring(startIndex, spaceIndex);
207258
values[index++] = token.toInt();
208259
startIndex = spaceIndex + 1;
209260
spaceIndex = key.indexOf(' ', startIndex);
210261
}
211-
// Capture the last value if there's no trailing space
262+
// Letzten Wert erfassen, falls kein abschließendes Leerzeichen vorhanden ist
212263
if (startIndex < key.length() && index < 20) {
213264
String token = key.substring(startIndex);
214265
values[index++] = token.toInt();
215266
}
216267

217-
// Check if we have all the required values
268+
// Überprüfen, ob alle erforderlichen Werte vorhanden sind
218269
if (index < 20) {
219270
Serial.println("Error: Key string does not have enough values.");
220271
return;
221272
}
222273

223-
// Assign the values to the appropriate variables
274+
// Zuweisen der Werte zu den entsprechenden Variablen
224275
_pin = values[0];
225276
_numKeys = values[1];
226277
_tolerance = values[2];
@@ -229,7 +280,7 @@ void CustomKeyboard::setupKey(const String& key) {
229280
_keyValues[i] = values[4 + i];
230281
}
231282

232-
// Initialize the pin
283+
// Initialisieren des Pins
233284
pinMode(_pin, INPUT);
234285

235286
if (_debug) {
@@ -251,6 +302,7 @@ void CustomKeyboard::setupKey(const String& key) {
251302
}
252303
}
253304

305+
// Gibt die Nummer der gedrückten Taste zurück
254306
int CustomKeyboard::getKeyPressed() {
255307
int value = readAnalogValue();
256308
if (_debug) {
@@ -274,13 +326,15 @@ int CustomKeyboard::getKeyPressed() {
274326
return -1; // Keine Taste erkannt
275327
}
276328

329+
// Gibt den Wert einer bestimmten Taste zurück
277330
int CustomKeyboard::getKeyValue(int index) {
278331
if (index >= 0 && index < 16) {
279332
return _keyValues[index];
280333
}
281334
return -1;
282335
}
283336

337+
// Getter-Methoden
284338
int CustomKeyboard::getPin() {
285339
return _pin;
286340
}

0 commit comments

Comments
 (0)