From cc52743f65eb87398ad3fde5c9534bf4676e0f25 Mon Sep 17 00:00:00 2001 From: Johannes Paehr Date: Wed, 24 Dec 2025 00:08:44 +0100 Subject: [PATCH] added cycletime + fix last frame --- src/TLC59731Analyzer.cpp | 273 ++++++++++++++------------------------- src/TLC59731Analyzer.h | 54 ++++---- 2 files changed, 127 insertions(+), 200 deletions(-) diff --git a/src/TLC59731Analyzer.cpp b/src/TLC59731Analyzer.cpp index d2a6895..8a52135 100644 --- a/src/TLC59731Analyzer.cpp +++ b/src/TLC59731Analyzer.cpp @@ -28,189 +28,110 @@ void TLC59731Analyzer::WorkerThread() mSampleRateHz = GetSampleRate(); mSerial = GetAnalyzerChannelData( mSettings.mInputChannel ); + bool run = 1; - while( SamplesToNS( mSerial->GetSampleOfNextEdge() - mSerial->GetSampleNumber() ) < TLL_MIN || mSerial->GetBitState() == BIT_HIGH ) + while( run ) { - mSerial->AdvanceToNextEdge(); - } - while( mSerial->GetBitState() != BIT_HIGH ) - { - mSerial->AdvanceToNextEdge(); // wait for rising - } - - U32 data = 0; - // measure cycletime - // start of bit - U64 SoB = mSerial->GetSampleNumber(); - U64 starting_sample = SoB; - mSerial->AdvanceToNextEdge(); // falling edge - if( SamplesToNS( mSerial->GetSampleOfNextEdge() - SoB ) <= MAX_CYCLETIME ) - { - mSerial->AdvanceToNextEdge(); // rising edge of second 0 - cycleTime = SamplesToNS( mSerial->GetSampleNumber() - SoB ); - SoB = mSerial->GetSampleNumber(); - } - - while( 1 ) - { - mSerial->AdvanceToNextEdge(); // falling edge - if( SamplesToNS( mSerial->GetSampleOfNextEdge() - SoB ) < cycleTime / 2.0 + 1000 ) + while( SamplesToNS( mSerial->GetSampleOfNextEdge() - mSerial->GetSampleNumber() ) < TLL_MIN || mSerial->GetBitState() == BIT_HIGH ) { - // 1 - data <<= 1; - data |= 1; - mSerial->AdvanceToNextEdge(); // rising edge of second pulse of 1 - mSerial->AdvanceToNextEdge(); // falling edge of second ṕulse of 1 - } - else - { - // 0 - data <<= 1; - } - if( SamplesToNS( mSerial->GetSampleOfNextEdge() - SoB ) < cycleTime * 2 ) - { - mSerial->AdvanceToNextEdge(); // rising edge of next bit - SoB = mSerial->GetSampleNumber(); - } - - else if( SamplesToNS( mSerial->GetSampleOfNextEdge() - SoB ) < cycleTime * 5.5 || - SamplesToNS( mSerial->GetSampleOfNextEdge() - SoB ) > cycleTime * 8 ) - { - // EOS end of sequence - Frame frame; - frame.mData1 = data; - frame.mFlags = 0; - frame.mStartingSampleInclusive = starting_sample; - frame.mEndingSampleInclusive = mSerial->GetSampleNumber(); - mResults->AddFrame( frame ); - ReportProgress( frame.mEndingSampleInclusive ); - - FrameV2 framev2; - framev2.AddInteger("data", frame.mData1); - mResults->AddFrameV2(framev2, "ledData", frame.mStartingSampleInclusive, frame.mEndingSampleInclusive); - mResults->CommitResults(); - - data = 0; mSerial->AdvanceToNextEdge(); + } + while( mSerial->GetBitState() != BIT_HIGH ) + { + mSerial->AdvanceToNextEdge(); // wait for rising + } + + U32 data = 0; + U32 bitCtr = 1; + // measure cycletime + // start of bit + U64 SoB = mSerial->GetSampleNumber(); + U64 starting_sample = SoB; + mSerial->AdvanceToNextEdge(); // falling edge + if( SamplesToNS( mSerial->GetSampleOfNextEdge() - SoB ) <= MAX_CYCLETIME ) + { + mSerial->AdvanceToNextEdge(); // rising edge of second 0 + cycleTime = SamplesToNS( mSerial->GetSampleNumber() - SoB ); SoB = mSerial->GetSampleNumber(); - starting_sample = SoB; + } + + while( 1 ) + { + mSerial->AdvanceToNextEdge(); // falling edge + // test if bits for one exist + if( mSerial->WouldAdvancingCauseTransition( NSToSamples( cycleTime / 2 ) ) ) + { + // 1 + data <<= 1; + data |= 1; + mSerial->AdvanceToNextEdge(); // rising edge of second pulse of 1 + mSerial->AdvanceToNextEdge(); // falling edge of second pulse of 1 + } + else + { + // 0 + data <<= 1; + } + + if( !mSerial->WouldAdvancingCauseTransition( NSToSamples( 8 * cycleTime ) ) ) + { + Frame frame; + frame.mData1 = data; + frame.mFlags = 0; + frame.mStartingSampleInclusive = starting_sample; + frame.mEndingSampleInclusive = mSerial->GetSampleNumber(); + mResults->AddFrame( frame ); + ReportProgress( frame.mEndingSampleInclusive ); + + FrameV2 framev2; + framev2.AddInteger( "data", frame.mData1 ); + framev2.AddInteger( "cycletime", cycleTime ); + mResults->AddFrameV2( framev2, "ledData", frame.mStartingSampleInclusive, frame.mEndingSampleInclusive ); + mResults->CommitResults(); + + mSerial->Advance( NSToSamples( 8 * cycleTime ) ); + + if( !mSerial->DoMoreTransitionsExistInCurrentData() ) + { + run = 0; + } + + break; + } + + + if( SamplesToNS( mSerial->GetSampleOfNextEdge() - SoB ) < cycleTime * 2 ) + { + mSerial->AdvanceToNextEdge(); // rising edge of next bit + SoB = mSerial->GetSampleNumber(); + } + + else if( SamplesToNS( mSerial->GetSampleOfNextEdge() - SoB ) < cycleTime * 5.5 ) + // || + // SamplesToNS( mSerial->GetSampleOfNextEdge() - SoB ) > cycleTime * 8 ) + { + // EOS end of sequence + Frame frame; + frame.mData1 = data; + frame.mFlags = 0; + frame.mStartingSampleInclusive = starting_sample; + frame.mEndingSampleInclusive = mSerial->GetSampleNumber(); + mResults->AddFrame( frame ); + ReportProgress( frame.mEndingSampleInclusive ); + + FrameV2 framev2; + framev2.AddInteger( "data", frame.mData1 ); + framev2.AddInteger( "cycletime", cycleTime ); + mResults->AddFrameV2( framev2, "ledData", frame.mStartingSampleInclusive, frame.mEndingSampleInclusive ); + mResults->CommitResults(); + + data = 0; + mSerial->AdvanceToNextEdge(); + SoB = mSerial->GetSampleNumber(); + starting_sample = SoB; + } } } - - - // if( mSerial->GetBitState() == BIT_LOW ) - // mSerial->AdvanceToNextEdge(); - - // U32 samples_per_bit = mSampleRateHz / mSettings.mBitRate; - // U32 samples_to_first_center_of_first_data_bit = U32( 1.5 * double( mSampleRateHz ) / double( mSettings.mBitRate ) ); - - // bool firstRun = 1; - // U64 startEdge, starting_sample; - // U8 bits = 0; - - // while( 1 ) - // { - // if( firstRun ) - // { - // startEdge = mSerial->GetSampleNumber(); - // starting_sample = startEdge; - // mSerial->AdvanceToNextEdge(); // falling edge - // cycleTime = SamplesToNS( mSerial->GetSampleOfNextEdge() - startEdge ); - // firstRun = false; - // bits = 1; - // } - // else - // { - // } - // U32 data = 0; - // U8 bits = 2; - // mSerial->AdvanceToNextEdge(); // rising edge - // startEdge = mSerial->GetSampleNumber(); - // mSerial->AdvanceToNextEdge(); // falling edge // second zero - - // while( 1 ) - // { - // if( SamplesToNS( mSerial->GetSampleOfNextEdge() - startEdge ) < cycleTime / 2 ) - // { - // // one - // data <<= 1; - // data |= 1; - // bits += 1; - // mResults->AddMarker( startEdge, AnalyzerResults::One, mSettings.mInputChannel ); - // } - // else if( SamplesToNS( mSerial->GetSampleOfNextEdge() - startEdge ) < cycleTime * 2 ) - // { - // // zero - // data <<= 1; - // bits += 1; - // mResults->AddMarker( startEdge, AnalyzerResults::Zero, mSettings.mInputChannel ); - // } - // else if( SamplesToNS( mSerial->GetSampleOfNextEdge() - startEdge ) < cycleTime * 5.5 ) - // { - // } - // else if( SamplesToNS( mSerial->GetSampleOfNextEdge() - startEdge ) > cycleTime * 8 ) - // { - // // cleanup - // } - - // if( bits == 32 ) - // { - // break; - // } - // else - // { - // mSerial->AdvanceToNextEdge(); // rising edge - // startEdge = mSerial->GetSampleOfNextEdge(); - // mSerial->AdvanceToNextEdge(); // falling edge - // } - // } - // Frame frame; - // frame.mData1 = data; - // frame.mFlags = 0; - // frame.mStartingSampleInclusive = starting_sample; - // frame.mEndingSampleInclusive = mSerial->GetSampleNumber(); - - // mResults->AddFrame( frame ); - // mResults->CommitResults(); - // ReportProgress( frame.mEndingSampleInclusive ); - // } - - // for( ;; ) - // { - // U8 data = 0; - // U8 mask = 1 << 7; - - // mSerial->AdvanceToNextEdge(); // falling edge -- beginning of the start bit - - // U64 starting_sample = mSerial->GetSampleNumber(); - - // // mSerial->Advance( samples_to_first_center_of_first_data_bit ); - - // for( U32 i = 0; i < 8; i++ ) - // { - // // let's put a dot exactly where we sample this bit: - // mResults->AddMarker( mSerial->GetSampleNumber(), AnalyzerResults::Dot, mSettings.mInputChannel ); - - // if( mSerial->GetBitState() == BIT_HIGH ) - // data |= mask; - - // // mSerial->Advance( samples_per_bit ); - - // mask = mask >> 1; - // } - - - // // we have a byte to save. - // Frame frame; - // frame.mData1 = data; - // frame.mFlags = 0; - // frame.mStartingSampleInclusive = starting_sample; - // frame.mEndingSampleInclusive = mSerial->GetSampleNumber(); - - // mResults->AddFrame( frame ); - // mResults->CommitResults(); - // ReportProgress( frame.mEndingSampleInclusive ); - // } } bool TLC59731Analyzer::NeedsRerun() diff --git a/src/TLC59731Analyzer.h b/src/TLC59731Analyzer.h index 17ef489..618f227 100644 --- a/src/TLC59731Analyzer.h +++ b/src/TLC59731Analyzer.h @@ -14,38 +14,44 @@ class ANALYZER_EXPORT TLC59731Analyzer : public Analyzer2 { -public: - TLC59731Analyzer(); - virtual ~TLC59731Analyzer(); + public: + TLC59731Analyzer(); + virtual ~TLC59731Analyzer(); - virtual void SetupResults(); - virtual void WorkerThread(); + virtual void SetupResults(); + virtual void WorkerThread(); - virtual U32 GenerateSimulationData( U64 newest_sample_requested, U32 sample_rate, SimulationChannelDescriptor** simulation_channels ); - virtual U32 GetMinimumSampleRateHz(); + virtual U32 GenerateSimulationData( U64 newest_sample_requested, U32 sample_rate, SimulationChannelDescriptor** simulation_channels ); + virtual U32 GetMinimumSampleRateHz(); - virtual const char* GetAnalyzerName() const; - virtual bool NeedsRerun(); - U64 SamplesToNS(U64 samples) { return (samples * 1000000000) / mSampleRateHz; } + virtual const char* GetAnalyzerName() const; + virtual bool NeedsRerun(); + U64 SamplesToNS( U64 samples ) + { + return ( samples * 1000000000 ) / mSampleRateHz; + } + U32 NSToSamples( U64 time ) + { + return ( time * mSampleRateHz ) / 1000000000; + } -protected: //vars - TLC59731AnalyzerSettings mSettings; - std::unique_ptr mResults; - AnalyzerChannelData* mSerial; + protected: // vars + TLC59731AnalyzerSettings mSettings; + std::unique_ptr mResults; + AnalyzerChannelData* mSerial; - TLC59731SimulationDataGenerator mSimulationDataGenerator; - bool mSimulationInitilized; - - //Serial analysis vars: - U32 mSampleRateHz; - U64 cycleTime; - U32 mStartOfStopBitOffset; - U32 mEndOfStopBitOffset; + TLC59731SimulationDataGenerator mSimulationDataGenerator; + bool mSimulationInitilized; + // Serial analysis vars: + U32 mSampleRateHz; + U64 cycleTime; + U32 mStartOfStopBitOffset; + U32 mEndOfStopBitOffset; }; extern "C" ANALYZER_EXPORT const char* __cdecl GetAnalyzerName(); -extern "C" ANALYZER_EXPORT Analyzer* __cdecl CreateAnalyzer( ); +extern "C" ANALYZER_EXPORT Analyzer* __cdecl CreateAnalyzer(); extern "C" ANALYZER_EXPORT void __cdecl DestroyAnalyzer( Analyzer* analyzer ); -#endif //TLC59731_ANALYZER_H +#endif // TLC59731_ANALYZER_H