summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--irdecoderunit.pas112
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);