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


#include <PupeSimulateWin.h>
#include <qlayout.h>
#include <qpushbutton.h>
#include <qvgroupbox.h>
#include <qmessagebox.h>
#include <qlabel.h>
#include <qfiledialog.h>
#include <qcheckbox.h>
#include <BFile.h>
#include <qgroupbox.h>
#include <qvbox.h>
#include <Globals.h>

PupeSimulateWin::PupeSimulateWin(QWidget* w,Control& c) : ocontrol(c)  {
	QGridLayout*	grid;
	QLabel*		channelLabel;
	QLabel*		dataFileLabel;
	QLabel*		contentsLabel;
	QButton*	fileSelectButton;
	QGroupBox*	internalTimings;
	QGroupBox*	cycleType;
	

	BString		s;
	int		row = 0;
	

  	this->setMaximumSize(QSize(600,650));
	
	grid = new QGridLayout(this,5,3);



        grid->setMargin(20);
        grid->setSpacing(20);

	s = "<p><b>Pupe Test Data<b></p>";
	s += "<p>Enter specifications for the test data of a Pupe channel</p>";

	contentsLabel = new QLabel(s.retStr(),this);
	ochannel = new QSpinBox(1,60,1,this,"");
	
	ochannel->setWrapping(true);
	channelLabel = new QLabel("Channel Number",this);

	dataFileLabel = new QLabel("Test Data file",this);
	osimulationRamFilename = new QLineEdit(this,"ramfilename");


	fileSelectButton = new QPushButton("Select",this,"");	
	
	oloadSimulationRam = new QPushButton("Load Test Data",this,"");
	oclearSimulationRam = new QPushButton("Clear Test Data",this,"");
	
	internalTimings = new QVGroupBox("Internal Timing Control",this);

	oiAdcClk = new QCheckBox("Use Internal Adc Clock",internalTimings,"");
	oiTiming = new QCheckBox("Use Internal Timings",internalTimings,"");
	oiCycleStop = new QCheckBox("Use Internal Timings for Cycle Stop",internalTimings,"");
	oiApply = new QPushButton("Apply",internalTimings,"");


	cycleType = new QVGroupBox("Cycle Type",this);
	ocycleType = new QLineEdit("",cycleType);
	oapplyCycleType = new QPushButton("Apply",cycleType);

	oInitialise = new QPushButton("Initialise FPGA",this);
	
	row = 0;
	grid->addWidget(contentsLabel,row,1);
	row++;
		
	grid->addWidget(channelLabel,row,0);
	grid->addWidget(ochannel,row,1);
	row++;

	grid->addWidget(dataFileLabel,row,0);
	grid->addWidget(osimulationRamFilename,row,1);	
	grid->addWidget(fileSelectButton,row,2);	

	row++;
	grid->addWidget(oloadSimulationRam,row,1); 	row++;
	grid->addWidget(oclearSimulationRam,row,1); 	row++;

	row++;
	grid->addWidget(internalTimings,row,1); 	row++;
	grid->addWidget(cycleType,row,1); 	row++;
	grid->addWidget(oInitialise,row,1); 	row++;

	connect(fileSelectButton,SIGNAL(clicked()),this,SLOT(selectFile()));
	connect(oloadSimulationRam,SIGNAL(clicked()),this,SLOT(loadRam()));
	connect(oclearSimulationRam,SIGNAL(clicked()),this,SLOT(clearRam()));
	connect(oInitialise,SIGNAL(clicked()),this,SLOT(initialiseFPGA()));
	connect(oiApply,SIGNAL(clicked()),this,SLOT(applyInternalTimings()));
	connect(oapplyCycleType,SIGNAL(clicked()),this,SLOT(applyCycleType()));
	
}
	
PupeSimulateWin::~PupeSimulateWin() {}



