Work in progress.

merge-requests/1/head
Teuniz 2016-01-05 10:56:50 +01:00
rodzic 9955b8ebf4
commit af0d090416
8 zmienionych plików z 192 dodań i 195 usunięć

Wyświetl plik

@ -35,7 +35,7 @@
#define PROGRAM_NAME "DSRemote"
#define PROGRAM_VERSION "0.31_1601042038"
#define PROGRAM_VERSION "0.31_1601051056"
#define MAX_PATHLEN 4096
@ -198,7 +198,10 @@ struct device_settings
kiss_fft_cpx *kiss_fftbuf;
double math_fft_hscale;
double math_fft_hcenter;
double fft_v_sense;
double fft_vscale;
double fft_voffset;
int current_screen_sf;
};

Wyświetl plik

@ -555,6 +555,8 @@ void UI_Mainwindow::horScaleDialChanged(int new_pos)
devparms.timebasedelayscale = round_down_step125(devparms.timebasedelayscale, NULL);
}
devparms.current_screen_sf = 100.0 / devparms.timebasedelayscale;
strcpy(str, "Delayed timebase: ");
convert_to_metric_suffix(str + strlen(str), devparms.timebasedelayscale, 2);
@ -629,6 +631,8 @@ void UI_Mainwindow::horScaleDialChanged(int new_pos)
devparms.timebasescale = round_down_step125(devparms.timebasescale, NULL);
}
devparms.current_screen_sf = 100.0 / devparms.timebasescale;
strcpy(str, "Timebase: ");
convert_to_metric_suffix(str + strlen(str), devparms.timebasescale, 2);
@ -2280,12 +2284,12 @@ void UI_Mainwindow::math_menu()
}
submenufft.setTitle("FFT");
submenufft.addAction("On", this, SLOT(toggle_fft()));
submenufft.addAction("Off", this, SLOT(toggle_fft()));
submenufft.addAction("Full", this, SLOT(toggle_fft_split()));
submenufft.addAction("Half", this, SLOT(toggle_fft_split()));
submenufft.addAction("Vrms", this, SLOT(toggle_fft_unit()));
submenufft.addAction("dBV", this, SLOT(toggle_fft_unit()));
submenufft.addAction("On", this, SLOT(toggle_fft()));
submenufft.addAction("Off", this, SLOT(toggle_fft()));
submenufft.addAction("Full", this, SLOT(toggle_fft_split()));
submenufft.addAction("Half", this, SLOT(toggle_fft_split()));
submenufft.addAction("Vrms", this, SLOT(toggle_fft_unit()));
submenufft.addAction("dB/dBm", this, SLOT(toggle_fft_unit()));
submenufft.addMenu(&submenufftsrc);
submenufft.addMenu(&submenufftctr);
submenufft.addMenu(&submenuffthzdiv);
@ -3200,7 +3204,7 @@ void UI_Mainwindow::toggle_fft_unit()
devparms.math_fft_unit = 1;
statusLabel->setText("FFT unit dBV");
statusLabel->setText("FFT unit dB");
}
}

Wyświetl plik

