kopia lustrzana https://gitlab.com/Teuniz/DSRemote
395 wiersze
11 KiB
C++
395 wiersze
11 KiB
C++
/*
|
|
***************************************************************************
|
|
*
|
|
* Author: Teunis van Beelen
|
|
*
|
|
* Copyright (C) 2016 - 2023 Teunis van Beelen
|
|
*
|
|
* Email: teuniz@protonmail.com
|
|
*
|
|
***************************************************************************
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*
|
|
***************************************************************************
|
|
*/
|
|
|
|
|
|
|
|
|
|
#include "wave_dialog.h"
|
|
|
|
|
|
|
|
UI_wave_window::UI_wave_window(struct device_settings *p_devparms, short *wbuf[MAX_CHNS], QWidget *parnt)
|
|
{
|
|
int i;
|
|
|
|
mainwindow = (UI_Mainwindow *)parnt;
|
|
|
|
setMinimumSize(840, 655);
|
|
setWindowTitle("Wave Inspector");
|
|
setWindowIcon(QIcon(":/images/r_dsremote.png"));
|
|
|
|
devparms = (struct device_settings *)calloc(1, sizeof(struct device_settings));
|
|
if(devparms == NULL)
|
|
{
|
|
printf("Malloc error! file: %s line: %i", __FILE__, __LINE__);
|
|
}
|
|
else
|
|
{
|
|
*devparms = *p_devparms;
|
|
}
|
|
|
|
for(i=0; i<MAX_CHNS; i++)
|
|
{
|
|
devparms->wavebuf[i] = wbuf[i];
|
|
}
|
|
|
|
devparms->wavebufsz = devparms->acquirememdepth;
|
|
|
|
if(devparms->timebasedelayenable)
|
|
{
|
|
devparms->timebasescale = devparms->timebasedelayscale;
|
|
}
|
|
|
|
devparms->timebasedelayenable = 0;
|
|
|
|
devparms->viewer_center_position = 0;
|
|
|
|
devparms->wave_mem_view_enabled = 1;
|
|
|
|
if(devparms->math_decode_display)
|
|
{
|
|
mainwindow->serial_decoder(devparms);
|
|
}
|
|
|
|
wavcurve = new WaveCurve;
|
|
wavcurve->setBackgroundColor(Qt::black);
|
|
wavcurve->setSignalColor1(Qt::yellow);
|
|
wavcurve->setSignalColor2(Qt::cyan);
|
|
wavcurve->setSignalColor3(Qt::magenta);
|
|
wavcurve->setSignalColor4(QColor(0, 128, 255));
|
|
wavcurve->setRasterColor(Qt::darkGray);
|
|
wavcurve->setBorderSize(40);
|
|
wavcurve->setDeviceParameters(devparms);
|
|
|
|
wavslider = new QSlider;
|
|
wavslider->setOrientation(Qt::Horizontal);
|
|
set_wavslider();
|
|
|
|
devparms->wave_mem_view_sample_start = wavslider->value();
|
|
|
|
menubar = new QMenuBar(this);
|
|
|
|
savemenu = new QMenu(this);
|
|
savemenu->setTitle("Save");
|
|
savemenu->addAction("Save to EDF file", this, SLOT(save_wi_buffer_to_edf()));
|
|
menubar->addMenu(savemenu);
|
|
|
|
helpmenu = new QMenu(this);
|
|
helpmenu->setTitle("Help");
|
|
helpmenu->addAction("How to operate", mainwindow, SLOT(helpButtonClicked()));
|
|
helpmenu->addAction("About", mainwindow, SLOT(show_about_dialog()));
|
|
menubar->addMenu(helpmenu);
|
|
|
|
g_layout = new QGridLayout(this);
|
|
g_layout->setMenuBar(menubar);
|
|
g_layout->addWidget(wavcurve, 0, 0);
|
|
g_layout->addWidget(wavslider, 1, 0);
|
|
|
|
former_page_act = new QAction(this);
|
|
former_page_act->setShortcut(QKeySequence::MoveToPreviousPage);
|
|
connect(former_page_act, SIGNAL(triggered()), this, SLOT(former_page()));
|
|
addAction(former_page_act);
|
|
|
|
shift_page_left_act = new QAction(this);
|
|
shift_page_left_act->setShortcut(QKeySequence::MoveToPreviousChar);
|
|
connect(shift_page_left_act, SIGNAL(triggered()), this, SLOT(shift_page_left()));
|
|
addAction(shift_page_left_act);
|
|
|
|
center_position_act = new QAction(this);
|
|
center_position_act->setShortcut(QKeySequence("c"));
|
|
connect(center_position_act, SIGNAL(triggered()), this, SLOT(center_position()));
|
|
addAction(center_position_act);
|
|
|
|
center_trigger_act = new QAction(this);
|
|
center_trigger_act->setShortcut(QKeySequence("t"));
|
|
connect(center_trigger_act, SIGNAL(triggered()), this, SLOT(center_trigger()));
|
|
addAction(center_trigger_act);
|
|
|
|
shift_page_right_act = new QAction(this);
|
|
shift_page_right_act->setShortcut(QKeySequence::MoveToNextChar);
|
|
connect(shift_page_right_act, SIGNAL(triggered()), this, SLOT(shift_page_right()));
|
|
addAction(shift_page_right_act);
|
|
|
|
next_page_act = new QAction(this);
|
|
next_page_act->setShortcut(QKeySequence::MoveToNextPage);
|
|
connect(next_page_act, SIGNAL(triggered()), this, SLOT(next_page()));
|
|
addAction(next_page_act);
|
|
|
|
zoom_in_act = new QAction(this);
|
|
zoom_in_act->setShortcut(QKeySequence::ZoomIn);
|
|
connect(zoom_in_act, SIGNAL(triggered()), this, SLOT(zoom_in()));
|
|
addAction(zoom_in_act);
|
|
|
|
zoom_out_act = new QAction(this);
|
|
zoom_out_act->setShortcut(QKeySequence::ZoomOut);
|
|
connect(zoom_out_act, SIGNAL(triggered()), this, SLOT(zoom_out()));
|
|
addAction(zoom_out_act);
|
|
|
|
connect(wavslider, SIGNAL(sliderMoved(int)), this, SLOT(wavslider_value_changed(int)));
|
|
|
|
show();
|
|
}
|
|
|
|
|
|
UI_wave_window::~UI_wave_window()
|
|
{
|
|
int i;
|
|
|
|
for(i=0; i<MAX_CHNS; i++)
|
|
{
|
|
free(devparms->wavebuf[i]);
|
|
}
|
|
|
|
free(devparms);
|
|
}
|
|
|
|
|
|
void UI_wave_window::save_wi_buffer_to_edf()
|
|
{
|
|
mainwindow->save_wave_inspector_buffer_to_edf(devparms);
|
|
}
|
|
|
|
|
|
void UI_wave_window::wavslider_value_changed(int val)
|
|
{
|
|
devparms->wave_mem_view_sample_start = val;
|
|
|
|
int samples_per_div = devparms->samplerate * devparms->timebasescale;
|
|
|
|
devparms->viewer_center_position = (double)(((devparms->wavebufsz - (devparms->hordivisions * samples_per_div)) / 2) - devparms->wave_mem_view_sample_start) /
|
|
devparms->samplerate * -1.0;
|
|
|
|
|
|
devparms->viewer_center_position = round_to_3digits(devparms->viewer_center_position);
|
|
|
|
wavcurve->update();
|
|
}
|
|
|
|
|
|
void UI_wave_window::set_wavslider(void)
|
|
{
|
|
int samples_per_div = devparms->samplerate * devparms->timebasescale;
|
|
|
|
wavslider->setRange(0, devparms->wavebufsz - (devparms->hordivisions * samples_per_div));
|
|
|
|
devparms->wave_mem_view_sample_start = ((devparms->wavebufsz - (devparms->hordivisions * samples_per_div)) / 2) +
|
|
devparms->samplerate * devparms->viewer_center_position;
|
|
|
|
wavslider->setValue(devparms->wave_mem_view_sample_start);
|
|
}
|
|
|
|
|
|
void UI_wave_window::former_page()
|
|
{
|
|
devparms->viewer_center_position -= devparms->timebasescale * devparms->hordivisions;
|
|
|
|
if(devparms->viewer_center_position <= ((((double)devparms->acquirememdepth / devparms->samplerate) -
|
|
(devparms->timebasescale * devparms->hordivisions)) / -2))
|
|
{
|
|
devparms->viewer_center_position = (((double)devparms->acquirememdepth / devparms->samplerate) -
|
|
(devparms->timebasescale * devparms->hordivisions)) / -2;
|
|
}
|
|
|
|
set_wavslider();
|
|
|
|
wavcurve->update();
|
|
}
|
|
|
|
|
|
void UI_wave_window::next_page()
|
|
{
|
|
devparms->viewer_center_position += devparms->timebasescale * devparms->hordivisions;
|
|
|
|
if(devparms->viewer_center_position >= ((((double)devparms->acquirememdepth / devparms->samplerate) -
|
|
(devparms->timebasescale * devparms->hordivisions)) / 2))
|
|
{
|
|
devparms->viewer_center_position = (((double)devparms->acquirememdepth / devparms->samplerate) -
|
|
(devparms->timebasescale * devparms->hordivisions)) / 2;
|
|
}
|
|
|
|
set_wavslider();
|
|
|
|
wavcurve->update();
|
|
}
|
|
|
|
|
|
void UI_wave_window::shift_page_left()
|
|
{
|
|
devparms->viewer_center_position -= devparms->timebasescale;
|
|
|
|
if(devparms->viewer_center_position <= ((((double)devparms->acquirememdepth / devparms->samplerate) -
|
|
(devparms->timebasescale * devparms->hordivisions)) / -2))
|
|
{
|
|
devparms->viewer_center_position = (((double)devparms->acquirememdepth / devparms->samplerate) -
|
|
(devparms->timebasescale * devparms->hordivisions)) / -2;
|
|
}
|
|
|
|
set_wavslider();
|
|
|
|
wavcurve->update();
|
|
}
|
|
|
|
|
|
void UI_wave_window::shift_page_right()
|
|
{
|
|
devparms->viewer_center_position += devparms->timebasescale;
|
|
|
|
if(devparms->viewer_center_position >= ((((double)devparms->acquirememdepth / devparms->samplerate) -
|
|
(devparms->timebasescale * devparms->hordivisions)) / 2))
|
|
{
|
|
devparms->viewer_center_position = (((double)devparms->acquirememdepth / devparms->samplerate) -
|
|
(devparms->timebasescale * devparms->hordivisions)) / 2;
|
|
}
|
|
|
|
set_wavslider();
|
|
|
|
wavcurve->update();
|
|
}
|
|
|
|
|
|
void UI_wave_window::center_position()
|
|
{
|
|
devparms->viewer_center_position = 0;
|
|
|
|
set_wavslider();
|
|
|
|
wavcurve->update();
|
|
}
|
|
|
|
|
|
void UI_wave_window::center_trigger()
|
|
{
|
|
devparms->viewer_center_position = -devparms->timebaseoffset;
|
|
|
|
if(devparms->viewer_center_position <= ((((double)devparms->acquirememdepth / devparms->samplerate) -
|
|
(devparms->timebasescale * devparms->hordivisions)) / -2))
|
|
{
|
|
devparms->viewer_center_position = (((double)devparms->acquirememdepth / devparms->samplerate) -
|
|
(devparms->timebasescale * devparms->hordivisions)) / -2;
|
|
}
|
|
|
|
if(devparms->viewer_center_position >= ((((double)devparms->acquirememdepth / devparms->samplerate) -
|
|
(devparms->timebasescale * devparms->hordivisions)) / 2))
|
|
{
|
|
devparms->viewer_center_position = (((double)devparms->acquirememdepth / devparms->samplerate) -
|
|
(devparms->timebasescale * devparms->hordivisions)) / 2;
|
|
}
|
|
|
|
set_wavslider();
|
|
|
|
wavcurve->update();
|
|
}
|
|
|
|
|
|
void UI_wave_window::zoom_in()
|
|
{
|
|
devparms->timebasescale = round_down_step125(devparms->timebasescale, NULL);
|
|
|
|
if(devparms->timebasescale <= 1.001e-9)
|
|
{
|
|
devparms->timebasescale = 1e-9;
|
|
}
|
|
|
|
if(devparms->viewer_center_position <= ((((double)devparms->acquirememdepth / devparms->samplerate) -
|
|
(devparms->timebasescale * devparms->hordivisions)) / -2))
|
|
{
|
|
devparms->viewer_center_position = (((double)devparms->acquirememdepth / devparms->samplerate) -
|
|
(devparms->timebasescale * devparms->hordivisions)) / -2;
|
|
}
|
|
|
|
if(devparms->viewer_center_position >= ((((double)devparms->acquirememdepth / devparms->samplerate) -
|
|
(devparms->timebasescale * devparms->hordivisions)) / 2))
|
|
{
|
|
devparms->viewer_center_position = (((double)devparms->acquirememdepth / devparms->samplerate) -
|
|
(devparms->timebasescale * devparms->hordivisions)) / 2;
|
|
}
|
|
|
|
set_wavslider();
|
|
|
|
wavcurve->update();
|
|
}
|
|
|
|
|
|
void UI_wave_window::zoom_out()
|
|
{
|
|
double dtmp = round_up_step125(devparms->timebasescale, NULL);
|
|
|
|
if(dtmp >= ((double)devparms->acquirememdepth / devparms->samplerate) / (double)devparms->hordivisions)
|
|
{
|
|
return;
|
|
}
|
|
|
|
devparms->timebasescale = round_up_step125(devparms->timebasescale, NULL);
|
|
|
|
if(devparms->viewer_center_position <= ((((double)devparms->acquirememdepth / devparms->samplerate) -
|
|
(devparms->timebasescale * devparms->hordivisions)) / -2))
|
|
{
|
|
devparms->viewer_center_position = (((double)devparms->acquirememdepth / devparms->samplerate) -
|
|
(devparms->timebasescale * devparms->hordivisions)) / -2;
|
|
}
|
|
|
|
if(devparms->viewer_center_position >= ((((double)devparms->acquirememdepth / devparms->samplerate) -
|
|
(devparms->timebasescale * devparms->hordivisions)) / 2))
|
|
{
|
|
devparms->viewer_center_position = (((double)devparms->acquirememdepth / devparms->samplerate) -
|
|
(devparms->timebasescale * devparms->hordivisions)) / 2;
|
|
}
|
|
|
|
set_wavslider();
|
|
|
|
wavcurve->update();
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|