Skip to content

Commit

Permalink
Converted FPP File Player to use the elapsed time field instead of th…
Browse files Browse the repository at this point in the history
…e frameid filed in the sync status message. This allows us to have a different frame rate than the master.

Fixed an issue that caused a file to not get played when the same file is played back-to-back and the stop or start messages got lost.
  • Loading branch information
MartinMueller2003 committed Nov 9, 2021
1 parent 12fbc86 commit e50449f
Show file tree
Hide file tree
Showing 15 changed files with 141 additions and 168 deletions.
6 changes: 3 additions & 3 deletions ESPixelStick/src/input/InputFPPRemotePlayEffect.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ c_InputFPPRemotePlayEffect::~c_InputFPPRemotePlayEffect ()
} // ~c_InputFPPRemotePlayEffect

//-----------------------------------------------------------------------------
void c_InputFPPRemotePlayEffect::Start (String & FileName, uint32_t duration, uint32_t )
void c_InputFPPRemotePlayEffect::Start (String & FileName, float duration, uint32_t )
{
// DEBUG_START;

Expand All @@ -72,11 +72,11 @@ void c_InputFPPRemotePlayEffect::Stop ()
} // Stop

//-----------------------------------------------------------------------------
void c_InputFPPRemotePlayEffect::Sync (String& FileName, uint32_t FrameId)
void c_InputFPPRemotePlayEffect::Sync (String& FileName, float SecondsElapsed)
{
// DEBUG_START;

pCurrentFsmState->Sync (FrameId);
pCurrentFsmState->Sync (SecondsElapsed);

// DEBUG_END;
} // Sync
Expand Down
4 changes: 2 additions & 2 deletions ESPixelStick/src/input/InputFPPRemotePlayEffect.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,9 @@ class c_InputFPPRemotePlayEffect : public c_InputFPPRemotePlayItem
c_InputFPPRemotePlayEffect (c_InputMgr::e_InputChannelIds InputChannelId);
~c_InputFPPRemotePlayEffect ();

virtual void Start (String & FileName, uint32_t duration, uint32_t PlayCount);
virtual void Start (String & FileName, float duration, uint32_t PlayCount);
virtual void Stop ();
virtual void Sync (String & FileName, uint32_t FrameId);
virtual void Sync (String & FileName, float SecondsElapsed);
virtual void Poll (uint8_t * Buffer, size_t BufferSize);
virtual void GetStatus (JsonObject & jsonStatus);
virtual bool IsIdle () { return (pCurrentFsmState == &fsm_PlayEffect_state_Idle_imp); }
Expand Down
9 changes: 4 additions & 5 deletions ESPixelStick/src/input/InputFPPRemotePlayEffectFsm.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ void fsm_PlayEffect_state_Idle::Init (c_InputFPPRemotePlayEffect* Parent)
} // fsm_PlayEffect_state_Idle::Init

//-----------------------------------------------------------------------------
void fsm_PlayEffect_state_Idle::Start (String & ConfigString, uint32_t )
void fsm_PlayEffect_state_Idle::Start (String & ConfigString, float )
{
// DEBUG_START;

Expand Down Expand Up @@ -90,7 +90,7 @@ void fsm_PlayEffect_state_Idle::Stop (void)
} // fsm_PlayEffect_state_Idle::Stop

