"Altes" ONAIR-Script funktioniert nur noch teilweise

Danke! Wald, Bäume und so… Hätte ich eigentlich auch selber drauf kommen müssen.

Da hätten wir dann schon mal sowas:

{
Zwischen die geschweiften Klammern kann der Spickzettel hin, z.B.:

1: SWR, 2: HR, 3: RIAS.
4: NDR, 5: RB; 6: ORF
usw.
}

const
  iMax = 4;                // Hier die maximale Senderanzahl minus 1 einsetzen

var
  i: integer;

procedure OnLoad;
  begin
    EnableTimer(100);
  end;

procedure OnTimer;
  begin
    for i := 0 to iMax do
      begin
	    if (Encoder.GetConnections.GetItem(i).GetEnabled = true) then begin
          if (Encoder.GetConnections.GetItem(i).GetState = ecsConnected) then begin
            ExecuteCommand('ENCODER'+ IntToStr(i) +' TEXT ON AIR');
            ExecuteCommand('ENCODER'+ IntToStr(i) +' BACKGROUNDCOLOR #FF0000');
            ExecuteCommand('ENCODER'+ IntToStr(i) +' FONTCOLOR #FFFFFF');
            end	
          else if (Encoder.GetConnections.GetItem(i).GetState = ecsConnecting) then begin
	        ExecuteCommand('ENCODER'+ IntToStr(i) +' TEXT !OFF AIR!');
            ExecuteCommand('ENCODER'+ IntToStr(i) +' FONTCOLOR #FFFFFF');
            ExecuteCommand('ENCODER'+ IntToStr(i) +' BACKGROUNDCOLOR #FF0000');
            Sleep(1000);
            end  
          else begin
	        ExecuteCommand('ENCODER'+ IntToStr(i) +' BACKGROUNDCOLOR #00FF00');
	        ExecuteCommand('ENCODER'+ IntToStr(i) +' FONTCOLOR #000000');
	        ExecuteCommand('ENCODER'+ IntToStr(i) +' TEXT READY!');
	        end
	      end
      else begin
	    ExecuteCommand('ENCODER'+ IntToStr(i) +' BACKGROUNDCOLOR #F0F0F0');
	    ExecuteCommand('ENCODER'+ IntToStr(i) +' FONTCOLOR #000000');
	    ExecuteCommand('ENCODER'+ IntToStr(i) +' TEXT AUS');
	    end;
	  end;
	end;  
	
  

begin
end.

Man bemerke, ich habe 5 Textobjekte mit den Namen ENCODER0 bis ENCODER4 anlgelgt, nicht mehr ONAIRPRG, wie im Beispiel von @Myka.

EDIT: Sieht dann erst mal so aus:
grafik

Super! Allerdings: Auch hier, beim drittletzten end, fehlt das Semikolon. Immer vor den else kommt keins.

Pingelige Grüße

TSD

Korrigiert, danke. Wenn ich jetzt noch die Namen der jeweiligen Encoder lesen könnte, dann könnte man die mit dazu schreiben.
Gibt es eigentlich eine elegantere Lösung ausser eine Zeitschleife zu nutzen und immer wieder den Status zu pollen?

OnEcoderStatusChange, das wäre was!

Anregende Grüße

TSD

Die Frage kann ich mir warscheilich selber beantworten.
Ich habe noch mal etwas im Forum gewühlt, diese Suchfunktion ist wirklich klasse und extrem hilfreich.

Ich vermute also mal das Procdure onEncoderIRGENDWAS noch nicht implementiert wurde.

Kommen wir also zurück zur Benennung der Streams.
Dazu stehen doch ein paar Dinge in der Scripting Help.

Ich bin mir allerdings gerade nicht sicher, muss ich jetzt anfangen, zwischen verschiedenen Encoder Typen zu unterscheiden? GetCustomCaption, wäre schon mal etwas, was scheinbar in die richtige Richtung geht.

Alternativ könnte man ja auch erstmal ein Zweidimensionales Array mit einer Namenszuordnung zu Encoder Nummer.
Ich habe da mal was aus Deinem Tutorial abgeleitet @Tondose

{
Zwischen die geschweiften Klammern kann der Spickzettel hin, z.B.:

1: SWR, 2: HR, 3: RIAS.
4: NDR, 5: RB; 6: ORF
usw.
}

const
  iMax = 4;                // Hier die maximale Senderanzahl minus 1 einsetzen

var
  i: integer;
  EncoderName: array[0 .. iMax] of string;

procedure OnLoad;
  begin
    EnableTimer(100);
  end;

