00001 #include "udpwidget.h"
00002
00003 #include <QFileDialog>
00004 #include <QTimer>
00005 #include <QApplication>
00006
00007 UdpWidget::UdpWidget(QWidget* parent, roc::UdpBoard* brd) :
00008 SubWidget(parent),
00009 fBoard(brd)
00010 {
00011 setupUi(this);
00012
00013
00014
00015
00016 QObject::connect(LowSpin, SIGNAL(valueChanged(int)), this, SLOT(setSubChangedOn()));
00017 QObject::connect(HighSpin, SIGNAL(valueChanged(int)), this, SLOT(setSubChangedOn()));
00018
00019 QObject::connect(UploadSwButton, SIGNAL(clicked()), this, SLOT(uploadSofwtare()));
00020 QObject::connect(UploadFw0Button, SIGNAL(clicked()), this, SLOT(uploadFirmware0()));
00021 QObject::connect(UploadFw1Button, SIGNAL(clicked()), this, SLOT(uploadFirmware1()));
00022 QObject::connect(UploadCfgButton, SIGNAL(clicked()), this, SLOT(uploadConfiguration()));
00023
00024 QTimer::singleShot(1000, this, SLOT(checkStatistic()));
00025
00026 UploadLbl->setText("Select file for upload");
00027 UploadProgress->setValue(0);
00028
00029 fUploadTime = 0;
00030 fUploadSpent = 0;
00031
00032 getSubConfig();
00033 }
00034
00035 void UdpWidget::setLimits()
00036 {
00037 int lowWater = LowSpin->value();
00038 int highWater = HighSpin->value();
00039 if (lowWater < highWater)
00040 fBoard->setRocLowHighWater(lowWater, highWater);
00041
00042 getLimits();
00043 }
00044
00045 void UdpWidget::getLimits()
00046 {
00047 int lowWater(0), highWater(0);
00048 fBoard->getRocLowHighWater(lowWater, highWater);
00049 LowSpin->setValue(lowWater);
00050 HighSpin->setValue(highWater);
00051 }
00052
00053 bool UdpWidget::getSubConfig()
00054 {
00055 getLimits();
00056
00057 takeStatistic();
00058
00059 return true;
00060 }
00061
00062 bool UdpWidget::setSubConfig()
00063 {
00064 setLimits();
00065
00066 return true;
00067 }
00068
00069 bool UdpWidget::fillCmdFile(FILE* f)
00070 {
00071 fprintf(f, "\n// UDP settings\n");
00072 int lowWater = LowSpin->value();
00073 int highWater = HighSpin->value();
00074 if (lowWater < highWater)
00075 fprintf(f, "setlhwater low=%d,high=%d\n", lowWater, highWater);
00076
00077 return true;
00078 }
00079
00080
00081 void UdpWidget::upload(int kind)
00082 {
00083 if (fUploadTime>0) return;
00084
00085 QFileDialog fd(this);
00086
00087 QStringList filters;
00088 switch(kind) {
00089 case 0:
00090 fd.setWindowTitle("Select powerPC software file");
00091 filters << "power-pc image (*.bin)";
00092 break;
00093 case 1:
00094 fd.setWindowTitle("Select FPGA firmware 0 file");
00095 filters << "fpga image (*.bit)";
00096 break;
00097 case 2:
00098 fd.setWindowTitle("Select FPGA firmware 1 file");
00099 filters << "fpga image (*.bit)";
00100 break;
00101 case 3:
00102 fd.setWindowTitle("Select powerPC configuration file");
00103 filters << "Configuration (*.cfg)";
00104 break;
00105 }
00106
00107 filters << "Any files (*)";
00108 fd.setFilters(filters);
00109
00110 fd.setFileMode(QFileDialog::ExistingFile);
00111
00112 if (fd.exec() != QDialog::Accepted) return;
00113
00114 QStringList flst = fd.selectedFiles();
00115 if (flst.isEmpty()) return;
00116
00117 int upload_tm(0);
00118 QString lbl;
00119
00120 switch (kind) {
00121 case 0:
00122 upload_tm = fBoard->uploadSDfile(flst[0].toAscii(), "image.bin");
00123 lbl = "Wait ~%1 s, uploading software ...";
00124 break;
00125 case 1:
00126 upload_tm = fBoard->uploadBitfile(flst[0].toAscii(), 0);
00127 lbl = "Wait ~%1 s, uploading firmware 0 ...";
00128 break;
00129 case 2:
00130 upload_tm = fBoard->uploadBitfile(flst[0].toAscii(), 1);
00131 lbl = "Wait ~%1 s, uploading firmware 1 ...";
00132 break;
00133 case 3:
00134 upload_tm = fBoard->uploadSDfile(flst[0].toAscii(), "ROC1.cfg");
00135 lbl = "Wait ~%1 s, uploading config ...";
00136 break;
00137 }
00138
00139 UploadProgress->setValue(0);
00140
00141 if (upload_tm<=0) {
00142 UploadLbl->setText("Uploading: failed");
00143 return;
00144 }
00145
00146 fUploadTime = upload_tm;
00147 if (fUploadTime>40) fUploadTime-=40;
00148
00149 UploadLbl->setText(QString(lbl).arg(fUploadTime));
00150
00151 fUploadSpent = 0;
00152
00153 QTimer::singleShot(1000, this, SLOT(uploading()));
00154 }
00155
00156 void UdpWidget::uploading()
00157 {
00158 if (fUploadTime<=0) return;
00159
00160 fUploadSpent++;
00161
00162 int value = 99;
00163 if (fUploadSpent<fUploadTime) value = 100*fUploadSpent/fUploadTime;
00164
00165 UploadProgress->setValue(value);
00166
00167 int res = fBoard->checkUpload();
00168
00169 if (res==1) {
00170 QTimer::singleShot(1000, this, SLOT(uploading()));
00171 return;
00172 }
00173
00174 if (res==2) {
00175 UploadLbl->setText("Uploading: done");
00176 UploadProgress->setValue(100);
00177 } else {
00178 UploadLbl->setText("Uploading: failed");
00179 UploadProgress->setValue(0);
00180 }
00181
00182 fUploadSpent = 0;
00183 fUploadTime = 0;
00184
00185 }
00186
00187
00188
00189 void UdpWidget::uploadSofwtare()
00190 {
00191 upload(0);
00192 }
00193
00194 void UdpWidget::uploadFirmware0()
00195 {
00196 upload(1);
00197 }
00198
00199 void UdpWidget::uploadFirmware1()
00200 {
00201 upload(2);
00202 }
00203
00204 void UdpWidget::uploadConfiguration()
00205 {
00206 upload(3);
00207 }
00208
00209 void UdpWidget::takeStatistic()
00210 {
00211 roc::BoardStatistic* stat = fBoard->takeStat(0.05);
00212
00213 if (stat==0) return;
00214
00215 const char* daqmode = "Off";
00216 if (stat->daqState==1) daqmode = "On"; else
00217 if (stat->daqState==2) daqmode = "Suspending";
00218
00219 StatLbl->setText(
00220 QString("Data rate \t %1 MB/s\n"
00221 "Send rate \t %2 MB/s\n"
00222 "Recv rate \t %3 MB/s\n"
00223 "NOP rate \t %4 1/s\n"
00224 "Frames rate \t %5 1/s\n"
00225 "Data taking \t %6 %\n"
00226 "Dispatching \t %7 %\n"
00227 "Sending \t %8 %\n"
00228 "Daq state \t %9 \n")
00229 .arg(stat->dataRate*1e-6, 5, 'f', 3)
00230 .arg(stat->sendRate*1e-6, 5, 'f', 3)
00231 .arg(stat->recvRate*1e-6, 5, 'f', 3)
00232 .arg(stat->nopRate)
00233 .arg(stat->frameRate)
00234 .arg(stat->takePerf*1e-3, 4, 'f', 1)
00235 .arg(stat->dispPerf*1e-3, 4, 'f', 1)
00236 .arg(stat->sendPerf*1e-3, 4, 'f', 1)
00237 .arg(daqmode)
00238 );
00239 }
00240
00241 void UdpWidget::checkStatistic()
00242 {
00243 if (EnableStatBox->checkState() == Qt::Checked) takeStatistic();
00244
00245 QTimer::singleShot(1000, this, SLOT(checkStatistic()));
00246 }