[Unzap] Abschaltcodes

Stefan Uhl s.uhl at gmx.net
Thu Oct 16 15:18:35 CEST 2008


* Alexander Neumann <fd0 at lochraster.org> [081015 22:25]:
> * Stefan Uhl <s.uhl at gmx.net> wrote:
> > [...]
> > Alexander: Was meinst du? Ist bei sowas der Parser klein genug? 
> 
> Klingt ganz cool, aber das kann man meistens erst hinterher sagen.
> Implementierst dus? ;)

Wie wärs mit sowas:


parse_code(uint8_t *hptr){ /* hptr zeige auf den Anfang des Headers  */
        uint16_t *bptr;
        uint16_t w[4], seq[];
        uint8_t pattern[], a, b, head, hlen, plen, scount;

        hlen = *hptr++;
        scount = 0;

        /* Hier sollte man den Bodypointer setzen, aber dazu müßte ich 
         * erst rausfinden, wie man aus 8-Bit-Zeigern 16-Bit-Zeiger macht. 
         * Außerdem die Frequenzinformationen einlesen, die am Anfang des 
         * Bodys stehen */

        for (uint8_t i = 0; i < hlen; i++){
                head = *hptr++;
                plen = head >> 2;
                if (head & 0x02){       /* nicht raw */
                        for (uint8_t j = 0; j < 4; j++) w[i] = *bptr++;
                        for (uint8_t j = 0; j < (plen + 7)/8;j++){
                                pattern[i++] = HI8(*bptr);
                                pattern[i] = LO8(*bptr++);
                        }
                        if (! head & 0x01){ /* Manchestercode */
                                a = pattern[0] & 0x01;
                                if (a) seq[scount++] = w[a];
                                else if (scount) seq[scount-1] += w[a];
                                for (uint8_t j = 1; j <= plen; j++){
                                        b = (pattern[j>>3] >> j & 0x07) & 0x01;
                                        if (a | b){
                                                seq[scount++] = w[b];
                                                seq[scount++] = w[a];
                                        }
                                        else seq[scount++] = w[2 + b];
                                        a = b;
                                }
                                seq[scount++] = w[++a & 0x01];
                        }
                        else if (head & 0x02){ /* 2bit pro Puls/Pause */
                                for (uint8_t j = 0; j < plen; j + 2){
                                        a = (pattern[j>>3] >> j & 0x07) & 0x03;
                                        seq[scount++] = w[a];
                                }
                        }
                        else {  /* Puls/Pausenweitenmodulation */
                                for (uint8_t j = 0; j < plen; j++){
                                        a = (pattern[j>>3] >> j & 0x07) & 0x01;
                                        seq[scount++] = w[2 * a];
                                        seq[scount++] = w[2 * a + 1];
                                }
                        }
                }
                else for (uint8_t j = 0; j < plen; j++) seq[scount++] = *bptr++;
        }
        
        seq[scount] = 0x0000;

        /* nun hat man einen Vektor seq der Länge scount mit abwechselnd 
         * Puls- und Pausenzeiten. Den muß man nun nur noch senden.... */

}

Ich hoff, ich hab die die Punkt-vor-Strichrechenregeln für &, * , ++ und
so richtig hingekriegt... Es ist doch richtig, daß in C ein Wert
ungleich 0 Wahr ist oder? 

Seh ich das richtig, daß man zum Senden Puls und Puls+Pausezeit braucht?
Dann muß man beim Senden nochmal addieren. Anders würde ich die
Manchestercodes nicht richtig hinkriegen.

Die Manchestercodes sind jetzt mit Puls-Pause als 1 (umgekehrt wie rc5)
codiert. Will man's andersrum haben, muß man die richtigen a und b vertauschen.
Alle außer den Manchestercodes können auch ungerade Längen haben...

Hmm. C ist doch nicht so schwer...

Stefan

> _______________________________________________
> unzap mailing list
> unzap at lochraster.org
> http://lists.gnuzifer.de/mailman/listinfo/unzap




More information about the unzap mailing list