Branch: master

cfa07a98 2019-02-03 09:54:42 Timothy Pearson
Add average/integral/derivative math operators
M clients/tde/src/part/scope/part.cpp

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 18a19c0..ab9c2d0 100644
--- a/clients/tde/src/part/scope/part.cpp
+++ b/clients/tde/src/part/scope/part.cpp
@@ -482,6 +482,9 @@
 	m_availableMathOperators.append(MathOperator("-", 2));
 	m_availableMathOperators.append(MathOperator("*", 2));
 	m_availableMathOperators.append(MathOperator("/", 2));
+	m_availableMathOperators.append(MathOperator("Average", 1));
+	m_availableMathOperators.append(MathOperator("Integral", 1));
+	m_availableMathOperators.append(MathOperator("Derivative", 1));
 #ifdef ENABLE_FFT
 	m_availableMathOperators.append(MathOperator("FFT", 1));
 #endif // ENABLE_FFT
@@ -2569,7 +2572,10 @@
 	if ((m_mathOperator[traceno] == "+")
 		|| (m_mathOperator[traceno] == "-")
 		|| (m_mathOperator[traceno] == "*")
-		|| (m_mathOperator[traceno] == "/")) {
+		|| (m_mathOperator[traceno] == "/")
+		|| (m_mathOperator[traceno] == "Average")
+		|| (m_mathOperator[traceno] == "Integral")
+		|| (m_mathOperator[traceno] == "Derivative")) {
 		// Compute intersection of both trace operand volt/div lists
 		m_mathTraceAllowedVoltsDiv[traceno].clear();
 		TQDoubleList::iterator it;
@@ -2684,6 +2690,65 @@
 			m_base->traceZoomWidget->setSamples(m_maxNumberOfTraces-1+traceno, outputValues);
 			m_base->traceZoomWidget->setPositions(m_maxNumberOfTraces-1+traceno, outputPositions);
 		}
+		else if (m_mathOperator[traceno] == "Average") {
+			TQDoubleArray outputValues;
+			TQDoubleArray outputPositions;
+			TQDoubleArray inputValues = m_traceWidget->samples(m_mathFirstOperand[traceno]-1);
+			TQDoubleArray inputPositions = m_traceWidget->positions(m_mathFirstOperand[traceno]-1);
+			outputValues.resize(m_samplesInMathTrace[traceno]);
+			outputPositions = inputPositions;
+
+			double accumulator = 0;
+			for (int i=0; i < m_samplesInMathTrace[traceno]; i++) {
+				accumulator += inputValues[i];
+			}
+			accumulator /= m_samplesInMathTrace[traceno];
+			for (int i=0; i < m_samplesInMathTrace[traceno]; i++) {
+				outputValues[i] = accumulator;
+			}
+
+			m_traceWidget->setSamples(m_maxNumberOfTraces-1+traceno, outputValues);
+			m_traceWidget->setPositions(m_maxNumberOfTraces-1+traceno, outputPositions);
+			m_base->traceZoomWidget->setSamples(m_maxNumberOfTraces-1+traceno, outputValues);
+			m_base->traceZoomWidget->setPositions(m_maxNumberOfTraces-1+traceno, outputPositions);
+		}
+		else if (m_mathOperator[traceno] == "Integral") {
+			TQDoubleArray outputValues;
+			TQDoubleArray outputPositions;
+			TQDoubleArray inputValues = m_traceWidget->samples(m_mathFirstOperand[traceno]-1);
+			TQDoubleArray inputPositions = m_traceWidget->positions(m_mathFirstOperand[traceno]-1);
+			outputValues.resize(m_samplesInMathTrace[traceno]);
+			outputPositions = inputPositions;
+
+			double accumulator = 0;
+			for (int i=0; i < m_samplesInMathTrace[traceno]; i++) {
+				accumulator += inputValues[i];
+				outputValues[i] = accumulator;
+			}
+
+			m_traceWidget->setSamples(m_maxNumberOfTraces-1+traceno, outputValues);
+			m_traceWidget->setPositions(m_maxNumberOfTraces-1+traceno, outputPositions);
+			m_base->traceZoomWidget->setSamples(m_maxNumberOfTraces-1+traceno, outputValues);
+			m_base->traceZoomWidget->setPositions(m_maxNumberOfTraces-1+traceno, outputPositions);
+		}
+		else if (m_mathOperator[traceno] == "Derivative") {
+			TQDoubleArray outputValues;
+			TQDoubleArray outputPositions;
+			TQDoubleArray inputValues = m_traceWidget->samples(m_mathFirstOperand[traceno]-1);
+			TQDoubleArray inputPositions = m_traceWidget->positions(m_mathFirstOperand[traceno]-1);
+			outputValues.resize(m_samplesInMathTrace[traceno]);
+			outputPositions = inputPositions;
+
+			outputValues[0] = 0;
+			for (int i=1; i < m_samplesInMathTrace[traceno]; i++) {
+				outputValues[i] = inputValues[i] - inputValues[i-1];
+			}
+
+			m_traceWidget->setSamples(m_maxNumberOfTraces-1+traceno, outputValues);
+			m_traceWidget->setPositions(m_maxNumberOfTraces-1+traceno, outputPositions);
+			m_base->traceZoomWidget->setSamples(m_maxNumberOfTraces-1+traceno, outputValues);
+			m_base->traceZoomWidget->setPositions(m_maxNumberOfTraces-1+traceno, outputPositions);
+		}
 #ifdef ENABLE_FFT
 		else if (m_mathOperator[traceno] == "FFT") {
 			TQDoubleArray outputValues;