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

Commits on May 18, 2020

  1. Copy the full SHA
    e1148b1 View commit details
49 changes: 29 additions & 20 deletions scopeprotocols/ADL5205Decoder.cpp
Original file line number Diff line number Diff line change
@@ -97,44 +97,52 @@ void ADL5205Decoder::Refresh()
SetData(NULL);
return;
}
SPICapture* din = dynamic_cast<SPICapture*>(m_channels[0]->GetData());
auto din = dynamic_cast<SPIWaveform*>(m_channels[0]->GetData());
if(!din)
{
SetData(NULL);
return;
}

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

//Loop over the SPI events and process stuff
ADL5205Capture* cap = new ADL5205Capture;
auto cap = new ADL5205Waveform;
cap->m_timescale = din->m_timescale;
cap->m_startTimestamp = din->m_startTimestamp;
cap->m_startPicoseconds = din->m_startPicoseconds;
ADL5205Sample samp;
ADL5205Symbol samp;
int phase = 0;
for(size_t i=0; i<din->GetDepth(); i++)
int64_t offset = 0;
for(size_t i=0; i<len; i++)
{
auto s = din->m_samples[i];
SetData(NULL);

switch(phase)
{
//Wait for us to be selected, ignore any traffic before that
case 0:
if(s.m_sample.m_stype == SPISymbol::TYPE_SELECT)
if(s.m_stype == SPISymbol::TYPE_SELECT)
phase = 1;
break;

//First byte
case 1:
if(s.m_sample.m_stype == SPISymbol::TYPE_DATA)
if(s.m_stype == SPISymbol::TYPE_DATA)
{
samp.m_offset = s.m_offset;
offset = din->m_offsets[i];

if(s.m_sample.m_data & 1)
samp.m_sample.m_write = false;
if(s.m_data & 1)
samp.m_write = false;
else
samp.m_sample.m_write = true;
samp.m_write = true;
phase = 2;
}
else
@@ -143,20 +151,21 @@ void ADL5205Decoder::Refresh()

//Second byte
case 2:
if(s.m_sample.m_stype == SPISymbol::TYPE_DATA)
if(s.m_stype == SPISymbol::TYPE_DATA)
{
int fa_code = s.m_sample.m_data >> 6;
int gain_code = s.m_sample.m_data & 0x3f;
int fa_code = s.m_data >> 6;
int gain_code = s.m_data & 0x3f;

//Fast attack
samp.m_sample.m_fa = 1 << fa_code;
samp.m_fa = 1 << fa_code;

//Gain
if(gain_code > 35)
gain_code = 35;
samp.m_sample.m_gain = 26 - gain_code;
samp.m_gain = 26 - gain_code;

samp.m_duration = s.m_offset + s.m_duration - samp.m_offset;
cap->m_offsets.push_back(offset);
cap->m_durations.push_back(din->m_offsets[i] + din->m_durations[i] - offset);
cap->m_samples.push_back(samp);
phase = 3;
}
@@ -165,7 +174,7 @@ void ADL5205Decoder::Refresh()
break;

case 3:
if(s.m_sample.m_stype == SPISymbol::TYPE_DESELECT)
if(s.m_stype == SPISymbol::TYPE_DESELECT)
phase = 0;
break;
}
@@ -181,10 +190,10 @@ Gdk::Color ADL5205Decoder::GetColor(int /*i*/)

string ADL5205Decoder::GetText(int i)
{
ADL5205Capture* capture = dynamic_cast<ADL5205Capture*>(GetData());
auto capture = dynamic_cast<ADL5205Waveform*>(GetData());
if(capture != NULL)
{
const ADL5205Symbol& s = capture->m_samples[i].m_sample;
const ADL5205Symbol& s = capture->m_samples[i];

char tmp[128];
snprintf(tmp, sizeof(tmp), "%s: FA=%d dB, gain=%d dB",
12 changes: 7 additions & 5 deletions scopeprotocols/BaseMeasurementDecoder.cpp
Original file line number Diff line number Diff line change
@@ -105,7 +105,7 @@ void BaseMeasurementDecoder::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);
@@ -146,7 +146,7 @@ void BaseMeasurementDecoder::Refresh()
float global_base = fbin*m_range + min;

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

float last = min;
int64_t tedge = 0;
@@ -157,11 +157,11 @@ void BaseMeasurementDecoder::Refresh()
float fmax = -99999;
float fmin = 99999;

for(size_t i=0; i < din->m_samples.size(); i++)
for(size_t i=0; i < len; i++)
{
//Wait for a falling edge
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;

if( (cur < m_midpoint) && (last >= m_midpoint) )
{
@@ -174,7 +174,9 @@ void BaseMeasurementDecoder::Refresh()
if(vavg < fmin)
fmin = vavg;

cap->m_samples.push_back(AnalogSample(tedge, tnow-tedge, vavg));
cap->m_offsets.push_back(tedge);
cap->m_durations.push_back(tnow - tedge);
cap->m_samples.push_back(vavg);
}
tedge = tnow;
}
98 changes: 37 additions & 61 deletions scopeprotocols/CANDecoder.cpp
Original file line number Diff line number Diff line change
@@ -72,15 +72,15 @@ void CANDecoder::Refresh()
return;
}

DigitalCapture* diff = dynamic_cast<DigitalCapture*>(m_channels[0]->GetData());
if( (diff == NULL) )
auto diff = dynamic_cast<DigitalWaveform*>(m_channels[0]->GetData());
if(diff == NULL)
{
SetData(NULL);
return;
}

//Create the capture
CANCapture* cap = new CANCapture;
auto cap = new CANWaveform;
cap->m_timescale = diff->m_timescale;
cap->m_startTimestamp = diff->m_startTimestamp;
cap->m_startPicoseconds = diff->m_startPicoseconds;
@@ -101,23 +101,23 @@ void CANDecoder::Refresh()
// FIXME
m_nbt = m_parameters[m_tq].GetIntVal() * ( 1 + m_parameters[m_bs1].GetIntVal() + m_parameters[m_bs2].GetIntVal() );

for(size_t i = 0; i < diff->m_samples.size(); i++)
size_t len = diff->m_samples.size();
int delta1 = ((2 * m_parameters[m_bs1].GetIntVal() + 1) * m_parameters[m_tq].GetIntVal() * 500);
for(size_t i = 0; i < len; i++)
{
if (symbol_start != 0 && current_symbol == CANSymbol::TYPE_SOF &&
((diff->m_samples[i].m_offset - diff->m_samples[bit_start].m_offset + 1) * diff->m_timescale)
<
((2 * m_parameters[m_bs1].GetIntVal() + 1) * m_parameters[m_tq].GetIntVal() * 500))
((diff->m_offsets[i] - diff->m_offsets[bit_start] + 1) * diff->m_timescale) < delta1)
{
// We wait for the next bit
continue;
} else if (symbol_start != 0 && current_symbol != CANSymbol::TYPE_SOF &&
((diff->m_samples[i].m_offset - diff->m_samples[bit_start].m_offset + 1) * diff->m_timescale) < (m_nbt * 1e3))
((diff->m_offsets[i] - diff->m_offsets[bit_start] + 1) * diff->m_timescale) < (m_nbt * 1e3))
{
// We wait for the next bit
continue;
}

cur_diff = diff->m_samples[i].m_sample;
cur_diff = diff->m_samples[i];
bit_start = i;

if (current_symbol != CANSymbol::TYPE_IDLE)
@@ -144,12 +144,9 @@ void CANDecoder::Refresh()
}
else if (current_symbol == CANSymbol::TYPE_SOF)
{
cap->m_samples.push_back(CANSample(
diff->m_samples[symbol_start].m_offset,
diff->m_samples[i].m_offset - symbol_start,
CANSymbol(CANSymbol::TYPE_SOF, NULL, 0)
)
);
cap->m_offsets.push_back(diff->m_offsets[symbol_start]);
cap->m_durations.push_back(diff->m_offsets[i] - symbol_start);
cap->m_samples.push_back(CANSymbol(CANSymbol::TYPE_SOF, NULL, 0));

current_symbol = CANSymbol::TYPE_SID;
symbol_start = i;
@@ -162,12 +159,9 @@ void CANDecoder::Refresh()

if (bitcount == 11) // SID
{
cap->m_samples.push_back(CANSample(
diff->m_samples[symbol_start].m_offset,
diff->m_samples[i].m_offset - symbol_start,
CANSymbol(CANSymbol::TYPE_SID, (uint8_t*)&current_data, 2)
)
);
cap->m_offsets.push_back(diff->m_offsets[symbol_start]);
cap->m_durations.push_back(diff->m_offsets[i] - symbol_start);
cap->m_samples.push_back(CANSymbol(CANSymbol::TYPE_SID, (uint8_t*)&current_data, 2));

bitcount = 0;
current_data = 0;
@@ -179,12 +173,9 @@ void CANDecoder::Refresh()
{
current_data |= (cur_diff)?0:1;

cap->m_samples.push_back(CANSample(
diff->m_samples[symbol_start].m_offset,
diff->m_samples[i].m_offset - symbol_start,
CANSymbol(CANSymbol::TYPE_RTR, (uint8_t *)&current_data, 1)
)
);
cap->m_offsets.push_back(diff->m_offsets[symbol_start]);
cap->m_durations.push_back(diff->m_offsets[i] - symbol_start);
cap->m_samples.push_back(CANSymbol(CANSymbol::TYPE_RTR, (uint8_t *)&current_data, 1));

current_data = 0;
symbol_start = i;
@@ -194,12 +185,9 @@ void CANDecoder::Refresh()
{
current_data |= (cur_diff)?0:1;

cap->m_samples.push_back(CANSample(
diff->m_samples[symbol_start].m_offset,
diff->m_samples[i].m_offset - symbol_start,
CANSymbol(CANSymbol::TYPE_IDE, (uint8_t *)&current_data, 1)
)
);
cap->m_offsets.push_back(diff->m_offsets[symbol_start]);
cap->m_durations.push_back(diff->m_offsets[i] - symbol_start);
cap->m_samples.push_back(CANSymbol(CANSymbol::TYPE_IDE, (uint8_t *)&current_data, 1));

current_data = 0;
symbol_start = i;
@@ -209,12 +197,9 @@ void CANDecoder::Refresh()
{
current_data |= (cur_diff)?0:1;

cap->m_samples.push_back(CANSample(
diff->m_samples[symbol_start].m_offset,
diff->m_samples[i].m_offset - symbol_start,
CANSymbol(CANSymbol::TYPE_R0, (uint8_t *)&current_data, 1)
)
);
cap->m_offsets.push_back(diff->m_offsets[symbol_start]);
cap->m_durations.push_back(diff->m_offsets[i] - symbol_start);
cap->m_samples.push_back(CANSymbol(CANSymbol::TYPE_R0, (uint8_t *)&current_data, 1));

current_data = 0;
symbol_start = i;
@@ -228,12 +213,9 @@ void CANDecoder::Refresh()

if (bitcount == 4)
{
cap->m_samples.push_back(CANSample(
diff->m_samples[symbol_start].m_offset,
diff->m_samples[i].m_offset - symbol_start,
CANSymbol(CANSymbol::TYPE_DLC, (uint8_t*)&current_data, 1)
)
);
cap->m_offsets.push_back(diff->m_offsets[symbol_start]);
cap->m_durations.push_back(diff->m_offsets[i] - symbol_start);
cap->m_samples.push_back(CANSymbol(CANSymbol::TYPE_DLC, (uint8_t*)&current_data, 1));

dlc = current_data;
bitcount = 0;
@@ -250,12 +232,9 @@ void CANDecoder::Refresh()

if (bitcount == 8)
{
cap->m_samples.push_back(CANSample(
diff->m_samples[symbol_start].m_offset,
diff->m_samples[i].m_offset - symbol_start,
CANSymbol(CANSymbol::TYPE_DATA, (uint8_t*)&current_data, 1)
)
);
cap->m_offsets.push_back(diff->m_offsets[symbol_start]);
cap->m_durations.push_back(diff->m_offsets[i] - symbol_start);
cap->m_samples.push_back(CANSymbol(CANSymbol::TYPE_DATA, (uint8_t*)&current_data, 1));

bitcount = 0;
current_data = 0;
@@ -279,12 +258,9 @@ void CANDecoder::Refresh()

if (bitcount == 15)
{
cap->m_samples.push_back(CANSample(
diff->m_samples[symbol_start].m_offset,
diff->m_samples[i].m_offset - symbol_start,
CANSymbol(CANSymbol::TYPE_CRC, (uint8_t*)&current_data, 2)
)
);
cap->m_offsets.push_back(diff->m_offsets[symbol_start]);
cap->m_durations.push_back(diff->m_offsets[i] - symbol_start);
cap->m_samples.push_back(CANSymbol(CANSymbol::TYPE_CRC, (uint8_t*)&current_data, 2));

bitcount = 0;
current_data = 0;
@@ -302,10 +278,10 @@ void CANDecoder::Refresh()

Gdk::Color CANDecoder::GetColor(int i)
{
CANCapture* capture = dynamic_cast<CANCapture*>(GetData());
auto capture = dynamic_cast<CANWaveform*>(GetData());
if(capture != NULL)
{
const CANSymbol& s = capture->m_samples[i].m_sample;
const CANSymbol& s = capture->m_samples[i];

if(s.m_stype == CANSymbol::TYPE_SOF)
return m_standardColors[COLOR_CONTROL];
@@ -332,10 +308,10 @@ Gdk::Color CANDecoder::GetColor(int i)

string CANDecoder::GetText(int i)
{
CANCapture* capture = dynamic_cast<CANCapture*>(GetData());
auto capture = dynamic_cast<CANWaveform*>(GetData());
if(capture != NULL)
{
const CANSymbol& s = capture->m_samples[i].m_sample;
const CANSymbol& s = capture->m_samples[i];

char tmp[32];
switch(s.m_stype)
6 changes: 4 additions & 2 deletions scopeprotocols/CANDecoder.h
Original file line number Diff line number Diff line change
@@ -25,6 +25,9 @@ class CANSymbol
TYPE_IDLE
};

CANSymbol()
{}

CANSymbol(stype t, uint8_t *data, size_t size)
: m_stype(t)
{
@@ -43,8 +46,7 @@ class CANSymbol
}
};

typedef OscilloscopeSample<CANSymbol> CANSample;
typedef CaptureChannel<CANSymbol> CANCapture;
typedef Waveform<CANSymbol> CANWaveform;

class CANDecoder : public ProtocolDecoder
{
6 changes: 3 additions & 3 deletions scopeprotocols/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -3,9 +3,9 @@ link_directories(${GTKMM_LIBRARY_DIRS} ${SIGCXX_LIBRARY_DIRS})

set(SCOPEPROTOCOLS_SOURCES
ACCoupleDecoder.cpp
#ADL5205Decoder.cpp
#BaseMeasurementDecoder.cpp
#CANDecoder.cpp
ADL5205Decoder.cpp
BaseMeasurementDecoder.cpp
CANDecoder.cpp
ClockJitterDecoder.cpp
ClockRecoveryDecoder.cpp
DCOffsetDecoder.cpp
Loading