RFD-FHEM / SIGNALDuino

System to capture digital signaldata and transfer them to another system
GNU General Public License v3.0
83 stars 35 forks source link

Datenmenge zur Übertragung reduzieren #47

Closed Ralf9 closed 4 years ago

Ralf9 commented 7 years ago

ich habe versucht nach jeder gesendeten Raw Nachricht den freien FIFO zu senden, aber irgendwas passt nicht. Es funktioniert nicht so wie ich gedacht habe. Der freie FIFO wird nicht nach jeder Raw Nachricht gesendet. Mache ich da einen Denkfehler?

void loop() {
    static int aktVal=0;
    bool state;
    if (command_available) {
        command_available=false;
        HandleCommand();
        if (!command_available) { cmdstring = ""; }
        blinkLED=true;
    }
    while (FiFo.count()>0 ) { //Puffer auslesen und an Dekoder uebergeben
        aktVal=FiFo.dequeue();
        state = musterDec.decode(&aktVal); 
        if (state) {
            if (MdebLevel == 1) {
                MSG_PRINT(F("MD="));
                MSG_PRINTLN(FiFo.count(), DEC);
            }
            blinkLED=true; //LED blinken, wenn Meldung dekodiert
        }
    }
 }

MU;P0=-3944;P1=6060;P2=-6404;P3=3491;P4=-2368;P5=924;P6=-918;P7=2009;D=45676767012367476767676767676367476767676767676343436767676743;CP=7;R=65;
MU;P0=-3956;P1=6056;P2=3506;P3=156;P4=-2378;P5=292;P6=-898;P7=2029;D=23456767676767676767012267476767676767676267476767676767676242426767676742;CP=7;R=65;
MS;P1=483;P2=-3934;P3=-985;P4=-1956;D=12131413141413141314131314131313131413141313131414141414141313141314131413;CP=1;SP=2;R=16;O;
MS;P0=-981;P1=492;P2=-1972;P3=-3910;D=13101210121210121012101012101010101210121010101212121212121010121012101210;CP=1;SP=3;R=15;O;
MS;P0=-1938;P1=500;P2=-977;P3=-3890;D=13121012101012101210121210121212121012101212121010101010101212101210121012;CP=1;SP=3;R=13;O;
MU;P0=-959;P1=504;P2=-1938;P3=-3920;P4=264;D=01012101010101210121010101212121212121010121012101210131012101212101210121010121010101012101210101012121212121210101210121012104;CP=1;R=12;
MU;P0=-16380;P1=556;P2=-4176;P3=-2188;P4=322;P5=240;P6=-116;P7=184;D=431212131313131313131313131213131212121212567352431213121210;CP=1;R=242;
MU;P0=-4156;P1=569;P2=-2105;P4=380;D=01210101210101242121212121212121210121210101;CP=1;R=240;
MS;P0=-3914;P1=471;P5=-1960;P7=-990;D=10171517151717171517171517171717171517151717151717151515151717151715151717;CP=1;SP=0;R=23;O;
MS;P0=-970;P1=499;P2=-1953;P3=-3902;D=13101210121010101210101210101010101210121010121010121212121010121012121010;CP=1;SP=3;R=23;O;
MS;P0=-981;P1=475;P2=-1961;P3=-3911;D=13101210121010101210101210101010101210121010121010121212121010121012121010;CP=1;SP=3;R=23;O;
MU;P0=-1962;P1=488;P2=-977;P3=-3904;P4=144;D=01212101212101010101212101210101212131210121012121210121210121212121210121012121012121010101012121012101012124;CP=1;R=23;
MU;P0=-29352;P1=2009;P2=-922;P3=-3948;P4=6056;P5=-6396;P6=3476;P7=-2389;D=012121212121212121212121345621712121212121212621712121212121212676762121212176;CP=1;R=65;
MU;P0=-918;P1=2013;P2=3477;P3=-2390;D=0101010101010201310101010101010232320101010132;CP=1;R=65;
MS;P1=548;P2=-9064;P3=-2099;P4=-4137;D=1213141414131313141313131413131313141313141413131313141314141314141314131314;CP=1;SP=2;R=12;O;
MD=0
MS;P0=-2087;P1=549;P2=-4129;P3=-9036;D=1310121212101010121010101210101010121010121210101010121012121012121012101012;CP=1;SP=3;R=10;
MD=5
MS;P0=-2087;P1=549;P2=-4129;P3=-9036;D=1310121212101010121010101210101010121010121210101010121012121012121012101012;CP=1;SP=3;R=10;
MD=17
MS;P0=-2102;P1=549;P2=-4129;P3=-9036;D=1310121212101010121010101210101010121010121210101010121012121012121012101012;CP=1;SP=3;R=10;
MD=16
MS;P0=-2027;P1=549;P2=-4129;P3=-9036;D=1310121212101010121010101210101010121010121210101010121012121012121012101012;CP=1;SP=3;R=10;
MD=16
MU;P0=-6928;P1=-919;P2=2013;P3=-3948;P4=6048;P5=3476;P6=-2401;D=1212121212121212340512621212121212121512621212121212121565651212121265;CP=2;R=63;
MU;P0=-2378;P1=136;P2=-899;P3=2027;P4=-3944;P5=6044;P6=-6404;P7=3503;D=012323232323456723032323232323232723032323232323232707072323232307;CP=3;R=64;
MU;P0=-2093;P1=584;P2=141;P4=-4148;P5=-6944;D=010202010101010101410101414141414101410152;CP=1;R=4;
MD=1
MU;P1=-4139;P3=589;P5=-2141;P6=-8592;D=5361313135313531353131313135313531363536;CP=3;R=250;
MS;P0=-2085;P1=561;P2=-9218;P3=-4154;D=1210131310131310101010101010101010131010131313131310131013101313131310131013;CP=1;SP=2;R=248;
MS;P0=-2308;P1=571;P2=-9080;P3=-4153;D=1210131310131310101010101010101010131010131313131310131013101313131310131013;CP=1;SP=2;R=248;
MU;P0=244;P1=-2097;P2=564;P3=-4089;D=012123232323232123212321232323232123212323;CP=2;R=250;
MS;P1=494;P2=-3901;P3=-968;P4=-1944;D=12131413141413141314131314131313131413141313131414141414141313141314131413;CP=1;SP=2;R=246;
MU;P0=-112;P1=158;P2=-1963;P3=491;P4=-967;P5=360;P6=-3924;P7=-7084;D=0123434323432543234363432343232343234323417;CP=3;R=246;
MU;P0=-4228;P1=502;P2=-963;P3=-2014;D=01213121313121312131212131212121213121313;CP=1;R=0;
MU;P0=204;P1=-1957;P2=497;P3=-981;P4=-7692;D=01232121232123212323212323232321232123232321212121212123232124;CP=2;R=247;
MS;P1=548;P2=-8656;P3=-2082;P4=-4160;D=1213141414131313141313131413131313141313141413131313141314141314141314131314;CP=1;SP=2;R=10;
MU;P0=-2374;P1=292;P2=-905;P3=2030;P4=-3936;P5=6064;P6=-6396;P7=3494;D=012323232323232323456723032323232323232723032323232323232707072323232307;CP=3;R=64;
MU;P0=3512;P1=534;P2=-2355;P3=-4009;P4=2025;P5=-900;P6=6068;P7=-6388;D=0121313131212121345454545454545454545454367054245454545454545054245454545454545020205454545420;CP=4;R=62;
MD=0
MS;P1=558;P2=-2088;P3=-4130;P4=-9053;D=1412131313121212131212121312121212131212131312121212131213131213131213121213;CP=1;SP=4;R=7;
MD=6
MS;P1=558;P2=-2088;P3=-4130;P4=-9053;D=1412131313121212131212121312121212131212131312121212131213131213131213121213;CP=1;SP=4;R=7;
MD=8
MS;P1=558;P2=-2088;P3=-4130;P4=-9053;D=1412131313121212131212121312121212131212131312121212131213131213131213121213;CP=1;SP=4;R=7;
MD=7
MS;P0=664;P1=558;P3=-4130;P4=-9053;D=1410131313101010131010101310101010131010131310101010131013131013131013101013;CP=1;SP=4;R=7;
MD=8
MS;P0=597;P3=-4130;P4=-9053;D=0400030303000000030000000300000000030000030300000000030003030003030003000003;CP=0;SP=4;R=7;
MD=7
MS;P0=597;P3=-4130;P4=-9053;D=0400030303000000030000000300000000030000030300000000030003030003030003000003;CP=0;SP=4;R=7;
MD=6
MS;P0=-1958;P3=-983;P6=489;P7=-3904;D=67636063606363636063636063636363636063606363606363606060606363606360606363;CP=6;SP=7;R=6;O;
MD=9
MS;P0=-1958;P3=-977;P6=489;P7=-3904;D=67636063606363636063636063636363636063606363606363606060606363606360606363;CP=6;SP=7;R=6;
MD=17
MS;P0=-1949;P3=-974;P6=489;P7=-3907;D=67636063606363636063636063636363636063606363606363606060606363606360606363;CP=6;SP=7;R=9;O;
MD=7
MS;P0=-1949;P3=-985;P6=489;P7=-3907;D=67636063606363636063636063636363636063606363606363606060606363606360606363;CP=6;SP=7;R=9;
MD=14
MS;P0=-1940;P3=-974;P6=504;P7=-3901;D=67636063606363636063636063636363636063606363606363606060606363606360606363;CP=6;SP=7;R=9;O;
MD=9
MS;P0=-1940;P3=-973;P6=504;P7=-3901;D=67636063606363636063636063636363636063606363606363606060606363606360606363;CP=6;SP=7;R=9;
MD=17
MU;P0=-1950;P3=-975;P6=493;P7=-3910;D=3606363636363606360636360636360606060636360636060636367636063606363636063636063636363636063606363606363606060606363606360606363;CP=6;R=10;
MS;P1=544;P2=-9083;P3=-2116;P4=-4261;D=1213141413141413131313131313131313141313141414141413141314131414141413141314;CP=1;SP=2;R=249;
MU;P0=-2102;P1=312;P2=-4183;P3=567;D=01232303030303030303030303230303232323232;CP=3;R=6;
MS;P0=-4146;P1=549;P2=-2131;P4=-9054;D=1412101012101012121212121212121212101212101010101012101210121010101012101210;CP=1;SP=4;R=247;
MS;P2=-4148;P3=581;P4=-2090;P5=-9077;D=3534323234323234343434343434343434323434323232323234323432343232323234323432;CP=3;SP=5;R=248;
MD=7
MU;P0=2025;P1=-3944;P2=6048;P3=-6412;P4=3500;P5=-2369;P6=892;P7=-897;D=6707070123470507070707070707470507070707070707454547070707054;CP=0;R=65;
MU;P0=-2367;P1=92;P2=-904;P3=2023;P4=-3936;P5=6048;P6=-6412;P7=3503;D=012323232323456723032323232323232723032323232323232707072323232307;CP=3;R=64;
MS;P0=-1945;P1=508;P2=-967;P3=-4348;P4=192;D=1312101210101210121012121012121212101210121212433;CP=1;SP=3;R=246;
MS;P0=-4182;P1=497;P2=-962;P3=-1961;P4=-9340;P5=276;D=1012131213131213121312121312121212131213121212131313131313121213121312131214533;CP=1;SP=0;R=245;
MU;P0=112;P1=-1988;P2=499;P3=-957;P4=-3944;P5=-6900;D=012324232123212123212321232321232323232123212323232521;CP=2;R=245;
MS;P0=-9059;P2=546;P3=-2114;P4=-4143;D=2023242424232323242323232423232323242323242423232323242324242324242324232324;CP=2;SP=0;R=11;O;
MD=0
MS;P0=-2089;P1=552;P2=-4123;P3=-9072;D=1310121212101010121010101210101010121010121210101010121012121012121012101012;CP=1;SP=3;R=11;
MD=0
MS;P0=-2089;P1=552;P2=-4123;P3=-9072;D=1310121212101010121010101210101010121010121210101010121012121012121012101012;CP=1;SP=3;R=11;
sidey79 commented 7 years ago

