/*
* 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>
#include <qgrid.h>
#include <TmsLib.h>
using namespace Tms;
PupeSimulateWin::PupeSimulateWin(QWidget* parent,Control& c) : ocontrol(c) {
QGridLayout* grid;
QLabel* contentsLabel;
QButton* fileSelectButton;
QGroupBox* internalTimings;
QGroupBox* cycleType;
QGroupBox* controls;
QWidget* w;
QGridLayout* v;
BString s;
int row = 0;
// this->setMaximumSize(QSize(800,750));
grid = new QGridLayout(this,5,3);
grid->setMargin(20);
grid->setSpacing(20);
s = "<p><b>Pupe Simulation<b></p>";
s += "<p>Enter specifications for the test data of a Pupe channel</p>";
contentsLabel = new QLabel(s.retStr(),this);
QVGroupBox * testRam = new QVGroupBox("Pupe Pickup Test Data",this,"testRam");
w = new QWidget(testRam,"testRamW");
v = new QGridLayout(w);
v->setSpacing(10);
row = 0;
v->addWidget(new QLabel("Channel Number",w),row,0);
v->addWidget(ochannelTestRam = new QSpinBox(1,60,1,w,""),row,1);
row++;
v->addWidget(new QLabel("Test Data file",w),row,0);
v->addMultiCellWidget(osimulationRamFilename = new QLineEdit(w,"ramfilename"),row,row,1,2);
row++;
v->addWidget(fileSelectButton = new QPushButton("Select",w,""),1,3);
v->addWidget(oloadSimulationRam = new QPushButton("Load Test Data",w,""),2,1);
v->addWidget(oclearSimulationRam = new QPushButton("Clear Test Data",w,""),2,2);
oloadSimulationRam->setMaximumWidth(200);
oclearSimulationRam->setMaximumWidth(200);
internalTimings = new QVGroupBox("Internal Timing Control",this,"internalTimings");
w = new QWidget(internalTimings,"internalTimingsW");
v = new QGridLayout(w);
v->setSpacing(10);
row = 0;
v->addWidget(new QLabel("Channel Number",w),row,0);
v->addWidget(ochannelTiming = new QSpinBox(1,60,1,w,""),row,1);
row++;
v->addMultiCellWidget(ouseInternalAdcClockRef = new QCheckBox("Use Internal Adc Clock Ref",w,""),row,row,0,1);
row++;
row++;
v->addWidget(oFref = new QCheckBox("Fref",w,""),row,0);
v->addWidget(oHChange = new QCheckBox("H Change",w,""),row,1);
v->addWidget(oInjection = new QCheckBox("Injection",w,""),row,2);
v->addWidget(oCalStop = new QCheckBox("Cal Stop",w,""),row,3);
row++;
v->addWidget(oCalStart = new QCheckBox("Cal Start",w,""),row,0);
v->addWidget(oCycleStop = new QCheckBox("Cycle Stop",w,""),row,1);
v->addWidget(oCycleStart = new QCheckBox("Cycle Start",w,""),row,2);
v->addWidget(oClock = new QCheckBox("Clock",w,""),row,3);
row++;
oiApply = new QPushButton("Apply",internalTimings,"");
oiApply->setMaximumWidth(200);
cycleType = new QVGroupBox("Cycle Type",this,"cycleType");
w = new QWidget(cycleType,"cycleTypeW");
v = new QGridLayout(w);
v->setSpacing(10);
row = 0;
v->addWidget(ocycleType = new BQComboBox(w),row,0);
v->addWidget(new QWidget(w,"dummy"),row,1);
row++;
v->addWidget(oapplyCycleType = new QPushButton("Apply",w),row,0);
oapplyCycleType->setMaximumWidth(200);
controls = new QVGroupBox("Server Control",this,"serverControl");
w = new QWidget(controls,"controlsW");
v = new QGridLayout(w);
v->addWidget(oInitialise = new QPushButton("Initialise TMS",w),row,0);
v->addWidget(new QWidget(w,"dummy"),row,1);
oInitialise->setMaximumWidth(200);
ochannelTestRam->setWrapping(true);
ochannelTiming->setWrapping(true);
row = 0;
grid->addMultiCellWidget(contentsLabel,row,row,0,2); row += 1;
grid->addMultiCellWidget(testRam,row,row+1,0,2); row += 2;
grid->addMultiCellWidget(internalTimings,row,row + 1,0,2); row += 2;
grid->addMultiCellWidget(cycleType,row,row +1,0,2); row += 2;
grid->addMultiCellWidget(controls,row,row,0,2); 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(initialiseTMS()));
connect(oiApply,SIGNAL(clicked()),this,SLOT(applyInternalTimings()));
connect(oapplyCycleType,SIGNAL(clicked()),this,SLOT(applyCycleType()));
connect(ochannelTiming,SIGNAL(valueChanged(int)),this,SLOT(updateTimingMask()));
connect(&ocontrol,SIGNAL(newConnection()),this,SLOT(update()));
}
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() {
QWidget::show();
update();
}
void PupeSimulateWin::update() {
if (! isVisible())
return;
if (updateMaxChannels())
return;
if (updateTimingMask())
return;
if (updateControlList())
return;
}
BError PupeSimulateWin::updateMaxChannels() {
BError err;
Tms::ConfigInfo info;
if (err = ocontrol.getConfiguration(info)) {
return err;
}
ochannelTestRam->setMaxValue(info.puReferences.size());
ochannelTiming->setMaxValue(info.puReferences.size());
return err;
}
BError PupeSimulateWin::updateTimingMask() {
BError err;
Tms::PuChannel puChannel;
Tms::PupeConfig pupeConfig;
if(err = ocontrol.getPuChannel(ochannelTiming->value(), puChannel)){
warningDialog("Pupe Update Timing Mask - ",err);
return err;
}
if(err = ocontrol.getPupeConfig(puChannel, pupeConfig)){
warningDialog("Pupe Update Timing Mask - ",err);
return err;
}
oClock->setChecked(false);
oCycleStart->setChecked(false);
oCycleStop->setChecked(false);
oCalStart->setChecked(false);
oCalStop->setChecked(false);
oInjection->setChecked(false);
oHChange->setChecked(false);
oFref->setChecked(false);
if (pupeConfig.internalTimingMask & TimingSigClock)
oClock->setChecked(true);
if (pupeConfig.internalTimingMask & TimingSigCycleStart )
oCycleStart->setChecked(true);
if (pupeConfig.internalTimingMask & TimingSigCycleStop )
oCycleStop->setChecked(true);
if (pupeConfig.internalTimingMask & TimingSigCalStart)
oCalStart->setChecked(true);
if (pupeConfig.internalTimingMask & TimingSigCalStop )
oCalStop->setChecked(true);
if (pupeConfig.internalTimingMask & TimingSigInjection )
oInjection->setChecked(true);
if (pupeConfig.internalTimingMask & TimingSigHChange )
oHChange->setChecked(true);
if (pupeConfig.internalTimingMask & TimingSigFRef )
oFref->setChecked(true);
return err;
}
BError PupeSimulateWin::updateControlList() {
BError err;
BIter i;
int n = 0;
UInt32 cycleNumber;
BString cycleType;
BList<CycleParamItem> l;
if (err = ocontrol.getControlList(l)) {
warningDialog("Pupe Get Control List - ",err);
return err;
}
if (err = ocontrol.getCycleInfo(cycleNumber,cycleType)) {
warningDialog("Pupe Get Control Info -",err);
return err;
}
ocycleType->clear();
for (l.start(i);! l.isEnd(i);l.next(i)) {
ocycleType->insertItem(l[i].cycleType.retStr());
if (l[i].cycleType == cycleType) {
ocycleType->setCurrentItem(n);
}
n++;
}
return err;
}
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(ochannelTestRam->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::initialiseTMS() {
BError err;
if (err = ocontrol.initialiseServer()) {
warningDialog("Initialising Server",err);
return;
}
gstatusbar->message("TMS initialised",2000);
}
void PupeSimulateWin::applyInternalTimings() {
BError err;
Tms::PuChannel puChannel;
Tms::PupeConfig pupeConfig;
pupeConfig.internalTimingMask =
oClock->isChecked() << 0 |
oCycleStart->isChecked() << 1 |
oCycleStop->isChecked() << 2 |
oCalStart->isChecked() << 3 |
oCalStop->isChecked() << 4 |
oInjection->isChecked() << 5 |
oHChange->isChecked() << 6 |
oFref->isChecked() << 7;
if (ouseInternalAdcClockRef->isChecked())
pupeConfig.internalAdcClockRef = 1;
else
pupeConfig.internalAdcClockRef = 0;
if(err = ocontrol.getPuChannel(ochannelTiming->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;
BString ct;
BString msg;
UInt32 cycleNumber;
BString cycleType;
// Get current cycle info
if(err = ocontrol.getCycleInfo(cycleNumber,cycleType)){
warningDialog("Setting Cycle Type - GetCycleInfo",err);
return;
}
cycleType = ocycleType->currentText().ascii();
cycleNumber++;
// Set NextCycle type
if(err = ocontrol.setNextCycle(cycleNumber, cycleType)){
warningDialog("Setting Cycle Type - SetNextCycle",err);
return;
}
msg.printf("Next CycleType (%s)\n",cycleType.retStr());
gstatusbar->message(msg.retStr(),2000);
}
void PupeSimulateWin::clearRam() {
BError err;
Tms::PuChannel puChannel;
BArray< UInt32 > data;
if(err = ocontrol.getPuChannel(ochannelTestRam->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());
}