// ============================================================================ // // = CONTEXT // TANGO Project - Keithley Electrometer Support Library // // = FILENAME // TangoSerialLink.cpp // // = AUTHOR // X. Elattaoui // // ============================================================================ // ============================================================================ // DEPENDENCIES // ============================================================================ #include <string> #include <iostream> #include "TangoSerialLink.h" //- Read serial data in mode LINE (i.e SerialLine device wait until EOF is received from instrument static const long MODE_LINE = 2; // ============================================================================ // TangoSerialLink::TangoSerialLink // ============================================================================ TangoSerialLink::TangoSerialLink (std::string& serial_device_name) : CommunicationLink(serial_device_name), _serial_proxy (0), _is_serial_proxy_created (false) { // //std::cout << "TangoSerialLink::TangoSerialLink <-" << std::endl; response.erase(); // //std::cout << "TangoSerialLink::TangoSerialLink ->" << std::endl; } // ============================================================================ // TangoSerialLink::~TangoSerialLink // ============================================================================ TangoSerialLink::~TangoSerialLink (void) { //std::cout << "TangoSerialLink::~TangoSerialLink <-" << std::endl; if(_is_serial_proxy_created) { delete _serial_proxy; _serial_proxy = 0; _is_serial_proxy_created = false; } //std::cout << "TangoSerialLink::~TangoSerialLink ->" << std::endl; } // ============================================================================ // TangoSerialLink::create_serial_proxy // ============================================================================ void TangoSerialLink::create_serial_proxy (void) throw (Tango::DevFailed) { TangoSys_OMemStream description; try { //- try this->_serial_proxy = new Tango::DeviceProxyHelper(_communication_Device_name); _is_serial_proxy_created = true; } catch(Tango::DevFailed& df ) { description << "Unable to create proxy on : " << _communication_Device_name << ends; _is_serial_proxy_created = false; Tango::Except::re_throw_exception (df, (const char*)"COMMUNICATION_ERROR", description.str(), (const char*)"TangoSerialLink::create_serial_proxy"); } } // ============================================================================ // TangoSerialLink::write // ============================================================================ void TangoSerialLink::write (std::string command_to_send) throw (Tango::DevFailed) { TangoSys_OMemStream description; if(!_is_serial_proxy_created) create_serial_proxy(); try { //- try this->_serial_proxy->command_in("DevSerWriteString", command_to_send.c_str()); } catch(Tango::DevFailed& df ) { description << "Unable to write command : " << command_to_send << ends; Tango::Except::re_throw_exception (df, (const char*)"COMMUNICATION_ERROR", description.str(), (const char*)"TangoSerialLink::write"); } } // ============================================================================ // TangoSerialLink::read // ============================================================================ std::string TangoSerialLink::read (void) throw (Tango::DevFailed) { if(!_is_serial_proxy_created) create_serial_proxy(); try { //- try in mode LINE this->_serial_proxy->command_inout("DevSerReadString", MODE_LINE ,this->response); } catch(Tango::DevFailed& df ) { Tango::Except::re_throw_exception (df, (const char*)"COMMUNICATION_ERROR", (const char*)"Unable to perform a read operation", (const char*)"TangoSerialLink::read"); } return this->response ; } // ============================================================================ // TangoSerialLink::write_read // ============================================================================ std::string TangoSerialLink::write_read (std::string command_to_send) throw (Tango::DevFailed) { TangoSys_OMemStream description; std::string respTmp(""); // long nb_char_written = 0; omni_thread::sleep(0, 200000000); //200 milliseconds write(command_to_send); //- sleep a little bit to let the adapter(RS232/485) to switch mode omni_thread::sleep(0, 100000000); //100 milliseconds // now read response from HW respTmp = this->read(); return respTmp; }