Cartwall GetState funktion

Hi,

Also wie versprochen, ein follow-up :slight_smile:

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

1 Like