summaryrefslogtreecommitdiff
path: root/irdecoderunit.pas
diff options
context:
space:
mode:
authorErich Eckner <git@eckner.net>2015-10-22 12:24:54 +0200
committerErich Eckner <git@eckner.net>2015-10-22 12:24:54 +0200
commitec0952e17b12fd5081e8783264b0b3c6e34a2400 (patch)
treebbd9b00a951ed15406e99635dd6c6b270e05771c /irdecoderunit.pas
parentcbbe8d66cdd4cd8d59e20bb162a73e39bc0efe3e (diff)
downloadunits-ec0952e17b12fd5081e8783264b0b3c6e34a2400.tar.xz
Konfiguration wird jetzt aus Datei geladen
Diffstat (limited to 'irdecoderunit.pas')
-rw-r--r--irdecoderunit.pas168
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