RSS Git Download  Clone
Raw Blame History
/*
* Title:	PupeDiagnosticsWin.cpp 
* Author:	M.Thomas BEAM Ltd
* Date:		2007-02-13
*
* Contents:	Status Display
*
* Mod Rec:
*
*/


#include <PupeDiagnosticsWin.h>
#include <qlayout.h>
#include <qvbox.h>
#include <qlabel.h>
#include <qtable.h>
#include <BError.h>
#include <TmsD.h>
#include <qvalidator.h>
#include <qmessagebox.h>
#include <BFile.h>
#include <BQComboBox.h>
#include <math.h>
#include <Globals.h>

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<BString>	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("<h5>") + title + "</h5><p>" + err.getString() + "</p>";
	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<float>	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;
        }
    }