procedure OnTimer;
  begin
  	EncoderName[0] := 'SWR';
	EncoderName[1] := 'HR';
	EncoderName[2] := 'RIAS';
	EncoderName[3] := 'NDR';
	EncoderName[4] := 'Aircheck';

    for i := 0 to iMax do
      begin
         if (Encoder.GetConnections.GetItem(i).GetEnabled = true) then begin
          if (Encoder.GetConnections.GetItem(i).GetState = ecsConnected) then begin
            ExecuteCommand('ENCODER'+ IntToStr(i) +' TEXT '+ EncoderName[i] +' ON AIR');
            ExecuteCommand('ENCODER'+ IntToStr(i) +' BACKGROUNDCOLOR #FF0000');
            ExecuteCommand('ENCODER'+ IntToStr(i) +' FONTCOLOR #FFFFFF');
            end	
          else if (Encoder.GetConnections.GetItem(i).GetState = ecsConnecting) then begin
            ExecuteCommand('ENCODER'+ IntToStr(i) +' TEXT '+ EncoderName[i] +' !OFF AIR!');
            ExecuteCommand('ENCODER'+ IntToStr(i) +' FONTCOLOR #FFFFFF');
            ExecuteCommand('ENCODER'+ IntToStr(i) +' BACKGROUNDCOLOR #FF0000');
            Sleep(800);
            end  
          else begin
            ExecuteCommand('ENCODER'+ IntToStr(i) +' BACKGROUNDCOLOR #00FF00');
            ExecuteCommand('ENCODER'+ IntToStr(i) +' FONTCOLOR #000000');
            ExecuteCommand('ENCODER'+ IntToStr(i) +' TEXT '+ EncoderName[i] +' READY!');
            end
          end
      else begin
           ExecuteCommand('ENCODER'+ IntToStr(i) +' BACKGROUNDCOLOR #F0F0F0');
           ExecuteCommand('ENCODER'+ IntToStr(i) +' FONTCOLOR #848484');
           ExecuteCommand('ENCODER'+ IntToStr(i) +' TEXT '+ EncoderName[i] +' AUS');
           end
	  end;
	end;  
	
  

begin
end.

Ich fühle mich so weise …

Wegweisende Grüße

usw.


Nein, Blödsinn. Um mal wieder mit Wattebäuschchen zu schmeißen: Das Array ist tatsächlich eindimensional, aber sonst sieht der Code soweit brauchbar aus. @Torben kommt aber gewiß gleich mit der procedure-Keule und kloppt den Code nochmal zusammen. Etwa so:


const
  iMax = 4;                // Hier die maximale Senderanzahl minus 1 einsetzen

var
  i: integer;
  EncoderName: array[0 .. iMax] of string;

procedure OnLoad;
  begin
    EncoderName[0] := 'SWR';
    EncoderName[1] := 'HR';
    EncoderName[2] := 'RIAS';
    EncoderName[3] := 'NDR';
    EncoderName[4] := 'Aircheck';
    EnableTimer(100);
  end;

procedure SetEncoderButton(Index : integer; Name, Status, Farbe, Textfarbe : string);
  begin
    ExecuteCommand('ENCODER' + IntToStr(Index) + ' TEXT ' + Name + ' ' + Status);
    ExecuteCommand('ENCODER' + IntToStr(Index) + ' BACKGROUNDCOLOR ' + Farbe);
    ExecuteCommand('ENCODER' + IntToStr(Index) + ' FONTCOLOR ' + Textfarbe);
  end;

procedure OnTimer;
  begin

    for i := 0 to iMax do
      begin
        if (Encoder.GetConnections.GetItem(i).GetEnabled = true) then begin
          if (Encoder.GetConnections.GetItem(i).GetState = ecsConnected) then
            SetEncoderButton(i, EncoderName[i], 'ON AIR', '#FF0000', '#FFFFFF')
          else if (Encoder.GetConnections.GetItem(i).GetState = ecsConnecting) then begin
            SetEncoderButton(i, EncoderName[i], '!OFF AIR!', '#FFFFFF', '#FF0000');
            Sleep(800);
          end  
          else
            SetEncoderButton(i, EncoderName[i], 'READY!', '#000000', '#00FF00');
          end;
        end
        else 
          SetEncoderButton(i, EncoderName[i], 'AUS', '#F0F0F0', '#848484');
        end;
      end;

  end;  

begin
end.

Ungetestet, aus reinem Übermut entstanden! (Wahrscheinlich habe ich wieder irgendwo ein entscheidendes ; vergessen …) Die Zuordnung der Sendernamen habe ich in die OnLoad gepackt, die braucht man nicht alle Zehntelsekunde neu setzen. Den Spickzettelquatsch habe ich der Kürze halber mal weggelassen.

Kühne Grüße

TSD

Ich fand’ das auch nicht glücklich, war mir aber nicht ganz sicher ob die Definition, übergreifend funktioniert. Again what learned… :stuck_out_tongue:

