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); lw:=lw shr 1; if (lw<>letztesZeichen[letzterEmpf]) or not einzelKlickZeichen(lw) then tastenDruckAnhaengen(lw); 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.