diff --git a/global.h b/global.h index 849aa48..ff74751 100644 --- a/global.h +++ b/global.h @@ -35,7 +35,7 @@ #define PROGRAM_NAME "DSRemote" -#define PROGRAM_VERSION "0.34_1612311057" +#define PROGRAM_VERSION "0.34_1612311710" #define MAX_PATHLEN 4096 @@ -134,6 +134,8 @@ struct device_settings int chandisplay[MAX_CHNS]; // 0=off, 1=on int chanimpedance[MAX_CHNS]; // 0=1MOhm, 1=50Ohm int chaninvert[MAX_CHNS]; // 0=normal, 1=inverted + int chanunit[MAX_CHNS]; // 0=V, 1=W, 2=A, 3=U + char chanunitstr[4][2]; double chanoffset[MAX_CHNS]; // expressed in volts double chanprobe[MAX_CHNS]; // Probe attenuation ratio e.g. 10:1 double chanscale[MAX_CHNS]; diff --git a/interface.cpp b/interface.cpp index 78b46a3..8117d6b 100644 --- a/interface.cpp +++ b/interface.cpp @@ -423,7 +423,7 @@ void UI_Mainwindow::trigAdjustDialChanged(int new_pos) convert_to_metric_suffix(str + strlen(str), devparms.triggeredgelevel[chn], 2); - strcat(str, "V"); + strcat(str, devparms.chanunitstr[devparms.chanunit[chn]]); statusLabel->setText(str); @@ -866,7 +866,7 @@ void UI_Mainwindow::vertOffsetDialChanged(int new_pos) convert_to_metric_suffix(str + strlen(str), devparms.chanoffset[chn], 2); - strcat(str, "V"); + strcat(str, devparms.chanunitstr[devparms.chanunit[chn]]); statusLabel->setText(str); @@ -994,7 +994,7 @@ void UI_Mainwindow::vertScaleDialChanged(int new_pos) convert_to_metric_suffix(str + strlen(str), devparms.chanscale[chn], 2); - strcat(str, "V"); + strcat(str, devparms.chanunitstr[devparms.chanunit[chn]]); statusLabel->setText(str); @@ -2129,7 +2129,8 @@ void UI_Mainwindow::chan_menu() submenubwl, submenucoupling, submenuinvert, - submenuprobe; + submenuprobe, + submenuunit; QList actionList; @@ -2209,6 +2210,82 @@ void UI_Mainwindow::chan_menu() } submenuprobe.addAction("100X", this, SLOT(chan_probe_100())); actionList = submenuprobe.actions(); + if(devparms.modelserie != 6) + { + if(!dblcmp(devparms.chanprobe[devparms.activechannel], 0.1)) + { + actionList[0]->setCheckable(true); + actionList[0]->setChecked(true); + } + else if(!dblcmp(devparms.chanprobe[devparms.activechannel], 0.2)) + { + actionList[1]->setCheckable(true); + actionList[1]->setChecked(true); + } + else if(!dblcmp(devparms.chanprobe[devparms.activechannel], 0.5)) + { + actionList[2]->setCheckable(true); + actionList[2]->setChecked(true); + } + else if(!dblcmp(devparms.chanprobe[devparms.activechannel], 1)) + { + actionList[3]->setCheckable(true); + actionList[3]->setChecked(true); + } + else if(!dblcmp(devparms.chanprobe[devparms.activechannel], 2)) + { + actionList[4]->setCheckable(true); + actionList[4]->setChecked(true); + } + else if(!dblcmp(devparms.chanprobe[devparms.activechannel], 5)) + { + actionList[5]->setCheckable(true); + actionList[5]->setChecked(true); + } + else if(!dblcmp(devparms.chanprobe[devparms.activechannel], 10)) + { + actionList[6]->setCheckable(true); + actionList[6]->setChecked(true); + } + else if(!dblcmp(devparms.chanprobe[devparms.activechannel], 20)) + { + actionList[7]->setCheckable(true); + actionList[7]->setChecked(true); + } + else if(!dblcmp(devparms.chanprobe[devparms.activechannel], 50)) + { + actionList[8]->setCheckable(true); + actionList[8]->setChecked(true); + } + else if(!dblcmp(devparms.chanprobe[devparms.activechannel], 100)) + { + actionList[9]->setCheckable(true); + actionList[9]->setChecked(true); + } + } + else + { + if(!dblcmp(devparms.chanprobe[devparms.activechannel], 0.1)) + { + actionList[0]->setCheckable(true); + actionList[0]->setChecked(true); + } + else if(!dblcmp(devparms.chanprobe[devparms.activechannel], 1)) + { + actionList[1]->setCheckable(true); + actionList[1]->setChecked(true); + } + else if(!dblcmp(devparms.chanprobe[devparms.activechannel], 10)) + { + actionList[2]->setCheckable(true); + actionList[2]->setChecked(true); + } + else if(!dblcmp(devparms.chanprobe[devparms.activechannel], 100)) + { + actionList[3]->setCheckable(true); + actionList[3]->setChecked(true); + } + } menu.addMenu(&submenuprobe); submenuinvert.setTitle("Invert"); @@ -2227,6 +2304,16 @@ void UI_Mainwindow::chan_menu() } menu.addMenu(&submenuinvert); + submenuunit.setTitle("Unit"); + submenuunit.addAction("Volt", this, SLOT(chan_unit_v())); + submenuunit.addAction("Watt", this, SLOT(chan_unit_w())); + submenuunit.addAction("Ampere", this, SLOT(chan_unit_a())); + submenuunit.addAction("Unknown", this, SLOT(chan_unit_u())); + actionList = submenuunit.actions(); + actionList[devparms.chanunit[devparms.activechannel]]->setCheckable(true); + actionList[devparms.chanunit[devparms.activechannel]]->setChecked(true); + menu.addMenu(&submenuunit); + menu.exec(chanMenuButton->mapToGlobal(QPoint(0,0))); } @@ -2534,6 +2621,70 @@ void UI_Mainwindow::chan_coupling_gnd() } +void UI_Mainwindow::chan_unit_v() +{ + char str[128]; + + devparms.chanunit[devparms.activechannel] = 0; + + sprintf(str, "Channel %i units: Volt", devparms.activechannel + 1); + + statusLabel->setText(str); + + sprintf(str, ":CHAN%i:UNIT VOLT", devparms.activechannel + 1); + + set_cue_cmd(str); +} + + +void UI_Mainwindow::chan_unit_w() +{ + char str[128]; + + devparms.chanunit[devparms.activechannel] = 1; + + sprintf(str, "Channel %i units: Watt", devparms.activechannel + 1); + + statusLabel->setText(str); + + sprintf(str, ":CHAN%i:UNIT WATT", devparms.activechannel + 1); + + set_cue_cmd(str); +} + + +void UI_Mainwindow::chan_unit_a() +{ + char str[128]; + + devparms.chanunit[devparms.activechannel] = 2; + + sprintf(str, "Channel %i units: Ampere", devparms.activechannel + 1); + + statusLabel->setText(str); + + sprintf(str, ":CHAN%i:UNIT AMP", devparms.activechannel + 1); + + set_cue_cmd(str); +} + + +void UI_Mainwindow::chan_unit_u() +{ + char str[128]; + + devparms.chanunit[devparms.activechannel] = 3; + + sprintf(str, "Channel %i units: Unknown", devparms.activechannel + 1); + + statusLabel->setText(str); + + sprintf(str, ":CHAN%i:UNIT UNKN", devparms.activechannel + 1); + + set_cue_cmd(str); +} + + void UI_Mainwindow::chan_probe_01() { char str[128]; @@ -2894,7 +3045,7 @@ void UI_Mainwindow::vertOffsetDialClicked(QPoint) convert_to_metric_suffix(str + strlen(str), devparms.chanoffset[chn], 2); - strcat(str, "V"); + strcat(str, devparms.chanunitstr[devparms.chanunit[chn]]); statusLabel->setText(str); @@ -3535,7 +3686,7 @@ void UI_Mainwindow::trigAdjustDialClicked(QPoint) convert_to_metric_suffix(str + strlen(str), devparms.triggeredgelevel[devparms.triggeredgesource], 2); - strcat(str, "V"); + strcat(str, devparms.chanunitstr[devparms.chanunit[devparms.triggeredgesource]]); statusLabel->setText(str); diff --git a/mainwindow.cpp b/mainwindow.cpp index 30627f3..d32a7bc 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -2238,7 +2238,7 @@ void UI_Mainwindow::shift_trace_up() convert_to_metric_suffix(str + strlen(str), devparms.chanoffset[chn], 2); - strcat(str, "V"); + strcat(str, devparms.chanunitstr[devparms.chanunit[chn]]); statusLabel->setText(str); @@ -2346,7 +2346,7 @@ void UI_Mainwindow::shift_trace_down() convert_to_metric_suffix(str + strlen(str), devparms.chanoffset[chn], 2); - strcat(str, "V"); + strcat(str, devparms.chanunitstr[devparms.chanunit[chn]]); statusLabel->setText(str); diff --git a/mainwindow.h b/mainwindow.h index 776b816..312d668 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -372,6 +372,11 @@ private slots: void chan_probe_50(); void chan_probe_100(); + void chan_unit_v(); + void chan_unit_w(); + void chan_unit_a(); + void chan_unit_u(); + void chan_menu(); void math_menu(); diff --git a/mainwindow_constr.cpp b/mainwindow_constr.cpp index 80e97d2..0d41abe 100644 --- a/mainwindow_constr.cpp +++ b/mainwindow_constr.cpp @@ -71,6 +71,11 @@ UI_Mainwindow::UI_Mainwindow() devparms.chanscale[i] = 1; } + strcpy(devparms.chanunitstr[0], "V"); + strcpy(devparms.chanunitstr[1], "W"); + strcpy(devparms.chanunitstr[2], "A"); + strcpy(devparms.chanunitstr[3], "U"); + devparms.fftbuf_in = (double *)malloc(FFT_MAX_BUFSZ * sizeof(double)); devparms.fftbuf_out = (double *)malloc(FFT_MAX_BUFSZ * sizeof(double)); diff --git a/read_settings_thread.cpp b/read_settings_thread.cpp index 8025e76..d5ea163 100644 --- a/read_settings_thread.cpp +++ b/read_settings_thread.cpp @@ -283,6 +283,43 @@ void read_settings_thread::run() devparms->chanprobe[chn] = atof(device->buf); + sprintf(str, ":CHAN%i:UNIT?", chn + 1); + + usleep(TMC_GDS_DELAY); + + if(tmc_write(str) != 12) + { + line = __LINE__; + goto GDS_OUT_ERROR; + } + + if(tmc_read() < 1) + { + line = __LINE__; + goto GDS_OUT_ERROR; + } + + if(!strcmp(device->buf, "VOLT")) + { + devparms->chanunit[chn] = 0; + } + else if(!strcmp(device->buf, "WATT")) + { + devparms->chanunit[chn] = 1; + } + else if(!strcmp(device->buf, "AMP")) + { + devparms->chanunit[chn] = 2; + } + else if(!strcmp(device->buf, "UNKN")) + { + devparms->chanunit[chn] = 3; + } + else + { + devparms->chanunit[chn] = 0; + } + sprintf(str, ":CHAN%i:SCAL?", chn + 1); usleep(TMC_GDS_DELAY); diff --git a/signalcurve.cpp b/signalcurve.cpp index 541ce09..55ddc64 100644 --- a/signalcurve.cpp +++ b/signalcurve.cpp @@ -563,7 +563,7 @@ void SignalCurve::drawWidget(QPainter *painter, int curve_w, int curve_h) { convert_to_metric_suffix(str, devparms->triggeredgelevel[devparms->triggeredgesource], 2); - strcat(str, "V"); + strcat(str, devparms->chanunitstr[devparms->chanunit[devparms->triggeredgesource]]); paintLabel(painter, curve_w - 120, curve_h - 50, 100, 20, str, QColor(255, 128, 0)); } @@ -571,7 +571,7 @@ void SignalCurve::drawWidget(QPainter *painter, int curve_w, int curve_h) { convert_to_metric_suffix(str, devparms->chanoffset[0], 2); - strcat(str, "V"); + strcat(str, devparms->chanunitstr[devparms->chanunit[0]]); paintLabel(painter, 20, curve_h - 50, 100, 20, str, SignalColor[0]); } @@ -579,7 +579,7 @@ void SignalCurve::drawWidget(QPainter *painter, int curve_w, int curve_h) { convert_to_metric_suffix(str, devparms->chanoffset[1], 2); - strcat(str, "V"); + strcat(str, devparms->chanunitstr[devparms->chanunit[1]]); paintLabel(painter, 20, curve_h - 50, 100, 20, str, SignalColor[1]); } @@ -587,7 +587,7 @@ void SignalCurve::drawWidget(QPainter *painter, int curve_w, int curve_h) { convert_to_metric_suffix(str, devparms->chanoffset[2], 2); - strcat(str, "V"); + strcat(str, devparms->chanunitstr[devparms->chanunit[2]]); paintLabel(painter, 20, curve_h - 50, 100, 20, str, SignalColor[2]); } @@ -595,7 +595,7 @@ void SignalCurve::drawWidget(QPainter *painter, int curve_w, int curve_h) { convert_to_metric_suffix(str, devparms->chanoffset[3], 2); - strcat(str, "V"); + strcat(str, devparms->chanunitstr[devparms->chanunit[3]]); paintLabel(painter, 20, curve_h - 50, 100, 20, str, SignalColor[3]); } @@ -1133,7 +1133,7 @@ void SignalCurve::drawTopLabels(QPainter *painter) convert_to_metric_suffix(str, devparms->triggeredgelevel[devparms->triggeredgesource], 2); - strcat(str, "V"); + strcat(str, devparms->chanunitstr[devparms->chanunit[devparms->triggeredgesource]]); if(devparms->triggeredgesource < 4) { @@ -1256,7 +1256,7 @@ void SignalCurve::drawChanLabel(QPainter *painter, int xpos, int ypos, int chn) convert_to_metric_suffix(str2, devparms->chanscale[chn], 2); - strcat(str2, "V"); + strcat(str2, devparms->chanunitstr[devparms->chanunit[chn]]); if(devparms->chanbwlimit[chn]) { @@ -1924,7 +1924,7 @@ void SignalCurve::mouseReleaseEvent(QMouseEvent *release_event) convert_to_metric_suffix(str + strlen(str), devparms->triggeredgelevel[devparms->triggeredgesource], 2); - strcat(str, "V"); + strcat(str, devparms->chanunitstr[devparms->chanunit[devparms->triggeredgesource]]); mainwindow->statusLabel->setText(str); @@ -1970,7 +1970,7 @@ void SignalCurve::mouseReleaseEvent(QMouseEvent *release_event) convert_to_metric_suffix(str + strlen(str), devparms->chanoffset[chn], 3); - strcat(str, "V"); + strcat(str, devparms->chanunitstr[devparms->chanunit[chn]]); mainwindow->statusLabel->setText(str); diff --git a/wave_view.cpp b/wave_view.cpp index 16fcc59..1d82332 100644 --- a/wave_view.cpp +++ b/wave_view.cpp @@ -572,7 +572,7 @@ void WaveCurve::drawTopLabels(QPainter *painter) convert_to_metric_suffix(str, devparms->triggeredgelevel[devparms->triggeredgesource], 2); - strcat(str, "V"); + strcat(str, devparms->chanunitstr[devparms->chanunit[devparms->triggeredgesource]]); if(devparms->triggeredgesource < 4) {