#include "RodEditor.h" #include "STControlEngine.h" #include "STRodCrate.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include RodEditor::RodEditor(STControlEngine &engine_in, STRodCrate *crate, QWidget* parent, const char* name, bool modal, Qt::WFlags fl) : QDialog(parent,name,modal,fl), m_engine(engine_in), m_crate(crate), m_cfg(*(new PixLib::Config("dummy"))){ // : RodEditorBase(parent,name,modal,fl), m_engine(engine_in), m_crate(crate), m_cfg(*(new PixLib::Config("dummy"))){ setupUi(this); QObject::connect(saveButton, SIGNAL(clicked()), this, SLOT(accept())); QObject::connect(closeButton, SIGNAL(clicked()), this, SLOT(reject())); QObject::connect(IPBrowse, SIGNAL(clicked()), this, SLOT(browseIPRAM())); QObject::connect(IDBrowse, SIGNAL(clicked()), this, SLOT(browseIDRAM())); QObject::connect(ExtBrowse, SIGNAL(clicked()), this, SLOT(browseEXT())); QObject::connect(existingRODs, SIGNAL(toggled(bool)), this, SLOT(listRODs(bool))); QObject::connect(fmtDefaultSetting, SIGNAL(activated(int)), this, SLOT(setFMTdefault(int))); // constructor for DB wizard mode m_boc = 0; m_bocOK=false; // fill array of fmt link boxes for easier access and set limits mapFmtBoxes(); for(int i=0;i<8;i++){ for(int j=0;j<4;j++){ fmtLinks[i][j]->setUmin(0); fmtLinks[i][j]->setUmax(0xf); } } listRODs(existingRODs->isChecked()); QString fname, path = gSystem->Getenv("ROD_DAQ"); if(!path.isEmpty()){ path += "/Dsp/Pixel/Binary/"; fname = path + "sdsp6713_ipram.bin"; IpramFile->setText(fname); fname = path + "sdsp6713_idram.bin"; IdramFile->setText(fname); fname = path + "sdsp6713_xcode.bin"; ExternFile->setText(fname); } setFMTdefault(1); // set FMT link mapping to optical by default return; } RodEditor::RodEditor(PixLib::Config &cfg, STControlEngine &engine_in, STRodCrate *crate, QWidget* parent, const char* name, bool modal, Qt::WFlags fl) : QDialog(parent,name,modal,fl), m_engine(engine_in), m_crate(crate), m_cfg(cfg){ // : RodEditorBase(parent,name,modal,fl), m_engine(engine_in), m_crate(crate), m_cfg(cfg){ setupUi(this); QObject::connect(saveButton, SIGNAL(clicked()), this, SLOT(accept())); QObject::connect(closeButton, SIGNAL(clicked()), this, SLOT(reject())); QObject::connect(IPBrowse, SIGNAL(clicked()), this, SLOT(browseIPRAM())); QObject::connect(IDBrowse, SIGNAL(clicked()), this, SLOT(browseIDRAM())); QObject::connect(ExtBrowse, SIGNAL(clicked()), this, SLOT(browseEXT())); QObject::connect(existingRODs, SIGNAL(toggled(bool)), this, SLOT(listRODs(bool))); QObject::connect(fmtDefaultSetting, SIGNAL(activated(int)), this, SLOT(setFMTdefault(int))); // constructor for editor mode m_boc = 0; m_bocOK=false; // fill array of fmt link boxes for easier access and set limits mapFmtBoxes(); for(int i=0;i<8;i++){ for(int j=0;j<4;j++){ fmtLinks[i][j]->setUmin(0); fmtLinks[i][j]->setUmax(0xf); } } listRODs(existingRODs->isChecked()); haveBOC->hide(); saveButton->setText("Save"); disconnect( saveButton, SIGNAL( clicked() ), this, SLOT( accept() ) ); connect( saveButton, SIGNAL( clicked() ), this, SLOT( saveCfg() ) ); loadCfg(); return; } RodEditor::~RodEditor(){ // must delete dummy config if we are in wizard mode if(m_cfg.name()=="dummy"){ delete &m_cfg; } } void RodEditor::listRODs(bool only_present){ RodSlotBox->clear(); std::vector rod_rev; if(only_present && m_crate!=0){ m_crate->listRODs(loaded_RODslots,rod_rev); for(unsigned int i=0; iinsertItem(label); } }else{ loaded_RODslots.clear(); for(unsigned int i=5; i<22;i++){ if(i!=13){ // don't show TIM slot QString label="ROD slot "+QString::number(i); loaded_RODslots.push_back(i); RodSlotBox->insertItem(label); } } } } void RodEditor::browseSlave(int type){ QStringList filter; filter += "Binary file (*.bin)"; filter += "Any file (*.*)"; QString path = QString::null; switch(type){ case 0: // IPRAM path = IpramFile->text(); break; case 1: // IDRAM path = IdramFile->text(); break; case 2: // EXT path = ExternFile->text(); break; default: break; } if(!path.isEmpty()){ int pos=0, i; while((i = path.find("/",pos+1))>=0) pos = i; if(pos>0) path.remove(pos,path.length()-pos); } Q3FileDialog fdia(path,QString::null,this,"select data file",TRUE); fdia.setFilters(filter); if(fdia.exec() == QDialog::Accepted){ switch(type){ case 0: // IPRAM IpramFile->setText(fdia.selectedFile()); break; case 1: // IDRAM IdramFile->setText(fdia.selectedFile()); break; case 2: // EXT ExternFile->setText(fdia.selectedFile()); break; default: break; } } } void RodEditor::setFMTdefault(int type){ if(type<=0 || type>2) return; // type==1 (default) int base, std_base = 0, ts_base = 8; // opt settings if(type==2){ // eBOC settings std_base = 2; ts_base = 2; } for(int nFMT=0;nFMT<8;nFMT++){ for(int iLink=0;iLink<4;iLink++){ base = std_base; if(nFMT==2 || nFMT==6) base = ts_base; fmtLinks[nFMT][iLink]->setUValue(iLink+base); } } fmtDefaultSetting->setCurrentItem(0); } void RodEditor::loadCfg(){ int Rslot = 5; if(m_cfg["general"].name()!="__TrashConfGroup__"){ if(m_cfg["general"]["Slot"].name()!="__TrashConfObj__"){ Rslot = ((ConfInt&)m_cfg["general"]["Slot"]).value(); for(unsigned int rID=0; rIDsetCurrentItem(rID); break; } } } if(m_cfg["general"]["IPRAMFile"].name()!="__TrashConfObj__") IpramFile->setText(((ConfString&)m_cfg["general"]["IPRAMFile"]).value().c_str()); if(m_cfg["general"]["IDRAMFile"].name()!="__TrashConfObj__") IdramFile->setText(((ConfString&)m_cfg["general"]["IDRAMFile"]).value().c_str()); if(m_cfg["general"]["EXTFile"].name()!="__TrashConfObj__") ExternFile->setText(((ConfString&)m_cfg["general"]["EXTFile"]).value().c_str()); } int roMode=-1; if(m_cfg["fmt"].name()!="__TrashConfGroup__"){ for(int fID=0;fID<8;fID++){ std::string subName; std::stringstream b; b << fID; subName = "linkMap_"; subName += b.str(); int linkMap; if(m_cfg["fmt"][subName].name()!="__TrashConfObj__"){ linkMap = ((ConfInt&)m_cfg["fmt"][subName]).getValue(); // read-out modes: 00 = 40Mbit/s, 01=80Mbit/s, 10=160Mbit/s int newMode = linkMap & 0x3; if(roMode==-1) roMode = newMode; else if(roMode!=newMode) roMode=3; // no uniform setting for formatters, keep what we've got for(int linkID=0;linkID<4;linkID++){ int linkNo = 0xf & (linkMap>>(16+4*linkID)); fmtLinks[fID][linkID]->setUValue(linkNo); } //printf("Formatter %d has mode %d (general: %d) and map 0x%x\n",fID, newMode, roMode, linkMap); } } } SetupBox->setEnabled(roMode>=0); if(roMode>=0) SetupBox->setCurrentItem(roMode); } void RodEditor::saveCfg(){ // write into config if(m_cfg["general"].name()!="__TrashConfGroup__"){ if(m_cfg["general"]["IPRAMFile"].name()!="__TrashConfObj__") ((ConfString&)m_cfg["general"]["IPRAMFile"]).m_value = IpramFile->text().latin1(); if(m_cfg["general"]["IDRAMFile"].name()!="__TrashConfObj__") ((ConfString&)m_cfg["general"]["IDRAMFile"]).m_value = IdramFile->text().latin1(); if(m_cfg["general"]["EXTFile"].name()!="__TrashConfObj__") ((ConfString&)m_cfg["general"]["EXTFile"]).m_value = ExternFile->text().latin1(); if(m_cfg["general"]["Slot"].name()!="__TrashConfObj__") PixLib::WriteIntConf((ConfInt&)m_cfg["general"]["Slot"], loaded_RODslots[RodSlotBox->currentItem()]); } if(m_cfg["fmt"].name()!="__TrashConfGroup__"){ for(int fID=0;fID<8;fID++){ std::string subName; std::stringstream b; b << fID; subName = "linkMap_"; subName += b.str(); int linkMap=0; int roMode = SetupBox->currentItem(); if(m_cfg["fmt"][subName].name()!="__TrashConfObj__"){ if(SetupBox->isEnabled() && roMode<3) linkMap = roMode; else linkMap = ((ConfInt&)m_cfg["fmt"][subName]).getValue() & 0x3; // maintain existing value for(int linkID=0;linkID<4;linkID++){ linkMap += ((int)fmtLinks[fID][linkID]->UValue())*(16<<(12+4*linkID)); } //printf("%d: %lx\n",fID,(unsigned int)linkMap); PixLib::WriteIntConf((ConfInt&)m_cfg["fmt"][subName], linkMap); } //printf("Link %d has mode %d, map 0x%x\n",fID, roMode, linkMap); } } // set Modus of Boc according to Modus of Rod if(m_boc != 0) { int clockControl, rodmode, mode, bocmode; RodPixController *ctrl=dynamic_cast(m_boc->getModGroup().getPixController()); Config &bocconf = *(m_boc->getConfig()); ConfInt out = dynamic_cast(bocconf["Clocks"]["ClockControl"]); clockControl = out.getValue(); rodmode = SetupBox->currentItem(); switch (rodmode) { case 0: mode=0; bocmode =0; clockControl=0x0; // does not matter for 40Mb/s, but set back for consistency break; case 1: mode=2; bocmode=3; clockControl=0x1; break; case 2: mode=4; bocmode=3; clockControl=0x1; break; default : mode=9; //preliminary set to transparent mode bocmode = 7; clockControl=0x0; break; }; ConfInt inmode = dynamic_cast(bocconf["General"]["Mode"]); inmode.setValue(mode); if(m_bocOK) { ctrl->setBocRegister("RxDataMode", bocmode); } ConfInt inclock = dynamic_cast(bocconf["Clocks"]["ClockControl"]); inclock.setValue(clockControl); if(m_bocOK) { ctrl->setBocRegister("ClockControl", clockControl); } } accept(); } void RodEditor::mapFmtBoxes(){ fmtLinks[0][0] = fmt0_link0; fmtLinks[0][1] = fmt0_link1; fmtLinks[0][2] = fmt0_link2; fmtLinks[0][3] = fmt0_link3; fmtLinks[1][0] = fmt1_link0; fmtLinks[1][1] = fmt1_link1; fmtLinks[1][2] = fmt1_link2; fmtLinks[1][3] = fmt1_link3; fmtLinks[2][0] = fmt2_link0; fmtLinks[2][1] = fmt2_link1; fmtLinks[2][2] = fmt2_link2; fmtLinks[2][3] = fmt2_link3; fmtLinks[3][0] = fmt3_link0; fmtLinks[3][1] = fmt3_link1; fmtLinks[3][2] = fmt3_link2; fmtLinks[3][3] = fmt3_link3; fmtLinks[4][0] = fmt4_link0; fmtLinks[4][1] = fmt4_link1; fmtLinks[4][2] = fmt4_link2; fmtLinks[4][3] = fmt4_link3; fmtLinks[5][0] = fmt5_link0; fmtLinks[5][1] = fmt5_link1; fmtLinks[5][2] = fmt5_link2; fmtLinks[5][3] = fmt5_link3; fmtLinks[6][0] = fmt6_link0; fmtLinks[6][1] = fmt6_link1; fmtLinks[6][2] = fmt6_link2; fmtLinks[6][3] = fmt6_link3; fmtLinks[7][0] = fmt7_link0; fmtLinks[7][1] = fmt7_link1; fmtLinks[7][2] = fmt7_link2; fmtLinks[7][3] = fmt7_link3; }