diff --git a/include/TangoGpibLink.h b/include/TangoGpibLink.h index 9ca083d7b80ad8fea818c2cada67944960d50e60..0e601d622faf3be697edc75b2f651728e449e780 100644 --- a/include/TangoGpibLink.h +++ b/include/TangoGpibLink.h @@ -18,7 +18,7 @@ // DEPENDENCIES // ============================================================================ #include <tango.h> -#include <DeviceProxyHelper.h> +//#include <DeviceProxyHelper.h> #include "CommunicationLink.h" /** @@ -98,7 +98,7 @@ private : */ void create_gpib_proxy(void) throw (Tango::DevFailed); - Tango::DeviceProxyHelper* _gpib_proxy; + Tango::DeviceProxy* _gpib_proxy; std::string response; diff --git a/include/TangoSerialLink.h b/include/TangoSerialLink.h index 07733b86b3b70ab339da6dd73bdc868afc4a5374..c8e75355062f8be1345a94b9a1294febb1e6b092 100644 --- a/include/TangoSerialLink.h +++ b/include/TangoSerialLink.h @@ -18,7 +18,7 @@ // DEPENDENCIES // ============================================================================ #include <tango.h> -#include <DeviceProxyHelper.h> +//#include <DeviceProxyHelper.h> #include "CommunicationLink.h" /** @@ -37,15 +37,14 @@ class TangoSerialLink : public CommunicationLink { public : - /** - * \brief Initialization. - */ - TangoSerialLink (std::string& serial_device_name); - - /** - * \brief Release resources. - */ - virtual ~TangoSerialLink (void); + /** + * \brief One MCCE-2 can manage two differents electrometers + * through only one serial line ! + * + */ + static TangoSerialLink* get_instance(std::string& serial_device_name); + + static void delete_instance(CommunicationLink*); /** * \brief Send command (data) as string to hardware. @@ -68,20 +67,29 @@ public : */ std::string write_read(std::string cmd) throw (Tango::DevFailed); - /** - * \brief Returns the Gpib SRQ line state : Not used HERR - * - * \throws Tango::DevFailed +private : + /** + * \brief Initialization. + */ + TangoSerialLink (std::string& serial_device_name); + + /** + * \brief Release resources. + */ + ~TangoSerialLink (); - bool isSRQLineUp(void) throw (Tango::DevFailed); + /** + * \brief Tango Serial Link instance. */ -private : - /** + static TangoSerialLink* tsl_Instance; + + /** * Creates a proxy on the specified Serial Device. */ void create_serial_proxy(void) throw (Tango::DevFailed); - Tango::DeviceProxyHelper* _serial_proxy; + //Tango::DeviceProxyHelper* _serial_proxy; + Tango::DeviceProxy* _serial_proxy; bool _is_serial_proxy_created; diff --git a/pom.xml b/pom.xml index 89060403c2f1b61cbbe02ffa8f19cbde98b2237c..9e7dc579e04da371948185b6eb9d718d9210a039 100644 --- a/pom.xml +++ b/pom.xml @@ -8,7 +8,7 @@ </parent> <groupId>fr.soleil.lib</groupId> <artifactId>Electrometers-${aol}-${library}-${mode}</artifactId> - <version>2.5.1</version> + <version>2.5.2-SNAPSHOT</version> <packaging>nar</packaging> <name>Electrometers library</name> <description>Electrometers library</description> diff --git a/src/NovelecProtocol.cpp b/src/NovelecProtocol.cpp index 749e8673b23c13865fb0d3c7124ca9b9b6aaf633..45583c096a7f6359ba799ed6d62c4ae1af9711a9 100644 --- a/src/NovelecProtocol.cpp +++ b/src/NovelecProtocol.cpp @@ -67,7 +67,7 @@ NovelecProtocol::NovelecProtocol (std::string& serial_device_name, unsigned shor NovelecProtocol::~NovelecProtocol (void) { // std::cout << "NovelecProtocol::~NovelecProtocol <-" << std::endl; - + TangoSerialLink::delete_instance(_communication_link); // std::cout << "NovelecProtocol::~NovelecProtocol ->" << std::endl; } @@ -79,7 +79,7 @@ bool NovelecProtocol::build_communicationLink() if (_commDevName.empty()) return false; - _communication_link = new TangoSerialLink (_commDevName); + _communication_link = TangoSerialLink::get_instance(_commDevName); if (!_communication_link) return false; @@ -95,19 +95,23 @@ void NovelecProtocol::init_MCCE2_for_communication(void) std::stringstream explicite_resp; std::string tmp("no data"); + std::cout << "NovelecProtocol::init_MCCE2_for_communication -> _devAdd = " << _devAdd << std::endl; //- CMD to enable PROG cmds this->switch_MCCE2_OFF(); //- this command is now called in the MCCE2 device ! - + std::cout << "NovelecProtocol::init_MCCE2_for_communication -> switch_MCCE2_OFF" << std::endl; //- Clear error registers this->clear_registers(); + std::cout << "NovelecProtocol::init_MCCE2_for_communication -> clear_registers" << std::endl; //- send cmd to have an explicite response : explicite_resp << _devAdd << " PROG " << RESPONSE_LGTH_CMD_NUM << " 1" << END_OF_LINE << std::endl; tmp = _communication_link->write_read(explicite_resp.str()); + std::cout << "NovelecProtocol::init_MCCE2_for_communication -> write_read" << std::endl; //- check only the command response check_command(tmp); - + std::cout << "NovelecProtocol::init_MCCE2_for_communication -> check_command" << std::endl; + //- if no error _is_explicite_resp_enabled = true; } @@ -158,9 +162,6 @@ std::stringstream cmd_to_send; std::string argout("no data"); std::string tmp("no data"); - //- check if the MCCE2 is not in MEASURE mode to get/change any settings - this->is_allowed(); - //- send command to Novelec device cmd_to_send << _devAdd << " READ " << MODE_CMD_NUM << END_OF_LINE << std::endl; tmp = _communication_link->write_read(cmd_to_send.str()); @@ -171,11 +172,11 @@ std::string tmp("no data"); //- check what is the response mode type if( _is_explicite_resp_enabled == false ) { - short idx = XString<short>::convertFromString(argout); - _function = mode_str[idx]; + short idx = XString<short>::convertFromString(argout); + _function = mode_str[idx]; } else - _function = argout; + _function = argout; return _function; } @@ -219,14 +220,19 @@ std::stringstream cmd_to_send; std::string cmdNumber(" 1"); //- PROG 1 -> = PROG FUNCTION std::string tmp("no data"); + //- allow parameters modification + this->switch_MCCE2_OFF(); //- check if the MCCE2 is not in MEASURE mode to get/change any settings - this->is_allowed(); + //this->is_allowed(); //- send cmd to have a explicite response : cmd_to_send << _devAdd << " PROG 1 " << cmdNumber << END_OF_LINE << std::endl; tmp = _communication_link->write_read(cmd_to_send.str()); //- check only the command response check_command(tmp); + + //- lock parameters modification + this->switch_MCCE2_OFF(); } // ============================================================================ @@ -238,14 +244,18 @@ std::stringstream cmd_to_send; std::string cmdNumber(" 2"); //- PROG 1 -> = PROG FUNCTION std::string tmp("no data"); - //- check if the MCCE2 is not in MEASURE mode to get/change any settings - this->is_allowed(); + // //- check if the MCCE2 is not in MEASURE mode to get/change any settings + //this->is_allowed(); + //- allow parameters modification + this->switch_MCCE2_OFF(); //- send cmd to have a explicite response : cmd_to_send << _devAdd << " PROG 1 " << cmdNumber << END_OF_LINE << std::endl; tmp = _communication_link->write_read(cmd_to_send.str()); //- check only the command response check_command(tmp); + //- lock parameters modification + this->switch_MCCE2_ON(); } // ============================================================================ @@ -257,14 +267,19 @@ std::stringstream cmd_to_send; std::string cmdNumber(" 3"); //- PROG 1 -> = PROG FUNCTION std::string tmp("no data"); - //- check if the MCCE2 is not in MEASURE mode to get/change any settings - this->is_allowed(); + // //- check if the MCCE2 is not in MEASURE mode to get/change any settings + //this->is_allowed(); + //- allow parameters modification + this->switch_MCCE2_OFF(); //- send cmd to have a explicite response : cmd_to_send << _devAdd << " PROG 1 " << cmdNumber << END_OF_LINE << std::endl; tmp = _communication_link->write_read(cmd_to_send.str()); //- check only the command response check_command(tmp); + + //- lock parameters modification + this->switch_MCCE2_ON(); } // ============================================================================ @@ -276,14 +291,19 @@ std::stringstream cmd_to_send; std::string cmdNumber(" 4"); //- PROG 1 -> = PROG FUNCTION std::string tmp("no data"); - //- check if the MCCE2 is not in MEASURE mode to get/change any settings - this->is_allowed(); + // //- check if the MCCE2 is not in MEASURE mode to get/change any settings + //this->is_allowed(); + + //- allow parameters modification + this->switch_MCCE2_OFF(); //- send cmd to have a explicite response : cmd_to_send << _devAdd << " PROG 1 " << cmdNumber << END_OF_LINE << std::endl; tmp = _communication_link->write_read(cmd_to_send.str()); //- check only the command response check_command(tmp); + //- lock parameters modification + this->switch_MCCE2_ON(); } // ============================================================================ @@ -298,11 +318,15 @@ std::string tmp("no data"); //- check if the MCCE2 is not in MEASURE mode to get/change any settings this->is_allowed(); + //- allow parameters modification + this->switch_MCCE2_OFF(); //- send cmd to have a explicite response : cmd_to_send << _devAdd << " PROG 1 " << cmdNumber << END_OF_LINE << std::endl; tmp = _communication_link->write_read(cmd_to_send.str()); //- check only the command response check_command(tmp); + //- lock parameters modification + this->switch_MCCE2_ON(); } // ============================================================================ @@ -317,8 +341,10 @@ std::string tmp("no data"); //- send command to Novelec device cmd_to_send << _devAdd << " READ " << RANGE_CMD_NUM << END_OF_LINE << std::endl; tmp = _communication_link->write_read(cmd_to_send.str()); +std::cout << "NovelecProtocol::get_range -> range brut : " << tmp << std::endl; //- check and extract the response argout = check_and_extract_data(tmp, RANGE_CMD_NUM); +std::cout << "NovelecProtocol::get_range -> range extrait : " << argout << std::endl; //- check what is the response mode type short idx = -1; @@ -339,15 +365,19 @@ void NovelecProtocol::set_range (std::string value) std::stringstream cmd_to_send; std::string tmp("no data"); - //- check if the MCCE2 is not in MEASURE mode to get/change any settings - this->is_allowed(); + // //- check if the MCCE2 is not in MEASURE mode to get/change any settings + //this->is_allowed(); + + //- allow parameters modification + this->switch_MCCE2_OFF(); //- send command to Novelec device cmd_to_send << _devAdd << " PROG " << _rangeParameterNum << " " << value << END_OF_LINE << std::endl; tmp = _communication_link->write_read(cmd_to_send.str()); //- the novelec device send ACK/NAK response after a received command check_command(tmp); - + //- lock parameters modification + this->switch_MCCE2_ON(); } // ============================================================================ @@ -386,14 +416,20 @@ void NovelecProtocol::set_polarity (std::string newPolarity) std::stringstream cmd_to_send; std::string tmp("no data"); - //- check if the MCCE2 is not in MEASURE mode to get/change any settings - this->is_allowed(); + // //- check if the MCCE2 is not in MEASURE mode to get/change any settings + //this->is_allowed(); + + //- allow parameters modification + this->switch_MCCE2_OFF(); //- send command to Novelec device cmd_to_send << _devAdd << " PROG 2" << " " << newPolarity << END_OF_LINE << std::endl; tmp = _communication_link->write_read(cmd_to_send.str()); //- the novelec device send ACK/NAK response after a received command check_command(tmp); + + //- lock parameters modification + this->switch_MCCE2_ON(); } // ============================================================================ @@ -430,14 +466,20 @@ void NovelecProtocol::set_frequency (std::string newFrequency) std::stringstream cmd_to_send; std::string tmp("no data"); - //- check if the MCCE2 is not in MEASURE mode to get/change any settings - this->is_allowed(); + // //- check if the MCCE2 is not in MEASURE mode to get/change any settings + //this->is_allowed(); + + //- allow parameters modification + this->switch_MCCE2_OFF(); //- send command to Novelec device cmd_to_send << _devAdd << " PROG 9" << " " << newFrequency << END_OF_LINE << std::endl; tmp = _communication_link->write_read(cmd_to_send.str()); //- the novelec device send ACK/NAK response after a received command check_command(tmp); + + //- lock parameters modification + this->switch_MCCE2_ON(); } // ============================================================================ @@ -476,15 +518,19 @@ void NovelecProtocol::set_gain (std::string newGain) std::stringstream cmd_to_send; std::string tmp("no data"); - //- check if the MCCE2 is not in MEASURE mode to get/change any settings - this->is_allowed(); + // //- check if the MCCE2 is not in MEASURE mode to get/change any settings + //this->is_allowed(); + //- allow parameters modification + this->switch_MCCE2_OFF(); //- send command to Novelec device cmd_to_send << _devAdd << " PROG 8" << " " << newGain << END_OF_LINE << std::endl; tmp = _communication_link->write_read(cmd_to_send.str()); //- the novelec device send ACK/NAK response after a received command check_command(tmp); + //- lock parameters modification + this->switch_MCCE2_ON(); } // ============================================================================ @@ -548,15 +594,19 @@ void NovelecProtocol::local (void) std::stringstream cmd_to_send; std::string tmp("no data"); - //- check if the MCCE2 is not in MEASURE mode to get/change any settings - this->is_allowed(); + // //- check if the MCCE2 is not in MEASURE mode to get/change any settings + //this->is_allowed(); + //- allow parameters modification + this->switch_MCCE2_OFF(); //- send command cmd_to_send << _devAdd << " LOCAL" << END_OF_LINE << std::endl; tmp = _communication_link->write_read(cmd_to_send.str()); //- check the response check_command(tmp); + //- lock parameters modification + this->switch_MCCE2_ON(); } // ============================================================================ @@ -567,15 +617,19 @@ void NovelecProtocol::remote (void) std::stringstream cmd_to_send; std::string tmp("no data"); - //- check if the MCCE2 is not in MEASURE mode to get/change any settings - this->is_allowed(); + // //- check if the MCCE2 is not in MEASURE mode to get/change any settings + //this->is_allowed(); + //- allow parameters modification + this->switch_MCCE2_OFF(); //- send command cmd_to_send << _devAdd << " REMOTE" << END_OF_LINE << std::endl; tmp = _communication_link->write_read(cmd_to_send.str()); //- check the response check_command(tmp); + //- lock parameters modification + this->switch_MCCE2_ON(); } // ============================================================================ diff --git a/src/Novelec_MCCE2.cpp b/src/Novelec_MCCE2.cpp index 15dffff2be52b25d7db983aa17b76ef6f781ffdf..bbacdb8a8bc23c1610520a3451004cdcb78abf3d 100644 --- a/src/Novelec_MCCE2.cpp +++ b/src/Novelec_MCCE2.cpp @@ -159,7 +159,7 @@ void Novelec_MCCE2::mcce_off (void) // ============================================================================ std::string Novelec_MCCE2::electrometer_status (void) { - std::string argout("undefined status"); + std::string argout(""); std::string typeStr(" "); std::string tmp(" "); short _status = 0; @@ -168,47 +168,51 @@ std::string Novelec_MCCE2::electrometer_status (void) NovelecProtocol* _nproto = dynamic_cast<NovelecProtocol*>(_electrometerProtocol); if(!_nproto) - throw electrometer::ElectrometerException("BAD_CAST", - "Unable to query the electrmometer status.", + throw electrometer::ElectrometerException("BAD_ALLOC", + "Memory allocation failed to query the electrmometer status.", "Novelec_MCCE2::electrometer_status( )."); + /*********************************************************************** + DISABLED PART TO INCREASE SERIAL PERFORMANCE //- get Electrometer type : - try - { - tmp = _nproto->get_electrotype(); - _type = XString<short>::convertFromString(tmp); - } - catch(...) - { - set_electroState(FAULT); - throw electrometer::ElectrometerException("INTERNAL_ERROR", - "Unable to query the electrmometer type.", - "Novelec_MCCE2::electrometer_status( )."); - } + //try + //{ + // tmp = _nproto->get_electrotype(); + // _type = XString<short>::convertFromString(tmp); + //} + //catch(...) + //{ + // set_electroState(FAULT); + // throw electrometer::ElectrometerException("INTERNAL_ERROR", + // "Unable to query the electrmometer type.", + // "Novelec_MCCE2::electrometer_status( )."); + //} - argout = "\n\nINFOS :\n"; - argout += "----------\n"; + //argout = "\n\nINFOS :\n"; + //argout += "----------\n"; - switch(_type) - { - case 1 : typeStr = "Photovolta�que UHS"; - break; - case 2 : typeStr = "Photovolta�que HS"; - break; - case 3 : typeStr = "Photovolta�que MS"; - break; - case 4 : typeStr = "Photoconducteur HS"; - break; - case 5 : typeStr = "Photoconducteur MS"; - break; - default : set_electroState(FAULT); - argout = "Invalid status string returned !"; - return argout; - } - argout += "Novelec type : " + typeStr + "\n"; + //switch(_type) + //{ + //case 1 : typeStr = "Photovolta�que UHS"; + // break; + //case 2 : typeStr = "Photovolta�que HS"; + // break; + //case 3 : typeStr = "Photovolta�que MS"; + // break; + //case 4 : typeStr = "Photoconducteur HS"; + // break; + //case 5 : typeStr = "Photoconducteur MS"; + // break; + //default : set_electroState(FAULT); + // argout = "Invalid status string returned !"; + // return argout; + //} + //argout += "Novelec type : " + typeStr + "\n"; - //- get Electrometer mode : - argout += "Novelec mode : " + _electrometerProtocol->get_mode() + "\n"; + ////- get Electrometer mode : + //argout += "Novelec mode : " + _electrometerProtocol->get_mode() + "\n"; + + ***********************************************************************/ try { @@ -219,12 +223,15 @@ std::string Novelec_MCCE2::electrometer_status (void) catch(...) { set_electroState(FAULT); - throw electrometer::ElectrometerException("INTERNAL_ERROR", - "Unable to query the electrmometer status.", - "Novelec_MCCE2::electrometer_status( )."); + argout = "Unable to query the electrometer status."; + return argout; + + //throw electrometer::ElectrometerException("COMMUNICATION_ERROR", + // "Unable to query the electrmometer status.", + // "Novelec_MCCE2::electrometer_status( )."); } - argout += "Status detail :\n"; + argout += "\nStatus detail :\n"; argout += "------------------------\n"; //- build novelec status diff --git a/src/TangoGpibLink.cpp b/src/TangoGpibLink.cpp index 6e87b93b6b9d0f0196112dcaf5be60a70d882b17..faaab54212126fa83665faaa2e74b0f44217a755 100644 --- a/src/TangoGpibLink.cpp +++ b/src/TangoGpibLink.cpp @@ -60,7 +60,7 @@ void TangoGpibLink::create_gpib_proxy (void) throw (Tango::DevFailed) try { //- try - this->_gpib_proxy = new Tango::DeviceProxyHelper(_communication_Device_name); + this->_gpib_proxy = new Tango::DeviceProxy(_communication_Device_name.c_str()); } catch(Tango::DevFailed& df ) { @@ -79,19 +79,50 @@ void TangoGpibLink::create_gpib_proxy (void) throw (Tango::DevFailed) // ============================================================================ void TangoGpibLink::write (std::string command_to_send) throw (Tango::DevFailed) { + Tango::DeviceData dd_in; + Tango::DevString cmd = 0; std::string description(""); if(!_gpib_proxy) create_gpib_proxy(); - + try + { + cmd = new char [command_to_send.size() + 1]; + strcpy(cmd, command_to_send.c_str()); + } + catch(Tango::DevFailed& df ) + { + if ( cmd ) + delete [] cmd; + description = "Failed to allocate memory for the command to write"; + Tango::Except::re_throw_exception (df, + (const char*)"MEMORY_ALLOCATION", + description.c_str(), + (const char*)"TangoGpibLink::write"); + } + catch(...) + { + if ( cmd ) + delete [] cmd; + Tango::Except::throw_exception ( + (const char*)"MEMORY_ALLOCATION", + (const char*)"Not enough memory.", + (const char*)"TangoGpibLink::write"); + } + try { //- try - this->_gpib_proxy->command_in("Write", command_to_send); + dd_in << cmd; + this->_gpib_proxy->command_inout("Write", dd_in); + if ( cmd ) + delete [] cmd; } catch(Tango::DevFailed& df ) { description = "Unable to write command : " + command_to_send; + if ( cmd ) + delete [] cmd; Tango::Except::re_throw_exception (df, (const char*)"COMMUNICATION_ERROR", @@ -107,6 +138,7 @@ void TangoGpibLink::write (std::string command_to_send) throw (Tango::DevFailed // ============================================================================ std::string TangoGpibLink::read (void) throw (Tango::DevFailed) { + Tango::DeviceData dd_out; if(!_gpib_proxy) create_gpib_proxy(); @@ -114,7 +146,8 @@ std::string TangoGpibLink::read (void) throw (Tango::DevFailed) try { //- try - this->_gpib_proxy->command_out("Read", this->response); + dd_out = this->_gpib_proxy->command_inout("Read"); + dd_out >> this->response; } catch(Tango::DevFailed& df ) { @@ -124,7 +157,7 @@ std::string TangoGpibLink::read (void) throw (Tango::DevFailed) (const char*)"TangoGpibLink::read"); } - return this->response ; + return this->response; } // ============================================================================ @@ -136,16 +169,25 @@ std::string TangoGpibLink::write_read (std::string command_to_send) throw (Tango if(!_gpib_proxy) create_gpib_proxy(); + Tango::DeviceData dd_in, dd_out; + Tango::DevString argin = 0; try { //- try - this->_gpib_proxy->command_inout("WriteRead", command_to_send, response); + argin = new char [command_to_send.size() + 1]; + strcpy(argin, command_to_send.c_str()); + dd_in << argin; + dd_out = this->_gpib_proxy->command_inout("WriteRead", dd_in); + dd_out >> this->response; + if ( argin ) + delete [] argin; } catch(Tango::DevFailed& df ) { description = "Unable to write command : " + command_to_send + " and read device response."; - + if ( argin ) + delete [] argin; Tango::Except::re_throw_exception (df, (const char*)"COMMUNICATION_ERROR", description.c_str(), @@ -161,6 +203,7 @@ bool TangoGpibLink::SRQLineState (void) throw (Tango::DevFailed) { std::string description(""); bool result = false; + Tango::DeviceData dd_out; if(!_gpib_proxy) create_gpib_proxy(); @@ -168,7 +211,8 @@ bool TangoGpibLink::SRQLineState (void) throw (Tango::DevFailed) try { //- try - this->_gpib_proxy->command_out("IsSRQLineUP", result); + dd_out = this->_gpib_proxy->command_inout("IsSRQLineUP"); + dd_out >> result; } catch(Tango::DevFailed& df ) { @@ -191,6 +235,8 @@ short TangoGpibLink::readStatusByteRegister (void) throw (Tango::DevFailed) { std::string description(""); short result = -1; + Tango::DeviceAttribute da_out; + if(!_gpib_proxy) create_gpib_proxy(); @@ -198,7 +244,8 @@ short TangoGpibLink::readStatusByteRegister (void) throw (Tango::DevFailed) try { //- try - this->_gpib_proxy->read_attribute("statusByteRegister", result); + da_out = this->_gpib_proxy->read_attribute("statusByteRegister"); + da_out >> result; } catch(Tango::DevFailed& df ) { @@ -226,7 +273,7 @@ void TangoGpibLink::clear (void) throw (Tango::DevFailed) try { //- try - this->_gpib_proxy->command("Clear"); + this->_gpib_proxy->command_inout("Clear"); } catch(Tango::DevFailed& df ) { @@ -252,7 +299,7 @@ void TangoGpibLink::trigger (void) throw (Tango::DevFailed) try { //- try - this->_gpib_proxy->command("Trigger"); + this->_gpib_proxy->command_inout("Trigger"); } catch(Tango::DevFailed& df ) { diff --git a/src/TangoSerialLink.cpp b/src/TangoSerialLink.cpp index c745657c194b71a28ef00adfaa51c6621cab5294..04cc86b3e51dc57737a879104fc7766c7830f1b1 100644 --- a/src/TangoSerialLink.cpp +++ b/src/TangoSerialLink.cpp @@ -21,6 +21,31 @@ //- Read serial data in mode LINE (i.e SerialLine device wait until EOF is received from instrument static const long MODE_LINE = 2; +//- init of the static instance +TangoSerialLink* TangoSerialLink::tsl_Instance = 0; //- ptr on the TangoSerialLink instance + +// ============================================================================ +// TangoSerialLink::get_instance +// ============================================================================ +TangoSerialLink* TangoSerialLink::get_instance(std::string & serial_dev_name) +{ + if( !tsl_Instance ) + tsl_Instance = new TangoSerialLink(serial_dev_name); + + return tsl_Instance; +} + +// ============================================================================ +// TangoSerialLink::delete_instance +// ============================================================================ +void TangoSerialLink::delete_instance(CommunicationLink* tsl_Instance) +{ + if(tsl_Instance) + { + delete tsl_Instance ; + tsl_Instance = 0; + } +} // ============================================================================ // TangoSerialLink::TangoSerialLink @@ -65,8 +90,9 @@ void TangoSerialLink::create_serial_proxy (void) throw (Tango::DevFailed) try { //- try - this->_serial_proxy = new Tango::DeviceProxyHelper(_communication_Device_name); - (*_serial_proxy)->ping(); + //this->_serial_proxy = new Tango::DeviceProxyHelper(_communication_Device_name); + this->_serial_proxy = new Tango::DeviceProxy(_communication_Device_name.c_str()); + //(*_serial_proxy)->ping(); _is_serial_proxy_created = true; } catch(Tango::DevFailed& df ) @@ -91,11 +117,38 @@ void TangoSerialLink::write (std::string command_to_send) throw (Tango::DevFail if(!_serial_proxy) create_serial_proxy(); + Tango::DeviceData dd_in; + Tango::DevString argin = 0; + + try + { + argin = new char [command_to_send.size() + 1]; + strcpy(argin, command_to_send.c_str()); + } + catch(Tango::DevFailed& df ) + { + description = "Unable to write command : " + command_to_send + + "\nmemory allocation failed."; + + Tango::Except::re_throw_exception (df, + (const char*)"ALLOCATION_ERROR", + description.c_str(), + (const char*)"TangoSerialLink::write"); + } + catch(...) + { + description = "Unable to write command : " + command_to_send + "\nmemory allocation failed."; + + Tango::Except::throw_exception ( + (const char*)"ALLOCATION_ERROR", + description.c_str(), + (const char*)"TangoSerialLink::write"); + } try { //- try - this->_serial_proxy->command_in("DevSerWriteString", command_to_send.c_str()); + dd_in << argin; + this->_serial_proxy->command_inout("DevSerWriteString", dd_in); } catch(Tango::DevFailed& df ) { @@ -118,12 +171,13 @@ std::string TangoSerialLink::read (void) throw (Tango::DevFailed) if(!_serial_proxy) create_serial_proxy(); + Tango::DeviceData dd_out; try { //- try in mode LINE - //this->_serial_proxy->command_inout("DevSerReadString", MODE_LINE ,this->response); - this->_serial_proxy->command_out("DevSerReadLine", this->response); + dd_out = this->_serial_proxy->command_inout("DevSerReadLine"); + dd_out >> this->response; } catch(Tango::DevFailed& df ) { @@ -143,12 +197,14 @@ std::string TangoSerialLink::write_read (std::string command_to_send) throw (Tan { if(!_serial_proxy) create_serial_proxy(); + Tango::DeviceData dd_in; std::string respTmp(""); long flush_in_out = 2; + dd_in << flush_in_out; //- Flush buffers ( In & Out = 2 ) - _serial_proxy->command_in("DevSerFlush", flush_in_out); + this->_serial_proxy->command_inout("DevSerFlush", dd_in); omni_thread::sleep(0, 200000000); //200 milliseconds write(command_to_send);