IOWarrior - Script für 10er Cartwall

So Leute langsam geht’s los und ich werde Euch wohl wieder ausgiebig beanspruchen. :wink:

Den Anfang macht ein Script für eine 10er Cartwall in Verbindung mit einem IOWarrior 40. Ich bin bis zu einem gewissen Punkt gekommen und ja ich weiß das geht an der einen oder anderen Stelle noch eleganter. :smiley:

Wo ich jetzt aber einen Blackout habe (fragt mich bitte nicht warum), ist die Start/Stop-procedure vermutlich raucht mir gerade nur der Schädel zu sehr und die Lösung ist mal wieder näher als ich denke. Aber vielleicht kann mir hier jemand bei der Start/Stop-procedure helfen?

  const
    PORTS = 40;
	PLAYERS = 10;
		
  var
    CwPorts: array [0..2, 0..9] of float;
	blinkflag: boolean;



// XXXXXXXXXXXXXXXXXXXX OnLoad XXXXXXXXXXXXXXXXXXXX
procedure OnLoad;
  var
    i, j: integer;
  begin
    CwPorts[0,0]=0.0; CwPorts[1,0]=1.2; CwPorts[2,0]=2.4;
	CwPorts[0,1]=0.1; CwPorts[1,1]=1.3; CwPorts[2,1]=2.5;
	CwPorts[0,2]=0.2; CwPorts[1,2]=1.4; CwPorts[2,2]=2.6;
	CwPorts[0,3]=0.3; CwPorts[1,3]=1.5; CwPorts[2,3]=2.7;
    CwPorts[0,4]=0.4; CwPorts[1,4]=1.6; CwPorts[2,4]=3.0;
    CwPorts[0,5]=0.5; CwPorts[1,5]=1.7; CwPorts[2,5]=3.1;
	CwPorts[0,6]=0.6; CwPorts[1,6]=2.0; CwPorts[2,6]=3.2;    
	CwPorts[0,7]=0.7; CwPorts[1,7]=2.1; CwPorts[2,7]=3.3;
	CwPorts[0,8]=1.0; CwPorts[1,8]=2.2; CwPorts[2,8]=3.4;
	CwPorts[0,9]=1.1; CwPorts[1,9]=2.3; CwPorts[2,9]=3.5;
	EnableTimer(300);
	blinkflag = true;
  end;



// XXXXXXXXXXXXXXXXXXXX OnTimer XXXXXXXXXXXXXXXXXXXX
procedure OnTimer;



// XXXXXXXXXXXXXXXXXXXX PlayerStart/Stop XXXXXXXXXXXXXXXXXXXX
procedure SetButton(PlayerIndex: integer; cTButtonState);
  var
  
  begin
  
  end;



// XXXXXXXXXXXXXXXXXXXX StateCahnge XXXXXXXXXXXXXXXXXXXX
procedure OnCartwallPlayerStateChange(PlayerIndex: integer; OldState: TPlayerState; NewState: TPlayerState);
  var
    i, j: integer;
  begin
	for j := 0 to 9 do begin
      if (PlayerIndex = [j]) and (NewState = psLoaded) then begin
        IOWarriorRemote(0).SetPort(CwPorts[1,j] = true);
	  end;
	  if (PlayerIndex = [j]) and (NewState = psEmpty) then begin
	    IOWarriorRemote(0).SetPort(CwPorts[1,j] = false);
	  end;
	end;
  end;



// XXXXXXXXXXXXXXXXXXXX OnStart XXXXXXXXXXXXXXXXXXXX
procedure OnCartwallPlayerStart(PlayerIndex: integer; Item: IAudioCartwallItem; PlaylistItem: IPlaylistItem);
  var
    i, j : integer;
  begin
    for j := 0 to 9 do begin
	  if (PlayerIndex = [j]) then begin
	    IOWarriorRemote(0).SetPort(CwPorts[1,j] = false);
	    IOWarriorRemote(0).SetPort(CwPorts[2,j] = true);
	  end;
	end;
end;



// XXXXXXXXXXXXXXXXXXXX OnStop XXXXXXXXXXXXXXXXXXXX
procedure OnCartwallPlayerStop(PlayerIndex: integer; Item: IAudioCartwallItem; PlaylistItem: IPlaylistItem; Duration: TTimeValue);
  var
    i, j : integer;
  begin
    for j := 0 to 9 do begin
	  if (PlayerIndex = [j]) then begin
	    IOWarriorRemote(0).SetPort(CwPorts[2,j] = false);
	    IOWarriorRemote(0).SetPort(CwPorts[1,j] = true);
	  end;
	end;
end;


// XXXXXXXXXXXXXXXXXXXX OnEOF XXXXXXXXXXXXXXXXXXXX
procedure OnCartwallPlayerEOFWarning(PlayerIndex: integer; Item: IAudioCartwallItem; PlaylistItem: IPlaylistItem);
  var
    i, j : integer;
  begin
    for j := 0 to 9 do begin
	  if (PlayerIndex = [j]) then begin
	    if blinkflag = true then begin
	      IOWarriorRemote(0).SetPort(CwPorts[2,j] = false);
		else begin
		  IOWarriorRemote(0).SetPort(CwPorts[2,j] = true);
		end;
 	end;
  end;
  
begin
end.

:woman_facepalming:

Manchmal sollte man wirklich eine Pause machen … IO-Worrior und Start/Stop, das geht ja in der Konfig selbst. Na dann hoffe ich mal dass das Script ansonsten so einigermaßen läuft :smiley:

1 Like

C’est moi … :smiley:

nun habe ich doch noch mal eine Frage … wen wundert es? … :smiley:

Ich habe ein Problem bei der Bestimmung eines Multidimensionalen Arrays.

Bei der folgenden Bestimmung:

var
    CwPorts: array [0..2, 0..9] of float;

bekomme ich die folgende Fehlermeldung:

Aber nach all meinem Wissen und den Recherchen sollte die Bestimmung so aber passen.

Ich schau mal irritiert in die Gegend :smiley:

Geht’s mit einem anderen Typ? Probiere mal Real. Oder Double.

Nein, die beiden wollen leider auch nicht, er will da unbedingt irgendwo eine Klammer.

Ich hatte es auch schon mit

... 2] , [0 ...

versucht, aber da schimpft er noch viel mehr. :slight_smile:

Ich frage mich inzwischen noch etwas anderes.

Innerhalb von mAirList wird der I/O Warrior entsprechend mit Ports von 0 bis 31 erkannt. Also nix mit 0.0 bis 0.7 usw.

  • Kann oder muß ich im Script selbst eventuell auch auf diese Nummerierung zurück greifen?
  • Wird das eventuell innerhalb von mAirList selbst schon umgestellt?

Dann könnte ich mir ja die multidimensionalen Arrays sparen :smiley:

Lasse mal das Leerzeichen zwischen array und [ weg.

Probier so:

CwPorts: array [0..2][0..9] of float;

Das hier kennst Du?

Dann bekomme ich folgende Meldung:
grafik

Kann es sein, dass ich in dem Fall

array of array ...

nehmen muß ?

Schau ich mir an, wenn ich wieder zurück bin :slight_smile:

Hasse Hinweis gesehen?

Leerzeichen sind egal, denke ich.

Es gibt in Delphi mehrere Möglichkeiten, ein mehrdimensionales Array zu deklarieren. Leider scheint Pascal Script (die Scripting-Engine) nicht alle davon zu verstehen.

CwPorts: array [0..2] of array[0..9] of float;

wäre noch eine Möglichkeit, die man ausprobieren könnte. Ansonsten müsste man evtl. Typen dafür definieren:

type
  TFloatArray10 = array[0..9] of float;

var
  CwPorts: array[0..2] ot TFloatArray10;

Irgendwie wird es sich schon überlisten lassen :wink:

1 Like

… oder Pascal Script stellt sich mal wieder an. Ich meine, ich hätte das erst letzte Woche mal ausprobiert, aber ich kann mich auch täuschen. (Jedenfalls hatte ich es schließlich nicht verwendet. Und dann vergesse ich sowas schnell wieder.)

1 Like

Sieht eher schlecht aus (auch wenn der Beitrag 10 Jahre alt): Multidimensioal arrays - Pascal Script - RemObjects Talk

Aber ohnehin denke ich, dass das Array hier vollkommen überflüssig ist. Wenn es nur darum geht, aus der Cartnummer eine Portnummer zu errechnen, kann man das sicher auch über eine einfach Formel machen.

1 Like

Hier bekomme ich jetzt zumindest eine neue Meldung :smiley: Das ist doch schon mal was wert :wink:

26.02.2021 16:01:27 Fehler Fehler beim Laden des Hintergrund-Scripts D:\mAirList\Scripts\MainScript_v.2.mls: [Error] (6:45): Unknown type ‘float’ [Error] (6:45): Unknown identifier ‘’ [Error] (6:45): Unknown identifier ‘’

Da hakt es wohl noch anderswie…

hmmm … das sollte ich mal überdenken. Scheint wenn der sichere Weg zu sein. mAirList selbst setzt die Ports vermutlich nicht in 0 bis 31 um?

Inwiefern denn “umsetzen”?

Ich hatte einen Denkfehler … sorry … Ich dachte, dass in der Einrichtung des IOWarriors in der mAirList Konfig die Ports ja schon irgendwie identifiziert werden und zugewiesen werden. Aber das ist ja der andere Weg :smiley:

Jetzt habe ich aber noch mal eine grundlegende Frage zu Scripten und deren Integration in mAirList.

nehme ich zum Beispiel die

prozedure OnCartwallPlayerStateChange(PlayerIndex: integer; OldState: TPlayerState; NewState: TPlayerState);

Ich gehe von der Logik her davon aus, dass diese “procedure” keinen Timer braucht sondern von sich aus ständig den Status überwacht?

Knapp daneben. Diese Prozeduren überwachen nichts, sondern werden von bestimmten Ereignissen innerhalb mAirLists getriggert. In Deinem Beispiel wird, wann immer was an der Cartwall verändert wird, eben diese Prozedur aufgerufen und gleich die ganzen Variablen (PlayerIndex, PlayerState, …) mitgeliefert. Schreibt man was zwischen begin und end;, dann wird eben dieser Code zum Ereigniszeitpunkt ausgeführt.

Nur bei bestimmten Funktionalitäten, beispielsweise bei der Encoderverbindungsüberwachung, gibt es diesen Trigger (noch, *hoff*) nicht. Dann muß man mittels OnTimer (oder OnTimerEx) eine Dauerabfrage einrichten.

1 Like