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.
|