Solange Du innerhalb des Skriptes bleibst, gelten die Variablen, die Du unter var definierst, für das gesamte Skript. Diese Variablen sind erstmal leer, undefiniert, und werden dann an anderer Stelle des Skripts, eben wenn OnLoad aufgerufen wird, initialisiert, d. h. mit Leben Inhalt versehen. (Sollen Werte nach außerhalb, also an andere Skripte, weitergegeben werden, so mußt Du SetRuntimeData verwenden.)

Deklarierte Grüße

TSD

Gerade gefunden – es geht noch einfacher aber so geht es nicht (siehe unten):

const
  iMax = 4;                // Hier die maximale Senderanzahl minus 1 einsetzen

  EncoderName : array[0 .. iMax] of string = ('SWR', 'HR', 'RIAS', 'NDR', 'Aircheck');
                           // Hier die Bezeichnungen der Reihe nach eintragen
var
  i: integer;

procedure OnLoad;
    EnableTimer(100);


procedure SetEncoderButton(Index : integer; Name, Status, Farbe, Textfarbe : string);
  begin

   // usw., Rest wie oben.


Gesparte Güße

TSD

Da bekomme ich eine Fehlermeldung:

Fehler beim Laden des Hintergrund-Scripts C:\ProgramData\mAirList\6.1\ON-AIR.mls: [Error] (12:15): is (‘=’) expected

Die Position 12:15 ist der Doppelpunkt hinter EncoderName
Und wenn ich das auf ein = ändere, wird 2 Zeichen Später, ein Syntax error daraus.

Oha! Ich habe es hieraus, und das sollte eigentlich stimmen. Hmm … (Kann mich im Moment aber nicht kümmern.)

Hungrige Grüße

TSD

Ich habe das hier gefunden. Da wird darüber geschrieben, dass man so eine Enumerated Array über eine for schleife befüllen soll.
Vielleicht ist die Scripting engine eher auf diesem (anscheinend etwas älteren) Level.

So könnte man doch den iMax als Konstante einsparen und einfach die Liste der Namen zählen und dann das Array bauen.

Das ist auch insoweit richtig, als daß es auf dieser Seite ausschließlich um Variablen-Arrays geht. Was ich vorgeschlagen hatte, ist ein Array mit Konstanten, die sich an und für sich schon bei der Deklaration befüllen lassen sollten, wie einfache Konstanten auch. Ich fürchte, hier muß @Torben nochmal einen Blick drauf werfen.

Satte Grüße

TSD

Könntest Du nochmal folgendes probieren?: Edit: Unnötig, so geht es auch nicht – siehe unten.

type
  TEncoderName: array[0 .. 4] of string;

const
  iMax = 4;                // Hier die maximale Senderanzahl minus 1 einsetzen

  EncoderName : TEncoderName = ('SWR', 'HR', 'RIAS', 'NDR', 'Aircheck');
                           // Hier die Bezeichnungen der Reihe nach eintragen
var
  i: integer;

procedure OnLoad;
    EnableTimer(100);

...

Ist auch von der von mir zitierten Seite, ein Beispiel tiefer.

Ungläubige Grüße

TSD

Also: Ich wurde investigativ tätig und habe aus „gewöhnlich gut unterrichteten Kreisen“ erfahren, daß dieser Befehl tatsächlich nicht funktioniert. Die Scripting-Engine ist Delphi zwar äußerst ähnlich, aber eben doch nicht so, daß alle Syntax eins zu eins abgebildet wird. Und dies ist wohl so ein Fall, der von nicht alles betroffen ist.

99%ige Grüße

TSD

Danke für die Info. Über die Geschichte mit dem Type, war ich dann auch noch gestolpert.

Das hatte ich eben auch immer noch im Hinterkopf.

Durch diesen Thread hier: Darstellung der Umlaute
Habe ich noch mal in der Scripting Help gesucht und nun endlich, die passende Abfrage gefunden, wie ich die selbst gesetzte Beschreibung lesen kann.
Weiterhin mit eingeflossen sind aus diesem Thread: Ansteuerung des OnAirScreen
Die RuntimeData zur Übergabe an ein weiteres Script, welches den OnAirScreen ansteuert.

Die Auskommentierte Zeile zeigt, wie man zusätzlich noch die Höreranzahl mit darstellen kann.

const
  iMax = 4;                // Hier die maximale Senderanzahl minus 1 einsetzen

var
  EncoderErrorCount,EncoderOldCount,EncoderCount, i: integer;
  EncoderName: array[0 .. iMax] of string;



procedure OnLoad;
  begin
    EnableTimer(800);
	EncoderOldCount := 0;
  end;