//-----------------------------------------------------------------------------
bool fsm_PlayEffect_state_Idle::Sync (uint32_t FrameId)
bool fsm_PlayEffect_state_Idle::Sync (float)
{
// DEBUG_START;

Expand Down Expand Up @@ -148,7 +148,7 @@ void fsm_PlayEffect_state_PlayingEffect::Init (c_InputFPPRemotePlayEffect* Paren
} // fsm_PlayEffect_state_PlayingEffect::Init

//-----------------------------------------------------------------------------
void fsm_PlayEffect_state_PlayingEffect::Start (String & FileName, uint32_t FrameId)
void fsm_PlayEffect_state_PlayingEffect::Start (String &, float)
{
// DEBUG_START;

Expand All @@ -174,7 +174,7 @@ void fsm_PlayEffect_state_PlayingEffect::Stop (void)
} // fsm_PlayEffect_state_PlayingEffect::Stop

//-----------------------------------------------------------------------------
bool fsm_PlayEffect_state_PlayingEffect::Sync (uint32_t FrameId)
bool fsm_PlayEffect_state_PlayingEffect::Sync (float)
{
// DEBUG_START;

Expand Down Expand Up @@ -210,4 +210,3 @@ void fsm_PlayEffect_state_PlayingEffect::GetStatus (JsonObject& jsonStatus)
// DEBUG_END;

} // fsm_PlayEffect_state_PlayingEffect::GetStatus

12 changes: 6 additions & 6 deletions ESPixelStick/src/input/InputFPPRemotePlayEffectFsm.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,9 @@ class fsm_PlayEffect_state
virtual void Poll (uint8_t * Buffer, size_t BufferSize) = 0;
virtual void Init (c_InputFPPRemotePlayEffect * Parent) = 0;
virtual void GetStateName (String & sName) = 0;
virtual void Start (String & FileName, uint32_t FrameId) = 0;
virtual void Start (String & FileName, float SecondsElapsed) = 0;
virtual void Stop (void) = 0;
virtual bool Sync (uint32_t FrameId) = 0;
virtual bool Sync (float SecondsElapsed) = 0;
virtual void GetStatus (JsonObject& jsonStatus) = 0;
void GetDriverName (String& Name) { Name = "InputMgr"; }

Expand All @@ -53,9 +53,9 @@ class fsm_PlayEffect_state_Idle : public fsm_PlayEffect_state
virtual void Poll (uint8_t * Buffer, size_t BufferSize);
virtual void Init (c_InputFPPRemotePlayEffect* Parent);
virtual void GetStateName (String & sName) { sName = CN_Idle; }
virtual void Start (String & FileName, uint32_t FrameId);
virtual void Start (String & FileName, float SecondsElapsed);
virtual void Stop (void);
virtual bool Sync (uint32_t FrameId);
virtual bool Sync (float SecondsElapsed);
virtual void GetStatus (JsonObject& jsonStatus);

}; // fsm_PlayEffect_state_Idle
Expand All @@ -67,9 +67,9 @@ class fsm_PlayEffect_state_PlayingEffect : public fsm_PlayEffect_state
virtual void Poll (uint8_t * Buffer, size_t BufferSize);
virtual void Init (c_InputFPPRemotePlayEffect* Parent);
virtual void GetStateName (String & sName) { sName = CN_Effect; }
virtual void Start (String & FileName, uint32_t FrameId);
virtual void Start (String & FileName, float SecondsElapsed);
virtual void Stop (void);
virtual bool Sync (uint32_t FrameId);
virtual bool Sync (float SecondsElapsed);
virtual void GetStatus (JsonObject& jsonStatus);

}; // fsm_PlayEffect_state_PlayingEffect
43 changes: 11 additions & 32 deletions ESPixelStick/src/input/InputFPPRemotePlayFile.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -57,11 +57,11 @@ c_InputFPPRemotePlayFile::~c_InputFPPRemotePlayFile ()
} // ~c_InputFPPRemotePlayFile

//-----------------------------------------------------------------------------
void c_InputFPPRemotePlayFile::Start (String & FileName, uint32_t FrameId, uint32_t PlayCount)
void c_InputFPPRemotePlayFile::Start (String & FileName, float SecondsElapsed, uint32_t PlayCount)
{
// DEBUG_START;

pCurrentFsmState->Start (FileName, FrameId, PlayCount);
pCurrentFsmState->Start (FileName, SecondsElapsed, PlayCount);

// DEBUG_END;
} // Start
Expand All @@ -77,12 +77,12 @@ void c_InputFPPRemotePlayFile::Stop ()
} // Stop