Hi Ralf,

das mit dem reset direkt im Code macht es wieder schwieriger den Code zu warten. Was für einen Vorteil hat es, nicht die reset Funktion aufzurufen?

Das Message Objekt nur bis zu messagelen zu leeren können wir ja generell so einbauen, dass der Reset bis bytepos durchgeführt wird, ließe sich in der bitstore Klasse leicht nachrüsten.

Zur Abfrage in addvalue: eine Abfrage behebt die Ursache nicht, es wirkt nur am Symptom. Mir ist leider noch immer unklar, warum messagelen überhaupt > 254 wird. Das ist doch der eigentliche Fehler.

Ich konnte leider noch nicht feststellen, wann genau die Variablen auseinander laufen. Vielleicht vergleiche ich mal messagelen mit valcount und komme dem Fehler dann auf die Spur.

Ralf9 commented 7 years ago

Das Message Objekt nur bis zu messagelen zu leeren können wir ja generell so einbauen, dass der Reset bis bytepos durchgeführt wird

ja, wenn Du dies generell einbaust, ist der reset direkt im Code nicht unbedingt notwendig.

Ralf9 commented 7 years ago

mstart 49 mend 98 messageLen 254 ist das ok, daß das message Ende bei 98 ist, die messageLen aber 254 ist?

