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: e57fc6646c85
Choose a base ref
...
head repository: ngscopeclient/scopehal
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: d8047b4ff3aa
Choose a head ref
  • 1 commit
  • 9 files changed
  • 1 contributor

Commits on May 17, 2020

  1. Copy the full SHA
    d8047b4 View commit details
10 changes: 5 additions & 5 deletions scopeprotocols/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -29,11 +29,11 @@ set(SCOPEPROTOCOLS_SOURCES
#JtagDecoder.cpp
#MDIODecoder.cpp
MovingAverageDecoder.cpp
#ParallelBusDecoder.cpp
#PeriodMeasurementDecoder.cpp
#RiseMeasurementDecoder.cpp
#SincInterpolationDecoder.cpp
#SPIDecoder.cpp
ParallelBusDecoder.cpp
PeriodMeasurementDecoder.cpp
RiseMeasurementDecoder.cpp
SincInterpolationDecoder.cpp
SPIDecoder.cpp
ThresholdDecoder.cpp
TMDSDecoder.cpp
#TopMeasurementDecoder.cpp
36 changes: 12 additions & 24 deletions scopeprotocols/ParallelBusDecoder.cpp
Original file line number Diff line number Diff line change
@@ -107,7 +107,7 @@ void ParallelBusDecoder::Refresh()
m_width = m_parameters[m_widthname].GetIntVal();

//Make sure we have an input for each channel in use
vector<DigitalCapture*> inputs;
vector<DigitalWaveform*> inputs;
for(int i=0; i<m_width; i++)
{
if(m_channels[i] == NULL)
@@ -116,7 +116,7 @@ void ParallelBusDecoder::Refresh()
SetData(NULL);
return;
}
DigitalCapture* din = dynamic_cast<DigitalCapture*>(m_channels[i]->GetData());
auto din = dynamic_cast<DigitalWaveform*>(m_channels[i]->GetData());
if(din == NULL)
{
LogDebug("err 2\n");
@@ -131,33 +131,21 @@ void ParallelBusDecoder::Refresh()
return;
}

//Figure out length of the output
size_t len = inputs[0]->m_samples.size();
for(int j=1; j<m_width; j++)
len = min(len, inputs[j]->m_samples.size());

//Merge all of our samples
//TODO: handle variable sample rates etc
DigitalBusCapture* cap = new DigitalBusCapture;
cap->m_samples.resize(inputs[0]->m_samples.size());
auto cap = new DigitalBusWaveform;
cap->Resize(len);
cap->CopyTimestamps(inputs[0]);
#pragma omp parallel for
for(size_t i=0; i<inputs[0]->m_samples.size(); i++)
for(size_t i=0; i<len; i++)
{
vector<bool> data;
bool end = false;
for(int j=0; j<m_width; j++)
{
if(inputs[j]->GetDepth() <= i)
{
end = true;
break;
}

data.push_back(inputs[j]->m_samples[i].m_sample);
}

if(!end)
{
cap->m_samples[i] = DigitalBusSample(
inputs[0]->m_samples[i].m_offset,
inputs[0]->m_samples[i].m_duration,
data);
}
cap->m_samples[i].push_back(inputs[j]->m_samples[i]);
}
SetData(cap);

9 changes: 5 additions & 4 deletions scopeprotocols/PeriodMeasurementDecoder.cpp
Original file line number Diff line number Diff line change
@@ -107,7 +107,7 @@ void PeriodMeasurementDecoder::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);
@@ -135,7 +135,7 @@ void PeriodMeasurementDecoder::Refresh()
}

//Create the output
AnalogCapture* cap = new AnalogCapture;
auto cap = new AnalogWaveform;

double rmin = FLT_MAX;
double rmax = 0;
@@ -147,8 +147,9 @@ void PeriodMeasurementDecoder::Refresh()
int64_t end = edges[i+2];

double delta = end - start;
cap->m_samples.push_back(AnalogSample(
start, delta, delta));
cap->m_offsets.push_back(start);
cap->m_durations.push_back(delta);
cap->m_samples.push_back(delta);

rmin = min(rmin, delta);
rmax = max(rmax, delta);
13 changes: 7 additions & 6 deletions scopeprotocols/RiseMeasurementDecoder.cpp
Original file line number Diff line number Diff line change
@@ -118,7 +118,7 @@ void RiseMeasurementDecoder::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);
@@ -143,7 +143,7 @@ void RiseMeasurementDecoder::Refresh()
float vend = base + m_parameters[m_endname].GetFloatVal()*delta;

