summaryrefslogtreecommitdiff
path: root/irdecoderunit.pas
blob: dcbc5fefb4364fe490fdd4990852de10f7f1ab1a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
unit irdecoderunit;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, lesethreadunit, lowlevelunit;

type
  tIRDecoder = class
  private
    ttySLeser:      tLeseProzess;
    letztesZeichen: array[boolean] of longword;
    letzterEmpf:    boolean;
    procedure init;
    procedure verarbeite(lw: longword);
    function einzelKlickZeichen(lw: longword): boolean;
    procedure tastenDruckAnhaengen(lw: longword);
  public
    constructor create(inputName: string);
    destructor destroy; override;
    function zeileVerarbeitet: boolean;
  end;

implementation

// tIRDecoder ******************************************************************

constructor tIRDecoder.create(inputName: string);
begin
  inherited create;
  ttySLeser:=tLeseProzess.create(inputName,1);
  init;
end;

destructor tIRDecoder.destroy;
begin
  ttySLeser.free;
  inherited destroy;
end;

procedure tIRDecoder.init;
begin
  letztesZeichen[false]:=$ffffffff;
  letztesZeichen[true]:=$ffffffff;
  letzterEmpf:=false;
end;

procedure tIRDecoder.verarbeite(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));

  letztesZeichen[empf]:=lw;
  letzterEmpf:=empf;
end;

function tIRDecoder.einzelKlickZeichen(lw: longword): boolean;
begin
  result:=true;
end;

procedure tIRDecoder.tastenDruckAnhaengen(lw: longword);
begin
  writeln('> '+hexDump(@lw,sizeof(lw)));
end;

function tIRDecoder.zeileVerarbeitet: boolean;
var
  s:      string;
  inByte: longword;
begin
  result:=ttySLeser.gibZeile(s);
  if not result then exit;

  if s='Ha!' then begin // Startzeichen
    writeln('Empfänger hat sich gemeldet!');
    init;
    exit;
  end;

  if (length(s)=3) and base64Decode(s,inByte) then begin
    if not base64ToBin(s) then
      raise exception.create('interner Fehler: base64ToBin meckert, base64Decode aber nicht!');

    writeln('Bits: '+s+' '+hexDump(@inByte,sizeof(inByte)));
    verarbeite(inByte);
    exit;
  end;

  writeln('Warnung: Kenne Kommando '''+s+''' nicht - komisch formatiert!');
end;

end.