zwischen 99 und 254 sind bestimmt noch Wiederholungen.

Ich habe dies mal nach der Ausgabe des MS Nachricht eingebaut, damit werden dann Wiederholungen ausgegeben. Macht es Sinn, daß alle Wiederholungen ausgegeben werden? Es kann dann sein, daß dann 5 oder mehr gleiche Nachrichten ausgegeben werden

                success = true;
                if (m_overflow) {
                    bufferMove(mend+1);
                    MSG_PRINT(F("MS move. messageLen ")); MSG_PRINTLN(messageLen);
                    mstart = 0;
                    m_overflow = false;
                    return;
                }
sidey79 commented 7 years ago

Die Mehrfach Ausgabe bringt meiner Meinung nach nichts. Ich hatte mal vor eine crc8 Prüfung laufen zu lassen, ob denn die Nachricht zwei mal vorhanden ist.

sidey79 commented 7 years ago

Ich habe im unit Test gestern Abend noch Fehler nachgestellt.

Einen Fehler konnte ich schnell beheben, es gibt aber noch einen. Der Wert bytecount wir seltsamer Weise auf 0 gesetzt. Ich habe leider noch nicht raus, warum das passiert. Zumindest ab diesem Punkt funktioniert buffermove nicht mehr richtig.

Ralf9 commented 7 years ago

Die Mehrfach Ausgabe bringt meiner Meinung nach nichts.