@ -262,6 +262,15 @@ void UI_Mainwindow::open_connection()
goto OUT_ERROR;
}
if(devparms.timebasedelayenable)
{
devparms.current_screen_sf = 100.0 / devparms.timebasedelayscale;
}
else
{
devparms.current_screen_sf = 100.0 / devparms.timebasescale;
}
if(devparms.modelserie == 1)
{
trig50pctButton->setEnabled(false);
@ -2516,6 +2525,8 @@ void UI_Mainwindow::zoom_in()
devparms.timebasedelayscale = round_down_step125(devparms.timebasedelayscale, NULL);
devparms.current_screen_sf = 100.0 / devparms.timebasedelayscale;
strcpy(str, "Delayed timebase: ");
convert_to_metric_suffix(str + strlen(str), devparms.timebasedelayscale, 2);
@ -2563,6 +2574,8 @@ void UI_Mainwindow::zoom_in()
devparms.timebasescale = round_down_step125(devparms.timebasescale, NULL);
devparms.current_screen_sf = 100.0 / devparms.timebasescale;
strcpy(str, "Timebase: ");
convert_to_metric_suffix(str + strlen(str), devparms.timebasescale, 2);
@ -2607,6 +2620,8 @@ void UI_Mainwindow::zoom_out()
devparms.timebasedelayscale = round_up_step125(devparms.timebasedelayscale, NULL);
devparms.current_screen_sf = 100.0 / devparms.timebasedelayscale;
strcpy(str, "Delayed timebase: ");
convert_to_metric_suffix(str + strlen(str), devparms.timebasedelayscale, 2);
@ -2630,6 +2645,8 @@ void UI_Mainwindow::zoom_out()
devparms.timebasescale = round_up_step125(devparms.timebasescale, NULL);
devparms.current_screen_sf = 100.0 / devparms.timebasescale;
strcpy(str, "Timebase: ");
convert_to_metric_suffix(str + strlen(str), devparms.timebasescale, 2);

Wyświetl plik

@ -79,7 +79,7 @@ UI_Mainwindow::UI_Mainwindow()
devparms.k_cfg = NULL;
devparms.fft_v_sense = 1.0;
devparms.fft_vscale = 10.0;
devparms.screentimerival = settings.value("gui/refresh", 50).toInt();
@ -113,6 +113,8 @@ UI_Mainwindow::UI_Mainwindow()
devparms.hordivisions = 14;
devparms.current_screen_sf = 1;
strcpy(devparms.modelname, "-----");
devparms.mutexx = new QMutex();

Wyświetl plik

@ -29,8 +29,8 @@
#include "screen_thread.h"
#define SPECT_LOG_MINIMUM (0.000001)
#define SPECT_LOG_MINIMUM_LOG (-5)
#define SPECT_LOG_MINIMUM (0.00000001)
#define SPECT_LOG_MINIMUM_LOG (-8)
void screenThread::set_device(struct tmcdev *tmdev)
@ -81,6 +81,10 @@ void screenThread::set_params(struct device_settings *dev_parms)
params.chandisplay[1] = deviceparms->chandisplay[1];
params.chandisplay[2] = deviceparms->chandisplay[2];
params.chandisplay[3] = deviceparms->chandisplay[3];
params.chanscale[0] = deviceparms->chanscale[0];
params.chanscale[1] = deviceparms->chanscale[1];
params.chanscale[2] = deviceparms->chanscale[2];
params.chanscale[3] = deviceparms->chanscale[3];
params.countersrc = deviceparms->countersrc;
params.cmd_cue_idx_in = deviceparms->cmd_cue_idx_in;
params.math_fft_src = deviceparms->math_fft_src;
@ -91,6 +95,7 @@ void screenThread::set_params(struct device_settings *dev_parms)
params.fftbufsz = deviceparms->fftbufsz;
params.k_cfg = deviceparms->k_cfg;
params.kiss_fftbuf = deviceparms->kiss_fftbuf;
params.current_screen_sf = deviceparms->current_screen_sf;
params.debug_str[0] = 0;
}
@ -293,6 +298,8 @@ void screenThread::run()
char str[128];
double y_incr, binsz;
params.error_stat = 0;
params.result = TMC_THRD_RESULT_NONE;
@ -597,9 +604,13 @@ void screenThread::run()
if((n == (params.fftbufsz * 2)) && (params.math_fft == 1) && (i == params.math_fft_src))
{
y_incr = params.chanscale[i] / 25.0;
binsz = (double)params.current_screen_sf / (params.fftbufsz * 2.0);
for(j=0; j<n; j++)
{
params.fftbuf_in[j] = params.wavebuf[i][j];
params.fftbuf_in[j] = params.wavebuf[i][j] * y_incr;
}
kiss_fftr(params.k_cfg, params.fftbuf_in, params.kiss_fftbuf);
@ -609,7 +620,16 @@ void screenThread::run()
params.fftbuf_out[k] = (((params.kiss_fftbuf[k].r * params.kiss_fftbuf[k].r) +
(params.kiss_fftbuf[k].i * params.kiss_fftbuf[k].i)) / params.fftbufsz);
if(params.math_fft_unit) // dBV
params.fftbuf_out[k] /= params.current_screen_sf;
if(k==0) // DC!
{
params.fftbuf_out[k] /= 2.0;
}
params.fftbuf_out[k] *= binsz;
if(params.math_fft_unit) // dBm
{
if(params.fftbuf_out[k] < SPECT_LOG_MINIMUM)
{
@ -623,6 +643,10 @@ void screenThread::run()
params.fftbuf_out[k] = SPECT_LOG_MINIMUM_LOG;
}
}
else // Vrms
{
params.fftbuf_out[k] = sqrt(params.fftbuf_out[k]);
}
}
}
}

