Skip to content
Snippets Groups Projects
Select Git revision
  • 1174b201dc85f8f6201e0cc96b8bdfad2efd16de
  • main default protected
  • develop
  • release_2_8_3
  • release_2_8_2
  • release_2_8_1
  • release_2_8_0
  • release_2_7_1
  • release_2_7_0
  • release_2_6_0
  • release_2_5_29
  • release_2_5_28
  • release_2_5_27
  • release_2_5_26
  • release_2_5_25
  • release_2_5_24
  • release_2_5_23
  • release_2_5_22
  • release_2_5_21
  • release_2_5_20
  • release_2_5_18
  • release_2_5_17
  • release_2_5_16
23 results

TangoSerialLink.cpp

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    TangoSerialLink.cpp 4.66 KiB
    // ============================================================================
    //
    // = 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();
    }