unit irdecoderunit; {$mode objfpc}{$H+} interface uses Classes, SysUtils, lesethreadunit, lowlevelunit, process; type tBefehlsWort = ( bwNull,bwEins,bwZwei,bwDrei,bwVier,bwFuenf,bwSechs,bwSieben,bwAcht,bwNeun,bwZwoelf, bwAnAus,bwPunkt,bwPfeilInKasten, bwNaechstes,bwVorheriges,bwZurueck,bwVor,bwPause,bwLos,bwStop, bwProgrammPlus,bwProgrammMinus,bwStumm,bwLauter,bwLeiser, bwKontrastMinus,bwKontrastPlus,bwHelligkeitMinus,bwHelligkeitPlus, bwRot,bwGruen,bwGelb,bwBlau); tIRDecoder = class private ttySLeser: tLeseProzess; letztesZeichen: array[boolean] of longword; letzterEmpf: boolean; eingabePuffer: array of longword; eingabeLaenge, letzterBefehl: longword; procedure init; procedure tastenDruckAnhaengen(lw: longword); procedure befehlAusfuehren(lw: longword); public constructor create(inputName: string); destructor destroy; override; function zeileVerarbeitet: boolean; function befehlVerarbeitet: boolean; function gibAlleBefehle: string; end; tBefehl = record einzelKlick: boolean; toDo: string; end; implementation const zeichenTabelle: array[tBefehlsWort] of longword = ( $0007,$4006,$2007,$6006,$1007,$5006,$3007,$7006,$0807,$4806,$0a07, $1807,$1a07,$7806, $2a07,$3a07,$2807,$6806,$3807,$6a06,$4a06, $4e06,$0e07,$5806,$0407,$4406, $5406,$1407,$6406,$2407, $4c06,$7406,$6c06,$1207 ); const befehlsTabelle: array[tBefehlsWort] of tBefehl = ( (einzelKlick: true; toDo: 'echo 0'), // 0/10 (einzelKlick: true; toDo: 'echo 1'), // 1 (einzelKlick: true; toDo: 'echo 2'), // 2 (einzelKlick: true; toDo: 'echo 3'), // 3 (einzelKlick: true; toDo: 'echo 4'), // 4 (einzelKlick: true; toDo: 'echo 5'), // 5 (einzelKlick: true; toDo: 'echo 6'), // 6 (einzelKlick: true; toDo: 'echo 7'), // 7 (einzelKlick: true; toDo: 'echo 8'), // 8 (einzelKlick: true; toDo: 'echo 9'), // 9 (einzelKlick: true; toDo: 'echo 2/12'), // 2-/12 (einzelKlick: true; toDo: 'screen -d -m /usr/bin/shutdownasap'), // Power (einzelKlick: true; toDo: 'mocp -o s'), // Punkt (einzelKlick: true; toDo: 'mocp -u s'), // PfeilInKasten (einzelKlick: true; toDo: 'mocp -f'), // |> (einzelKlick: true; toDo: 'mocp -r'), // <| (einzelKlick: true; toDo: 'mocp -k -5'), // << (einzelKlick: true; toDo: 'mocp -k +5'), // >> (einzelKlick: true; toDo: 'mocp -G'), // || (einzelKlick: true; toDo: 'mocp -p'), // > (einzelKlick: true; toDo: 'mocp -s'), // [] (einzelKlick: true; toDo: 'playlist +'), // P+ (einzelKlick: true; toDo: 'playlist -'), // P- (einzelKlick: true; toDo: 'stumm -t'), // Stumm (einzelKlick: false; toDo: 'lautstaerke +1'), // L+ (einzelKlick: false; toDo: 'lautstaerke -1'), // L- (einzelKlick: false; toDo: 'lautstaerke -5'), // K- (einzelKlick: false; toDo: 'lautstaerke +5'), // K+ (einzelKlick: false; toDo: 'lautstaerke -25'), // H- (einzelKlick: false; toDo: 'lautstaerke +25'), // H+ (einzelKlick: true; toDo: 'playlist -r'), // rot (einzelKlick: true; toDo: 'echo gruen'), // gruen (einzelKlick: true; toDo: 'echo gelb'), // gelb (einzelKlick: true; toDo: 'echo blau') // blau ); // tIRDecoder ****************************************************************** constructor tIRDecoder.create(inputName: string); begin inherited create; ttySLeser:=tLeseProzess.create(inputName,1); fillchar(eingabePuffer,sizeof(eingabePuffer),#0); init; end; destructor tIRDecoder.destroy; begin ttySLeser.free; inherited destroy; end; procedure tIRDecoder.init; begin letztesZeichen[false]:=$ffffffff; letztesZeichen[true]:=$ffffffff; letzterEmpf:=false; letzterBefehl:=$ffffffff; setlength(eingabePuffer,0); eingabeLaenge:=0; end; 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 (empf=letzterEmpf) or empf then begin if eingabeLaenge>=length(eingabePuffer) then setlength(eingabePuffer,eingabeLaenge+1024); eingabePuffer[eingabeLaenge]:=lw; inc(eingabeLaenge); end; letztesZeichen[empf]:=lw; letzterEmpf:=empf; end; procedure tIRDecoder.befehlAusfuehren(lw: longword); var neu: boolean; bw: tBefehlsWort; output: string; p: tProcess; begin neu:=lw<>letzterBefehl; letzterBefehl:=lw; lw:=lw and not $08; for bw:=low(tBefehlsWort) to high(tBefehlsWort) do if zeichenTabelle[bw]=lw then begin if neu or not befehlsTabelle[bw].einzelKlick then begin output:=befehlsTabelle[bw].toDo; p:=tProcess.create(nil); p.executable:=copy(output,1,pos(' ',output+' ')-1); delete(output,1,length(p.executable)+1); while (output)<>'' do begin p.parameters.add(copy(output,1,pos(' ',output+' ')-1)); delete(output,1,length(p.parameters[p.parameters.count-1])+1); end; p.options:=p.options + [poWaitOnExit]; p.execute; p.free; end; exit; end; writeln('roh: '+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 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; function tIRDecoder.gibAlleBefehle: string; var bw: tBefehlsWort; lw: longword; b1,b2: boolean; begin result:=''; for bw:=low(tBefehlsWort) to high(tBefehlsWort) do begin lw:=zeichenTabelle[bw]; lw:=((lw and not 1) shl 1) or byte(odd(lw)); for b1:=false to true do for b2:=false to true do result:=result+base64Encode(lw or (byte(b1) shl 1) or (byte(b2) shl 4),3)+#10; end; end; end.