diff options
Diffstat (limited to 'irdecoderunit.pas')
-rw-r--r-- | irdecoderunit.pas | 60 |
1 files changed, 47 insertions, 13 deletions
diff --git a/irdecoderunit.pas b/irdecoderunit.pas index dcbc5fe..ac46bcb 100644 --- a/irdecoderunit.pas +++ b/irdecoderunit.pas @@ -13,24 +13,37 @@ type ttySLeser: tLeseProzess; letztesZeichen: array[boolean] of longword; letzterEmpf: boolean; + eingabePuffer: array of longword; + eingabeLaenge: longword; procedure init; - procedure verarbeite(lw: longword); - function einzelKlickZeichen(lw: longword): boolean; procedure tastenDruckAnhaengen(lw: longword); + procedure befehlAusfuehren(lw: longword); public constructor create(inputName: string); destructor destroy; override; function zeileVerarbeitet: boolean; + function befehlVerarbeitet: boolean; + end; + + tBefehl = record + zeichen: longword; + einzelKlick: boolean; + toDo: string; end; implementation +const zeichenTabelle: array[0..0] of tBefehl = ( + (zeichen: $e0000000; einzelKlick: true; toDo: 'Hallo!') + ); + // tIRDecoder ****************************************************************** constructor tIRDecoder.create(inputName: string); begin inherited create; ttySLeser:=tLeseProzess.create(inputName,1); + fillchar(eingabePuffer,sizeof(eingabePuffer),#0); init; end; @@ -45,30 +58,38 @@ begin letztesZeichen[false]:=$ffffffff; letztesZeichen[true]:=$ffffffff; letzterEmpf:=false; + setlength(eingabePuffer,0); + eingabeLaenge:=0; end; -procedure tIRDecoder.verarbeite(lw: longword); +procedure tIRDecoder.tastenDruckAnhaengen(lw: longword); var empf: boolean; begin empf:=odd(lw shr 1); lw:=((lw shr 1) and not 1) or byte(odd(lw)); - if (lw<>letztesZeichen[letzterEmpf]) or not einzelKlickZeichen(lw) then - tastenDruckAnhaengen(mirrorBits(lw and not $08)); + if (lw<>letztesZeichen[letzterEmpf]) or (empf=letzterEmpf) then begin + if eingabeLaenge>=length(eingabePuffer) then + setlength(eingabePuffer,eingabeLaenge+1024); + eingabePuffer[eingabeLaenge]:=lw; + inc(eingabeLaenge); + end; letztesZeichen[empf]:=lw; letzterEmpf:=empf; end; -function tIRDecoder.einzelKlickZeichen(lw: longword): boolean; -begin - result:=true; -end; - -procedure tIRDecoder.tastenDruckAnhaengen(lw: longword); +procedure tIRDecoder.befehlAusfuehren(lw: longword); +var + i: longword; begin - writeln('> '+hexDump(@lw,sizeof(lw))); + for i:=0 to length(zeichenTabelle)-1 do + if zeichenTabelle[i].zeichen=lw then begin + writeln('> '+zeichenTabelle[i].toDo); + exit; + end; + writeln('roh: '+hexDump(@lw,sizeof(lw))); end; function tIRDecoder.zeileVerarbeitet: boolean; @@ -90,12 +111,25 @@ begin raise exception.create('interner Fehler: base64ToBin meckert, base64Decode aber nicht!'); writeln('Bits: '+s+' '+hexDump(@inByte,sizeof(inByte))); - verarbeite(inByte); + tastenDruckAnhaengen(inByte); exit; end; writeln('Warnung: Kenne Kommando '''+s+''' nicht - komisch formatiert!'); end; +function tIRDecoder.befehlVerarbeitet: boolean; +var + i: longword; +begin + result:=eingabeLaenge>0; + if not result then exit; + + befehlAusfuehren(eingabePuffer[0]); + for i:=1 to eingabeLaenge-1 do + eingabePuffer[i-1]:=eingabePuffer[i]; + dec(eingabeLaenge); +end; + end. |