RSS Git Download  Clone
Raw Blame History
/*
* Title:	ControlDataWin.cpp 
* Author:	M.Thomas BEAM Ltd
* Date:		2007-02-13
*
* Contents:	Control of data requests. Test code. 
*
* Mod Rec:
*
*/


#include <ControlDataWin.h>
#include <BFile.h>
#include <TmsD.h>
#include <qvalidator.h>
#include <qmessagebox.h>
#include <qlayout.h>
#include <Debug.h>
#include <BGraph.h>
#include <BGraphControls.h>
#include <math.h>
#include <Globals.h>
#include <qfiledialog.h>
#include <qevent.h>


using namespace Tms;
using namespace std;

static ComboDefinition cycleDef[] = {
	{ 0,	"CyclePeriodAll",		CyclePeriodAll,	0 },
	{ 1,	"CyclePeriodCalibration",	CyclePeriodCalibration,	0 },
 	{ 2,	"CyclePeriodEvent0",		CyclePeriodEvent0,	1 },
	{ 3,	"CyclePeriodEvent1",		CyclePeriodEvent1,	0 },
	{ 4,	"CyclePeriodEvent2",		CyclePeriodEvent2,	0 },
	{ 5,	"CyclePeriodEvent3",		CyclePeriodEvent3,	0 },
	{ 6,	"CyclePeriodEvent4",		CyclePeriodEvent4,	0 },
	{ 7,	"CyclePeriodEvent5",		CyclePeriodEvent5,	0 },
	{ 8,	"CyclePeriodEvent6",		CyclePeriodEvent6,	0 },
	{ 9,	"CyclePeriodEvent7",		CyclePeriodEvent7,	0 },
	{ 10,	"CyclePeriodEvent8",		CyclePeriodEvent8,	0 },
	{ 11,	"CyclePeriodEvent9",		CyclePeriodEvent9,	0 },
	{ 0,0,0,0 }
};

static ComboDefinition functionDef[] = {
	{ 0,	"DataFunctionRaw",		DataFunctionRaw,	1 },
	{ 1,	"DataFunctionMean",		DataFunctionMean,	0 },
	{ 2,	"DataFunctionMeanAll",		DataFunctionMeanAll,	0 },
	{ 3,	"DataFunctionMean0",		DataFunctionMean0,	0 },
 	{ 4,	"DataFunctionMean1",		DataFunctionMean1,	0 },
	{ 0,0,0,0 }
};

static ComboDefinition bunchDef[] = {
	{ 0,	"All Bunches",	0,	1 },
	{ 1,	"Bunch 1",	1,	0 },
 	{ 2,	"Bunch 2",	2,	0 },
 	{ 3,	"Bunch 3",	3,	0 },
	{ 4,	"Bunch 4",	4,	0 },
 	{ 5,	"Bunch 5",	5,	0 },
 	{ 6,	"Bunch 6",	6,	0 },
 	{ 7,	"Bunch 7",	7,	0 },
 	{ 8,	"Bunch 8",	8,	0 },
 	{ 9,	"Bunch 9",	9,	0 },
 	{ 10,	"Bunch 10",	10,	0 },
 	{ 11,	"Bunch 11",	11,	0 },
 	{ 12,	"Bunch 12",	12,	0 },
 	{ 13,	"Bunch 13",	13,	0 },
 	{ 14,	"Bunch 14",	14,	0 },
 	{ 15,	"Bunch 15",	15,	0 },
 	{ 16,	"Bunch 16",	16,	0 },
 	{ 17,	"Bunch 17",	17,	0 },
 	{ 18,	"Bunch 18",	18,	0 },
 	{ 19,	"Bunch 19",	19,	0 },
 	{ 20,	"Bunch 20",	20,	0 },
 	{ 21,	"Bunch 21",	21,	0 },
 	{ 22,	"Bunch 22",	22,	0 },
 	{ 23,	"Bunch 23",	23,	0 },
 	{ 24,	"Bunch 24",	24,	0 },
 	{ 25,	"Bunch 25",	25,	0 },
 	{ 26,	"Bunch 26",	26,	0 },
 	{ 27,	"Bunch 27",	27,	0 },
 	{ 28,	"Bunch 28",	28,	0 },
 	{ 29,	"Bunch 29",	29,	0 },
 	{ 30,	"Bunch 30",	30,	0 },
 	{ 31,	"Bunch 31",	31,	0 },
	{ 0,0,0,0 }
};


