Add trigger channel set to scope part

master
Timothy Pearson 10 years ago
parent 15a8d153cc
commit 5bb4cd0a02

@ -15,7 +15,7 @@
* with this program; if not, write to the Free Software Foundation, Inc., * with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
* *
* (c) 2012-2013 Timothy Pearson * (c) 2012-2014 Timothy Pearson
* Raptor Engineering * Raptor Engineering
* http://www.raptorengineeringinc.com * http://www.raptorengineeringinc.com
*/ */
@ -38,14 +38,14 @@ static const TDECmdLineOptions options[] =
static TDEAboutData about( static TDEAboutData about(
APP_NAME, I18N_NOOP( APP_PRETTYNAME ), APP_VERSION, APP_NAME, I18N_NOOP( APP_PRETTYNAME ), APP_VERSION,
I18N_NOOP("Graphical Remote Laboratory Workspaces Client"), TDEAboutData::License_GPL_V2, I18N_NOOP("uLab Remote Laboratory Workspaces Graphical Client"), TDEAboutData::License_GPL_V2,
I18N_NOOP("(C) 2012-2013 Timothy Pearson"), 0, I18N_NOOP("(C) 2012-2014 Timothy Pearson"), 0,
"http://ulab.trinitydesktop.org/", "kb9vqf@pearsoncomputing.net" ); "https://ulab.trinitydesktop.org/", "kb9vqf@pearsoncomputing.net" );
int main(int argc, char *argv[]) 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::init(argc, argv, &about);
TDECmdLineArgs::addCmdLineOptions(options); TDECmdLineArgs::addCmdLineOptions(options);
@ -82,7 +82,7 @@ int main(int argc, char *argv[])
args->clear(); args->clear();
mainWin->show(); mainWin->show();
// mainWin has WDestructiveClose flag by default, so it will delete itself. // mainWin has WDestructiveClose flag by default, so it will delete itself.
return app.exec(); return app.exec();
} }

