Hallo zusammen,
bisher habe ich Mobiflight ersteinmal nur mit einem Encoder und dessen Button getestet.
Mit dem Encoder wähle ich Heading über FSUIPC für den MSFS2020. Grundsätzlich funktioniert das auch., wobei ich da auch ein kleines "Problem" habe

Allerdings passiert es alle 6 - 8 Mal, das sich beim schnellen drehen einmal die Richtung ändert.
Um der Ursache auf den Grund zu gehen, habe ich den Arduino mit einer seriellen Schnittstelle verbunden und mir den Output angeschaut.
Da kann man auch gut sehen, dass sich mittendrin einmal die Richtung ändert, z.Bsp:
....
6,Set Heading,1;
6,Set Heading,3;
6,Set Heading,1;
....
Dann habe ich mit die Arduino SW angeschaut, es gibt da wohl einen Überlauf in RotaryEncoder.cpp, Funktion tick():
_position += KNOBDIR[thisState | (_oldState<<2)] * _speed;
Beim schnellen drehen wird _speed recht groß, sodass bis ~2800 (*4 bei einem Encoder mit 4 Schritten, *2 bei einem mit 2 Schritten) zur Position hinzu addiert werden können. Nach <10 Mal drehen des Encoders läuft die Variable _position dann über.
Dieses sollte allerdings in MFEncoder.cpp, Funktion update() mittels:
if ( (dir > 0 && (pos + delta*2) > MF_ENC_MAX) || (dir < 0 && (pos - delta*2) < MF_ENC_MIN))
abgefangen werden. Allerdings werden dabei nicht die Impulse pro Schritt des Encoders berücksichtigt. MF_ENC_MAX/MIN müssten also mit den Schritten dividiert (nicht multipliziert wie zuerst geschrieben) werden.
Da in der FW aber ja "nur" der Delta Wert des Encoders von Interesse ist und nicht der Absolut Wert, kann auf die if Abfrage auch verzichtet werden. Nach jedem auslesen wird die absolute Position dann halt auf Null gesetzt
Ich habe das auch schon so auf den Arduino aufgespielt und bisher keinen negativen Effekt fest gestellt.
Ich hatte noch einige Debug Print Ausgaben eingebaut und aufgezeichnet, die kann ich gerne auch zur Verfügung stellen.
Es würde mich freuen, wenn das zur Verbesserung beiträgt.
Viele Grüße
Ralf
P.S.: Allerdings wundere ich mich das es bei mir zum ersten Mal auffällt...
Edit: MF_ENC_MAX/MIN müsste also mit den Schritten
dividiert und nicht multipliziert werden.