diff options
author | Erich Eckner <git@eckner.net> | 2015-10-25 21:05:15 +0100 |
---|---|---|
committer | Erich Eckner <git@eckner.net> | 2015-10-26 13:16:05 +0100 |
commit | b13af1dc559902ac4f3349b6e04bc1fc5269769d (patch) | |
tree | 77f9a66591a0879ab416b43949c785c96a5250f1 | |
parent | 970f3265a66a333950880e0e8a14e91ca2e4c7da (diff) | |
download | units-b13af1dc559902ac4f3349b6e04bc1fc5269769d.tar.xz |
jetzt wirklich entprellt
-rw-r--r-- | irdecoderunit.pas | 102 |
1 files changed, 89 insertions, 13 deletions
diff --git a/irdecoderunit.pas b/irdecoderunit.pas index 22c71d0..314193d 100644 --- a/irdecoderunit.pas +++ b/irdecoderunit.pas @@ -14,6 +14,8 @@ type kaAddieren, // Parameter sind zu addieren kaNurEinMal); // 2x Befehl = 1x Befehl + tBefehl = class; + tIRDecoder = class private ttySLeser: tLeseProzess; @@ -22,13 +24,16 @@ type letzterEmpf: boolean; eingabePuffer: array of longword; eingabeLaenge: int64; - zustand: longword; + letzterBefehl, + zustand: longword; _watte,_debug: boolean; + debugDatei: textfile; procedure init; procedure tastenDruckAnhaengen(lw: longword); procedure befehlAusfuehren(cmd,params: string); function findeZeichen(lw: longword): int64; function findeBefehl(lw: longword): int64; + procedure befehlVlltEntprellen(num: longint); public constructor create(inputName, konfigName: string; watte, debug: boolean); destructor destroy; override; @@ -54,10 +59,11 @@ procedure sortiereZeichenTabelle(von,bis: int64); procedure sortiereBefehlsTabelle(von,bis: int64); function befehlsVergleich(b1,b2: int64): integer; inline; overload; function befehlsVergleich(b1,b2Num,b2Zus: int64): integer; inline; overload; +function argumenteKompatibel(par1,par2: string; ka: tKollapsArt): boolean; implementation -uses math; +uses math, systemunit, matheunit; var zeichenTabelle: array of longword; @@ -81,6 +87,11 @@ begin _watte:=watte; _debug:=debug; + if _debug then begin + assignFile(debugDatei,'/tmp/fernbedienung.debug'); + rewrite(debugDatei); + end; + ttySLeser:=tLeseProzess.create(inputName,1); fillchar(eingabePuffer,sizeof(eingabePuffer),#0); init; @@ -94,6 +105,7 @@ end; procedure tIRDecoder.init; begin + letzterBefehl:=$ffffffff; letztesZeichen[false]:=$ffffffff; letztesZeichen[true]:=$ffffffff; letzterEmpf:=false; @@ -107,16 +119,28 @@ procedure tIRDecoder.tastenDruckAnhaengen(lw: longword); var empf: boolean; begin + if _debug then begin + append(debugDatei); + writeln(debugDatei,inttohex(lw,4)); + closeFile(debugDatei); + end; + empf:=odd(lw shr 1); lw:=((lw shr 1) and not 1) or byte(odd(lw)); - if (empf=letzterEmpf) or (lw<>letztesZeichen[letzterEmpf]) then + if _debug then begin + append(debugDatei); + writeln(debugDatei,'-> '+inttohex(lw,4),' ',byte(empf),' ',byte(letzterEmpf),' ',inttohex(letztesZeichen[empf],4),' ',byte(ersterEmpf)); + closeFile(debugDatei); + end; + + if (empf=letzterEmpf) or (lw<>letztesZeichen[empf]) then ersterEmpf:=empf; if empf=ersterEmpf then begin if eingabeLaenge>=length(eingabePuffer) then setlength(eingabePuffer,eingabeLaenge+1024); - eingabePuffer[eingabeLaenge]:=findeZeichen(lw and not $08); + eingabePuffer[eingabeLaenge]:=(findeZeichen(lw and not $08) shl 1) or byte((lw and $08) <> 0); inc(eingabeLaenge); end; @@ -128,6 +152,11 @@ procedure tIRDecoder.befehlAusfuehren(cmd,params: string); var p: tProcess; begin + if _debug then begin + append(debugDatei); + writeln(debugDatei,'>> '+cmd+' '+params); + closeFile(debugDatei); + end; if _watte then writeln(cmd+' '+params) else begin @@ -195,6 +224,23 @@ begin raise exception.create('Kann Befehl Nummer '''+inttohex(lw,4)+''' im Zustand '+inttostr(zustand)+' nicht finden!'); end; +procedure tIRDecoder.befehlVlltEntprellen(num: longint); +var + i,cnt: longint; +begin + if not befehlsTabelle[findeBefehl(num) shr 1].einzelKlick then + exit; + cnt:=num+1; + while (eingabeLaenge>cnt) and (eingabePuffer[cnt]=eingabePuffer[num]) do + inc(cnt); + dec(cnt); + if cnt>num then begin + for i:=cnt+1 to eingabeLaenge-1 do + eingabePuffer[i-cnt+num]:=eingabePuffer[i]; + eingabeLaenge:=eingabeLaenge-cnt+num; + end; +end; + function tIRDecoder.zeileVerarbeitet: boolean; var s: string; @@ -220,17 +266,22 @@ end; function tIRDecoder.befehlVerarbeitet: boolean; var i,cnt: longint; - bef,bef2: longword; + bef,bef2,zei: longword; cmd,params,s,t: string; begin - result:=eingabeLaenge>0; - if not result then exit; + repeat + result:=eingabeLaenge>0; + if not result then exit; - bef:=findeBefehl(eingabePuffer[0]); + zei:=eingabePuffer[0]; + bef:=findeBefehl(zei shr 1); + befehlVlltEntprellen(0); - for i:=1 to eingabeLaenge-1 do - eingabePuffer[i-1]:=eingabePuffer[i]; - dec(eingabeLaenge); + for i:=1 to eingabeLaenge-1 do + eingabePuffer[i-1]:=eingabePuffer[i]; + dec(eingabeLaenge); + until (zei<>letzterBefehl) or not befehlsTabelle[bef].einzelKlick; + letzterBefehl:=zei; cmd:=befehlsTabelle[bef].cmd; params:=befehlsTabelle[bef].params; @@ -239,9 +290,11 @@ begin if befehlsTabelle[bef].kollapsArt<>kaIgnorieren then begin cnt:=0; while cnt<eingabeLaenge do begin - bef2:=findeBefehl(eingabePuffer[cnt]); + bef2:=findeBefehl(eingabePuffer[cnt] shr 1); if (befehlsTabelle[bef].kollapsArt=befehlsTabelle[bef2].kollapsArt) and - (befehlsTabelle[bef].cmd=befehlsTabelle[bef2].cmd) then begin + (cmd=befehlsTabelle[bef2].cmd) and + (argumenteKompatibel(params,befehlsTabelle[bef2].params,befehlsTabelle[bef].kollapsArt)) then begin + befehlVlltEntprellen(cnt); for i:=1 to eingabeLaenge-1 do eingabePuffer[i-1]:=eingabePuffer[i]; dec(eingabeLaenge,1); @@ -509,6 +562,29 @@ begin result:=0; end; +function argumenteKompatibel(par1,par2: string; ka: tKollapsArt): boolean; +var + s1,s2: string; +begin + result:=false; + case ka of + kaToggle,kaNurEinMal: + result:=par1=par2; + kaAddieren: begin + result:=true; + while result and (par1<>'') and (par2<>'') do begin + s1:=erstesArgument(par1); + s2:=erstesArgument(par2); + result:= + result and + ((s1=s2) or + (istGanzZahl(s1) and istGanzZahl(s2))); + end; + result:=result and (par1=par2); + end; + end{of case}; +end; + var i: longint; initialization |