#include "DataView.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include DataView::DataView( bool stand_alone, QWidget* parent, const char* , Qt::WFlags fl, QApplication *app, bool waferView) : QWidget(parent, fl), m_waferView(waferView) // : DataViewBase(parent, name, fl) { setupUi(this); QObject::connect(closeButton, SIGNAL(clicked()), this, SLOT(close())); QObject::connect(browseButton, SIGNAL(clicked()), this, SLOT(browseFile())); QObject::connect(clearMAButton, SIGNAL(clicked()), this, SLOT(clearMA())); QObject::connect(xferAllButton, SIGNAL(clicked()), this, SLOT(xferAll())); QObject::connect(updateButton, SIGNAL(clicked()), this, SLOT(updateView())); if(!stand_alone){ browseButton->hide(); updateButton->hide(); fileName->setEnabled(false); fileLabel->hide(); closeButton->hide(); } m_file = 0; m_tw = new TopWin(tab1,"MAmain",0,true, app); MAvbox->addWidget(m_tw); closeFile(); connect( m_listView, SIGNAL( doubleClicked(Q3ListViewItem*) ), this, SLOT( itemDoubleClick(Q3ListViewItem*) ) ); connect( m_listView, SIGNAL( rightButtonClicked(Q3ListViewItem*, const QPoint &, int ) ), this, SLOT( rightClick(Q3ListViewItem*) ) ); } DataView::~DataView() { closeFile(); } void DataView::browseFile(const char *fname) { QString qpath = fileName->text(); if(qpath=="" && m_tw->options->m_Opts->m_DefDataPath!=".") qpath = m_tw->options->m_Opts->m_DefDataPath.c_str(); if(fname!=0){ fileName->setText(fname); updateView(); } else{ QStringList filter; filter += "RootDB file (*.root)"; filter += "DB ascii-config file (*.cfg)"; filter += "Any file (*.*)"; Q3FileDialog fdia(qpath,QString::null,this,"select_DB_file",TRUE); fdia.setCaption("Specify name of DB file"); fdia.setFilters(filter); fdia.setMode(Q3FileDialog::ExistingFile); if(fdia.exec() == QDialog::Accepted){ fileName->setText(fdia.selectedFile()); updateView(); } } return; } void DataView::updateView() { QApplication::setOverrideCursor(Qt::waitCursor); QString name = fileName->text(); closeFile(); fileName->setText(name); // restore name since this is erased after closing // check if file exists, only proceed if yes FILE *ft = fopen(fileName->text().latin1(), "r"); if(ft==0){ //fileName->setText(""); QApplication::restoreOverrideCursor(); return; }else fclose(ft); // then open as DB file try{ m_file = new PixLib::RootDB(fileName->text().latin1()); }catch(...){ m_file = 0; fileName->setText(""); QApplication::restoreOverrideCursor(); QMessageBox::warning(this,"DataView::updateView","Error opening file "+name); return; } PixLib::DBInquire *root = m_file->readRootRecord(1); for(PixLib::recordIterator rit=root->recordBegin(); rit!=root->recordEnd();rit++){ if((*rit)->getName()=="PixScanResult"){ DBTreeItem *newItem; if(m_waferView) newItem = new DBTreeItem(m_scans, (*rit), fileName->text().latin1(), false, true); else newItem = new DBTreeItem(m_listView, (*rit), fileName->text().latin1(), false, true); // rename to scan label std::string decName = (*rit)->getDecName(); PixLib::getDecNameCore(decName); newItem->setText(0,decName.c_str()); // make comment writable // bool gotComment=false; Q3ListViewItem *item = newItem->firstChild(); while(item!=0){ if(item->text(0)=="Comment") ((DBTreeItem*)item)->setWritable(); item = item->nextSibling(); } // add item for config viewing new Q3ListViewItem(newItem, "View scan config"); // add item for MA loading new Q3ListViewItem(newItem, "Xfer into MA"); for(PixLib::recordIterator riit=(*rit)->recordBegin(); riit!=(*rit)->recordEnd();riit++){ if((*riit)->getName()=="PixModuleGroup"){ std::string grname = (*riit)->getDecName(); PixLib::getDecNameCore(grname); for(PixLib::recordIterator riiit=(*riit)->recordBegin(); riiit!=(*riit)->recordEnd();riiit++){ if((*riiit)->getName()=="PixDcsReadings"){ DBTreeItem *dcsit = new DBTreeItem(newItem, *riiit, fileName->text().latin1(), false, true); dcsit->setText(0,("DCS reading - grp. "+grname).c_str()); break; } } } } } else if((*rit)->getName()=="ChipTestResult" && m_waferView){ DBTreeItem *newItem = new DBTreeItem(m_chipTests, (*rit), fileName->text().latin1(), false, true); // rename to test label std::string testName = (*rit)->getDecName(); PixLib::getDecNameCore(testName); bool allPass=true, mixPass=false; for(PixLib::recordIterator riit=(*rit)->recordBegin(); riit!=(*rit)->recordEnd();riit++){ if((*riit)->getName()=="PixModuleGroup"){ for(PixLib::recordIterator riiit=(*riit)->recordBegin(); riiit!=(*riit)->recordEnd();riiit++){ fieldIterator f; f = (*riiit)->findField("PassFlag"); if(f!=(*riiit)->fieldEnd()){ bool value; m_file->DBProcess(*f,READ,value); if(value){ if(!allPass) mixPass=true; } else allPass = false; } f = (*riiit)->findField("Result"); if(f!=(*riiit)->fieldEnd()){ std::string value; m_file->DBProcess(*f,READ,value); DBTreeItem::ChipTestType type = DBTreeItem::none; if(value.substr(0,14)=="Passed GR test" || value.substr(0,14)=="Failed GR test") type = DBTreeItem::GR; else if(value.substr(0,25)=="Passed test of scan chain" || value.substr(0,25)=="Failed test of scan chain") type = DBTreeItem::SC; else type = DBTreeItem::PR; DBTreeItem *newMod = new DBTreeItem(newItem, (*f), fileName->text().latin1(), type, true); // rename to module + group label std::string mlabel, decName = (*riit)->getDecName(); PixLib::getDecNameCore(decName); mlabel = "Result for " + decName; decName = (*riiit)->getDecName(); PixLib::getDecNameCore(decName); mlabel += " - " +decName; newMod->setText(0,mlabel.c_str()); } } } } if(allPass) testName += " - ALL PASSED"; else if(mixPass) testName += " - some FAILED"; else testName += " - ALL FAILED"; newItem->setText(0,testName.c_str()); } else if((*rit)->getName()=="DCS_readings" && m_waferView){ DBTreeItem *newItem = new DBTreeItem(m_dcsReadings, (*rit), fileName->text().latin1(), true, true); // rename to reading label std::string decName = (*rit)->getDecName(); PixLib::getDecNameCore(decName); newItem->setText(0,decName.c_str()); } else if((*rit)->getName()=="ServiceRecord" && m_waferView){ DBTreeItem *newItem = new DBTreeItem(m_srvRecs, (*rit), fileName->text().latin1(), false, true); // rename to reading label std::string decName = (*rit)->getDecName(); PixLib::getDecNameCore(decName); newItem->setText(0,decName.c_str()); for(PixLib::recordIterator riit=(*rit)->recordBegin(); riit!=(*rit)->recordEnd();riit++){ if((*riit)->getName()=="PixModuleGroup"){ for(PixLib::recordIterator riiit=(*riit)->recordBegin(); riiit!=(*riit)->recordEnd();riiit++){ fieldIterator f = (*riiit)->findField("Result"); if(f!=(*riiit)->fieldEnd()){ DBTreeItem *newMod = new DBTreeItem(newItem, (*f), fileName->text().latin1(), DBTreeItem::none, true); // rename to module + group label std::string mlabel, decName = (*riit)->getDecName(); PixLib::getDecNameCore(decName); mlabel = "Result for " + decName; decName = (*riiit)->getDecName(); PixLib::getDecNameCore(decName); mlabel += " - " +decName; newMod->setText(0,mlabel.c_str()); } } } } } } QApplication::restoreOverrideCursor(); } void DataView::closeFile() { m_listView->clear(); if(m_waferView){ m_scans = new Q3ListViewItem(m_listView, "Scans"); m_chipTests = new Q3ListViewItem(m_listView, "Chip Tests"); m_dcsReadings = new Q3ListViewItem(m_listView, "DCS Readings"); m_srvRecs = new Q3ListViewItem(m_listView, "Service Records"); m_scans->setOpen(true); m_chipTests->setOpen(true); m_dcsReadings->setOpen(true); m_srvRecs->setOpen(true); } fileName->setText(""); delete m_file; m_file = 0; } void DataView::itemDoubleClick(Q3ListViewItem *in_item) { if(in_item==0) return; DBTreeItem *item = dynamic_cast(in_item); if(item==0){ if(in_item->text(0)=="Xfer into MA"){ DBTreeItem *data_item = dynamic_cast(in_item->parent()); if(data_item!=0 && data_item->isInquire()){ QApplication::setOverrideCursor(Qt::waitCursor); m_tw->loadPixScanData((void*)data_item->getInquire(), 0, true, fileName->text().latin1()); data_item->closeFile(); tabWidget->setCurrentPage(1); QApplication::restoreOverrideCursor(); } } else if(in_item->text(0)=="View scan config"){ DBTreeItem *data_item = dynamic_cast(in_item->parent()); if(data_item!=0 && data_item->isInquire()){ bool noEntry = true; for(PixLib::recordIterator rit=data_item->getInquire()->recordBegin(); rit!=data_item->getInquire()->recordEnd() && noEntry;rit++){ if((*rit)->getName()=="PixModuleGroup"){ for(PixLib::recordIterator riit=(*rit)->recordBegin(); riit!=(*rit)->recordEnd() && noEntry;riit++){ if((*riit)->getName()=="PixScanData"){ noEntry = false; PixScan *ps = new PixScan(*riit); configViewer cv(ps->config(), this, "scancfg"); cv.m_saveB->hide(); cv.exec(); } } } } data_item->closeFile(); } } } else if(item->isField()) item->edit(); } void DataView::rightClick(Q3ListViewItem *in_item) { DBTreeItem *item = dynamic_cast(in_item); if(item==0) return; if(item->isInquire()){ Q3PopupMenu mymenu(this,"right_menu"); mymenu.insertItem("&Add field", 0); switch(mymenu.exec(QCursor::pos())){ case 0: item->addDBField(); updateView(); break; default: break; } } else{ // field Q3PopupMenu mymenu(this,"right_menu"); mymenu.insertItem("&Delete field", 0); switch(mymenu.exec(QCursor::pos())){ case 0: item->deleteDBObject(); updateView(); break; default: break; } } return; } void DataView::clearMA(bool warn){ m_tw->RemoveAllMod(warn); } void DataView::xferAll(){ DBTreeItem *data_item = 0; if(m_waferView) data_item = dynamic_cast(m_scans->firstChild()); else data_item = dynamic_cast(m_listView->firstChild()); QApplication::setOverrideCursor(Qt::waitCursor); while(data_item!=0 && data_item->isInquire()){ m_tw->loadPixScanData((void*)data_item->getInquire(), 0, true, fileName->text().latin1()); data_item->closeFile(); data_item = dynamic_cast(data_item->nextSibling()); } tabWidget->setCurrentPage(1); QApplication::restoreOverrideCursor(); return; }