// ============================================================================ // // = 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(_serial_proxy) { 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) { std::string description(""); try { //- try this->_serial_proxy = new Tango::DeviceProxyHelper(_communication_Device_name); (*_serial_proxy)->ping(); _is_serial_proxy_created = true; } catch(Tango::DevFailed& df ) { description = "Unable to create proxy on : " + _communication_Device_name; _is_serial_proxy_created = false; this->_serial_proxy = 0; Tango::Except::re_throw_exception (df, (const char*)"COMMUNICATION_ERROR", description.c_str(), (const char*)"TangoSerialLink::create_serial_proxy"); } } // ============================================================================ // TangoSerialLink::write // ============================================================================ void TangoSerialLink::write (std::string command_to_send) throw (Tango::DevFailed) { std::string description(""); if(!_serial_proxy) 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; Tango::Except::re_throw_exception (df, (const char*)"COMMUNICATION_ERROR", description.c_str(), (const char*)"TangoSerialLink::write"); } } // ============================================================================ // TangoSerialLink::read // ============================================================================ std::string TangoSerialLink::read (void) throw (Tango::DevFailed) { if(!_serial_proxy) create_serial_proxy(); try { //- try in mode LINE //this->_serial_proxy->command_inout("DevSerReadString", MODE_LINE ,this->response); this->_serial_proxy->command_out("DevSerReadLine", 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) { if(!_serial_proxy) create_serial_proxy(); std::string respTmp(""); long flush_in_out = 2; //- Flush buffers ( In & Out = 2 ) _serial_proxy->command_in("DevSerFlush", flush_in_out); 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 return this->read(); }