Skip to content

Commit 1dad788

Browse files
committed
upversion to 3.1.1-rc; options to force OpenGL SL versions
Signed-off-by: Martin <Ho-Ro@users.noreply.github.com>
1 parent d592942 commit 1dad788

29 files changed

+301
-190
lines changed

CHANGELOG

+8-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,11 @@
1-
3.0.1
1+
3.1.1-rc1
2+
2020-06-20
3+
Slow timebases up to 10s/div
4+
Near real time screen updates with trigger mode NONE
5+
Screenshot and hardcopy are identical to the screen content
6+
Force OpenGL SL version (option --useGLSL120 or --useGLSL150)
7+
8+
3.1.0
29
2020-05-08
310
Demo mode without scope hardware (option -d or --demoMode)
411
Support for high-dpi displays

openhantek/.clang-format

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ AccessModifierOffset: -2
55
AlignAfterOpenBracket: Align
66
AlignConsecutiveAssignments: false
77
AlignConsecutiveDeclarations: false
8-
AlignEscapedNewlinesLeft: false
8+
AlignEscapedNewlinesLeft: true
99
AlignOperands: true
1010
AlignTrailingComments: true
1111
AllowAllParametersOfDeclarationOnNextLine: true

openhantek/src/OH_BUILD.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
// Do not edit, will be re-created at each commit!
2-
#define OH_BUILD "20200616 build 706"
2+
#define OH_BUILD "20200620 build 707"

openhantek/src/OH_VERSION.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// define the version that is shown on top of the program
22
// if undefined (for development commits) the build will be shown by OpenHantek
33

4-
// #define OH_VERSION "3.1.1-rc1"
4+
#define OH_VERSION "3.1.1-rc1"
55

66
#ifdef OH_VERSION
77
#undef VERSION

