Newer
Older
// ============================================================================
//
// = 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)

ELATTAOUI
committed
//- 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
// ============================================================================
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;
// //std::cout << "TangoSerialLink::TangoSerialLink ->" << std::endl;
}
// ============================================================================
// TangoSerialLink::~TangoSerialLink
// ============================================================================
TangoSerialLink::~TangoSerialLink (void)
{
{
delete _serial_proxy;
_serial_proxy = 0;
_is_serial_proxy_created = false;
}
}
// ============================================================================
// TangoSerialLink::create_serial_proxy
// ============================================================================
void TangoSerialLink::create_serial_proxy (void) throw (Tango::DevFailed)
{

ELATTAOUI
committed
this->_serial_proxy = new Tango::DeviceProxy(_communication_Device_name.c_str());
//(*_serial_proxy)->ping();
_is_serial_proxy_created = true;
}
catch(Tango::DevFailed& df )
{
if( this->_serial_proxy )
{
delete this->_serial_proxy;
this->_serial_proxy = 0;
}
description = "Unable to create proxy on : " + _communication_Device_name;
catch(...)
{
if( this->_serial_proxy )
{
delete this->_serial_proxy;
this->_serial_proxy = 0;
}
_is_serial_proxy_created = false;
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");
}
}
// ============================================================================
// TangoSerialLink::write
// ============================================================================
void TangoSerialLink::write (std::string command_to_send) throw (Tango::DevFailed)
{

ELATTAOUI
committed
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 )
{

ELATTAOUI
committed
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");
}

ELATTAOUI
committed
dd_in << argin;
this->_serial_proxy->command_inout("DevSerWriteString", dd_in);
//std::cout << "TangoSerialLink::write -> argin = *\"" << argin << "\"*" << std::endl;
Tango::Except::re_throw_exception (df,
(const char*)"COMMUNICATION_ERROR",
catch(...)
{
if( argin )
{
delete [] argin;
argin = 0;
}
description = "Unable to write command : " + command_to_send;
Tango::Except::throw_exception (
(const char*)"COMMUNICATION_ERROR",
description.c_str(),
(const char*)"TangoSerialLink::write");
}
}
// ============================================================================
// TangoSerialLink::read
// ============================================================================
std::string TangoSerialLink::read (void) throw (Tango::DevFailed)
{

ELATTAOUI
committed
Tango::DeviceData dd_out;

ELATTAOUI
committed
dd_out = this->_serial_proxy->command_inout("DevSerReadLine");
dd_out >> 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");
}
catch(...)
{
Tango::Except::throw_exception (
(const char*)"COMMUNICATION_ERROR",
(const char*)"Unable to perform a read operation",
(const char*)"TangoSerialLink::read");
}
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
// ============================================================================
// TangoSerialLink::read
// ============================================================================
std::string TangoSerialLink::read (long nbCharToRead) throw (Tango::DevFailed)
{
if(!_serial_proxy)
create_serial_proxy();
Tango::DeviceData dd_in;
Tango::DeviceData dd_out;
try
{
dd_in << nbCharToRead;
//- try get the specified nb characters
dd_out = this->_serial_proxy->command_inout("DevSerReadNChar", dd_in);
dd_out >> this->response;
//std::cout << "TangoSerialLink::read -> nb_char = " << nbCharToRead << " and resp : \"" << this->response << "\"" << std::endl;
}
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(nChar)");
}
return this->response ;
}
// ============================================================================
// TangoSerialLink::write_read
// ============================================================================
std::string TangoSerialLink::write_read (std::string command_to_send) throw (Tango::DevFailed)
{

ELATTAOUI
committed
Tango::DeviceData dd_in;

ELATTAOUI
committed
dd_in << flush_in_out;

ELATTAOUI
committed
this->_serial_proxy->command_inout("DevSerFlush", dd_in);
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
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
// ============================================================================
// TangoSerialLink::write_read : read N char
// ============================================================================
std::string TangoSerialLink::write_read (std::string command_to_send, long nbChar) throw (Tango::DevFailed)
{
if(!_serial_proxy)
create_serial_proxy();
Tango::DeviceData dd_in;
Tango::DeviceData dd_out;
std::string respTmp("");
long flush_in_out = 2;
dd_in << flush_in_out;
//- Flush buffers ( In & Out = 2 )
this->_serial_proxy->command_inout("DevSerFlush", dd_in);
//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
//- wait till characters are available in the input buffer (max 30 retries !)
size_t nbRetries = 0;
Tango::DevLong nbCharReceived = 0;
dd_out = this->_serial_proxy->command_inout("DevSerGetNChar");
dd_out >> nbCharReceived;
while ( !nbCharReceived && nbRetries < 50 )
{
dd_out = this->_serial_proxy->command_inout("DevSerGetNChar");
dd_out >> nbCharReceived;
nbRetries++;
//std::cout << "TangoSerialLink::write_read -> nbRetries = " << nbRetries << " & nbCharReceived = " << nbCharReceived << std::endl;
}
//std::cout << "END WHILE -> nbRetries = " << nbRetries << " & nbCharReceived = " << nbCharReceived << std::endl;
// now read response from HW
return this->read(nbChar);
}