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.,
* 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();
}

@ -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();

@ -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];

@ -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();
}

@ -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();

@ -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

Loading…
Cancel
Save