Hi,
Also wie versprochen, ein follow-up
Als erstes mal das Resultat…
Cartwall Buttons
Wir haben hier 8 LED Buttons womit wir 8 Cartwalls steuern. Alle befinden sich unter ein fader. Push to start/stop.
Wenn ein Player lauft, blinkt der LED.
Button Start
Das kennen die meisten ja, Button-start fur die Player. In diesen Fall 2 Stuck. Push to start, Push again to pause. Auf dieses Mischpult sind die Buttons latching.
Hier gebt es noch ein paar Problemen mit das automatisch laden und entladen der Player. Das hat aber nicht mit den remote zu tun, eher eine Kombination von Settings.
Cartwall pages
Die Cartwall hat mehrere Pages. Wenn man wechselt von Page, und es sind andere Player belegt, dann leuchten oder löschen sich die LED leuchten auf den Buttons. Nur die die geladen sind, leuchten auf. Das gilt auch wenn man in der current Page was neues ladet.
Der Code
Der Code die das ganze ermöglicht ist eigentlich recht einfach, sie befindend sich hier unten.
Zur Nutzung braucht man nur die variablen anpassen.
{
Cartwall player button controller
This script controls the cartwall physical buttons.
The following states are represented by the LED's embedded in the buttons:
Loaded: Button is lit.
Empty: Button is extinguish.
Playing: Button is blinking.
}
{
Configuration variables
}
const
// Number of cartwall players/buttons
PLAYER_COUNT = 8;
// Button to IOW port offset,
// eg. Cart 1 => IO 0
IOW_OFFSET = -1;
// IOW Controller ID
IOW_ID = 0;
// Blink interval (ms)
BLINK_INTERVAL = 500;
var
PortFlashing: array[1..PLAYER_COUNT] of boolean;
FlashToggle: boolean;
type
cTButtonState = (bsOn, bsOff, bsBlink);
{
Script runtime
NO NOT CHANGE BELOW THIS LINE
-----------------------------
}
procedure SetButton(PlayerIndex: integer; State: cTButtonState);
var
IowPortIndex: integer;
begin
IowPortIndex := PlayerIndex + IOW_OFFSET;
case State of
bsOn:
begin
PortFlashing[PlayerIndex] := false;
IOWarriorRemote(IOW_ID).SetPort(IowPortIndex, false);
end;
bsOff:
begin
PortFlashing[PlayerIndex] := false;
IOWarriorRemote(IOW_ID).SetPort(IowPortIndex, true);
end;
bsBlink:
PortFlashing[PlayerIndex] := true;
end;
end;
procedure OnTimer;
var
i: integer;
begin
FlashToggle := not FlashToggle;
for i := 1 to PLAYER_COUNT do
if PortFlashing[i] then
IOWarriorRemote(IOW_ID).SetPort(i + IOW_OFFSET, FlashToggle);
end;
procedure OnLoad;
var
i: integer;
s: TPlayerStateArray;
begin
Cartwall.GetActivePagePlayerStates(s);
for i := 1 to PLAYER_COUNT do
begin
if (s[i] = psLoaded) or (s[i] = psPaused) or (s[i] = psStopped) then
SetButton(i, bsOn)
else
SetButton(i, bsOff);
end;
EnableTimer(BLINK_INTERVAL);
end;
procedure OnCartwallPlayerStateChange(PlayerIndex: integer;
OldState: TPlayerState; NewState: TPlayerState;
Item: IAudioCartwallItem; PlaylistItem: IPlaylistItem;
OnAirMode: TCartwallOnAirMode);
begin
case NewState of
psLoaded:
SetButton(PlayerIndex, bsOn);
psEmpty:
SetButton(PlayerIndex, bsOff);
psPlaying:
SetButton(PlayerIndex, bsBlink);
psPaused:
SetButton(PlayerIndex, bsOn);
psStopped:
SetButton(PlayerIndex, bsOn);
end;
end;
begin
end.
Die Hardware
Das ganze ist basiert auf ein IO-Warrior56 Modul. Um die anschlussen zu ermöglichen und etwas Sicherheit ein zu bauen ist das ganze auf eine custom Platine angebracht, mit ULN2803A als buffer und LED driver.
Die Gerber files hatte ich gerne als Attachment an diesen Post gehangen, aber das geht leider nicht, aber wer sie, oder die KiCad Dateien/Footprints braucht kann mir immer schreiben.
Gebastelte Grüße,
Marcus