Skip to content
Snippets Groups Projects
TangoSerialLink.cpp 4.66 KiB
Newer Older
LE's avatar
LE committed
// ============================================================================
//
// = 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)
{
ELATTAOUI's avatar
ELATTAOUI committed
//	//std::cout << "TangoSerialLink::TangoSerialLink <-" << std::endl;
LE's avatar
LE committed

	response.erase();

ELATTAOUI's avatar
ELATTAOUI committed
//	//std::cout << "TangoSerialLink::TangoSerialLink ->" << std::endl;
LE's avatar
LE committed
}

// ============================================================================
// TangoSerialLink::~TangoSerialLink
// ============================================================================
TangoSerialLink::~TangoSerialLink (void)
{
ELATTAOUI's avatar
ELATTAOUI committed
	//std::cout << "TangoSerialLink::~TangoSerialLink <-" << std::endl;
LE's avatar
LE committed

ELATTAOUI's avatar
ELATTAOUI committed
	if(_serial_proxy)
LE's avatar
LE committed
	{
		delete _serial_proxy;
		_serial_proxy = 0;
		_is_serial_proxy_created = false;
	}

ELATTAOUI's avatar
ELATTAOUI committed
	//std::cout << "TangoSerialLink::~TangoSerialLink ->" << std::endl;
LE's avatar
LE committed
}


// ============================================================================
// TangoSerialLink::create_serial_proxy
// ============================================================================
void TangoSerialLink::create_serial_proxy (void)  throw (Tango::DevFailed)
{
ELATTAOUI's avatar
ELATTAOUI committed
  std::string description("");
LE's avatar
LE committed

	try
	{
		//- try
		this->_serial_proxy = new Tango::DeviceProxyHelper(_communication_Device_name);
ELATTAOUI's avatar
ELATTAOUI committed
		(*_serial_proxy)->ping();
LE's avatar
LE committed
		_is_serial_proxy_created = true;
	}
	catch(Tango::DevFailed& df )
	{
ELATTAOUI's avatar
ELATTAOUI committed
		description = "Unable to create proxy on : " + _communication_Device_name;
LE's avatar
LE committed
		_is_serial_proxy_created = false;
ELATTAOUI's avatar
ELATTAOUI committed
		this->_serial_proxy = 0;
LE's avatar
LE committed
		Tango::Except::re_throw_exception (df,
										(const char*)"COMMUNICATION_ERROR",
ELATTAOUI's avatar
ELATTAOUI committed
										description.c_str(),
LE's avatar
LE committed
										(const char*)"TangoSerialLink::create_serial_proxy");

	}
}

// ============================================================================
// TangoSerialLink::write
// ============================================================================
void TangoSerialLink::write (std::string command_to_send)  throw (Tango::DevFailed)
{
ELATTAOUI's avatar
ELATTAOUI committed
  std::string description("");
LE's avatar
LE committed

ELATTAOUI's avatar
ELATTAOUI committed
	if(!_serial_proxy)
LE's avatar
LE committed
		create_serial_proxy();

	try
	{
		//- try
		this->_serial_proxy->command_in("DevSerWriteString", command_to_send.c_str());
	}
	catch(Tango::DevFailed& df )
	{
ELATTAOUI's avatar
ELATTAOUI committed
		description = "Unable to write command : " + command_to_send;
LE's avatar
LE committed

		Tango::Except::re_throw_exception (df,
										(const char*)"COMMUNICATION_ERROR",
ELATTAOUI's avatar
ELATTAOUI committed
										description.c_str(),
LE's avatar
LE committed
										(const char*)"TangoSerialLink::write");

	}
}


// ============================================================================
// TangoSerialLink::read
// ============================================================================
std::string TangoSerialLink::read (void) throw (Tango::DevFailed)
{

ELATTAOUI's avatar
ELATTAOUI committed
	if(!_serial_proxy)
LE's avatar
LE committed
		create_serial_proxy();

	try
	{
		//- try in mode LINE
ELATTAOUI's avatar
ELATTAOUI committed
		//this->_serial_proxy->command_inout("DevSerReadString", MODE_LINE ,this->response);
		this->_serial_proxy->command_out("DevSerReadLine", this->response);
LE's avatar
LE committed
	}
	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)
{
ELATTAOUI's avatar
ELATTAOUI committed
	if(!_serial_proxy)
		create_serial_proxy();

LE's avatar
LE committed
	std::string respTmp("");
ELATTAOUI's avatar
ELATTAOUI committed
	long flush_in_out = 2;

	//- Flush buffers ( In & Out = 2 )
	_serial_proxy->command_in("DevSerFlush", flush_in_out);
LE's avatar
LE committed

	omni_thread::sleep(0, 200000000); //200 milliseconds
	write(command_to_send);
ELATTAOUI's avatar
ELATTAOUI committed

LE's avatar
LE committed
	//- sleep a little bit to let the adapter(RS232/485) to switch mode
	omni_thread::sleep(0, 100000000); //100 milliseconds
ELATTAOUI's avatar
ELATTAOUI committed
	
LE's avatar
LE committed
	// now read response from HW 
ELATTAOUI's avatar
ELATTAOUI committed
	return this->read();
LE's avatar
LE committed
}