/* * Title: PupeDiagnosticsWin.cpp * Author: M.Thomas BEAM Ltd * Date: 2007-02-13 * * Contents: Status Display * * Mod Rec: * */ #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; using namespace Tms; #define BIT(v,b) ((v >> b) & 1) static ComboDefinition sourceDef[] = { { 0, "Source 0", 0, 1 }, { 1, "Source 1", 1, 0 }, { 2, "Source 2", 2, 0 }, { 3, "Source 3", 3, 0 }, { 0,0,0,0 } }; static ComboDefinition clockDef[] = { { 0, "ADC Clock", ClkAdcDiv_1, 1 }, { 1, "ADC Clock/2", ClkAdcDiv_2, 0 }, { 2, "ADC Clock/5", ClkAdcDiv_5, 0 }, { 3, "ADC Clock/10", ClkAdcDiv_10, 0 }, { 4, "ADC Clock/20", ClkAdcDiv_20, 0 }, { 5, "ADC Clock/50", ClkAdcDiv_50, 0 }, { 6, "ADC Clock/100", ClkAdcDiv_100, 0 }, { 7, "ADC Clock/200", ClkAdcDiv_200, 0 }, { 8, "ADC Clock/500", ClkAdcDiv_500, 0 }, { 9, "ADC Clock/1000", ClkAdcDiv_1000, 0 }, { 10, "ADC Clock/2000", ClkAdcDiv_2000, 0 }, { 11, "ADC Clock/5000", ClkAdcDiv_5000, 0 }, { 12, "ADC Clock/10000", ClkAdcDiv_10000, 0 }, { 13, "ADC Clock/20000", ClkAdcDiv_20000, 0 }, { 14, "ADC Clock/50000", ClkAdcDiv_50000, 0 }, { 15, "ADC Clock/100000", ClkAdcDiv_100000, 0 }, { 16, "Ms", ClkMs, 0 }, { 17, "FREF", ClkFref, 0 }, { 0,0,0,0 } }; Int32 getBitValue(UInt64 value, int startBit, int nBits, int s){ Int64 v; UInt64 bm = (1ULL << nBits) - 1; UInt64 sm = (1ULL << (nBits - 1)); v = (value >> startBit) & bm; if(s){ v = -(v & sm) | v; } return v; } PupeDiagnosticsWin::PupeDiagnosticsWin(QWidget* w,Control& c) : ocontrol(c) { QVBox* mv = new QVBox(this); oplots.append(oplotA = new BGraph(mv)); oplots.append(oplotB = new BGraph(mv)); oplots.append(oplotC = new BGraph(mv)); oplots.append(oplotD = new BGraph(mv)); oplots.append(oplotE = new BGraph(mv)); oplots.append(oplotF = new BGraph(mv)); oplots.append(oplotG = new BGraph(mv)); oplots.append(oplotH = new BGraph(mv)); oplots.append(oplotI = new BGraph(mv)); oplots.append(oplotJ = new BGraph(mv)); oplots.append(oplotK = new BGraph(mv)); oplots.append(oplotL = new BGraph(mv)); oplots.append(oplotM = new BGraph(mv)); oplots.append(oplotN = new BGraph(mv)); oplots.append(oplotO = new BGraph(mv)); ographControls = new BGraphControlBasic(mv); QValidator* validator = new QIntValidator(0, (int)pow(2,31), this ); QRegExpValidator* validatorHex = new QRegExpValidator(this); QRegExp rx; QWidget* t = new QWidget(mv); QGridLayout* v = new QGridLayout(t); int row = 0; int col = 0; BList colours; rx.setPattern("0x[0-9,a-f][0-9,a-f]"); validatorHex->setRegExp(rx); QHBox* h = new QHBox(mv); QPushButton* refreshButton = new QPushButton("Refresh Data",h,"refreshButton"); QPushButton* saveButton = new QPushButton("Save To File",h,"saveButton"); okst = new QCheckBox(t,""); ochannel = new QSpinBox(1,60,1,t,""); osource = new BQComboBox(sourceDef,t,""); oclock = new BQComboBox(clockDef,t,""); ostartTime = new QLineEdit(t,"");ostartTime->setValidator(validator); ostartTime->setText("0"); opostTriggerDelay = new QLineEdit(t,"");opostTriggerDelay->setValidator(validator); opostTriggerDelay->setText("0"); otriggerMask = new QLineEdit(t,"");otriggerMask->setValidator(validatorHex); otriggerMask->setText("0x20"); otriggerSourceData = new QCheckBox(t,""); otriggerAnd = new QCheckBox(t,""); otriggerStore = new QCheckBox(t,""); ochannel->setWrapping(true); h->setMargin(4); refreshButton->setMaximumWidth(200); saveButton->setMaximumWidth(200); int width = 200; ochannel->setMaximumWidth(width); osource->setMaximumWidth(width); oclock->setMaximumWidth(width); ostartTime->setMaximumWidth(width); opostTriggerDelay->setMaximumWidth(width); otriggerMask->setMaximumWidth(width); otriggerAnd->setMaximumWidth(width); otriggerStore->setMaximumWidth(width); otriggerSourceData->setMaximumWidth(width); col = 0;row = 0; v->addWidget(new QLabel("Channel",t,""),row,col); v->addWidget(ochannel,row,col+1); row++; v->addWidget(new QLabel("Source",t,""),row,col); v->addWidget(osource,row,col+1); row++; v->addWidget(new QLabel("Clock",t,""),row,col); v->addWidget(oclock,row,col+1); row++; v->addWidget(new QLabel("StartTime",t,""),row,col); v->addWidget(ostartTime,row,col+1); row++; v->addWidget(new QLabel("Post Trigger Delay",t,""),row,col); v->addWidget(opostTriggerDelay,row,col+1); row++; col = 2;row = 0; v->addWidget(new QLabel("Trigger Src Data",t,""),row,col); v->addWidget(otriggerSourceData,row,col+1); row++; v->addWidget(new QLabel("Trigger And",t,""),row,col); v->addWidget(otriggerAnd,row,col+1); row++; v->addWidget(new QLabel("Trigger Store",t,""),row,col); v->addWidget(otriggerStore,row,col+1); row++; v->addWidget(new QLabel("Trigger Mask Data Hex (eg 0x3c)",t,""),row,col); v->addWidget(otriggerMask ,row,col+1); row++; v->addWidget(new QLabel("Save Format Kst",t,""),row,col); v->addWidget(okst ,row,col+1); row++; v->setSpacing(5); connect(refreshButton,SIGNAL(clicked()),this,SLOT(refresh())); connect(saveButton,SIGNAL(clicked()),this,SLOT(saveFile())); BIter i; for (oplots.start(i);! oplots.isEnd(i);oplots.next(i)) { ographControls->addGraph(oplots[i]); oplots[i]->setGrid(16,0); oplots[i]->installEventFilter(this); } } PupeDiagnosticsWin::~PupeDiagnosticsWin() {} void PupeDiagnosticsWin::show() { QWidget::show(); } void PupeDiagnosticsWin::refresh() { BError err; Tms::TestCaptureInfo captureInfo; Tms::PuChannel puPhysChannel; // Build request if (err = ocontrol.getPuChannel (ochannel->value(),puPhysChannel)) { warningDialog("Reading Test Data",err); return; } captureInfo.source = (int)osource->getValue(); captureInfo.clock = (int)oclock->getValue(); captureInfo.startTime = ostartTime->text().toUInt(); captureInfo.postTriggerDelay = opostTriggerDelay->text().toUInt(); captureInfo.triggerSourceData = otriggerSourceData->isChecked(); captureInfo.triggerAnd = otriggerAnd->isChecked(); captureInfo.triggerStore = otriggerStore->isChecked(); sscanf(otriggerMask->text().ascii(),"%i",&captureInfo.triggerMask); if (err = ocontrol.getTestData(puPhysChannel,captureInfo,odata)) { warningDialog("Reading Test Data",err); return; } setPlotData(); } void PupeDiagnosticsWin::setPlotData() { BIter i; // Bit Pattern Source 0 int source = (int)osource->getValue(); int invert = 1; int height = 620; for (oplots.start(i);! oplots.isEnd(i);oplots.next(i)) { oplots[i]->setXLabel(""); } if (source == 0) { if (! otriggerStore->isChecked()) { setGraphHeights(height,15); addBitFieldDataToGraph(oplotA,"fref",63, 1, 0); // FREF addBitFieldDataToGraph(oplotB,"PllMsb",62, 1, 0,invert); // PllMsb (FRef Reference) addBitFieldDataToGraph(oplotC,"PhaseTableMsb",61, 1, 0,invert); // PhaseTableMsb (Local FREF) addBitFieldDataToGraph(oplotD,"lo1",60, 1, 0); // LO1 addBitFieldDataToGraph(oplotE,"sigma",32, 12, 1); // Sigma addBitFieldDataToGraph(oplotF,"lo2",56, 1, 0); // LO2 addBitFieldDataToGraph(oplotG,"gate",49, 1, 0); // Gate addBitFieldDataToGraph(oplotH,"blr",48, 1, 0); // Blr addBitFieldDataToGraph(oplotI,"mean1",50, 1, 0); // Mean1 addBitFieldDataToGraph(oplotJ,"mean2",51, 1, 0); // Mean2 addBitFieldDataToGraph(oplotK,"rfSelect1",52, 1, 0); // RfSelect1 addBitFieldDataToGraph(oplotL,"rfSelect2",53, 1, 0); // RfSelect2 addBitFieldDataToGraph(oplotM,"selFilter",54, 1, 0); // SelFilter addBitFieldDataToGraph(oplotN,"SwitchState",44,4, 0); //SwitchState // Sigma addBitFieldDataToGraph(oplotO,"dds_freq",0, 32, 1); // DDS_FREQ oplotO->setXLabel("Sample"); } else { setGraphHeights(height,8); addBitFieldDataToGraph(oplotA,"FREF", 7, 1, 0); addBitFieldDataToGraph(oplotB,"HCHANGE", 6, 1, 0); addBitFieldDataToGraph(oplotC,"INJECTION", 5, 1, 0); addBitFieldDataToGraph(oplotD,"CAL_STOP", 4, 1, 0); addBitFieldDataToGraph(oplotE,"CAL_START", 3, 1, 0); addBitFieldDataToGraph(oplotF,"CYCLE_STOP", 2, 1, 0); addBitFieldDataToGraph(oplotG,"CYCLE_START", 1, 1, 0); addBitFieldDataToGraph(oplotH,"10MHz", 0, 1, 0); oplotH->setXLabel("Sample"); } } else if (source == 1) { setGraphHeights(height,9); addBitFieldDataToGraph(oplotA,"FREF", 63, 1, 0); // FREF addBitFieldDataToGraph(oplotB,"PllMsb", 62, 1, 0,invert); // PllMsb addBitFieldDataToGraph(oplotC,"PhaseTableMsb", 61, 1, 0,invert); // PhaseTableMSB addBitFieldDataToGraph(oplotD,"LO_pulse1", 60, 1, 0); // LO_pulse1 addBitFieldDataToGraph(oplotE,"sigma", 57, 3, 1), // Sigma addBitFieldDataToGraph(oplotF,"LO_pulse2", 56, 1, 0); // LO_pulse2 addBitFieldDataToGraph(oplotG,"mult_out1", 38,14, 1); // mult_out1 addBitFieldDataToGraph(oplotH,"mult_out2", 24, 14, 1); // mult_out2 addBitFieldDataToGraph(oplotI,"f_error", 0, 24, 1); // f_error oplotI->setXLabel("Sample"); } else if (source == 2) { setGraphHeights(height,9); addBitFieldDataToGraph(oplotA,"FREF",63, 1, 0); addBitFieldDataToGraph(oplotB,"PllMsb",62, 1, 0,invert); addBitFieldDataToGraph(oplotC,"PhaseTableMsb",61, 1, 0,invert); addBitFieldDataToGraph(oplotD,"LO1",60, 1, 0); addBitFieldDataToGraph(oplotE,"sigma",57, 3, 1); addBitFieldDataToGraph(oplotF,"LO2",56, 1, 0); addBitFieldDataToGraph(oplotG,"Gate",55, 1, 0); addBitFieldDataToGraph(oplotH,"B0",32,23, 1); addBitFieldDataToGraph(oplotI,"Result0",0,32, 1); oplotI->setXLabel("Sample"); } else if (source == 3) { setGraphHeights(height,6); addBitFieldDataToGraph(oplotA,"Sigma", 48,14, 1); addBitFieldDataToGraph(oplotB,"Gate", 62, 1, 0); addBitFieldDataToGraph(oplotC,"BLR", 63, 1, 0); addBitFieldDataToGraph(oplotD,"X0", 0,16, 1); addBitFieldDataToGraph(oplotE,"E0", 16,16, 1), addBitFieldDataToGraph(oplotF,"Y0", 32,16, 1); oplotF->setXLabel("Sample"); } else { BError err; err.set(1,"Unsupported source type"); warningDialog("Viewing Pupe Diagnostics",err); } ographControls->setMax(odata.size()); } void PupeDiagnosticsWin::setGraphHeights(int max,int num) { BIter i; int ledgend = 30; int height = (max - ledgend)/num; int n = 1; for (oplots.start(i);! oplots.isEnd(i);oplots.next(i)) { oplots[i]->show(); if (n < num) { oplots[i]->setMaximumHeight(height); oplots[i]->setMinimumHeight(height); } else if ( n == num) { oplots[i]->setMinimumHeight(height + ledgend); } else { oplots[i]->hide(); oplots[i]->setMinimumHeight(height); } n++; } } void PupeDiagnosticsWin::saveFile() { BError err; unsigned int n; BString fname; BFile file; fname.printf("pupeSource%d.txt",(int)osource->getValue()); if (file.open(fname,"w+")) { warningDialog("PupeDiagnostics",BString("Cannot open save file (") + fname + ")"); return; } if (osource->getValue() == 0) { if (okst->isChecked()) file.printf("FrefIn PllMsb PhaseTableMsb Lo1 Sigma Lo2 Gate Blr Mean1 Mean2 RfSelect1 RfSelect2 SelFilter SwitchState DdsFreq\n"); for (n = 0;n < odata.size();n++) { file.printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n", getBitValue(odata[n], 63, 1, 0), // FREF !getBitValue(odata[n], 62, 1, 0), // PllMsb (FRef Reference) !getBitValue(odata[n], 61, 1, 0), // PhaseTableMsb (Local FREF) getBitValue(odata[n], 60, 1, 0), // LO1 getBitValue(odata[n], 32, 12, 1), // Sigma (12 bits) getBitValue(odata[n], 56, 1, 0), // LO2 getBitValue(odata[n], 49, 1, 0), // Gate getBitValue(odata[n], 48, 1, 0), // Blr getBitValue(odata[n], 50, 1, 0), // Mean1 getBitValue(odata[n], 51, 1, 0), // Mean2 getBitValue(odata[n], 52, 1, 0), // RfSelect1 getBitValue(odata[n], 53, 1, 0), // RfSelect2 getBitValue(odata[n], 54, 1, 0), // SelFilter getBitValue(odata[n], 44, 4, 0), // SwitchState getBitValue(odata[n], 0, 32, 1) // DDS_FREQ ); } } else if (osource->getValue() == 1) { if (okst->isChecked()) file.printf("FrefIn PllMsb PhaseTableMsb Lo1 Sigma Lo2 MultOut1 MultOut2 F_Error\n"); for(n = 0; n < odata.size(); n++){ file.printf("%d %d %d %d %d %d %d %d %d\n", getBitValue(odata[n], 63, 1, 0), // FREF !getBitValue(odata[n], 62, 1, 0), // PllMsb (FRef Reference) !getBitValue(odata[n], 61, 1, 0), // PhaseTableMsb (Local FREF) getBitValue(odata[n], 60, 1, 0), // LO1 getBitValue(odata[n], 57, 3, 1), // Sigma (3 bits) getBitValue(odata[n], 56, 1, 0), // LO2 getBitValue(odata[n], 38, 14, 1), // mult_out1 getBitValue(odata[n], 24, 14, 1), // mult_out2 getBitValue(odata[n], 0, 24, 1) // f_error ); } } else if (osource->getValue() == 2) { if (okst->isChecked()) file.printf("FrefIn PllMsb PhaseTableMsb Lo1 Sigma Lo2 Gate B0 Result0\n"); for(n = 0; n < odata.size(); n++){ file.printf("%d %d %d %d %d %d %d %d %d\n", getBitValue(odata[n], 63, 1, 0), // FREF !getBitValue(odata[n], 62, 1, 0), // PllMsb (FRef Reference) !getBitValue(odata[n], 61, 1, 0), // PhaseTableMsb (Local FREF) getBitValue(odata[n], 60, 1, 0), // LO1 getBitValue(odata[n], 57, 3, 1), // Sigma (3 bits) getBitValue(odata[n], 56, 1, 0), // LO2 getBitValue(odata[n], 55, 1, 0), // Gate getBitValue(odata[n], 32, 23, 1), // B0 getBitValue(odata[n], 0, 32, 1) // Result0 ); } } else if (osource->getValue() == 3) { if (okst->isChecked()) file.printf("Sigma Gate Blr X0 E0 Y0\n"); for(n = 0; n < odata.size(); n++){ file.printf("%d %d %d %d %d %d %d\n", getBitValue(odata[n], 48, 14, 1), // Sigma getBitValue(odata[n], 62, 1, 0), // Gate getBitValue(odata[n], 63, 1, 0), // Blr getBitValue(odata[n], 0, 16, 1), // X0 getBitValue(odata[n], 16, 16, 1), // E0 getBitValue(odata[n], 32, 16, 1) // Y0 ); } } else { err.set(1,"Unknown pupe source type"); warningDialog("Attempting file Save",err); } file.close(); BString msg; msg = BString("File Saved (") + fname + ")"; gstatusbar->message(msg.retStr(),2000); } void PupeDiagnosticsWin::warningDialog(BString title, BError err){ BString m; QMessageBox b; m = BString("
") + title + "

" + err.getString() + "

"; b.setMinimumWidth(300); b.setCaption("tmsControlGui - Warning"); b.setIcon(QMessageBox::Warning); b.setText(m.retStr()); b.exec(); } // Utility routines void PupeDiagnosticsWin::addBitFieldDataToGraph(BGraph* g,BString title,int startBit, int nBits, int s,int invert) { BArray data; unsigned int n; float f; data.resize(odata.size()); for(n = 0; n < odata.size(); n++){ f = getBitValue(odata[n], startBit, nBits, s); if (invert) data[n] = ! f; else data[n] = f; } g->setData(data); g->setYLabel(title); } bool PupeDiagnosticsWin::eventFilter( QObject *o, QEvent *e ) { if ( e->type() == QEvent::Wheel ) { QWheelEvent* we = (QWheelEvent*)e; int delta = (we->delta() > 0) ? -1 : 1; ographControls->scroll(delta); return TRUE; } else { // standard event processing return FALSE; } }