-
Claudio Scafuri authored1d9f02b6
E2Sextupole.cpp 83.87 KiB
/*----- PROTECTED REGION ID(E2Sextupole.cpp) ENABLED START -----*/
/* clang-format on */
//=============================================================================
//
// file : E2Sextupole.cpp
//
// description : C++ source for the E2Sextupole class and its commands.
// The class is derived from Device. It represents the
// CORBA servant object which will be accessed from the
// network. All commands which can be executed on the
// E2Sextupole are implemented in this file.
//
// project : Elettra 2.0 pure sextupole magnet device
//
// This file is part of Tango device class.
//
// Tango 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 3 of the License, or
// (at your option) any later version.
//
// Tango 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 Tango. If not, see <http://www.gnu.org/licenses/>.
//
//
// Elettra - Sincrotrone Trieste S.c.p.A.
//
//=============================================================================
// This file is generated by POGO
// (Program Obviously used to Generate tango Object)
//=============================================================================
#include "E2Sextupole.h"
#include "E2SextupoleClass.h"
/* clang-format off */
/*----- PROTECTED REGION END -----*/ // E2Sextupole.cpp
/**
* E2Sextupole class description:
* Elettra 2.0 sextupole magnet device
* Use calibration table handle current/strgenght converstions.
* The magnet device is connected to a power supply tango device , real or simulated.
*
* Based on ESRF EBSmagnet concepts and libraries.
*/
//================================================================
// The following table gives the correspondence
// between command and method names.
//
// Command name | Method name
//================================================================
// State | Inherited (no method)
// Status | Inherited (no method)
// Reset | reset
// ResetResonanceStrength | reset_resonance_strength
// ApplyDesignStrength | apply_design_strength
//================================================================
//================================================================
// Attributes managed are:
//================================================================
// Strength | Tango::DevDouble Scalar
// CorrectionStrength | Tango::DevDouble Scalar
// ResonanceStrength | Tango::DevDouble Scalar
// Current | Tango::DevDouble Scalar
// BeamEnergy | Tango::DevDouble Scalar
// DesignStrength | Tango::DevDouble Scalar
// bbaEnable | Tango::DevBoolean Scalar
// CEHStrength | Tango::DevDouble Scalar
// CEHCorrectionStrength | Tango::DevDouble Scalar
// CEHResonanceStrength | Tango::DevDouble Scalar
// CEVStrength | Tango::DevDouble Scalar
// CEVCorrectionStrength | Tango::DevDouble Scalar
// CEVResonanceStrength | Tango::DevDouble Scalar
// SQStrength | Tango::DevDouble Scalar
// SQCorrectionStrength | Tango::DevDouble Scalar
// SQResonanceStrength | Tango::DevDouble Scalar
// CEHCurrent | Tango::DevDouble Scalar
// CEVCurrent | Tango::DevDouble Scalar
// PolynomA | Tango::DevDouble Spectrum ( max = 3)
// PolynomB | Tango::DevDouble Spectrum ( max = 3)
//================================================================
namespace E2Sextupole_ns
{
/*----- PROTECTED REGION ID(E2Sextupole::namespace_starting) ENABLED START -----*/
/* clang-format on */
// static initializations
/* clang-format off */
/*----- PROTECTED REGION END -----*/ // E2Sextupole::namespace_starting
//--------------------------------------------------------
/**
* Method : E2Sextupole::E2Sextupole()
* Description: Constructors for a Tango device
* implementing the classE2Sextupole
*/
//--------------------------------------------------------
E2Sextupole::E2Sextupole(Tango::DeviceClass *cl, std::string &s)
: TANGO_BASE_CLASS(cl, s.c_str())
{
/*----- PROTECTED REGION ID(E2Sextupole::constructor_1) ENABLED START -----*/
/* clang-format on */
init_device();
/* clang-format off */
/*----- PROTECTED REGION END -----*/ // E2Sextupole::constructor_1
}
//--------------------------------------------------------
E2Sextupole::E2Sextupole(Tango::DeviceClass *cl, const char *s)
: TANGO_BASE_CLASS(cl, s)
{
/*----- PROTECTED REGION ID(E2Sextupole::constructor_2) ENABLED START -----*/
/* clang-format on */
init_device();
/* clang-format off */
/*----- PROTECTED REGION END -----*/ // E2Sextupole::constructor_2
}
//--------------------------------------------------------
E2Sextupole::E2Sextupole(Tango::DeviceClass *cl, const char *s, const char *d)
: TANGO_BASE_CLASS(cl, s, d)
{
/*----- PROTECTED REGION ID(E2Sextupole::constructor_3) ENABLED START -----*/
/* clang-format on */
init_device();
/* clang-format off */
/*----- PROTECTED REGION END -----*/ // E2Sextupole::constructor_3
}
//--------------------------------------------------------
E2Sextupole::~E2Sextupole()
{
delete_device();
}
//--------------------------------------------------------
/**
* Method : E2Sextupole::delete_device()
* Description: will be called at device destruction or at init command
*/
//--------------------------------------------------------
void E2Sextupole::delete_device()
{
DEBUG_STREAM << "E2Sextupole::delete_device() " << device_name << std::endl;
/*----- PROTECTED REGION ID(E2Sextupole::delete_device) ENABLED START -----*/
/* clang-format on */
// Delete device allocated objects
// cev current and cv model
if (cev_state_event_id)
cev_current_dev->unsubscribe_event(cev_state_event_id);
if (cev_current_set_event_id)
cev_current_dev->unsubscribe_event(cev_current_set_event_id);
if (cev_current_event_id)
cev_current_dev->unsubscribe_event(cev_current_event_id);
if (cev_current_cb)
delete cev_current_cb;
if (cev_current_dev)
delete cev_current_dev;
// ceh/v current and ceh/v model and skew quad model
if (ceh_state_event_id)
ceh_current_dev->unsubscribe_event(ceh_state_event_id);
if (ceh_current_set_event_id)
ceh_current_dev->unsubscribe_event(ceh_current_set_event_id);
if (ceh_current_event_id)
ceh_current_dev->unsubscribe_event(ceh_current_event_id);
if (ceh_current_cb)
delete ceh_current_cb;
if (ceh_current_dev)
delete ceh_current_dev;
if (bba_switch_dev)
delete bba_switch_dev;
// main current and sextupole model
if (main_state_event_id)
main_current_dev->unsubscribe_event(main_state_event_id);
if (main_current_set_event_id)
main_current_dev->unsubscribe_event(main_current_set_event_id);
if (main_current_event_id)
main_current_dev->unsubscribe_event(main_current_event_id);
if (main_current_cb)
delete main_current_cb;
if (main_current_dev)
delete main_current_dev;
if (sextupole)
delete sextupole;
if(ceh)
delete ceh;
if(cev)
delete cev;
if(skewquadrupole)
delete skewquadrupole;
/* clang-format off */
/*----- PROTECTED REGION END -----*/ // E2Sextupole::delete_device
delete[] attr_Strength_read;
delete[] attr_CorrectionStrength_read;
delete[] attr_ResonanceStrength_read;
delete[] attr_Current_read;
delete[] attr_BeamEnergy_read;
delete[] attr_DesignStrength_read;
delete[] attr_bbaEnable_read;
delete[] attr_CEHStrength_read;
delete[] attr_CEHCorrectionStrength_read;
delete[] attr_CEHResonanceStrength_read;
delete[] attr_CEVStrength_read;
delete[] attr_CEVCorrectionStrength_read;
delete[] attr_CEVResonanceStrength_read;
delete[] attr_SQStrength_read;
delete[] attr_SQCorrectionStrength_read;
delete[] attr_SQResonanceStrength_read;
delete[] attr_CEHCurrent_read;
delete[] attr_CEVCurrent_read;
delete[] attr_PolynomA_read;
delete[] attr_PolynomB_read;
}
//--------------------------------------------------------
/**
* Method : E2Sextupole::init_device()
* Description: will be called at device initialization.
*/
//--------------------------------------------------------
void E2Sextupole::init_device()
{
DEBUG_STREAM << "E2Sextupole::init_device() create device " << device_name << std::endl;
/*----- PROTECTED REGION ID(E2Sextupole::init_device_before) ENABLED START -----*/
/* clang-format on */
// Initialization before get_device_property() call
/* clang-format off */
set_state(Tango::UNKNOWN);
set_status("Init");
design_strength_initialized = false;
pure_sext = false;
ceh_cev = false;
bba_ready = false;
sext_with_skew = false;
/*----- PROTECTED REGION END -----*/ // E2Sextupole::init_device_before
// Get the device properties from database
get_device_property();
attr_Strength_read = new Tango::DevDouble[1];
attr_CorrectionStrength_read = new Tango::DevDouble[1];
attr_ResonanceStrength_read = new Tango::DevDouble[1];
attr_Current_read = new Tango::DevDouble[1];
attr_BeamEnergy_read = new Tango::DevDouble[1];
attr_DesignStrength_read = new Tango::DevDouble[1];
attr_bbaEnable_read = new Tango::DevBoolean[1];
attr_CEHStrength_read = new Tango::DevDouble[1];
attr_CEHCorrectionStrength_read = new Tango::DevDouble[1];
attr_CEHResonanceStrength_read = new Tango::DevDouble[1];
attr_CEVStrength_read = new Tango::DevDouble[1];
attr_CEVCorrectionStrength_read = new Tango::DevDouble[1];
attr_CEVResonanceStrength_read = new Tango::DevDouble[1];
attr_SQStrength_read = new Tango::DevDouble[1];
attr_SQCorrectionStrength_read = new Tango::DevDouble[1];
attr_SQResonanceStrength_read = new Tango::DevDouble[1];
attr_CEHCurrent_read = new Tango::DevDouble[1];
attr_CEVCurrent_read = new Tango::DevDouble[1];
attr_PolynomA_read = new Tango::DevDouble[3];
attr_PolynomB_read = new Tango::DevDouble[3];
// No longer if mandatory property not set.
if (mandatoryNotDefined)
return;
/*----- PROTECTED REGION ID(E2Sextupole::init_device) ENABLED START -----*/
/* clang-format on */
// Initialize device
/* clang-format off */
//examine EmbbeddedConfiguration and set the configration flags
if (embeddedConfiguration == "pure_sext")
pure_sext = true;
if (embeddedConfiguration == "ceh_cev")
ceh_cev = true;
if (embeddedConfiguration == "bba_ready")
bba_ready = true;
if (embeddedConfiguration == "sext_with_skew")
sext_with_skew = true;
if (!(pure_sext || ceh_cev || bba_ready || sext_with_skew)) {
set_state(Tango::UNKNOWN);
set_status("wrong EmebddedConfiguration property");
ERROR_STREAM << "wrong EmbeddedConfiguration property: "
<< embeddedConfiguration
<< " [ pure_sext | ceh_cev | bba_ready | sext_with_skew ]";
return; //init failed!
}
bba_switch_dev = nullptr;
main_current_dev = nullptr;
main_current_cb = nullptr;
main_current_event_id = 0;
main_current_set_event_id = 0;
main_state_event_id = 0;
main_set_current.resize(1, 0.0);
main_set_strength.resize(1,0.0);
main_current_state = Tango::OFF; //safe guess
ceh_current_dev = nullptr;
ceh_current_cb = nullptr;
ceh_current_event_id = 0;
ceh_current_set_event_id = 0;
ceh_state_event_id = 0;
ceh_set_current.resize(1, 0.0);
ceh_set_strength.resize(1,0.0);
ceh_current_state = Tango::OFF; //safe guess
ceh_design_strength = 0.0; //safe guess
cev_current_dev = nullptr;
cev_current_cb = nullptr;
cev_current_event_id = 0;
cev_current_set_event_id = 0;
cev_state_event_id = 0;
cev_set_current.resize(1, 0.0);
cev_set_strength.resize(1,0.0);
cev_current_state = Tango::OFF; //safe guess
cev_design_strength = 0.0;
// creat proxy for main sextupole coil power supply
try{
main_current_dev = new Tango::DeviceProxy(currentDevice);
}
catch (Tango::DevFailed &ex){
ERROR_STREAM << "failed to create Tango device proxy for main current device: "
<< currentDevice;
set_state(Tango::UNKNOWN);
std::string st = get_status();
st += "\nfailed to create Tango device proxy for CurrentDevice";
set_status(st);
return;
}
//create MagnetModel::Sextupole - handles calibration tables and interpolations
// we do not use the EBS scheme with global properties... yet
//TODO: fix/determine format and handling of Elettra 2.0 calibrations
sextupole = nullptr;
try {
std::string meas_strength_file_name = calibrationPath + "/" + calibrationFileName;
std::string param_file_name = calibrationPath + "/" + parameterFileName;
sextupole = new MagnetModel::PureSextupole();
sextupole->init(true,1.0, meas_strength_file_name, param_file_name, magnetName);
} catch (std::exception &e) {
std::cerr << "fatalerror "<< e.what() << std::endl;
ERROR_STREAM << "failed to create sextupole model " << currentDevice;
set_state(Tango::UNKNOWN);
set_status("failed to create sextupole model CurrentDevice");
return;
}
//create MagnetModel::Corrector - handles calibration tables and interpolations
// we do not use the EBS scheme with global properties... yet
//TODO: fix/determine format and handling of Elettra 2.0 calibrations
ceh = nullptr;
try {
std::string meas_strength_file_name = calibrationPath + "/" + cEHCalibrationFileName;
std::string param_file_name = calibrationPath + "/" + parameterFileName;
ceh = new MagnetModel::Corrector();
ceh->init(true,1.0, meas_strength_file_name, param_file_name, cEHName);
} catch (std::exception &e) {
std::cerr << "fatalerror "<< e.what() << std::endl;
ERROR_STREAM << "failed to create CEH corrector model " << currentDevice;
set_state(Tango::UNKNOWN);
set_status("failed to create CEH corrector model CurrentDevice");
return;
}
cev = nullptr;
try {
std::string meas_strength_file_name = calibrationPath + "/" + cEVCalibrationFileName;
std::string param_file_name = calibrationPath + "/" + parameterFileName;
cev = new MagnetModel::Corrector();
cev->init(true,1.0, meas_strength_file_name, param_file_name, cEVName);
} catch (std::exception &e) {
std::cerr << "fatalerror "<< e.what() << std::endl;
ERROR_STREAM << "failed to create CEV corrector model " << currentDevice;
set_state(Tango::UNKNOWN);
set_status("failed to create CEV corrector model CurrentDevice");
return;
}
//create MagnetModel::Quadrupole - handles calibration tables and interpolations
// we do not use the EBS scheme with global properties... yet
//TODO: fix/determine format and handling of Elettra 2.0 calibrations
// check also for congruent configuration of properties
skewquadrupole = nullptr;
try {
std::string meas_strength_file_name = calibrationPath + "/" + sQCalibrationFileName;
std::string param_file_name = calibrationPath + "/" + parameterFileName;
skewquadrupole = new MagnetModel::Quadrupole();
skewquadrupole->init(true,1.0, meas_strength_file_name, param_file_name, magnetName);
} catch (std::exception &e) {
std::cerr << "fatalerror "<< e.what() << std::endl;
ERROR_STREAM << "failed to create embedded skew quadrupole model " << sQCalibrationFileName;
set_state(Tango::UNKNOWN);
set_status("failed to create sembedded skew quadrupole model");
return;
}
if (!pure_sext){ //pure sextupole are not connected to psceh and pscev!
try{
ceh_current_dev = new Tango::DeviceProxy(psCehDeviceName); //also used for skewquadrupole, permanently or when bba switch active
}
catch (Tango::DevFailed &ex){
ERROR_STREAM << "failed to create Tango device proxy for CEH device: "
<< psCehDeviceName;
set_state(Tango::UNKNOWN);
std::string st = get_status();
st += "\nfailed to create Tango device proxy for psCehDeviceName";
set_status(st);
return;
}
try{
cev_current_dev = new Tango::DeviceProxy(psCevDeviceName);
}
catch (Tango::DevFailed &ex){
ERROR_STREAM << "failed to create Tango device proxy for CEV device: "
<< psCevDeviceName;
set_state(Tango::UNKNOWN);
std::string st = get_status();
st += "\nfailed to create Tango device proxy for psCevDeviceName";
set_status(st);
return;
}
}
if(bba_ready){
try{
bba_switch_dev = new Tango::DeviceProxy(bbaSwitchDeviceName);
}
catch (Tango::DevFailed &ex){
ERROR_STREAM << "failed to create Tango device proxy for main BBA switch device: "
<< bbaSwitchDeviceName;
set_state(Tango::UNKNOWN);
std::string st = get_status();
st += "\nfailed to create Tango device proxy for bbaSwitchDeviceName";
set_status(st);
return;
}
}
// init energy
*attr_BeamEnergy_read = default_beam_energy;
Tango::WAttribute &cat = get_device_attr()->get_w_attr_by_name("BeamEnergy");
cat.set_write_value(default_beam_energy);
calc_rigidity(default_beam_energy);
//get WAtrirbute for handling cross dependencies
mainStrengthAtt = &get_device_attr()->get_w_attr_by_name("Strength");
mainCorrectionAtt = &get_device_attr()->get_w_attr_by_name("CorrectionStrength");
mainResonanceAtt = &get_device_attr()->get_w_attr_by_name("ResonanceStrength");
mainCursetAtt = &(get_device_attr()->get_w_attr_by_name("Current"));
cehStrengthAtt = &get_device_attr()->get_w_attr_by_name("CehStrength");
cehCorrectionAtt = &get_device_attr()->get_w_attr_by_name("CehCorrectionStrength");
cehResonanceAtt = &get_device_attr()->get_w_attr_by_name("CehResonanceStrength");
cehCursetAtt = &(get_device_attr()->get_w_attr_by_name("CeHCurrent"));
cevStrengthAtt = &get_device_attr()->get_w_attr_by_name("CevStrength");
cevCorrectionAtt = &get_device_attr()->get_w_attr_by_name("CevCorrectionStrength");
cevResonanceAtt = &get_device_attr()->get_w_attr_by_name("CevResonanceStrength");
cevCursetAtt = &(get_device_attr()->get_w_attr_by_name("CeVCurrent"));
// force state to OFF, it will be update by the power supplies
set_state(Tango::OFF);
set_status("init device ok");
/*----- PROTECTED REGION END -----*/ // E2Sextupole::init_device
}
//--------------------------------------------------------
/**
* Method : E2Sextupole::get_device_property()
* Description: Read database to initialize property data members.
*/
//--------------------------------------------------------
void E2Sextupole::get_device_property()
{
/*----- PROTECTED REGION ID(E2Sextupole::get_device_property_before) ENABLED START -----*/
/* clang-format on */
// Initialize property data members
/* clang-format off */
/*----- PROTECTED REGION END -----*/ // E2Sextupole::get_device_property_before
mandatoryNotDefined = false;
// Read device properties from database.
Tango::DbData dev_prop;
dev_prop.push_back(Tango::DbDatum("BbaSwitchAttribute"));
dev_prop.push_back(Tango::DbDatum("BbaSwitchDeviceName"));
dev_prop.push_back(Tango::DbDatum("CEHCalibrationFileName"));
dev_prop.push_back(Tango::DbDatum("CEHDeviceName"));
dev_prop.push_back(Tango::DbDatum("CEHName"));
dev_prop.push_back(Tango::DbDatum("CEVCalibrationFileName"));
dev_prop.push_back(Tango::DbDatum("CEVDeviceName"));
dev_prop.push_back(Tango::DbDatum("CEVName"));
dev_prop.push_back(Tango::DbDatum("CalibrationFileName"));
dev_prop.push_back(Tango::DbDatum("CalibrationPath"));
dev_prop.push_back(Tango::DbDatum("CurrentDevice"));
dev_prop.push_back(Tango::DbDatum("EmbeddedConfiguration"));
dev_prop.push_back(Tango::DbDatum("MagnetName"));
dev_prop.push_back(Tango::DbDatum("Model"));
dev_prop.push_back(Tango::DbDatum("ParameterFileName"));
dev_prop.push_back(Tango::DbDatum("PsCehDeviceName"));
dev_prop.push_back(Tango::DbDatum("PsCevDeviceName"));
dev_prop.push_back(Tango::DbDatum("SQCalibrationFileName"));
dev_prop.push_back(Tango::DbDatum("SerialNumber"));
dev_prop.push_back(Tango::DbDatum("SkewQuad"));
// is there at least one property to be read ?
if (dev_prop.size()>0)
{
// Call database and extract values
if (Tango::Util::instance()->_UseDb==true)
get_db_device()->get_property(dev_prop);
// get instance on E2SextupoleClass to get class property
Tango::DbDatum def_prop, cl_prop;
E2SextupoleClass *ds_class =
(static_cast<E2SextupoleClass *>(get_device_class()));
int i = -1;
// Try to initialize BbaSwitchAttribute from class property
cl_prop = ds_class->get_class_property(dev_prop[++i].name);
if (cl_prop.is_empty()==false) cl_prop >> bbaSwitchAttribute;
else {
// Try to initialize BbaSwitchAttribute from default device value
def_prop = ds_class->get_default_device_property(dev_prop[i].name);
if (def_prop.is_empty()==false) def_prop >> bbaSwitchAttribute;
}
// And try to extract BbaSwitchAttribute value from database
if (dev_prop[i].is_empty()==false) dev_prop[i] >> bbaSwitchAttribute;
// Try to initialize BbaSwitchDeviceName from class property
cl_prop = ds_class->get_class_property(dev_prop[++i].name);
if (cl_prop.is_empty()==false) cl_prop >> bbaSwitchDeviceName;
else {
// Try to initialize BbaSwitchDeviceName from default device value
def_prop = ds_class->get_default_device_property(dev_prop[i].name);
if (def_prop.is_empty()==false) def_prop >> bbaSwitchDeviceName;
}
// And try to extract BbaSwitchDeviceName value from database
if (dev_prop[i].is_empty()==false) dev_prop[i] >> bbaSwitchDeviceName;
// Try to initialize CEHCalibrationFileName from class property
cl_prop = ds_class->get_class_property(dev_prop[++i].name);
if (cl_prop.is_empty()==false) cl_prop >> cEHCalibrationFileName;
else {
// Try to initialize CEHCalibrationFileName from default device value
def_prop = ds_class->get_default_device_property(dev_prop[i].name);
if (def_prop.is_empty()==false) def_prop >> cEHCalibrationFileName;
}
// And try to extract CEHCalibrationFileName value from database
if (dev_prop[i].is_empty()==false) dev_prop[i] >> cEHCalibrationFileName;
// Property StartDsPath is mandatory, check if has been defined in database.
check_mandatory_property(cl_prop, dev_prop[i]);
// Try to initialize CEHDeviceName from class property
cl_prop = ds_class->get_class_property(dev_prop[++i].name);
if (cl_prop.is_empty()==false) cl_prop >> cEHDeviceName;
else {
// Try to initialize CEHDeviceName from default device value
def_prop = ds_class->get_default_device_property(dev_prop[i].name);
if (def_prop.is_empty()==false) def_prop >> cEHDeviceName;
}
// And try to extract CEHDeviceName value from database
if (dev_prop[i].is_empty()==false) dev_prop[i] >> cEHDeviceName;
// Try to initialize CEHName from class property
cl_prop = ds_class->get_class_property(dev_prop[++i].name);
if (cl_prop.is_empty()==false) cl_prop >> cEHName;
else {
// Try to initialize CEHName from default device value
def_prop = ds_class->get_default_device_property(dev_prop[i].name);
if (def_prop.is_empty()==false) def_prop >> cEHName;
}
// And try to extract CEHName value from database
if (dev_prop[i].is_empty()==false) dev_prop[i] >> cEHName;
// Try to initialize CEVCalibrationFileName from class property
cl_prop = ds_class->get_class_property(dev_prop[++i].name);
if (cl_prop.is_empty()==false) cl_prop >> cEVCalibrationFileName;
else {
// Try to initialize CEVCalibrationFileName from default device value
def_prop = ds_class->get_default_device_property(dev_prop[i].name);
if (def_prop.is_empty()==false) def_prop >> cEVCalibrationFileName;
}
// And try to extract CEVCalibrationFileName value from database
if (dev_prop[i].is_empty()==false) dev_prop[i] >> cEVCalibrationFileName;
// Property StartDsPath is mandatory, check if has been defined in database.
check_mandatory_property(cl_prop, dev_prop[i]);
// Try to initialize CEVDeviceName from class property
cl_prop = ds_class->get_class_property(dev_prop[++i].name);
if (cl_prop.is_empty()==false) cl_prop >> cEVDeviceName;
else {
// Try to initialize CEVDeviceName from default device value
def_prop = ds_class->get_default_device_property(dev_prop[i].name);
if (def_prop.is_empty()==false) def_prop >> cEVDeviceName;
}
// And try to extract CEVDeviceName value from database
if (dev_prop[i].is_empty()==false) dev_prop[i] >> cEVDeviceName;
// Try to initialize CEVName from class property
cl_prop = ds_class->get_class_property(dev_prop[++i].name);
if (cl_prop.is_empty()==false) cl_prop >> cEVName;
else {
// Try to initialize CEVName from default device value
def_prop = ds_class->get_default_device_property(dev_prop[i].name);
if (def_prop.is_empty()==false) def_prop >> cEVName;
}
// And try to extract CEVName value from database
if (dev_prop[i].is_empty()==false) dev_prop[i] >> cEVName;
// Try to initialize CalibrationFileName from class property
cl_prop = ds_class->get_class_property(dev_prop[++i].name);
if (cl_prop.is_empty()==false) cl_prop >> calibrationFileName;
else {
// Try to initialize CalibrationFileName from default device value
def_prop = ds_class->get_default_device_property(dev_prop[i].name);
if (def_prop.is_empty()==false) def_prop >> calibrationFileName;
}
// And try to extract CalibrationFileName value from database
if (dev_prop[i].is_empty()==false) dev_prop[i] >> calibrationFileName;
// Property StartDsPath is mandatory, check if has been defined in database.
check_mandatory_property(cl_prop, dev_prop[i]);
// Try to initialize CalibrationPath from class property
cl_prop = ds_class->get_class_property(dev_prop[++i].name);
if (cl_prop.is_empty()==false) cl_prop >> calibrationPath;
else {
// Try to initialize CalibrationPath from default device value
def_prop = ds_class->get_default_device_property(dev_prop[i].name);
if (def_prop.is_empty()==false) def_prop >> calibrationPath;
}
// And try to extract CalibrationPath value from database
if (dev_prop[i].is_empty()==false) dev_prop[i] >> calibrationPath;
// Try to initialize CurrentDevice from class property
cl_prop = ds_class->get_class_property(dev_prop[++i].name);
if (cl_prop.is_empty()==false) cl_prop >> currentDevice;
else {
// Try to initialize CurrentDevice from default device value
def_prop = ds_class->get_default_device_property(dev_prop[i].name);
if (def_prop.is_empty()==false) def_prop >> currentDevice;
}
// And try to extract CurrentDevice value from database
if (dev_prop[i].is_empty()==false) dev_prop[i] >> currentDevice;
// Try to initialize EmbeddedConfiguration from class property
cl_prop = ds_class->get_class_property(dev_prop[++i].name);
if (cl_prop.is_empty()==false) cl_prop >> embeddedConfiguration;
else {
// Try to initialize EmbeddedConfiguration from default device value
def_prop = ds_class->get_default_device_property(dev_prop[i].name);
if (def_prop.is_empty()==false) def_prop >> embeddedConfiguration;
}
// And try to extract EmbeddedConfiguration value from database
if (dev_prop[i].is_empty()==false) dev_prop[i] >> embeddedConfiguration;
// Property StartDsPath is mandatory, check if has been defined in database.
check_mandatory_property(cl_prop, dev_prop[i]);
// Try to initialize MagnetName from class property
cl_prop = ds_class->get_class_property(dev_prop[++i].name);
if (cl_prop.is_empty()==false) cl_prop >> magnetName;
else {
// Try to initialize MagnetName from default device value
def_prop = ds_class->get_default_device_property(dev_prop[i].name);
if (def_prop.is_empty()==false) def_prop >> magnetName;
}
// And try to extract MagnetName value from database
if (dev_prop[i].is_empty()==false) dev_prop[i] >> magnetName;
// Try to initialize Model from class property
cl_prop = ds_class->get_class_property(dev_prop[++i].name);
if (cl_prop.is_empty()==false) cl_prop >> model;
else {
// Try to initialize Model from default device value
def_prop = ds_class->get_default_device_property(dev_prop[i].name);
if (def_prop.is_empty()==false) def_prop >> model;
}
// And try to extract Model value from database
if (dev_prop[i].is_empty()==false) dev_prop[i] >> model;
// Try to initialize ParameterFileName from class property
cl_prop = ds_class->get_class_property(dev_prop[++i].name);
if (cl_prop.is_empty()==false) cl_prop >> parameterFileName;
else {
// Try to initialize ParameterFileName from default device value
def_prop = ds_class->get_default_device_property(dev_prop[i].name);
if (def_prop.is_empty()==false) def_prop >> parameterFileName;
}
// And try to extract ParameterFileName value from database
if (dev_prop[i].is_empty()==false) dev_prop[i] >> parameterFileName;
// Property StartDsPath is mandatory, check if has been defined in database.
check_mandatory_property(cl_prop, dev_prop[i]);
// Try to initialize PsCehDeviceName from class property
cl_prop = ds_class->get_class_property(dev_prop[++i].name);
if (cl_prop.is_empty()==false) cl_prop >> psCehDeviceName;
else {
// Try to initialize PsCehDeviceName from default device value
def_prop = ds_class->get_default_device_property(dev_prop[i].name);
if (def_prop.is_empty()==false) def_prop >> psCehDeviceName;
}
// And try to extract PsCehDeviceName value from database
if (dev_prop[i].is_empty()==false) dev_prop[i] >> psCehDeviceName;
// Try to initialize PsCevDeviceName from class property
cl_prop = ds_class->get_class_property(dev_prop[++i].name);
if (cl_prop.is_empty()==false) cl_prop >> psCevDeviceName;
else {
// Try to initialize PsCevDeviceName from default device value
def_prop = ds_class->get_default_device_property(dev_prop[i].name);
if (def_prop.is_empty()==false) def_prop >> psCevDeviceName;
}
// And try to extract PsCevDeviceName value from database
if (dev_prop[i].is_empty()==false) dev_prop[i] >> psCevDeviceName;
// Try to initialize SQCalibrationFileName from class property
cl_prop = ds_class->get_class_property(dev_prop[++i].name);
if (cl_prop.is_empty()==false) cl_prop >> sQCalibrationFileName;
else {
// Try to initialize SQCalibrationFileName from default device value
def_prop = ds_class->get_default_device_property(dev_prop[i].name);
if (def_prop.is_empty()==false) def_prop >> sQCalibrationFileName;
}
// And try to extract SQCalibrationFileName value from database
if (dev_prop[i].is_empty()==false) dev_prop[i] >> sQCalibrationFileName;
// Property StartDsPath is mandatory, check if has been defined in database.
check_mandatory_property(cl_prop, dev_prop[i]);
// Try to initialize SerialNumber from class property
cl_prop = ds_class->get_class_property(dev_prop[++i].name);
if (cl_prop.is_empty()==false) cl_prop >> serialNumber;
else {
// Try to initialize SerialNumber from default device value
def_prop = ds_class->get_default_device_property(dev_prop[i].name);
if (def_prop.is_empty()==false) def_prop >> serialNumber;
}
// And try to extract SerialNumber value from database
if (dev_prop[i].is_empty()==false) dev_prop[i] >> serialNumber;
// Try to initialize SkewQuad from class property
cl_prop = ds_class->get_class_property(dev_prop[++i].name);
if (cl_prop.is_empty()==false) cl_prop >> skewQuad;
else {
// Try to initialize SkewQuad from default device value
def_prop = ds_class->get_default_device_property(dev_prop[i].name);
if (def_prop.is_empty()==false) def_prop >> skewQuad;
}
// And try to extract SkewQuad value from database
if (dev_prop[i].is_empty()==false) dev_prop[i] >> skewQuad;
}
/*----- PROTECTED REGION ID(E2Sextupole::get_device_property_after) ENABLED START -----*/
/* clang-format on */
// Check device property data members init
/* clang-format off */
/*----- PROTECTED REGION END -----*/ // E2Sextupole::get_device_property_after
}
//--------------------------------------------------------
/**
* Method : E2Sextupole::check_mandatory_property()
* Description: For mandatory properties check if defined in database.
*/
//--------------------------------------------------------
void E2Sextupole::check_mandatory_property(Tango::DbDatum &class_prop, Tango::DbDatum &dev_prop)
{
// Check if all properties are empty
if (class_prop.is_empty() && dev_prop.is_empty())
{
TangoSys_OMemStream tms;
tms << std::endl <<"Property \'" << dev_prop.name;
if (Tango::Util::instance()->_UseDb==true)
tms << "\' is mandatory but not defined in database";
else
tms << "\' is mandatory but cannot be defined without database";
append_status(tms.str());
mandatoryNotDefined = true;
/*----- PROTECTED REGION ID(E2Sextupole::check_mandatory_property) ENABLED START -----*/
/* clang-format on */
std::cerr << tms.str() << " for " << device_name << std::endl;
/* clang-format off */
/*----- PROTECTED REGION END -----*/ // E2Sextupole::check_mandatory_property
}
}
//--------------------------------------------------------
/**
* Method : E2Sextupole::always_executed_hook()
* Description: method always executed before any command is executed
*/
//--------------------------------------------------------
void E2Sextupole::always_executed_hook()
{
DEBUG_STREAM << "E2Sextupole::always_executed_hook() " << device_name << std::endl;
if (mandatoryNotDefined)
{
Tango::Except::throw_exception(
(const char *)"PROPERTY_NOT_SET",
get_status().c_str(),
(const char *)"E2Sextupole::always_executed_hook()");
}
/*----- PROTECTED REGION ID(E2Sextupole::always_executed_hook) ENABLED START -----*/
/* clang-format on */
// code always executed before all requests
/* clang-format off */
/*----- PROTECTED REGION END -----*/ // E2Sextupole::always_executed_hook
}
//--------------------------------------------------------
/**
* Method : E2Sextupole::read_attr_hardware()
* Description: Hardware acquisition for attributes
*/
//--------------------------------------------------------
void E2Sextupole::read_attr_hardware(TANGO_UNUSED(std::vector<long> &attr_list))
{
DEBUG_STREAM << "E2Sextupole::read_attr_hardware(std::vector<long> &attr_list) entering... " << std::endl;
/*----- PROTECTED REGION ID(E2Sextupole::read_attr_hardware) ENABLED START -----*/
/* clang-format on */
// Add your own code
/* clang-format off */
/*----- PROTECTED REGION END -----*/ // E2Sextupole::read_attr_hardware
}
//--------------------------------------------------------
/**
* Method : E2Sextupole::write_attr_hardware()
* Description: Hardware writing for attributes
*/
//--------------------------------------------------------
void E2Sextupole::write_attr_hardware(TANGO_UNUSED(std::vector<long> &attr_list))
{
DEBUG_STREAM << "E2Sextupole::write_attr_hardware(std::vector<long> &attr_list) entering... " << std::endl;
/*----- PROTECTED REGION ID(E2Sextupole::write_attr_hardware) ENABLED START -----*/
/* clang-format on */
// Add your own code
/* clang-format off */
/*----- PROTECTED REGION END -----*/ // E2Sextupole::write_attr_hardware
}
//--------------------------------------------------------
/**
* Read attribute Strength related method
* Description: sextupole strength 1/m^3 ( m-3)
*
* Data type: Tango::DevDouble
* Attr type: Scalar
*/
//--------------------------------------------------------
void E2Sextupole::read_Strength(Tango::Attribute &attr)
{
DEBUG_STREAM << "E2Sextupole::read_Strength(Tango::Attribute &attr) entering... " << std::endl;
/*----- PROTECTED REGION ID(E2Sextupole::read_Strength) ENABLED START -----*/
/* clang-format on */
// Set the attribute value
attr.set_value(attr_Strength_read);
/* clang-format off */
/*----- PROTECTED REGION END -----*/ // E2Sextupole::read_Strength
}
//--------------------------------------------------------
/**
* Write attribute Strength related method
* Description: sextupole strength 1/m^3 ( m-3)
*
* Data type: Tango::DevDouble
* Attr type: Scalar
*/
//--------------------------------------------------------
void E2Sextupole::write_Strength(Tango::WAttribute &attr)
{
DEBUG_STREAM << "E2Sextupole::write_Strength(Tango::WAttribute &attr) entering... " << std::endl;
// Retrieve write value
Tango::DevDouble w_val;
attr.get_write_value(w_val);
/*----- PROTECTED REGION ID(E2Sextupole::write_Strength) ENABLED START -----*/
/* clang-format on */
// Add your own code
/* clang-format off */
omni_mutex_lock guardio(iomutex);
std::vector<double> req_strength;
std::vector<double> curr_out;
req_strength.push_back(w_val);
sextupole->compute_currents(magnet_rigidity, req_strength, curr_out);
Tango::DeviceAttribute watt("Current",curr_out[0]);
main_current_dev->write_attribute(watt);
main_set_strength[0] = w_val;
wValMainCorrStrength = w_val - wValMainResStrength;
mainCorrectionAtt->set_write_value(wValMainCorrStrength);
//catch(std::excpetion &ex){}
/*----- PROTECTED REGION END -----*/ // E2Sextupole::write_Strength
}
//--------------------------------------------------------
/**
* Read attribute CorrectionStrength related method
*
*
* Data type: Tango::DevDouble
* Attr type: Scalar
*/
//--------------------------------------------------------
void E2Sextupole::read_CorrectionStrength(Tango::Attribute &attr)
{
DEBUG_STREAM << "E2Sextupole::read_CorrectionStrength(Tango::Attribute &attr) entering... " << std::endl;
/*----- PROTECTED REGION ID(E2Sextupole::read_CorrectionStrength) ENABLED START -----*/
/* clang-format on */
// Set the attribute value
attr.set_value(attr_CorrectionStrength_read);
/* clang-format off */
/*----- PROTECTED REGION END -----*/ // E2Sextupole::read_CorrectionStrength
}
//--------------------------------------------------------
/**
* Write attribute CorrectionStrength related method
*
*
* Data type: Tango::DevDouble
* Attr type: Scalar
*/
//--------------------------------------------------------
void E2Sextupole::write_CorrectionStrength(Tango::WAttribute &attr)
{
DEBUG_STREAM << "E2Sextupole::write_CorrectionStrength(Tango::WAttribute &attr) entering... " << std::endl;
// Retrieve write value
Tango::DevDouble w_val;
attr.get_write_value(w_val);
/*----- PROTECTED REGION ID(E2Sextupole::write_CorrectionStrength) ENABLED START -----*/
/* clang-format on */
// Add your own code
/* clang-format off */
/* TODO : implement is_set_point valid and exploit it!
if(!is_setpoint_valid(w_val)) {
attr.rollback();
return;
}
*/
omni_mutex_lock guardio(iomutex);
Tango::DevDouble newStrength;
//mainResonanceAtt->get_write_value(_resStrength);
newStrength = w_val + wValMainResStrength + *attr_DesignStrength_read;
std::vector<double> req_strength;
std::vector<double> curr_out;
req_strength.push_back(newStrength);
sextupole->compute_currents(magnet_rigidity, req_strength, curr_out);
Tango::DeviceAttribute watt("Current", curr_out[0]);
main_current_dev->write_attribute(watt);
wValMainCorrStrength = w_val;
main_set_strength[0] = newStrength;
mainStrengthAtt->set_write_value(main_set_strength[0]);
/*----- PROTECTED REGION END -----*/ // E2Sextupole::write_CorrectionStrength
}
//--------------------------------------------------------
/**
* Read attribute ResonanceStrength related method
*
*
* Data type: Tango::DevDouble
* Attr type: Scalar
*/
//--------------------------------------------------------
void E2Sextupole::read_ResonanceStrength(Tango::Attribute &attr)
{
DEBUG_STREAM << "E2Sextupole::read_ResonanceStrength(Tango::Attribute &attr) entering... " << std::endl;
/*----- PROTECTED REGION ID(E2Sextupole::read_ResonanceStrength) ENABLED START -----*/
/* clang-format on */
// Set the attribute value
attr.set_value(attr_ResonanceStrength_read);
/* clang-format off */
/*----- PROTECTED REGION END -----*/ // E2Sextupole::read_ResonanceStrength
}
//--------------------------------------------------------
/**
* Write attribute ResonanceStrength related method
*
*
* Data type: Tango::DevDouble
* Attr type: Scalar
*/
//--------------------------------------------------------
void E2Sextupole::write_ResonanceStrength(Tango::WAttribute &attr)
{
DEBUG_STREAM << "E2Sextupole::write_ResonanceStrength(Tango::WAttribute &attr) entering... " << std::endl;
// Retrieve write value
Tango::DevDouble w_val;
attr.get_write_value(w_val);
/*----- PROTECTED REGION ID(E2Sextupole::write_ResonanceStrength) ENABLED START -----*/
/* clang-format on */
// Add your own code
/* clang-format off */
/* TODO : implement is_set_point valid and exploit it!
if(!is_setpoint_valid(w_val)) {
attr.rollback();
return;
}
*/
omni_mutex_lock guardio(iomutex);
Tango::DevDouble newStrength;
newStrength = w_val + wValMainCorrStrength + *attr_DesignStrength_read;
std::vector<double> req_strength;
std::vector<double> curr_out;
req_strength.push_back(newStrength);
sextupole->compute_currents(magnet_rigidity, req_strength, curr_out);
Tango::DeviceAttribute watt("Current", curr_out[0]);
main_current_dev->write_attribute(watt);
wValMainResStrength = w_val;
*attr_ResonanceStrength_read = w_val;
main_set_strength[0] = newStrength;
mainStrengthAtt->set_write_value(main_set_strength[0]);
/*----- PROTECTED REGION END -----*/ // E2Sextupole::write_ResonanceStrength
}
//--------------------------------------------------------
/**
* Read attribute Current related method
*
*
* Data type: Tango::DevDouble
* Attr type: Scalar
*/
//--------------------------------------------------------
void E2Sextupole::read_Current(Tango::Attribute &attr)
{
DEBUG_STREAM << "E2Sextupole::read_Current(Tango::Attribute &attr) entering... " << std::endl;
/*----- PROTECTED REGION ID(E2Sextupole::read_Current) ENABLED START -----*/
/* clang-format on */
// Set the attribute value
attr.set_value(attr_Current_read);
/* clang-format off */
/*----- PROTECTED REGION END -----*/ // E2Sextupole::read_Current
}
//--------------------------------------------------------
/**
* Write attribute Current related method
*
*
* Data type: Tango::DevDouble
* Attr type: Scalar
*/
//--------------------------------------------------------
void E2Sextupole::write_Current(Tango::WAttribute &attr)
{
DEBUG_STREAM << "E2Sextupole::write_Current(Tango::WAttribute &attr) entering... " << std::endl;
// Retrieve write value
Tango::DevDouble w_val;
attr.get_write_value(w_val);
/*----- PROTECTED REGION ID(E2Sextupole::write_Current) ENABLED START -----*/
/* clang-format on */
// Add your own code
/* clang-format off */
Tango::DeviceAttribute watt("Current",w_val);
main_current_dev->write_attribute(watt);
/*----- PROTECTED REGION END -----*/ // E2Sextupole::write_Current
}
//--------------------------------------------------------
/**
* Read attribute BeamEnergy related method
* Description: Electron beam energy in eV. Used to calculate magnetic rigidity in strength calculations.
*
* Data type: Tango::DevDouble
* Attr type: Scalar
*/
//--------------------------------------------------------
void E2Sextupole::read_BeamEnergy(Tango::Attribute &attr)
{
DEBUG_STREAM << "E2Sextupole::read_BeamEnergy(Tango::Attribute &attr) entering... " << std::endl;
/*----- PROTECTED REGION ID(E2Sextupole::read_BeamEnergy) ENABLED START -----*/
/* clang-format on */
// Set the attribute value
attr.set_value(attr_BeamEnergy_read);
/* clang-format off */
/*----- PROTECTED REGION END -----*/ // E2Sextupole::read_BeamEnergy
}
//--------------------------------------------------------
/**
* Write attribute BeamEnergy related method
* Description: Electron beam energy in eV. Used to calculate magnetic rigidity in strength calculations.
*
* Data type: Tango::DevDouble
* Attr type: Scalar
*/
//--------------------------------------------------------
void E2Sextupole::write_BeamEnergy(Tango::WAttribute &attr)
{
DEBUG_STREAM << "E2Sextupole::write_BeamEnergy(Tango::WAttribute &attr) entering... " << std::endl;
// Retrieve write value
Tango::DevDouble w_val;
attr.get_write_value(w_val);
/*----- PROTECTED REGION ID(E2Sextupole::write_BeamEnergy) ENABLED START -----*/
/* clang-format on */
// Add your own code
/* clang-format off */
*attr_BeamEnergy_read = w_val;
calc_rigidity(w_val);
/*----- PROTECTED REGION END -----*/ // E2Sextupole::write_BeamEnergy
}
//--------------------------------------------------------
/**
* Read attribute DesignStrength related method
* Description: sextupole design strength 1/m^3 ( m-3). The strenght reqiured by the nominal optic
* The attribute is memorized , expert only.
*
* Data type: Tango::DevDouble
* Attr type: Scalar
*/
//--------------------------------------------------------
void E2Sextupole::read_DesignStrength(Tango::Attribute &attr)
{
DEBUG_STREAM << "E2Sextupole::read_DesignStrength(Tango::Attribute &attr) entering... " << std::endl;
/*----- PROTECTED REGION ID(E2Sextupole::read_DesignStrength) ENABLED START -----*/
/* clang-format on */
// Set the attribute value
attr.set_value(attr_DesignStrength_read);
/* clang-format off */
/*----- PROTECTED REGION END -----*/ // E2Sextupole::read_DesignStrength
}
//--------------------------------------------------------
/**
* Write attribute DesignStrength related method
* Description: sextupole design strength 1/m^3 ( m-3). The strenght reqiured by the nominal optic
* The attribute is memorized , expert only.
*
* Data type: Tango::DevDouble
* Attr type: Scalar
*/
//--------------------------------------------------------
void E2Sextupole::write_DesignStrength(Tango::WAttribute &attr)
{
DEBUG_STREAM << "E2Sextupole::write_DesignStrength(Tango::WAttribute &attr) entering... " << std::endl;
// Retrieve write value
Tango::DevDouble w_val;
attr.get_write_value(w_val);
/*----- PROTECTED REGION ID(E2Sextupole::write_DesignStrength) ENABLED START -----*/
/* clang-format on */
// Add your own code
/* clang-format off */
*attr_DesignStrength_read = w_val;
if (design_strength_initialized == false){ // only with a value of DesignStrength init process can be completed
design_strength_initialized = true;
init_strengths();
subscribe_events();
}
else init_strengths();
/*----- PROTECTED REGION END -----*/ // E2Sextupole::write_DesignStrength
}
//--------------------------------------------------------
/**
* Read attribute bbaEnable related method
* Description: Read / and set the rele that modfy the sestupole cabling. If true the skew quadrupole QS is enabled, If fals the embedded horizontal corrector CEH is enabled.
* If the magnet is permanetly cabled with the embedded skew quadrupole, the aiitrbute is always true nd is not writable.
*
* Data type: Tango::DevBoolean
* Attr type: Scalar
*/
//--------------------------------------------------------
void E2Sextupole::read_bbaEnable(Tango::Attribute &attr)
{
DEBUG_STREAM << "E2Sextupole::read_bbaEnable(Tango::Attribute &attr) entering... " << std::endl;
/*----- PROTECTED REGION ID(E2Sextupole::read_bbaEnable) ENABLED START -----*/
/* clang-format on */
// Set the attribute value
if (bba_switch_dev){
Tango::DeviceAttribute da;
da=bba_switch_dev->read_attribute(bbaSwitchAttribute);
da >> *attr_bbaEnable_read;
}
attr.set_value(attr_bbaEnable_read);
/* clang-format off */
/*----- PROTECTED REGION END -----*/ // E2Sextupole::read_bbaEnable
}
//--------------------------------------------------------
/**
* Write attribute bbaEnable related method
* Description: Read / and set the rele that modfy the sestupole cabling. If true the skew quadrupole QS is enabled, If fals the embedded horizontal corrector CEH is enabled.
* If the magnet is permanetly cabled with the embedded skew quadrupole, the aiitrbute is always true nd is not writable.
*
* Data type: Tango::DevBoolean
* Attr type: Scalar
*/
//--------------------------------------------------------
void E2Sextupole::write_bbaEnable(Tango::WAttribute &attr)
{
DEBUG_STREAM << "E2Sextupole::write_bbaEnable(Tango::WAttribute &attr) entering... " << std::endl;
// Retrieve write value
Tango::DevBoolean w_val;
attr.get_write_value(w_val);
/*----- PROTECTED REGION ID(E2Sextupole::write_bbaEnable) ENABLED START -----*/
/* clang-format on */
if (bba_switch_dev){
Tango::DeviceAttribute watt(bbaSwitchAttribute,w_val);
bba_switch_dev->write_attribute(watt);
}
// Add your own code
/* clang-format off */
/*----- PROTECTED REGION END -----*/ // E2Sextupole::write_bbaEnable
}
//--------------------------------------------------------
/**
* Read attribute CEHStrength related method
* Description: embbeded corrector horizontal kick
*
* Data type: Tango::DevDouble
* Attr type: Scalar
*/
//--------------------------------------------------------
void E2Sextupole::read_CEHStrength(Tango::Attribute &attr)
{
DEBUG_STREAM << "E2Sextupole::read_CEHStrength(Tango::Attribute &attr) entering... " << std::endl;
/*----- PROTECTED REGION ID(E2Sextupole::read_CEHStrength) ENABLED START -----*/
/* clang-format on */
// Set the attribute value
attr.set_value(attr_CEHStrength_read);
/* clang-format off */
/*----- PROTECTED REGION END -----*/ // E2Sextupole::read_CEHStrength
}
//--------------------------------------------------------
/**
* Write attribute CEHStrength related method
* Description: embbeded corrector horizontal kick
*
* Data type: Tango::DevDouble
* Attr type: Scalar
*/
//--------------------------------------------------------
void E2Sextupole::write_CEHStrength(Tango::WAttribute &attr)
{
DEBUG_STREAM << "E2Sextupole::write_CEHStrength(Tango::WAttribute &attr) entering... " << std::endl;
// Retrieve write value
Tango::DevDouble w_val;
attr.get_write_value(w_val);
/*----- PROTECTED REGION ID(E2Sextupole::write_CEHStrength) ENABLED START -----*/
/* clang-format on */
// Add your own code
omni_mutex_lock guardio(iomutex);
std::vector<double> req_strength;
std::vector<double> curr_out;
req_strength.push_back(w_val);
ceh->compute_currents(magnet_rigidity, req_strength, curr_out);
Tango::DeviceAttribute watt("Current",curr_out[0]);
ceh_current_dev->write_attribute(watt);
ceh_set_strength[0] = w_val;
wValCehCorrStrength = w_val - wValCehResStrength;
/* clang-format off */
/*----- PROTECTED REGION END -----*/ // E2Sextupole::write_CEHStrength
}
//--------------------------------------------------------
/**
* Read attribute CEHCorrectionStrength related method
*
*
* Data type: Tango::DevDouble
* Attr type: Scalar
*/
//--------------------------------------------------------
void E2Sextupole::read_CEHCorrectionStrength(Tango::Attribute &attr)
{
DEBUG_STREAM << "E2Sextupole::read_CEHCorrectionStrength(Tango::Attribute &attr) entering... " << std::endl;
/*----- PROTECTED REGION ID(E2Sextupole::read_CEHCorrectionStrength) ENABLED START -----*/
/* clang-format on */
// Set the attribute value
attr.set_value(attr_CEHCorrectionStrength_read);
/* clang-format off */
/*----- PROTECTED REGION END -----*/ // E2Sextupole::read_CEHCorrectionStrength
}
//--------------------------------------------------------
/**
* Write attribute CEHCorrectionStrength related method
*
*
* Data type: Tango::DevDouble
* Attr type: Scalar
*/
//--------------------------------------------------------
void E2Sextupole::write_CEHCorrectionStrength(Tango::WAttribute &attr)
{
DEBUG_STREAM << "E2Sextupole::write_CEHCorrectionStrength(Tango::WAttribute &attr) entering... " << std::endl;
// Retrieve write value
Tango::DevDouble w_val;
attr.get_write_value(w_val);
/*----- PROTECTED REGION ID(E2Sextupole::write_CEHCorrectionStrength) ENABLED START -----*/
/* clang-format on */
// Add your own code
omni_mutex_lock guardio(iomutex);
Tango::DevDouble newStrength;
//resonanceAtt->get_write_value(_resStrength);
newStrength = w_val + wValCehResStrength + ceh_design_strength;
std::vector<double> req_strength;
std::vector<double> curr_out;
req_strength.push_back(newStrength);
ceh->compute_currents(magnet_rigidity, req_strength, curr_out);
Tango::DeviceAttribute watt("Current", curr_out[0]);
ceh_current_dev->write_attribute(watt);
wValCehCorrStrength = w_val;
ceh_set_strength[0] = newStrength;
cehStrengthAtt->set_write_value(ceh_set_strength[0]);
/* clang-format off */
/*----- PROTECTED REGION END -----*/ // E2Sextupole::write_CEHCorrectionStrength
}
//--------------------------------------------------------
/**
* Read attribute CEHResonanceStrength related method
*
*
* Data type: Tango::DevDouble
* Attr type: Scalar
*/
//--------------------------------------------------------
void E2Sextupole::read_CEHResonanceStrength(Tango::Attribute &attr)
{
DEBUG_STREAM << "E2Sextupole::read_CEHResonanceStrength(Tango::Attribute &attr) entering... " << std::endl;
/*----- PROTECTED REGION ID(E2Sextupole::read_CEHResonanceStrength) ENABLED START -----*/
/* clang-format on */
// Set the attribute value
attr.set_value(attr_CEHResonanceStrength_read);
/* clang-format off */
/*----- PROTECTED REGION END -----*/ // E2Sextupole::read_CEHResonanceStrength
}
//--------------------------------------------------------
/**
* Write attribute CEHResonanceStrength related method
*
*
* Data type: Tango::DevDouble
* Attr type: Scalar
*/
//--------------------------------------------------------
void E2Sextupole::write_CEHResonanceStrength(Tango::WAttribute &attr)
{
DEBUG_STREAM << "E2Sextupole::write_CEHResonanceStrength(Tango::WAttribute &attr) entering... " << std::endl;
// Retrieve write value
Tango::DevDouble w_val;
attr.get_write_value(w_val);
/*----- PROTECTED REGION ID(E2Sextupole::write_CEHResonanceStrength) ENABLED START -----*/
/* clang-format on */
// Add your own code
omni_mutex_lock guardio(iomutex);
Tango::DevDouble newStrength;
newStrength = w_val + wValCehCorrStrength + ceh_design_strength;
std::vector<double> req_strength;
std::vector<double> curr_out;
req_strength.push_back(newStrength);
ceh->compute_currents(magnet_rigidity, req_strength, curr_out);
Tango::DeviceAttribute watt("Current", curr_out[0]);
ceh_current_dev->write_attribute(watt);
wValCehResStrength = w_val;
*attr_CEHResonanceStrength_read = w_val;
ceh_set_strength[0] = newStrength;
cehStrengthAtt->set_write_value(ceh_set_strength[0]);
/* clang-format off */
/*----- PROTECTED REGION END -----*/ // E2Sextupole::write_CEHResonanceStrength
}
//--------------------------------------------------------
/**
* Read attribute CEVStrength related method
* Description: embbeded corrector vertical kick
*
* Data type: Tango::DevDouble
* Attr type: Scalar
*/
//--------------------------------------------------------
void E2Sextupole::read_CEVStrength(Tango::Attribute &attr)
{
DEBUG_STREAM << "E2Sextupole::read_CEVStrength(Tango::Attribute &attr) entering... " << std::endl;
/*----- PROTECTED REGION ID(E2Sextupole::read_CEVStrength) ENABLED START -----*/
/* clang-format on */
// Set the attribute value
attr.set_value(attr_CEVStrength_read);
/* clang-format off */
/*----- PROTECTED REGION END -----*/ // E2Sextupole::read_CEVStrength
}
//--------------------------------------------------------
/**
* Write attribute CEVStrength related method
* Description: embbeded corrector vertical kick
*
* Data type: Tango::DevDouble
* Attr type: Scalar
*/
//--------------------------------------------------------
void E2Sextupole::write_CEVStrength(Tango::WAttribute &attr)
{
DEBUG_STREAM << "E2Sextupole::write_CEVStrength(Tango::WAttribute &attr) entering... " << std::endl;
// Retrieve write value
Tango::DevDouble w_val;
attr.get_write_value(w_val);
/*----- PROTECTED REGION ID(E2Sextupole::write_CEVStrength) ENABLED START -----*/
/* clang-format on */
// Add your own code
omni_mutex_lock guardio(iomutex);
std::vector<double> req_strength;
std::vector<double> curr_out;
req_strength.push_back(w_val);
cev->compute_currents(magnet_rigidity, req_strength, curr_out);
Tango::DeviceAttribute watt("Current",curr_out[0]);
cev_current_dev->write_attribute(watt);
cev_set_strength[0] = w_val;
wValCevCorrStrength = w_val - wValCevResStrength;
/* clang-format off */
/*----- PROTECTED REGION END -----*/ // E2Sextupole::write_CEVStrength
}
//--------------------------------------------------------
/**
* Read attribute CEVCorrectionStrength related method
*
*
* Data type: Tango::DevDouble
* Attr type: Scalar
*/
//--------------------------------------------------------
void E2Sextupole::read_CEVCorrectionStrength(Tango::Attribute &attr)
{
DEBUG_STREAM << "E2Sextupole::read_CEVCorrectionStrength(Tango::Attribute &attr) entering... " << std::endl;
/*----- PROTECTED REGION ID(E2Sextupole::read_CEVCorrectionStrength) ENABLED START -----*/
/* clang-format on */
// Set the attribute value
attr.set_value(attr_CEVCorrectionStrength_read);
/* clang-format off */
/*----- PROTECTED REGION END -----*/ // E2Sextupole::read_CEVCorrectionStrength
}
//--------------------------------------------------------
/**
* Write attribute CEVCorrectionStrength related method
*
*
* Data type: Tango::DevDouble
* Attr type: Scalar
*/
//--------------------------------------------------------
void E2Sextupole::write_CEVCorrectionStrength(Tango::WAttribute &attr)
{
DEBUG_STREAM << "E2Sextupole::write_CEVCorrectionStrength(Tango::WAttribute &attr) entering... " << std::endl;
// Retrieve write value
Tango::DevDouble w_val;
attr.get_write_value(w_val);
/*----- PROTECTED REGION ID(E2Sextupole::write_CEVCorrectionStrength) ENABLED START -----*/
/* clang-format on */
// Add your own code
omni_mutex_lock guardio(iomutex);
Tango::DevDouble newStrength;
//resonanceAtt->get_write_value(_resStrength);
newStrength = w_val + wValCevResStrength + cev_design_strength;
std::vector<double> req_strength;
std::vector<double> curr_out;
req_strength.push_back(newStrength);
cev->compute_currents(magnet_rigidity, req_strength, curr_out);
Tango::DeviceAttribute watt("Current", curr_out[0]);
cev_current_dev->write_attribute(watt);
wValCevCorrStrength = w_val;
cev_set_strength[0] = newStrength;
cevStrengthAtt->set_write_value(cev_set_strength[0]);
/* clang-format off */
/*----- PROTECTED REGION END -----*/ // E2Sextupole::write_CEVCorrectionStrength
}
//--------------------------------------------------------
/**
* Read attribute CEVResonanceStrength related method
*
*
* Data type: Tango::DevDouble
* Attr type: Scalar
*/
//--------------------------------------------------------
void E2Sextupole::read_CEVResonanceStrength(Tango::Attribute &attr)
{
DEBUG_STREAM << "E2Sextupole::read_CEVResonanceStrength(Tango::Attribute &attr) entering... " << std::endl;
/*----- PROTECTED REGION ID(E2Sextupole::read_CEVResonanceStrength) ENABLED START -----*/
/* clang-format on */
// Set the attribute value
attr.set_value(attr_CEVResonanceStrength_read);
/* clang-format off */
/*----- PROTECTED REGION END -----*/ // E2Sextupole::read_CEVResonanceStrength
}
//--------------------------------------------------------
/**
* Write attribute CEVResonanceStrength related method
*
*
* Data type: Tango::DevDouble
* Attr type: Scalar
*/
//--------------------------------------------------------
void E2Sextupole::write_CEVResonanceStrength(Tango::WAttribute &attr)
{
DEBUG_STREAM << "E2Sextupole::write_CEVResonanceStrength(Tango::WAttribute &attr) entering... " << std::endl;
// Retrieve write value
Tango::DevDouble w_val;
attr.get_write_value(w_val);
/*----- PROTECTED REGION ID(E2Sextupole::write_CEVResonanceStrength) ENABLED START -----*/
/* clang-format on */
// Add your own code
omni_mutex_lock guardio(iomutex);
Tango::DevDouble newStrength;
newStrength = w_val + wValCevCorrStrength + cev_design_strength;
std::vector<double> req_strength;
std::vector<double> curr_out;
req_strength.push_back(newStrength);
cev->compute_currents(magnet_rigidity, req_strength, curr_out);
Tango::DeviceAttribute watt("Current", curr_out[0]);
cev_current_dev->write_attribute(watt);
wValCevResStrength = w_val;
*attr_CEVResonanceStrength_read = w_val;
cev_set_strength[0] = newStrength;
cevStrengthAtt->set_write_value(cev_set_strength[0]);
/* clang-format off */
/*----- PROTECTED REGION END -----*/ // E2Sextupole::write_CEVResonanceStrength
}
//--------------------------------------------------------
/**
* Read attribute SQStrength related method
* Description: embbeded skew quadrupole strength
*
* Data type: Tango::DevDouble
* Attr type: Scalar
*/
//--------------------------------------------------------
void E2Sextupole::read_SQStrength(Tango::Attribute &attr)
{
DEBUG_STREAM << "E2Sextupole::read_SQStrength(Tango::Attribute &attr) entering... " << std::endl;
/*----- PROTECTED REGION ID(E2Sextupole::read_SQStrength) ENABLED START -----*/
/* clang-format on */
// Set the attribute value
attr.set_value(attr_SQStrength_read);
/* clang-format off */
/*----- PROTECTED REGION END -----*/ // E2Sextupole::read_SQStrength
}
//--------------------------------------------------------
/**
* Write attribute SQStrength related method
* Description: embbeded skew quadrupole strength
*
* Data type: Tango::DevDouble
* Attr type: Scalar
*/
//--------------------------------------------------------
void E2Sextupole::write_SQStrength(Tango::WAttribute &attr)
{
DEBUG_STREAM << "E2Sextupole::write_SQStrength(Tango::WAttribute &attr) entering... " << std::endl;
// Retrieve write value
Tango::DevDouble w_val;
attr.get_write_value(w_val);
/*----- PROTECTED REGION ID(E2Sextupole::write_SQStrength) ENABLED START -----*/
/* clang-format on */
// Add your own code
/* clang-format off */
/*----- PROTECTED REGION END -----*/ // E2Sextupole::write_SQStrength
}
//--------------------------------------------------------
/**
* Read attribute SQCorrectionStrength related method
*
*
* Data type: Tango::DevDouble
* Attr type: Scalar
*/
//--------------------------------------------------------
void E2Sextupole::read_SQCorrectionStrength(Tango::Attribute &attr)
{
DEBUG_STREAM << "E2Sextupole::read_SQCorrectionStrength(Tango::Attribute &attr) entering... " << std::endl;
/*----- PROTECTED REGION ID(E2Sextupole::read_SQCorrectionStrength) ENABLED START -----*/
/* clang-format on */
// Set the attribute value
attr.set_value(attr_SQCorrectionStrength_read);
/* clang-format off */
/*----- PROTECTED REGION END -----*/ // E2Sextupole::read_SQCorrectionStrength
}
//--------------------------------------------------------
/**
* Write attribute SQCorrectionStrength related method
*
*
* Data type: Tango::DevDouble
* Attr type: Scalar
*/
//--------------------------------------------------------
void E2Sextupole::write_SQCorrectionStrength(Tango::WAttribute &attr)
{
DEBUG_STREAM << "E2Sextupole::write_SQCorrectionStrength(Tango::WAttribute &attr) entering... " << std::endl;
// Retrieve write value
Tango::DevDouble w_val;
attr.get_write_value(w_val);
/*----- PROTECTED REGION ID(E2Sextupole::write_SQCorrectionStrength) ENABLED START -----*/
/* clang-format on */
// Add your own code
/* clang-format off */
/*----- PROTECTED REGION END -----*/ // E2Sextupole::write_SQCorrectionStrength
}
//--------------------------------------------------------
/**
* Read attribute SQResonanceStrength related method
*
*
* Data type: Tango::DevDouble
* Attr type: Scalar
*/
//--------------------------------------------------------
void E2Sextupole::read_SQResonanceStrength(Tango::Attribute &attr)
{
DEBUG_STREAM << "E2Sextupole::read_SQResonanceStrength(Tango::Attribute &attr) entering... " << std::endl;
/*----- PROTECTED REGION ID(E2Sextupole::read_SQResonanceStrength) ENABLED START -----*/
/* clang-format on */
// Set the attribute value
attr.set_value(attr_SQResonanceStrength_read);
/* clang-format off */
/*----- PROTECTED REGION END -----*/ // E2Sextupole::read_SQResonanceStrength
}
//--------------------------------------------------------
/**
* Write attribute SQResonanceStrength related method
*
*
* Data type: Tango::DevDouble
* Attr type: Scalar
*/
//--------------------------------------------------------
void E2Sextupole::write_SQResonanceStrength(Tango::WAttribute &attr)
{
DEBUG_STREAM << "E2Sextupole::write_SQResonanceStrength(Tango::WAttribute &attr) entering... " << std::endl;
// Retrieve write value
Tango::DevDouble w_val;
attr.get_write_value(w_val);
/*----- PROTECTED REGION ID(E2Sextupole::write_SQResonanceStrength) ENABLED START -----*/
/* clang-format on */
// Add your own code
/* clang-format off */
/*----- PROTECTED REGION END -----*/ // E2Sextupole::write_SQResonanceStrength
}
//--------------------------------------------------------
/**
* Read attribute CEHCurrent related method
*
*
* Data type: Tango::DevDouble
* Attr type: Scalar
*/
//--------------------------------------------------------
void E2Sextupole::read_CEHCurrent(Tango::Attribute &attr)
{
DEBUG_STREAM << "E2Sextupole::read_CEHCurrent(Tango::Attribute &attr) entering... " << std::endl;
/*----- PROTECTED REGION ID(E2Sextupole::read_CEHCurrent) ENABLED START -----*/
/* clang-format on */
// Set the attribute value
attr.set_value(attr_CEHCurrent_read);
/* clang-format off */
/*----- PROTECTED REGION END -----*/ // E2Sextupole::read_CEHCurrent
}
//--------------------------------------------------------
/**
* Write attribute CEHCurrent related method
*
*
* Data type: Tango::DevDouble
* Attr type: Scalar
*/
//--------------------------------------------------------
void E2Sextupole::write_CEHCurrent(Tango::WAttribute &attr)
{
DEBUG_STREAM << "E2Sextupole::write_CEHCurrent(Tango::WAttribute &attr) entering... " << std::endl;
// Retrieve write value
Tango::DevDouble w_val;
attr.get_write_value(w_val);
/*----- PROTECTED REGION ID(E2Sextupole::write_CEHCurrent) ENABLED START -----*/
/* clang-format on */
// Add your own code
Tango::DeviceAttribute watt("Current",w_val);
ceh_current_dev->write_attribute(watt);
/* clang-format off */
/*----- PROTECTED REGION END -----*/ // E2Sextupole::write_CEHCurrent
}
//--------------------------------------------------------
/**
* Read attribute CEVCurrent related method
*
*
* Data type: Tango::DevDouble
* Attr type: Scalar
*/
//--------------------------------------------------------
void E2Sextupole::read_CEVCurrent(Tango::Attribute &attr)
{
DEBUG_STREAM << "E2Sextupole::read_CEVCurrent(Tango::Attribute &attr) entering... " << std::endl;
/*----- PROTECTED REGION ID(E2Sextupole::read_CEVCurrent) ENABLED START -----*/
/* clang-format on */
// Set the attribute value
attr.set_value(attr_CEVCurrent_read);
/* clang-format off */
/*----- PROTECTED REGION END -----*/ // E2Sextupole::read_CEVCurrent
}
//--------------------------------------------------------
/**
* Write attribute CEVCurrent related method
*
*
* Data type: Tango::DevDouble
* Attr type: Scalar
*/
//--------------------------------------------------------
void E2Sextupole::write_CEVCurrent(Tango::WAttribute &attr)
{
DEBUG_STREAM << "E2Sextupole::write_CEVCurrent(Tango::WAttribute &attr) entering... " << std::endl;
// Retrieve write value
Tango::DevDouble w_val;
attr.get_write_value(w_val);
/*----- PROTECTED REGION ID(E2Sextupole::write_CEVCurrent) ENABLED START -----*/
/* clang-format on */
// Add your own code
Tango::DeviceAttribute watt("Current",w_val);
cev_current_dev->write_attribute(watt);
/* clang-format off */
/*----- PROTECTED REGION END -----*/ // E2Sextupole::write_CEVCurrent
}
//--------------------------------------------------------
/**
* Read attribute PolynomA related method
* Description: array of normal multipole components
*
* Data type: Tango::DevDouble
* Attr type: Spectrum max = 3
*/
//--------------------------------------------------------
void E2Sextupole::read_PolynomA(Tango::Attribute &attr)
{
DEBUG_STREAM << "E2Sextupole::read_PolynomA(Tango::Attribute &attr) entering... " << std::endl;
/*----- PROTECTED REGION ID(E2Sextupole::read_PolynomA) ENABLED START -----*/
/* clang-format on */
// Set the attribute value
attr.set_value(attr_PolynomA_read, PolynomAAttrib::X_DATA_SIZE);
/* clang-format off */
/*----- PROTECTED REGION END -----*/ // E2Sextupole::read_PolynomA
}
//--------------------------------------------------------
/**
* Read attribute PolynomB related method
* Description: array of skew multipole components
*
* Data type: Tango::DevDouble
* Attr type: Spectrum max = 3
*/
//--------------------------------------------------------
void E2Sextupole::read_PolynomB(Tango::Attribute &attr)
{
DEBUG_STREAM << "E2Sextupole::read_PolynomB(Tango::Attribute &attr) entering... " << std::endl;
/*----- PROTECTED REGION ID(E2Sextupole::read_PolynomB) ENABLED START -----*/
/* clang-format on */
// Set the attribute value
attr.set_value(attr_PolynomB_read, PolynomBAttrib::X_DATA_SIZE);
/* clang-format off */
/*----- PROTECTED REGION END -----*/ // E2Sextupole::read_PolynomB
}
//--------------------------------------------------------
/**
* Method : E2Sextupole::add_dynamic_attributes()
* Description: Create the dynamic attributes if any
* for specified device.
*/
//--------------------------------------------------------
void E2Sextupole::add_dynamic_attributes()
{
/*----- PROTECTED REGION ID(E2Sextupole::add_dynamic_attributes) ENABLED START -----*/
/* clang-format on */
// Add your own code to create and add dynamic attributes if any
/* clang-format off */
/*----- PROTECTED REGION END -----*/ // E2Sextupole::add_dynamic_attributes
}
//--------------------------------------------------------
/**
* Command Reset related method
* Description: reset the corrector
*
*/
//--------------------------------------------------------
void E2Sextupole::reset()
{
DEBUG_STREAM << "E2Sextupole::Reset() - " << device_name << std::endl;
/*----- PROTECTED REGION ID(E2Sextupole::reset) ENABLED START -----*/
/* clang-format on */
// Add your own code
/* clang-format off */
/*----- PROTECTED REGION END -----*/ // E2Sextupole::reset
}
//--------------------------------------------------------
/**
* Command ResetResonanceStrength related method
* Description: Transfer ResonanceStranght to CorrectionStrength and set ResonanceStrength to 0. Strngth is not modified
*
*/
//--------------------------------------------------------
void E2Sextupole::reset_resonance_strength()
{
DEBUG_STREAM << "E2Sextupole::ResetResonanceStrength() - " << device_name << std::endl;
/*----- PROTECTED REGION ID(E2Sextupole::reset_resonance_strength) ENABLED START -----*/
/* clang-format on */
// Add your own code
/* clang-format off */
//transfer resonance strength to correction strength and than force to 0 resonance strength
omni_mutex_lock guardio(iomutex);
wValMainCorrStrength += wValMainResStrength;
wValMainResStrength = 0.0;
mainCorrectionAtt->set_write_value(wValMainCorrStrength);
*attr_CorrectionStrength_read = wValMainCorrStrength;
mainResonanceAtt->set_write_value(0.0);
*attr_ResonanceStrength_read = 0.0;
/*----- PROTECTED REGION END -----*/ // E2Sextupole::reset_resonance_strength
}
//--------------------------------------------------------
/**
* Command ApplyDesignStrength related method
* Description: Apply the memorized DesignStrength strenght to the magnet.
*
*/
//--------------------------------------------------------
void E2Sextupole::apply_design_strength()
{
DEBUG_STREAM << "E2Sextupole::ApplyDesignStrength() - " << device_name << std::endl;
/*----- PROTECTED REGION ID(E2Sextupole::apply_design_strength) ENABLED START -----*/
/* clang-format on */
// Add your own code
/* clang-format off */
/*----- PROTECTED REGION END -----*/ // E2Sextupole::apply_design_strength
}
//--------------------------------------------------------
/**
* Method : E2Sextupole::add_dynamic_commands()
* Description: Create the dynamic commands if any
* for specified device.
*/
//--------------------------------------------------------
void E2Sextupole::add_dynamic_commands()
{
/*----- PROTECTED REGION ID(E2Sextupole::add_dynamic_commands) ENABLED START -----*/
/* clang-format on */
// Add your own code to create and add dynamic commands if any
/* clang-format off */
/*----- PROTECTED REGION END -----*/ // E2Sextupole::add_dynamic_commands
}
/*----- PROTECTED REGION ID(E2Sextupole::namespace_ending) ENABLED START -----*/
/* clang-format on */
// Additional Methods
/* clang-format off */
//--------------------------------------------------------
void E2Sextupole::calc_rigidity(const double& energy)
{
//claculate magnet ridity for electrons at energy (a.k.a. Brho)
magnet_rigidity = sqrt(energy*energy - E0*E0)/c_light;
magnet_rigidity_inv = 1.0/magnet_rigidity;
//std::cout << magnet_rigidity << " simplified:" << (energy/1e9)*3.3356 << std::endl;
}
void E2Sextupole::set_main_current_write(const double& curr)
{
mainCursetAtt->set_write_value(curr);
main_set_current[0] = curr;
}
void E2Sextupole::set_ceh_current_write(const double& curr)
{
cehCursetAtt->set_write_value(curr);
ceh_set_current[0] = curr;
}
void E2Sextupole::set_cev_current_write(const double& curr)
{
cevCursetAtt->set_write_value(curr);
cev_set_current[0] = curr;
}
// ------------------------------------------------------------
void E2Sextupole::init_strengths(void) // initialize strengths from power supply value TODO: separate read and set values
{
Tango::DeviceAttribute da;
try {
da = main_current_dev->read_attribute("Current");
vector<Tango::DevDouble> outval;
da >> outval;
std::vector<Tango::DevDouble> _current;
std::vector<Tango::DevDouble> _strength;
_current.push_back(outval[1]); //use set value of current
sextupole->compute_strengths(magnet_rigidity_inv, _current, _strength);
mainCursetAtt->set_write_value(_current);
main_set_current[0] = _current[0];
mainStrengthAtt->set_write_value(_strength[0]);
*attr_Strength_read = _strength[0];
main_set_strength[0] = _strength[0];
Tango::DevDouble corr = _strength[0] - *attr_DesignStrength_read;
mainCorrectionAtt->set_write_value(corr);
*attr_CorrectionStrength_read = corr;
wValMainCorrStrength = corr;
mainResonanceAtt->set_write_value(0.0); // start with resonance strength always at 0!
*attr_ResonanceStrength_read = 0.0;
wValMainResStrength = 0.0;
} catch (Tango::DevFailed &e) {
Tango::Except::print_exception(e);
}
try {
da = ceh_current_dev->read_attribute("Current");
vector<Tango::DevDouble> outval;
da >> outval;
std::vector<Tango::DevDouble> _current;
std::vector<Tango::DevDouble> _strength;
_current.push_back(outval[1]); //use set value of current
ceh->compute_strengths(magnet_rigidity_inv, _current, _strength);
cehCursetAtt->set_write_value(_current);
ceh_set_current[0] = _current[0];
cehStrengthAtt->set_write_value(_strength[0]);
*attr_CEHStrength_read = _strength[0];
ceh_set_strength[0] = _strength[0];
Tango::DevDouble corr = _strength[0];
cehCorrectionAtt->set_write_value(corr);
*attr_CEHCorrectionStrength_read = corr;
wValCehCorrStrength = corr;
cehResonanceAtt->set_write_value(0.0); // start with resonance strength always at 0!
*attr_CEHResonanceStrength_read = 0.0;
wValCehResStrength = 0.0;
} catch (Tango::DevFailed &e) {
Tango::Except::print_exception(e);
}
try {
da = cev_current_dev->read_attribute("Current");
vector<Tango::DevDouble> outval;
da >> outval;
std::vector<Tango::DevDouble> _current;
std::vector<Tango::DevDouble> _strength;
_current.push_back(outval[1]); //use set value of current
cev->compute_strengths(magnet_rigidity_inv, _current, _strength);
cevCursetAtt->set_write_value(_current);
cev_set_current[0] = _current[0];
cevStrengthAtt->set_write_value(_strength[0]);
*attr_CEVStrength_read = _strength[0];
cev_set_strength[0] = _strength[0];
Tango::DevDouble corr = _strength[0];
cevCorrectionAtt->set_write_value(corr);
*attr_CEHCorrectionStrength_read = corr;
wValCevCorrStrength = corr;
cevResonanceAtt->set_write_value(0.0); // start with resonance strength always at 0!
*attr_CEVResonanceStrength_read = 0.0;
wValCevResStrength = 0.0;
} catch (Tango::DevFailed &e) {
Tango::Except::print_exception(e);
}
}
//------------------------------------------------------------
// handle changes of power supplies read current (actual current)
void E2Sextupole::update_values_read_main(void)
{
if (isnan(*attr_Current_read)){ //handle error
attr_Strength_read[0] = NAN;
return;
}
INFO_STREAM << "update values read main";
std::vector<Tango::DevDouble> read_curr;
std::vector<Tango::DevDouble> read_strength;
omni_mutex_lock guardio(iomutex);
read_curr.push_back(*attr_Current_read);
sextupole->compute_strengths(magnet_rigidity_inv, read_curr, read_strength);
attr_Strength_read[0] = read_strength[0];
attr_CorrectionStrength_read[0] = attr_Strength_read[0] -( attr_DesignStrength_read[0] + attr_ResonanceStrength_read[0]);
}
void E2Sextupole::update_values_read_ceh(void)
{
if (isnan(*attr_CEHCurrent_read)){ //handle error
attr_CEHStrength_read[0] = NAN;
return;
}
INFO_STREAM << "update values read ceh";
std::vector<Tango::DevDouble> read_curr;
std::vector<Tango::DevDouble> read_strength;
omni_mutex_lock guardio(iomutex);
read_curr.push_back(*attr_CEHCurrent_read);
ceh->compute_strengths(magnet_rigidity_inv, read_curr, read_strength);
attr_CEHStrength_read[0] = read_strength[0];
attr_CEHCorrectionStrength_read[0] = attr_CEHStrength_read[0] - ( ceh_design_strength + attr_CEHResonanceStrength_read[0]);
}
void E2Sextupole::update_values_read_cev(void)
{
if (isnan(*attr_CEVCurrent_read)){ //handle error
attr_CEHStrength_read[0] = NAN;
return;
}
INFO_STREAM << "update values read cev";
std::vector<Tango::DevDouble> read_curr;
std::vector<Tango::DevDouble> read_strength;
omni_mutex_lock guardio(iomutex);
read_curr.push_back(*attr_CEVCurrent_read);
cev->compute_strengths(magnet_rigidity_inv, read_curr, read_strength);
attr_CEVStrength_read[0] = read_strength[0];
attr_CEVCorrectionStrength_read[0] = attr_CEVStrength_read[0] - ( cev_design_strength + attr_CEVResonanceStrength_read[0]);
}
//------------------------------------------------------------
// handle change of write set point of power supplies current
void E2Sextupole::update_values_write_main(void)
{
if (isnan(*attr_Current_read)){ //handle error
attr_Strength_read[0] = NAN;
return;
}
INFO_STREAM << "update values write main";
std::vector<Tango::DevDouble> read_curr;
std::vector<Tango::DevDouble> read_strength;
omni_mutex_lock guardio(iomutex);
read_curr.push_back(main_set_current[0]); //must use the write value
sextupole->compute_strengths(magnet_rigidity_inv, read_curr, read_strength);
wValMainCorrStrength = read_strength[0] - (wValMainResStrength + *attr_DesignStrength_read);
mainCorrectionAtt->set_write_value(wValMainCorrStrength);
}
// handle change of write set point of ceh power supply current
void E2Sextupole::update_values_write_ceh(void)
{
INFO_STREAM << "update values write ceh";
std::vector<Tango::DevDouble> read_curr;
std::vector<Tango::DevDouble> read_strength;
omni_mutex_lock guardio(iomutex);
read_curr.push_back(ceh_set_current[0]); //must use the write value
ceh->compute_strengths(magnet_rigidity_inv, read_curr, read_strength);
wValCehCorrStrength = read_strength[0] - (wValCehResStrength + ceh_design_strength);
cehCorrectionAtt->set_write_value(wValCehCorrStrength);
}
// handle change of write set point of cev power supply current
void E2Sextupole::update_values_write_cev(void)
{
INFO_STREAM << "update values write cev";
std::vector<Tango::DevDouble> read_curr;
std::vector<Tango::DevDouble> read_strength;
omni_mutex_lock guardio(iomutex);
read_curr.push_back(cev_set_current[0]); //must use the write value
cev->compute_strengths(magnet_rigidity_inv, read_curr, read_strength);
wValCevCorrStrength = read_strength[0] - (wValCevResStrength + cev_design_strength);
cevCorrectionAtt->set_write_value(wValCevCorrStrength);
}
//------------------------------------------------------------
// handles change of power supples state - may just filter values
void E2Sextupole::update_values_state(void)
{
//handle state - status
//INFO_STREAM << "update values state";
switch (get_state()) {
case Tango::ON:
set_status("On");
break;
case Tango::OFF:
set_status("Off");
break;
case Tango::FAULT:
set_status("Fault");
break;
case Tango::RUNNING:
set_status("Running");
break;
case Tango::MOVING:
set_status("Moving");
break;
default:
set_status("Unknown");
}
}
void E2Sextupole::subscribe_events(void)
{
try{
EventSource evsrc= MainPS;
main_current_cb = new MainCurrentEventCallback(this, evsrc);
main_current_event_id = main_current_dev->subscribe_event("current",Tango::CHANGE_EVENT,main_current_cb);
main_current_set_event_id = main_current_dev->subscribe_event("currentSet",Tango::CHANGE_EVENT,main_current_cb);
main_state_event_id = main_current_dev->subscribe_event("State",Tango::CHANGE_EVENT,main_current_cb);
}
catch(Tango::DevFailed &ex){
main_current_cb = nullptr;
ERROR_STREAM << "failed to subscribe Tango events for " << currentDevice;
set_state(Tango::UNKNOWN);
set_status("failed to subscribe Tango events for CurrentDevice");
return;
}
try{
EventSource evsrc= CeHPS;
ceh_current_cb = new MainCurrentEventCallback(this, evsrc);
ceh_current_event_id = ceh_current_dev->subscribe_event("current",Tango::CHANGE_EVENT, ceh_current_cb);
ceh_current_set_event_id = ceh_current_dev->subscribe_event("currentSet",Tango::CHANGE_EVENT, ceh_current_cb);
ceh_state_event_id = ceh_current_dev->subscribe_event("State",Tango::CHANGE_EVENT, ceh_current_cb);
}
catch(Tango::DevFailed &ex){
ceh_current_cb = nullptr;
ERROR_STREAM << "failed to subscribe Tango events for " << cEHDeviceName;
set_state(Tango::UNKNOWN);
set_status("failed to subscribe Tango events for cehDeviceName");
return;
}
try{
EventSource evsrc= CeVPS;
cev_current_cb = new MainCurrentEventCallback(this, evsrc);
cev_current_event_id = cev_current_dev->subscribe_event("current",Tango::CHANGE_EVENT, cev_current_cb);
cev_current_set_event_id = cev_current_dev->subscribe_event("currentSet",Tango::CHANGE_EVENT, cev_current_cb);
cev_state_event_id = cev_current_dev->subscribe_event("State",Tango::CHANGE_EVENT,cev_current_cb);
}
catch(Tango::DevFailed &ex){
ceh_current_cb = nullptr;
ERROR_STREAM << "failed to subscribe Tango events for " << cEVDeviceName;
set_state(Tango::UNKNOWN);
set_status("failed to subscribe Tango events for cevDeviceName");
return;
}
}
/* trick to start sunbscrition afetr some delay
void E2Sextupole::delayed_subscribe(int delayMs)
#include <thread>
#include <chrono>
{
std::thread([this, delayMs]() {
std::this_thread::sleep_for(std::chrono::milliseconds(delayMs));
this->subscribe_events(); // Call the method after the delay
}).detach(); // Detach the thread to run independently
}
*/
//------------------------------------------------------------
//------------------------------------------------------------
MainCurrentEventCallback::MainCurrentEventCallback(E2Sextupole* sext, EventSource evsrc) //callback constructor
{
e2_sext = sext;
source = evsrc;
}
void MainCurrentEventCallback::push_event(Tango::EventData* ev) //callback core method
{
bool update_read_main = false;
bool update_write_main = false;
bool update_read_ceh = false;
bool update_write_ceh = false;
bool update_read_cev = false;
bool update_write_cev = false;
bool update_state = false;
if (ev->err) {
//std::cerr << ev->err << " " << ev->attr_name << std::endl;
e2_sext->set_state(Tango::FAULT);
e2_sext->set_status("event error");
*e2_sext->attr_Current_read = NAN;
e2_sext->update_values_read_main();
return;
}
{
omni_mutex_lock guardio(e2_sext->iomutex);
//TODO add method to update the corrector when on value changes
std::string fullattrname = ev->attr_name;
std::size_t pos = fullattrname.find_last_of("/");
std::string attrname = fullattrname.substr(pos + 1);
if (attrname == "current") {
switch (source){
case MainPS:
*(ev->attr_value) >> *(e2_sext->attr_Current_read); update_read_main = true;break;
case CeHPS:
*(ev->attr_value) >> *(e2_sext->attr_CEHCurrent_read); update_read_ceh = true; break;
case CeVPS:
*(ev->attr_value) >> *(e2_sext->attr_CEVCurrent_read); update_read_cev = true; break;
}
}
if (attrname == "currentset") {
Tango::DevDouble newcurr;
*(ev->attr_value) >> newcurr;
switch (source){
case MainPS:
e2_sext->set_main_current_write(newcurr); update_write_main = true; break;
case CeHPS:
e2_sext->set_ceh_current_write(newcurr); update_write_ceh = true; break;
case CeVPS:
e2_sext->set_cev_current_write(newcurr); update_write_cev = true; break;
}
}
if (attrname == "state") {
Tango::DevState st;
*(ev->attr_value) >> st;
switch (source){
case MainPS:
e2_sext->main_current_state = st;
e2_sext->set_state(st); break;
case CeHPS:
e2_sext->ceh_current_state = st;
break;
case CeVPS:
e2_sext->cev_current_state = st;
break;
}
update_state = true;
}
}
if (update_read_main) e2_sext->update_values_read_main();
if (update_write_main) e2_sext->update_values_write_main();
if (update_read_ceh) e2_sext->update_values_read_ceh();
if (update_write_ceh) e2_sext->update_values_write_ceh();
if (update_read_cev) e2_sext->update_values_read_cev();
if (update_write_cev) e2_sext->update_values_write_cev();
if (update_state) e2_sext->update_values_state();
}
//--------------------------------------------------------
/*----- PROTECTED REGION END -----*/ // E2Sextupole::namespace_ending
} // namespace