@ -79,9 +79,10 @@ enum connectionStates {
ScopeState_TraceRequest = 50, ScopeState_TraceRequest = 50,
ScopeState_ChannelActiveStateUpdate = 100, ScopeState_ChannelActiveStateUpdate = 100,
ScopeState_TraceVoltsDivUpdate = 102, ScopeState_TraceVoltsDivUpdate = 102,
ScopeState_TriggerLevelUpdate = 104, ScopeState_TriggerChannelUpdate = 104,
ScopeState_HorizontalTimebaseUpdate = 106, ScopeState_TriggerLevelUpdate = 106,
ScopeState_RunningUpdate = 108, ScopeState_HorizontalTimebaseUpdate = 108,
ScopeState_RunningUpdate = 110,
ScopeState_ExternalCommandRequest = 255 ScopeState_ExternalCommandRequest = 255
}; };
@ -115,6 +116,11 @@ TraceControlWidget::TraceControlWidget(TQWidget *parent, const char *name)
TQLabel* label = new TQLabel(m_groupBox); TQLabel* label = new TQLabel(m_groupBox);
label->setText(i18n("V/div")); label->setText(i18n("V/div"));
m_primaryLayout->addMultiCellWidget(label, 0, 0, 2, 2); 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() { TraceControlWidget::~TraceControlWidget() {
@ -156,6 +162,11 @@ void TraceControlWidget::setTraceName(TQString name) {
m_groupBox->setTitle(name); m_groupBox->setTitle(name);
} }
void TraceControlWidget::setTriggerChannel(bool isTrigger) {
// m_setTriggerChannelButton->setEnabled(!isTrigger);
m_setTriggerChannelButton->setDown(isTrigger);
}
void TraceControlWidget::enableClicked() { void TraceControlWidget::enableClicked() {
bool enabled = m_channelEnabledCheckBox->isOn(); bool enabled = m_channelEnabledCheckBox->isOn();
m_voltsDivComboBox->setEnabled(enabled); m_voltsDivComboBox->setEnabled(enabled);
@ -168,6 +179,10 @@ void TraceControlWidget::vdivChanged(int index) {
emit(voltsPerDivChanged(value)); emit(voltsPerDivChanged(value));
} }
void TraceControlWidget::triggerRequested() {
emit(triggerChannelChangeRequested());
}
TimebaseControlWidget::TimebaseControlWidget(TQWidget *parent, const char *name) TimebaseControlWidget::TimebaseControlWidget(TQWidget *parent, const char *name)
: TQWidget(parent, name) : TQWidget(parent, name)
{ {
@ -257,6 +272,7 @@ ScopePart::ScopePart( TQWidget *parentWidget, const char *widgetName, TQObject *
m_channelActiveSet[traceno] = false; m_channelActiveSet[traceno] = false;
} }
m_triggerLevelSet = false; m_triggerLevelSet = false;
m_triggerChannelSet = false;
m_horizontalTimebaseSet = false; m_horizontalTimebaseSet = false;
m_runningSet = false; m_runningSet = false;
@ -425,6 +441,7 @@ void ScopePart::setTickerMessage(TQString message) {
if (m_channelActiveSet[i]) updatesPending = true; if (m_channelActiveSet[i]) updatesPending = true;
if (m_voltsDivSet[i]) updatesPending = true; if (m_voltsDivSet[i]) updatesPending = true;
if (m_triggerLevelSet) updatesPending = true; if (m_triggerLevelSet) updatesPending = true;
if (m_triggerChannelSet) updatesPending = true;
if (m_horizontalTimebaseSet) updatesPending = true; if (m_horizontalTimebaseSet) updatesPending = true;
if (m_runningSet) updatesPending = true; if (m_runningSet) updatesPending = true;
} }
@ -1313,18 +1330,27 @@ void ScopePart::mainEventLoop() {
if (result == "ACK") { if (result == "ACK") {
m_currentOpChannel = getNextActiveChannel(m_currentOpChannel, m_channelActive, m_maxNumberOfTraces); m_currentOpChannel = getNextActiveChannel(m_currentOpChannel, m_channelActive, m_maxNumberOfTraces);
if ((m_currentOpChannel > 0) if ((m_channelActiveSet[m_currentOpChannel] == false)
&& (m_channelActiveSet[m_currentOpChannel] == false)
&& (m_voltsDivSet[m_currentOpChannel] == false) && (m_voltsDivSet[m_currentOpChannel] == false)
&& (m_triggerLevelSet == false) && (m_triggerLevelSet == false)
&& (m_triggerChannelSet == false)
&& (m_horizontalTimebaseSet == false) && (m_horizontalTimebaseSet == false)
&& (m_runningSet == false) && (m_runningSet == false)
) { ) {
if (m_currentOpChannel <= 0) {
m_currentOpChannel = 1;
}
SET_NEXT_STATE(ScopeState_TraceRequest) SET_NEXT_STATE(ScopeState_TraceRequest)
} }
else { else {
m_currentOpChannel = 1; 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 EXEC_NEXT_STATE_IMMEDIATELY
} }
@ -1438,7 +1464,7 @@ void ScopePart::mainEventLoop() {
SET_NEXT_STATE(ScopeState_TraceVoltsDivUpdate) SET_NEXT_STATE(ScopeState_TraceVoltsDivUpdate)
} }
else { else {
SET_NEXT_STATE(ScopeState_TriggerLevelUpdate) SET_NEXT_STATE(ScopeState_TriggerChannelUpdate)
} }
} }
EXEC_NEXT_STATE_IMMEDIATELY EXEC_NEXT_STATE_IMMEDIATELY
@ -1461,7 +1487,7 @@ void ScopePart::mainEventLoop() {
SET_NEXT_STATE(ScopeState_TraceVoltsDivUpdate) SET_NEXT_STATE(ScopeState_TraceVoltsDivUpdate)
} }
else { else {
SET_NEXT_STATE(ScopeState_TriggerLevelUpdate) SET_NEXT_STATE(ScopeState_TriggerChannelUpdate)
} }
EXEC_NEXT_STATE_IMMEDIATELY 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) { else if (m_commHandlerState == ScopeState_TriggerLevelUpdate) {
if (m_triggerLevelSet) { if (m_triggerLevelSet) {
// Set trigger level, step 1 // Set trigger level, step 1
@ -1752,6 +1829,7 @@ void ScopePart::stopDAQ() {
m_voltsDivSet[i] = false; m_voltsDivSet[i] = false;
} }
m_triggerLevelSet = false; m_triggerLevelSet = false;
m_triggerChannelSet = false;
m_horizontalTimebaseSet = false; m_horizontalTimebaseSet = false;
m_runningSet = false; m_runningSet = false;
m_commHandlerMode = 1; 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() { void ScopePart::updateGraticule() {
m_traceWidget->setNumberOfHorizontalDivisions(m_hdivs); m_traceWidget->setNumberOfHorizontalDivisions(m_hdivs);
m_traceWidget->setNumberOfVerticalDivisions(m_vdivs); 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 > 0) m_traceWidget->setTraceColor(0, TQColor(255, 255, 255));
if (m_maxNumberOfTraces > 1) m_traceWidget->setTraceColor(1, TQColor(128, 255, 128)); if (m_maxNumberOfTraces > 1) m_traceWidget->setTraceColor(1, TQColor(128, 255, 128));
if (m_maxNumberOfTraces > 2) m_traceWidget->setTraceColor(2, TQColor(255, 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); m_traceControlWidgetList[i] = new TraceControlWidget(m_base->traceControlLayoutWidget);
connect(m_traceControlWidgetList[i], SIGNAL(enableChanged(bool)), this, SLOT(traceControlEnableChanged(bool))); 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(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_traceControlWidgetGrid->addMultiCellWidget(m_traceControlWidgetList[i], i, i, 0, 0);
m_traceControlWidgetList[i]->setTraceName(i18n("Channel %1").arg(i+1)); m_traceControlWidgetList[i]->setTraceName(i18n("Channel %1").arg(i+1));
m_traceControlWidgetList[i]->show(); m_traceControlWidgetList[i]->show();

@ -42,6 +42,7 @@ class TQRectF;
class TQGridLayout; class TQGridLayout;
class TQCheckBox; class TQCheckBox;
class TQGroupBox; class TQGroupBox;
class TQPushButton;
class ScopeBase; class ScopeBase;
namespace RemoteLab namespace RemoteLab
@ -59,20 +60,24 @@ namespace RemoteLab
void setSelectedVoltsPerDiv(double vdiv); void setSelectedVoltsPerDiv(double vdiv);
void setTraceEnabled(bool enabled); void setTraceEnabled(bool enabled);
void setTraceName(TQString name); void setTraceName(TQString name);
void setTriggerChannel(bool isTrigger);
signals: signals:
void enableChanged(bool enabled); void enableChanged(bool enabled);
void voltsPerDivChanged(double vdiv); void voltsPerDivChanged(double vdiv);
void triggerChannelChangeRequested();
private slots: private slots:
void enableClicked(); void enableClicked();
void vdivChanged(int index); void vdivChanged(int index);
void triggerRequested();
private: private:
TQGroupBox* m_groupBox; TQGroupBox* m_groupBox;
TQGridLayout* m_primaryLayout; TQGridLayout* m_primaryLayout;
TQComboBox* m_voltsDivComboBox; TQComboBox* m_voltsDivComboBox;
TQCheckBox* m_channelEnabledCheckBox; TQCheckBox* m_channelEnabledCheckBox;
TQPushButton* m_setTriggerChannelButton;
TQDoubleList m_voltsDivList; TQDoubleList m_voltsDivList;
}; };
@ -135,6 +140,7 @@ namespace RemoteLab
void traceControlVDivChanged(double vdiv); void traceControlVDivChanged(double vdiv);
void traceControlSDivChanged(double sdiv); void traceControlSDivChanged(double sdiv);
void cursorLevelChanged(uint cursor, double level); void cursorLevelChanged(uint cursor, double level);
void processTriggerButtons();
void startScope(); void startScope();
void stopScope(); void stopScope();
void saveWaveforms(); void saveWaveforms();
@ -169,6 +175,7 @@ namespace RemoteLab
TraceControlWidget* m_traceControlWidgetList[MAXTRACES]; TraceControlWidget* m_traceControlWidgetList[MAXTRACES];
TimebaseControlWidget* m_timebaseControlWidget; TimebaseControlWidget* m_timebaseControlWidget;
bool m_triggerLevelSet; bool m_triggerLevelSet;
bool m_triggerChannelSet;
bool m_horizontalTimebaseSet; bool m_horizontalTimebaseSet;
bool m_runningSet; bool m_runningSet;
bool m_voltsDivSet[MAXTRACES+1]; bool m_voltsDivSet[MAXTRACES+1];

@ -1441,6 +1441,10 @@ void GraticuleWidget::mouseMoveEvent(TQMouseEvent *e) {
} }
} }
bool GraticuleWidget::userIsInteractingWithCursor() {
return (m_movingCursor >= 0);
}
void GraticuleWidget::enterEvent(TQEvent *) { void GraticuleWidget::enterEvent(TQEvent *) {
// //
} }
@ -2544,6 +2548,10 @@ void TraceWidget::resizeCursorArray(uint newsize) {
} }
} }
bool TraceWidget::userIsInteractingWithCursor() {
return m_graticuleWidget->userIsInteractingWithCursor();
}
TQSize TraceWidget::sizeHint() const { TQSize TraceWidget::sizeHint() const {
return TQWidget::sizeHint(); return TQWidget::sizeHint();
} }

