mirror of https://github.com/jhol/qtdmm.git
608 lines
16 KiB
C++
Executable File
608 lines
16 KiB
C++
Executable File
//======================================================================
|
|
// File: mainwid.cpp
|
|
// Author: Matthias Toussaint
|
|
// Created: Tue Apr 10 17:29:01 CEST 2001
|
|
//----------------------------------------------------------------------
|
|
// Permission to use, copy, modify, and distribute this software and its
|
|
// documentation for any purpose and without fee is hereby granted,
|
|
// provided that below copyright notice appear in all copies and that
|
|
// both that copyright notice and this permission notice appear in
|
|
// supporting documentation.
|
|
//
|
|
// This file is provided AS IS with no warranties of any kind. The
|
|
// author shall have no liability with respect to the infringement of
|
|
// copyrights, trade secrets or any patents by this file or any part
|
|
// thereof. In no event will the author be liable for any lost revenue
|
|
// or profits or other special, indirect and consequential damages.
|
|
//----------------------------------------------------------------------
|
|
// (c) 2001 Matthias Toussaint
|
|
//======================================================================
|
|
|
|
#include <mainwid.h>
|
|
#include <qlabel.h>
|
|
#include <qpushbutton.h>
|
|
#include <qapplication.h>
|
|
#include <qwhatsthis.h>
|
|
#include <dmmgraph.h>
|
|
#include <qpixmap.h>
|
|
#include <qmessagebox.h>
|
|
#include <configdlg.h>
|
|
#include <qprocess.h>
|
|
#include <printdlg.h>
|
|
#include <dmm.h>
|
|
#include <displaywid.h>
|
|
#include <tipdlg.h>
|
|
|
|
#include <icon.xpm>
|
|
|
|
#include <iostream>
|
|
|
|
MainWid::MainWid( QWidget *parent, const char *name ) :
|
|
Q3Frame( parent, name ),
|
|
m_display( 0 ),
|
|
m_tipDlg( 0 )
|
|
{
|
|
setupUi(this);
|
|
|
|
setIcon( QPixmap((const char **)icon_xpm ) );
|
|
|
|
m_dmm = new DMM( this );
|
|
m_external = new Q3Process( this );
|
|
|
|
m_configDlg = new ConfigDlg( this );
|
|
m_configDlg->hide();
|
|
|
|
m_configDlg->readPrinter( &m_printer );
|
|
|
|
m_printDlg = new PrintDlg( this );
|
|
m_printDlg->hide();
|
|
|
|
connect( m_dmm, SIGNAL( value( double, const QString &,
|
|
const QString &, const QString &,
|
|
bool, int )),
|
|
this, SLOT( valueSLOT( double, const QString &,
|
|
const QString &, const QString &,
|
|
bool, int )));
|
|
connect( m_dmm, SIGNAL( error( const QString & ) ),
|
|
this, SIGNAL( error( const QString & )));
|
|
connect( ui_graph, SIGNAL( info( const QString & ) ),
|
|
this, SIGNAL( info( const QString & ) ));
|
|
connect( ui_graph, SIGNAL( error( const QString & ) ),
|
|
this, SIGNAL( error( const QString & ) ));
|
|
connect( ui_graph, SIGNAL( running( bool ) ),
|
|
this, SLOT( runningSLOT( bool ) ));
|
|
connect( m_configDlg, SIGNAL( accepted() ),
|
|
this, SLOT( applySLOT() ));
|
|
connect( m_configDlg, SIGNAL( zoomed() ),
|
|
this, SLOT( zoomedSLOT() ));
|
|
connect( ui_graph, SIGNAL( sampleTime( int ) ),
|
|
m_configDlg, SLOT( setSampleTimeSLOT( int ) ));
|
|
connect( ui_graph, SIGNAL( graphSize( int,int ) ),
|
|
m_configDlg, SLOT( setGraphSizeSLOT( int,int ) ));
|
|
connect( ui_graph, SIGNAL( externalTriggered() ),
|
|
this, SLOT( startExternalSLOT() ));
|
|
connect( m_external, SIGNAL( processExited() ),
|
|
this, SLOT( exitedSLOT() ));
|
|
connect( ui_graph, SIGNAL( configure() ),
|
|
this, SLOT( configSLOT() ));
|
|
connect( ui_graph, SIGNAL( exportData() ),
|
|
this, SLOT( exportSLOT() ));
|
|
connect( ui_graph, SIGNAL( importData() ),
|
|
this, SLOT( importSLOT() ));
|
|
|
|
connect( ui_graph, SIGNAL( connectDMM( bool ) ),
|
|
this, SIGNAL( connectDMM( bool ) ));
|
|
|
|
connect( ui_graph, SIGNAL( zoomOut( double ) ),
|
|
m_configDlg, SLOT( zoomOutSLOT( double ) ));
|
|
connect( ui_graph, SIGNAL( zoomIn( double ) ),
|
|
m_configDlg, SLOT( zoomInSLOT( double ) ));
|
|
connect( ui_graph, SIGNAL( thresholdChanged( DMMGraph::CursorMode, double ) ),
|
|
m_configDlg, SLOT( thresholdChangedSLOT( DMMGraph::CursorMode, double ) ));
|
|
|
|
//resetSLOT();
|
|
|
|
startTimer( 100 );
|
|
|
|
if (m_configDlg->showTip())
|
|
{
|
|
showTipsSLOT();
|
|
}
|
|
}
|
|
|
|
MainWid::~MainWid()
|
|
{
|
|
}
|
|
|
|
QString MainWid::deviceListText() const
|
|
{
|
|
return m_configDlg->deviceListText();
|
|
}
|
|
|
|
void
|
|
MainWid::setConsoleLogging( bool on )
|
|
{
|
|
m_dmm->setConsoleLogging( on );
|
|
}
|
|
|
|
void
|
|
MainWid::setDisplay( DisplayWid *display )
|
|
{
|
|
m_display = display;
|
|
}
|
|
|
|
bool
|
|
MainWid::closeWin()
|
|
{
|
|
m_dmm->close();
|
|
m_configDlg->setWinRect( parentRect() );
|
|
m_configDlg->applySLOT();
|
|
|
|
emit setConnect( false );
|
|
|
|
if (ui_graph->dirty() && m_configDlg->alertUnsavedData())
|
|
{
|
|
QMessageBox question( tr("QtDMM: Unsaved data" ),
|
|
tr("<font size=+2><b>Unsaved data</b></font><p>"
|
|
"You still have unsaved measured data in memory."
|
|
" If you quit now it will be lost."
|
|
"<p>Do you want to export your unsaved data first?" ),
|
|
QMessageBox::Information,
|
|
QMessageBox::Yes | QMessageBox::Default,
|
|
QMessageBox::No,
|
|
QMessageBox::Cancel | QMessageBox::Escape );
|
|
|
|
question.setButtonText( QMessageBox::Yes, tr("Export data first") );
|
|
question.setButtonText( QMessageBox::No, tr("Quit without saving") );
|
|
question.setIconPixmap( QPixmap((const char **)icon_xpm ) );
|
|
|
|
switch (question.exec())
|
|
{
|
|
case QMessageBox::Yes:
|
|
return ui_graph->exportDataSLOT();
|
|
|
|
case QMessageBox::No:
|
|
break;
|
|
|
|
case QMessageBox::Cancel:
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
QRect
|
|
MainWid::winRect() const
|
|
{
|
|
return m_configDlg->winRect();
|
|
}
|
|
|
|
bool
|
|
MainWid::saveWindowPosition() const
|
|
{
|
|
return m_configDlg->saveWindowPosition();
|
|
}
|
|
|
|
bool
|
|
MainWid::saveWindowSize() const
|
|
{
|
|
return m_configDlg->saveWindowSize();
|
|
}
|
|
|
|
QRect
|
|
MainWid::parentRect() const
|
|
{
|
|
QRect fRect = parentWidget()->frameGeometry();
|
|
QRect rect = parentWidget()->rect();
|
|
|
|
return QRect( fRect.x(), fRect.y(), rect.width(), rect.height() );
|
|
}
|
|
|
|
void
|
|
MainWid::timerEvent( QTimerEvent * )
|
|
{
|
|
ui_graph->addValue( m_dval );
|
|
}
|
|
|
|
void
|
|
MainWid::valueSLOT( double dval,
|
|
const QString & val,
|
|
const QString & u,
|
|
const QString & s,
|
|
bool showBar,
|
|
int id )
|
|
{
|
|
/* cerr << "valueSLOT " << dval
|
|
<< " val=" << val.latin1()
|
|
<< " u=" << u.latin1()
|
|
<< " s=" << s.latin1()
|
|
<< " showBar=" << showBar
|
|
<< " id=" << id << endl; */
|
|
|
|
m_display->setShowBar( showBar );
|
|
m_display->setValue( id, val );
|
|
|
|
m_display->setMode( id, s );
|
|
|
|
QString tmpUnit = u;
|
|
|
|
m_display->setUnit( id, tmpUnit );
|
|
|
|
if (0 == id)
|
|
{
|
|
if (m_lastUnit != s)
|
|
{
|
|
resetSLOT();
|
|
ui_graph->setUnit( u );
|
|
}
|
|
m_lastUnit = s;
|
|
|
|
if (dval > m_max)
|
|
{
|
|
m_max = dval;
|
|
m_display->setMaxUnit( u );
|
|
m_display->setMaxValue( val );
|
|
}
|
|
|
|
if (dval < m_min)
|
|
{
|
|
m_min = dval;
|
|
m_display->setMinUnit( u );
|
|
m_display->setMinValue( val );
|
|
}
|
|
|
|
m_dval = dval;
|
|
}
|
|
|
|
m_display->update();
|
|
}
|
|
|
|
void
|
|
MainWid::resetSLOT()
|
|
{
|
|
m_min = 1.0E20;
|
|
m_max = -1.0E20;
|
|
|
|
m_display->setMinValue( "" );
|
|
m_display->setMaxValue( "" );
|
|
m_display->setMinUnit( "" );
|
|
m_display->setMaxUnit( "" );
|
|
}
|
|
|
|
void
|
|
MainWid::connectSLOT( bool on )
|
|
{
|
|
if (on)
|
|
{
|
|
m_dmm->open();
|
|
ui_graph->clearSLOT();
|
|
}
|
|
else
|
|
{
|
|
m_dmm->close();
|
|
ui_graph->stopSLOT();
|
|
}
|
|
|
|
m_configDlg->connectSLOT( on );
|
|
|
|
ui_graph->connectSLOT( on );
|
|
}
|
|
|
|
void
|
|
MainWid::quitSLOT()
|
|
{
|
|
if (closeWin()) qApp->quit();
|
|
}
|
|
|
|
void
|
|
MainWid::helpSLOT()
|
|
{
|
|
QWhatsThis::enterWhatsThisMode();
|
|
}
|
|
|
|
void
|
|
MainWid::configSLOT()
|
|
{
|
|
m_configDlg->show();
|
|
m_configDlg->raise();
|
|
}
|
|
|
|
void
|
|
MainWid::configDmmSLOT()
|
|
{
|
|
m_configDlg->show();
|
|
m_configDlg->raise();
|
|
|
|
m_configDlg->showPage( ConfigDlg::DMM );
|
|
}
|
|
|
|
void
|
|
MainWid::configRecorderSLOT()
|
|
{
|
|
m_configDlg->show();
|
|
m_configDlg->raise();
|
|
|
|
m_configDlg->showPage( ConfigDlg::Recorder );
|
|
}
|
|
|
|
void
|
|
MainWid::applySLOT()
|
|
{
|
|
readConfig();
|
|
|
|
ui_graph->setAlertUnsaved( m_configDlg->alertUnsavedData() );
|
|
m_dmm->setName( m_configDlg->dmmName() );
|
|
}
|
|
|
|
void
|
|
MainWid::zoomedSLOT()
|
|
{
|
|
ui_graph->setGraphSize( m_configDlg->windowSeconds(),
|
|
m_configDlg->totalSeconds() );
|
|
}
|
|
|
|
void
|
|
MainWid::exportSLOT()
|
|
{
|
|
ui_graph->exportDataSLOT();
|
|
}
|
|
|
|
void
|
|
MainWid::importSLOT()
|
|
{
|
|
ui_graph->importDataSLOT();
|
|
}
|
|
|
|
void
|
|
MainWid::printSLOT()
|
|
{
|
|
m_printDlg->setPrinter( &m_printer );
|
|
|
|
if (m_printDlg->exec())
|
|
{
|
|
m_configDlg->writePrinter( &m_printer );
|
|
ui_graph->print( &m_printer, m_printDlg->title(), m_printDlg->comment() );
|
|
}
|
|
}
|
|
|
|
void
|
|
MainWid::clearSLOT()
|
|
{
|
|
ui_graph->clearSLOT();
|
|
}
|
|
|
|
void
|
|
MainWid::startSLOT()
|
|
{
|
|
ui_graph->startSLOT();
|
|
}
|
|
|
|
void
|
|
MainWid::stopSLOT()
|
|
{
|
|
ui_graph->stopSLOT();
|
|
}
|
|
|
|
void
|
|
MainWid::readConfig()
|
|
{
|
|
bool reopen = false;
|
|
|
|
if (m_dmm->isOpen())
|
|
{
|
|
m_dmm->close();
|
|
reopen = true;
|
|
}
|
|
|
|
m_dmm->setDevice( m_configDlg->device() );
|
|
m_dmm->setSpeed( m_configDlg->speed() );
|
|
m_dmm->setFormat( m_configDlg->format() );
|
|
m_dmm->setPortSettings( m_configDlg->bits(), m_configDlg->stopBits(),
|
|
m_configDlg->parity(), m_configDlg->externalSetup(),
|
|
m_configDlg->rts(), m_configDlg->cts(),
|
|
m_configDlg->dsr(), m_configDlg->dtr()
|
|
);
|
|
|
|
ui_graph->setGraphSize( m_configDlg->windowSeconds(),
|
|
m_configDlg->totalSeconds() );
|
|
ui_graph->setStartTime( m_configDlg->startTime() );
|
|
ui_graph->setMode( m_configDlg->sampleMode() );
|
|
|
|
ui_graph->setSampleTime( m_configDlg->sampleStep() );
|
|
ui_graph->setSampleLength( m_configDlg->sampleLength() );
|
|
|
|
ui_graph->setCrosshair( m_configDlg->crosshair() );
|
|
|
|
ui_graph->setThresholds( m_configDlg->fallingThreshold(),
|
|
m_configDlg->raisingThreshold() );
|
|
|
|
ui_graph->setScale( m_configDlg->automaticScale(),
|
|
m_configDlg->includeZero(),
|
|
m_configDlg->scaleMin(),
|
|
m_configDlg->scaleMax() );
|
|
|
|
ui_graph->setColors( m_configDlg->bgColor(),
|
|
m_configDlg->gridColor(),
|
|
m_configDlg->dataColor(),
|
|
m_configDlg->cursorColor(),
|
|
m_configDlg->startColor(),
|
|
m_configDlg->externalColor(),
|
|
m_configDlg->intColor(),
|
|
m_configDlg->intThresholdColor() );
|
|
|
|
ui_graph->setExternal( m_configDlg->startExternal(),
|
|
m_configDlg->externalFalling(),
|
|
m_configDlg->externalThreshold() );
|
|
|
|
ui_graph->setLineStyle( m_configDlg->lineMode(),
|
|
m_configDlg->pointMode(),
|
|
m_configDlg->intLineMode(),
|
|
m_configDlg->intPointMode() );
|
|
|
|
QColorGroup cg = colorGroup();
|
|
cg.setColor( QColorGroup::Background, m_configDlg->displayBgColor() );
|
|
cg.setColor( QColorGroup::Foreground, m_configDlg->displayTextColor() );
|
|
|
|
m_display->setPalette( QPalette( cg, cg, cg ) );
|
|
m_display->setDisplayMode( m_configDlg->display(), m_configDlg->showMinMax(),
|
|
m_configDlg->showBar(), m_configDlg->numValues() );
|
|
m_dmm->setNumValues( m_configDlg->numValues() );
|
|
|
|
ui_graph->setLine( m_configDlg->lineWidth(), m_configDlg->intLineWidth() );
|
|
|
|
ui_graph->setIntegration( m_configDlg->showIntegration(),
|
|
m_configDlg->intScale(),
|
|
m_configDlg->intThreshold(),
|
|
m_configDlg->intOffset() );
|
|
|
|
if (m_configDlg->sampleMode() == DMMGraph::Time)
|
|
{
|
|
QString txt;
|
|
txt.sprintf( "%s %s", tr( "Automatic start at" ).latin1(),
|
|
m_configDlg->startTime().toString().latin1() );
|
|
|
|
emit info( txt );
|
|
}
|
|
else if (m_configDlg->sampleMode() == DMMGraph::Raising)
|
|
{
|
|
QString txt;
|
|
txt.sprintf( "%s %g", tr( "Raising threshold" ).latin1(),
|
|
m_configDlg->raisingThreshold() );
|
|
|
|
emit info( txt );
|
|
}
|
|
else if (m_configDlg->sampleMode() == DMMGraph::Falling)
|
|
{
|
|
QString txt;
|
|
txt.sprintf( "%s %g", tr( "Falling threshold" ).latin1(),
|
|
m_configDlg->fallingThreshold() );
|
|
|
|
emit info( txt );
|
|
}
|
|
|
|
emit useTextLabel( m_configDlg->useTextLabel() );
|
|
emit toolbarVisibility( m_configDlg->showDisplay(),
|
|
m_configDlg->showDmmToolbar(),
|
|
m_configDlg->showGraphToolbar(),
|
|
m_configDlg->showFileToolbar(),
|
|
m_configDlg->showHelpToolbar() );
|
|
|
|
if (reopen)
|
|
{
|
|
m_dmm->open();
|
|
}
|
|
}
|
|
|
|
void
|
|
MainWid::runningSLOT( bool on )
|
|
{
|
|
emit running( on );
|
|
}
|
|
|
|
void
|
|
MainWid::startExternalSLOT()
|
|
{
|
|
if (m_external->isRunning())
|
|
{
|
|
QString msg;
|
|
msg.sprintf( tr("<font size=+2><b>Launch error</b></font><p>"
|
|
"Application %s is still running!<p>"
|
|
"Do you want to kill it now"),
|
|
m_configDlg->externalCommand().latin1() );
|
|
|
|
QMessageBox question( tr("QtDMM: Launch error" ),
|
|
msg,
|
|
QMessageBox::Information,
|
|
QMessageBox::Yes | QMessageBox::Default,
|
|
QMessageBox::No,
|
|
QMessageBox::NoButton );
|
|
|
|
question.setButtonText( QMessageBox::Yes, tr("Yes, kill it!") );
|
|
question.setButtonText( QMessageBox::Yes, tr("No, keep running") );
|
|
question.setIconPixmap( QPixmap((const char **)icon_xpm ) );
|
|
|
|
switch (question.exec())
|
|
{
|
|
case QMessageBox::Yes:
|
|
m_external->kill();
|
|
break;
|
|
default:
|
|
return;
|
|
}
|
|
}
|
|
|
|
if (m_configDlg->disconnectExternal())
|
|
{
|
|
emit setConnect( false );
|
|
}
|
|
|
|
QStringList args;
|
|
args.append( m_configDlg->externalCommand() );
|
|
m_external->setArguments( args );
|
|
|
|
if (!m_external->launch(QString("")))
|
|
{
|
|
QString msg;
|
|
msg.sprintf( tr("<font size=+2><b>Launch error</b></font><p>"
|
|
"Couldn't launch %s"),
|
|
m_configDlg->externalCommand().latin1() );
|
|
|
|
QMessageBox question( tr("QtDMM: Launch error" ),
|
|
msg,
|
|
QMessageBox::Information,
|
|
QMessageBox::Yes | QMessageBox::Default,
|
|
QMessageBox::NoButton,
|
|
QMessageBox::NoButton );
|
|
|
|
question.setButtonText( QMessageBox::Yes, tr("Bummer!") );
|
|
question.setIconPixmap( QPixmap((const char **)icon_xpm ) );
|
|
|
|
question.exec();
|
|
}
|
|
else
|
|
{
|
|
QString msg;
|
|
msg.sprintf( tr("Launched %s"), m_configDlg->externalCommand().latin1() );
|
|
emit error( msg );
|
|
}
|
|
}
|
|
|
|
void
|
|
MainWid::exitedSLOT()
|
|
{
|
|
QString msg;
|
|
msg.sprintf( "%s terminated with exit code %d.",
|
|
m_configDlg->externalCommand().latin1(), m_external->exitStatus() );
|
|
|
|
emit error( msg );
|
|
}
|
|
|
|
void
|
|
MainWid::showTipsSLOT()
|
|
{
|
|
if (!m_tipDlg)
|
|
{
|
|
m_tipDlg = new TipDlg( this );
|
|
|
|
m_tipDlg->setShowTipsSLOT( m_configDlg->showTip() );
|
|
m_tipDlg->setCurrentTip( m_configDlg->currentTipId() );
|
|
|
|
connect( m_tipDlg, SIGNAL( showTips( bool ) ),
|
|
m_configDlg, SLOT( setShowTipsSLOT( bool ) ));
|
|
connect( m_configDlg, SIGNAL( showTips( bool ) ),
|
|
m_tipDlg, SLOT( setShowTipsSLOT( bool ) ));
|
|
connect( m_tipDlg, SIGNAL( currentTip( int ) ),
|
|
m_configDlg, SLOT( setCurrentTipSLOT( int ) ));
|
|
|
|
}
|
|
|
|
m_tipDlg->show();
|
|
}
|
|
|
|
void MainWid::setToolbarVisibility( bool disp, bool dmm, bool graph,
|
|
bool file, bool help )
|
|
{
|
|
m_configDlg->setToolbarVisibility( disp, dmm, graph, file, help );
|
|
}
|