//Create the output
AnalogCapture* cap = new AnalogCapture;
auto cap = new AnalogWaveform;

float last = 1e20;
double tedge = 0;
@@ -154,11 +154,10 @@ void RiseMeasurementDecoder::Refresh()
int64_t tlast = 0;

//LogDebug("vstart = %.3f, vend = %.3f\n", vstart, vend);

for(size_t i=0; i < din->m_samples.size(); i++)
for(size_t i=0; i < len; i++)
{
float cur = din->m_samples[i];
int64_t tnow = din->m_samples[i].m_offset * din->m_timescale;
int64_t tnow = din->m_offsets[i] * din->m_timescale;

//Find start of edge
if(state == 0)
@@ -178,7 +177,9 @@ void RiseMeasurementDecoder::Refresh()
double tlerp = tnow - din->m_timescale + Measurement::InterpolateTime(din, i-1, vend);
double dt = tlerp - tedge;

cap->m_samples.push_back(AnalogSample(tlast, tnow-tlast, dt));
cap->m_offsets.push_back(tlast);
cap->m_durations.push_back(tnow-tlast);
cap->m_samples.push_back(dt);
tlast = tnow;

if(dt < fmin)
71 changes: 34 additions & 37 deletions scopeprotocols/SPIDecoder.cpp
Original file line number Diff line number Diff line change
@@ -35,6 +35,7 @@

#include "../scopehal/scopehal.h"
#include "SPIDecoder.h"
#include <algorithm>

using namespace std;

@@ -97,17 +98,17 @@ void SPIDecoder::Refresh()
return;
}
}
DigitalCapture* clk = dynamic_cast<DigitalCapture*>(m_channels[0]->GetData());
DigitalCapture* csn = dynamic_cast<DigitalCapture*>(m_channels[1]->GetData());
DigitalCapture* data = dynamic_cast<DigitalCapture*>(m_channels[2]->GetData());
auto clk = dynamic_cast<DigitalWaveform*>(m_channels[0]->GetData());
auto csn = dynamic_cast<DigitalWaveform*>(m_channels[1]->GetData());
auto data = dynamic_cast<DigitalWaveform*>(m_channels[2]->GetData());
if( (clk == NULL) || (csn == NULL) || (data == NULL) )
{
SetData(NULL);
return;
}

//Create the capture
SPICapture* cap = new SPICapture;
auto cap = new SPIWaveform;
cap->m_timescale = clk->m_timescale;
cap->m_startTimestamp = clk->m_startTimestamp;
cap->m_startPicoseconds = clk->m_startPicoseconds;
@@ -131,14 +132,14 @@ void SPIDecoder::Refresh()
int64_t bytestart = 0;
bool first = false;

for(size_t i=0; i<clk->m_samples.size(); i++)
size_t len = clk->m_samples.size();
len = min(len, csn->m_samples.size());
len = min(len, data->m_samples.size());
for(size_t i=0; i<len; i++)
{
if( (i >= csn->m_samples.size()) || (i >= data->m_samples.size()) )
break;

bool cur_cs = csn->m_samples[i].m_sample;
bool cur_clk = clk->m_samples[i].m_sample;
bool cur_data = data->m_samples[i].m_sample;
bool cur_cs = csn->m_samples[i];
bool cur_clk = clk->m_samples[i];
bool cur_data = data->m_samples[i];

switch(state)
{
@@ -149,7 +150,7 @@ void SPIDecoder::Refresh()
state = STATE_SELECTED_CLKLO;
current_byte = 0;
bitcount = 0;
bytestart = clk->m_samples[i].m_offset;
bytestart = clk->m_offsets[i];
first = true;
}
break;
@@ -163,13 +164,12 @@ void SPIDecoder::Refresh()
//Add a "chip selected" event
if(first)
{
cap->m_samples.push_back(SPISample(
bytestart,
clk->m_samples[i].m_offset - bytestart,
SPISymbol(SPISymbol::TYPE_SELECT, 0)));
cap->m_offsets.push_back(bytestart);
cap->m_offsets.push_back(clk->m_offsets[i] - bytestart);
cap->m_samples.push_back(SPISymbol(SPISymbol::TYPE_SELECT, 0));
first = false;
}
bytestart = clk->m_samples[i].m_offset;
bytestart = clk->m_offsets[i];
}