Ja, alle Wiederholungen auszugeben ist zu viel. Aber gar keine Wiederholungen auszugeben ist evtl bei nicht so gutem Empfang zu wenig.

Wenn man eine neue Variable (z.B. msMoveCount) einführt, müssten sich mit dem u.g. Code die Wiederholungen auf 1-2 begrenzen lassen. Der Code wird nach der Ausgabe des MS Nachricht eingefügt.

success = true;
if ((messageLen - mend) >= minMessageLen) {
    if (msMoveCount> 0) {
        msMoveCount--;
        bufferMove(mend+1);
        mstart = 0;
        return;
    }
}

Die Variable msMoveCount müsste dann beim nächsten nicht valide pulse mit z.B. 2 neu initialisiert werden.

sidey79 commented 7 years ago

Ich würde das mit dem CRC machen. Wenn der Empfang schlecht ist, dann ist eine Wiederholung eventuell korrupt und eine andere nicht. Beide auszugeben führt dann unter Umständen dazu, dass zwei Werte ausgewertet werden.

Ich habe hier Sender, die senden über 10*. Das macht heute bereits 3-4 Ausgaben die in Fhem verarbeitet werden.

sidey79 commented 7 years ago

Kleines Update zur Bugsuche.

Ich habe den Fehler in einem Unittest nachgestellt. Im bitstore wird nach einigen buffermove in einen Speicherbereich außerhalb des Arrays geschrieben. Ich bleibe dran. Vielleicht habe ich diesen Bug auch erst durch fixing eingebaut..

Ralf9 commented 7 years ago

Ich habe mir das mit den Wiederholungen bei den MS Nachrichten mal angeschaut. Es gibt 2 Arten von Wiederholungen.

Bei der ersten Art gibt es nach jeder Wiederholung eine kurze Pause die als !valid erkannt wird. Dadurch wird nach jeder Wiederholung processMessage() aufgerufen.

Bei der zweiten Art gibt es nach jeder Wiederholung keine Pause und processMessage() wird erst aufgerufen, wenn der message buffer voll ist. Da mir die Verarbeitung bei der zweiten Art nicht so gefallen hat, habe ich es mal bei mir eingebaut, daß mit der Variable MsMoveCount die Anzahl der Wiederholungen begrenzt werden. Dabei habe ich noch einen Fehler in der processMessage() beseitigt. Nun funktioniert es mit den Wiederholungen so wie ich es mir vorgestellt habe.

Dein Vorschlag mit dem CRC wird wahrscheinlich nur bei der zweiten Art funktionieren. Ich denke es ist effektiver wenn wir die Verarbeitung der Wiederholungen in die 00_Signalduino einbauen. Dazu könnte man in der Protkoll_ID_Liste ein weiteren Eintrag (z.B. doubleMsgCheck) zufügen. Dann könnte man in der MS_Parse_Routine einbauen, daß wenn bei einer Protokoll_ID der Eintrag "doubleMsgCheck " vorhanden ist, nur dann ein dispatch durchführt, wenn hintereinander 2 gleiche Nachrichten empfangen wurden.

sidey79 commented 7 years ago

Verstehe, passt aber nicht zur Reduzierung der Datenmenge, eher das Gegenteil :)

Ralf9 commented 7 years ago

ja, bei einigen Nachrichten der zweiten Art kann sich dadurch die anzahl der Wiederholungen ein klein wenig erhöhen. Im Gegenzug werden durch beseitigung eines Fehlers in bestimmten Fällen die anzahl der Wiederholungen reduziert.

An Ende der der processMessage() hat hier ein "m_truncated = false;" gefehlt.

    if (!m_truncated)
    {
        reset();
    }

Ich habe es wie folgt abgeändert. Hat dies evtl Nebenwirkungen die ich übersehen habe?

    if (!m_truncated)
    {
        reset();
    } else {
        m_truncated = false;
    }
sidey79 commented 7 years ago

Hmm, wieso fehlt am Ende m_truncated= false ? Das wird doch immer dann auf false gesetzt wenn z.B. ein Reset ausgeführt wird oder buffeMove nicht verschieben konnte

Ralf9 commented 7 years ago

Wenn hier ohne nachfolgende Pause eine valide MS-Nachricht folgt, wird kein Reset durchgeführt

            else if (m_endfound == false && mstart > 0 && mend + 1 >= maxMsgSize) // Start found, but no end. We remove everything bevore start and hope to find the end later
            {
                bufferMove(mstart);
                m_truncated = true;  // Flag that we truncated the message array and want to receiver some more data
            } 
            else if (m_endfound && mend < maxMsgSize) {  // Start and end found, but end is not at end of buffer, so we remove only what was checked

                bufferMove(mend);
                m_truncated = true;  // Flag that we truncated the message array and want to receiver some more data
                success = true; // don't process other message types
            }
sidey79 commented 7 years ago

Das ist so gewollt. Wenn bufferMove im Puffer etwas verschieben konnte, dann soll kein reset erfolgen.

