-
Giacomo Strangolino authored2e518859
valveshuttercontrol.cpp 6.12 KiB
#include "valveshuttercontrol.h"
#include "ui_valveshuttercontrol.h"
#include "row.h"
#include "errmanager.h"
#include "rpcthread.h"
#include <macros.h>
#include <configuration.h>
#include <elettracolors.h>
#include <QTimer>
#include <QFile>
#include <QMessageBox>
#include <QGridLayout>
#include <QVBoxLayout>
#include <QTWriter>
#include <QCheckBox>
#include <QTWriter>
#include <QtDebug>
ValveShutterControl::ValveShutterControl(QWidget *parent) :
QWidget(parent),
ui(new Ui::ValveShutterControl)
{
ui->setupUi(this);
ui->progressWidget->setVisible(false);
QTimer::singleShot(100, this, SLOT(setup()));
}
ValveShutterControl::~ValveShutterControl()
{
delete ui;
}
void ValveShutterControl::setup()
{
if(qApp->arguments().count() < 2)
{
QMessageBox::information(this, "Usage", QString("%1 configuration_file").arg(qApp->arguments().at(0)));
exit(EXIT_FAILURE);
}
Config::instance()->setStateColor(Tango::OPEN, EColor(Elettra::green));
Config::instance()->setStateColor(Tango::CLOSE, EColor(Elettra::darkYellow));
Config::instance()->setStateColor(Tango::FAULT, EColor(Elettra::red));
foreach(QPushButton *pb, ui->gbValve->findChildren<QPushButton *>())
connect(pb, SIGNAL(clicked()), this, SLOT(execCmd()));
foreach(QPushButton *pb, ui->gbShutter->findChildren<QPushButton *>())
connect(pb, SIGNAL(clicked()), this, SLOT(execCmd()));
foreach(QPushButton *pb, ui->frameHeader->findChildren<QPushButton *>())
connect(pb, SIGNAL(clicked()), this, SLOT(execCmd()));
connect(ui->pbCancelThread, SIGNAL(clicked()), this, SLOT(cancelRpcThread()));
QVBoxLayout *vb = new QVBoxLayout(ui->table);
QFile file(qApp->arguments().at(1));
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
return;
unsigned linecnt = 0;
while (!file.atEnd())
{
linecnt++;
QString line = QString(file.readLine()).trimmed();
if(!line.startsWith('#') && line.count(",") > 0)
{
QStringList parts = line.split(",");
if(parts.size() == 3)
{
Row *row = new Row(parts, this);
connect(row, SIGNAL(selectionChanged(bool,bool)), this, SLOT(rowSelectionChanged(bool,bool)));
vb->addWidget(row);
}
else
perr("line %d \"%s\" is not valid!", linecnt, qstoc(line));
}
}
}
void ValveShutterControl::execCmd()
{
QObject *sen = sender();
QString cmd = sen->property("cmd").toString();
if(cmd == "vlvSelectAll")
foreach(Row *r, ui->table->findChildren<Row *>())
r->setValveSelected(true);
else if(cmd == "vlvDeselectAll")
foreach(Row *r, ui->table->findChildren<Row *>())
r->setValveSelected(false);
else if(cmd == "shSelectAll")
foreach(Row *r, ui->table->findChildren<Row *>())
r->setShutterSelected(true);
else if(cmd == "shDeselectAll")
foreach(Row *r, ui->table->findChildren<Row *>())
r->setShutterSelected(false);
else if(cmd == "vlvOpen" || cmd == "vlvClose")
cmdValves(cmd.remove("vlv"));
else if(cmd == "shOpen" || cmd == "shClose")
cmdShutters(cmd.remove("sh"));
}
void ValveShutterControl::writeProgress(int step, int total)
{
ui->progressWidget->setVisible(step < total);
ui->progressBar->setMaximum(total);
ui->progressBar->setValue(step);
}
void ValveShutterControl::rpcWriteFinished()
{
RpcThread *th = findChild<RpcThread *>();
QStringList errors = th->errors();
if(errors.size())
{
ErrManager* errMan = new ErrManager(this);
errMan->setErrors("RPC", errors);
errMan->exec();
delete errMan;
}
delete th;
}
void ValveShutterControl::cancelRpcThread()
{
RpcThread *th = findChild<RpcThread *>();
if(th)
th->cancel();
}
void ValveShutterControl::rowSelectionChanged(bool isValve, bool checked)
{
bool oneChecked = checked;
QList<Row *> rows = ui->table->findChildren<Row *>();
Row *r;
if(isValve)
{
for(int i = 0; !checked && i < rows.size(); i++)
{
r = rows.at(i);
oneChecked = r->isValveSelected();
if(oneChecked)
break;
}
ui->pbOpenValve->setEnabled(oneChecked);
ui->pbCloseValve->setEnabled(oneChecked);
}
else
{
for(int i = 0; !checked && i < rows.size(); i++)
{
r = rows.at(i);
oneChecked = r->isShutterSelected();
if(oneChecked)
break;
}
ui->pbOpenSh->setEnabled(oneChecked);
ui->pbCloseSh->setEnabled(oneChecked);
}
}
void ValveShutterControl::cmdValves(const QString& cmd)
{
QStringList sections_rpc;
foreach(Row *r, ui->table->findChildren<Row *>())
if(r->isValveSelected() && !r->isVlvFETango())
sections_rpc << r->section();
qDebug() << __FUNCTION__ << "sections rpc " << sections_rpc << cmd;
RpcThread *rpcThread = new RpcThread(this, sections_rpc, cmd);
connect(rpcThread, SIGNAL(progress(int,int)), this, SLOT(writeProgress(int,int)));
connect(rpcThread, SIGNAL(finished()), this, SLOT(rpcWriteFinished()));
rpcThread->start();
/* tango VLVFEs */
QString target;
foreach(Row *r, ui->table->findChildren<Row *>())
{
if(r->isValveSelected() && r->isVlvFETango())
{
QTWriter *w = new QTWriter(this);
w->setAutoDestroy(true);
target = r->vlvFeSource().section('/',0, 2);
target += "->" + cmd;
printf("** executing tango command \"%s\" ***\n", qstoc(target));
w->setTargets(target);
w->execute();
}
}
}
void ValveShutterControl::cmdShutters(const QString& cmd)
{
QString targets;
foreach(Row *r, ui->table->findChildren<Row *>())
if(r->isShutterSelected())
targets += r->shutterSource() + "->" + cmd + ";";
if(targets.isEmpty())
return;
QTWriter *w = new QTWriter(this);
w->setAutoDestroy(true);
printf("CmdShutters.executing \"%s\"\n", qstoc(targets));
w->setTargets(targets);
w->execute();
}