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