Benötige Hilfe zu IO Warrior Board 40 und Script

Hallo liebe mAirList-User,

ich möchte gerne mit ein paar Taster die Player (Player-A und Player-B) starten und stoppen. Um den Status zu erkennen, sollen dann noch LED‘s angesteuert werden.

Dazu habe ich mir ein IO Warrior 40 zugelegt (4 Ports mit je 8 I/O). Da ich totaler Neuling auf diesem Gebiet bin, wollte ich erst einmal ein vorhandenes Script aus dem Forum benutzen, um den Status der Player über die LED‘s auf dem Board anzeigen zu lassen. Leider klappt das nicht und ich bekomme in mAirList eine Fehlermeldung. Sehe ich das richtig, dass in dem angefügten Script die Ausgänge 17 und 18 benutzt werden?

Meine Vorgehensweise:

  • Das IO Warrior Board wurde beim Anstecken an einen freien USB-Port richtig erkannt

  • in der mAirList-Konfiguration unter „Fernsteuerung“ das Board IO-Warrior (00004721) aktiviert

  • Script (Playertest mAirList.mls) unter „Hintergrund-Scripts“ hinzugefügt

Beim Starten von mAirList (Version 6.1.0 Build 3842) bekomme ich aber im Systemprotokoll von mAirList die Fehlermeldung „Fehler beim Laden des Hintergrund-Scripts E:\Program Files (x86)\mAirList 6.1\Scripte\Playertest mAirList.mls: [Error] (2:1): Syntax error“.

(Siehe auch mein Scipt, dass ich hier aus dem Forum übernommen habe)

Wo ist der Fehler? Kann mir jemand weiterhelfen?

Viele Grüße
Peer


Playertest mAirList.mls (1.58 KB)

Ich bin jetzt schon mal einen Schritt weiter :slight_smile:
Mit dem unten angefügten Script bekomme ich jetzt schon einmal die LED’s auf dem Board zum Leuchten, wenn Player A oder B aktiv ist. Die EOF-Funktion (Blinken am Ende eines Tracks) bekomme ich bis jetzt noch nicht hin, da ich mich mit der Programmierung erst langsam anfreunde.
Hat jemand eine Idee???

procedure OnPlayerStart(PlaylistIndex: integer; PlayerIndex: integer; Item: IPlaylistItem); begin if (PlaylistIndex= 0) and (PlayerIndex= 0) then begin SystemLog('Player A einschalten'); IOWarriorRemote(0).SetPort(24, true); end; if (PlaylistIndex= 0) and (PlayerIndex= 1) then begin SystemLog('Player B einschalten'); IOWarriorRemote(0).SetPort(25, true); end; end;

procedure OnPlayerStop(PlaylistIndex: integer; PlayerIndex: integer; Duration: TTimeValue; Item: IPlaylistItem);
begin
if (PlaylistIndex= 0) and (PlayerIndex= 0) then begin
SystemLog(‘Player A ausschalten’);
IOWarriorRemote(0).SetPort(24, false);
end;
if (PlaylistIndex= 0) and (PlayerIndex= 1) then begin
SystemLog(‘Player B ausschalten’);
IOWarriorRemote(0).SetPort(25, false);
end;
end;

begin
end.

Hallo Peer,

grundsätzlich ist dein Thema im Hardware Forum falsch angesiedelt. Nächstes mal eher zu dem Unterforum Scripts. Dann klappt die Hilfe evtl. schneller :wink:

Hier mal was schnell Zusammengewürfeltes (ungetestet) zu deinem Anliegen:

[code]const
PORT_COUNT = 32;
var
PortFlashing: array[0…PORT_COUNT-1] of boolean;
FlashCounter: integer;

procedure OnTimer;
var
i: integer;
begin
FlashCounter:= FlashCounter+1;
if FlashCounter = 2 then FlashCounter := 0;

for i := 0 to PORT_COUNT -1 do
if PortFlashing[i] then
IOWarriorRemote(0).SetPort(i, FlashCounter = 1);
end;

procedure OnLoad;
var
i: integer;
begin
for i:= 0 to PORT_COUNT -1 do
PortFlashing[i] := false;
EnableTimer(500);
end;

