asmpage.cpp
513 lines
| 13.6 KiB
| text/x-c
|
CppLexer
r69 | #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; | ||||
} | ||||