|
|
#include "asmpage.h"
|
|
|
|
|
|
ASMPage::ASMPage(QWidget *parent, unsigned int bufferSize, unsigned int xMAX, unsigned int yMAX) :
|
|
|
QMainWindow(parent)
|
|
|
{
|
|
|
unsigned int i;
|
|
|
localBufferSize = bufferSize;
|
|
|
// memory allocation of the data buffer
|
|
|
dataBuffer = (QByteArray**) malloc( localBufferSize * sizeof(QByteArray*) );
|
|
|
for (i=0; i<localBufferSize; i++)
|
|
|
{
|
|
|
dataBuffer[i] = new QByteArray;
|
|
|
}
|
|
|
|
|
|
pageTitle = "default";
|
|
|
|
|
|
wfPlot_asm_b1b1 = new WFPlot(this, xMAX, yMAX);
|
|
|
wfPlot_asm_b2b2 = new WFPlot(this, xMAX, yMAX);
|
|
|
wfPlot_asm_b3b3 = new WFPlot(this, xMAX, yMAX);
|
|
|
wfPlot_asm_e1e1 = new WFPlot(this, xMAX, yMAX);
|
|
|
wfPlot_asm_e2e2 = new WFPlot(this, xMAX, yMAX);
|
|
|
|
|
|
wfPlot_asm_b1b1->customPlot->setTitle("b1b1");
|
|
|
wfPlot_asm_b2b2->customPlot->setTitle("b2b2");
|
|
|
wfPlot_asm_b3b3->customPlot->setTitle("b3b3");
|
|
|
wfPlot_asm_e1e1->customPlot->setTitle("e1e1");
|
|
|
wfPlot_asm_e2e2->customPlot->setTitle("e2e2");
|
|
|
|
|
|
dockB1B1 = NULL;
|
|
|
dockB2B2 = NULL;
|
|
|
dockB3B3 = NULL;
|
|
|
dockE1E1 = NULL;
|
|
|
dockE2E2 = NULL;
|
|
|
|
|
|
titleWidgetB1B1 = new QWidget();
|
|
|
titleWidgetB2B2 = new QWidget();
|
|
|
titleWidgetB3B3 = new QWidget();
|
|
|
titleWidgetE1E1 = new QWidget();
|
|
|
titleWidgetE2E2 = new QWidget();
|
|
|
|
|
|
logFileName = new QLabel();
|
|
|
logFile = new QFile();
|
|
|
|
|
|
logFileEn = false;
|
|
|
storageEnabled = false;
|
|
|
allowDataStorage = false;
|
|
|
|
|
|
createToolBar();
|
|
|
}
|
|
|
|
|
|
ASMPage::~ASMPage()
|
|
|
{
|
|
|
unsigned int i;
|
|
|
// deallocation of the data buffer
|
|
|
for (i=0; i<localBufferSize; i++)
|
|
|
{
|
|
|
delete dataBuffer[i];
|
|
|
}
|
|
|
free(dataBuffer);
|
|
|
}
|
|
|
|
|
|
void ASMPage::createToolBar()
|
|
|
{
|
|
|
radio_b1b1 = new QRadioButton(tr("b1b1"));
|
|
|
radio_b2b2 = new QRadioButton(tr("b2b2"));
|
|
|
radio_b3b3 = new QRadioButton(tr("b3b3"));
|
|
|
radio_e1e1 = new QRadioButton(tr("e1e1"));
|
|
|
radio_e2e2 = new QRadioButton(tr("e2e2"));
|
|
|
radio_tabify = new QRadioButton(tr("tabify"));
|
|
|
|
|
|
radio_b1b1->setAutoExclusive(false);
|
|
|
radio_b2b2->setAutoExclusive(false);
|
|
|
radio_b3b3->setAutoExclusive(false);
|
|
|
radio_e1e1->setAutoExclusive(false);
|
|
|
radio_e2e2->setAutoExclusive(false);
|
|
|
radio_tabify->setAutoExclusive(false);
|
|
|
|
|
|
button_selectAll = new QPushButton(tr("select all"));
|
|
|
|
|
|
label_storeWfrm = new QLabel("-");
|
|
|
|
|
|
myToolBar = new QToolBar("select");
|
|
|
|
|
|
myToolBar->addWidget(radio_b1b1);
|
|
|
myToolBar->addWidget(radio_b2b2);
|
|
|
myToolBar->addWidget(radio_b3b3);
|
|
|
myToolBar->addWidget(radio_e1e1);
|
|
|
myToolBar->addWidget(radio_e2e2);
|
|
|
myToolBar->addSeparator();
|
|
|
myToolBar->addWidget(button_selectAll);
|
|
|
myToolBar->addWidget(radio_tabify);
|
|
|
myToolBar->addSeparator();
|
|
|
myToolBar->addWidget(label_storeWfrm);
|
|
|
|
|
|
addToolBar(Qt::LeftToolBarArea, myToolBar);
|
|
|
|
|
|
radio_tabify->setChecked(true);
|
|
|
|
|
|
connect(this->radio_b1b1, SIGNAL(clicked(bool)), this, SLOT(actionRadioB1B1(bool)));
|
|
|
connect(this->radio_b2b2, SIGNAL(clicked(bool)), this, SLOT(actionRadioB2B2(bool)));
|
|
|
connect(this->radio_b3b3, SIGNAL(clicked(bool)), this, SLOT(actionRadioB3B3(bool)));
|
|
|
connect(this->radio_e1e1, SIGNAL(clicked(bool)), this, SLOT(actionRadioE1E1(bool)));
|
|
|
connect(this->radio_e2e2, SIGNAL(clicked(bool)), this, SLOT(actionRadioE2E2(bool)));
|
|
|
connect(this->button_selectAll, SIGNAL(clicked()), this, SLOT(selectAll()));
|
|
|
connect(this->radio_tabify, SIGNAL(clicked(bool)), this, SLOT(organizeDocks()));
|
|
|
}
|
|
|
|
|
|
void ASMPage::actionRadioB1B1(bool state)
|
|
|
{
|
|
|
if (state == true)
|
|
|
{
|
|
|
if (dockB1B1 == NULL)
|
|
|
{
|
|
|
dockB1B1 = new QDockWidget("B1B1", this);
|
|
|
dockB1B1->setWidget(wfPlot_asm_b1b1);
|
|
|
dockB1B1->setTitleBarWidget(titleWidgetB1B1);
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
this->removeDockWidget(dockB1B1);
|
|
|
}
|
|
|
organizeDocks();
|
|
|
}
|
|
|
|
|
|
void ASMPage::actionRadioB2B2(bool state)
|
|
|
{
|
|
|
if (state == true)
|
|
|
{
|
|
|
if (dockB2B2 == NULL)
|
|
|
{
|
|
|
dockB2B2 = new QDockWidget("B2B2", this);
|
|
|
dockB2B2->setWidget(wfPlot_asm_b2b2);
|
|
|
dockB2B2->setTitleBarWidget(titleWidgetB2B2);
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
this->removeDockWidget(dockB2B2);
|
|
|
}
|
|
|
organizeDocks();
|
|
|
}
|
|
|
|
|
|
void ASMPage::actionRadioB3B3(bool state)
|
|
|
{
|
|
|
if (state == true)
|
|
|
{
|
|
|
if (dockB3B3 == NULL)
|
|
|
{
|
|
|
dockB3B3 = new QDockWidget("B3B3", this);
|
|
|
dockB3B3->setWidget(wfPlot_asm_b3b3);
|
|
|
dockB3B3->setTitleBarWidget(titleWidgetB3B3);
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
this->removeDockWidget(dockB3B3);
|
|
|
}
|
|
|
organizeDocks();
|
|
|
}
|
|
|
|
|
|
void ASMPage::actionRadioE1E1(bool state)
|
|
|
{
|
|
|
if (state == true)
|
|
|
{
|
|
|
if (dockE1E1 == NULL)
|
|
|
{
|
|
|
dockE1E1 = new QDockWidget("E1E1", this);
|
|
|
dockE1E1->setWidget(wfPlot_asm_e1e1);
|
|
|
dockE1E1->setTitleBarWidget(titleWidgetE1E1);
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
this->removeDockWidget(dockE1E1);
|
|
|
}
|
|
|
organizeDocks();
|
|
|
}
|
|
|
|
|
|
void ASMPage::actionRadioE2E2(bool state)
|
|
|
{
|
|
|
if (state == true)
|
|
|
{
|
|
|
if (dockE2E2 == NULL)
|
|
|
{
|
|
|
dockE2E2 = new QDockWidget("E2E2", this);
|
|
|
dockE2E2->setWidget(wfPlot_asm_e2e2);
|
|
|
dockE2E2->setTitleBarWidget(titleWidgetE2E2);
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
this->removeDockWidget(dockE2E2);
|
|
|
}
|
|
|
organizeDocks();
|
|
|
}
|
|
|
|
|
|
void ASMPage::buildDockList()
|
|
|
{
|
|
|
dockList.clear();
|
|
|
|
|
|
if (radio_b1b1->isChecked())
|
|
|
{
|
|
|
dockList.append(dockB1B1);
|
|
|
removeDockWidget(dockB1B1);
|
|
|
}
|
|
|
if (radio_b2b2->isChecked())
|
|
|
{
|
|
|
dockList.append(dockB2B2);
|
|
|
removeDockWidget(dockB2B2);
|
|
|
}
|
|
|
if (radio_b3b3->isChecked())
|
|
|
{
|
|
|
dockList.append(dockB3B3);
|
|
|
removeDockWidget(dockB3B3);
|
|
|
}
|
|
|
if (radio_e1e1->isChecked())
|
|
|
{
|
|
|
dockList.append(dockE1E1);
|
|
|
removeDockWidget(dockE1E1);
|
|
|
}
|
|
|
if (radio_e2e2->isChecked())
|
|
|
{
|
|
|
dockList.append(dockE2E2);
|
|
|
removeDockWidget(dockE2E2);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void ASMPage::organizeDocks()
|
|
|
{
|
|
|
if (radio_tabify->isChecked())
|
|
|
{
|
|
|
tabify();
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
unTabify();
|
|
|
}
|
|
|
wfPlot_asm_b1b1->resize(wfPlot_asm_b1b1->minimumSizeHint());
|
|
|
wfPlot_asm_b2b2->resize(wfPlot_asm_b2b2->minimumSizeHint());
|
|
|
wfPlot_asm_b3b3->resize(wfPlot_asm_b3b3->minimumSizeHint());
|
|
|
wfPlot_asm_e1e1->resize(wfPlot_asm_e1e1->minimumSizeHint());
|
|
|
wfPlot_asm_e2e2->resize(wfPlot_asm_e2e2->minimumSizeHint());
|
|
|
this->resize(this->minimumSizeHint());
|
|
|
}
|
|
|
|
|
|
void ASMPage::unTabify()
|
|
|
{
|
|
|
buildDockList();
|
|
|
|
|
|
switch(dockList.size())
|
|
|
{
|
|
|
case 0:
|
|
|
break;
|
|
|
case 1:
|
|
|
addDockWidget(Qt::TopDockWidgetArea, dockList.at(0));
|
|
|
dockList.at(0)->show();
|
|
|
break;
|
|
|
case 2:
|
|
|
addDockWidget(Qt::TopDockWidgetArea, dockList.at(0));
|
|
|
addDockWidget(Qt::TopDockWidgetArea, dockList.at(1));
|
|
|
dockList.at(0)->show();
|
|
|
dockList.at(1)->show();
|
|
|
break;
|
|
|
case 3:
|
|
|
addDockWidget(Qt::TopDockWidgetArea, dockList.at(0));
|
|
|
addDockWidget(Qt::TopDockWidgetArea, dockList.at(1));
|
|
|
addDockWidget(Qt::BottomDockWidgetArea, dockList.at(2));
|
|
|
dockList.at(0)->show();
|
|
|
dockList.at(1)->show();
|
|
|
dockList.at(2)->show();
|
|
|
break;
|
|
|
case 4:
|
|
|
addDockWidget(Qt::TopDockWidgetArea, dockList.at(0));
|
|
|
addDockWidget(Qt::TopDockWidgetArea, dockList.at(1));
|
|
|
addDockWidget(Qt::BottomDockWidgetArea, dockList.at(2));
|
|
|
addDockWidget(Qt::BottomDockWidgetArea, dockList.at(3));
|
|
|
dockList.at(0)->show();
|
|
|
dockList.at(1)->show();
|
|
|
dockList.at(2)->show();
|
|
|
dockList.at(3)->show();
|
|
|
break;
|
|
|
case 5:
|
|
|
addDockWidget(Qt::TopDockWidgetArea, dockList.at(0));
|
|
|
addDockWidget(Qt::TopDockWidgetArea, dockList.at(1));
|
|
|
addDockWidget(Qt::TopDockWidgetArea, dockList.at(2));
|
|
|
addDockWidget(Qt::BottomDockWidgetArea, dockList.at(3));
|
|
|
addDockWidget(Qt::BottomDockWidgetArea, dockList.at(4));
|
|
|
dockList.at(0)->show();
|
|
|
dockList.at(1)->show();
|
|
|
dockList.at(2)->show();
|
|
|
dockList.at(3)->show();
|
|
|
dockList.at(4)->show();
|
|
|
break;
|
|
|
default:
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void ASMPage::tabify()
|
|
|
{
|
|
|
buildDockList();
|
|
|
|
|
|
switch(dockList.size())
|
|
|
{
|
|
|
case 0:
|
|
|
break;
|
|
|
case 1:
|
|
|
addDockWidget(Qt::TopDockWidgetArea, dockList.at(0));
|
|
|
dockList.at(0)->show();
|
|
|
break;
|
|
|
case 2:
|
|
|
addDockWidget(Qt::TopDockWidgetArea, dockList.at(0));
|
|
|
tabifyDockWidget(dockList.at(0), dockList.at(1));
|
|
|
dockList.at(0)->show();
|
|
|
dockList.at(1)->show();
|
|
|
break;
|
|
|
case 3:
|
|
|
addDockWidget(Qt::BottomDockWidgetArea, dockList.at(0));
|
|
|
tabifyDockWidget(dockList.at(0), dockList.at(1));
|
|
|
tabifyDockWidget(dockList.at(1), dockList.at(2));
|
|
|
dockList.at(0)->show();
|
|
|
dockList.at(1)->show();
|
|
|
dockList.at(2)->show();
|
|
|
break;
|
|
|
case 4:
|
|
|
addDockWidget(Qt::BottomDockWidgetArea, dockList.at(0));
|
|
|
tabifyDockWidget(dockList.at(0), dockList.at(1));
|
|
|
tabifyDockWidget(dockList.at(1), dockList.at(2));
|
|
|
tabifyDockWidget(dockList.at(2), dockList.at(3));
|
|
|
dockList.at(0)->show();
|
|
|
dockList.at(1)->show();
|
|
|
dockList.at(2)->show();
|
|
|
dockList.at(3)->show();
|
|
|
break;
|
|
|
case 5:
|
|
|
addDockWidget(Qt::BottomDockWidgetArea, dockList.at(0));
|
|
|
tabifyDockWidget(dockList.at(0), dockList.at(1));
|
|
|
tabifyDockWidget(dockList.at(1), dockList.at(2));
|
|
|
tabifyDockWidget(dockList.at(2), dockList.at(3));
|
|
|
tabifyDockWidget(dockList.at(3), dockList.at(4));
|
|
|
dockList.at(0)->show();
|
|
|
dockList.at(1)->show();
|
|
|
dockList.at(2)->show();
|
|
|
dockList.at(3)->show();
|
|
|
dockList.at(4)->show();
|
|
|
break;
|
|
|
default:
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void ASMPage::selectAll()
|
|
|
{
|
|
|
radio_b1b1->click();
|
|
|
radio_b2b2->click();
|
|
|
radio_b3b3->click();
|
|
|
radio_e1e1->click();
|
|
|
radio_e2e2->click();
|
|
|
}
|
|
|
|
|
|
void ASMPage::storeWfrm()
|
|
|
{
|
|
|
if (logFileEn == false)
|
|
|
{
|
|
|
buildFileName();
|
|
|
label_storeWfrm->setText("Recording...");
|
|
|
logFileEn = true;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
// disable storage
|
|
|
storageEnabled = false;
|
|
|
label_storeWfrm->setText("-");
|
|
|
logFileEn = false;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void ASMPage::buildFileName()
|
|
|
{
|
|
|
QTime time;
|
|
|
QDate date;
|
|
|
QString dateTime;
|
|
|
QString prefix;
|
|
|
|
|
|
date = QDate::currentDate();
|
|
|
time = QTime::currentTime();
|
|
|
|
|
|
dateTime = QString::number( date.year() ) + "_"
|
|
|
+ QString::number( date.month() ) + "_"
|
|
|
+ QString::number( date.day() ) + "-"
|
|
|
+ QString::number( time.hour() ) + "_"
|
|
|
+ QString::number( time.minute() ) + "_"
|
|
|
+ QString::number( time.second() );
|
|
|
|
|
|
prefix = defaultStorageDirectory + "/" + dateTime + "_" + pageTitle ;
|
|
|
|
|
|
if(this->logFile->isOpen()) this->logFile->close();
|
|
|
this->logFile->setFileName( prefix + ".data");
|
|
|
if(this->logFile->open(QIODevice::WriteOnly)) this->logFileStrm = new QTextStream(this->logFile);
|
|
|
|
|
|
*(this->logFileStrm) << "time V E1 E2 B1 B2 B3" << endl;
|
|
|
|
|
|
storageEnabled = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
void ASMPage::displayOnPlot(float *data, unsigned char num, unsigned char asm_indice_start, double deltaF, unsigned int nbData)
|
|
|
{
|
|
|
fillDataBuffer( data, num, asm_indice_start, deltaF, nbData );
|
|
|
|
|
|
switch(num){
|
|
|
case 0:
|
|
|
wfPlot_asm_b1b1->displayOnPlotFloat(data, nbData);
|
|
|
break;
|
|
|
|
|
|
case 1:
|
|
|
wfPlot_asm_b2b2->displayOnPlotFloat(data, nbData);
|
|
|
break;
|
|
|
|
|
|
case 2:
|
|
|
wfPlot_asm_b3b3->displayOnPlotFloat(data, nbData);
|
|
|
break;
|
|
|
|
|
|
case 3:
|
|
|
wfPlot_asm_e1e1->displayOnPlotFloat(data, nbData);
|
|
|
break;
|
|
|
|
|
|
case 4:
|
|
|
wfPlot_asm_e2e2->displayOnPlotFloat(data, nbData);
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void ASMPage::initDataBuffer()
|
|
|
{
|
|
|
for (unsigned int i = 0; i < localBufferSize; i++)
|
|
|
{
|
|
|
dataBuffer[i]->clear();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void ASMPage::fillDataBuffer(float *data, unsigned char num, unsigned char asm_indice_start, double deltaF, unsigned int nbData)
|
|
|
{
|
|
|
double frequencyBin;
|
|
|
QByteArray frequencyBinQByteArray;
|
|
|
|
|
|
if ( (storageEnabled == true) | (allowDataStorage == true) ) // store data in buffers
|
|
|
{
|
|
|
switch(num) {
|
|
|
|
|
|
case 0 :
|
|
|
initDataBuffer();
|
|
|
frequencyBin = 0;
|
|
|
for (unsigned int i=0; i<nbData; i++)
|
|
|
{
|
|
|
frequencyBin = asm_indice_start * deltaF
|
|
|
+ deltaF * ((double) i);
|
|
|
frequencyBinQByteArray.setNum( frequencyBin, 'f', 10 );
|
|
|
dataBuffer[i]->append( frequencyBinQByteArray + ' ' + QByteArray::number(data[i]) );
|
|
|
}
|
|
|
allowDataStorage = true;
|
|
|
break;
|
|
|
|
|
|
case 1 :
|
|
|
case 2 :
|
|
|
case 3 :
|
|
|
if (allowDataStorage==true) {
|
|
|
for (unsigned int i=0; i<nbData; i++)
|
|
|
{
|
|
|
dataBuffer[i]->append( ' ' + QByteArray::number(data[i]) );
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
case 4 :
|
|
|
if (allowDataStorage==true) {
|
|
|
for (unsigned int i=0; i<nbData; i++)
|
|
|
{
|
|
|
dataBuffer[i]->append( ' ' + QByteArray::number(data[i]) );
|
|
|
}
|
|
|
storeDataBuffer( nbData );
|
|
|
allowDataStorage = false;
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void ASMPage::storeDataBuffer(unsigned int nbData)
|
|
|
{
|
|
|
for (unsigned int i = 0; i < nbData; i++ )
|
|
|
{
|
|
|
*(this->logFileStrm) << *dataBuffer[i] << endl;
|
|
|
}
|
|
|
if (storageEnabled == false){
|
|
|
this->logFileStrm->flush();
|
|
|
this->logFile->waitForBytesWritten(3000);
|
|
|
this->logFile->close();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void ASMPage::setDefaultStorageDirectory(QString nameOfTheDirectory)
|
|
|
{
|
|
|
defaultStorageDirectory = nameOfTheDirectory;
|
|
|
}
|
|
|
|