summaryrefslogtreecommitdiffstats
path: root/clients
diff options
context:
space:
mode:
authorTimothy Pearson <kb9vqf@pearsoncomputing.net>2014-04-25 01:46:44 -0500
committerTimothy Pearson <kb9vqf@pearsoncomputing.net>2014-04-25 01:46:44 -0500
commit5bb4cd0a02e682d7567b8298c1d93e78e511e657 (patch)
tree39c6a0506b3acf528c89a54a4ff9fcf38ee2febb /clients
parent15a8d153cc9cc40eff0fa5352f414f9b3a6246c6 (diff)
downloadulab-5bb4cd0a02e682d7567b8298c1d93e78e511e657.tar.gz
ulab-5bb4cd0a02e682d7567b8298c1d93e78e511e657.zip
Add trigger channel set to scope part
Diffstat (limited to 'clients')
-rw-r--r--clients/tde/src/app/main.cpp12
-rw-r--r--clients/tde/src/part/scope/part.cpp122
-rw-r--r--clients/tde/src/part/scope/part.h7
-rw-r--r--clients/tde/src/widgets/tracewidget.cpp8
-rw-r--r--clients/tde/src/widgets/tracewidget.h11
5 files changed, 142 insertions, 18 deletions
diff --git a/clients/tde/src/app/main.cpp b/clients/tde/src/app/main.cpp
index a8e3283..afc1843 100644
--- a/clients/tde/src/app/main.cpp
+++ b/clients/tde/src/app/main.cpp
@@ -15,7 +15,7 @@
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
- * (c) 2012-2013 Timothy Pearson
+ * (c) 2012-2014 Timothy Pearson
* Raptor Engineering
* http://www.raptorengineeringinc.com
*/
@@ -38,14 +38,14 @@ static const TDECmdLineOptions options[] =
static TDEAboutData about(
APP_NAME, I18N_NOOP( APP_PRETTYNAME ), APP_VERSION,
- I18N_NOOP("Graphical Remote Laboratory Workspaces Client"), TDEAboutData::License_GPL_V2,
- I18N_NOOP("(C) 2012-2013 Timothy Pearson"), 0,
- "http://ulab.trinitydesktop.org/", "kb9vqf@pearsoncomputing.net" );
+ I18N_NOOP("uLab Remote Laboratory Workspaces Graphical Client"), TDEAboutData::License_GPL_V2,
+ I18N_NOOP("(C) 2012-2014 Timothy Pearson"), 0,
+ "https://ulab.trinitydesktop.org/", "kb9vqf@pearsoncomputing.net" );
int main(int argc, char *argv[])
{
- about.addAuthor("Timothy Pearson", I18N_NOOP("Author, maintainer"), "kb9vqf@pearsoncomputing.net", "http://ulab.trinitydesktop.org/");
+ about.addAuthor("Timothy Pearson", I18N_NOOP("Author, maintainer"), "kb9vqf@pearsoncomputing.net", "https://ulab.trinitydesktop.org/");
TDECmdLineArgs::init(argc, argv, &about);
TDECmdLineArgs::addCmdLineOptions(options);
@@ -82,7 +82,7 @@ int main(int argc, char *argv[])
args->clear();
mainWin->show();
-
+
// mainWin has WDestructiveClose flag by default, so it will delete itself.
return app.exec();
}
diff --git a/clients/tde/src/part/scope/part.cpp b/clients/tde/src/part/scope/part.cpp
index f61e8a9..a909397 100644
--- a/clients/tde/src/part/scope/part.cpp
+++ b/clients/tde/src/part/scope/part.cpp
@@ -79,9 +79,10 @@ enum connectionStates {
ScopeState_TraceRequest = 50,
ScopeState_ChannelActiveStateUpdate = 100,
ScopeState_TraceVoltsDivUpdate = 102,
- ScopeState_TriggerLevelUpdate = 104,
- ScopeState_HorizontalTimebaseUpdate = 106,
- ScopeState_RunningUpdate = 108,
+ ScopeState_TriggerChannelUpdate = 104,
+ ScopeState_TriggerLevelUpdate = 106,
+ ScopeState_HorizontalTimebaseUpdate = 108,
+ ScopeState_RunningUpdate = 110,
ScopeState_ExternalCommandRequest = 255
};
@@ -115,6 +116,11 @@ TraceControlWidget::TraceControlWidget(TQWidget *parent, const char *name)
TQLabel* label = new TQLabel(m_groupBox);
label->setText(i18n("V/div"));
m_primaryLayout->addMultiCellWidget(label, 0, 0, 2, 2);
+
+ m_setTriggerChannelButton = new TQPushButton(m_groupBox);
+ m_setTriggerChannelButton->setText(i18n("TRIG"));
+ connect(m_setTriggerChannelButton, SIGNAL(clicked()), this, SLOT(triggerRequested()));
+ m_primaryLayout->addMultiCellWidget(m_setTriggerChannelButton, 0, 0, 3, 3);
}
TraceControlWidget::~TraceControlWidget() {
@@ -156,6 +162,11 @@ void TraceControlWidget::setTraceName(TQString name) {
m_groupBox->setTitle(name);
}
+void TraceControlWidget::setTriggerChannel(bool isTrigger) {
+// m_setTriggerChannelButton->setEnabled(!isTrigger);
+ m_setTriggerChannelButton->setDown(isTrigger);
+}
+
void TraceControlWidget::enableClicked() {
bool enabled = m_channelEnabledCheckBox->isOn();
m_voltsDivComboBox->setEnabled(enabled);
@@ -168,6 +179,10 @@ void TraceControlWidget::vdivChanged(int index) {
emit(voltsPerDivChanged(value));
}
+void TraceControlWidget::triggerRequested() {
+ emit(triggerChannelChangeRequested());
+}
+
TimebaseControlWidget::TimebaseControlWidget(TQWidget *parent, const char *name)
: TQWidget(parent, name)
{
@@ -257,6 +272,7 @@ ScopePart::ScopePart( TQWidget *parentWidget, const char *widgetName, TQObject *
m_channelActiveSet[traceno] = false;
}
m_triggerLevelSet = false;
+ m_triggerChannelSet = false;
m_horizontalTimebaseSet = false;
m_runningSet = false;
@@ -425,6 +441,7 @@ void ScopePart::setTickerMessage(TQString message) {
if (m_channelActiveSet[i]) updatesPending = true;
if (m_voltsDivSet[i]) updatesPending = true;
if (m_triggerLevelSet) updatesPending = true;
+ if (m_triggerChannelSet) updatesPending = true;
if (m_horizontalTimebaseSet) updatesPending = true;
if (m_runningSet) updatesPending = true;
}
@@ -1313,18 +1330,27 @@ void ScopePart::mainEventLoop() {
if (result == "ACK") {
m_currentOpChannel = getNextActiveChannel(m_currentOpChannel, m_channelActive, m_maxNumberOfTraces);
- if ((m_currentOpChannel > 0)
- && (m_channelActiveSet[m_currentOpChannel] == false)
+ if ((m_channelActiveSet[m_currentOpChannel] == false)
&& (m_voltsDivSet[m_currentOpChannel] == false)
&& (m_triggerLevelSet == false)
+ && (m_triggerChannelSet == false)
&& (m_horizontalTimebaseSet == false)
&& (m_runningSet == false)
) {
+ if (m_currentOpChannel <= 0) {
+ m_currentOpChannel = 1;
+ }
SET_NEXT_STATE(ScopeState_TraceRequest)
}
else {
m_currentOpChannel = 1;
- SET_NEXT_STATE(ScopeState_ChannelActiveStateUpdate)
+ if (m_traceWidget->userIsInteractingWithCursor()) {
+ // Defer pending updates until user has stopped changing cursor value(s)
+ SET_NEXT_STATE(ScopeState_TraceRequest)
+ }
+ else {
+ SET_NEXT_STATE(ScopeState_ChannelActiveStateUpdate)
+ }
}
EXEC_NEXT_STATE_IMMEDIATELY
}
@@ -1438,7 +1464,7 @@ void ScopePart::mainEventLoop() {
SET_NEXT_STATE(ScopeState_TraceVoltsDivUpdate)
}
else {
- SET_NEXT_STATE(ScopeState_TriggerLevelUpdate)
+ SET_NEXT_STATE(ScopeState_TriggerChannelUpdate)
}
}
EXEC_NEXT_STATE_IMMEDIATELY
@@ -1461,7 +1487,7 @@ void ScopePart::mainEventLoop() {
SET_NEXT_STATE(ScopeState_TraceVoltsDivUpdate)
}
else {
- SET_NEXT_STATE(ScopeState_TriggerLevelUpdate)
+ SET_NEXT_STATE(ScopeState_TriggerChannelUpdate)
}
EXEC_NEXT_STATE_IMMEDIATELY
}
@@ -1485,6 +1511,57 @@ void ScopePart::mainEventLoop() {
}
}
}
+ else if (m_commHandlerState == ScopeState_TriggerChannelUpdate) {
+ if (m_triggerChannelSet) {
+ // Set trigger channel, step 1
+ ds << TQString("SETTRIGGERCHANNEL");
+ ds << m_triggerChannel;
+ m_socket->writeEndOfFrame();
+
+ m_triggerChannelSet = false;
+ SET_NEXT_STATE_DATA_WAITING(ScopeState_TriggerChannelUpdate+1)
+ }
+ else {
+ SET_NEXT_STATE(ScopeState_TriggerLevelUpdate)
+ }
+ EXEC_NEXT_STATE_IMMEDIATELY
+ }
+ else if (m_commHandlerState == ScopeState_TriggerChannelUpdate+1) {
+ m_settingsChanged = true;
+ // Get response data
+ if (m_socket->canReadFrame()) {
+ PAT_WATCHDOG_TIMER
+ setTickerMessage(i18n("Updating [Set trigger level]"));
+
+ // Set trigger channel, step 2
+ TQString result;
+ ds >> result;
+ m_socket->clearFrameTail();
+
+ if (result == "ACK") {
+ SET_NEXT_STATE(ScopeState_TriggerLevelUpdate)
+ EXEC_NEXT_STATE_IMMEDIATELY
+ }
+ else {
+ if (stopTraceUpdate == false) {
+ COMMUNICATIONS_FAILED
+ }
+ else {
+ setTickerMessage(i18n("Data acquisition stopped"));
+ }
+ }
+ }
+ else {
+ if (!m_updateTimeoutTimer->isActive()) {
+ if (stopTraceUpdate == false) {
+ UPDATEDISPLAY_TIMEOUT
+ }
+ else {
+ setTickerMessage(i18n("Data acquisition stopped"));
+ }
+ }
+ }
+ }
else if (m_commHandlerState == ScopeState_TriggerLevelUpdate) {
if (m_triggerLevelSet) {
// Set trigger level, step 1
@@ -1752,6 +1829,7 @@ void ScopePart::stopDAQ() {
m_voltsDivSet[i] = false;
}
m_triggerLevelSet = false;
+ m_triggerChannelSet = false;
m_horizontalTimebaseSet = false;
m_runningSet = false;
m_commHandlerMode = 1;
@@ -1873,6 +1951,31 @@ void ScopePart::updateZoomWidgetLimits(const TQRectF& zoomRect) {
}
}
+void ScopePart::processTriggerButtons() {
+ int i;
+ int channel = -1;
+ const TraceControlWidget* widget = dynamic_cast<const TraceControlWidget*>(sender());
+ if (widget) {
+ for (i=0; i<MAXTRACES;i++) {
+ if (m_traceControlWidgetList[i] == widget) {
+ channel = i;
+ break;
+ }
+ }
+ if ((channel >= 0) && (channel <=MAXTRACES)) {
+ channel = channel + 1;
+ if (channel != m_triggerChannel) {
+ m_triggerChannel = channel;
+ m_triggerChannelSet = true;
+ }
+ }
+ }
+
+ for (int i=0; i<m_maxNumberOfTraces;i++) {
+ m_traceControlWidgetList[i]->setTriggerChannel(i == (m_triggerChannel-1));
+ }
+}
+
void ScopePart::updateGraticule() {
m_traceWidget->setNumberOfHorizontalDivisions(m_hdivs);
m_traceWidget->setNumberOfVerticalDivisions(m_vdivs);
@@ -1892,6 +1995,8 @@ void ScopePart::updateGraticule() {
}
}
+ processTriggerButtons();
+
if (m_maxNumberOfTraces > 0) m_traceWidget->setTraceColor(0, TQColor(255, 255, 255));
if (m_maxNumberOfTraces > 1) m_traceWidget->setTraceColor(1, TQColor(128, 255, 128));
if (m_maxNumberOfTraces > 2) m_traceWidget->setTraceColor(2, TQColor(255, 255, 128));
@@ -1933,6 +2038,7 @@ void ScopePart::updateTraceControlWidgets() {
m_traceControlWidgetList[i] = new TraceControlWidget(m_base->traceControlLayoutWidget);
connect(m_traceControlWidgetList[i], SIGNAL(enableChanged(bool)), this, SLOT(traceControlEnableChanged(bool)));
connect(m_traceControlWidgetList[i], SIGNAL(voltsPerDivChanged(double)), this, SLOT(traceControlVDivChanged(double)));
+ connect(m_traceControlWidgetList[i], SIGNAL(triggerChannelChangeRequested()), this, SLOT(processTriggerButtons()));
m_traceControlWidgetGrid->addMultiCellWidget(m_traceControlWidgetList[i], i, i, 0, 0);
m_traceControlWidgetList[i]->setTraceName(i18n("Channel %1").arg(i+1));
m_traceControlWidgetList[i]->show();
diff --git a/clients/tde/src/part/scope/part.h b/clients/tde/src/part/scope/part.h
index 22da008..db6fb7d 100644
--- a/clients/tde/src/part/scope/part.h
+++ b/clients/tde/src/part/scope/part.h
@@ -42,6 +42,7 @@ class TQRectF;
class TQGridLayout;
class TQCheckBox;
class TQGroupBox;
+class TQPushButton;
class ScopeBase;
namespace RemoteLab
@@ -59,20 +60,24 @@ namespace RemoteLab
void setSelectedVoltsPerDiv(double vdiv);
void setTraceEnabled(bool enabled);
void setTraceName(TQString name);
+ void setTriggerChannel(bool isTrigger);
signals:
void enableChanged(bool enabled);
void voltsPerDivChanged(double vdiv);
+ void triggerChannelChangeRequested();
private slots:
void enableClicked();
void vdivChanged(int index);
+ void triggerRequested();
private:
TQGroupBox* m_groupBox;
TQGridLayout* m_primaryLayout;
TQComboBox* m_voltsDivComboBox;
TQCheckBox* m_channelEnabledCheckBox;
+ TQPushButton* m_setTriggerChannelButton;
TQDoubleList m_voltsDivList;
};
@@ -135,6 +140,7 @@ namespace RemoteLab
void traceControlVDivChanged(double vdiv);
void traceControlSDivChanged(double sdiv);
void cursorLevelChanged(uint cursor, double level);
+ void processTriggerButtons();
void startScope();
void stopScope();
void saveWaveforms();
@@ -169,6 +175,7 @@ namespace RemoteLab
TraceControlWidget* m_traceControlWidgetList[MAXTRACES];
TimebaseControlWidget* m_timebaseControlWidget;
bool m_triggerLevelSet;
+ bool m_triggerChannelSet;
bool m_horizontalTimebaseSet;
bool m_runningSet;
bool m_voltsDivSet[MAXTRACES+1];
diff --git a/clients/tde/src/widgets/tracewidget.cpp b/clients/tde/src/widgets/tracewidget.cpp
index c3c3475..90e3977 100644
--- a/clients/tde/src/widgets/tracewidget.cpp
+++ b/clients/tde/src/widgets/tracewidget.cpp
@@ -1441,6 +1441,10 @@ void GraticuleWidget::mouseMoveEvent(TQMouseEvent *e) {
}
}
+bool GraticuleWidget::userIsInteractingWithCursor() {
+ return (m_movingCursor >= 0);
+}
+
void GraticuleWidget::enterEvent(TQEvent *) {
//
}
@@ -2544,6 +2548,10 @@ void TraceWidget::resizeCursorArray(uint newsize) {
}
}
+bool TraceWidget::userIsInteractingWithCursor() {
+ return m_graticuleWidget->userIsInteractingWithCursor();
+}
+
TQSize TraceWidget::sizeHint() const {
return TQWidget::sizeHint();
}
diff --git a/clients/tde/src/widgets/tracewidget.h b/clients/tde/src/widgets/tracewidget.h
index cda2188..9cf1d17 100644
--- a/clients/tde/src/widgets/tracewidget.h
+++ b/clients/tde/src/widgets/tracewidget.h
@@ -184,7 +184,7 @@ typedef TQMemArray<CursorData*> CursorList;
class GraticuleWidget : public TQWidget
{
Q_OBJECT
-
+
public:
GraticuleWidget(TraceWidget*, const char* = 0);
~GraticuleWidget();
@@ -192,6 +192,7 @@ class GraticuleWidget : public TQWidget
public:
virtual TQSizePolicy sizePolicy() const;
int virtualWidth();
+ bool userIsInteractingWithCursor();
protected:
virtual void paintEvent(TQPaintEvent*);
@@ -239,7 +240,7 @@ class TraceWidget : public TQWidget
SummaryText,
NoText
};
-
+
public:
TraceWidget(TQWidget* = 0, const char* = 0);
~TraceWidget();
@@ -310,6 +311,8 @@ class TraceWidget : public TQWidget
double traceTextOffset(uint traceNumber);
void setTraceTextOffset(uint traceNumber, double offset, bool deferUpdate);
+ bool userIsInteractingWithCursor();
+
static TQString prettyFormat(double value, double rangeDetectValue, TQString baseUnits, unsigned int precision=3);
virtual TQSize sizeHint() const;
@@ -381,7 +384,7 @@ class TraceWidget : public TQWidget
class TraceScrollView : public TQScrollView
{
Q_OBJECT
-
+
public:
TraceScrollView(TQWidget* = 0, const char* = 0);
~TraceScrollView();
@@ -400,7 +403,7 @@ class TraceScrollView : public TQScrollView
class TraceScrollWidget : public TQVBox
{
Q_OBJECT
-
+
public:
TraceScrollWidget(TQWidget* = 0, const char* = 0);
~TraceScrollWidget();