Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: ngscopeclient/scopehal
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: 51ffa1c23d11
Choose a base ref
...
head repository: ngscopeclient/scopehal
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: e3f82a2c0d99
Choose a head ref
  • 3 commits
  • 8 files changed
  • 1 contributor

Commits on May 17, 2020

  1. Copy the full SHA
    ec0520d View commit details
  2. Copy the full SHA
    0d1a78b View commit details
  3. Copy the full SHA
    e3f82a2 View commit details
15 changes: 13 additions & 2 deletions scopehal/Waveform.h
Original file line number Diff line number Diff line change
@@ -129,6 +129,18 @@ class WaveformBase
m_offsets.resize(size);
m_durations.resize(size);
}

/**
@brief Copies offsets/durations from one waveform to another.
Must have been resized to match rhs first.
*/
void CopyTimestamps(const WaveformBase* rhs)
{
size_t len = sizeof(int64_t) * rhs->m_offsets.size();
memcpy((void*)&m_offsets[0], (void*)&rhs->m_offsets[0], len);
memcpy((void*)&m_durations[0], (void*)&rhs->m_durations[0], len);
}
};

/**
@@ -157,11 +169,10 @@ class Waveform : public WaveformBase
}
};

//we need this to avoid problems with the bitfield packing used by vector<bool>
typedef Waveform<EmptyConstructorWrapper<bool> > DigitalWaveform;
typedef Waveform<EmptyConstructorWrapper<float>> AnalogWaveform;

typedef Waveform< std::vector<bool> > DigitalBusWaveform;
typedef Waveform<float> AnalogWaveform;
typedef Waveform<char> AsciiWaveform;

#endif
40 changes: 21 additions & 19 deletions scopeprotocols/ACCoupleDecoder.cpp
Original file line number Diff line number Diff line change
@@ -97,35 +97,37 @@ void ACCoupleDecoder::Refresh()
SetData(NULL);
return;
}
AnalogCapture* din = dynamic_cast<AnalogCapture*>(m_channels[0]->GetData());
auto din = dynamic_cast<AnalogWaveform*>(m_channels[0]->GetData());
if(!din)
{
SetData(NULL);
return;
}

//We need meaningful data
if(din->GetDepth() == 0)
auto len = din->m_samples.size() ;
if(len == 0)
{
SetData(NULL);
return;
}

//Find the average of our samples (assume data is DC balanced)
double sum = 0;
int64_t count = 0;
for(auto sample : *din)
{
sum += sample;
count ++;
}
double offset = sum / count;
LogTrace("ACCoupleDecoder: DC offset is %.3f\n", offset);
float average = Measurement::GetAvgVoltage(din);

//Subtract all of our samples
AnalogCapture* cap = new AnalogCapture;
for(size_t i=0; i<din->m_samples.size(); i++)
{
AnalogSample sin = din->m_samples[i];
cap->m_samples.push_back(AnalogSample(sin.m_offset, sin.m_duration, sin.m_sample - offset));
}
SetData(cap);
auto cap = new AnalogWaveform;
cap->Resize(len);
cap->CopyTimestamps(din);
float* fsrc = (float*)__builtin_assume_aligned(&din->m_samples[0], 16);
float* fdst = (float*)__builtin_assume_aligned(&cap->m_samples[0], 16);
for(size_t i=0; i<len; i++)
fdst[i] = fsrc[i] - average;

//Copy our time scales from the input
cap->m_timescale = din->m_timescale;
cap->m_timescale = din->m_timescale;
cap->m_startTimestamp = din->m_startTimestamp;
cap->m_startPicoseconds = din->m_startPicoseconds;

SetData(cap);
}
4 changes: 2 additions & 2 deletions scopeprotocols/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -2,13 +2,13 @@ include_directories(${GTKMM_INCLUDE_DIRS} ${SIGCXX_INCLUDE_DIRS})
link_directories(${GTKMM_LIBRARY_DIRS} ${SIGCXX_LIBRARY_DIRS})

set(SCOPEPROTOCOLS_SOURCES
#ACCoupleDecoder.cpp
ACCoupleDecoder.cpp
#ADL5205Decoder.cpp
#BaseMeasurementDecoder.cpp
#CANDecoder.cpp
ClockJitterDecoder.cpp
ClockRecoveryDecoder.cpp
#DCOffsetDecoder.cpp
DCOffsetDecoder.cpp
#DDR3Decoder.cpp
DifferenceDecoder.cpp
#DramRefreshActivateMeasurementDecoder.cpp
23 changes: 15 additions & 8 deletions scopeprotocols/DCOffsetDecoder.cpp
Original file line number Diff line number Diff line change
@@ -105,10 +105,16 @@ void DCOffsetDecoder::Refresh()
SetData(NULL);
return;
}
AnalogCapture* din = dynamic_cast<AnalogCapture*>(m_channels[0]->GetData());
auto din = dynamic_cast<AnalogWaveform*>(m_channels[0]->GetData());
if(din == NULL)
{
SetData(NULL);
return;
}

//We need meaningful data
if(din->GetDepth() == 0)
size_t len = din->m_samples.size();
if(len == 0)
{
SetData(NULL);
return;
@@ -117,12 +123,13 @@ void DCOffsetDecoder::Refresh()
float offset = m_parameters[m_offsetname].GetFloatVal();

//Subtract all of our samples
AnalogCapture* cap = new AnalogCapture;
for(size_t i=0; i<din->m_samples.size(); i++)
{
AnalogSample sin = din->m_samples[i];
cap->m_samples.push_back(AnalogSample(sin.m_offset, sin.m_duration, sin.m_sample + offset));
}
auto cap = new AnalogWaveform;
cap->Resize(len);
cap->CopyTimestamps(din);
float* out = (float*)__builtin_assume_aligned(&cap->m_samples[0], 16);
float* a = (float*)__builtin_assume_aligned(&din->m_samples[0], 16);
for(size_t i=0; i<len; i++)
out[i] = a[i] + offset;
SetData(cap);

//Copy our time scales from the input
3 changes: 1 addition & 2 deletions scopeprotocols/DifferenceDecoder.cpp
Original file line number Diff line number Diff line change
@@ -142,8 +142,7 @@ void DifferenceDecoder::Refresh()
//Heap blocks are guaranteed aligned on 64-bit glibc, so this might break on 32 bit.
//Does anyone still use that?
cap->Resize(len);
memcpy(&cap->m_offsets[0], &din_p->m_offsets[0], sizeof(int64_t)*len);
memcpy(&cap->m_durations[0], &din_p->m_durations[0], sizeof(int64_t)*len);
cap->CopyTimestamps(din_p);
float* out = (float*)__builtin_assume_aligned(&cap->m_samples[0], 16);
float* a = (float*)__builtin_assume_aligned(&din_p->m_samples[0], 16);
float* b = (float*)__builtin_assume_aligned(&din_n->m_samples[0], 16);
2 changes: 1 addition & 1 deletion scopeprotocols/Ethernet100BaseTDecoder.cpp
Original file line number Diff line number Diff line change
@@ -96,7 +96,7 @@ void Ethernet100BaseTDecoder::Refresh()
//const int64_t jitter_tol = 1500;

//Logical voltage of each point after some hysteresis
vector<int> voltages;
vector<EmptyConstructorWrapper<int>> voltages;
size_t ilen = din->m_samples.size();
voltages.resize(ilen);
int oldstate = GetState(din->m_samples[0]);
6 changes: 2 additions & 4 deletions scopeprotocols/scopeprotocols.cpp
Original file line number Diff line number Diff line change
@@ -40,18 +40,16 @@
*/
void ScopeProtocolStaticInit()
{
/*
AddDecoderClass(ACCoupleDecoder);
/*
AddDecoderClass(ADL5205Decoder);
AddDecoderClass(BaseMeasurementDecoder);
AddDecoderClass(CANDecoder);
*/
AddDecoderClass(ClockRecoveryDecoder);
AddDecoderClass(ClockJitterDecoder);
/*
AddDecoderClass(DCOffsetDecoder);
AddDecoderClass(DDR3Decoder);
*/
//AddDecoderClass(DDR3Decoder);
AddDecoderClass(DifferenceDecoder);
/*
AddDecoderClass(DramRefreshActivateMeasurementDecoder);
6 changes: 2 additions & 4 deletions scopeprotocols/scopeprotocols.h
Original file line number Diff line number Diff line change
@@ -40,18 +40,16 @@
#include "../scopehal/ProtocolDecoder.h"
//#include "../scopehal/StateDecoder.h"

/*
#include "ACCoupleDecoder.h"
/*
#include "ADL5205Decoder.h"
#include "BaseMeasurementDecoder.h"
#include "CANDecoder.h"
*/
#include "ClockJitterDecoder.h"
#include "ClockRecoveryDecoder.h"
/*
#include "DCOffsetDecoder.h"
#include "DDR3Decoder.h"
*/
//#include "DDR3Decoder.h"
#include "DifferenceDecoder.h"
/*
#include "DramRefreshActivateMeasurementDecoder.h"