diff options
Diffstat (limited to 'clients/tde')
-rw-r--r-- | clients/tde/src/part/commanalyzer/Makefile.am | 4 | ||||
-rw-r--r-- | clients/tde/src/part/commanalyzer/part.cpp | 787 | ||||
-rw-r--r-- | clients/tde/src/part/commanalyzer/part.h | 34 | ||||
-rw-r--r-- | clients/tde/src/widgets/Makefile.am | 3 | ||||
-rw-r--r-- | clients/tde/src/widgets/floatspinbox.cpp | 23 | ||||
-rw-r--r-- | clients/tde/src/widgets/tracewidget.cpp | 13 | ||||
-rw-r--r-- | clients/tde/src/widgets/tracewidget.h | 7 |
7 files changed, 525 insertions, 346 deletions
diff --git a/clients/tde/src/part/commanalyzer/Makefile.am b/clients/tde/src/part/commanalyzer/Makefile.am index d2db726..26e58a2 100644 --- a/clients/tde/src/part/commanalyzer/Makefile.am +++ b/clients/tde/src/part/commanalyzer/Makefile.am @@ -1,10 +1,10 @@ -INCLUDES = $(all_includes) -I$(top_srcdir)/src -I$(top_srcdir)/src/widgets +INCLUDES = $(all_includes) -I$(top_srcdir)/src -I$(top_srcdir)/src/widgets $(KDE_INCLUDES)/tde KDE_CXXFLAGS = $(USE_EXCEPTIONS) METASOURCES = AUTO #Part kde_module_LTLIBRARIES = libremotelab_commanalyzer.la libremotelab_commanalyzer_la_LIBADD = ../../widgets/libtracewidget.la ../../widgets/libfloatspinbox.la $(LIB_KFILE) $(LIB_KPARTS) $(LIB_TDEUI) $(LIB_QT) -libremotelab_commanalyzer_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN) -ltdecore -ltdeui -lkio -ltdefx +libremotelab_commanalyzer_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN) -ltdecore -ltdeui -lkio -ltdefx -ltdekrbsocket -ltqtrla libremotelab_commanalyzer_la_SOURCES = \ part.cpp layout.ui diff --git a/clients/tde/src/part/commanalyzer/part.cpp b/clients/tde/src/part/commanalyzer/part.cpp index dbee9be..5d339e3 100644 --- a/clients/tde/src/part/commanalyzer/part.cpp +++ b/clients/tde/src/part/commanalyzer/part.cpp @@ -13,7 +13,7 @@ #include <kstatusbar.h> #include <kstdaction.h> #include <tqfile.h> //encodeName() -#include <tqtimer.h> //postInit() hack +#include <tqtimer.h> #include <tqvbox.h> #include <tqsocket.h> #include <tqmutex.h> @@ -26,6 +26,8 @@ #include "floatspinbox.h" #include "layout.h" +#define NETWORK_COMM_TIMEOUT_MS 15000 + /* exception handling */ struct exit_exception { int c; @@ -35,12 +37,16 @@ struct exit_exception { namespace RemoteLab { typedef KParts::GenericFactory<RemoteLab::CommAnalyzerPart> Factory; +#define CLIENT_LIBRARY "libremotelab_commanalyzer" K_EXPORT_COMPONENT_FACTORY( libremotelab_commanalyzer, RemoteLab::Factory ) CommAnalyzerPart::CommAnalyzerPart( TQWidget *parentWidget, const char *widgetName, TQObject *parent, const char *name, const TQStringList& ) - : ReadOnlyPart( parent, name ), m_traceWidget(0), m_socket(0), m_base(0), stopTraceUpdate(false) + : RemoteInstrumentPart( parent, name ), m_traceWidget(0), m_commHandlerState(-1), m_commHandlerMode(0), m_commHandlerCommandState(0), m_base(0), stopTraceUpdate(false) { + // Initialize important base class variables + m_clientLibraryName = CLIENT_LIBRARY; + // Initialize mutex m_instrumentMutex = new TQMutex(false); @@ -48,6 +54,10 @@ CommAnalyzerPart::CommAnalyzerPart( TQWidget *parentWidget, const char *widgetNa setInstance(Factory::instance()); setWidget(new TQVBox(parentWidget, widgetName)); + // Create timers + m_updateTimeoutTimer = new TQTimer(this); + connect(m_updateTimeoutTimer, SIGNAL(timeout()), this, SLOT(mainEventLoop())); + // Create widgets m_base = new CommAnalyzerBase(widget()); m_traceWidget = m_base->traceWidget; @@ -61,347 +71,529 @@ CommAnalyzerPart::CommAnalyzerPart( TQWidget *parentWidget, const char *widgetNa } CommAnalyzerPart::~CommAnalyzerPart() { - if (m_traceWidget) { - delete m_traceWidget; - } - if (m_socket) { - m_socket->close(); - while (m_socket->state() == TQSocket::Closing) { - tqApp->processEvents(); - } - delete m_socket; + if (m_instrumentMutex->locked()) { + printf("[WARNING] Exiting when data transfer still in progress!\n\r"); fflush(stdout); } + disconnectFromServer(); delete m_instrumentMutex; } void CommAnalyzerPart::postInit() { - m_updateTimer = new TQTimer(this); - connect(m_updateTimer, SIGNAL(timeout()), this, SLOT(updateTrace())); + // } bool CommAnalyzerPart::openURL(const KURL &url) { - connectToServer(url.url()); + int ret; + ret = connectToServer(url.url()); + processLockouts(); + return (ret != 0); } bool CommAnalyzerPart::closeURL() { - if (m_socket) { - m_socket->close(); - - while (m_socket->state() != TQSocket::Idle) { - tqApp->processEvents(); - } - } - + disconnectFromServer(); m_url = KURL(); + return true; +} - if (m_instrumentMutex->locked()) { - throw exit_exception(-1); - } +void CommAnalyzerPart::processLockouts() { +} - return true; +void CommAnalyzerPart::disconnectFromServerCallback() { + m_updateTimeoutTimer->stop(); } -TQString CommAnalyzerPart::callServerMethod(int command) { - if (m_instrumentMutex->locked() == true) { - printf("[WARN] An attempt was made to access the instrument asynchronously, and was rejected to prevent a lockup\n\r"); fflush(stdout); - return TQString::null; +void CommAnalyzerPart::connectionFinishedCallback() { + connect(m_socket, SIGNAL(readyRead()), m_socket, SLOT(processPendingData())); + m_socket->processPendingData(); + connect(m_socket, SIGNAL(newDataReceived()), this, SLOT(mainEventLoop())); + m_tickerState = 0; + m_commHandlerState = 0; + m_commHandlerMode = 0; + m_socket->setDataTimeout(NETWORK_COMM_TIMEOUT_MS); + m_updateTimeoutTimer->start(NETWORK_COMM_TIMEOUT_MS, TRUE); + processLockouts(); + mainEventLoop(); + return; +} + +#define UPDATEDISPLAY_TIMEOUT m_connectionActiveAndValid = false; \ + m_tickerState = 0; \ + m_commHandlerState = 2; \ + m_commHandlerMode = 0; \ + m_socket->clearIncomingData(); \ + setStatusMessage(i18n("Server ping timeout. Please verify the status of your network connection.")); \ + m_updateTimeoutTimer->start(NETWORK_COMM_TIMEOUT_MS, TRUE); \ + m_instrumentMutex->unlock(); \ + return; + +#define COMMUNICATIONS_FAILED m_connectionActiveAndValid = false; \ + m_tickerState = 0; \ + m_commHandlerState = 2; \ + m_commHandlerMode = 0; \ + m_socket->clearIncomingData(); \ + setStatusMessage(i18n("Instrument communication failure. Please verify the status of your network connection.")); \ + m_updateTimeoutTimer->start(NETWORK_COMM_TIMEOUT_MS, TRUE); \ + m_instrumentMutex->unlock(); \ + return; + +#define SET_WATCHDOG_TIMER if (!m_updateTimeoutTimer->isActive()) m_updateTimeoutTimer->start(NETWORK_COMM_TIMEOUT_MS, TRUE); +#define PAT_WATCHDOG_TIMER m_updateTimeoutTimer->stop(); m_updateTimeoutTimer->start(NETWORK_COMM_TIMEOUT_MS, TRUE); + +#define SET_NEXT_STATE(x) if (m_commHandlerMode == 0) { \ + m_commHandlerState = x; \ + } \ + else { \ + m_commHandlerState = 255; \ + } + +void CommAnalyzerPart::mainEventLoop() { + TQDataStream ds(m_socket); + ds.setPrintableData(true); + + if (!m_instrumentMutex->tryLock()) { + TQTimer::singleShot(0, this, SLOT(mainEventLoop())); // Handle the concurrently received call immediately after current execution + return; } - try { - m_instrumentMutex->lock(); - if (m_socket->state() == TQSocket::Connected) { - TQString cmd = TQChar(command); - cmd.append('\r'); - m_socket->writeBlock(cmd.latin1(), cmd.length()); - // Read from the server - TQString serverRet; - while ((!serverRet.contains('\r')) && (m_socket->state() == TQSocket::Connected)) { - char data[1]; - if( m_socket->readBlock(data, 1) > 0) { - serverRet.append(data[0]); + + if (m_socket) { + if ((m_commHandlerMode == 0) || (m_commHandlerMode == 1)) { + if (m_commHandlerState == 0) { + // Request communications analyzer access + ds << TQString("COMMUNICATIONS ANALYZER"); + m_socket->writeEndOfFrame(); + + m_commHandlerState = 1; + } + else if (m_commHandlerState == 1) { + // Get response data + if (m_socket->canReadFrame()) { + PAT_WATCHDOG_TIMER + + // Get command status + TQString result; + ds >> result; + m_socket->clearFrameTail(); + + if (result == "ACK") { + SET_NEXT_STATE(2) + } + else { + COMMUNICATIONS_FAILED + } + } + else { + if (!m_updateTimeoutTimer->isActive()) { + UPDATEDISPLAY_TIMEOUT + } } - tqApp->eventLoop()->processEvents(TQEventLoop::AllEvents); } - m_instrumentMutex->unlock(); - return serverRet; - } - else { - m_instrumentMutex->unlock(); - return TQString::null; - } - } - catch (exit_exception& e) { - m_instrumentMutex->unlock(); - return TQString::null; - } -} + else if (m_commHandlerState == 2) { + // Set spectrum analyzer mode + ds << TQString("SETMODESPECTRUMANALYZER"); + m_socket->writeEndOfFrame(); -int16_t CommAnalyzerPart::callServerMethodInt16(int command) { - if (m_instrumentMutex->locked() == true) { - printf("[WARN] An attempt was made to access the instrument asynchronously, and was rejected to prevent a lockup\n\r"); fflush(stdout); - return 0; - } - try { - m_instrumentMutex->lock(); - if (m_socket->state() == TQSocket::Connected) { - TQString cmd = TQChar(command); - cmd.append('\r'); - m_socket->writeBlock(cmd.latin1(), cmd.length()); - // Read from the server - int bytesread = 0; - int16_t data[1]; - while ((bytesread < 2) && (m_socket->state() == TQSocket::Connected)) { - int ret = m_socket->readBlock(((char*)data)+bytesread, 1); - if (ret > 0) { - bytesread += ret; + SET_NEXT_STATE(3) + } + else if (m_commHandlerState == 3) { + // Get response data + if (m_socket->canReadFrame()) { + PAT_WATCHDOG_TIMER + + // Get command status + TQString result; + ds >> result; + m_socket->clearFrameTail(); + + if (result == "ACK") { + // Set spectrum analyzer mode + ds << TQString("SETMODESPECTRUMANALYZER"); + m_socket->writeEndOfFrame(); + + SET_NEXT_STATE(4) + } + else { + COMMUNICATIONS_FAILED + } + } + else { + if (!m_updateTimeoutTimer->isActive()) { + UPDATEDISPLAY_TIMEOUT + } } - tqApp->eventLoop()->processEvents(TQEventLoop::AllEvents); } - TQString serverRet; - while ((!serverRet.contains('\r')) && (m_socket->state() == TQSocket::Connected)) { - char data[1]; - if( m_socket->readBlock(data, 1) > 0) { - serverRet.append(data[0]); + else if (m_commHandlerState == 4) { + // Get response data + if (m_socket->canReadFrame()) { + PAT_WATCHDOG_TIMER + + // Get command status + TQString result; + ds >> result; + m_socket->clearFrameTail(); + + if (result == "ACK") { + // Get number of samples in trace, step 1 + ds << TQString("GETTRACESAMPLECOUNT"); + m_socket->writeEndOfFrame(); + + SET_NEXT_STATE(5) + } + else { + COMMUNICATIONS_FAILED + } + } + else { + if (!m_updateTimeoutTimer->isActive()) { + UPDATEDISPLAY_TIMEOUT + } } - tqApp->eventLoop()->processEvents(TQEventLoop::AllEvents); } - m_instrumentMutex->unlock(); - return data[0]; - } - else { - m_instrumentMutex->unlock(); - return 0; - } - } - catch (exit_exception& e) { - m_instrumentMutex->unlock(); - return 0; - } -} - -double CommAnalyzerPart::callServerMethodDouble(int command) { - if (m_instrumentMutex->locked() == true) { - printf("[WARN] An attempt was made to access the instrument asynchronously, and was rejected to prevent a lockup\n\r"); fflush(stdout); - return 0; - } - try { - m_instrumentMutex->lock(); - if (m_socket->state() == TQSocket::Connected) { - TQString cmd = TQChar(command); - cmd.append('\r'); - m_socket->writeBlock(cmd.latin1(), cmd.length()); - // Read from the server - unsigned int bytesread = 0; - double data[1]; - while ((bytesread < sizeof(double)) && (m_socket->state() == TQSocket::Connected)) { - int ret = m_socket->readBlock(((char*)data)+bytesread, 1); - if (ret > 0) { - bytesread += ret; + else if (m_commHandlerState == 5) { + // Get response data + if (m_socket->canReadFrame()) { + PAT_WATCHDOG_TIMER + + // Get number of samples in trace, step 2 + TQString result; + ds >> result; + if (result == "ACK") { + ds >> m_samplesInTrace; + } + m_socket->clearFrameTail(); + + if (result == "ACK") { + // Get number of horizontal divisions, step 1 + ds << TQString("GETHORIZONTALDIVCOUNT"); + m_socket->writeEndOfFrame(); + + SET_NEXT_STATE(6) + } + else { + COMMUNICATIONS_FAILED + } + } + else { + if (!m_updateTimeoutTimer->isActive()) { + UPDATEDISPLAY_TIMEOUT + } } - tqApp->eventLoop()->processEvents(TQEventLoop::AllEvents); } - TQString serverRet; - while ((!serverRet.contains('\r')) && (m_socket->state() == TQSocket::Connected)) { - char data[1]; - if( m_socket->readBlock(data, 1) > 0) { - serverRet.append(data[0]); + else if (m_commHandlerState == 6) { + // Get response data + if (m_socket->canReadFrame()) { + PAT_WATCHDOG_TIMER + + // Get number of horizontal divisions, step 2 + TQString result; + ds >> result; + if (result == "ACK") { + ds >> m_hdivs; + } + m_socket->clearFrameTail(); + + if (result == "ACK") { + // Get number of vertical divisions, step 1 + ds << TQString("GETVERTICALDIVCOUNT"); + m_socket->writeEndOfFrame(); + + SET_NEXT_STATE(7) + } + else { + COMMUNICATIONS_FAILED + } + } + else { + if (!m_updateTimeoutTimer->isActive()) { + UPDATEDISPLAY_TIMEOUT + } } - tqApp->eventLoop()->processEvents(TQEventLoop::AllEvents); } - m_instrumentMutex->unlock(); - return data[0]; - } - else { - m_instrumentMutex->unlock(); - return 0; - } - } - catch (exit_exception& e) { - m_instrumentMutex->unlock(); - return 0; - } -} + else if (m_commHandlerState == 7) { + // Get response data + if (m_socket->canReadFrame()) { + PAT_WATCHDOG_TIMER + + // Get number of vertical divisions, step 2 + TQString result; + ds >> result; + if (result == "ACK") { + ds >> m_vdivs; + } + m_socket->clearFrameTail(); + + if (result == "ACK") { + // Get reference power level, step 1 + ds << TQString("GETREFERENCEPOWERLEVEL"); + m_socket->writeEndOfFrame(); -void CommAnalyzerPart::sendServerCommandWithParameter(int command, TQString param) { - if (m_instrumentMutex->locked() == true) { - printf("[WARN] An attempt was made to access the instrument asynchronously, and was rejected to prevent a lockup\n\r"); fflush(stdout); - return; - } - try { - m_instrumentMutex->lock(); - if (m_socket->state() == TQSocket::Connected) { - TQString cmd = TQChar(command); - param = TQString("%1%2%3").arg(param).arg(TQChar('°')).arg(TQChar('\r')); - cmd += param; - m_socket->writeBlock(cmd.ascii(), cmd.length()); - // Read from the server - TQString serverRet; - while ((!serverRet.contains('\r')) && (m_socket->state() == TQSocket::Connected)) { - char data[1]; - if( m_socket->readBlock(data, 1) > 0) { - serverRet.append(data[0]); + SET_NEXT_STATE(8) + } + else { + COMMUNICATIONS_FAILED + } + } + else { + if (!m_updateTimeoutTimer->isActive()) { + UPDATEDISPLAY_TIMEOUT + } } - tqApp->eventLoop()->processEvents(TQEventLoop::AllEvents); } - } - m_instrumentMutex->unlock(); - return; - } - catch (exit_exception& e) { - m_instrumentMutex->unlock(); - return; - } -} - -void CommAnalyzerPart::sendServerCommand(int command) { - if (m_instrumentMutex->locked() == true) { - printf("[WARN] An attempt was made to access the instrument asynchronously, and was rejected to prevent a lockup\n\r"); fflush(stdout); - return; - } - try { - m_instrumentMutex->lock(); - if (m_socket->state() == TQSocket::Connected) { - TQString cmd = TQChar(command); - cmd.append('\r'); - m_socket->writeBlock(cmd.latin1(), cmd.length()); - // Read from the server - TQString serverRet; - while ((!serverRet.contains('\r')) && (m_socket->state() == TQSocket::Connected)) { - char data[1]; - if( m_socket->readBlock(data, 1) > 0) { - serverRet.append(data[0]); + else if (m_commHandlerState == 8) { + // Get response data + if (m_socket->canReadFrame()) { + PAT_WATCHDOG_TIMER + + // Get reference power level, step 2 + TQString result; + ds >> result; + if (result == "ACK") { + ds >> m_rpower; + } + m_socket->clearFrameTail(); + + if (result == "ACK") { + // Get vertical division scale, step 1 + ds << TQString("GETVERTDIVSCALE"); + m_socket->writeEndOfFrame(); + + SET_NEXT_STATE(9) + } + else { + COMMUNICATIONS_FAILED + } + } + else { + if (!m_updateTimeoutTimer->isActive()) { + UPDATEDISPLAY_TIMEOUT + } } - tqApp->eventLoop()->processEvents(TQEventLoop::AllEvents); } - } - m_instrumentMutex->unlock(); - return; - } - catch (exit_exception& e) { - m_instrumentMutex->unlock(); - return; - } -} - -void CommAnalyzerPart::callServerMethodDoubleArray(int command, double * array, int arrayLen) { - if (m_instrumentMutex->locked() == true) { - printf("[WARN] An attempt was made to access the instrument asynchronously, and was rejected to prevent a lockup\n\r"); fflush(stdout); - return; - } - try { - m_instrumentMutex->lock(); - if (m_socket->state() == TQSocket::Connected) { - TQString cmd = TQChar(command); - cmd.append('\r'); - m_socket->writeBlock(cmd.latin1(), cmd.length()); - // Read from the server - TQString serverRet; - while ((!serverRet.contains('\r')) && (m_socket->state() == TQSocket::Connected)) { - char data[1]; - if( m_socket->readBlock(data, 1) > 0) { - serverRet.append(data[0]); + else if (m_commHandlerState == 9) { + // Get response data + if (m_socket->canReadFrame()) { + PAT_WATCHDOG_TIMER + + // Get vertical division scale, step 2 + TQString result; + ds >> result; + if (result == "ACK") { + ds >> m_vscale; + } + m_socket->clearFrameTail(); + + if (result == "ACK") { + // Get center frequency, step 1 + ds << TQString("GETCENTERFREQUENCY"); + m_socket->writeEndOfFrame(); + + SET_NEXT_STATE(10) + } + else { + COMMUNICATIONS_FAILED + } + } + else { + if (!m_updateTimeoutTimer->isActive()) { + UPDATEDISPLAY_TIMEOUT + } } - tqApp->eventLoop()->processEvents(TQEventLoop::AllEvents); } - unsigned int bytesread = 0; - int16_t data[1]; - while ((bytesread < 2) && (m_socket->state() == TQSocket::Connected)) { - int ret = m_socket->readBlock(((char*)data)+bytesread, 1); - if (ret > 0) { - bytesread += ret; + else if (m_commHandlerState == 10) { + // Get response data + if (m_socket->canReadFrame()) { + PAT_WATCHDOG_TIMER + + // Get center frequency, step 2 + TQString result; + ds >> result; + if (result == "ACK") { + ds >> m_centerfreq; + } + m_socket->clearFrameTail(); + + if (result == "ACK") { + // Get frequency span, step 1 + ds << TQString("GETFREQUENCYSPAN"); + m_socket->writeEndOfFrame(); + + SET_NEXT_STATE(11) + } + else { + COMMUNICATIONS_FAILED + } + } + else { + if (!m_updateTimeoutTimer->isActive()) { + UPDATEDISPLAY_TIMEOUT + } } - tqApp->eventLoop()->processEvents(TQEventLoop::AllEvents); } - serverRet = ""; - while ((!serverRet.contains('\r')) && (m_socket->state() == TQSocket::Connected)) { - char data[1]; - if( m_socket->readBlock(data, 1) > 0) { - serverRet.append(data[0]); + else if (m_commHandlerState == 11) { + // Get response data + if (m_socket->canReadFrame()) { + PAT_WATCHDOG_TIMER + + // Get frequency span, step 2 + TQString result; + ds >> result; + if (result == "ACK") { + ds >> m_spanfreq; + } + m_socket->clearFrameTail(); + + if (result == "ACK") { + // Update display widget(s) + updateGraticule(); + } + + if (result == "ACK") { + // Get trace, step 1 + ds << TQString("GETSPECTRUMTRACE"); + m_socket->writeEndOfFrame(); + + SET_NEXT_STATE(12) + } + else { + COMMUNICATIONS_FAILED + } + } + else { + if (!m_updateTimeoutTimer->isActive()) { + UPDATEDISPLAY_TIMEOUT + } } - tqApp->eventLoop()->processEvents(TQEventLoop::AllEvents); } - bytesread = 0; - int elementsread = 0; - for (elementsread=0;elementsread<arrayLen;elementsread++) { - bytesread = 0; - while ((bytesread < sizeof(double)) && (m_socket->state() == TQSocket::Connected)) { - if (m_socket->size() < 1) { - tqApp->eventLoop()->processEvents(TQEventLoop::AllEvents); - } - int ret = m_socket->readBlock(((char*)array)+bytesread+(elementsread*sizeof(double)), 1); - if (ret > 0) { - bytesread += ret; + else if (m_commHandlerState == 12) { + // Get response data + if (m_socket->canReadFrame()) { + PAT_WATCHDOG_TIMER + + // Get trace, step 2 + TQDoubleArray trace; + TQString result; + ds >> result; + if (result == "ACK") { + ds >> trace; + } + m_socket->clearFrameTail(); + + if (result == "ACK") { + // Update display widget(s) + m_traceWidget->setSamples(trace); + postProcessTrace(); + m_traceWidget->repaint(); + } + + if (result == "ACK") { + SET_NEXT_STATE(2) + } + else { + COMMUNICATIONS_FAILED } } + else { + if (!m_updateTimeoutTimer->isActive()) { + UPDATEDISPLAY_TIMEOUT + } + } + } + else if (m_commHandlerState == 255) { + // Execute pending command + m_commHandlerMode = 2; + m_socket->clearIncomingData(); } + SET_WATCHDOG_TIMER } - m_instrumentMutex->unlock(); - return; - } - catch (exit_exception& e) { - m_instrumentMutex->unlock(); - return; - } -} - -int CommAnalyzerPart::connectToServer(TQString server) { - if (!m_socket) { - m_socket = new TQSocket(this); - } - m_socket->connectToHost(server, 4002); - while ((m_socket->state() != TQSocket::Connected) && (m_socket->state() != TQSocket::Idle)) { - tqApp->eventLoop()->processEvents(TQEventLoop::AllEvents); - } - if (m_socket->state() != TQSocket::Connected) { - return -1; - } + else if (m_commHandlerMode == 2) { + if (m_commHandlerCommandState == 0) { + m_commHandlerMode = 0; + m_commHandlerState = 2; + } + else if (m_commHandlerCommandState == 1) { + // Set reference power level + ds << TQString("SETREFERENCEPOWERLEVEL"); + ds << m_rpower; + m_socket->writeEndOfFrame(); - // Gather information from the server - if (callServerMethod(41) == "NCK") { - // FIXME - // Display message and exit - return -1; - } - sendServerCommand(40); // Set spectrum analyzer mode - m_samplesInTrace = callServerMethodInt16(63); // Get number of samples in trace - m_traceWidget->setNumberOfSamples(m_samplesInTrace); - m_hdivs = callServerMethodInt16(62); // Get number of horizontal divisions - m_traceWidget->setNumberOfHorizontalDivisions(m_hdivs); - m_vdivs = callServerMethodInt16(64); // Get number of vertical divisions - m_traceWidget->setNumberOfVerticalDivisions(m_vdivs); + m_commHandlerCommandState = 2; + } + else if (m_commHandlerCommandState == 2) { + // Get response data + if (m_socket->canReadFrame()) { + PAT_WATCHDOG_TIMER + + // Set reference power level, step 2 + TQString result; + ds >> result; + m_socket->clearFrameTail(); + + if (result == "ACK") { + // Get reference power level, step 1 + ds << TQString("GETREFERENCEPOWERLEVEL"); + m_socket->writeEndOfFrame(); - m_rpower = callServerMethodDouble(65); // Get reference power level - m_vscale = callServerMethodDouble(66); // Get vertical division scale + m_commHandlerCommandState = 3; + } + else { + COMMUNICATIONS_FAILED + } + } + else { + if (!m_updateTimeoutTimer->isActive()) { + UPDATEDISPLAY_TIMEOUT + } + } + } + else if (m_commHandlerCommandState == 3) { + // Get response data + if (m_socket->canReadFrame()) { + PAT_WATCHDOG_TIMER + + // Get reference power level, step 2 + TQString result; + ds >> result; + if (result == "ACK") { + ds >> m_rpower; + } + m_socket->clearFrameTail(); - m_centerfreq = callServerMethodDouble(67); // Get center frequency - m_spanfreq = callServerMethodDouble(68); // Get frequency span + // Update display as needed + updateGraticule(); - updateGraticule(); + if (result == "ACK") { + m_commHandlerCommandState = 0; + TQTimer::singleShot(0, this, SLOT(mainEventLoop())); + } + else { + COMMUNICATIONS_FAILED + } + } + else { + if (!m_updateTimeoutTimer->isActive()) { + UPDATEDISPLAY_TIMEOUT + } + } + } + } + } + else { + m_commHandlerState = 0; + m_commHandlerCommandState = 0; + } - // Start trace update timer - m_updateTimer->start(10, FALSE); + m_instrumentMutex->unlock(); } void CommAnalyzerPart::postProcessTrace() { return; } -void CommAnalyzerPart::updateTrace() { - m_updateTimer->stop(); - callServerMethodDoubleArray(42, m_traceWidget->samples(), m_samplesInTrace); - postProcessTrace(); - m_traceWidget->repaint(); - if (m_socket->state() == TQSocket::Connected) { - if (stopTraceUpdate == true) { - stopTraceUpdate = false; - } - else { - m_updateTimer->start(10, FALSE); - } - } -} - void CommAnalyzerPart::updateGraticule() { + m_traceWidget->setNumberOfSamples(m_samplesInTrace); + m_traceWidget->setNumberOfHorizontalDivisions(m_hdivs); + m_traceWidget->setNumberOfVerticalDivisions(m_vdivs); + m_leftFrequency = m_centerfreq - (m_spanfreq/2.0); m_rightFrequency = m_centerfreq + (m_spanfreq/2.0); m_traceWidget->setDisplayLimits(m_leftFrequency, m_rpower, m_rightFrequency, m_rpower-(m_vscale*m_hdivs)); @@ -413,25 +605,10 @@ void CommAnalyzerPart::updateGraticule() { } void CommAnalyzerPart::saRefLevelChanged(double newval) { - // We cannot directly send data to the remote instrument because the GUI event may have ocurred during a remote instrument transaction - // This "flaw" is a direct result of maximizing performance by processing GUI events during network transfers, as well as the fact that this client is a multithreaded application m_rpower = newval; - stopTraceUpdate = true; - TQTimer::singleShot(0, this, SLOT(changeSaRefLevel())); -} - -void CommAnalyzerPart::changeSaRefLevel() { - // Keep trying to set the new power level - if (m_instrumentMutex->locked() == false) { - sendServerCommandWithParameter(61, TQString("%1").arg(m_rpower, 0, 'E')); // Set reference power level - m_rpower = callServerMethodDouble(65); // Get reference power level - updateGraticule(); // Update the display grid - m_updateTimer->start(10, FALSE); // Restart trace update timer - } - else { - tqApp->eventLoop()->processEvents(TQEventLoop::ExcludeUserInput); - TQTimer::singleShot(0, this, SLOT(changeSaRefLevel())); - } + m_commHandlerMode = 1; + m_commHandlerCommandState = 1; + mainEventLoop(); } KAboutData* CommAnalyzerPart::createAboutData() { diff --git a/clients/tde/src/part/commanalyzer/part.h b/clients/tde/src/part/commanalyzer/part.h index 196706b..252a67c 100644 --- a/clients/tde/src/part/commanalyzer/part.h +++ b/clients/tde/src/part/commanalyzer/part.h @@ -9,6 +9,8 @@ #include <kparts/part.h> #include <kurl.h> +#include <tqtrla.h> + class KAboutData; using KParts::StatusBarExtension; class TraceWidget; @@ -19,7 +21,7 @@ class CommAnalyzerBase; namespace RemoteLab { - class CommAnalyzerPart : public KParts::ReadOnlyPart + class CommAnalyzerPart : public KParts::RemoteInstrumentPart { Q_OBJECT @@ -30,40 +32,38 @@ namespace RemoteLab virtual bool openFile() { return false; } // pure virtual in the base class virtual bool closeURL(); static KAboutData *createAboutData(); - int connectToServer(TQString server); public slots: virtual bool openURL(const KURL &url); private slots: void postInit(); - void updateTrace(); + void processLockouts(); void updateGraticule(); + void connectionFinishedCallback(); + void disconnectFromServerCallback(); +// void connectionStatusChangedCallback(); + void mainEventLoop(); virtual void postProcessTrace(); void saRefLevelChanged(double); - void changeSaRefLevel(); - - private: - TQString callServerMethod(int command); - void sendServerCommand(int command); - int16_t callServerMethodInt16(int command); - double callServerMethodDouble(int command); - void callServerMethodDoubleArray(int command, double * array, int arrayLen); - void sendServerCommandWithParameter(int command, TQString param); private: TraceWidget* m_traceWidget; - TQSocket* m_socket; - int16_t m_samplesInTrace; + int m_commHandlerState; + int m_commHandlerMode; + int m_commHandlerCommandState; + TQTimer* m_updateTimeoutTimer; + bool m_connectionActiveAndValid; + unsigned char m_tickerState; + TQ_INT16 m_samplesInTrace; double m_leftFrequency; double m_rightFrequency; - int16_t m_hdivs; - int16_t m_vdivs; + TQ_INT16 m_hdivs; + TQ_INT16 m_vdivs; double m_centerfreq; double m_spanfreq; double m_rpower; double m_vscale; - TQTimer* m_updateTimer; CommAnalyzerBase* m_base; TQMutex* m_instrumentMutex; bool stopTraceUpdate; diff --git a/clients/tde/src/widgets/Makefile.am b/clients/tde/src/widgets/Makefile.am index be1f9ba..fac5e76 100644 --- a/clients/tde/src/widgets/Makefile.am +++ b/clients/tde/src/widgets/Makefile.am @@ -1,5 +1,6 @@ -INCLUDES = $(all_includes) +INCLUDES = $(all_includes) $(KDE_INCLUDES)/tde METASOURCES = AUTO noinst_LTLIBRARIES = libtracewidget.la libfloatspinbox.la libtracewidget_la_SOURCES = tracewidget.cpp +libtracewidget_la_LDFLAGS = $(all_libraries) -ltqtrla libfloatspinbox_la_SOURCES = floatspinbox.cpp
\ No newline at end of file diff --git a/clients/tde/src/widgets/floatspinbox.cpp b/clients/tde/src/widgets/floatspinbox.cpp index 266225a..10d9020 100644 --- a/clients/tde/src/widgets/floatspinbox.cpp +++ b/clients/tde/src/widgets/floatspinbox.cpp @@ -13,15 +13,15 @@ #define ROUND(x) ((int)(0.5 + (x))) -FloatSpinBox::FloatSpinBox(double fmin, double fmax, double fvalue, TQWidget *parent) : TQSpinBox(parent) -{ +FloatSpinBox::FloatSpinBox(double fmin, double fmax, double fvalue, TQWidget *parent) : TQSpinBox(parent) { init(fmin, fmax, fvalue); connect( this, SIGNAL(valueChanged(int)), SLOT(acceptValueChanged(int)) ); } -FloatSpinBox::FloatSpinBox(TQWidget *parent , const char* name) : TQSpinBox(parent, name) -{ +FloatSpinBox::FloatSpinBox(TQWidget *parent , const char* name) : TQSpinBox(parent, name) { + init(0, 0, 0); + connect( this, SIGNAL(valueChanged(int)), SLOT(acceptValueChanged(int)) ); } @@ -52,16 +52,14 @@ void FloatSpinBox::setFloatMax(double fmax) { init(min, fmax, value); } -TQString FloatSpinBox::mapValueToText(int ival) -{ +TQString FloatSpinBox::mapValueToText(int ival) { TQString str; value = min + (double)ival * pow(10, -dec); - str.sprintf("%.*f", dec, value); + str.sprintf("%.*f", dec, value); // This can hang as 'value' may (randomly) have an insanely high precision that is very difficult to convert to text return( str ); } -int FloatSpinBox::mapTextToValue (bool * ok) -{ +int FloatSpinBox::mapTextToValue (bool * ok) { TQString str = cleanText(); double tryValue = str.toDouble( ok ); if (*ok) { @@ -70,14 +68,13 @@ int FloatSpinBox::mapTextToValue (bool * ok) return ROUND( (value - min) * pow( 10, dec ) ); } -void FloatSpinBox::setFloatValue(double d) -{ +void FloatSpinBox::setFloatValue(double d) { value = d; setValue( ROUND( (value - min) * pow( 10, dec )) ); } -void FloatSpinBox::acceptValueChanged(int ival) -{ +void FloatSpinBox::acceptValueChanged(int ival) { + Q_UNUSED(ival); emit floatValueChanged( value ); } diff --git a/clients/tde/src/widgets/tracewidget.cpp b/clients/tde/src/widgets/tracewidget.cpp index 9b771bc..d6e5d31 100644 --- a/clients/tde/src/widgets/tracewidget.cpp +++ b/clients/tde/src/widgets/tracewidget.cpp @@ -16,7 +16,6 @@ TraceWidget::TraceWidget(TQWidget* parent, const char* name) : TQWidget(parent, m_rightEdge(0), m_topEdge(0), m_bottomEdge(0), - m_sampleArray(0), m_graticulePixmap(0) { setBackgroundMode(NoBackground); @@ -30,10 +29,7 @@ TraceWidget::~TraceWidget() { void TraceWidget::setNumberOfSamples(unsigned int samples) { m_samples = samples; - if (m_sampleArray) { - delete [] m_sampleArray; - } - m_sampleArray = new double[m_samples]; + m_sampleArray.resize(m_samples); updateGraticule(); } @@ -55,10 +51,15 @@ void TraceWidget::setDisplayLimits(double x, double y, double w, double h) { m_bottomEdge = h; } -double* TraceWidget::samples() { +TQDoubleArray& TraceWidget::samples() { return m_sampleArray; } +void TraceWidget::setSamples(TQDoubleArray& tqda) { + m_sampleArray = tqda; + m_samples = tqda.size(); +} + void TraceWidget::updateGraticule() { unsigned int d,s,x,y; diff --git a/clients/tde/src/widgets/tracewidget.h b/clients/tde/src/widgets/tracewidget.h index 19c7806..21cced7 100644 --- a/clients/tde/src/widgets/tracewidget.h +++ b/clients/tde/src/widgets/tracewidget.h @@ -3,6 +3,8 @@ #include <tqwidget.h> +#include <tqtrla.h> + class TQPixmap; class TraceWidget : public TQWidget @@ -18,7 +20,8 @@ class TraceWidget : public TQWidget void setNumberOfVerticalDivisions(unsigned int divisions); void setDisplayLimits(double x, double y, double w, double h); - double* samples(); + TQDoubleArray& samples(); + void setSamples(TQDoubleArray&); protected: virtual void paintEvent(TQPaintEvent*); @@ -35,6 +38,6 @@ class TraceWidget : public TQWidget double m_rightEdge; double m_topEdge; double m_bottomEdge; - double* m_sampleArray; + TQDoubleArray m_sampleArray; TQPixmap* m_graticulePixmap; };
\ No newline at end of file |