Branch: master

5bded609 2019-05-13 21:31:28 Timothy Pearson
Add postprocessing support to channels
Minor fixes to math trace handling
Postprocessing settings are not yet saved
M clients/tde/src/part/scope/layout.ui
M clients/tde/src/part/scope/part.cpp
M clients/tde/src/part/scope/part.h
M clients/tde/src/widgets/tracewidget.cpp
M clients/tde/src/widgets/tracewidget.h

clients/tde/src/part/scope/layout.ui

diff --git a/clients/tde/src/part/scope/layout.ui b/clients/tde/src/part/scope/layout.ui
index 5447780..e14cb65 100644
--- a/clients/tde/src/part/scope/layout.ui
+++ b/clients/tde/src/part/scope/layout.ui
@@ -124,6 +124,11 @@
 						<grid>
 							<widget class="TQWidget" row="0" column="0" colspan="1">
 								<property name="name">
+									<cstring>postProcessTraceControlLayoutWidget</cstring>
+								</property>
+							</widget>
+							<widget class="TQWidget" row="1" column="0" colspan="1">
+								<property name="name">
 									<cstring>mathTraceControlLayoutWidget</cstring>
 								</property>
 							</widget>

clients/tde/src/part/scope/part.cpp

diff --git a/clients/tde/src/part/scope/part.cpp b/clients/tde/src/part/scope/part.cpp
index 44dbb84..e5ebfa4 100644
--- a/clients/tde/src/part/scope/part.cpp
+++ b/clients/tde/src/part/scope/part.cpp
@@ -15,9 +15,9 @@
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  *
- * (c) 2012-2019 Timothy Pearson
- * Raptor Engineering
- * http://www.raptorengineeringinc.com
+ * (c) 2012 - 2019 Timothy Pearson
+ * Raptor Engineering, LLC
+ * http://www.raptorengineering.com
  */
 
 #include "define.h"
@@ -189,6 +189,63 @@
 
 void TraceControlWidget::triggerRequested() {
 	emit(triggerChannelChangeRequested());
+}
+
+TracePostProcessControlWidget::TracePostProcessControlWidget(TQWidget *parent, const char *name)
+	: TQWidget(parent, name)
+{
+	TQGridLayout *topGrid = new TQGridLayout(this);
+	m_groupBox = new TQGroupBox(this);
+	m_groupBox->setColumnLayout(0, TQt::Vertical);
+	topGrid->addMultiCellWidget(m_groupBox, 0, 0, 0, 0);
+	m_groupBox->setTitle(i18n("Unknown Channel"));
+	m_primaryLayout = new TQGridLayout(m_groupBox->layout(), 1, 1, KDialog::spacingHint());
+
+	m_postProcessEnabledCheckBox = new TQCheckBox(m_groupBox);
+	connect(m_postProcessEnabledCheckBox, SIGNAL(clicked()), this, SLOT(enableClicked()));
+	m_postProcessEnabledCheckBox->setText(i18n("Enable"));
+	m_primaryLayout->addMultiCellWidget(m_postProcessEnabledCheckBox, 0, 0, 0, 0);
+
+	m_voltsMultiplierSpinBox = new FloatSpinBox(m_groupBox);
+	m_voltsMultiplierSpinBox->setFloatMax(1000);
+	m_voltsMultiplierSpinBox->setFloatMin(-1000);
+	m_voltsMultiplierSpinBox->setFloatValue(1.0);
+	connect(m_voltsMultiplierSpinBox, SIGNAL(floatValueChanged(double)), this, SLOT(vMultChanged(double)));
+	m_voltsMultiplierSpinBox->setEnabled(false);
+	m_primaryLayout->addMultiCellWidget(m_voltsMultiplierSpinBox, 0, 0, 1, 1);
+
+	TQLabel* label = new TQLabel(m_groupBox);
+	label->setText(i18n("V/div multiplier"));
+	m_primaryLayout->addMultiCellWidget(label, 0, 0, 2, 2);
+}
+
+TracePostProcessControlWidget::~TracePostProcessControlWidget() {
+	//
+}
+
+void TracePostProcessControlWidget::setSelectedVoltsMultiplier(double vmult) {
+	m_voltsMultiplierSpinBox->setFloatValue(vmult);
+}
+
+void TracePostProcessControlWidget::setPostProcessEnabled(bool enabled) {
+	m_postProcessEnabledCheckBox->setChecked(enabled);
+	m_voltsMultiplierSpinBox->setEnabled(enabled);
+}
+
+void TracePostProcessControlWidget::setTraceName(TQString name) {
+	m_groupBox->setTitle(name);
+}
+
+void TracePostProcessControlWidget::enableClicked() {
+	bool enabled = m_postProcessEnabledCheckBox->isOn();
+	m_voltsMultiplierSpinBox->setEnabled(enabled);
+	emit(enableChanged(enabled));
+}
+
+void TracePostProcessControlWidget::vMultChanged(double vmult) {
+	Q_UNUSED(vmult)
+	double value = m_voltsMultiplierSpinBox->floatValue();
+	emit(voltsMultiplierChanged(value));
 }
 
 MathTraceControlWidget::MathTraceControlWidget(TQWidget *parent, const char *name)
