diff options
-rw-r--r-- | irdecoderunit.pas | 112 |
1 files changed, 74 insertions, 38 deletions
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<eingabeLaenge do begin + if (befehlsTabelle[eingabePuffer[0]].kollapsArt=befehlsTabelle[eingabePuffer[cnt]].kollapsArt) and + (befehlsTabelle[eingabePuffer[0]].cmd=befehlsTabelle[eingabePuffer[cnt]].cmd) then begin + case befehlsTabelle[eingabePuffer[0]].kollapsArt of + kaToggle: begin + for i:=1 to cnt-1 do + eingabePuffer[i-1]:=eingabePuffer[i]; + for i:=cnt+1 to eingabeLaenge-1 do + eingabePuffer[i-2]:=eingabePuffer[i]; + dec(eingabeLaenge,2); + result:=befehlVerarbeitet; + exit; + end; + kaAddieren: begin + s:=params; + t:=befehlsTabelle[eingabePuffer[cnt]].params; + params:=''; + while s<>'' 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); |