Wyświetl plik

@ -69,6 +69,7 @@ private:
struct {
int connected;
int chandisplay[MAX_CHNS];
double chanscale[MAX_CHNS];
int triggerstatus;
int triggersweep;
double samplerate;
@ -99,6 +100,8 @@ private:
kiss_fftr_cfg k_cfg;
kiss_fft_cpx *kiss_fftbuf;
int current_screen_sf;
char debug_str[1024];
} params;

Wyświetl plik

@ -64,8 +64,6 @@ SignalCurve::SignalCurve(QWidget *w_parent) : QWidget(w_parent)
bordersize = 60;
v_sense = 1;
fft_v_sense = 1;
fft_v_offset = 0;
mouse_x = 0;
mouse_y = 0;
@ -152,8 +150,7 @@ void SignalCurve::drawWidget(QPainter *painter, int curve_w, int curve_h)
double h_step=0.0,
step,
step2,
fft_h_offset=0.0;
step2;
// clk_start = clock();
@ -376,91 +373,7 @@ void SignalCurve::drawWidget(QPainter *painter, int curve_w, int curve_h)
if((devparms->math_fft == 1) && (devparms->math_fft_split == 0))
{
if((devparms->fftbufsz > 32) && devparms->chandisplay[devparms->math_fft_src])
{
painter->setClipping(true);
painter->setClipRegion(QRegion(0, 0, curve_w, curve_h), Qt::ReplaceClip);
h_step = (double)curve_w / (double)devparms->fftbufsz;
if(devparms->timebasedelayenable)
{
h_step *= (100.0 / devparms->timebasedelayscale) / devparms->math_fft_hscale;
}
else
{
h_step *= (100.0 / devparms->timebasescale) / devparms->math_fft_hscale;
}
h_step /= 24.0;
fft_v_sense = v_sense * 35;
fft_v_offset = curve_h * 0.75;
fft_h_offset = (curve_w / 2) - ((devparms->math_fft_hcenter / devparms->math_fft_hscale) * curve_w / devparms->hordivisions);
painter->setPen(QPen(QBrush(QColor(128, 0, 255), Qt::SolidPattern), tracewidth, Qt::SolidLine, Qt::SquareCap, Qt::BevelJoin));
for(i=0; i<devparms->fftbufsz; i++)
{
if(devparms->fftbufsz < (curve_w / 2))
{
painter->drawLine(i * h_step + fft_h_offset, (devparms->fftbuf_out[i] * fft_v_sense) + fft_v_offset, (i + 1) * h_step + fft_h_offset, (devparms->fftbuf_out[i] * fft_v_sense) + fft_v_offset);
if(i)
{
painter->drawLine(i * h_step + fft_h_offset, (devparms->fftbuf_out[i - 1] * fft_v_sense) + fft_v_offset, i * h_step + fft_h_offset, (devparms->fftbuf_out[i] * fft_v_sense) + fft_v_offset);
}
}
else
{
if(i < (devparms->fftbufsz - 1))
{
if(devparms->displaytype)
{
painter->drawPoint(i * h_step + fft_h_offset, (devparms->fftbuf_out[i] * fft_v_sense) + fft_v_offset);
}
else
{
painter->drawLine(i * h_step + fft_h_offset, (devparms->fftbuf_out[i] * fft_v_sense) + fft_v_offset, (i + 1) * h_step + fft_h_offset, (devparms->fftbuf_out[i + 1] * fft_v_sense) + fft_v_offset);
}
}
}
}
sprintf(str, "FFT: CH%i ", devparms->math_fft_src + 1);
convert_to_metric_suffix(str + strlen(str), 10, 2);
strcat(str, "dBV ");
convert_to_metric_suffix(str + strlen(str), devparms->math_fft_hscale, 2);
strcat(str, "Hz/Div ");
if(devparms->timebasedelayenable)
{
convert_to_metric_suffix(str + strlen(str), 100.0 / devparms->timebasedelayscale, 0);
}
else
{
convert_to_metric_suffix(str + strlen(str), 100.0 / devparms->timebasescale, 0);
}
strcat(str, "Sa/s");
painter->drawText(15, curve_h - 15, str);
painter->setClipping(false);
}
else
{
painter->setPen(QPen(QBrush(QColor(128, 0, 255), Qt::SolidPattern), tracewidth, Qt::SolidLine, Qt::SquareCap, Qt::BevelJoin));
sprintf(str, "FFT: CH%i Data Invalid!", devparms->math_fft_src + 1);
painter->drawText(15, curve_h - 15, str);
}
drawFFT(painter, curve_h_backup, curve_w_backup);
}
/////////////////////////////////// draw the curve ///////////////////////////////////////////
@ -647,106 +560,147 @@ void SignalCurve::drawWidget(QPainter *painter, int curve_w, int curve_h)
paintLabel(painter, 20, curve_h - 50, 100, 20, str, SignalColor[3]);
}
if((devparms->math_fft == 0) || (devparms->math_fft_split == 0))
if((devparms->math_fft == 1) && (devparms->math_fft_split == 1))
{
return;
drawFFT(painter, curve_h_backup, curve_w_backup);
}
// clk_end = clock();
//
// cpu_time_used += ((double) (clk_end - clk_start)) / CLOCKS_PER_SEC;
//
// scr_update_cntr++;
//
// if(!(scr_update_cntr % 50))
// {
// printf("CPU time used: %f\n", cpu_time_used / 50);
//
// cpu_time_used = 0;
// }
}
void SignalCurve::drawFFT(QPainter *painter, int curve_h_b, int curve_w_b)
{
int i, small_rulers, curve_w, curve_h;
char str[1024];
double h_step=0.0,
step,
step2,
fft_h_offset=0.0;
small_rulers = 5 * devparms->hordivisions;
/////////////////////////////////// FFT: translate coordinates, draw and fill a rectangle ///////////////////////////////////////////
painter->resetTransform();
if(devparms->math_fft_split == 0)
{
curve_w = curve_w_b - (bordersize * 2);
painter->translate(bordersize, bordersize + curve_h + 15);
curve_h = curve_h_b - (bordersize * 2);
}
else
{
curve_h = curve_h_b - (bordersize * 2);
curve_w = curve_w_backup - (bordersize * 2);
curve_h /= 3;
curve_h = curve_h_backup - (bordersize * 2);
painter->resetTransform();
curve_h *= 0.64;
painter->translate(bordersize, bordersize + curve_h + 15);
curve_w = curve_w_b - (bordersize * 2);
curve_h = curve_h_b - (bordersize * 2);
curve_h *= 0.64;
/////////////////////////////////// FFT: draw the rasters ///////////////////////////////////////////
painter->setPen(RasterColor);
painter->setPen(RasterColor);
painter->drawRect (0, 0, curve_w - 1, curve_h - 1);
if(devparms->displaygrid)
{
painter->setPen(QPen(QBrush(RasterColor, Qt::SolidPattern), tracewidth, Qt::DotLine, Qt::SquareCap, Qt::BevelJoin));
if(devparms->displaygrid == 2)
{
step = (double)curve_w / (double)devparms->hordivisions;
for(i=1; i<devparms->hordivisions; i++)
{
painter->drawLine(step * i, curve_h - 1, step * i, 0);
}
step = curve_h / 8.0;
for(i=1; i<8; i++)
{
painter->drawLine(0, step * i, curve_w - 1, step * i);
}
}
else
{
painter->drawLine(curve_w / 2, curve_h - 1, curve_w / 2, 0);
painter->drawLine(0, curve_h / 2, curve_w - 1, curve_h / 2);
}
}
painter->setPen(RasterColor);
step = (double)curve_w / (double)small_rulers;
for(i=1; i<small_rulers; i++)
{
step2 = step * i;
painter->drawRect (0, 0, curve_w - 1, curve_h - 1);
if(devparms->displaygrid)
{
painter->drawLine(step2, curve_h / 2 + 2, step2, curve_h / 2 - 2);
painter->setPen(QPen(QBrush(RasterColor, Qt::SolidPattern), tracewidth, Qt::DotLine, Qt::SquareCap, Qt::BevelJoin));
if(devparms->displaygrid == 2)
{
step = (double)curve_w / (double)devparms->hordivisions;
for(i=1; i<devparms->hordivisions; i++)
{
painter->drawLine(step * i, curve_h - 1, step * i, 0);
}
step = curve_h / 8.0;
for(i=1; i<8; i++)
{
painter->drawLine(0, step * i, curve_w - 1, step * i);
}
}
else
{
painter->drawLine(curve_w / 2, curve_h - 1, curve_w / 2, 0);
painter->drawLine(0, curve_h / 2, curve_w - 1, curve_h / 2);
}
}
if(i % 5)
painter->setPen(RasterColor);
step = (double)curve_w / (double)small_rulers;
for(i=1; i<small_rulers; i++)
{
painter->drawLine(step2, curve_h - 1, step2, curve_h - 5);
step2 = step * i;
painter->drawLine(step2, 0, step2, 4);
}
else
{
painter->drawLine(step2, curve_h - 1, step2, curve_h - 9);
if(devparms->displaygrid)
{
painter->drawLine(step2, curve_h / 2 + 2, step2, curve_h / 2 - 2);
}
painter->drawLine(step2, 0, step2, 8);
}
}
if(i % 5)
{
painter->drawLine(step2, curve_h - 1, step2, curve_h - 5);
step = curve_h / 40.0;
painter->drawLine(step2, 0, step2, 4);
}
else
{
painter->drawLine(step2, curve_h - 1, step2, curve_h - 9);
for(i=1; i<40; i++)
{
step2 = step * i;
if(devparms->displaygrid)
{
painter->drawLine(curve_w / 2 + 2, step2, curve_w / 2 - 2, step2);
painter->drawLine(step2, 0, step2, 8);
}
}
if(i % 5)
{
painter->drawLine(curve_w - 1, step2, curve_w - 5, step2);
step = curve_h / 40.0;
painter->drawLine(0, step2, 4, step2);
}
else
for(i=1; i<40; i++)
{
painter->drawLine(curve_w - 1, step2, curve_w - 9, step2);
step2 = step * i;
painter->drawLine(0, step2, 8, step2);
if(devparms->displaygrid)
{
painter->drawLine(curve_w / 2 + 2, step2, curve_w / 2 - 2, step2);
}
if(i % 5)
{
painter->drawLine(curve_w - 1, step2, curve_w - 5, step2);
painter->drawLine(0, step2, 4, step2);
}
else
{
painter->drawLine(curve_w - 1, step2, curve_w - 9, step2);
painter->drawLine(0, step2, 8, step2);
}
}
}
@ -770,9 +724,11 @@ void SignalCurve::drawWidget(QPainter *painter, int curve_w, int curve_h)
h_step /= 24.0;
fft_v_sense = v_sense * 35;
devparms->fft_voffset = 20;
fft_v_offset = curve_h * 0.75;
fft_v_sense = curve_h / -8.0;
fft_v_offset = (curve_h / 2.0) - ((curve_h / 80.0) * devparms->fft_voffset);
fft_h_offset = (curve_w / 2) - ((devparms->math_fft_hcenter / devparms->math_fft_hscale) * curve_w / devparms->hordivisions);
@ -808,16 +764,16 @@ void SignalCurve::drawWidget(QPainter *painter, int curve_w, int curve_h)
convert_to_metric_suffix(str + strlen(str), 10, 2);
strcat(str, "dBV ");
convert_to_metric_suffix(str + strlen(str), devparms->math_fft_hscale, 2);
strcat(str, "Hz/Div Center ");
strcat(str, "dBV/Div Center ");
convert_to_metric_suffix(str + strlen(str), devparms->math_fft_hcenter, 1);
strcat(str, "Hz ");
convert_to_metric_suffix(str + strlen(str), devparms->math_fft_hscale, 2);
strcat(str, "Hz/Div ");
if(devparms->timebasedelayenable)
{
convert_to_metric_suffix(str + strlen(str), 100.0 / devparms->timebasedelayscale, 0);
@ -841,19 +797,6 @@ void SignalCurve::drawWidget(QPainter *painter, int curve_w, int curve_h)
painter->drawText(15, 30, str);
}
// clk_end = clock();
//
// cpu_time_used += ((double) (clk_end - clk_start)) / CLOCKS_PER_SEC;
//
// scr_update_cntr++;
//
// if(!(scr_update_cntr % 50))
// {
// printf("CPU time used: %f\n", cpu_time_used / 50);
//
// cpu_time_used = 0;
// }
}

Wyświetl plik

@ -149,6 +149,7 @@ private:
void drawTopLabels(QPainter *);
void paintLabel(QPainter *, int, int, int, int, const char *, QColor);
void paintCounterLabel(QPainter *, int, int);
void drawFFT(QPainter *, int, int);
struct device_settings *devparms;