@ -184,7 +184,7 @@ typedef TQMemArray<CursorData*> CursorList;
class GraticuleWidget : public TQWidget class GraticuleWidget : public TQWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
GraticuleWidget(TraceWidget*, const char* = 0); GraticuleWidget(TraceWidget*, const char* = 0);
~GraticuleWidget(); ~GraticuleWidget();
@ -192,6 +192,7 @@ class GraticuleWidget : public TQWidget
public: public:
virtual TQSizePolicy sizePolicy() const; virtual TQSizePolicy sizePolicy() const;
int virtualWidth(); int virtualWidth();
bool userIsInteractingWithCursor();
protected: protected:
virtual void paintEvent(TQPaintEvent*); virtual void paintEvent(TQPaintEvent*);
@ -239,7 +240,7 @@ class TraceWidget : public TQWidget
SummaryText, SummaryText,
NoText NoText
}; };
public: public:
TraceWidget(TQWidget* = 0, const char* = 0); TraceWidget(TQWidget* = 0, const char* = 0);
~TraceWidget(); ~TraceWidget();
@ -310,6 +311,8 @@ class TraceWidget : public TQWidget
double traceTextOffset(uint traceNumber); double traceTextOffset(uint traceNumber);
void setTraceTextOffset(uint traceNumber, double offset, bool deferUpdate); void setTraceTextOffset(uint traceNumber, double offset, bool deferUpdate);
bool userIsInteractingWithCursor();
static TQString prettyFormat(double value, double rangeDetectValue, TQString baseUnits, unsigned int precision=3); static TQString prettyFormat(double value, double rangeDetectValue, TQString baseUnits, unsigned int precision=3);
virtual TQSize sizeHint() const; virtual TQSize sizeHint() const;
@ -381,7 +384,7 @@ class TraceWidget : public TQWidget
class TraceScrollView : public TQScrollView class TraceScrollView : public TQScrollView
{ {
Q_OBJECT Q_OBJECT
public: public:
TraceScrollView(TQWidget* = 0, const char* = 0); TraceScrollView(TQWidget* = 0, const char* = 0);
~TraceScrollView(); ~TraceScrollView();
@ -400,7 +403,7 @@ class TraceScrollView : public TQScrollView
class TraceScrollWidget : public TQVBox class TraceScrollWidget : public TQVBox
{ {
Q_OBJECT Q_OBJECT
public: public:
TraceScrollWidget(TQWidget* = 0, const char* = 0); TraceScrollWidget(TQWidget* = 0, const char* = 0);
~TraceScrollWidget(); ~TraceScrollWidget();

@ -308,7 +308,7 @@ int scope_get_timebase(double * retval, const char * scopeType, int gpibDevice)
} }
else { else {
floatstring[ai]=0; floatstring[ai]=0;
*retval = floatstring; *retval = atoi(floatstring);
} }
#ifdef ENABLE_EXTRA_DEBUGGING #ifdef ENABLE_EXTRA_DEBUGGING

Loading…
Cancel
Save