Cartwall GetState funktion

Hi,

Ich arbeite grade an ein Script das mir einer IOWarrior, die buttons von der Cartwall aufleuchten soll wen sie geladen sind oder, blinken wenn er spielt, oder löschen wen er leer ist.
Das klappt auch recht gut, aber bei der initializierung hab ich ein Problem.

procedure OnLoad;
var
  i: integer;
  s: TPlayerState;
begin
  for i := 1 to PLAYER_COUNT do
    begin
      s := CartWall.GetPlayer(i).GetState;

      if (s = psLoaded) or (s = psPaused) then
          SetButton(i, bsOn);
      else
          SetButton(i, bsOff);
    end;

  EnableTimer(BLINK_INTERVAL);
end;

Anscheint stimmt der Funktion GetPLayer() nicht. Die klasse CartWall scheint wohl zu stimmen.
Ich hatte sie irgendwo auf dem Forum gefunden, aber vermutlich war die Information schon was alter. Weis jemand wie die Funktion heute heißt?

Und gibt es vielleicht ein Übersicht von solche Funktionen?

Ich habe auch gemerkt das der Type TButtonState schon besteht, ich weis aber nicht welche entries es dort drin gibt. Sonst hatte ich die gerne benutzt an stelle mein eigener Typ zu definieren.

Wenn das ganze Funktioniert, dann wird ich das komplette Script hier natürlich hoch laden inklusive Hardware design Files.

Grüße in Dephi,
Marcus

Hier gibt es eine Übersicht aller Funktionen, Prozeduren usw. in Form eines Windows-Helpfiles. Ich hoffe, Du kommst damit klar.

Verlinkte Grüße

TSD

Hi @Tondose,

Danke! Es war ein kleiner streit das teil zu öffnen als Linux user, aber es hat geklappt.

Ich glaube die richtige Zeile im Code ist jetzt s := CartWall.GetActivePage.GetPlayerControl(i).GetState;, aber wird das heute Abend testen.

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

D&R Airmate 1st Generation :+1:

Schöne Arbeit. Hat es einen Grund, warum Du die ULN2803 in eine „zu große“ Fassung gesetzt hast, zwei noch dazu „falschherum“?

Goed werk. Is er een reden waarom je de ULN2803 in een „te grote“ versie hebt gezet, en nog twee „verkeerd“?

Google-übersetzte Grüße

TSD

Ja, das bin ich glatt vergessen zu erwähnen.

Ich benutze sie fuhr sowohl ein- als aus-gangen. Also in de eine Position funktioniert sie als Input, dreht man sie um 180 Grad schiebt sie 1 Row weiter, ist es ein Output.

Die Pinheaders sind in eine Reihe IO pins, und zweite Reihe ist +VCC. Wenn man die ULN in der Input Position hat, kann man den IO Pin an VCC legen, dann registriert der IOW der port als “On”. Wenn sie umgedreht ist als Ouput, dann funktioniert der IO Pin als current-sink, und kann Mann ein LED (mir widerstand) zwischen VCC und IO pin anschließen, damit wenn man ein “false” auf den Output schreibt, die LED leuchtet.

Somit kann ich pro 8 IO’s noch wechseln ob ich ein ein- oder -ausgang brauche. Und sind sie immer geschützt vor Überspannen oder Kurzschluss.

1 Like

Hallo,
ich bin ganz begeistert das hier zu finden,
ich habe so etwas ähnliches vor.
Ich habe auch einen IO Warrior.
Angeschlossen habe ich drei Leuchttaster für 3 Player
und 4 Teuchttaster für die Cardwall.
Alles startet auf Knopfdruck nur ich schaffe nicht ein Rückmeldesignal auf die LEDs im Taster zu bringen.
Wie könnte das Script aussehen? Bin absoluter Anfänger, kannst du mir auf die Sprünge helfen?
Danke erstmal…
Eugen01