Ansteuerung des OnAirScreen

Das sieht soweit schon mal wirklich gut aus und funktioniert:

const
  iMax = 5;                                        // Hier die maximale Senderanzahl einsetzen
  IP = '192.168.51.103';                           // <-- IP-Adresse
  PORT = '3310';                                   // <-- Port
  PATH = 'C:\ProgramData\mAirList\6.1\sfk174.exe'; // <-- Pfad
  
var
  EncoderCount, i: integer;
  EncoderState: array[0 .. iMax] of integer;  

procedure PostOnAirScreen(Befehl: string);
begin
  ShellExecuteHidden (PATH, 'udpsend ' + IP + Chr(32) + PORT + Chr(32) + Chr(34) + Befehl + Chr(34));
  //ShellExecute (PATH, 'udpsend ' + IP + Chr(32) + PORT + Chr(32) + Chr(34) + Befehl + Chr(34));
end;

procedure OnLoad;
begin
  // Eigentlich muss das nicht mal bei jedem Ladevorgang neu passieren aber so sind wir sicher, dass da keiner was verfummelt hat 
  // und man kann relativ komfortabel die Konfiguration anpassen ohne dass man an die eigentliche Anzeige ran muss
  PostOnAirScreen('CONF:LED2:autoflash=True'); // Diese Anzeige soll blinken, blinkede Anzeigen sehen immer wichtig aus.
  PostOnAirScreen('CONF:LED2:text=EOF'); // Auf dem Button soll EOF stehen.
  PostOnAirScreen('CONF:CONF:APPLY=TRUE'); 
  EnableTimer(1000);
end;

procedure OnTimer;
begin
  for i := 0 to iMax-1 do
    begin
      if (Encoder.GetConnections.GetItem(i).GetState = ecsConnected) then
        EncoderState[i] := 1
      else 
        EncoderState[i] := 0;
    end;
  for i := 0 to iMax-1 do
    begin
      EncoderCount := 0;
      EncoderCount := EncoderCount + EncoderState[i];
    end;
  if EncoderCount = 0 then begin
    PostOnAirScreen('AIR4:OFF');
    PostOnAirScreen('AIR4:RESET');
	end
  else
PostOnAirScreen('AIR4:ON');
end; 


procedure OnOnAir;
begin
  PostOnAirScreen('LED1:ON');
end;

procedure OnOffAir;
begin
  PostOnAirScreen('LED1:OFF');
end;

procedure OnPlayerEOFWarning(PlaylistIndex: integer; PlayerIndex: integer);
begin
  PostOnAirScreen('LED2:ON');
end;

procedure OnPlayerStop(PlaylistIndex: integer; PlayerIndex: integer; Duration: TTimeValue; Item: IPlaylistItem);
begin
  PostOnAirScreen('LED2:OFF');
end;

procedure OnShutdown; // Sollte den Rechner mit den OnAirScreen herunterfahren, funktioniert bisher aber nicht.
begin
  PostOnAirScreen('CMD:SHUTDOWN');
end;


begin
end.

Ein paar kleine Schreibfehler aber nicht was derjenige der Softwarefehler lieber mit dem Lötkolben löst, nicht beheben konnte :wink:
Da wo AIR4:OFF steht müsste ich eigentlich einen 2. Befehl absetzen AIR4:REST um den Timer wieder auf null zu stellen, das habe ich dann nicht hin bekommen.
In der PostOnAirScreen Prozedur war das absetzen der Befehle doppelt, da weiß ich nicht genau, wo das her kam, ich hatte vorher den Befehl einfach noch mal ins Log geschrieben?
Habe ich hier mal auskommentiert und auch gleich noch zum ShellexecuteHidden gemacht, dann ploppen keine CMD Fenster mehr auf, die auch noch den Fokus haben.

Jetzt muss ich nur noch ein Gamepad Kommandoe hier rein bekommen, was mir den Talk-Timer startet und stopt. Ich könnte ein Bildschirmobjekt schalter damit triggern und ein Script starten, was irgendwas in runtime setzt, geht das irgnedwie direkt? Kann ich einer Fernsteuerung direkt ein Script zuordnen?
Ah, moment, jetzt wo ich hier schreibe: Irgendwas war doch da mal mit eigene Befehle bauen über Hintergrundscripte. Ich bemühe mal die Forensuche.

EDIT: Ich weiß nicht, wie man hier Text durch streicht. Den doppelten befehl habe ich hinbekommen. Oben geändert.

EDIT2: Ich habe versucht, mit diesem Block unterhalb der OnLoad, einen befehl abzusetzen und habe das gloaben Hotkeys zugewiesen, klappt aber nicht. :thinking:

procedure OnExecuteCommand(Command: string);
begin
  if Command = 'MIC OPEN' then begin
    PostOnAirScreen('AIR1:ON');
  end
  else if Command = 'MIC CLOSE' then begin
  PostOnAirScreen('AIR1:OFF');
  end;
end;