state = STATE_SELECTED_CLKHI;
@@ -183,27 +183,25 @@ void SPIDecoder::Refresh()

if(bitcount == 8)
{
cap->m_samples.push_back(SPISample(
bytestart,
clk->m_samples[i].m_offset - bytestart,
SPISymbol(SPISymbol::TYPE_DATA, current_byte)));
cap->m_offsets.push_back(bytestart);
cap->m_offsets.push_back(clk->m_offsets[i] - bytestart);
cap->m_samples.push_back(SPISymbol(SPISymbol::TYPE_DATA, current_byte));

bitcount = 0;
current_byte = 0;
bytestart = clk->m_samples[i].m_offset;
bytestart = clk->m_offsets[i];
}
}

//end of packet
//TODO: error if a byte is truncated
else if(cur_cs)
{
cap->m_samples.push_back(SPISample(
bytestart,
clk->m_samples[i].m_offset - bytestart,
SPISymbol(SPISymbol::TYPE_DESELECT, 0)));
cap->m_offsets.push_back(bytestart);
cap->m_offsets.push_back(clk->m_offsets[i] - bytestart);
cap->m_samples.push_back(SPISymbol(SPISymbol::TYPE_DESELECT, 0));

bytestart = clk->m_samples[i].m_offset;
bytestart = clk->m_offsets[i];
state = STATE_DESELECTED;
}
break;
@@ -217,12 +215,11 @@ void SPIDecoder::Refresh()
//TODO: error if a byte is truncated
else if(cur_cs)
{
cap->m_samples.push_back(SPISample(
bytestart,
clk->m_samples[i].m_offset - bytestart,
SPISymbol(SPISymbol::TYPE_DESELECT, 0)));
cap->m_offsets.push_back(bytestart);
cap->m_offsets.push_back(clk->m_offsets[i] - bytestart);
cap->m_samples.push_back(SPISymbol(SPISymbol::TYPE_DESELECT, 0));

bytestart = clk->m_samples[i].m_offset;
bytestart = clk->m_offsets[i];
state = STATE_DESELECTED;
}

@@ -235,10 +232,10 @@ void SPIDecoder::Refresh()

Gdk::Color SPIDecoder::GetColor(int i)
{
SPICapture* capture = dynamic_cast<SPICapture*>(GetData());
auto capture = dynamic_cast<SPIWaveform*>(GetData());
if(capture != NULL)
{
const SPISymbol& s = capture->m_samples[i].m_sample;
const SPISymbol& s = capture->m_samples[i];
switch(s.m_stype)
{
case SPISymbol::TYPE_SELECT:
@@ -258,10 +255,10 @@ Gdk::Color SPIDecoder::GetColor(int i)

string SPIDecoder::GetText(int i)
{
SPICapture* capture = dynamic_cast<SPICapture*>(GetData());
auto capture = dynamic_cast<SPIWaveform*>(GetData());
if(capture != NULL)
{
const SPISymbol& s = capture->m_samples[i].m_sample;
const SPISymbol& s = capture->m_samples[i];
char tmp[32];
switch(s.m_stype)
{
@@ -270,7 +267,7 @@ string SPIDecoder::GetText(int i)
case SPISymbol::TYPE_DESELECT:
return "DESELECT";
case SPISymbol::TYPE_DATA:
snprintf(tmp, sizeof(tmp), "%02x", capture->m_samples[i].m_sample.m_data);
snprintf(tmp, sizeof(tmp), "%02x", s.m_data);
return string(tmp);
case SPISymbol::TYPE_ERROR:
default:
6 changes: 4 additions & 2 deletions scopeprotocols/SPIDecoder.h
Original file line number Diff line number Diff line change
@@ -49,6 +49,9 @@ class SPISymbol
TYPE_ERROR
};

SPISymbol()
{}

SPISymbol(stype t,uint8_t d)
: m_stype(t)
, m_data(d)
@@ -63,8 +66,7 @@ class SPISymbol
}
};

typedef OscilloscopeSample<SPISymbol> SPISample;
typedef CaptureChannel<SPISymbol> SPICapture;
typedef Waveform<SPISymbol> SPIWaveform;

class SPIDecoder : public ProtocolDecoder
{
Loading