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 <qlayout.h>
#include <qvbox.h>
#include <TmsD.h>
#include <qvalidator.h>
#include <qmessagebox.h>
#include <BFile.h>
#include <qwt/qwt_scale.h>
#include <qhbox.h>

using namespace Tms;
using namespace std;

static ComboDefinition cycleDef[] = {
	{ 0,	"CyclePeriodStart",		CyclePeriodStart,	1 },
	{ 1,	"CyclePeriodCalibration",	CyclePeriodCalibration,	0 },
 	{ 2,	"CyclePeriodHarmonic0",		CyclePeriodHarmonic0,	0 },
	{ 3,	"CyclePeriodHarmonic1",		CyclePeriodHarmonic1,	0 },
	{ 4,	"CyclePeriodHarmonic2",		CyclePeriodHarmonic2,	0 },
	{ 5,	"CyclePeriodHarmonic3",		CyclePeriodHarmonic3,	0 },
	{ 6,	"CyclePeriodHarmonic4",		CyclePeriodHarmonic4,	0 },
	{ 7,	"CyclePeriodHarmonic5",		CyclePeriodHarmonic5,	0 },
	{ 8,	"CyclePeriodHarmonic6",		CyclePeriodHarmonic6,	0 },
	{ 9,	"CyclePeriodHarmonic7",		CyclePeriodHarmonic7,	0 },
	{ 0,0,0,0 }
};

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

static ComboDefinition bunchDef[] = {
	{ 0,	"Bunch 0",	0,	1 },
	{ 1,	"Bunch 1",	1,	0 },
 	{ 2,	"Bunch 1",	2,	0 },
 	{ 3,	"Bunch 2",	3,	0 },
	{ 0,0,0,0 }
};


ControlDataWin::ControlDataWin(QWidget* w,Control& c) : ocontrol(c)  {
	QPen		pen;
	int		row = 0;
	int		col = 0;

	QVBox* 		mv = new QVBox(this);
			oplotSigma = new BQwtPlot(mv);
			oplotDeltaX = new BQwtPlot(mv);
			oplotDeltaY = new BQwtPlot(mv);

	BQwtPlotControlBasic*	controls = new BQwtPlotControlBasic(mv,oplotSigma);
	QWidget*	t = new QWidget(mv);
	QGridLayout* 	v = new QGridLayout(t);

	controls->addPlot(oplotDeltaX);
	controls->addPlot(oplotDeltaY);

	oticker = new QTimer(this);

	QValidator* validator = new QIntValidator(0, (int)pow(2,31), this );


	pen.setColor("blue");
	
	ocurrentCycle = new QLabel("",t);
	ocurrentCycle->setFixedWidth(200);
	

	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 );
	onumValues		= new QLineEdit(t,"");onumValues->setValidator( validator );
	ochannel		= new QSpinBox(1,60,1,t,"");
	
	ochannel->setWrapping(true);
	onumValues->setText("2048");
	oautoCycleNumber->setChecked(true);

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

	int width = 200;

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

	oargument->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->addMultiCellWidget(ocycleNumber,row,row,col+1,col+2);	row++;
	
	v->addWidget(new QLabel("Channel",t,""),row,col);      		v->addMultiCellWidget(ochannel,row,row,col+1,col+2);	row++;
	v->addWidget(new QLabel("Cycle Period",t,""),row,col);      	v->addMultiCellWidget(ocyclePeriod,row,row,col+1,col+2);	row++;
	v->addWidget(new QLabel("Start Time",t,""),row,col);      	v->addMultiCellWidget(ostartTime,row,row,col+1,col+2);	row++;
	v->addWidget(new QLabel("Orbit Number",t,""),row,col);      	v->addMultiCellWidget(oorbitNumber,row,row,col+1,col+2);row++;

	col = 2;row = 0;	
	v->addWidget(ocurrentCycle,row,col);
	
	col = 3;row = 0;	
	v->addWidget(new QLabel("Argument",t,""),row,col);      	v->addWidget(oargument,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->setSpacing(5);


	QHBox*		h = new QHBox(mv);
	
	QPushButton*	refreshData = new QPushButton("Refresh Data",h,"refresh");
	QPushButton*	saveFile = new QPushButton("Save To File",h,"save");

	h->setMargin(4);
	refreshData->setMaximumWidth(200);
	saveFile->setMaximumWidth(200);
	
	
	osigma.curve  = oplotSigma->insertCurve("Sigma");
	odeltaX.curve = oplotDeltaX->insertCurve("deltaX");
	odeltaY.curve = oplotDeltaY->insertCurve("deltaY");

	oplotSigma->setLegendPosition(QwtPlot::Right);
	oplotDeltaX->setLegendPosition(QwtPlot::Right);
	oplotDeltaY->setLegendPosition(QwtPlot::Right);

	oplotSigma->setMinimumHeight(100);
	oplotDeltaX->setMinimumHeight(150);
	oplotDeltaY->setMinimumHeight(180);

	oplotSigma->enableLegend(true,osigma.curve);
	oplotDeltaX->enableLegend(true,odeltaX.curve);
	oplotDeltaY->enableLegend(true,odeltaY.curve);
	
	oplotSigma->enableXBottomAxis(0);
	oplotDeltaX->enableXBottomAxis(0);
	oplotDeltaY->enableXBottomAxis(1);

	oplotSigma->setCurvePen(osigma.curve,pen);
	oplotDeltaX->setCurvePen(odeltaX.curve,pen);
	oplotDeltaY->setCurvePen(odeltaY.curve,pen);

	QwtScale*	sd;
	sd = (QwtScale*)(oplotSigma->axis(QwtPlot::yLeft));
	
#ifdef ZAP	// Autoscale
	sd->setTitle("Testing");
	sd->setPaletteBackgroundColor("Red");
	oplotSigma->setAxisScale(QwtPlot::yLeft,-4000,10000);
	oplotDeltaX->setAxisScale(QwtPlot::yLeft,-4000,10000);
	oplotDeltaY->setAxisScale(QwtPlot::yLeft,-4000,10000);
#endif
	
	connect(refreshData,SIGNAL(clicked()),this,SLOT(refresh()));
	connect(saveFile,SIGNAL(clicked()),this,SLOT(saveFile()));

	connect(oplotSigma,SIGNAL(plotEvent(QWheelEvent*)),this,SLOT(plotSyncEvents(QWheelEvent*)));
	connect(oplotDeltaX,SIGNAL(plotEvent(QWheelEvent*)),this,SLOT(plotSyncEvents(QWheelEvent*)));
	connect(oplotDeltaY,SIGNAL(plotEvent(QWheelEvent*)),this,SLOT(plotSyncEvents(QWheelEvent*)));
        connect(oautoCycleNumber, SIGNAL(stateChanged(int)), this, SLOT(updateAutoCycle()));
        connect(oticker, SIGNAL(timeout()), this, SLOT(updateStatus()));
}
	
