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
2727CustomKeyboard::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
3435void 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
7796void 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
96116int 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
139178int 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)
143183bool 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
161205int 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
176226void 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
193244void CustomKeyboard::promptUser (String message) {
194245 Serial.println (message);
195- while (Serial.available () == 0 ) {}
196246}
197247
248+ // Initialisiert die Tastatur mit gespeicherten Schlüsselwerten
198249void 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
254306int 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
277330int CustomKeyboard::getKeyValue (int index) {
278331 if (index >= 0 && index < 16 ) {
279332 return _keyValues[index];
280333 }
281334 return -1 ;
282335}
283336
337+ // Getter-Methoden
284338int CustomKeyboard::getPin () {
285339 return _pin;
286340}
0 commit comments