ControlDataWin::ControlDataWin(QWidget* w,Control& c) : BVBox(w), ocontrol(c)  {
	int		row = 0;
	int		col = 0;
	int		width = 170;

	oplotSigma = new BGraph(this);
	oplotDeltaX = new BGraph(this);
	oplotDeltaY = new BGraph(this);

	ographControls = new BGraphControlBasic(this);

	QWidget*	t = new QWidget(this);
	QGridLayout* 	v = new QGridLayout(t);
	
	ographControls->addGraph(oplotSigma);
	ographControls->addGraph(oplotDeltaX);
	ographControls->addGraph(oplotDeltaY);

	oticker = new QTimer(this);
	QValidator* validator = new QIntValidator(0, (int)pow(2,31), this );
	
	ocurrentCycle = new QLabel("",t);
	ocurrentCycle->setFixedWidth(width);

	ocyclePeriod		= new BQComboBox(cycleDef,t);
	ofunction		= new BQComboBox(functionDef,t);
	obunchNumber		= new BQComboBox(bunchDef,t);

	ocycleNumber		= new QLineEdit(t); ocycleNumber->setValidator(validator);
	oautoCycleNumber	= new QCheckBox(t);
	
	ostartTime		= new QLineEdit(t); ostartTime->setValidator( validator );
	oorbitNumber		= new QLineEdit(t); oorbitNumber->setValidator( validator );
	oargument		= new QLineEdit(t); oargument->setValidator( validator );
	obeyondPeriod		= new QCheckBox(t);
	onumValues		= new QLineEdit(t); onumValues->setValidator( validator );
	oallChannels		= new QCheckBox(t);
	ochannel		= new QSpinBox(t);
	
	ochannel->setMinimum(1);
	ochannel->setMaximum(60);
	ochannel->setValue(1);
	
	ochannel->setWrapping(true);
	onumValues->setText("2048");
	oautoCycleNumber->setChecked(true);
	obeyondPeriod->setChecked(false);

	ostartTime->setText("0");
	oorbitNumber->setText("0");
	oargument->setText("0");

	oautoCycleNumber->setMaximumWidth(width);
	ocycleNumber->setMaximumWidth(width);
	oallChannels->setMaximumWidth(width);
	ochannel->setMaximumWidth(width);
	ocyclePeriod->setMaximumWidth(width);
	ostartTime->setMaximumWidth(width);
	oorbitNumber->setMaximumWidth(width);

	oargument->setMaximumWidth(width);
	obeyondPeriod->setMaximumWidth(width);
	onumValues->setMaximumWidth(width);
	obunchNumber->setMaximumWidth(width);
	ofunction->setMaximumWidth(width);

	col = 0;row = 0;
	v->addWidget(new QLabel("Auto Cycle Num",t),row,col);		v->addWidget(oautoCycleNumber, row, col+1);row++;
	v->addWidget(new QLabel("Cycle Number",t),row,col);		v->addWidget(ocycleNumber, row, col+1);	row++;
	
	v->addWidget(new QLabel("All Channels",t),row,col);  		v->addWidget(oallChannels, row, col+1);	row++;
	v->addWidget(new QLabel("Channel",t),row,col);      		v->addWidget(ochannel, row, col+1);	row++;
	v->addWidget(new QLabel("Cycle Period",t),row,col);      	v->addWidget(ocyclePeriod, row, col+1);	row++;
	v->addWidget(new QLabel("Start Time",t),row,col);	      	v->addWidget(ostartTime, row, col+1);	row++;

	col = 3;row = 0;	
	v->addWidget(new QLabel("Orbit Number",t),row,col);      	v->addWidget(oorbitNumber, row, col+1);row++;
	v->addWidget(new QLabel("Data Beyond Period",t),row,col);      	v->addWidget(obeyondPeriod, row, col+1);	row++;
	v->addWidget(new QLabel("Num Values",t),row,col);      		v->addWidget(onumValues, row, col+1);	row++;
	v->addWidget(new QLabel("Bunch Number",t),row,col);      	v->addWidget(obunchNumber, row, col+1);	row++;
	v->addWidget(new QLabel("Function",t),row,col);      		v->addWidget(ofunction, row, col+1);	row++;
	v->addWidget(new QLabel("Argument",t),row,col);   	   	v->addWidget(oargument, row, col+1);	row++;

	col = 5;row = 0;	
	v->addWidget(new QLabel("Current Cycle",t),row,col);		v->addWidget(ocurrentCycle, row, col+1);

	v->setSpacing(5);

	BHBox*		h = new BHBox(this);
	QPushButton*	refreshData = new QPushButton("Fetch Data",h);
	QPushButton*	saveFile = new QPushButton("Save To File",h);

	refreshData->setMaximumWidth(200);
	saveFile->setMaximumWidth(200);

	oplotSigma->setMinimumHeight(180);
	oplotDeltaX->setMinimumHeight(180);
	oplotDeltaY->setMinimumHeight(200);

	oplotSigma->installEventFilter(this);
	oplotDeltaX->installEventFilter(this);
	oplotDeltaY->installEventFilter(this);
	oplotDeltaY->setXLabel("Sample");
	
	connect(refreshData,SIGNAL(clicked()),this,SLOT(refresh()));
	connect(saveFile,SIGNAL(clicked()),this,SLOT(saveFile()));

        connect(oautoCycleNumber, SIGNAL(stateChanged(int)), this, SLOT(updateAutoCycle()));
        connect(oallChannels, SIGNAL(stateChanged(int)), this, SLOT(updateAllChannels()));
        connect(oticker, SIGNAL(timeout()), this, SLOT(updateStatus()));
}
	
