diff --git a/src/hv.cpp b/src/hv.cpp new file mode 100644 index 0000000000000000000000000000000000000000..0e96887c12fc066ea0545159ef73d04a76ae197a --- /dev/null +++ b/src/hv.cpp @@ -0,0 +1,430 @@ +/*************************************************************************** + * Copyright (C) 2006 by LZ * + * * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + + +#include "hv.h" +#include <qtango.h> +#include <QColor> +#include <QMessageBox> +#include <twidgetgroup.h> + +void hv::fill_frame(vector <QString> text, TWidgetGroup &kleds, QFrame * &frame) { + QGridLayout *box1; + box1 = new QGridLayout(frame); + box1->setSpacing(3); + box1->setMargin(3); + int led_size = 18; + /* + for (unsigned i=0; i<text.size(); i++) { + box1->setRowMinimumHeight(i,23); + QLabel *lab = new QLabel(frame); + lab->setText(" "+text[i]); + QFont f("Helvetica", 12, QFont::Bold); + lab->setFont(f); + // lab->setSize(24); + kleds.addWidget(lab); + box1->addWidget(lab, i, 0, Qt::AlignLeft); + TLed *ptr = new TLed(frame); + ptr->setTrueColor(QColor::QColor(40, 200, 40)); + ptr->setFalseColor(QColor::QColor(200, 200, 200)); + ptr->setLedWidth(led_size-2); + ptr->setLedHeight(led_size-2); + ptr->setMinimumSize(led_size, led_size); + ptr->setMaximumSize(led_size, led_size); + ptr->setGeometry(1, 1, led_size, led_size); + kleds.addWidget(ptr); + box1->addWidget(ptr, i, 1, Qt::AlignCenter); + } + */ + for (unsigned i=0; i<text.size(); i++) { + box1->setRowMinimumHeight(i,23); + QLabel *lab = new QLabel(frame); + lab->setObjectName("labElement0"); + lab->setText(" "+text[i]); + QFont f("Helvetica", 12, QFont::Bold); + lab->setFont(f); + // lab->setSize(24); + box1->addWidget(lab, i, 0, Qt::AlignLeft); + TLed *ptr = new TLed(frame); + ptr->setObjectName("ledElement1"); + if (i < 4 || i > 8) { + ptr->setTrueColor(QColor(40, 160, 40)); + } + else { + ptr->setTrueColor(QColor(160, 40, 40)); + } + ptr->setFalseColor(QColor(170, 255, 255)); + ptr->setLedWidth(led_size-2); + ptr->setLedHeight(led_size-2); + ptr->setMinimumSize(led_size, led_size); + ptr->setMaximumSize(led_size, led_size); + ptr->setGeometry(1, 1, led_size, led_size); + box1->addWidget(ptr, i, 1, Qt::AlignCenter); +#ifdef QTANGOLIB_GET_VERSION + kleds.setObjectNameList(QStringList() << lab->objectName() << ptr->objectName()); +#else + kleds.addWidget(lab); + kleds.addWidget(ptr); +#endif + + } + return; +} + +hv::hv(QWidget *parent) : QDialog(parent) +{ + ui.setupUi(this); + + // static TWidgetGroup hv_leds(this); + // static TWidgetGroup hv_ramps; + vector <QString> hv_labs = explode(',', "FuG enabled,Ready (Not busy),Switching ON,Switching OFF,Ramping UP,Ramping Down,Ramping to low power,Making a new ramp,Aborting,OFF,Limited Power,Standby,Low Power,Full Power"); + // fill_frame(hv_labs, hv_leds, ui.frame_StateFlags); + ui.mod_title->setText(QString("Mod %1 HV").arg(qApp->arguments().at(1))); + if (qApp->arguments()[1] == "1") { + /* + try { + hv_leds.setSource("p/mod/hv_p1/StateFlags"); + } + catch (...) { + sleep(1); + try { + hv_leds.setSource("p/mod/hv_p1/StateFlags"); + } + catch (...) { + QMessageBox::information(0, "cannot connect HV server", + QString("Cannot connect HV server for modulator "+qApp->arguments()[1])); + exit(EXIT_FAILURE); + } + } + */ + try { + hvServer = new Tango::DeviceProxy("p/mod/hv_p1"); + } + catch (...) { + sleep(1); + try { + hvServer = new Tango::DeviceProxy("p/mod/hv_p1"); + } + catch (...) { + QMessageBox::information(0, "cannot connect HV server", + QString("Cannot connect HV server for modulator "+qApp->arguments()[1])); + exit(EXIT_FAILURE); + } + } + try { + rossServer = new Tango::DeviceProxy("p/mod/ross_p1"); + } + catch (...) { + sleep(1); + try { + rossServer = new Tango::DeviceProxy("p/mod/ross_p1"); + } + catch (...) { + QMessageBox::information(0, "cannot connect HV server", + QString("Cannot connect HV server for modulator "+qApp->arguments()[1])); + exit(EXIT_FAILURE); + } + } + } + else if (qApp->arguments()[1] == "2") { + /* + try { + hv_leds.setSource("p/mod/hv_p2/StateFlags"); + } + catch (...) { + sleep(1); + try { + hv_leds.setSource("p/mod/hv_p2/StateFlags"); + } + catch (...) { + QMessageBox::information(0, "cannot connect HV server", + QString("Cannot connect HV server for modulator "+qApp->arguments()[1])); + exit(EXIT_FAILURE); + } + } + */ + try { + hvServer = new Tango::DeviceProxy("p/mod/hv_p2"); + } + catch (...) { + sleep(1); + try { + hvServer = new Tango::DeviceProxy("p/mod/hv_p2"); + } + catch (...) { + QMessageBox::information(0, "cannot connect HV server", + QString("Cannot connect HV server for modulator "+qApp->arguments()[1])); + exit(EXIT_FAILURE); + } + } + try { + rossServer = new Tango::DeviceProxy("p/mod/ross_p2"); + } + catch (...) { + sleep(1); + try { + rossServer = new Tango::DeviceProxy("p/mod/ross_p2"); + } + catch (...) { + QMessageBox::information(0, "cannot connect Ross server", + QString("Cannot connect Ross server for modulator "+qApp->arguments()[1])); + exit(EXIT_FAILURE); + } + } + } + else if (qApp->arguments()[1] == "10") { + /* + try { + hv_leds.setSource("f/mod/hv_f10/StateFlags"); + } + catch (...) { + sleep(1); + try { + hv_leds.setSource("f/mod/hv_f10/StateFlags"); + } + catch (...) { + QMessageBox::information(0, "cannot connect HV server", + QString("Cannot connect HV server for modulator "+qApp->arguments()[1])); + exit(EXIT_FAILURE); + } + } + */ + try { + hvServer = new Tango::DeviceProxy("f/mod/hv_f10"); + } + catch (...) { + sleep(1); + try { + hvServer = new Tango::DeviceProxy("f/mod/hv_f10"); + } + catch (...) { + QMessageBox::information(0, "cannot connect HV server", + QString("Cannot connect HV server for modulator "+qApp->arguments()[1])); + exit(EXIT_FAILURE); + } + } + try { + rossServer = new Tango::DeviceProxy("f/mod/ross_f10"); + } + catch (...) { + sleep(1); + try { + hvServer = new Tango::DeviceProxy("f/mod/ross_f10"); + } + catch (...) { + QMessageBox::information(0, "cannot connect Ross server", + QString("Cannot connect Ross server for modulator "+qApp->arguments()[1])); + exit(EXIT_FAILURE); + } + } + } + else { + QMessageBox::information(0, "cannot connect HV server", + QString("Cannot connect HV server for modulator "+qApp->arguments()[1])); + exit(EXIT_FAILURE); + } + try { + ramps = hvServer->read_attribute("ListRamp"); + } + catch (...) { + try { + ramps = hvServer->read_attribute("ListRamp"); + } + catch (...) { + QMessageBox::information(0, "cannot connect Ross server", + QString("Cannot connect list ramp for modulator "+qApp->arguments()[1])); + exit(EXIT_FAILURE); + } + } + vector<string> ramp; + ramps >> ramp; + for (unsigned i=0; i<ramp.size(); i++) { + ui.comboBox->insertItem(i, ramp[i].c_str(), QVariant(Qt::red)); + } + // ui.comboBox->setCurrentItem(i); + connect(ui.View_PushButton, SIGNAL(clicked()), this, SLOT(view_ramp())); + connect(ui.Load_PushButton, SIGNAL(clicked()), this, SLOT(load_ramp())); + connect(ui.Save_PushButton, SIGNAL(clicked()), this, SLOT(save_ramp())); + connect(ui.makerampApply, SIGNAL(clicked()), this, SLOT(make_ramp())); + connect(ui.Off_PushButton, SIGNAL(clicked()), this, SLOT(hv_off())); + connect(ui.Ground_PushButton, SIGNAL(clicked()), this, SLOT(ross_ground())); + + // QString q_cmd; + // ui.rampDown_ApplyNumeric->setTarget("p/mod/hv_p"+qApp->arguments()[1]+"->RampDown"); + // ui.RampDn_PushButton->setTargets("p/mod/hv_p"+qApp->arguments()[1]+"->RampDown"); +} + +hv::~hv() +{ + exit(0); +} + +void hv::hv_off() +{ + try { + int r = QMessageBox::question(this, "Confirm HV OFF", "Please confirm command: 'OFF'", "OFF", "Cancel"); + if (r == 0) { + try { + hvServer->command_inout("Off"); + } + catch (...) { + QMessageBox::information(0, "cannot switch HV off", + QString("Cannot switch HV off "+qApp->arguments()[1])); + } + } + } + catch (const Tango::DevFailed &e) { + cout << "Error: hv_off()" << endl; + } +} + +void hv::ross_ground() +{ + try { + int r = QMessageBox::question(this, "Confirm Ross Ground", "Please confirm command: 'Ground'", "Ground", "Cancel"); + if (r == 0) { + try { + hvServer->command_inout("Off"); + rossServer->command_inout("Off"); + } + catch (...) { + QMessageBox::information(0, "cannot switch Ross Ground", + QString("Cannot switch Ross Ground "+qApp->arguments()[1])); + } + } + } + catch (const Tango::DevFailed &e) { + cout << "Error: ross_ground()" << endl; + } +} + +void hv::view_ramp() +{ + // static TWidgetGroup hv_ramp; + Tango::DeviceData rampName; + Tango::DeviceData rampData; + Tango::DevString str = CORBA::string_dup(ui.comboBox->currentText().toStdString().c_str()); + rampName << str; + try { + rampData = hvServer->command_inout("ReadRamp", rampName); + } + catch (Tango::DevFailed &e) { + Tango::Except::print_exception(e); + } + vector<string> ramp; + rampData >> ramp; + ui.textEdit->clear(); + for (unsigned i=0; i<ramp.size(); i++) { + ui.textEdit->append(ramp[i].substr(0,ramp[i].size()-1).c_str()); + } +} + +void hv::load_ramp() +{ + // static TWidgetGroup hv_ramp; + Tango::DeviceData rampName; + Tango::DeviceData rampData; + Tango::DevString str = CORBA::string_dup(ui.comboBox->currentText().toStdString().c_str()); + rampName << str; + try { + hvServer->command_inout("LoadRamp", rampName); + } + catch (Tango::DevFailed &e) { + Tango::Except::print_exception(e); + } +} + +void hv::save_ramp() +{ + // static TWidgetGroup hv_ramp; + Tango::DeviceData rampName; + Tango::DeviceData rampData; + Tango::DevVarStringArray *argout = new Tango::DevVarStringArray(); + QStringList ramplist = ui.textEdit->toPlainText().split("\n"); + argout->length(ramplist.size()+1); + (*argout)[0] = CORBA::string_dup(ui.comboBox->currentText().toStdString().c_str()); + for (int i=0; i<ramplist.size(); i++) { + (*argout)[i+1] = CORBA::string_dup((ramplist[i].toStdString()+"\n").c_str()); + cout << ramplist[i].toStdString() << endl; + } + rampData << argout; + try { + hvServer->command_inout("SaveRamp", rampData); + } + catch (Tango::DevFailed &e) { + Tango::Except::print_exception(e); + } + return; +} + +void hv::make_ramp() +{ + // static TWidgetGroup hv_ramp; + Tango::DeviceData rampData; + Tango::DevVarDoubleArray *argout = new Tango::DevVarDoubleArray(); + argout->length(3); + (*argout)[0] = ui.makerampV->value(); + (*argout)[1] = ui.makerampI->value(); + (*argout)[2] = ui.makerampT->value(); + cout << ui.makerampV->value() << endl; + rampData << argout; + try { + hvServer->command_inout("MakeRamp", rampData); + } + catch (Tango::DevFailed &e) { + // cout << "Tango::DevFailed " << e.errors[0].reason << endl; + QMessageBox::information(0, "ERROR", QString(e.errors[0].reason)); + Tango::Except::print_exception(e); + } + catch (...) { + cout << "ERROR: operation failed" << endl; + } + /* + Tango::DeviceData rampName; + QStringList ramplist = ui.textEdit->toPlainText().split("\n"); + for (unsigned i=0; i<ramplist.size(); i++) { + (*argout)[i+1] = CORBA::string_dup((ramplist[i].toStdString()+"\n").c_str()); + cout << ramplist[i].toStdString() << endl; + } + */ + return; +} + +vector <QString> explode(const char separator, const char* all) +{ + unsigned i, j; + vector <QString> v; + char celem[50]; + v.resize(0); + + for(i=0; i < strlen(all); i++) + { + j = 0; + while(all[i] != separator && i < strlen(all) ) + { + celem[j] = all[i]; + i++; + j++; + } + celem[j] = '\0'; + v.push_back(QString(celem) ); + } + return v; +}