/*
* 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());
}