ControlDataWin::~ControlDataWin() {}

void ControlDataWin::showEvent(QShowEvent* event){
	BVBox::show();
	updateAutoCycle();
	updateAllChannels();
	oticker->start(1000);
}
	
void ControlDataWin::hideEvent(QHideEvent* event){
	oticker->stop();
	BVBox::hide();
}

void ControlDataWin::refresh() {
	BError		err;
	QString		s;
	BUInt32 		cycleNumber;
	BString		cycleType;
	BUInt32		c;
	Tms::ConfigInfo	info;

	if (oautoCycleNumber->isChecked()) {
		BString	s;
		if(err = ocontrol.getCycleInfo(cycleNumber,cycleType)){
			warningDialog("Reading Data", err);
			return;
		}
		odataInfo.cycleNumber	= cycleNumber;
		s.printf("%d",odataInfo.cycleNumber);
		ocycleNumber->setText(s.retStr());
	}
	else {
		odataInfo.cycleNumber	= ocycleNumber->text().toUInt();
	}	
	
	if (odataInfo.numValues != onumValues->text().toUInt()) {
		oplotSigma->setXRange(0,0);
		oplotDeltaX->setXRange(0,0);
		oplotDeltaY->setXRange(0,0);
	}

	if(oallChannels->isChecked()){
		BUInt32	s;
		BUInt32	n;
		Data	data;
		
		// Collect data
		odataInfo.channel = 0;
		odataInfo.startTime = ostartTime->text().toUInt();
		odataInfo.orbitNumber = oorbitNumber->text().toUInt();
		odataInfo.argument = oargument->text().toUInt();
		odataInfo.numValues = onumValues->text().toUInt();
		odataInfo.beyondPeriod = obeyondPeriod->isChecked();
		odataInfo.bunchNumber = (int)obunchNumber->getValue();
		odataInfo.cyclePeriod = (int)ocyclePeriod->getValue();
		odataInfo.function = (int)ofunction->getValue();

		if(err = ocontrol.getData(odataInfo, data)){
			warningDialog("Reading Data",err);
			return;
		}

//		printf("Got: NumValues: %d NumBunches: %d NumChannels: %d\n", data.numValues, data.numBunches, data.numChannels);

		if(data.numBunches == 0){
			data.numBunches = 1;
		}
		
		if(data.numChannels == 0){
			warningDialog("Error number of channels was 0", err);
			return;
		}
		
		// Merge data into bunch, then channel, then sample form 
		odata = data;

#warning "Is this ok ?"
		memset((void*)odata.dataValues.data(), 0, odata.dataValues.size() * sizeof(DataValue));
		n = data.numValues / (data.numBunches * data.numChannels);
		for(s = 0; s < n; s++){
			for(c = 0; c < data.numChannels; c++){
				memcpy(&odata.dataValues[s * data.numBunches * data.numChannels + c * data.numBunches], &data.dataValues[s * odata.numBunches + c * data.numBunches * n], data.numBunches * sizeof(DataValue));
			}
		}
	}
	else {
		odataInfo.channel = ochannel->text().toUInt();
		odataInfo.startTime = ostartTime->text().toUInt();
		odataInfo.orbitNumber = oorbitNumber->text().toUInt();
		odataInfo.argument = oargument->text().toUInt();
		odataInfo.numValues = onumValues->text().toUInt();
		odataInfo.beyondPeriod = obeyondPeriod->isChecked();
		odataInfo.bunchNumber = (int)obunchNumber->getValue();
		odataInfo.cyclePeriod = (int)ocyclePeriod->getValue();
		odataInfo.function = (int)ofunction->getValue();

		if (gdebug & DBG_STD)
			printDataInfo();

		if (err = ocontrol.getData(odataInfo,odata)) {
			warningDialog("Reading Data",err);
			return;
		}
	}

	setPlotData();
	plot();	
}	