procedure OnTimer;
  begin
    EncoderOldCount := EncoderCount;
    EncoderCount := 0;
    EncoderErrorCount := 0;
    for i := 0 to iMax do
      begin
	     
         if (Encoder.GetConnections.GetItem(i).GetEnabled = true) then begin
          if (Encoder.GetConnections.GetItem(i).GetState = ecsConnected) then begin
            //ExecuteCommand('ENCODER'+ IntToStr(i) +' TEXT '+ Encoder.GetConnections.GetItem(i).GetCustomCaption +' ON AIR Hörer: '+ IntToStr(Encoder.GetConnections.GetItem(i).GetListeners));
            ExecuteCommand('ENCODER'+ IntToStr(i) +' TEXT '+ Encoder.GetConnections.GetItem(i).GetCustomCaption +' ON AIR');
            ExecuteCommand('ENCODER'+ IntToStr(i) +' BACKGROUNDCOLOR #FF0000');
            ExecuteCommand('ENCODER'+ IntToStr(i) +' FONTCOLOR #FFFFFF');
            EncoderCount := EncoderCount + 1;
            end	
          else if (Encoder.GetConnections.GetItem(i).GetState = ecsConnecting) then begin
            ExecuteCommand('ENCODER'+ IntToStr(i) +' TEXT '+ Encoder.GetConnections.GetItem(i).GetCustomCaption +' !OFF AIR!');
            ExecuteCommand('ENCODER'+ IntToStr(i) +' FONTCOLOR #FFFFFF');
            ExecuteCommand('ENCODER'+ IntToStr(i) +' BACKGROUNDCOLOR #FF0000');
            EncoderCount := EncoderCount + 1;
            EncoderErrorCount := EncoderErrorCount + 1;
            end  
          else begin
            ExecuteCommand('ENCODER'+ IntToStr(i) +' BACKGROUNDCOLOR #00FF00');
            ExecuteCommand('ENCODER'+ IntToStr(i) +' FONTCOLOR #000000');
            ExecuteCommand('ENCODER'+ IntToStr(i) +' TEXT '+ Encoder.GetConnections.GetItem(i).GetCustomCaption +' READY!');
            end
          end
      else begin
           ExecuteCommand('ENCODER'+ IntToStr(i) +' BACKGROUNDCOLOR #F0F0F0');
           ExecuteCommand('ENCODER'+ IntToStr(i) +' FONTCOLOR #848484');
           ExecuteCommand('ENCODER'+ IntToStr(i) +' TEXT '+ Encoder.GetConnections.GetItem(i).GetCustomCaption +' AUS');
           end;   
      	
	end;
	if EncoderCount = 0 then begin
      SetRuntimeData('EncoderStatus', 'false');
      end
      else begin
        SetRuntimeData('EncoderStatus', 'true');
    end;	
      if EncoderErrorCount = 0 then begin
      SetRuntimeData('EncoderError', 'WARN:');
      end
      else begin
        SetRuntimeData('EncoderError', 'WARN:Encoder Fehler!');
      end;	
end; 	    
  
	
  

begin
end.

Da ich abseits des Forums wieder gefragt wurde: Gibt es irgendeine Aussicht, diese Funktion einst gebaut zu bekommen? Ist sicher für viele interessant.

Nützliche Grüße

TSD

Moin!

Ich entstaube das mal, weil ich gerne eine weitere Funktion in dem Ur-Skript hätte - so denn machbar - und zwar, das der Butten anfängt, nervös zu blinken wenn die Verbindung abreisst. Ähnlich wie hier.

Ist das umsetzbar? Zur Verdeutlichung “mein” Original-Skript:

procedure OnLoad;
  begin
    EnableTimer(100);
  end;

procedure OnTimer;
  begin
    if (Encoder.GetConnections.GetItem(0).GetState = ecsConnected) then begin
      ExecuteCommand('ONAIRPRG TEXT ON AIR');
      ExecuteCommand('ONAIRPRG BACKGROUNDCOLOR #FF0000');
      ExecuteCommand('ONAIRPRG FONTCOLOR #FFFFFF');
      end	
    else if (Encoder.GetConnections.GetItem(0).GetState = ecsConnecting) then begin
      ExecuteCommand('ONAIRPRG TEXT !OFF AIR!');
      ExecuteCommand('ONAIRPRG FONTCOLOR #FFFFFF');
      ExecuteCommand('ONAIRPRG BACKGROUNDCOLOR #FF0000');
      Sleep(1000);
      end  
    else begin
      ExecuteCommand('ONAIRPRG BACKGROUNDCOLOR #00FF00');
      ExecuteCommand('ONAIRPRG FONTCOLOR #FFFFFF');
      ExecuteCommand('ONAIRPRG TEXT EDIT');
   end;
  end;

begin
end.

Ich sollte langsam mal anfangen, das Skripten selbst zu begreifen… :flushed:

Ich hab’s mal in den Sektor “Scripts” verschoben. :slightly_smiling_face:

1 Like