#include "MultiboardCfg.h" #include "STControlEngine.h" #include #include #include #include #include #include #include #include #include #include MultiboardCfg::MultiboardCfg(STControlEngine &engine_in, QWidget* parent, Qt::WFlags fl) : QDialog(parent, fl), m_engine(engine_in){ setupUi(this); QObject::connect(finishButton, SIGNAL(clicked()), this, SLOT(acceptCfg())); QObject::connect(addButton, SIGNAL(clicked()), this, SLOT(nextBoard())); QObject::connect(cfgBrowseButton, SIGNAL(clicked()), this, SLOT(browseFeConfig())); QObject::connect(fpgaBrowseButton, SIGNAL(clicked()), this, SLOT(browsefpgaFW())); QObject::connect(uCBrowseButton, SIGNAL(clicked()), this, SLOT(browseuCFW())); QObject::connect(FEcfgTypeBox, SIGNAL(activated(int)), this, SLOT(setCfgBrws(int))); InitUSB(); setCfgBrws(0); updateDevList(); // need $PIX_LIB to find base config files QString basePath = gSystem->Getenv("PIX_LIB"); if(basePath!=""){ QDir baseDir(basePath); for(int i=0;i<3;i++) baseDir.cdUp(); basePath = baseDir.path(); fpgaFwFile->setText(basePath+"/config/usbpix.bit"); uCFwFile->setText(basePath+"/config/usbpix.bix"); // browseFeConfig(basePath+"/config/std.cfg.root"); } feName->setText("SC1"); } MultiboardCfg::~MultiboardCfg(){ } void MultiboardCfg::updateDevList(){ boardComboBox->clear(); OnDeviceChange(); SiUSBDevice tmpDev(NULL); for (int i = 0; i < GetMaxNumberOfUSBBoards(); i++) { if (GetUSBDeviceIndexed(i) != 0){ tmpDev.SetDeviceHandle(GetUSBDeviceIndexed(i)); bool stillFree=true; for(std::vector::iterator it = m_cfgList.begin(); it!=m_cfgList.end(); it++){ if((*it).boardID==(int)tmpDev.GetId()){ stillFree = false; break; } } if(stillFree){ QString usblabel; usblabel = tmpDev.GetName(); usblabel += " - ID " + QString::number((int)tmpDev.GetId()) + " "; QVariant vid((int)tmpDev.GetId()); boardComboBox->addItem(usblabel , vid); } } } if(boardComboBox->count()==0) topLabel->setText("Can't find any USB board -> can't proceed"); finishButton->setEnabled(boardComboBox->count()>0); addButton->setEnabled(boardComboBox->count()>1); } void MultiboardCfg::acceptCfg(){ nextBoard(); accept(); } void MultiboardCfg::nextBoard(){ cfgInfo mycfg; mycfg.boardID = boardComboBox->itemData(boardComboBox->currentIndex()).toInt(); mycfg.newFeName = feName->text(); mycfg.fileName = ""; mycfg.modDecName = ""; mycfg.FEflavour = FEcfgTypeBox->currentItem(); if(FEcfgTypeBox->currentItem()==0){ mycfg.fileName=rootCfgFile->text(); mycfg.modDecName=rootFeCfgName->itemData(rootFeCfgName->currentIndex()).toString(); } m_cfgList.push_back(mycfg); uCFwFile->setEnabled(false); fpgaFwFile->setEnabled(false); fpgaBrowseButton->setEnabled(false); uCBrowseButton->setEnabled(false); rootFeCfgName->clear(); rootCfgFile->setText(""); // need $PIX_LIB to find base config files // no longer have std cfg. file, so will not work // QString basePath = gSystem->Getenv("PIX_LIB"); // if(basePath!=""){ // QDir baseDir(basePath); // for(int i=0;i<3;i++) baseDir.cdUp(); // basePath = baseDir.path(); // browseFeConfig(basePath+"/config/std.cfg.root"); // } QString indstr = "2nd"; if(m_cfgList.size()==2) indstr = "3rd"; if(m_cfgList.size()>2) indstr = QString::number(m_cfgList.size()+1)+"th"; topLabel->setText("Configuration for "+indstr+" USB board"); feName->setText("SC"+QString::number(m_cfgList.size()+1)); updateDevList(); } void MultiboardCfg::browseFeConfig(const char *path_in){ bool accepted=false; QString cfgName=""; if(path_in!=0){ cfgName = path_in; accepted = true; }else{ std::string defPath = "."; if(!m_engine.plPath().isEmpty()){ Config &opts = m_engine.getOptions(); defPath = ((ConfString&)opts["paths"]["defCfgPath"]).value(); } QString qpath = QString::null; if(defPath!=".") qpath = defPath.c_str(); QStringList cfgFilter; cfgFilter += "RootDB config file (*.cfg.root)"; cfgFilter += "Any file (*.*)"; QFileDialog CfgDia(this,"Specify name of RootDB cfg-file", qpath); CfgDia.setNameFilters(cfgFilter); CfgDia.setFileMode(QFileDialog::ExistingFile); if(CfgDia.exec() == QDialog::Accepted){ cfgName = CfgDia.selectedFile(); cfgName.replace("\\", "/"); accepted = true; } } if(accepted){ rootCfgFile->setText(cfgName); rootFeCfgName->clear(); PixConfDBInterface * confDBInterface = DBEdtEngine::openFile(cfgName.latin1(), false); DBInquire *root = confDBInterface->readRootRecord(1); for(recordIterator appIter = root->recordBegin();appIter!=root->recordEnd();appIter++){ if((int)(*appIter)->getName().find("application")!=(int)std::string::npos){ // loop over inquires in crate inquire and create a PixModuleGroup when an according entry is found for(recordIterator pmgIter = (*appIter)->recordBegin();pmgIter!=(*appIter)->recordEnd();pmgIter++){ if((*pmgIter)->getName().find("PixModuleGroup")!=std::string::npos){ for(recordIterator pmIter = (*pmgIter)->recordBegin();pmIter!=(*pmgIter)->recordEnd();pmIter++){ if((*pmIter)->getName().find("PixModule")!=std::string::npos){ std::string modName = (*pmIter)->getDecName(); QVariant vdn(QString(modName.c_str())); getDecNameCore(modName); rootFeCfgName->addItem(modName.c_str(), vdn); } } } } } } delete confDBInterface; //closes file } } void MultiboardCfg::browseuCFW(){ QString qpath = QString::null; if(uCFwFile->text()!="") qpath = uCFwFile->text(); QFileDialog fdia(this, "Specify name of uC firmware file", qpath,"uC firmware file (*.bix);;Any file (*.*)"); fdia.setFileMode(QFileDialog::ExistingFile); if(fdia.exec() == QDialog::Accepted){ qpath = fdia.selectedFiles().first(); qpath.replace("\\", "/"); uCFwFile->setText(qpath); } } void MultiboardCfg::browsefpgaFW(){ QString qpath = QString::null; if(fpgaFwFile->text()!="") qpath = fpgaFwFile->text(); QFileDialog fdia(this, "Specify name of FPGA firmware file", qpath,"FPGA firmware file (*.bit);;Any file (*.*)"); fdia.setFileMode(QFileDialog::ExistingFile); if(fdia.exec() == QDialog::Accepted){ qpath = fdia.selectedFiles().first(); qpath.replace("\\", "/"); fpgaFwFile->setText(qpath); } } void MultiboardCfg::setCfgBrws(int cfgType){ rootCfgFile->setEnabled(cfgType==0); cfgBrowseButton->setEnabled(cfgType==0); rootFeCfgName->setEnabled(cfgType==0); }