Also used recently added #define flag to disable or enable the protocol search code, based on the SDK version. Ideally this will allow the same code to compile for the legacy SDK or the latest SDK.
114 lines
2.7 KiB
C++
114 lines
2.7 KiB
C++
#include "SimpleSerialAnalyzer.h"
|
|
#include "SimpleSerialAnalyzerSettings.h"
|
|
#include <AnalyzerChannelData.h>
|
|
|
|
SimpleSerialAnalyzer::SimpleSerialAnalyzer()
|
|
: Analyzer2(),
|
|
mSettings( new SimpleSerialAnalyzerSettings() ),
|
|
mSimulationInitilized( false )
|
|
{
|
|
SetAnalyzerSettings( mSettings.get() );
|
|
}
|
|
|
|
SimpleSerialAnalyzer::~SimpleSerialAnalyzer()
|
|
{
|
|
KillThread();
|
|
}
|
|
|
|
void SimpleSerialAnalyzer::SetupResults()
|
|
{
|
|
mResults.reset( new SimpleSerialAnalyzerResults( this, mSettings.get() ) );
|
|
SetAnalyzerResults( mResults.get() );
|
|
mResults->AddChannelBubblesWillAppearOn( mSettings->mInputChannel );
|
|
}
|
|
|
|
void SimpleSerialAnalyzer::WorkerThread()
|
|
{
|
|
mSampleRateHz = GetSampleRate();
|
|
|
|
mSerial = GetAnalyzerChannelData( mSettings->mInputChannel );
|
|
|
|
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 ) );
|
|
|
|
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 SimpleSerialAnalyzer::NeedsRerun()
|
|
{
|
|
return false;
|
|
}
|
|
|
|
U32 SimpleSerialAnalyzer::GenerateSimulationData( U64 minimum_sample_index, U32 device_sample_rate, SimulationChannelDescriptor** simulation_channels )
|
|
{
|
|
if( mSimulationInitilized == false )
|
|
{
|
|
mSimulationDataGenerator.Initialize( GetSimulationSampleRate(), mSettings.get() );
|
|
mSimulationInitilized = true;
|
|
}
|
|
|
|
return mSimulationDataGenerator.GenerateSimulationData( minimum_sample_index, device_sample_rate, simulation_channels );
|
|
}
|
|
|
|
U32 SimpleSerialAnalyzer::GetMinimumSampleRateHz()
|
|
{
|
|
return mSettings->mBitRate * 4;
|
|
}
|
|
|
|
const char* SimpleSerialAnalyzer::GetAnalyzerName() const
|
|
{
|
|
return "Simple Serial";
|
|
}
|
|
|
|
const char* GetAnalyzerName()
|
|
{
|
|
return "Simple Serial";
|
|
}
|
|
|
|
Analyzer* CreateAnalyzer()
|
|
{
|
|
return new SimpleSerialAnalyzer();
|
|
}
|
|
|
|
void DestroyAnalyzer( Analyzer* analyzer )
|
|
{
|
|
delete analyzer;
|
|
} |