procedure OnPlayerStateChange(PlaylistIndex: integer; PlayerIndex: integer; OldState: TPlayerState; NewState: TPlayerState; Item: IPlaylistItem);
begin
if (PlayerIndex= 0) and (NewState = psPlaying) then begin
IOWarriorRemote(0).SetPort(24, true);
end;
if (PlayerIndex= 0) and (NewState = psStopped) then begin
IOWarriorRemote(0).SetPort(24, false);
end;
if (PlayerIndex= 0) and (NewState = psEOF) then begin
PortFlashing[24] := true;
end;
if (PlayerIndex= 1) and (NewState = psPlaying) then begin
IOWarriorRemote(0).SetPort(25, true);
end;
if (PlayerIndex= 1) and (NewState = psStopped) then begin
IOWarriorRemote(0).SetPort(25, false);
end;
if (PlayerIndex= 1) and (NewState = psEOF) then begin
PortFlashing[25] := true;
end;
end;
[/code]

Hallo Lord_Femto,

vielen Dank für Dein Script. Leider macht es auch nicht was ich möchte. Beim Starten der Player wird zwar die entsprechende LED angesteuert, aber die EOF-Funktion funktioniert nicht. Erst wenn der Track komplett abgespielt wurde, fängt die LED an zu blinken und blinkt und blinkt … (obwohl der Player den Track schon längst komplett abgespielt hat).

Auch ein erneuter Start des Players (Start des nächsten Tracks aus der Playliste) bewirkt keine Änderung (es blinkt und blinkt weiter). Erst wenn ich mAirList komplett schließe hört das Blinken auf.

Hast Du noch einen Tipp für mich???

LG
Peer

Hallo Peer,

ach ja. Ich vergesse immer, dass psEOF nichts mit der EOF-Signalisierung zu tun hat.
Hier ein weiterer Versuch:

[code]const
PORT_COUNT = 32;
var
PortFlashing: array[0…PORT_COUNT-1] of boolean;
FlashCounter: integer;

procedure OnTimer;
var
i: integer;
begin
FlashCounter:= FlashCounter+1;
if FlashCounter = 2 then FlashCounter := 0;

for i := 0 to PORT_COUNT -1 do
if PortFlashing[i] then
IOWarriorRemote(0).SetPort(i, FlashCounter = 1);
end;

procedure OnLoad;
var
i: integer;
begin
for i:= 0 to PORT_COUNT -1 do
PortFlashing[i] := false;
EnableTimer(500);
end;

procedure OnPlayerStart(PlaylistIndex: integer; PlayerIndex: integer; Item: IPlaylistItem);
begin
if (PlaylistIndex = 0) and (PlayerIndex = 0) then begin
IOWarriorRemote(0).SetPort(24, true);
end;
if (PlaylistIndex = 0) and (PlayerIndex = 1) then begin
IOWarriorRemote(0).SetPort(25, true);
end;
end;

procedure OnPlayerStop(PlaylistIndex: integer; PlayerIndex: integer; Duration: TTimeValue; Item: IPlaylistItem);
begin
if (PlaylistIndex = 0) and (PlayerIndex = 0) then begin
PortFlashing[24] := false;
IOWarriorRemote(0).SetPort(24, false);
end;
if (PlaylistIndex = 0) and (PlayerIndex = 1) then begin
PortFlashing[25] := false;
IOWarriorRemote(0).SetPort(25, false);
end;
end;

procedure OnPlayerEOFWarning(PlaylistIndex: integer; PlayerIndex: integer);
begin
if (PlaylistIndex = 0) and (PlayerIndex = 0) then begin
PortFlashing[24] := true;
end;
if (PlaylistIndex = 0) and (PlayerIndex = 1) then begin
PortFlashing[25] := true;
end;
end;[/code]

Hallo Lord_Femto,

herzlichen Dank für Deine Mühe - jetzt läuft es - freu … :smiley:

Ein kleiner Schönheitsfehler ist noch drin. Wenn der Track im Player sehr kurz ist (unter 10 Sekunden), dann leuchtet die LED vom zugehörigen Player permanent, da ja eigentlich schon EOF erreicht ist (eigentlich müsste sie gleich mit blinken loslegen).
Bei längeren Tracks ist alles suuPEER!

Wenn man das jetzt noch hinbekommen würde, dann wäre es PEERfekt 8) …

Viele Grüße
Peer

Und genau daran liegt die Crux. M.E. ist es gar nicht so trivial umzusetzen. Das einzige, was mir spontan einfällt, ist eine Fallunterscheidung für die Startprozedur. Man benötigt dafür die Gesamtlänge des Elements, subtrahiert den Wert der EOF Einstellung und unterscheidet dann < oder > 0 mit blinken respekt. leuchten.

Inwieweit das möglich ist, kann ich nicht sagen. Demnach geht die Frage an die Community und Torben.

So in der Art hatte ich mir das auch schon gedacht. Vielleicht hat Torben ja einen Tipp 8) …

Jetzt werde ich mich mal mit den Input-Ports des IO-Warrior beschäftigen. Habe da noch ein paar Ideen, die ich gerne umsetzen möchte.