void	ControlDataWin::setPlotData() {
	unsigned int	n = 0;

	osigma.resize(odata.numValues);
	odeltaX.resize(odata.numValues);
	odeltaY.resize(odata.numValues);

	for (n = 0;n < odata.numValues;n++) {
		osigma[n] = odata.dataValues[n].sigma;
		odeltaX[n] = odata.dataValues[n].deltaX;
		odeltaY[n] = odata.dataValues[n].deltaY;
	}	
	oplotSigma->setData(osigma);
	oplotDeltaX->setData(odeltaX);
	oplotDeltaY->setData(odeltaY);
	
	oplotSigma->setYLabel("Sigma");
	oplotDeltaX->setYLabel("Delta X");
	oplotDeltaY->setYLabel("Delta Y");

	oplotSigma->setGrid(16,2);
	oplotDeltaX->setGrid(16,2);
	oplotDeltaY->setGrid(16,2);
	ographControls->setMax(odata.numValues);

}


void ControlDataWin::plot() {
}	

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


void	ControlDataWin::saveFile() {
	unsigned int		n;
	BFile			f;
	BString			fname = "data.txt";
	QStringList		fileList;

#ifdef ZAP_QT3
	QFileDialog saveDialog(
        	            ".",
                	    "Pupe Data Dump File (*.txt)",
                	    this,
                	    "save file dialog",
                	    "Choose a file" );
#else
	QFileDialog saveDialog(this, "Pupe Data Dump File (*.txt)");
#endif
	saveDialog.setFileMode(QFileDialog::AnyFile);
	saveDialog.selectFile(fname.retStr());
		
	switch (n = saveDialog.exec()) {
	case 0:		return;		//Cancel Button
			break;	
	case 1:		break;		//Save Button
		default:	printf("Unknown Button (%d)\n",n);
	}

	fileList = saveDialog.selectedFiles();
	if(!fileList.size())
		return;
	
	fname = fileList[0];

	if (f.open(fname,"w+")) {
		printf("Cannot open save file (%s)\n",fname.retStr());
		return;
	}
	f.printf("sigma deltaX deltaY\n");

	for (n = 0;n < odata.dataValues.size();n++) {
		f.printf("%d %d %d\n",
			odata.dataValues[n].sigma,
			odata.dataValues[n].deltaX,
			odata.dataValues[n].deltaY);
	}
	f.close();
	BString msg;
	msg =  BString("File Saved (") + fname + ")";
	gstatusbar->showMessage(msg.retStr(),2000);
}


void ControlDataWin::updateAutoCycle() {
	if (oautoCycleNumber->isChecked())
		ocycleNumber->setEnabled(false);
	else
		ocycleNumber->setEnabled(true);
	updateStatus();	
}

void ControlDataWin::updateAllChannels() {
	if (oallChannels->isChecked())
		ochannel->setEnabled(false);
	else
		ochannel->setEnabled(true);
	updateStatus();	
}

void ControlDataWin::updateStatus() {
	BError		err;
	BUInt32 		cycleNumber;
	BString		cycleType;
	BString		s;
	
	if(err = ocontrol.getCycleInfo(cycleNumber,cycleType))
			return;
	s.printf("%d %s",cycleNumber,cycleType.retStr());
	ocurrentCycle->setText(s.retStr());	
}

void ControlDataWin::printDataInfo() {
	printf("Channel Number\t(%d)\n",odataInfo.channel);
	printf("Cycle Number\t(%d)\n",odataInfo.cycleNumber);
	printf("Period\t\t(%d)\n",odataInfo.cyclePeriod);
	printf("Start Time\t(%d)\n",odataInfo.startTime);
	printf("Orbit Number\t(%d)\n",odataInfo.orbitNumber);
	printf("Bunch Number\t(%d)\n",odataInfo.bunchNumber);
	printf("Function\t(%d)\n",odataInfo.function);
	printf("Argument\t(%d)\n",odataInfo.argument);
	printf("Num Values\t(%d)\n",odataInfo.numValues);
}
bool ControlDataWin::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 1; 
	}
	else {
		// standard event processing
		return 0;
	}
}