summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--irdecoderunit.pas60
1 files changed, 47 insertions, 13 deletions
diff --git a/irdecoderunit.pas b/irdecoderunit.pas
index dcbc5fe..ac46bcb 100644
--- a/irdecoderunit.pas
+++ b/irdecoderunit.pas
@@ -13,24 +13,37 @@ type
ttySLeser: tLeseProzess;
letztesZeichen: array[boolean] of longword;
letzterEmpf: boolean;
+ eingabePuffer: array of longword;
+ eingabeLaenge: longword;
procedure init;
- procedure verarbeite(lw: longword);
- function einzelKlickZeichen(lw: longword): boolean;
procedure tastenDruckAnhaengen(lw: longword);
+ procedure befehlAusfuehren(lw: longword);
public
constructor create(inputName: string);
destructor destroy; override;
function zeileVerarbeitet: boolean;
+ function befehlVerarbeitet: boolean;
+ end;
+
+ tBefehl = record
+ zeichen: longword;
+ einzelKlick: boolean;
+ toDo: string;
end;
implementation
+const zeichenTabelle: array[0..0] of tBefehl = (
+ (zeichen: $e0000000; einzelKlick: true; toDo: 'Hallo!')
+ );
+
// tIRDecoder ******************************************************************
constructor tIRDecoder.create(inputName: string);
begin
inherited create;
ttySLeser:=tLeseProzess.create(inputName,1);
+ fillchar(eingabePuffer,sizeof(eingabePuffer),#0);
init;
end;
@@ -45,30 +58,38 @@ begin
letztesZeichen[false]:=$ffffffff;
letztesZeichen[true]:=$ffffffff;
letzterEmpf:=false;
+ setlength(eingabePuffer,0);
+ eingabeLaenge:=0;
end;
-procedure tIRDecoder.verarbeite(lw: longword);
+procedure tIRDecoder.tastenDruckAnhaengen(lw: longword);
var
empf: boolean;
begin
empf:=odd(lw shr 1);
lw:=((lw shr 1) and not 1) or byte(odd(lw));
- if (lw<>letztesZeichen[letzterEmpf]) or not einzelKlickZeichen(lw) then
- tastenDruckAnhaengen(mirrorBits(lw and not $08));
+ if (lw<>letztesZeichen[letzterEmpf]) or (empf=letzterEmpf) then begin
+ if eingabeLaenge>=length(eingabePuffer) then
+ setlength(eingabePuffer,eingabeLaenge+1024);
+ eingabePuffer[eingabeLaenge]:=lw;
+ inc(eingabeLaenge);
+ end;
letztesZeichen[empf]:=lw;
letzterEmpf:=empf;
end;
-function tIRDecoder.einzelKlickZeichen(lw: longword): boolean;
-begin
- result:=true;
-end;
-
-procedure tIRDecoder.tastenDruckAnhaengen(lw: longword);
+procedure tIRDecoder.befehlAusfuehren(lw: longword);
+var
+ i: longword;
begin
- writeln('> '+hexDump(@lw,sizeof(lw)));
+ for i:=0 to length(zeichenTabelle)-1 do
+ if zeichenTabelle[i].zeichen=lw then begin
+ writeln('> '+zeichenTabelle[i].toDo);
+ exit;
+ end;
+ writeln('roh: '+hexDump(@lw,sizeof(lw)));
end;
function tIRDecoder.zeileVerarbeitet: boolean;
@@ -90,12 +111,25 @@ begin
raise exception.create('interner Fehler: base64ToBin meckert, base64Decode aber nicht!');
writeln('Bits: '+s+' '+hexDump(@inByte,sizeof(inByte)));
- verarbeite(inByte);
+ tastenDruckAnhaengen(inByte);
exit;
end;
writeln('Warnung: Kenne Kommando '''+s+''' nicht - komisch formatiert!');
end;
+function tIRDecoder.befehlVerarbeitet: boolean;
+var
+ i: longword;
+begin
+ result:=eingabeLaenge>0;
+ if not result then exit;
+
+ befehlAusfuehren(eingabePuffer[0]);
+ for i:=1 to eingabeLaenge-1 do
+ eingabePuffer[i-1]:=eingabePuffer[i];
+ dec(eingabeLaenge);
+end;
+
end.