Build 562: Probleme mit serieller Kommunikation

Hallo Torben,

hat sich bei deinen letzten Snapshots etwas in Sachen seriellerl Kommunikation geändert? Mein Mixercontrol reagiert nichtmehr auf die Befehle die ich ihm per ComPort(‘COM2’).SendStr() schicke. Das Script ist natürlich angepasst, worden, nach dem Wegfall der Objektreferenzen und es sollte eigentlich alles stimmem. Hab zum Debuggen extra mal nen SystemLog() eingefügt und es sieht alles richtig aus, nur bei Mixercontrol scheints nicht korrekt anzukommen. Die andere Richtung funktioniert, von Mixercontrol aus ist mAirList steuerbar.

Anbei mal das Script:

[code]function StateToStr(iState: TPlayerState): String;
begin
Case iState Of
psEmpty: Result := ‘psEmpty’;
psLoading: Result := ‘psLoading’;
psLoaded: Result := ‘psLoaded’;
psPlaying: Result := ‘psPlaying’;
psFading: Result := ‘psFading’;
psEOF: Result := ‘psEOF’;
psError: Result := ‘psError’;
psPaused: Result := ‘psPaused’;
psStopped: Result := ‘psStopped’;
psPFL: Result := ‘psPFL’;
psFlashEOF: Result := ‘psFlashEOF’;
psNext: Result := ‘psNext’;
else Result := ‘unknown’;
end;
end;

procedure OnStartup;
begin
ComPort(‘COM2’).SendStr(‘RESET’ + #13#10);
end;

procedure OnShutdown;
begin
ComPort(‘COM2’).SendStr(‘RESET’ + #13#10);
end;

procedure OnPlayerStateChange(PlayerIndex: integer; OldState: TPlayerState; NewState: TPlayerState);
var
Port: Integer;
begin
{for debugging only}
SystemLog('Index: ’ + IntToStr(PlayerIndex) + ’ From ’ + StateToStr(OldState) + ’ to ’ + StateToStr(NewState));

Case PlayerIndex Of
0: Port := 3;
1: Port := 4;
end;

Case NewState Of
psLoaded: ComPort(‘COM2’).SendStr(‘PORT ’ + IntToStr(Port) + ’ 1’ + #13#10);
psPlaying: ComPort(‘COM2’).SendStr(‘PORT ’ + IntToStr(Port) + ’ 2’ + #13#10);
psStopped: ComPort(‘COM2’).SendStr(‘PORT ’ + IntToStr(Port) + ’ 1’ + #13#10);
psPaused: ComPort(‘COM2’).SendStr(‘PORT ’ + IntToStr(Port) + ’ 1’ + #13#10);
psEmpty: ComPort(‘COM2’).SendStr(‘PORT ’ + IntToStr(Port) + ’ 0’ + #13#10);
end;
end;

begin
end.[/code]

Gruß
Dominique Görsch

Habs nun mal mit dem Build 563 geteset. Dort scheint generell die Kommunikation wieder zu stimmen, aber in “OnPlayerStateChange(PlayerIndex: integer; OldState: TPlayerState; NewState: TPlayerState);” ist PlayerIndex immer 0, egal welcher Player abgefeuert wird.

Gruß
Dominique Görsch

EDIT: Da scheint auch generell etwas mit den States durcheinander zu sein, folgender Ablauf wenn ich ein Element in Player 0 lade und spiele.
psEmpty -> psLoading
psEmpty -> psLoaded
psEmpty -> psPlaying
psEmpty -> psEOF
psEmpty -> psEmpty

Zum einen ist der aktuelle State nicht korrekt, zum anderen wird psStopped nie erreicht. Wenn ich ein Element in Player 1 lade und abspiele, sieht es etwas anders aus:
psLoading -> psLoading
psLoading -> psLoaded
psLoading -> psPlaying
psLoading -> psEOF
psLoading -> psEmpty

Kann es sein, dass die Reihenfolge der übergebenen Paramter nicht stimmt, und deswegen bei Player 0 OldState immer psEmpty und bei Player 1 immer psLoading ist? Wie auch schon bei Player 0 wird psStopped nie erreicht.

Gut recherchiert!

Füg mal am Anfang noch den Parameter “PlaylistIndex: integer” ein. Dann müsste es gehen.

Ja danke, das wars. Nun habe ich aber wieder Probleme mit dem Auswerten der Daten… versuche das morgen mal zu Debuggen, es scheint fast so, als wenn mAirList durch das schnelle ändern der Events/States quasi mehrfach gleichzeitg auf die Serielle schreibt…

Eigentlich sollten die Script-Aufrufe immer nacheinander geschen. Falls da wirklich was “gleichzeitig” passiert (also die Daten “interleaved” ankommen), dann muss was ziemlich im Argen sein.