-
Notifications
You must be signed in to change notification settings - Fork 34
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
signalDecoder: Bugfixing und Verbesserungen #67
Comments
Hi Ralf, ich komme da leider noch nicht ganz mit. Einige Fehler konnte ich schon identifizieren und ausbessern. Einen habe ich aber noch nicht gefunden. Da passen auf einmal die Variable valcount unt bitcount nicht mehr zusammen. Das führt dann auch zu Einträgen mit fehlerhaftem Vorzeichen. |
ich konnte außer dem bcnt Fehler in der moveLeft und der etwas unsauberen Variablen Definitionen keine weiteren Fehler in der Bitstore Klasse finden. |
Hi Ralf, Ich mache es aktuell so: Mit diesem Testprogramm prüfe ich dann auch meine Fehlerbehebung und passe so lange an, bis alle Tests erfolgreich sind. Dadurch habe ich nun schon einige Anpassungen verifiziert. Die Berechnung von valcount habe ich so angepasst, dass es relativ zum vorherigen Wert berechnet wird und nicht mehr absolut. Irgendwo hapert es aber noch mit der Berechnung von bitcount . Da habe ich leider noch nicht genug Ausgaben eingebaut, um diesen Fehler reproduzieren zu können. |
Uups, ich meinte die Berechnung von bytecount ist fehlerhaft und nicht bitcount |
Ich habe mal meine Verbesserungen und Überarbeitungen von doDetect() und bitstore.h in github commited. Es kann sein, das es noch nicht ganz passt |
Hallo @Ralf9 , deine Version empfängt auf jedenfall im Gegensatz zu @sidey79 seiner aktuellen Version die Hideki Protokolle wie von mir hier schon erwähnt. Im Groben kann ich erstmal sagen, läuft. Langzeit werde ich verfolgen. |
Tia, ich weiss jetzt leider nicht , ob mir das hilft. Ich weiss nicht genau, was der Fehler ist. Ich sehe nur sehr viele Änderungen, die ich so erst Mal nicht nachvollziehen kann. Wieso damit jetzt Hideki besser sein soll verstehe ich auch nicht. |
Hallo Sidey, ich habe versucht die doDetect Routine zu optimieren. Bei der jetztigen Struktur tue ich mich dabei etwas schwer.
!valid bedeuted, daß ein Signalende erkannt wurde. Ein voller message Puffer ist kein Signalende.
Wenn valid dann:
|
Ja ich denke ich verstehe deinen Ansatz. Ich hatte das auch mal so ähnlich angedacht, aber wenn der Puffer voll ist und man kein processMessage probiert, dann verliert man alle Wiederholungen. |
Ich habe das mit dem !valid = Signalende erkannt, mal bei mir eingebaut. Ich hatte vor die Add pattern Routine vom doDetect() zu optimieren, dies hat aber nicht so funktioniert wie ich es vor hatte. Dies ist doch sehr viel komplexer als ich dachte. Ich verwende nun wieder Deine Add pattern Routine. Gefühlsmäßig müsste in der Add pattern Routine noch Verbesserungspotential sein. Mir ist auch aufgefallen, daß mein hideki Sensor mit dem RXB6 Empfänger sehr viel besser erkannt wird.
Beim RXB6 Empfänger werden die beiden Wiederholungen vom FS10 Sender zuverlässig erkannt. |
Vielleicht liegt es daran, dass beim cc1101 kein rauchen empfangen wird und dadurch der Pin nicht permanent toggelt. |
Hallo, Mal "dahin" gefragt, was ist der große Unterschied in dem jetzigen Code zum "damaligen" Stand juni von @sidey79. Eines ist auffällig. Seitdem wir versuchen das ganze zu Debugen mit addData, ist der Empfang der Hideki Protokolle schlechter. Ich habe das mal durchgespielt als ich die alte FW nutzte und nun diese von Dir Ralf oder von Sidey. Der Count der Nachrichten ist immer mindestens ca. 1/3 geringer als bei der noch fehlerhaften Firmware vom Juni. |
Mhmm, irgend etwas muss ich falsch machen :-( SIGNALDuino-dev-r332_cc1101_2017-10-30_Ralf9:
Die Wiederholung nach der Pause von ca. 9 mSek wird von FHEM an FHT80TF übergeben und dort natürlich nicht dekodiert, was ja auch so richtig ist. Mit dem Parameter probiere ich jetzt gerade herum (war ursprünglich 0): Werte von 1 bis 10 splitten die Nachrichten so:
Was versteckt sich hinter dem Parameter "CSmuthresh" genau?
|
Ja das muthresh ist der Patternwert ab dem eine Pause erkannt wird. Hier wäre es ca 9000. |
Da die Auswertung ja auf ">= MuSplitThresh" prüft, würde ich hier z.B. 5000 einstellen. Aber wie Sidey schon bemerkt hatte, wäre es sicher besser, diesen Wert nicht benutzerdefiniert zu machen. Das ist zum einen keinem Nutzer zumutbar, die Protokolle zu kennen und zum anderen braucht man ja u.U. bei verschiedenen Protokollen unterschiedlich Werte. Gefühlsmäßig würde ich den Wert so auf 5 bis 10 mal größte Pulslänge setzen.
Der Vorteil ist höhere Übertragungssicherheit, wenn der erste Teil vielleicht nicht erkannt wurde, klappt es halt mit dem zweiten :-) Außerdem erinnere ich mich an ein anderes Protokoll (Siro m.E.), da wurde ein bestimmter Befehl erst in einer Wiederholung übertragen.
Beim FHT80 einmal, bei FS20 bis zu zweimal. |
Hallo Sidey, ich verstehe noch nicht so richtig wie die Add pattern Routine funktioniert.
Wenn ich das richtig verstehe, wird bei einem neuen Pattern das älteste Pattern im Patternpuffer überschrieben. Mir ist aber nicht klar zu was dies nötig ist?
|
Der Abschnitt dient dazu, processMessage aufzurufen, wenn das Pattern, welches überschrieben werden soll mehr als 2 Mal in der Nachricht vorkommt |
in findpatt() wird ein tolfact von 0,2 verwendet ist dies so ok? |
Hallo Sidey, ich habe in der calcHisto Routine noch einige Fehler gefunden. Eine ungerade startpos wurde nicht berücksichtigt und das endpos hat auch noch nicht ganz gepasst:
Nun ist mir aufgefallen, daß sich die Add pattern Routine jetzt etwas anders verhält. Bei MS Nachrichten ist nun das mStart viel größer als vorher:
In der processMessage hat bei MS Nachrichten bei der Abfrage "(messageLen - mstart) >= minMessageLen" gefehlt: |
Ich habe mir mal die Laufzeit einiger Passagen angesehen...
compress_pattern kann durchaus mal 10 ms andauern. Da läuft der Puffer durchaus mal voll. |
Ja, das habe ich inzwischen auch festgestellt, daß in der compress_pattern anscheinend etwas nicht zu passen scheint. |
Kann es sein, daß in dieser Zeile was nicht passt? Ich habe ein paar Debugausgaben eingefügt:
und bekomme diese Ausgabe!
P0:1*[724] + P4: 125*[564] = 45 passt nicht so richtig! oder
P0: 9*[-2084] + P3: 56*[-2068] = -53 |
Der Wertebereich läuft über, da pattern[idx2] * histo[idx2] in der Klammer steht und nur ein int ist (16 Bit) |
ist es so besser? |
Ich würde Mal darauf tippen, dass es dann klappt ;) |
nun scheint es zu klappen, bis jetzt hatte ich keine Wrong Data after compress_pattern mehr. |
Zu was ist ein nach einem compresspattern noch ein calcHisto notwendig? |
ok, dann baue ich es in die 00_SIGNALduino ein. Ich möchte beim Hideki auch die Möglichkeit haben, zu testen und auszugeben ob und wie oft es vorkommt, daß die MC-Nachrichten invertiert sind. Kann ich es so machen?
Wie kann ich die $bitData invertieren? |
Verstehe ich nicht ganz was Du da ausgeben möchtest. Und in parse_MC ist das invertieren der Nachrichten bereits enthalten.
Und in SIGNALduino_Split_Message müsste man halt noch auf den Typ Mc Zusätzlich zu MC matchen Dann könnte man mithilfe "messagetype" abfragen ob es MC oder Mc ist. Die hinterlegte Polarität könnte man in etwa so umdrehen:
Habe ich jetzt so noch nicht ausprobiert, müsste aber im groben so gehen. |
Ich möchte langfristig von der ID 12.1 wegkommen.
|
Naja, das verstehe ich nicht. Jetzt wird ja im Gegensatz zu vorher die Polarität zu vorher invertiert erfasst. |
Heißt das, daß wir bei den Protokollen, bei denen momentan keine polarity 'invert' definiert ist, jetzt invertieren müssen?
Kann ich damit $bitData invertieren? |
Davon gehe ich aus, dass wir die Polarität genau umgekehrt benötigen wie davor. Mit tr/01/10 könntest Du bits invertieren, aber die Daten liegen schon in beiden Formen im Speicher, da die Hex Digits bereits invertiert in einer Variabe gespeichert werden.
Meiner Meinung nach, müssen wir eigentlich die Polarität nur umdrehen, wenn Mc übergeben kommt, als es aktuell in den Protokollen vermerkt ist. Wenn Polarity gesetzt ist, dann werden aktuell die invertierten Werte genommen. Ist dies nicht gesetzt, dann wird RawData verwendet. Dieses Verhalten müssen wir nun umdrehen. Wenn Polarity gesetzt ist, dann wird der nicht invertiere Werte genommen. Ist dies nicht gesetzt, dann wird rawDataInverted verwendet. Pro Protokoll würde ich so Änderungen nicht anfangen, dafür ist ja Polarity gedacht. |
Ich möchte ohne dafür eine 2.Protokol (ID 12.1) definieren zu müssen, die Möglichkeit haben, zu testen ob und wie häufig es vorkommt daß es dem MC Pattern decoder nicht gelingt das MC Signal nicht invertiert zu erkennen und es dann invertiert decodiert und übertragen wird. |
Das sieht man, je nachdem ob die Definition für Protokoll 12 oder 12.1 passt dachte ich. |
Ich möchte es als log Ausgabe haben
|
Dies ist so evtl etwas kompliziert aber ich weis nicht wie ich es einfacher hinbekomme:
|
Naja ich finde es nicht kompliziert. Nach dem oder Würde ich die darauf Folgenden Bedingungen in eine Klammer setzen. |
Das müsste so passen, da ja || und && einer höhere prio hat als eq Das testen von ob und wie oft es vorkommt daß die MC-Nachrichten invertiert gesendet werden,
|
Hmm, ich würde das so auswerten: Bedingung 1 Also Bedingung 1 und Bedingung 3 oder Bedingung 2 und 3 müssen erfüllt sein. Ob es Perl in allen Versionen auch nicht weiss ich nicht. Eindeutig und gewollt war doch bestimmt Bedingung 1 oder (Bedingung 2 und Bedingung 3) Also 1 oder 2 und 3 |
Durch die Klammer vor defined "'Mc' || (defined" habe ich doch: |
Irgendwie war ich der Meinung die Bedingung 2 steht alleine in einer Klammer. Auf dem Handy finde ich das immer etwas schwieriger zu erkennen :( Ist aber wohl doch nicht so, die Klammer ist un Bedingung 2 und Bedingung 3. |
was meinst Du mit pushen? Ich habe es heute Nachmittag commitet |
Hatte ich irgendwie nicht so richtig gesehen. |
in der SignalDetectorClass::getSync() ist mir was aufgefallen, das für mich nicht ganz sauber aussieht.
|
Was ist daran unsauber eine Funktion mit Return zu verlassen? |
Ich habe mal nachgeschaut, demnach kann auch mit return eine Schleife sauber verlassen werden.
Dann kann auch eine verschachtelte Schleife mit return beendet werden:
|
Jo, dann sind wir ja auf dem gleichen Stand :) |
@sidey79 |
#67 Erkennung des 1. Bits angepasst, wenn eine preamble erkannt wurde
Zu Beginn lief alles über tolfact. Der Faktor in findpatt stand auch Mal auf 0,3. Leider weiss ich nicht mehr genau welche Probleme es damit gab, allerdings habe ich es nicht ganz ohne Grund geändert. Grundlegend wäre es aber wünschenswert überall mit den gleichen Toleranz Werten zu arbeiten. |
Beim Einbauen vom empfangen von HE_EU ist mir aufgefallen, daß "syncLenMax = 100;" in getsync hierfür zu klein ist. Ich habe mir nochmals Gedanken über das
Wir haben Ein anderer Grund könnte sein, daß es MS Nachrichten gibt bei denen jede Wiederholung eine eigene Nachricht ohne ein sync am Ende ist. Wir hatten bei einem Issue oder Commit schon mal was darüber geschrieben, ich kann es aber nicht mehr finden. Nachtrag; |
Eine Möglichkeit ist auch:
|
von 100 auf 120 erhöht. Dies ist zum Empfangen von Homeeasy HE_EU notwendig RFD-FHEM#67 (comment) Beim if histo[p] => 1 durch histo[p] = 1 ersetzt
Ich habe in der doDetect() einige Verbesserungen vorgenommen. Die gleichen patterrnNr in Folge im message Puffer sind jetzt weg.
Damit waren die meisten gleichen patterrnNr in Folge weg.
SIGNALDuino/src/_micro-api/libraries/signalDecoder/src/signalDecoder.cpp
Line 183 in 2958b4a
Es blieben aber noch einige gleiche patterrnNr in Folge übrig, die schwer zu finden waren.
Damit wurde der last pulse mit dem aktuellen first überschrieben. Der Fehler in der calcHisto Routine konnte sich da auch ausgewirkt haben
Ich habe die Routine abgeändert. Nun wird zuerst ein compress_pattern versucht, falls kein compress möglich war, entferne ich Zeichen am Anfang des message Puffers:
Diese Routine gefällt mir noch nicht so richtig:
Damit wird processMessage() auch aufgerufen, wenn die mindest messageLen noch nicht erreicht wurde. Wenn beim Aufruf von processMessage() das "m_truncated = false" ist, dann wird in der processMessage() ein reset() durchgeführt!
The text was updated successfully, but these errors were encountered: