summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErich Eckner <git@eckner.net>2015-10-25 21:05:15 +0100
committerErich Eckner <git@eckner.net>2015-10-26 13:16:05 +0100
commitb13af1dc559902ac4f3349b6e04bc1fc5269769d (patch)
tree77f9a66591a0879ab416b43949c785c96a5250f1
parent970f3265a66a333950880e0e8a14e91ca2e4c7da (diff)
downloadunits-b13af1dc559902ac4f3349b6e04bc1fc5269769d.tar.xz
jetzt wirklich entprellt
-rw-r--r--irdecoderunit.pas102
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