ControlDataWin::~ControlDataWin() {}

void ControlDataWin::show() {
	updateAutoCycle();
	QWidget::show();
}
	
void ControlDataWin::hide() {
	oticker->stop();
	QWidget::hide();
}

void ControlDataWin::refresh() {
	BError		err;
	QString		s;
	
	UInt32 		cycleNumber;


	if (oautoCycleNumber->isChecked()) {
		BString	s;
		if(err = ocontrol.getCycleNumber(cycleNumber)){
			return;
		}
		odataInfo.cycleNumber	= cycleNumber + 2;
		s.printf("%d",odataInfo.cycleNumber);
		ocycleNumber->setText(s.retStr());
		oautoCycleNumber->setChecked(false);
	}
	else {
		odataInfo.cycleNumber	= ocycleNumber->text().toUInt();
	}	
	
	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.bunchNumber = (int)obunchNumber->getValue();
	odataInfo.cyclePeriod = (int)ocyclePeriod->getValue();
	odataInfo.function = (int)ofunction->getValue();

	printDataInfo();

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


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

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

	oplotSigma->setRange(odata.numValues);
	oplotDeltaX->setRange(odata.numValues);
	oplotDeltaY->setRange(odata.numValues);
	
	for (n = 0;n < odata.numValues;n++) {
		ox.data[n] = n;
		osigma.data[n] = odata.dataValues[n].sigma;
		odeltaX.data[n] = odata.dataValues[n].deltaX;
		odeltaY.data[n] = odata.dataValues[n].deltaY;
	}	
	oplotSigma->setCurveData(osigma.curve,ox.data.data(),osigma.data.data(),odata.numValues);
	oplotDeltaX->setCurveData(odeltaX.curve,ox.data.data(),odeltaX.data.data(),odata.numValues);
	oplotDeltaY->setCurveData(odeltaY.curve,ox.data.data(),odeltaY.data.data(),odata.numValues);
}


void ControlDataWin::plot() {
	oplotSigma->replot();	
	oplotDeltaX->replot();	
	oplotDeltaY->replot();	
}	

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::plotSyncEvents(QWheelEvent* e) {
	oplotSigma->syntheticWheelEvent(e);
	oplotDeltaX->syntheticWheelEvent(e);
	oplotDeltaY->syntheticWheelEvent(e);
}

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

	if (f.open(fname,"w+")) {
		printf("Cannot open save file (%s)\n",fname.retStr());
		return;
	}	
	f.printf("# tmsControlGui - Saved data file\n");
	f.printf("# Runtime data\n");
	f.printf("# Sigma,DeltaX,DeltaY\n");
	f.printf("#\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();
}


void ControlDataWin::updateAutoCycle() {
	if (oautoCycleNumber->isChecked()) {
		oticker->start( 1000, FALSE ); 	
		ocycleNumber->setEnabled(false);
	}	
	else {
		ocycleNumber->setEnabled(true);
		oticker->stop();
	}	
	updateStatus();	
}

void ControlDataWin::updateStatus() {
	BError		err;
	UInt32 		cycleNumber;
	BString		s;

	if (oautoCycleNumber->isChecked()) {
		if(err = ocontrol.getCycleNumber(cycleNumber)){
			return;
		}
	s.printf("Current Cycle = %d",cycleNumber);
	}
	ocurrentCycle->setText(s.retStr());	
}

void ControlDataWin::printDataInfo() {
	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);
}