/*----- PROTECTED REGION ID(SimulatedE2PS.cpp) ENABLED START -----*/ /* clang-format on */ //============================================================================= // // file : SimulatedE2PS.cpp // // description : C++ source for the SimulatedE2PS 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 // SimulatedE2PS are implemented in this file. // // project : SimulatedE2PS // // 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/>. // // // //============================================================================= // This file is generated by POGO // (Program Obviously used to Generate tango Object) //============================================================================= #include "SimulatedE2PS.h" #include "SimulatedE2PSClass.h" /* clang-format off */ /*----- PROTECTED REGION END -----*/ // SimulatedE2PS.cpp /** * SimulatedE2PS class description: * Simulated power supply for Elettra 2.0 tests (digiltal twin). * Tango interface Loosely based on NGPS tango device */ //================================================================ // The following table gives the correspondence // between command and method names. // // Command name | Method name //================================================================ // State | Inherited (no method) // Status | Inherited (no method) // On | on // Off | off // Reset | reset // StartCycling | start_cycling // Abort | abort // Fault | fault //================================================================ //================================================================ // Attributes managed are: //================================================================ // current | Tango::DevDouble Scalar // voltage | Tango::DevDouble Scalar // currentSet | Tango::DevDouble Scalar //================================================================ namespace SimulatedE2PS_ns { /*----- PROTECTED REGION ID(SimulatedE2PS::namespace_starting) ENABLED START -----*/ /* clang-format on */ // static initializations /* clang-format off */ /*----- PROTECTED REGION END -----*/ // SimulatedE2PS::namespace_starting //-------------------------------------------------------- /** * Method : SimulatedE2PS::SimulatedE2PS() * Description: Constructors for a Tango device * implementing the classSimulatedE2PS */ //-------------------------------------------------------- SimulatedE2PS::SimulatedE2PS(Tango::DeviceClass *cl, std::string &s) : TANGO_BASE_CLASS(cl, s.c_str()) { /*----- PROTECTED REGION ID(SimulatedE2PS::constructor_1) ENABLED START -----*/ /* clang-format on */ init_device(); /* clang-format off */ /*----- PROTECTED REGION END -----*/ // SimulatedE2PS::constructor_1 } //-------------------------------------------------------- SimulatedE2PS::SimulatedE2PS(Tango::DeviceClass *cl, const char *s) : TANGO_BASE_CLASS(cl, s) { /*----- PROTECTED REGION ID(SimulatedE2PS::constructor_2) ENABLED START -----*/ /* clang-format on */ init_device(); /* clang-format off */ /*----- PROTECTED REGION END -----*/ // SimulatedE2PS::constructor_2 } //-------------------------------------------------------- SimulatedE2PS::SimulatedE2PS(Tango::DeviceClass *cl, const char *s, const char *d) : TANGO_BASE_CLASS(cl, s, d) { /*----- PROTECTED REGION ID(SimulatedE2PS::constructor_3) ENABLED START -----*/ /* clang-format on */ init_device(); /* clang-format off */ /*----- PROTECTED REGION END -----*/ // SimulatedE2PS::constructor_3 } //-------------------------------------------------------- SimulatedE2PS::~SimulatedE2PS() { delete_device(); } //-------------------------------------------------------- /** * Method : SimulatedE2PS::delete_device() * Description: will be called at device destruction or at init command */ //-------------------------------------------------------- void SimulatedE2PS::delete_device() { DEBUG_STREAM << "SimulatedE2PS::delete_device() " << device_name << std::endl; /*----- PROTECTED REGION ID(SimulatedE2PS::delete_device) ENABLED START -----*/ /* clang-format on */ // Delete device allocated objects /* clang-format off */ /*----- PROTECTED REGION END -----*/ // SimulatedE2PS::delete_device } //-------------------------------------------------------- /** * Method : SimulatedE2PS::init_device() * Description: will be called at device initialization. */ //-------------------------------------------------------- void SimulatedE2PS::init_device() { DEBUG_STREAM << "SimulatedE2PS::init_device() create device " << device_name << std::endl; /*----- PROTECTED REGION ID(SimulatedE2PS::init_device_before) ENABLED START -----*/ /* clang-format on */ // Initialization before get_device_property() call /* clang-format off */ /*----- PROTECTED REGION END -----*/ // SimulatedE2PS::init_device_before // Get the device properties from database get_device_property(); /*----- PROTECTED REGION ID(SimulatedE2PS::init_device) ENABLED START -----*/ /* clang-format on */ // Initialize device // Initialise variables to default values _current= 0.0; _current_read= 0.0; _voltage= 0.1; _ohm = 0.2; // load resistance in ohm _busy = false; thread_running=false; Tango::MultiAttribute *attr_list = get_device_attr(); attr_current = &(attr_list->get_w_attr_by_name("current")); try{ attr_current->set_write_value(_current); } catch(...){} // ignore error! set_state(Tango::OFF); set_status("Off"); INFO_STREAM << "SimulatedE2PS::init_device() create device end " << device_name << endl; /* clang-format off */ /*----- PROTECTED REGION END -----*/ // SimulatedE2PS::init_device } //-------------------------------------------------------- /** * Method : SimulatedE2PS::get_device_property() * Description: Read database to initialize property data members. */ //-------------------------------------------------------- void SimulatedE2PS::get_device_property() { /*----- PROTECTED REGION ID(SimulatedE2PS::get_device_property_before) ENABLED START -----*/ /* clang-format on */ // Initialize property data members /* clang-format off */ /*----- PROTECTED REGION END -----*/ // SimulatedE2PS::get_device_property_before // Read device properties from database. Tango::DbData dev_prop; dev_prop.push_back(Tango::DbDatum("CurrentRipple")); // 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 SimulatedE2PSClass to get class property Tango::DbDatum def_prop, cl_prop; SimulatedE2PSClass *ds_class = (static_cast<SimulatedE2PSClass *>(get_device_class())); int i = -1; // Try to initialize CurrentRipple from class property cl_prop = ds_class->get_class_property(dev_prop[++i].name); if (cl_prop.is_empty()==false) cl_prop >> currentRipple; else { // Try to initialize CurrentRipple from default device value def_prop = ds_class->get_default_device_property(dev_prop[i].name); if (def_prop.is_empty()==false) def_prop >> currentRipple; } // And try to extract CurrentRipple value from database if (dev_prop[i].is_empty()==false) dev_prop[i] >> currentRipple; } /*----- PROTECTED REGION ID(SimulatedE2PS::get_device_property_after) ENABLED START -----*/ /* clang-format on */ // Check device property data members init /* clang-format off */ /*----- PROTECTED REGION END -----*/ // SimulatedE2PS::get_device_property_after } //-------------------------------------------------------- /** * Method : SimulatedE2PS::always_executed_hook() * Description: method always executed before any command is executed */ //-------------------------------------------------------- void SimulatedE2PS::always_executed_hook() { DEBUG_STREAM << "SimulatedE2PS::always_executed_hook() " << device_name << std::endl; /*----- PROTECTED REGION ID(SimulatedE2PS::always_executed_hook) ENABLED START -----*/ /* clang-format on */ // code always executed before all requests /* clang-format off */ /*----- PROTECTED REGION END -----*/ // SimulatedE2PS::always_executed_hook } //-------------------------------------------------------- /** * Method : SimulatedE2PS::read_attr_hardware() * Description: Hardware acquisition for attributes */ //-------------------------------------------------------- void SimulatedE2PS::read_attr_hardware(TANGO_UNUSED(std::vector<long> &attr_list)) { DEBUG_STREAM << "SimulatedE2PS::read_attr_hardware(std::vector<long> &attr_list) entering... " << std::endl; /*----- PROTECTED REGION ID(SimulatedE2PS::read_attr_hardware) ENABLED START -----*/ /* clang-format on */ // Add your own code /* clang-format off */ /*----- PROTECTED REGION END -----*/ // SimulatedE2PS::read_attr_hardware } //-------------------------------------------------------- /** * Method : SimulatedE2PS::write_attr_hardware() * Description: Hardware writing for attributes */ //-------------------------------------------------------- void SimulatedE2PS::write_attr_hardware(TANGO_UNUSED(std::vector<long> &attr_list)) { DEBUG_STREAM << "SimulatedE2PS::write_attr_hardware(std::vector<long> &attr_list) entering... " << std::endl; /*----- PROTECTED REGION ID(SimulatedE2PS::write_attr_hardware) ENABLED START -----*/ /* clang-format on */ // Add your own code /* clang-format off */ /*----- PROTECTED REGION END -----*/ // SimulatedE2PS::write_attr_hardware } //-------------------------------------------------------- /** * Read attribute current related method * Description: The powersupply current setting in amps * * Data type: Tango::DevDouble * Attr type: Scalar */ //-------------------------------------------------------- void SimulatedE2PS::read_current(Tango::Attribute &attr) { DEBUG_STREAM << "SimulatedE2PS::read_current(Tango::Attribute &attr) entering... " << std::endl; /*----- PROTECTED REGION ID(SimulatedE2PS::read_current) ENABLED START -----*/ /* clang-format on */ // Set the attribute value double delta=drand48()-0.5; if(get_state() == Tango::OFF){ _current_read = delta * currentRipple; } else{ _current_read = _current +( delta * currentRipple ); } attr.set_value(&_current_read); /* clang-format off */ /*----- PROTECTED REGION END -----*/ // SimulatedE2PS::read_current } //-------------------------------------------------------- /** * Write attribute current related method * Description: The powersupply current setting in amps * * Data type: Tango::DevDouble * Attr type: Scalar */ //-------------------------------------------------------- void SimulatedE2PS::write_current(Tango::WAttribute &attr) { DEBUG_STREAM << "SimulatedE2PS::write_current(Tango::WAttribute &attr) entering... " << std::endl; // Retrieve write value Tango::DevDouble w_val; attr.get_write_value(w_val); /*----- PROTECTED REGION ID(SimulatedE2PS::write_current) ENABLED START -----*/ /* clang-format on */ // Add your own code _current = w_val; /* clang-format off */ /*----- PROTECTED REGION END -----*/ // SimulatedE2PS::write_current } //-------------------------------------------------------- /** * Read attribute voltage related method * Description: The powersupply voltage in volts. * * Data type: Tango::DevDouble * Attr type: Scalar */ //-------------------------------------------------------- void SimulatedE2PS::read_voltage(Tango::Attribute &attr) { DEBUG_STREAM << "SimulatedE2PS::read_voltage(Tango::Attribute &attr) entering... " << std::endl; /*----- PROTECTED REGION ID(SimulatedE2PS::read_voltage) ENABLED START -----*/ /* clang-format on */ // Set the attribute value attr.set_value(&_voltage); /* clang-format off */ /*----- PROTECTED REGION END -----*/ // SimulatedE2PS::read_voltage } //-------------------------------------------------------- /** * Read attribute currentSet related method * Description: The current set value as stored in the powersupply. * * Data type: Tango::DevDouble * Attr type: Scalar */ //-------------------------------------------------------- void SimulatedE2PS::read_currentSet(Tango::Attribute &attr) { DEBUG_STREAM << "SimulatedE2PS::read_currentSet(Tango::Attribute &attr) entering... " << std::endl; /*----- PROTECTED REGION ID(SimulatedE2PS::read_currentSet) ENABLED START -----*/ /* clang-format on */ // Set the attribute value attr.set_value(&_current); /* clang-format off */ /*----- PROTECTED REGION END -----*/ // SimulatedE2PS::read_currentSet } //-------------------------------------------------------- /** * Method : SimulatedE2PS::add_dynamic_attributes() * Description: Create the dynamic attributes if any * for specified device. */ //-------------------------------------------------------- void SimulatedE2PS::add_dynamic_attributes() { /*----- PROTECTED REGION ID(SimulatedE2PS::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 -----*/ // SimulatedE2PS::add_dynamic_attributes } //-------------------------------------------------------- /** * Command On related method * Description: Switch powersupply ON. * */ //-------------------------------------------------------- void SimulatedE2PS::on() { DEBUG_STREAM << "SimulatedE2PS::On() - " << device_name << std::endl; /*----- PROTECTED REGION ID(SimulatedE2PS::on) ENABLED START -----*/ /* clang-format on */ // Add your own code set_state(Tango::ON); set_status("On"); push_change_event("State"); /* clang-format off */ /*----- PROTECTED REGION END -----*/ // SimulatedE2PS::on } //-------------------------------------------------------- /** * Command Off related method * Description: Switch power supply OFF. * */ //-------------------------------------------------------- void SimulatedE2PS::off() { DEBUG_STREAM << "SimulatedE2PS::Off() - " << device_name << std::endl; /*----- PROTECTED REGION ID(SimulatedE2PS::off) ENABLED START -----*/ /* clang-format on */ _current_read = 0.0; _current = 0.0; _voltage = 0.0; attr_current->set_write_value(_current); push_change_event("current",&_current_read); push_change_event("currentSet",&_current); set_state(Tango::OFF); set_status("Off"); push_change_event("State"); ; // Add your own code /* clang-format off */ /*----- PROTECTED REGION END -----*/ // SimulatedE2PS::off } //-------------------------------------------------------- /** * Command Reset related method * Description: Reset the powersupply to a well known state. * */ //-------------------------------------------------------- void SimulatedE2PS::reset() { DEBUG_STREAM << "SimulatedE2PS::Reset() - " << device_name << std::endl; /*----- PROTECTED REGION ID(SimulatedE2PS::reset) ENABLED START -----*/ /* clang-format on */ // Add your own code if(get_state() == Tango::FAULT){ set_state(Tango::OFF); set_status("Off"); push_change_event("State"); } /* clang-format off */ /*----- PROTECTED REGION END -----*/ // SimulatedE2PS::reset } //-------------------------------------------------------- /** * Command StartCycling related method * * */ //-------------------------------------------------------- void SimulatedE2PS::start_cycling() { DEBUG_STREAM << "SimulatedE2PS::StartCycling() - " << device_name << std::endl; /*----- PROTECTED REGION ID(SimulatedE2PS::start_cycling) ENABLED START -----*/ /* clang-format on */ // Add your own code /* clang-format off */ /*----- PROTECTED REGION END -----*/ // SimulatedE2PS::start_cycling } //-------------------------------------------------------- /** * Command Abort related method * Description: stop ramp or cycling * */ //-------------------------------------------------------- void SimulatedE2PS::abort() { DEBUG_STREAM << "SimulatedE2PS::Abort() - " << device_name << std::endl; /*----- PROTECTED REGION ID(SimulatedE2PS::abort) ENABLED START -----*/ /* clang-format on */ // Add your own code /* clang-format off */ /*----- PROTECTED REGION END -----*/ // SimulatedE2PS::abort } //-------------------------------------------------------- /** * Command Fault related method * Description: Force a simulated faulty condtion * */ //-------------------------------------------------------- void SimulatedE2PS::fault() { DEBUG_STREAM << "SimulatedE2PS::Fault() - " << device_name << std::endl; /*----- PROTECTED REGION ID(SimulatedE2PS::fault) ENABLED START -----*/ /* clang-format on */ // Add your own code if (get_state() == Tango::FAULT) return; // command is idempotent _current_read = 0.0; _current = 0.0; _voltage = 0.0; attr_current->set_write_value(_current); push_change_event("current", &_current_read); push_change_event("currentSet", &_current); set_state(Tango::FAULT); set_status("Fault"); push_change_event("State"); /* clang-format off */ /*----- PROTECTED REGION END -----*/ // SimulatedE2PS::fault } //-------------------------------------------------------- /** * Method : SimulatedE2PS::add_dynamic_commands() * Description: Create the dynamic commands if any * for specified device. */ //-------------------------------------------------------- void SimulatedE2PS::add_dynamic_commands() { /*----- PROTECTED REGION ID(SimulatedE2PS::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 -----*/ // SimulatedE2PS::add_dynamic_commands } /*----- PROTECTED REGION ID(SimulatedE2PS::namespace_ending) ENABLED START -----*/ /* clang-format on */ // Additional Methods /* clang-format off */ /*----- PROTECTED REGION END -----*/ // SimulatedE2PS::namespace_ending } // namespace