void PupeSimulateWin::selectFile() {
    QString s = QFileDialog::getOpenFileName(
                    "/usr/tms/data",
                    "Tms Channel Test Data File (*.psd)",
                    this,
                    "open file dialog",
                    "Choose a file" );
	osimulationRamFilename->setText(s);
}
	
void PupeSimulateWin::show() {
	BError	err;
	Tms::ConfigInfo	info;

	QWidget::show();
	if (err = ocontrol.getConfiguration(info)) {
		return;
	}
	ochannel->setMaxValue(info.puReferences.size());
}	

void PupeSimulateWin::loadRam() {
	BError			err;
	BFile			f;
	BString			fname;
	Tms::PuChannel		puChannel;
	BArray< UInt32 >   	 data;
	int			nb;
	
	fname = osimulationRamFilename->text().ascii();

	if(err = ocontrol.getPuChannel(ochannel->value(), puChannel)){
		warningDialog("Pupe Test Data - Loading",err);
		return;
	}
	if (err = f.open(fname,"r")) {
		warningDialog("Pupe Test Data - Loading",err);
		return;
	}
	data.resize(1024);
	if((nb = f.read(&data[0], 1024 * sizeof(UInt32))) <= 0){
		err.set(1, BString("Error: Reading 1024 32bit data items from file: ") + fname);
		warningDialog("Pupe Test Data",err);
		return;		
	}
	data.resize(nb / sizeof(UInt32));
	if (err = ocontrol.setTestData(puChannel,true,data)) {
		warningDialog("Pupe Test Data -  Loading",err);
		return;
	}
	gstatusbar->message("Ram Loaded",2000);
}

void PupeSimulateWin::initialiseFPGA() {
	BError	err;

	if (err = ocontrol.initialiseServer()) {
		warningDialog("Attempind tmsControl::init()",err);
		return;
	}
	gstatusbar->message("FPGA initialised",2000);
}

void PupeSimulateWin::applyInternalTimings() {
	BError	err;
	Tms::PuChannel		puChannel;
	Tms::PupeConfig		pupeConfig;


	pupeConfig.internalAdcClock = oiAdcClk->isChecked();
	pupeConfig.internalTiming =  oiTiming->isChecked();
	pupeConfig.internalCycleStop = oiCycleStop->isChecked();
	

	if(err = ocontrol.getPuChannel(ochannel->value(), puChannel)){
		warningDialog("Pupe Apply Timings - ",err);
		return;
	}

	if(err = ocontrol.setPupeConfig(puChannel, pupeConfig)){
		warningDialog("Pupe Apply Timings - ",err);
		return;
	}
	gstatusbar->message("Internal Timings Applied",2000);
}


void PupeSimulateWin::applyCycleType() {
		BError 	err;
		UInt32	cn;
		BString	ct;
		BString cycleType = ocycleType->text().ascii();	
	
	
		// Get current cycle info
		if(err = ocontrol.getCycleNumber(cn)){
			warningDialog("Setting Cycle Type - GetCycleInfo",err);
			return;
		}

		// Set NextCycle type
		if(err = ocontrol.setNextCycle(cn + 1, cycleType)){
			warningDialog("Setting Cycle Type - SetNextCycle",err);
			return;
		}
		gstatusbar->message("Next Cycle Type set",2000);
}



void	PupeSimulateWin::clearRam() {
	BError			err;
	Tms::PuChannel		puChannel;
	BArray< UInt32 >   	data;

	if(err = ocontrol.getPuChannel(ochannel->value(), puChannel)){
		warningDialog("Pupe Test Data - Clear",err);
		return;
	}
	if(err = ocontrol.setTestData(puChannel, 0, data)){
		warningDialog("Pupe Test Data- Clear",err);
		return;
	}
	gstatusbar->message("Ram Cleared",2000);
}

void	PupeSimulateWin::warningDialog(BString title, BError err){
	BString	m;
	
	m = BString("<h5>") + title + "</h5><p>" + err.getString() + "</p>";
	QMessageBox::warning(this, "Warning", m.retStr());
}