Ob die nachfolgende MS Nachricht valide ist, wird nicht geprüft. Ich stehe wohl etwas auf dem Schlauch.

Ich habe die Fehler, die zum Absturz führten entfernt.. Läuft jetzt stabil.

Ralf9 commented 7 years ago

was ist, wenn die folgende MS Nachricht Wiederholungen ohne Pausen hat?

sidey79 commented 7 years ago

dann ist m_endfound = true und m_truncated wird nicht gesetzt. Der Puffer wird dann komplett verworfen.

Ralf9 commented 7 years ago

Wenn vom vorangegangenen buffermove das m_truncated noch true ist und kein reset erfolgt ist, dann ist das m_truncated noch true

sidey79 commented 7 years ago

Das stimmt, könnte ein Problem sein.

Ralf9 commented 7 years ago

Das Message Objekt nur bis zu messagelen zu leeren können wir ja generell so einbauen, dass der Reset bis bytepos durchgeführt wird, ließe sich in der bitstore Klasse leicht nachrüsten.

Hast Du dies schon nachgerüstet?

sidey79 commented 7 years ago

Ich habe es sogar noch deutlich verbessert eingebaut.

Ralf9 commented 7 years ago

Damit gebe ich bei der reduzierten Ausgabe die message Daten aus:

for (uint8_t i = mstart; i <= mend; i=i+2)
{
    n = message[i] << 4;
    n += message[i+1];
    Serial.write(n);
}

Es wäre effektiver, wenn es in der bitstore Klasse ein getValueByte geben würde, mit der zwei 4 Bit Werte in einem Byte übergeben werden. Ein MSG_WRITE wäre auch recht praktisch

sidey79 commented 7 years ago

getByte ist doch vorhanden.

Ralf9 commented 7 years ago

ok, hab ich übersehen. In welcher Reihenfolge sind die Werte in dem datastore[] Buffer gespeichert? Wenn ich wie folgt werte zufüge, wie sind diese dann im datastore[] Buffer gespeichert? message.addValue(1); message.addValue(2); message.addValue(3); message.addValue(4);

sidey79 commented 7 years ago
message.addValue(1);
message.addValue(2);  

