#include "xlruconnectiondialog.h" #include "ui_xlruconnectiondialog.h" #include #include #include #include #include #include #include #include #include #include #include #include static const char* fpga_names[]={"0x13","0x73","0x14","0x74","0x15","0x75","0x16","0x76", "0x53", "0x56", "0x33"}; class XLruConnectionDialog::Implementation { public: QList comms; QVector cbList; QString settingsFileName; bool privateSubnet; QString preferedNetwork; QHostInfo hostInfo; QVector fpga; QStringList fpga_list; QString fpga_address; int ip_last; Implementation(): privateSubnet(false) { } QString probeNetworks(const QString& prefered_net, QComboBox* cb) { unsigned int prefered_index=0; privateSubnet=false; if (!prefered_net.isEmpty()) preferedNetwork=prefered_net; QHostInfo hi=QHostInfo::fromName(QHostInfo::localHostName()); //ui->groupBox->setTitle(QString("Host: %1").arg(hi.hostName())); QList hal=QNetworkInterface::allInterfaces(); if (hal.isEmpty()) { qDebug()<<"Network Config: NO HOST ADDRESSES"; cb->addItem(""); cb->setEnabled(false); } else { foreach(QNetworkInterface nif, hal) { //QList nhal=nif.allAddresses(); QList nhal=nif.addressEntries(); foreach(QNetworkAddressEntry aentry, nhal) { bool private_subnet=false; QHostAddress a=aentry.ip(); if (!(a.toString().startsWith("192.168") || a.toString().startsWith("169.254") || a.toString().startsWith("127."))) continue; cb->addItem(QString("%1 (%2) [%3]").arg(nif.humanReadableName()).arg(a.toString()).arg(nif.index()), a.toString()); int currentIndex=cb->count()-1; //if (a.toString().startsWith("192.168.0") ||a.toString().startsWith("192.168.2")) if (a.toString().startsWith(preferedNetwork)) { prefered_index=currentIndex; private_subnet=true; privateSubnet=privateSubnet; } cb->setItemData(currentIndex, private_subnet, Qt::UserRole+1); cb->setItemData(currentIndex, nif.index(), Qt::UserRole+2); //ui->comboBoxInterface->seIif (nif.flags() & QNetworkInterface::IsUp) } } if (prefered_index) cb->setCurrentIndex(prefered_index); } hostInfo=hi; return hi.hostName(); } }; #define FPGA_DEFAULT_IP 111 XLruConnectionDialog::XLruConnectionDialog(QWidget *parent) : QDialog(parent), ui(new Ui::XLruConnectionDialog), p_(*new Implementation) { ui->setupUi(this); m_psmSpeed=0; m_ppsSpeed=0; m_lcuSpeed=0; m_masterSpeed=0; QStyle* st=QApplication::style(); ui->tbRefresh->setIcon(st->standardIcon(QStyle::SP_BrowserReload)); ui->tbSave->setIcon(st->standardIcon(QStyle::SP_DialogSaveButton)); p_.cbList.append(ui->psmPort); p_.cbList.append(ui->ppsPort); p_.cbList.append(ui->lcuPort); p_.cbList.append(ui->psmBridge); p_.cbList.append(ui->ppsBridge); p_.cbList.append(ui->lcuBridge); p_.settingsFileName="./xlru_mon.ini"; ui->buttonBox->button(QDialogButtonBox::Ok)->setDisabled(true); refreshPorts(); QString preferedNet=QString("127.0.0.1"); { QSettings s(p_.settingsFileName, QSettings::IniFormat); s.beginGroup("XLruMonitor"); for(int i=metaObject()->propertyOffset(); imetaObject()->propertyCount(); ++i) { if (metaObject()->property(i).isStored(this)) { this->setProperty(metaObject()->property(i).name(), s.value(metaObject()->property(i).name())); //s.setValue(metaObject()->property(i).name(), this->property(metaObject()->property(i).name())); //qDebug()<property(i).name()<property(metaObject()->property(i).name()); } } foreach(QComboBox* cb, p_.cbList) { QString p=s.value(cb->objectName()).toString(); qDebug()<<"S:"<objectName()<findData(p); if (i>=0) { cb->setCurrentIndex(i); } this->setProperty(cb->objectName().toLatin1(), cb->itemData(i).toString()); connect(cb, QOverload::of(&QComboBox::currentIndexChanged), this, [this](int index) { QComboBox* c=qobject_cast(sender()); this->setProperty(c->objectName().toLatin1(), c->itemData(index).toString()); validateConfig(); }); } QString tmp=s.value("network").toString(); if (tmp.startsWith('@')) { preferedNet=tmp.remove('@'); } s.endGroup(); ui->masterSpeed->setCheckState(static_cast(m_masterSpeed)); ui->psmSpeed->setCheckState(static_cast(m_psmSpeed)); ui->ppsSpeed->setCheckState(static_cast(m_ppsSpeed)); ui->lcuSpeed->setCheckState(static_cast(m_lcuSpeed)); s.beginGroup("FPGA"); p_.ip_last=s.value("server_ip3", FPGA_DEFAULT_IP).toInt(); #if 0 QString tmp=s.value("fpga_address").toString(); if (!tmp.isEmpty()) p_.fpga_address=tmp; #endif tmp=s.value("fpga_list").toString(); if (!tmp.isEmpty()) { p_.fpga_list=tmp.split(QChar(';')); } s.endGroup(); } // static const char* fpga_names[]={"0x13","0x73","0x14","0x74","0x15","0x75","0x16","0x76", "0x53", "0x56", "0x33"}; qDebug()<<"FPGA"<setChecked(true); } ui->repLayout->addWidget(cb, i>>2, i & 0x3); p_.fpga.append(cb); } ui->sbFpgaServerIp->setValue(p_.ip_last); p_.probeNetworks(preferedNet, ui->cbNetwork); validateConfig(); } XLruConnectionDialog::~XLruConnectionDialog() { delete &p_; delete ui; } XLruConnectionInfo XLruConnectionDialog::connectionInfo() const { static XLruConnectionInfo info; info.psm.unitName="PSM"; info.psm.serialPort=ui->psmPort->currentData().toString(); info.psm.bridgePort=ui->psmBridge->currentData().toString(); info.psm.speed=ui->psmSpeed->checkState(); info.psm.enabled=ui->psmActive->isChecked(); info.psm.device = PSM_ID; info.pps.unitName="PPS"; info.pps.serialPort=ui->ppsPort->currentData().toString(); info.pps.bridgePort=ui->ppsBridge->currentData().toString(); info.pps.speed=ui->ppsSpeed->checkState(); info.pps.enabled=ui->ppsActive->isChecked(); info.pps.device = PPS_ID; info.lcu.unitName="LCU"; info.lcu.serialPort=ui->lcuPort->currentData().toString(); info.lcu.bridgePort=ui->lcuBridge->currentData().toString(); info.lcu.speed=ui->lcuSpeed->checkState(); info.lcu.enabled=ui->lcuActive->isChecked(); info.lcu.device = LCU_ID; info.masterFast=ui->masterSpeed->isChecked(); info.network=ui->cbNetwork->itemData(ui->cbNetwork->currentIndex()).toString(); info.udpPort=ui->sbUdpPort->value(); info.fpagServer=ui->sbFpgaServerIp->value(); for(int i=0; iisChecked()) info.fpgaList.append(p_.fpga[i]->text()); } return info; } void XLruConnectionDialog::refreshPorts() { p_.comms=QSerialPortInfo::availablePorts(); QVector savePort; for(int i=0; icurrentData().toString()); cb->clear(); cb->addItem("", ""); if (i>=3) cb->addItem("UDP", "UDP"); } foreach(QSerialPortInfo i, p_.comms) { QString name=i.portName()+": "+i.description(); bool busy=i.isBusy() || i.isNull(); if (busy) { name="(busy) "+name; } foreach(QComboBox* cb, p_.cbList) { cb->addItem(name, busy ? QString() : i.portName()); } } for(int i=0; ifindData(oldSelection); if (hit>=0) cb->setCurrentIndex(hit); } } void XLruConnectionDialog::on_tbRefresh_clicked() { refreshPorts(); } void XLruConnectionDialog::on_tbSave_clicked() { setProperty("psmSpeed", ui->psmSpeed->checkState()); setProperty("ppsSpeed", ui->ppsSpeed->checkState()); setProperty("lcuSpeed", ui->lcuSpeed->checkState()); setProperty("masterSpeed", ui->masterSpeed->checkState()); QSettings s(p_.settingsFileName, QSettings::IniFormat); s.beginGroup("XLruMonitor"); for(int i=metaObject()->propertyOffset(); imetaObject()->propertyCount(); ++i) { if (metaObject()->property(i).isStored(this)) { s.setValue(metaObject()->property(i).name(), this->property(metaObject()->property(i).name())); qDebug()<property(i).name()<property(metaObject()->property(i).name()); } } s.setValue("network", QString("@%1").arg(ui->cbNetwork->itemData(ui->cbNetwork->currentIndex()).toString())); s.endGroup(); s.beginGroup("FPGA"); s.setValue("server_ip3", ui->sbFpgaServerIp->value()); QString listFPGA; p_.ip_last=s.value("server_ip3", FPGA_DEFAULT_IP).toInt(); for(unsigned int i=0; i<(sizeof(fpga_names)/sizeof(fpga_names[0])); ++i) { QCheckBox* cb=p_.fpga.at(i); if (cb->checkState()) { listFPGA.append(fpga_names[i]); listFPGA.append(";"); } } s.setValue("fpga_list", listFPGA); s.endGroup(); } void XLruConnectionDialog::validateConfig() { bool conflict=false; for(int i=0; i<3; ++i) { QComboBox* cb=p_.cbList.at(i); QString s=cb->currentData().toString(); if (s.isEmpty()) continue; //if (cb->currentText().startsWith("(busy")) if (cb->currentData().toString().isNull()) { qDebug()<<"BUSY selected"; conflict=true; break; } for(int j=3; j<6; ++j) { QComboBox* cb2=p_.cbList.at(j); QString s2=cb2->currentData().toString(); if (s==s2) { conflict=true; qDebug()<<"Bridge loop:"<currentText().startsWith("(busy")) { qDebug()<<"BUSY selected"; conflict=true; conflict=true; break; } } } ui->buttonBox->button(QDialogButtonBox::Ok)->setDisabled(conflict); }