diff options
author | Erich Eckner <git@eckner.net> | 2015-10-22 12:24:54 +0200 |
---|---|---|
committer | Erich Eckner <git@eckner.net> | 2015-10-22 12:24:54 +0200 |
commit | ec0952e17b12fd5081e8783264b0b3c6e34a2400 (patch) | |
tree | bbd9b00a951ed15406e99635dd6c6b270e05771c | |
parent | cbbe8d66cdd4cd8d59e20bb162a73e39bc0efe3e (diff) | |
download | units-ec0952e17b12fd5081e8783264b0b3c6e34a2400.tar.xz |
Konfiguration wird jetzt aus Datei geladen
-rw-r--r-- | irdecoderunit.pas | 168 |
1 files changed, 98 insertions, 70 deletions
diff --git a/irdecoderunit.pas b/irdecoderunit.pas index da9a424..8e50998 100644 --- a/irdecoderunit.pas +++ b/irdecoderunit.pas @@ -5,16 +5,14 @@ unit irdecoderunit; interface uses - Classes, SysUtils, lesethreadunit, lowlevelunit, process; + Classes, SysUtils, lesethreadunit, lowlevelunit, process, myStringListUnit; 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); + tKollapsArt = ( + kaIgnorieren, // kann nicht kollabieren + kaToggle, // 2x Befehl = 0x Befehl + kaAddieren, // Parameter sind zu addieren + kaNurEinMal); // 2x Befehl = 1x Befehl tIRDecoder = class private @@ -24,11 +22,15 @@ type eingabePuffer: array of longword; eingabeLaenge, letzterBefehl: longword; + _watte: boolean; procedure init; procedure tastenDruckAnhaengen(lw: longword); procedure befehlAusfuehren(lw: longword); public - constructor create(inputName: string); + constructor create(inputName: string); overload; + constructor create(inputName, konfigName: string); overload; + constructor create(inputName: string; watte: boolean); overload; + constructor create(inputName, konfigName: string; watte: boolean); overload; destructor destroy; override; function zeileVerarbeitet: boolean; function befehlVerarbeitet: boolean; @@ -36,62 +38,88 @@ type end; tBefehl = record - einzelKlick: boolean; - toDo: string; + einzelKlick, // gedrückt gehaltene Taste = Befehl mehrmals? + kollapsTrenner: boolean; // Darf über diesen Befehl hinweg kollabiert werden? + cmd,params: string; // Befehl + Parameter + kollapsArt: tKollapsArt; // Wie kollabiert dieser Befehl? 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 - ); +var + zeichenTabelle: array of longword; + befehlsTabelle: array of tBefehl; // tIRDecoder ****************************************************************** constructor tIRDecoder.create(inputName: string); begin + create(inputName,false); +end; + +constructor tIRDecoder.create(inputName: string; watte: boolean); +begin + create(inputName,'/dev/null',watte); +end; + +constructor tIRDecoder.create(inputName, konfigName: string); +begin + create(inputName,konfigName,false); +end; + +constructor tIRDecoder.create(inputName, konfigName: string; watte: boolean); +var + konfigDatei: tMyStringList; + zeile,taste: string; +begin inherited create; + if (length(zeichenTabelle)=0) or (length(befehlsTabelle)=0) then begin + konfigDatei:=tMyStringList.create; + konfigDatei.loadFromFile(konfigName); + if not konfigDatei.unfoldMacros then + raise exception.create('Fehler beim Entfalten der Makros in '''+konfigName+'''!'); + while konfigDatei.readln(zeile) do begin + setlength(zeichenTabelle,length(zeichenTabelle)+1); + setlength(befehlsTabelle,length(befehlsTabelle)+1); + if copy(zeile,length(zeile),1)<>':' then + raise exception.create('Die erste Zeile einer Befehlsdefinition muss mit einem : enden, '''+zeile+''' tut das nicht!'); + delete(zeile,length(zeile),1); + taste:=trim(zeile); + zeichenTabelle[length(zeichenTabelle)-1]:=strtoint(taste); + if not konfigDatei.readln(zeile) then + raise exception.create('Unerwartetes Dateiende in '''+konfigName+''' (Taste '+taste+')!'); + befehlsTabelle[length(befehlsTabelle)-1].einzelKlick:=not startetMit('!',zeile); + if zeile<>'einzelKlick' then + raise exception.create('Syntaxfehler: erste Option muss ''[!] einzelKlick'' sein (Taste '+taste+')!'); + if not konfigDatei.readln(zeile) then + raise exception.create('Unerwartetes Dateiende in '''+konfigName+''' (Taste '+taste+')!'); + befehlsTabelle[length(befehlsTabelle)-1].kollapsTrenner:=not startetMit('!',zeile); + if zeile<>'kollapsTrenner' then + raise exception.create('Syntaxfehler: zweite Option muss ''[!] kollapsTrenner'' sein (Taste '+taste+')!'); + if not konfigDatei.readln(zeile) then + raise exception.create('Unerwartetes Dateiende in '''+konfigName+''' (Taste '+taste+')!'); + if not startetMit('kollapsArt:',zeile) then + raise exception.create('Syntaxfehler: dritte Option muss ''kollapsArt: ...'' sein, '''+zeile+''' ist das nicht (Taste '+taste+')!'); + if zeile='ignorieren' then + befehlsTabelle[length(befehlsTabelle)-1].kollapsArt:=kaIgnorieren + else if zeile='toggle' then + befehlsTabelle[length(befehlsTabelle)-1].kollapsArt:=kaToggle + else if zeile='addieren' then + befehlsTabelle[length(befehlsTabelle)-1].kollapsArt:=kaAddieren + else if zeile='nurEinMal' then + befehlsTabelle[length(befehlsTabelle)-1].kollapsArt:=kaNurEinMal + else + raise exception.create('Unbekannte kollapsArt '''+zeile+''' (Taste '+taste+')!'); + if not konfigDatei.readln(zeile) then + raise exception.create('Unerwartetes Dateiende in '''+konfigName+''' (Taste '+taste+')!'); + befehlsTabelle[length(befehlsTabelle)-1].cmd:=erstesArgument(zeile); + befehlsTabelle[length(befehlsTabelle)-1].params:=zeile; + end; + konfigDatei.free; + end; + + _watte:=watte; + ttySLeser:=tLeseProzess.create(inputName,1); fillchar(eingabePuffer,sizeof(eingabePuffer),#0); init; @@ -134,7 +162,7 @@ end; procedure tIRDecoder.befehlAusfuehren(lw: longword); var neu: boolean; - bw: tBefehlsWort; + bw: longword; output: string; p: tProcess; begin @@ -142,20 +170,21 @@ begin letzterBefehl:=lw; lw:=lw and not $08; - for bw:=low(tBefehlsWort) to high(tBefehlsWort) do + for bw:=0 to length(befehlsTabelle)-1 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); + if _watte then + writeln(befehlsTabelle[bw].cmd+' '+befehlsTabelle[bw].params) + else begin + p:=tProcess.create(nil); + p.executable:=befehlsTabelle[bw].cmd; + output:=befehlsTabelle[bw].params; + while output<>'' do + p.parameters.add(erstesArgument(output)); + p.options:=p.options + [poWaitOnExit]; + p.execute; + p.free; end; - p.options:=p.options + [poWaitOnExit]; - p.execute; - p.free; end; exit; end; @@ -200,12 +229,11 @@ end; function tIRDecoder.gibAlleBefehle: string; var - bw: tBefehlsWort; - lw: longword; + bw,lw: longword; b1,b2: boolean; begin result:=''; - for bw:=low(tBefehlsWort) to high(tBefehlsWort) do begin + for bw:=0 to length(zeichenTabelle)-1 do begin lw:=zeichenTabelle[bw]; lw:=((lw and not 1) shl 1) or byte(odd(lw)); for b1:=false to true do |