//-----------------------------------------------------------------------------
void c_InputFPPRemotePlayFile::Sync (String & FileName, uint32_t FrameId)
void c_InputFPPRemotePlayFile::Sync (String & FileName, float SecondsElapsed)
{
// DEBUG_START;

SyncControl.SyncCount++;
if (pCurrentFsmState->Sync (FileName, FrameId))
if (pCurrentFsmState->Sync (FileName, SecondsElapsed))
{
SyncControl.SyncAdjustmentCount++;
}
Expand Down Expand Up @@ -139,7 +139,7 @@ void c_InputFPPRemotePlayFile::GetStatus (JsonObject& JsonStatus)
{
// xDEBUG_START;

uint32_t mseconds = FrameControl.FrameStepTimeMS * FrameControl.LastPlayedFrameId;
uint32_t mseconds = FrameControl.ElapsedPlayTimeMS;
uint32_t msecondsTotal = FrameControl.FrameStepTimeMS * FrameControl.TotalNumberOfFramesInSequence;

uint32_t secs = mseconds / 1000;
Expand Down Expand Up @@ -178,22 +178,17 @@ void c_InputFPPRemotePlayFile::GetStatus (JsonObject& JsonStatus)
} // GetStatus

//-----------------------------------------------------------------------------
uint32_t c_InputFPPRemotePlayFile::CalculateFrameId (int32_t SyncOffsetMS)
uint32_t c_InputFPPRemotePlayFile::CalculateFrameId (uint32_t ElapsedMS, int32_t SyncOffsetMS)
{
// DEBUG_START;

uint32_t CurrentFrameId = 0;

do // once
{
if (FrameControl.ElapsedPlayTimeMS < FrameControl.FrameStepTimeMS)
{
break;
}

uint32_t AdjustedPlayTime = FrameControl.ElapsedPlayTimeMS + SyncOffsetMS;
uint32_t AdjustedPlayTime = ElapsedMS + SyncOffsetMS;
// DEBUG_V (String ("AdjustedPlayTime: ") + String (AdjustedPlayTime));
if ((0 > SyncOffsetMS) && (FrameControl.ElapsedPlayTimeMS < abs(SyncOffsetMS)))
if ((0 > SyncOffsetMS) && (ElapsedMS < abs(SyncOffsetMS)))
{
break;
}
Expand All @@ -209,21 +204,6 @@ uint32_t c_InputFPPRemotePlayFile::CalculateFrameId (int32_t SyncOffsetMS)

} // CalculateFrameId

//-----------------------------------------------------------------------------
void c_InputFPPRemotePlayFile::CalculatePlayStartTime (uint32_t StartingFrameId)
{
// DEBUG_START;

FrameControl.ElapsedPlayTimeMS = FrameControl.FrameStepTimeMS * StartingFrameId;

// DEBUG_V (String (" FrameStepTimeMS: ") + String (FrameControl.FrameStepTimeMS));
// DEBUG_V (String (" StartingFrameId: ") + String (StartingFrameId));
// DEBUG_V (String (" ElapsedPlayTIme: ") + String (FrameControl.ElapsedPlayTimeMS));

// DEBUG_END;

} // CalculatePlayStartTime

//-----------------------------------------------------------------------------
bool c_InputFPPRemotePlayFile::ParseFseqFile ()
{
Expand Down Expand Up @@ -408,13 +388,12 @@ bool c_InputFPPRemotePlayFile::ParseFseqFile ()
void c_InputFPPRemotePlayFile::ClearFileInfo()
{
PlayItemName = String ("");
FrameControl.StartingFrameId = 0;
FrameControl.LastPlayedFrameId = 0;
RemainingPlayCount = 0;
SyncControl.LastRcvdSyncFrameId = 0;
SyncControl.LastRcvdElapsedSeconds = 0.0;
FrameControl.ElapsedPlayTimeMS = 0;
FrameControl.DataOffset = 0;
FrameControl.ChannelsPerFrame = 0;
FrameControl.FrameStepTimeMS = 25;
FrameControl.TotalNumberOfFramesInSequence = 0;
FrameControl.ElapsedPlayTimeMS = 0;

} // ClearFileInfo
13 changes: 4 additions & 9 deletions ESPixelStick/src/input/InputFPPRemotePlayFile.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,17 +31,15 @@ class c_InputFPPRemotePlayFile : public c_InputFPPRemotePlayItem
c_InputFPPRemotePlayFile (c_InputMgr::e_InputChannelIds InputChannelId);
~c_InputFPPRemotePlayFile ();

virtual void Start (String & FileName, uint32_t FrameId, uint32_t RemainingPlayCount);
virtual void Start (String & FileName, float SecondsElapsed, uint32_t RemainingPlayCount);
virtual void Stop ();
virtual void Sync (String& FileName, uint32_t FrameId);
virtual void Sync (String& FileName, float SecondsElapsed);
virtual void Poll (uint8_t* Buffer, size_t BufferSize);
virtual void GetStatus (JsonObject & jsonStatus);
virtual bool IsIdle () { return (pCurrentFsmState == &fsm_PlayFile_state_Idle_imp); }

void TimerPoll ();

uint32_t GetLastFrameId () { return FrameControl.LastPlayedFrameId; }

private:
#define ELAPSED_PLAY_TIMER_INTERVAL_MS 10

Expand Down Expand Up @@ -70,15 +68,13 @@ class c_InputFPPRemotePlayFile : public c_InputFPPRemotePlayItem
uint32_t TotalNumberOfFramesInSequence = 0;
uint32_t ElapsedPlayTimeMS = 0;

uint32_t StartingFrameId = 0;
uint32_t LastPlayedFrameId = 0;
} FrameControl;

struct SyncControl_t
{
uint32_t SyncCount = 0;
uint32_t SyncAdjustmentCount = 0;
uint32_t LastRcvdSyncFrameId = 0;
float LastRcvdElapsedSeconds = 0.0;
} SyncControl;

uint8_t * Buffer = nullptr;
Expand All @@ -94,8 +90,7 @@ class c_InputFPPRemotePlayFile : public c_InputFPPRemotePlayItem
#define MAX_NUM_SPARSE_RANGES 5
FSEQParsedRangeEntry SparseRanges[MAX_NUM_SPARSE_RANGES];

uint32_t CalculateFrameId (int32_t SyncOffsetMS = 0);
void CalculatePlayStartTime (uint32_t FrameId);
uint32_t CalculateFrameId (uint32_t ElapsedMS, int32_t SyncOffsetMS);
bool ParseFseqFile ();

String LastFailedPlayStatusMsg;
Expand Down
Loading

0 comments on commit e50449f

Please sign in to comment.