@@ -494,7 +551,10 @@
 		m_traceAllowedVoltsDiv[traceno].clear();
 		m_voltsDiv[traceno] = 0;
 		m_secsDiv[traceno] = 0;
+		m_channelPostProcessActive[traceno] = false;
+		m_channelPostProcessVoltsMult[traceno] = 1;
 		m_traceControlWidgetList[traceno] = NULL;
+		m_tracePostProcessControlWidgetList[traceno] = NULL;
 
 		m_voltsDivSet[traceno] = false;
 		m_channelActiveSet[traceno] = false;
@@ -520,6 +580,7 @@
 	// Create widgets
 	m_base = new ScopeBase(widget());
 	m_traceControlWidgetGrid = new TQGridLayout(m_base->traceControlLayoutWidget);
+	m_postProcessTraceControlWidgetGrid = new TQGridLayout(m_base->postProcessTraceControlLayoutWidget);
 	m_mathTraceControlWidgetGrid = new TQGridLayout(m_base->mathTraceControlLayoutWidget);
 	m_timebaseControlWidgetGrid = new TQGridLayout(m_base->timebaseControlLayoutWidget);
 	m_timebaseControlWidget = new TimebaseControlWidget(m_base->timebaseControlLayoutWidget);
@@ -2134,15 +2195,19 @@
 		TQDataStream ds(&file);
 		TQ_INT32 magicNumber;
 		TQ_INT32 version;
