111 lines
2.6 KiB
C++
111 lines
2.6 KiB
C++
|
#include "SimpleSerialAnalyzer.h"
|
||
|
#include "SimpleSerialAnalyzerSettings.h"
|
||
|
#include <AnalyzerChannelData.h>
|
||
|
|
||
|
SimpleSerialAnalyzer::SimpleSerialAnalyzer()
|
||
|
: Analyzer(),
|
||
|
mSettings( new SimpleSerialAnalyzerSettings() ),
|
||
|
mSimulationInitilized( false )
|
||
|
{
|
||
|
SetAnalyzerSettings( mSettings.get() );
|
||
|
}
|
||
|
|
||
|
SimpleSerialAnalyzer::~SimpleSerialAnalyzer()
|
||
|
{
|
||
|
KillThread();
|
||
|
}
|
||
|
|
||
|
void SimpleSerialAnalyzer::WorkerThread()
|
||
|
{
|
||
|
mResults.reset( new SimpleSerialAnalyzerResults( this, mSettings.get() ) );
|
||
|
SetAnalyzerResults( mResults.get() );
|
||
|
mResults->AddChannelBubblesWillAppearOn( mSettings->mInputChannel );
|
||
|
|
||
|
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;
|
||
|
}
|