```entspricht bei getByte
`00010010`

message.addValue(3); message.addValue(4);


entspricht somit
`00110100`

message.addValue(1) ist wie schon erwähnt identisch zu message+=1 
Ralf9 commented 7 years ago

Ok, das passt dann. Die message Ausgaberoutine müsste dann so ausehen Es muss dann eine Abfrage rein ob mstart ungerade

if (mstart % 2 != 0) {  // ungerade
 n = message[mstart] + 128;    // high nibble = 8 als Kennzeichen für ungeraden mstart
 MSG_WRITE(n);
 mstart++;
}
for (uint8_t i = mstart; i <= mend; i=i+2)
{
    n = message.getByte(i/2);
    MSG_WRITE(n);
}
sidey79 commented 7 years ago

MSG_WRITE habe ich ergänzt.

Gerade / Ungerade kann man auch mit deutlich weniger Rechenaufwand feststellen:

if ((mstart  & 1) == 1) {  // mstart ist ungerade

}

Checkst Du die Angepassten Ausgaberoutinen ein?

sidey79 commented 7 years ago

Mir ist noch eingefallen, es gibt drei Möglichkeiten hinsichtlich gesetzter Bits.

1) Start oder Ende liegen mitten in einem Byte

Die ausgegebene Anzahl ist ungerade

2) Start und Ende liegen mitten in einem Byte

Die ausgegebene Anzahl ist gerade

3) Start und Ende liegen am Anfang / Ende eines Bytes

Die ausgegebene Anzahl ist gerade

Ralf9 commented 7 years ago

Checkst Du die Angepassten Ausgaberoutinen ein?

Ja mach ich, wenn ich sie fertig habe.

sidey79 commented 7 years ago

Du kannst ja auch gerne schon den Zwischenstand einchecken. Dann kann ich mir die Teile schon Mal ansehen.

Ralf9 commented 7 years ago

Ich habe mal die compress printmsg bei den MS-Nachrichten eingecheckt.

Im der 00_SIGNALduino.pm muß in der SIGNALduino_Read($) bei der decompress Routine

            elsif (($m0 eq "D" || $m0 eq "d") && length($m1) > 0) {
                my @arrayD = split(//, $m1);
                $part .= "D=";
                foreach my $D (@arrayD) {
                    $mH = (ord($D) >> 4) & 7;
                    $mL = ord($D) & 7;
                    $part .= "$mH$mL";
                }
                if ($m0 eq "d") {
                    $part =~ s/.$//;       # letzte Ziffer entfernen wenn Anzahl der Ziffern ungerade
                }
                $part .= ";";
            }

noch ergänzt werden, daß bei ungeradem mstart die '8' am Anfang entfernt wird.

Ich habe es so gelöst. Ist evtl etwas umständlich programmiert:

            elsif (($m0 eq "D" || $m0 eq "d") && length($m1) > 0) {
                $part .= "D=";
                for (my $nD=0; $nD < length($m1); $nD++) {
                    $D = substr($m1, $nD, 1);
                    $mH = ord($D) >> 4;
                    if ($nD == 0 && $mH == 8) {
                        $mH = "";
                    }
                    $mL = ord($D) & 7;
                    $part .= "$mH$mL";
                }
                if ($m0 eq "d") {
                    $part =~ s/.$//;       # letzte Ziffer entfernen wenn Anzahl der Ziffern ungerade
                }
                $part .= ";";
            }
sidey79 commented 7 years ago

Wo eingecheckt?

Hab jetzt nur den Code hier in der Nachricht gesehen.

Warum hast Du die Umwandlung in die Read Funktion eingebaut? Diese wird ja Recht oft aufgerufen. Wäre es nicht besser das erste in der parse Funktion umzuwandeln?

Ralf9 commented 7 years ago

habe es ausversehen geschlossen

Ralf9 commented 7 years ago

Die Rückwandlungsroutine habe ich in die dev-r33 eingecheckt. Ich habe sie dort eingebaut wo auch "$name/msg READ" ausgegeben wird.

Die Ergänzung, daß bei ungeradem mstart die '8' am Anfang entfernt wird, habe ich nicht eingescheckt, da ich nicht weiß ob es so wie ich es programmiert habe etwas unständlich und langsam ist.

Ralf9 commented 7 years ago

Dies ist mir nicht klar. Was ergibt bei "unsigned char" ein return -1

unsigned char BitStore<bufSize>::getByte(const uint8_t idx)
{
    if (idx >= buffsize ) return -1; // Out of buffer range
    return datastore[idx];
}
sidey79 commented 7 years ago

hmm, das ist mehr oder weniger Murx....

-1 wäre binär 11111111111111111111111111111111 aber eigentlich ist es nicht darstellbar. Ich habe die Funktion jetzt geändert

Ralf9 commented 7 years ago

Ich habe den Fehler gefunden, warum ich bei ITv1 nur eine Wiederholung hatte. Ich habe dies und weiteres comitted. Mit "MsMoveCount = 3;" sieht es nun so aus:

MS;P0=-11386;P1=353;P2=-1121;P3=1148;P4=-425;D=10123412121212121212121212121212121212123412341234;CP=1;SP=0;R=55;O;m2;
MS;P0=-11368;P1=349;P2=-1145;P3=1146;P4=-426;D=10123412121212121212121212121212121212123412341234;CP=1;SP=0;R=55;O;m1;
MS;P0=-11368;P1=358;P2=-1133;P3=1130;P4=-426;D=10123412121212121212121212121212121212123412341234;CP=1;SP=0;R=55;O;m0;
MS;P0=-11368;P1=359;P2=-1132;P3=1154;P4=-416;D=10123412121212121212121212121212121212123412341234;CP=1;SP=0;R=55;
Ralf9 commented 7 years ago
template<uint8_t bufSize>
bool BitStore<bufSize>::getByte(const uint8_t idx,void *retvalue)
{
    if (idx >= buffsize ) return false; // Out of buffer range
    retvalue = datastore[idx];
    return true;
}

Wenn ich dies hier mit der Arduino IDE compiliere bekomme ich die folgende Fehlermeldung?

bitstore.h:288: error: invalid conversion from 'unsigned char' to 'void*' [-fpermissive]
  retvalue = datastore[idx];
Ralf9 commented 7 years ago

Ich habs mir nochmals angeschaut, nun ist es mir klar. retvalue = datastore[idx]; ist unsigned char. Aber in der signalduino.cpp steht

uint8_t n;
..
message.getByte(i/2,&n);

Es muß heissen: unsigned char n;

Kann ich mit unsigned char auch "+ - & |" verwenden? z.B. n = n & 15; oder n++;

sidey79 commented 7 years ago

Ja, die Operatoren gehen auch mit char.

Ralf9 commented 7 years ago

Das Ändern von "uint8_t n;" nach "unsigned char n;" hat nichts gebracht. Es scheint an dem "void retvalue" zu liegen, kann ich dies ersetzen durch "unsigned char retvalue""?

Ralf9 commented 7 years ago

Hat nichts gebracht nun habe ich die folgende Fehlermeldung bitstore.h:288: error: invalid conversion from 'unsigned char' to 'unsigned char*' [-fpermissive]

Ralf9 commented 7 years ago

Hab es mit Hilfe von Google hinbekommen, nun funktioniert es: bool BitStore<bufSize>::getByte(const uint8_t idx,unsigned char & retvalue)

Ralf9 commented 7 years ago

Irgendwas passt noch nicht, ich bekomme ab und zu "addData overflow!!!"

Mu;���;�Ђ;��;���;���;���;���;�Ս;d###Eg##'###'######'##';C3;REA;
val=0 msglen=254 mTrunc=1 addData overflow!!!
val=1 msglen=254 mTrunc=1 addData overflow!!!
val=0 msglen=254 mTrunc=1 addData overflow!!!
val=1 msglen=254 mTrunc=1 addData overflow!!!
val=0 msglen=254 mTrunc=1 addData overflow!!!
val=5 msglen=254 mTrunc=1 addData overflow!!!
val=0 msglen=254 mTrunc=1 addData overflow!!!
val=1 msglen=254 mTrunc=1 addData overflow!!!
val=0 msglen=254 mTrunc=1 addData overflow!!!
val=1 msglen=254 mTrunc=1 addData overflow!!!
val=0 msglen=254 mTrunc=1 addData overflow!!!
val=1 msglen=254 mTrunc=1 addData overflow!!!
val=0 msglen=254 mTrunc=1 addData overflow!!!
val=1 msglen=254 mTrunc=1 addData overflow!!!
val=0 msglen=254 mTrunc=1 addData overflow!!!
val=5 msglen=254 mTrunc=1 addData overflow!!!
val=0 msglen=254 mTrunc=1 addData overflow!!!
val=1 msglen=254 mTrunc=1 addData overflow!!!
val=0 msglen=254 mTrunc=1 addData overflow!!!
val=5 msglen=254 mTrunc=1 addData overflow!!!
val=0 msglen=254 mTrunc=1 addData overflow!!!
val=1 msglen=254 mTrunc=1 addData overflow!!!
val=0 msglen=254 mTrunc=1 addData overflow!!!
val=1 msglen=254 mTrunc=1 addData overflow!!!
val=0 msglen=254 mTrunc=1 addData overflow!!!
val=5 msglen=254 mTrunc=1 addData overflow!!!
val=0 msglen=254 mTrunc=1 addData overflow!!!
val=1 msglen=254 mTrunc=1 addData overflow!!!
val=0 msglen=254 mTrunc=1 addData overflow!!!
val=1 msglen=254 mTrunc=1 addData overflow!!!
val=0 msglen=254 mTrunc=1 addData overflow!!!
val=1 msglen=254 mTrunc=1 addData overflow!!!
val=0 msglen=254 mTrunc=1 addData overflow!!!
val=5 msglen=254 mTrunc=1 addData overflow!!!
val=0 msglen=254 mTrunc=1 addData overflow!!!
val=1 msglen=254 mTrunc=1 addData overflow!!!
val=0 msglen=254 mTrunc=1 addData overflow!!!
val=5 msglen=254 mTrunc=1 addData overflow!!!
val=0 msglen=254 mTrunc=1 addData overflow!!!
val=5 msglen=254 mTrunc=1 addData overflow!!!
val=0 msglen=254 mTrunc=1 addData overflow!!!
val=5 msglen=254 mTrunc=1 addData overflow!!!
val=0 msglen=254 mTrunc=1 addData overflow!!!
val=1 msglen=254 mTrunc=1 addData overflow!!!
val=0 msglen=254 mTrunc=1 addData overflow!!!
val=5 msglen=254 mTrunc=1 addData overflow!!!
val=0 msglen=254 mTrunc=1 addData overflow!!!
val=1 msglen=254 mTrunc=1 addData overflow!!!
val=0 msglen=254 mTrunc=1 addData overflow!!!
val=5 msglen=254 mTrunc=1 addData overflow!!!
val=0 msglen=254 mTrunc=1 addData overflow!!!
val=1 msglen=254 mTrunc=1 addData overflow!!!
val=0 msglen=254 mTrunc=1 addData overflow!!!
val=1 msglen=254 mTrunc=1 addData overflow!!!
val=0 msglen=254 mTrunc=1 addData overflow!!!
val=1 msglen=254 mTrunc=1 addData overflow!!!
val=0 msglen=254 mTrunc=1 addData overflow!!!
val=3 msglen=254 mTrunc=1 addData overflow!!!
val=0 msglen=254 mTrunc=1 addData overflow!!!
val=0 msglen=254 mTrunc=1 addData overflow!!!
val=1 msglen=254 mTrunc=1 addData overflow!!!
val=0 msglen=254 mTrunc=1 addData overflow!!!
val=5 msglen=254 mTrunc=1 addData overflow!!!
val=0 msglen=254 mTrunc=1 addData overflow!!!
val=5 msglen=254 mTrunc=1 addData overflow!!!
val=0 msglen=254 mTrunc=1 addData overflow!!!
val=5 msglen=254 mTrunc=1 addData overflow!!!
val=0 msglen=254 mTrunc=1 addData overflow!!!
val=1 msglen=254 mTrunc=1 addData overflow!!!
val=0 msglen=254 mTrunc=1 addData overflow!!!
val=1 msglen=254 mTrunc=1 addData overflow!!!
val=0 msglen=254 mTrunc=1 addData overflow!!!
val=1 msglen=254 mTrunc=1 addData overflow!!!
val=0 msglen=254 mTrunc=1 addData overflow!!!
val=5 msglen=254 mTrunc=1 addData overflow!!!
val=0 msglen=254 mTrunc=1 addData overflow!!!
val=1 msglen=254 mTrunc=1 addData overflow!!!
val=0 msglen=254 mTrunc=1 addData overflow!!!
val=1 msglen=254 mTrunc=1 addData overflow!!!
val=0 msglen=254 mTrunc=1 addData overflow!!!
val=1 msglen=254 mTrunc=1 addData overflow!!!
val=0 msglen=254 mTrunc=1 addData overflow!!!
val=5 msglen=254 mTrunc=1 addData overflow!!!
val=0 msglen=254 mTrunc=1 addData overflow!!!
val=1 msglen=254 mTrunc=1 addData overflow!!!
val=0 msglen=254 mTrunc=1 addData overflow!!!
val=1 msglen=254 mTrunc=1 addData overflow!!!
val=0 msglen=254 mTrunc=1 addData overflow!!!
val=1 msglen=254 mTrunc=1 addData overflow!!!
val=0 msglen=254 mTrunc=1 addData overflow!!!
val=1 msglen=254 mTrunc=1 addData overflow!!!
val=0 msglen=254 mTrunc=1 addData overflow!!!
val=5 msglen=254 mTrunc=1 addData overflow!!!
val=0 msglen=254 mTrunc=1 addData overflow!!!
val=1 msglen=254 mTrunc=1 addData overflow!!!
val=0 msglen=254 mTrunc=1 addData overflow!!!
val=5 msglen=254 mTrunc=1 addData overflow!!!
val=0 msglen=254 mTrunc=1 addData overflow!!!
val=1 msglen=254 mTrunc=1 addData overflow!!!
val=0 msglen=254 mTrunc=1 addData overflow!!!
val=1 msglen=254 mTrunc=1 addData overflow!!!
val=1 msglen=254 mTrunc=1 addData overflow!!!
val=5 msglen=254 mTrunc=1 addData overflow!!!
val=5 msglen=254 mTrunc=1 addData overflow!!!
val=5 msglen=254 mTrunc=1 addData overflow!!!
val=5 msglen=254 mTrunc=1 addData overflow!!!
val=5 msglen=254 mTrunc=1 addData overflow!!!
val=1 msglen=254 mTrunc=1 addData overflow!!!
val=3 msglen=254 mTrunc=1 addData overflow!!!
val=3 msglen=254 mTrunc=0 addData overflow!!!
Mu;�؄;�ئ;���;�ہ;��;�߃;���;d#@Tdtdtdddtddtdddddt;C4;R2;
Ralf9 commented 7 years ago

Das "addData overflow!!! "wurde seither nicht mehr ausgegeben. Anscheinend kommt dies nur sehr sehr selten vor. Es wurde wieder ausgegeben (s.o.)

Ralf9 commented 7 years ago

Ich möchte in der 00_SIGNALduino.pm in der SIGNALduino_Read($) die decompress Routine ergänzen, daß bei den Daten eine 8 am Anfang entfernt wird. Welche der beiden u.g. Varianten gefällt Dir besser, bzw ist schneller?

elsif (($m0 eq "D" || $m0 eq "d") && length($m1) > 0) {
        my @arrayD = split(//, $m1);
        $part .= "D=";
        $partD = "";
        foreach my $D (@arrayD) {
            $mH = ord($D) >> 4;
            $mL = ord($D) & 7;
            $partD .= "$mH$mL";
        }
        if ($m0 eq "d") {
            $partD =~ s/.$//;     # letzte Ziffer entfernen wenn Anzahl der Ziffern ungerade
        }
        $partD =~ s/^8//;         # 8 am Anfang entfernen
        $part = $part . $partD . ';';
}
elsif (($m0 eq "D" || $m0 eq "d") && length($m1) > 0) {
        $part .= "D=";
        $partD = "";
        for (my $nD=0; $nD < length($m1); $nD++) {
            $D = substr($m1, $nD, 1);
            $mH = ord($D) >> 4;
            $mL = ord($D) & 7;
            $partD .= "$mH$mL";
        }
        if ($m0 eq "d") {
            $partD =~ s/.$//;    # letzte Ziffer entfernen wenn Anzahl der Ziffern ungerade
        }
        $partD =~ s/^8//;            # 8 am Anfang entfernen
        $part = $part . $partD . ';';
}
sidey79 commented 7 years ago

Ich würde erwarten, dass die 1. Variante schneller ist

Ralf9 commented 7 years ago

Mit dieser Anpassung hatte ich seither keine "addData overflow!!! " mehr https://github.com/RFD-FHEM/SIGNALDuino/commit/097a51f0ae0395c23a944fb0de206300a3d21c73#commitcomment-21266086

Gegenüber den Routinen aus dev-r33_cc1101 hat sich die Erkennung und Dekodierung der MS-Nachrichten deutlich verbessert. Ich habe gestern Abend auch mal bei meinen Eltern getestet, dort sind einige Hama und Bresser Sensoren mit dem Hideki protocol. Ich hatte den Eindruck, daß sich die Erkennung und Dekodierung verschlechtert hat. Mit dem RXB6 und dev-r33 werden sie deutlich besser erkannt.