openhantek/src/docks/HorizontalDock.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ HorizontalDock::HorizontalDock( DsoSettingsScope *scope, const Dso::ControlSpeci
4444
this->timebaseSiSpinBox = new SiSpinBox( UNIT_SECONDS );
4545
this->timebaseSiSpinBox->setSteps( timebaseSteps );
4646
this->timebaseSiSpinBox->setMinimum( 1e-9 );
47-
this->timebaseSiSpinBox->setMaximum( 3.6e3 );
47+
this->timebaseSiSpinBox->setMaximum( 1e3 );
4848

4949
this->frequencybaseLabel = new QLabel( tr( "Frequencybase" ) );
5050
this->frequencybaseSiSpinBox = new SiSpinBox( UNIT_HERTZ );

openhantek/src/dsosettings.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,7 @@ void DsoSettings::save() {
273273
storeSettings->setValue( "frequencybase", scope.horizontal.frequencybase );
274274
for ( int marker = 0; marker < 2; ++marker )
275275
storeSettings->setValue( QString( "marker%1" ).arg( marker ), scope.getMarker( unsigned( marker ) ) );
276-
storeSettings->setValue( "timebase", qMin( scope.horizontal.timebase, 0.1 ) );
276+
storeSettings->setValue( "timebase", scope.horizontal.timebase );
277277
storeSettings->setValue( "maxTimebase", scope.horizontal.maxTimebase );
278278
storeSettings->setValue( "acquireInterval", scope.horizontal.acquireInterval );
279279
storeSettings->setValue( "recordLength", scope.horizontal.recordLength );

openhantek/src/dsowidget.cpp

+19-19
Original file line numberDiff line numberDiff line change
@@ -221,15 +221,15 @@ DsoWidget::DsoWidget( DsoSettingsScope *scope, DsoSettingsView *view, const Dso:
221221
mainLayout->setColumnStretch( 3, 1 ); // Scopes increase their size
222222
// Bars around the scope, needed because the slider-drawing-area is outside
223223
// the scope at min/max
224-
mainLayout->setColumnMinimumWidth( 2, mainSliders.triggerOffsetSlider->preMargin() );
225-
mainLayout->setColumnMinimumWidth( 4, mainSliders.triggerOffsetSlider->postMargin() );
224+
mainLayout->setColumnMinimumWidth( 2, mainSliders.triggerPositionSlider->preMargin() );
225+
mainLayout->setColumnMinimumWidth( 4, mainSliders.triggerPositionSlider->postMargin() );
226226
mainLayout->setSpacing( 0 );
227227
int row = 0;
228228
// display settings on top of scope
229229
mainLayout->addLayout( settingsLayout, row, 1, 1, 5 );
230230
++row;
231231
// 5x5 box for mainScope & mainSliders & markerSlider
232-
mainLayout->addWidget( mainSliders.triggerOffsetSlider, row, 2, 2, 3, Qt::AlignBottom );
232+
mainLayout->addWidget( mainSliders.triggerPositionSlider, row, 2, 2, 3, Qt::AlignBottom );
233233
++row;
234234
mainLayout->setRowMinimumHeight( row, mainSliders.voltageOffsetSlider->preMargin() );
235235
mainLayout->addWidget( mainSliders.voltageOffsetSlider, row, 1, 3, 2, Qt::AlignRight );
@@ -247,7 +247,7 @@ DsoWidget::DsoWidget( DsoSettingsScope *scope, DsoSettingsView *view, const Dso:
247247
++row;
248248
++row;
249249
// 5x4 box for zoomScope & zoomSliders
250-
mainLayout->addWidget( zoomSliders.triggerOffsetSlider, row, 2, 2, 3, Qt::AlignBottom );
250+
mainLayout->addWidget( zoomSliders.triggerPositionSlider, row, 2, 2, 3, Qt::AlignBottom );
251251
++row;
252252
mainLayout->setRowMinimumHeight( row, zoomSliders.voltageOffsetSlider->preMargin() );
253253
mainLayout->addWidget( zoomSliders.voltageOffsetSlider, row, 1, 3, 2, Qt::AlignRight );
@@ -273,9 +273,9 @@ DsoWidget::DsoWidget( DsoSettingsScope *scope, DsoSettingsView *view, const Dso:
273273
connect( mainSliders.voltageOffsetSlider, &LevelSlider::valueChanged, this, &DsoWidget::updateOffset );
274274
connect( zoomSliders.voltageOffsetSlider, &LevelSlider::valueChanged, this, &DsoWidget::updateOffset );
275275

276-
connect( mainSliders.triggerOffsetSlider, &LevelSlider::valueChanged,
276+
connect( mainSliders.triggerPositionSlider, &LevelSlider::valueChanged,
277277
[this]( int index, double value ) { updateTriggerOffset( index, value, true ); } );
278-
connect( zoomSliders.triggerOffsetSlider, &LevelSlider::valueChanged,
278+
connect( zoomSliders.triggerPositionSlider, &LevelSlider::valueChanged,
279279
[this]( int index, double value ) { updateTriggerOffset( index, value, false ); } );
280280

281281
connect( mainSliders.triggerLevelSlider, &LevelSlider::valueChanged, this, &DsoWidget::updateTriggerLevel );
@@ -402,12 +402,12 @@ void DsoWidget::setupSliders( DsoWidget::Sliders &sliders ) {
402402
}
403403

404404
// The triggerPosition slider
405-
sliders.triggerOffsetSlider = new LevelSlider( Qt::DownArrow );
406-
sliders.triggerOffsetSlider->addSlider();
407-
sliders.triggerOffsetSlider->setLimits( 0, 0.0, 1.0 );
408-
sliders.triggerOffsetSlider->setStep( 0, 0.2 / double( DIVS_TIME ) );
409-
sliders.triggerOffsetSlider->setValue( 0, scope->trigger.offset );
410-
sliders.triggerOffsetSlider->setIndexVisible( 0, true );
405+
sliders.triggerPositionSlider = new LevelSlider( Qt::DownArrow );
406+
sliders.triggerPositionSlider->addSlider();
407+
sliders.triggerPositionSlider->setLimits( 0, 0.0, 1.0 );
408+
sliders.triggerPositionSlider->setStep( 0, 0.2 / double( DIVS_TIME ) );
409+
sliders.triggerPositionSlider->setValue( 0, scope->trigger.offset );
410+
sliders.triggerPositionSlider->setIndexVisible( 0, true );
411411

412412
// The sliders for the trigger levels
413413
sliders.triggerLevelSlider = new LevelSlider( Qt::LeftArrow );
@@ -704,8 +704,8 @@ void DsoWidget::updateTriggerSlope() { updateTriggerDetails(); }
704704
/// \brief Handles sourceChanged signal from the trigger dock.
705705
void DsoWidget::updateTriggerSource() {
706706
// Change the colors of the trigger sliders
707-
mainSliders.triggerOffsetSlider->setColor( 0, view->colors->voltage[ scope->trigger.source ] );
708-
zoomSliders.triggerOffsetSlider->setColor( 0, view->colors->voltage[ scope->trigger.source ] );
707+
mainSliders.triggerPositionSlider->setColor( 0, view->colors->voltage[ scope->trigger.source ] );
708+
zoomSliders.triggerPositionSlider->setColor( 0, view->colors->voltage[ scope->trigger.source ] );
709709

710710
for ( ChannelID channel = 0; channel < spec->channels; ++channel ) {
711711
QColor color =
@@ -778,7 +778,7 @@ void DsoWidget::updateZoom( bool enabled ) {
778778
mainLayout->setRowStretch( zoomScopeRow, enabled ? 1 : 0 );
779779
zoomScope->setVisible( enabled );
780780
zoomSliders.voltageOffsetSlider->setVisible( enabled );
781-
zoomSliders.triggerOffsetSlider->setVisible( enabled );
781+
zoomSliders.triggerPositionSlider->setVisible( enabled );
782782
zoomSliders.triggerLevelSlider->setVisible( enabled );
783783
// Show time-/frequencybase and zoom factor if the magnified scope is shown
784784
markerLayout->setStretch( 3, enabled ? 1 : 0 );
@@ -915,7 +915,7 @@ double DsoWidget::zoomToMain( double position ) const {
915915
void DsoWidget::adaptTriggerOffsetSlider() {
916916
double value = mainToZoom( scope->trigger.offset );
917917

918-
LevelSlider &slider = *zoomSliders.triggerOffsetSlider;
918+
LevelSlider &slider = *zoomSliders.triggerPositionSlider;
919919
const QSignalBlocker blocker( slider );
920920
if ( slider.minimum( 0 ) <= value && value <= slider.maximum( 0 ) ) {
921921
slider.setEnabled( true );
@@ -944,8 +944,8 @@ void DsoWidget::updateTriggerOffset( int index, double value, bool mainView ) {
944944
adaptTriggerOffsetSlider();
945945
} else {
946946
scope->trigger.offset = zoomToMain( value );
947-
const QSignalBlocker blocker( mainSliders.triggerOffsetSlider );
948-
mainSliders.triggerOffsetSlider->setValue( index, scope->trigger.offset );
947+
const QSignalBlocker blocker( mainSliders.triggerPositionSlider );
948+
mainSliders.triggerPositionSlider->setValue( index, scope->trigger.offset );
949949
}
950950

951951
updateTriggerDetails();
@@ -1016,7 +1016,7 @@ void DsoWidget::updateSlidersSettings() {
10161016
}
10171017

10181018
// The trigger position slider
1019-
mainSliders.triggerOffsetSlider->setValue( 0, scope->trigger.offset );
1019+
mainSliders.triggerPositionSlider->setValue( 0, scope->trigger.offset );
10201020
updateTriggerOffset( 0, scope->trigger.offset, true ); // main slider
10211021
updateTriggerOffset( 0, mainToZoom( scope->trigger.offset ), false ); // zoom slider
10221022

openhantek/src/dsowidget.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class DsoWidget : public QWidget {
2626
public:
2727
struct Sliders {
2828
LevelSlider *voltageOffsetSlider; ///< The sliders for the graph offsets
29-
LevelSlider *triggerOffsetSlider; ///< The slider for the pretrigger
29+
LevelSlider *triggerPositionSlider; ///< The slider for the pretrigger
3030
LevelSlider *triggerLevelSlider; ///< The sliders for the trigger level
3131
LevelSlider *markerSlider; ///< The sliders for the markers
3232
};

openhantek/src/glscope.cpp

+9-5
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ GlScope *GlScope::createZoomed( DsoSettingsScope *scope, DsoSettingsView *view,
3535
return s;
3636
}
3737

38-
void GlScope::fixOpenGLversion( QSurfaceFormat::RenderableType t ) {
38+
void GlScope::useQSurfaceFormat( QSurfaceFormat::RenderableType t ) {
3939
QCoreApplication::setAttribute( Qt::AA_ShareOpenGLContexts, true );
4040

4141
// Prefer full desktop OpenGL without fixed pipeline
@@ -67,8 +67,7 @@ GlScope::GlScope( DsoSettingsScope *scope, DsoSettingsView *view, QWidget *paren
6767
context.makeCurrent( &surface );
6868
QString glVersion = reinterpret_cast< const char * >( context.functions()->glGetString( GL_VERSION ) );
6969
GLSLversion = glVersion >= "3.2" ? 150 : 120; // version string "3.2 xxxx" > "3.2" is true
70-
// qDebug() << glVersion;
71-
// qDebug() << GLSLversion;
70+
// qDebug() << "OpenGL version" << glVersion << GLSLversion;
7271
surface.destroy();
7372

7473
cursorInfo.clear();
@@ -227,6 +226,8 @@ void GlScope::paintEvent( QPaintEvent *event ) {
227226
event->accept(); // consume the event
228227
}
229228

229+
unsigned GlScope::forceGLSLversion = 0;
230+
230231
void GlScope::initializeGL() {
231232
if ( !QOpenGLShaderProgram::hasOpenGLShaderPrograms( context() ) ) {
232233
errorMessage = tr( "System does not support OpenGL Shading Language (GLSL)" );
@@ -287,11 +288,14 @@ void GlScope::initializeGL() {
287288
out vec4 flatColor;
288289
void main() { flatColor = colour; }
289290
)";
290-
// GLSLversion = 150;
291+
292+
if ( GlScope::forceGLSLversion )
293+
GLSLversion = GlScope::forceGLSLversion;
294+
// qDebug() << "compile shaders" << GlScope::forceGLSLversion << GLSLversion;
295+
291296
const char *vshaderDesktop = GLSLversion == 120 ? vshaderDesktop120 : vshaderDesktop150;
292297
const char *fshaderDesktop = GLSLversion == 120 ? fshaderDesktop120 : fshaderDesktop150;
293298

294-
// qDebug() << "compile shaders";
295299
// Compile vertex shader
296300
bool usesOpenGL = QSurfaceFormat::defaultFormat().renderableType() == QSurfaceFormat::OpenGL;
297301
if ( !program->addShaderFromSourceCode( QOpenGLShader::Vertex, usesOpenGL ? vshaderDesktop : vshaderES ) ||

openhantek/src/glscope.h

+5-2
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,12 @@ class GlScope : public QOpenGLWidget {
3030
static GlScope *createZoomed( DsoSettingsScope *scope, DsoSettingsView *view, QWidget *parent = nullptr );
3131

3232
/**
33-
* We need at least OpenGL 3.2 with shader version 150 or
33+
* We need at least OpenGL 3.2 with shader version 150 (else version 120) or
3434
* OpenGL ES 2.0 with shader version 100.
3535
*/
36-
static void fixOpenGLversion( QSurfaceFormat::RenderableType t = QSurfaceFormat::DefaultRenderableType );
36+
static void useQSurfaceFormat( QSurfaceFormat::RenderableType t = QSurfaceFormat::DefaultRenderableType );
37+
// force either GLSL version 1.20 or 1.50
38+
static void useOpenGLSLversion( unsigned version ) { forceGLSLversion = version; }
3739
/**
3840
* Show new post processed data
3941
* @param data
@@ -121,6 +123,7 @@ class GlScope : public QOpenGLWidget {
121123

122124
// OpenGL shader, matrix, var-locations
123125
unsigned int GLSLversion = 150;
126+
static unsigned forceGLSLversion;
124127
bool shaderCompileSuccess = false;
125128
QString errorMessage;
126129
std::unique_ptr< QOpenGLShaderProgram > m_program;

openhantek/src/hantekdso/capturing.cpp

+19-16
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
#include <cmath>
99

1010

11-
static std::vector< QString > controlNames = {"SETGAIN_CH1", "SETGAIN_CH2", "SETSAMPLERATE", "STARTSAMPLING",
12-
"SETNUMCHANNELS", "SETCOUPLING", "SETCALFREQ"};
11+
// static std::vector< QString > controlNames = {"SETGAIN_CH1", "SETGAIN_CH2", "SETSAMPLERATE", "STARTSAMPLING",
12+
// "SETNUMCHANNELS", "SETCOUPLING", "SETCALFREQ"};
1313

1414
Capturing::Capturing( HantekDsoControl *hdc ) : hdc( hdc ) { hdc->capturing = true; }
1515

@@ -88,7 +88,7 @@ void Capturing::capture() {
8888
}
8989
QString name = "";
9090
if ( controlCommand->code >= 0xe0 && controlCommand->code <= 0xe6 )
91-
name = controlNames[ controlCommand->code - 0xe0 ];
91+
name = hdc->controlNames[ controlCommand->code - 0xe0 ];
9292
timestampDebug( QString( "Sending control command 0x%1 (%2):%3" )
9393
.arg( QString::number( controlCommand->code, 16 ), name,
9494
hexdecDump( controlCommand->data(), unsigned( controlCommand->size() ) ) ) );
@@ -146,7 +146,8 @@ unsigned Capturing::getRealSamples() {
146146
}
147147
// Save raw data to temporary buffer
148148
timestampDebug( QString( "Request packet %1: %2" ).arg( tag ).arg( rawSamplesize ) );
149-
int retval = hdc->scopeDevice->bulkReadMulti( dp->data(), rawSamplesize, !realSlow );
149+
hdc->raw.received = 0;
150+
int retval = hdc->scopeDevice->bulkReadMulti( dp->data(), rawSamplesize, realSlow, hdc->raw.received );
150151
if ( retval < 0 ) {
151152
qWarning() << "bulkReadMulti: Getting sample data failed: " << libUsbErrorString( retval );
152153
dp->clear();
@@ -158,14 +159,17 @@ unsigned Capturing::getRealSamples() {
158159

159160

160161
unsigned Capturing::getDemoSamples() {
161-
const uint8_t V_zero = 128; // ADC = 0V
162-
const uint8_t V_plus_1 = 153; // ADC = 1V
163-
const uint8_t V_plus_2 = 178; // ADC = 2V
164-
const uint8_t V_minus_2 = 78; // ADC = -2V
165-
static uint8_t ch1 = V_zero;
166-
static uint8_t ch2 = V_zero;
162+
const uint8_t V_zero = 0x80; // ADC = 0V
163+
const int8_t V_plus_1 = 25; // ADC = 1V
164+
const int8_t V_plus_2 = 50; // ADC = 2V
165+
const int8_t V_minus_2 = -50; // ADC = -2V
166+
const int gain1 = int( gainValue[ 0 ] );
167+
const int gain2 = int( gainValue[ 1 ] );
168+
static int ch1 = 0;
169+
static int ch2 = 0;
167170
static int counter = 0;
168171
unsigned received = 0;
172+
hdc->raw.received = 0;
169173
timestampDebug( QString( "Request dummy packet %1: %2" ).arg( tag ).arg( rawSamplesize ) );
170174
int deltaT = 99;
171175
// deltaT (=99) defines the frequency of the dummy signals:
@@ -178,28 +182,27 @@ unsigned Capturing::getDemoSamples() {
178182
deltaT = int( round( deltaT * samplerate / 10e6 ) );
179183
const unsigned packetLength = 512 * 78; // 50 blocks for one screen width of 20000
180184
unsigned block = 0;
181-
dp->resize( rawSamplesize, 0x80 );
185+
dp->resize( rawSamplesize, V_zero );
182186
auto end = dp->end();
183187
unsigned packet = 0;
184188
for ( auto it = dp->begin(); it != end; ++it ) {
185189
if ( ++counter >= deltaT ) {
186190
counter = 0;
187191
if ( --ch1 < V_minus_2 ) {
188192
ch1 = V_plus_2;
189-
ch2 = ch2 <= V_plus_1 ? V_plus_2 : V_zero;
193+
ch2 = ch2 <= V_plus_1 ? V_plus_2 : 0;
190194
}
191195
}
192-
*it = ch1;
196+
*it = uint8_t( qBound( 0, ch1 * gain1 + V_zero, 0xFF ) ); // simulate clipping
193197
++received;
194198
if ( 2 == channels ) {
195-
*++it = ch2;
199+
*++it = uint8_t( qBound( 0, ch2 * gain2 + V_zero, 0xFF ) ); // simulate clipping
196200
++received;
197201
}
198202
if ( ( block += channels ) >= packetLength ) {
199203
++packet;
200204
block = 0;
201-
if ( realSlow ) // clear next block as visible hint where we are
202-
std::for_each( it, qMin( it + packetLength, end ), []( uint8_t &d ) { d = 0x80; } );
205+
hdc->raw.received = received;
203206
QThread::usleep( unsigned( 1e6 * packetLength / channels / samplerate ) );
204207
if ( !hdc->capturing || hdc->scopeDevice->hasStopped() )
205208
break;

openhantek/src/hantekdso/dsosamples.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,11 @@ struct DSOsamples {
1212
double samplerate = 0.0; ///< The samplerate of the input data
1313
unsigned char clipped = 0; ///< Bitmask of clipped channels
1414
bool liveTrigger = false; ///< live samples are triggered
15-
unsigned triggerPosition = 0; ///< position for a triggered trace, 0 = not triggered
15+
unsigned triggeredPosition = 0; ///< position for a triggered trace, 0 = not triggered
1616
double pulseWidth1 = 0.0; ///< width from trigger point to next opposite slope
1717
double pulseWidth2 = 0.0; ///< width from next opposite slope to third slope
1818
bool freeRunning = false; ///< trigger: NONE, half sample count
19+
unsigned freeRunPosition = 0; ///< position of free running capturing
1920
unsigned tag = 0; ///< track individual sample blocks (debug support)
2021
mutable QReadWriteLock lock;
2122
};

0 commit comments

Comments
 (0)