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
static const long MODE_LINE = 2;

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::DeviceProxyHelper(_communication_Device_name);
this->_serial_proxy = new Tango::DeviceProxy(_communication_Device_name.c_str());
//(*_serial_proxy)->ping();
_is_serial_proxy_created = true;
}
catch(Tango::DevFailed& df )
{
description = "Unable to create proxy on : " + _communication_Device_name;
Tango::Except::re_throw_exception (df,
(const char*)"COMMUNICATION_ERROR",
(const char*)"TangoSerialLink::create_serial_proxy");
}
}
// ============================================================================
// TangoSerialLink::write
// ============================================================================
void TangoSerialLink::write (std::string command_to_send) throw (Tango::DevFailed)
{

ELATTAOUI
committed
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
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 )
{
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",
(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");
}
return this->response ;
}
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
// ============================================================================
// 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
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
// ============================================================================
// 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);
}