43 #include "newrealtimemultisamplearraywidget.h"
70 #include <QPaintEvent>
75 #include <QMessageBox>
84 using namespace XDISPLIB;
85 using namespace XMEASLIB;
106 , m_pRTMSA_New(pRTMSA_New)
107 , m_uiMaxNumChannels(10)
108 , m_uiFirstChannel(0)
109 , m_bMeasurement(false)
113 , m_bToolInUse(false)
114 , m_dSampleWidth(1.0)
119 , m_pTimerToolDisplay(0)
120 , m_pTimerUpdate(new QTimer(this))
122 , m_pTimeCurrentDisplay(0)
125 ui.m_qLabel_Tool->hide();
128 m_vecTool.push_back(
"Freeze");
129 m_vecTool.push_back(
"Annotation");
132 connect(m_pTimerUpdate.data(), SIGNAL(timeout()),
this, SLOT(
update()));
134 m_pTimerUpdate->start(25);
139 setMouseTracking(
true);
148 NewRealTimeMultiSampleArrayWidget::s_listSamplingRates.clear();
154 void NewRealTimeMultiSampleArrayWidget::actualize()
156 m_dPosY = ui.m_qFrame->pos().y();
160 m_fScaleFactor = ui.m_qFrame->height()/
static_cast<float>(m_pRTMSA_New->chInfo()[0].getMaxValue()-m_pRTMSA_New->chInfo()[0].getMinValue());
163 m_dMiddle = 0.5*(m_pRTMSA_New->chInfo()[0].getMinValue()+m_pRTMSA_New->chInfo()[0].getMaxValue())*m_fScaleFactor;
172 if((m_pRTMSA_New->getSamplingRate() == 0))
176 NewRealTimeMultiSampleArrayWidget::s_listSamplingRates << m_pRTMSA_New->getSamplingRate();
180 foreach (
double value, s_listSamplingRates)
181 dMax = value > dMax ? value : dMax;
191 void NewRealTimeMultiSampleArrayWidget::stopAnnotation()
193 m_bToolInUse = !m_bToolInUse;
199 void NewRealTimeMultiSampleArrayWidget::maxValueChanged(
double maxValue)
202 for(quint32 i = 0; i < m_pRTMSA_New->getNumChannels(); ++i)
203 m_pRTMSA_New->chInfo()[i].setMaxValue(maxValue);
212 void NewRealTimeMultiSampleArrayWidget::minValueChanged(
double minValue)
215 for(quint32 i = 0; i < m_pRTMSA_New->getNumChannels(); ++i)
216 m_pRTMSA_New->chInfo()[i].setMaxValue(minValue);
228 if(m_pRTMSA_New->getMultiSampleArray().size() > 0)
231 QVector< VectorXd > matSamples = m_pRTMSA_New->getMultiSampleArray();
236 m_iSamples = (qint32)floor((ui.m_qFrame->width() - m_dPosX) / m_dSampleWidth);
238 for(
unsigned int k = 0; k < m_uiNumChannels; ++k)
240 m_qVecPolygonF[k].clear();
242 for(qint32 l = 0; l < m_iSamples; ++l)
243 m_qVecPolygonF[k].append(QPointF(m_dPosition+l*m_dSampleWidth, 0));
246 m_bStartFlag =
false;
248 m_pTimeCurrentDisplay->setHMS(m_pTime->hour(),m_pTime->minute(),m_pTime->second(),m_pTime->msec());
253 qint32 t_iSamplesToMove = m_pRTMSA_New->getMultiArraySize();
255 if(m_iSamples - t_iSamplesToMove > 0)
256 for(quint32 k = 0; k < m_uiNumChannels; ++k)
257 for(qint32 i = 0; i < m_iSamples - t_iSamplesToMove; ++i)
258 m_qVecPolygonF[k][i].setY(m_qVecPolygonF[k][i+t_iSamplesToMove].ry());
261 qint32 t_iNewSampleStart = m_iSamples - m_pRTMSA_New->getMultiArraySize();
263 for(
unsigned char i = 0; i < m_pRTMSA_New->getMultiArraySize(); ++i)
265 vecValue = (matSamples[i].block(m_uiFirstChannel,0,m_uiNumChannels,1).array()*m_fScaleFactor);
268 for(
unsigned int k = 0; k < m_uiNumChannels; ++k)
269 m_qVecPolygonF[k][t_iNewSampleStart+i].setY(vecValue[k]);
273 m_pTimeCurrentDisplay->setHMS(m_pTime->hour(),m_pTime->minute(),m_pTime->second(),m_pTime->msec());
315 qWarning() <<
"NewRealTimeMultiSampleArrayWidget::update; getMultiArraySize():" << m_pRTMSA_New->getMultiArraySize() <<
"getMultiSampleArray():" << m_pRTMSA_New->getMultiSampleArray().size();
323 ui.m_qLabel_Caption->setText(m_pRTMSA_New->getName());
327 m_uiNumChannels = m_pRTMSA_New->getNumChannels() > m_uiMaxNumChannels ? m_uiMaxNumChannels : m_pRTMSA_New->getNumChannels();
329 m_dMinValue_init = m_pRTMSA_New->chInfo()[0].getMinValue();
330 m_dMaxValue_init = m_pRTMSA_New->chInfo()[0].getMaxValue();
334 m_dPosX = ui.m_qFrame->pos().x()+1;
335 m_dPosition = m_dPosX;
349 m_qVecPolygonF.clear();
350 for(
unsigned int i = 0; i < m_uiNumChannels; ++i)
351 m_qVecPolygonF.push_back(QPolygonF());
356 m_pTimeCurrentDisplay = QSharedPointer<QTime>(
new QTime(0, 0));
366 QPainter painter(
this);
378 painter.setPen(QPen(Qt::gray, 1, Qt::DashLine));
385 double dNumPixelsX = m_pRTMSA_New->getSamplingRate()/10.0f;
386 double dMinMaxDifference =
static_cast<double>(m_pRTMSA_New->chInfo()[0].getMaxValue()-m_pRTMSA_New->chInfo()[0].getMinValue());
387 double dActualPosX = 0.0;
388 unsigned short usNumOfGridsX = (
unsigned short)(ui.m_qFrame->width()/dNumPixelsX);
389 unsigned short usPosY = ui.m_qFrame->pos().y()+1;
390 unsigned short usPosX = ui.m_qFrame->pos().x()+1;
391 unsigned short usHeight = ui.m_qFrame->height()-2;
392 unsigned short usWidth = ui.m_qFrame->width()-2;
394 for(
unsigned short i = 1; i <= usNumOfGridsX; ++i)
396 dActualPosX = m_dPosX+i*dNumPixelsX;
397 painter.drawLine((
int)dActualPosX, usPosY, (
int)dActualPosX, usPosY+usHeight);
406 double exponent = (int)floor(log10(dMinMaxDifference))-1;
407 double dim = pow(10.0, exponent);
409 int NumOfLines = (int)floor(dMinMaxDifference/(dim*5));
411 double dDifferenceToFirstLine = (m_pRTMSA_New->chInfo()[0].getMaxValue()-floor(m_pRTMSA_New->chInfo()[0].getMaxValue()/dim)*dim);
413 double dNumPixelsY = usHeight/NumOfLines;
414 double dActualPosY = usPosY + dDifferenceToFirstLine * (usHeight/dMinMaxDifference);
416 for(
unsigned char i = 1; i <= NumOfLines; ++i)
418 painter.drawLine((
int)m_dPosX, (
int)dActualPosY, usWidth, (
int)dActualPosY);
419 dActualPosY += dNumPixelsY;
428 painter.setPen(QPen(Qt::darkBlue, 1, Qt::SolidLine));
429 painter.setRenderHint(QPainter::Antialiasing);
438 qint32 t_iDist = ui.m_qFrame->height() / (m_uiNumChannels+1);
442 painter.setPen(QPen(Qt::darkGray, 1, Qt::SolidLine));
444 for(quint32 k = 0; k < m_uiNumChannels; ++k)
446 painter.translate(0, t_iDist);
447 painter.drawPolyline(m_qVecPolygonF_Freeze[k]);
448 painter.drawText(0, -t_iDist/2, m_pRTMSA_New->chInfo()[m_uiFirstChannel+k].getChannelName());
454 for(quint32 k = 0; k < m_uiNumChannels; ++k)
456 painter.translate(0, t_iDist);
457 painter.drawPolyline(m_qVecPolygonF[k]);
458 painter.drawText(0, -t_iDist/2, m_pRTMSA_New->chInfo()[m_uiFirstChannel+k].getChannelName());
472 int iStartX = m_qPointMouseStartPosition.x();
474 int iEndY = m_qPointMouseEndPosition.y();
475 int iStartY = m_qPointMouseStartPosition.y();
478 int iPixelDifferenceY = abs(iStartY - iEndY);
480 double scale = (m_dMaxValue_init-m_dMinValue_init)/usHeight;
484 double changeValue = scale * iPixelDifferenceY;
486 if(changeValue*2 < m_dMaxValue_init - m_dMinValue_init)
488 minValueChanged(m_dMinValue_init + changeValue);
489 maxValueChanged(m_dMaxValue_init - changeValue);
493 double maxChange = (m_dMaxValue_init - m_dMinValue_init)*0.499999;
494 minValueChanged(m_dMinValue_init + maxChange);
495 maxValueChanged(m_dMaxValue_init - maxChange);
500 double changeValue = scale * iPixelDifferenceY*10;
502 minValueChanged(m_dMinValue_init - changeValue);
503 maxValueChanged(m_dMaxValue_init + changeValue);
506 double factor = (m_dMaxValue_init-m_dMinValue_init)/(m_pRTMSA_New->chInfo()[0].getMaxValue()-m_pRTMSA_New->chInfo()[0].getMinValue());
508 painter.setPen(QPen(Qt::darkCyan, 1, Qt::SolidLine));
509 painter.drawText(iStartX+8, iEndY, tr(
"Zoom %1x").arg(factor, 0,
'f', 2));
518 if(m_bPosition && m_pRTMSA_New->getSamplingRate())
520 int iPosX = mapFromGlobal(QCursor::pos()).x();
522 int iPosY = mapFromGlobal(QCursor::pos()).y();
524 if(iPosX > usPosX && iPosX < (usPosX + usWidth) && iPosY > usPosY && iPosY < usPosY + usHeight )
527 painter.setPen(QPen(Qt::gray, 1, Qt::DashLine));
529 QPoint start(usPosX, iPosY);
530 QPoint end(usPosX + usWidth, iPosY);
532 painter.drawLine(start, end);
534 start.setX(iPosX); start.setY(usPosY);
535 end.setX(iPosX); end.setY(usPosY + usHeight);
536 painter.drawLine(start, end);
539 QTime t = m_pTimeCurrentDisplay->addMSecs((
int)(1000*(iPosX-usPosX)/(
float)m_pRTMSA_New->getSamplingRate()));
542 painter.setPen(QPen(Qt::darkGray, 1, Qt::SolidLine));
544 painter.drawText(iPosX+8, iPosY-8, tr(
"%1").arg(t.toString(
"hh:mm:ss.zzz")));
555 if(m_bMeasurement && m_pRTMSA_New->getSamplingRate())
557 int iEndX = m_qPointMouseEndPosition.x();
558 int iStartX = m_qPointMouseStartPosition.x();
560 int iEndY = m_qPointMouseEndPosition.y();
561 int iStartY = m_qPointMouseStartPosition.y();
565 double iPixelDifferenceX = abs(iStartX - iEndX);
566 double iPixelDifferenceY = abs(iStartY - iEndY);
568 if(iPixelDifferenceX < 5 && iPixelDifferenceY < 5)
572 painter.setPen(QPen(Qt::darkCyan, 1, Qt::DashLine));
573 if(iPixelDifferenceX > iPixelDifferenceY)
579 QPoint start(iStartX, usPosY);
580 QPoint end(iStartX, usPosY+usHeight);
581 painter.drawLine(start, end);
583 start.setX(iEndX); start.setY(usPosY);
584 end.setX(iEndX); end.setY(usPosY+usHeight);
585 painter.drawLine(start, end);
594 float iTime = 1000.0f*(float)iPixelDifferenceX/(
float)m_pRTMSA_New->getSamplingRate();
595 float iHz = 1000.0f/(float)iTime;
598 painter.setPen(QPen(Qt::darkCyan, 1, Qt::SolidLine));
600 painter.drawText(iEndX, iEndY-18, tr(
"%1ms").arg(iTime, 0,
'f', 2));
601 painter.drawText(iEndX, iEndY-4, tr(
"%1Hz").arg(iHz, 0,
'f', 2));
609 QPoint start(usPosX, iStartY);
610 QPoint end(usPosX+usWidth, iStartY);
611 painter.drawLine(start, end);
613 start.setX(usPosX); start.setY(iEndY);
614 end.setX(usPosX+usWidth); end.setY(iEndY);
615 painter.drawLine(start, end);
625 float fMagnitude = (float)iPixelDifferenceY * (dMinMaxDifference/usHeight) ;
628 painter.setPen(QPen(Qt::darkCyan, 1, Qt::SolidLine));
629 painter.drawText(iEndX+14, iEndY-8, tr(
"%1%2").arg(fMagnitude, 0,
'e', 3).arg(m_pRTMSA_New->chInfo()[0].getUnit()));
670 m_qPointMouseStartPosition = m_qPointMouseEndPosition = mouseEvent->pos();
671 if(mouseEvent->button() == Qt::LeftButton)
673 m_bMeasurement =
true;
676 else if(mouseEvent->button() == Qt::RightButton)
688 if(m_bMeasurement || m_bScaling)
689 m_qPointMouseEndPosition = mouseEvent->pos();
697 m_bMeasurement =
false;
707 switch((Tool)m_ucToolIndex)
710 m_bFrozen = !m_bFrozen;
716 m_qVecPolygonF_Freeze = m_qVecPolygonF;
721 m_pTimeCurrentDisplay->setHMS(m_pTime->hour(),m_pTime->minute(),m_pTime->second(),m_pTime->msec());
729 m_bToolInUse = !m_bToolInUse;
737 if(wheelEvent->delta() < 0)
739 if((qint32)m_uiFirstChannel - (qint32)m_uiNumChannels >= 0)
740 m_uiFirstChannel -= m_uiNumChannels;
742 m_uiFirstChannel = 0;
746 if(((qint32)m_uiFirstChannel + (qint32)m_uiNumChannels) < ((qint32)m_pRTMSA_New->getNumChannels()-(qint32)m_uiNumChannels))
747 m_uiFirstChannel += m_uiNumChannels;
749 m_uiFirstChannel = m_pRTMSA_New->getNumChannels()- m_uiNumChannels;
792 QList<double> NewRealTimeMultiSampleArrayWidget::s_listSamplingRates;
QSharedPointer< NewMeasurement > SPtr
Contains the declaration of the NewRealTimeMultiSampleArray class.