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(sender()); + if (widget) { + for (i=0; i= 0) && (channel <=MAXTRACES)) { + channel = channel + 1; + if (channel != m_triggerChannel) { + m_triggerChannel = channel; + m_triggerChannelSet = true; + } + } + } + + for (int i=0; isetTriggerChannel(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 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(); diff --git a/servers/gpib_server_lin/src/scope_functions.cpp b/servers/gpib_server_lin/src/scope_functions.cpp index 81a31a5..6b6f61a 100644 --- a/servers/gpib_server_lin/src/scope_functions.cpp +++ b/servers/gpib_server_lin/src/scope_functions.cpp @@ -308,7 +308,7 @@ int scope_get_timebase(double * retval, const char * scopeType, int gpibDevice) } else { floatstring[ai]=0; - *retval = floatstring; + *retval = atoi(floatstring); } #ifdef ENABLE_EXTRA_DEBUGGING