+		TQ_INT16 savedMaxNumberOfMathTraces;
 		ds >> magicNumber;
 		if (magicNumber == WAVEFORM_MAGIC_NUMBER) {
 			ds >> version;
 			if ((version >= 1) && (version <= WAVEFORM_FILE_VERSION)) {
 				ds >> m_hdivs;
 				ds >> m_vdivs;
-				ds >> m_maxNumberOfTraces;
+				ds >> savedMaxNumberOfMathTraces;
 				if (version >= 3) {
-					ds >> m_maxNumberOfMathTraces;
+					ds >> savedMaxNumberOfMathTraces;
+					if (savedMaxNumberOfMathTraces > m_maxNumberOfMathTraces) {
+						m_maxNumberOfMathTraces = savedMaxNumberOfMathTraces;
+					}
 				}
 				for (int traceno=1; traceno<=m_maxNumberOfTraces; traceno++) {
 					TQ_UINT8 boolValue;
@@ -2169,7 +2234,7 @@
 					m_base->traceZoomWidget->setTraceOffset(traceno-1, offset);
 				}
 				if (version >= 3) {
-					for (int traceno=1; traceno<=m_maxNumberOfMathTraces; traceno++) {
+					for (int traceno=1; traceno<=savedMaxNumberOfMathTraces; traceno++) {
 						TQ_UINT8 boolValue;
 						ds >> boolValue;
 						m_mathChannelActive[traceno] = (boolValue!=0)?true:false;
@@ -2183,6 +2248,13 @@
 							m_traceWidget->setTraceOffset(traceno-1+m_maxNumberOfTraces, offset);
 							m_base->traceZoomWidget->setTraceOffset(traceno-1+m_maxNumberOfTraces, offset);
 						}
+					}
+					for (int traceno=savedMaxNumberOfMathTraces+1; traceno<=m_maxNumberOfMathTraces; traceno++) {
+						m_mathChannelActive[traceno] = false;
+						m_mathVoltsDiv[traceno] = m_mathTraceAllowedVoltsDiv[traceno][0];
+						m_mathFirstOperand[traceno] = 1;
+						m_mathSecondOperand[traceno] = 1;
+						m_mathOperator[traceno] = "+"; 
 					}
 				}
 				for (int cursorno=0; cursorno<5; cursorno++) {
@@ -2359,11 +2431,23 @@
 			m_traceControlWidgetList[i]->setTraceName(i18n("Channel %1").arg(i+1));
 			m_traceControlWidgetList[i]->show();
 		}
+		if (!m_tracePostProcessControlWidgetList[i]) {
+			m_tracePostProcessControlWidgetList[i] = new TracePostProcessControlWidget(m_base->postProcessTraceControlLayoutWidget);
+			connect(m_tracePostProcessControlWidgetList[i], SIGNAL(enableChanged(bool)), this, SLOT(tracePostProcessControlEnableChanged(bool)));
+			connect(m_tracePostProcessControlWidgetList[i], SIGNAL(voltsMultiplierChanged(double)), this, SLOT(tracePostProcessControlVMultChanged(double)));
+			m_postProcessTraceControlWidgetGrid->addMultiCellWidget(m_tracePostProcessControlWidgetList[i], i, i, 0, 0);
+			m_tracePostProcessControlWidgetList[i]->setTraceName(i18n("Channel %1").arg(i+1));
+			m_tracePostProcessControlWidgetList[i]->show();
+		}
 	}
 	for (i=m_maxNumberOfTraces; i<MAXTRACES;i++) {
 		if (m_traceControlWidgetList[i]) {
 			m_traceControlWidgetGrid->remove(m_traceControlWidgetList[i]);
 			delete m_traceControlWidgetList[i];
+		}
+		if (m_tracePostProcessControlWidgetList[i]) {
+			m_postProcessTraceControlWidgetGrid->remove(m_tracePostProcessControlWidgetList[i]);
+			delete m_tracePostProcessControlWidgetList[i];
 		}
 	}
 	for (i=0; i<m_maxNumberOfMathTraces;i++) {
@@ -2438,6 +2522,66 @@
 	m_horizontalTimebaseSet = true;
 }
 
+void ScopePart::tracePostProcessControlEnableChanged(bool enabled) {
+	int i;
+	int channel = -1;
+	const TracePostProcessControlWidget* widget = dynamic_cast<const TracePostProcessControlWidget*>(sender());
+	if (widget) {
+		for (i=0; i<MAXTRACES;i++) {
+			if (m_tracePostProcessControlWidgetList[i] == widget) {
+				channel = i;
+				break;
+			}
+		}
+		if ((channel >= 0) && (channel <=MAXTRACES)) {
+			m_channelPostProcessActive[channel+1] = enabled;
+			if (m_channelPostProcessActive[channel+1]) {
+				m_traceWidget->setTraceVerticalMultiplier(channel, m_channelPostProcessVoltsMult[channel+1]);
+				m_base->traceZoomWidget->setTraceVerticalMultiplier(channel, m_channelPostProcessVoltsMult[channel+1]);
+			}
+			else {
+				m_traceWidget->setTraceVerticalMultiplier(channel, 1.0);
+				m_base->traceZoomWidget->setTraceVerticalMultiplier(channel, 1.0);
+			}
+		}
+	}
+
+	updateGraticule();
+	m_traceWidget->repaint(false);
+	m_base->traceZoomWidget->repaint(false);
+	updateTraceControlWidgets();
+}
+
+void ScopePart::tracePostProcessControlVMultChanged(double vmult) {
+	int i;
+	int channel = -1;
+	const TracePostProcessControlWidget* widget = dynamic_cast<const TracePostProcessControlWidget*>(sender());
+	if (widget) {
+		for (i=0; i<MAXTRACES;i++) {
+			if (m_tracePostProcessControlWidgetList[i] == widget) {
+				channel = i;
+				break;
+			}
+		}
+		if ((channel >= 0) && (channel <=MAXTRACES)) {
+			m_channelPostProcessVoltsMult[channel+1] = vmult;
+			if (m_channelPostProcessActive[channel+1]) {
+				m_traceWidget->setTraceVerticalMultiplier(channel, m_channelPostProcessVoltsMult[channel+1]);
+				m_base->traceZoomWidget->setTraceVerticalMultiplier(channel, m_channelPostProcessVoltsMult[channel+1]);
+			}
+			else {
+				m_traceWidget->setTraceVerticalMultiplier(channel, 1.0);
+				m_base->traceZoomWidget->setTraceVerticalMultiplier(channel, 1.0);
+			}
+		}
+	}
+
+	updateGraticule();
+	m_traceWidget->repaint(false);
+	m_base->traceZoomWidget->repaint(false);
+	updateTraceControlWidgets();
+}
+
 void ScopePart::mathTraceControlEnableChanged(bool enabled) {
** Diff limit reached (max: 250 lines) **