From 4b42acf805024ab0e0ccf5e0176d506791c98e72 Mon Sep 17 00:00:00 2001 From: Erich Eckner Date: Thu, 22 Oct 2015 14:26:10 +0200 Subject: Befehle werden jetzt auch zusammengefasst - lauffähig MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- irdecoderunit.pas | 112 ++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 74 insertions(+), 38 deletions(-) (limited to 'irdecoderunit.pas') diff --git a/irdecoderunit.pas b/irdecoderunit.pas index 8e50998..9114421 100644 --- a/irdecoderunit.pas +++ b/irdecoderunit.pas @@ -18,14 +18,14 @@ type private ttySLeser: tLeseProzess; letztesZeichen: array[boolean] of longword; - letzterEmpf: boolean; + ersterEmpf, + letzterEmpf: boolean; eingabePuffer: array of longword; - eingabeLaenge, - letzterBefehl: longword; + eingabeLaenge: longword; _watte: boolean; procedure init; procedure tastenDruckAnhaengen(lw: longword); - procedure befehlAusfuehren(lw: longword); + procedure befehlAusfuehren(cmd,params: string); public constructor create(inputName: string); overload; constructor create(inputName, konfigName: string); overload; @@ -136,7 +136,7 @@ begin letztesZeichen[false]:=$ffffffff; letztesZeichen[true]:=$ffffffff; letzterEmpf:=false; - letzterBefehl:=$ffffffff; + ersterEmpf:=false; setlength(eingabePuffer,0); eingabeLaenge:=0; end; @@ -144,14 +144,25 @@ end; procedure tIRDecoder.tastenDruckAnhaengen(lw: longword); var empf: boolean; + i: longword; begin empf:=odd(lw shr 1); lw:=((lw shr 1) and not 1) or byte(odd(lw)); - if (lw<>letztesZeichen[letzterEmpf]) or (empf=letzterEmpf) or empf then begin + if (empf=letzterEmpf) or (lw<>letztesZeichen[letzterEmpf]) then + ersterEmpf:=empf; + + if empf=ersterEmpf then begin if eingabeLaenge>=length(eingabePuffer) then setlength(eingabePuffer,eingabeLaenge+1024); - eingabePuffer[eingabeLaenge]:=lw; + eingabePuffer[eingabeLaenge]:=$ffffffff; + for i:=0 to length(zeichenTabelle)-1 do + if (lw and not $08)=zeichenTabelle[i] then begin + eingabePuffer[eingabeLaenge]:=i; + break; + end; + if eingabePuffer[eingabeLaenge]=$ffffffff then + raise exception.create('Kann Tastencode '''+inttohex(lw,4)+''' nicht finden!'); inc(eingabeLaenge); end; @@ -159,37 +170,21 @@ begin letzterEmpf:=empf; end; -procedure tIRDecoder.befehlAusfuehren(lw: longword); +procedure tIRDecoder.befehlAusfuehren(cmd,params: string); var - neu: boolean; - bw: longword; - output: string; - p: tProcess; + p: tProcess; begin - neu:=lw<>letzterBefehl; - letzterBefehl:=lw; - lw:=lw and not $08; - - for bw:=0 to length(befehlsTabelle)-1 do - if zeichenTabelle[bw]=lw then begin - if neu or not befehlsTabelle[bw].einzelKlick then begin - if _watte then - writeln(befehlsTabelle[bw].cmd+' '+befehlsTabelle[bw].params) - else begin - p:=tProcess.create(nil); - p.executable:=befehlsTabelle[bw].cmd; - output:=befehlsTabelle[bw].params; - while output<>'' do - p.parameters.add(erstesArgument(output)); - p.options:=p.options + [poWaitOnExit]; - p.execute; - p.free; - end; - end; - exit; - end; - - writeln('roh: '+hexDump(@lw,sizeof(lw))); + if _watte then + writeln(cmd+' '+params) + else begin + p:=tProcess.create(nil); + p.executable:=cmd; + while params<>'' do + p.parameters.add(erstesArgument(params)); + p.options:=p.options + [poWaitOnExit]; + p.execute; + p.free; + end; end; function tIRDecoder.zeileVerarbeitet: boolean; @@ -216,12 +211,53 @@ end; function tIRDecoder.befehlVerarbeitet: boolean; var - i: longword; + i,cnt: longword; + cmd,params,s,t: string; begin result:=eingabeLaenge>0; if not result then exit; - befehlAusfuehren(eingabePuffer[0]); + cmd:=befehlsTabelle[eingabePuffer[0]].cmd; + params:=befehlsTabelle[eingabePuffer[0]].params; + + if befehlsTabelle[eingabePuffer[0]].kollapsArt<>kaIgnorieren then begin + cnt:=1; + while cnt'' do + params:=trim(params+' '+zusammenFassen(erstesArgument(s),erstesArgument(t))); + end; + kaNurEinMal: ; + else + raise exception.create('Weder Toggle, noch Addieren, noch NurEinMal, noch Ignorieren! Das ist komisch ...'); + end{of case}; + for i:=cnt+1 to eingabeLaenge-1 do + eingabePuffer[i-1]:=eingabePuffer[i]; + dec(eingabeLaenge); + continue; + end; + if befehlsTabelle[eingabePuffer[cnt]].kollapsTrenner then + break; + inc(cnt); + end; + end; + + befehlAusfuehren(cmd,params); for i:=1 to eingabeLaenge-1 do eingabePuffer[i-1]:=eingabePuffer[i]; dec(eingabeLaenge); -- cgit v1.2.3-70-g09d2