Code owners
Assign users and groups as approvers for specific file changes. Learn more.
KeithleyDDCProtocol.cpp 23.16 KiB
// ============================================================================
//
// = CONTEXT
// TANGO Project - DDC KeithleyDDCProtocol Support Library
//
// = FILENAME
// KeithleyDDCProtocol.cpp
//
// = AUTHOR
// X. Elattaoui
//
// ============================================================================
// ============================================================================
// DEPENDENCIES
// ============================================================================
#include <iostream>
#include <sstream>
#include <string>
#include <helpers/XString.h>
#include "KeithleyDDCProtocol.h"
// ============================================================================
// KeithleyDDCProtocol::KeithleyDDCProtocol
// ============================================================================
KeithleyDDCProtocol::KeithleyDDCProtocol (std::string& gpib_device_name)
: ElectrometerProtocol(),
_communication_link(0),
_is_overloaded(false)
{
std::cout << "KeithleyDDCProtocol::KeithleyDDCProtocol <-" << std::endl;
_commDevName = gpib_device_name;
std::cout << "KeithleyDDCProtocol::KeithleyDDCProtocol -> " << _commDevName << std::endl;
}
// ============================================================================
// KeithleyDDCProtocol::~KeithleyDDCProtocol
// ============================================================================
KeithleyDDCProtocol::~KeithleyDDCProtocol (void)
{
std::cout << "KeithleyDDCProtocol::~KeithleyDDCProtocol <-" << std::endl;
if(_communication_link)
{
delete _communication_link;
_communication_link = 0;
}
std::cout << "KeithleyDDCProtocol::~KeithleyDDCProtocol ->" << std::endl;
}
// ============================================================================
// KeithleyDDCProtocol::build_communicationLink
// ============================================================================
bool KeithleyDDCProtocol::build_communicationLink()
{
if (_commDevName.empty())
return false;
_communication_link = new TangoGpibLink (_commDevName);
if (!_communication_link)
return false;
//- prefix is enabled : this to the overload state !
this->enable_readingWithPrefix();
return true;
}
// ============================================================================
// KeithleyDDCProtocol::set_range
// ============================================================================
void KeithleyDDCProtocol::set_range (std::string value)
{
std::stringstream cmd_to_send;
//- send command to Keithley device
cmd_to_send << "R" << value << "X" << std::ends;
_communication_link->write(cmd_to_send.str());
}
// ============================================================================
// KeithleyDDCProtocol::get_range
// ============================================================================
std::string KeithleyDDCProtocol::get_range (void)
{
throw electrometer::ElectrometerException("COMMAND_NOT_SUPPORTED",
"For DDC Keithley type, please check the status.",
"KeithleyDDCProtocol::get_range( ).");
}
// ============================================================================
// KeithleyDDCProtocol::zero_check_on
// ============================================================================
void KeithleyDDCProtocol::zero_check_on (void)
{
std::stringstream cmd_to_send;
//- send command
cmd_to_send << "C1X" << std::ends;
_communication_link->write(cmd_to_send.str());
}
// ============================================================================
// KeithleyDDCProtocol::zero_check_off
// ============================================================================
void KeithleyDDCProtocol::zero_check_off (void)
{
std::stringstream cmd_to_send;
//- send command
cmd_to_send << "C0X" << std::ends;
_communication_link->write(cmd_to_send.str());
}
// ============================================================================
// KeithleyDDCProtocol::zero_correct_on
// ============================================================================
void KeithleyDDCProtocol::zero_correct_on (void)
{
std::stringstream cmd_to_send;
//- send command
cmd_to_send << "Z1X" << std::ends;
_communication_link->write(cmd_to_send.str());
}
// ============================================================================
// KeithleyDDCProtocol::zero_correct_off
// ============================================================================
void KeithleyDDCProtocol::zero_correct_off (void)
{
std::stringstream cmd_to_send;
//- send command
cmd_to_send << "Z0X" << std::ends;
_communication_link->write(cmd_to_send.str());
}
// ============================================================================
// KeithleyDDCProtocol::auto_zero_on
// ============================================================================
void KeithleyDDCProtocol::auto_zero_on (void)
{
throw electrometer::ElectrometerException("COMMAND_NOT_SUPPORTED",
"DDC Keithley does not support this command.",
"KeithleyDDCProtocol::auto_zero_on( ).");
}
// ============================================================================
// KeithleyDDCProtocol::auto_zero_off
// ============================================================================
void KeithleyDDCProtocol::auto_zero_off (void)
{
throw electrometer::ElectrometerException("COMMAND_NOT_SUPPORTED",
"DDC Keithley does not support this command.",
"KeithleyDDCProtocol::auto_zero_off( ).");
}
// ============================================================================
// KeithleyDDCProtocol::autoRange_ON
// ============================================================================
void KeithleyDDCProtocol::autoRange_on (void)
{
std::stringstream cmd_to_send;
cmd_to_send << "R0X" << std::ends;
_communication_link->write(cmd_to_send.str());
}
// ============================================================================
// KeithleyDDCProtocol::autoRange_OFF
// ============================================================================
void KeithleyDDCProtocol::autoRange_off (void)
{
throw electrometer::ElectrometerException("COMMAND_NOT_SUPPORTED",
"DDC Keithley does not support this command.",
"KeithleyDDCProtocol::autoRange_off( ).");
}
// ============================================================================
// KeithleyDDCProtocol::autoRange_OFF for Keithley 486 & 487
// ============================================================================
void KeithleyDDCProtocol::autoRange_OFF_forK486_487 (void)
{
std::stringstream cmd_to_send;
//- send command
cmd_to_send << "R10X" << std::ends;
_communication_link->write(cmd_to_send.str());
}
// ============================================================================
// KeithleyDDCProtocol::autoRange_OFF for Keithley 617 & 6512
// ============================================================================
void KeithleyDDCProtocol::autoRange_OFF_forK617_6512 (void)
{
std::stringstream cmd_to_send;
//- send command
cmd_to_send << "R12X" << std::ends;
_communication_link->write(cmd_to_send.str());
}
// ============================================================================
// KeithleyDDCProtocol::MODE -> Ampere, Volt, Ohm, Coulomb and V on I meters
// ============================================================================
// ============================================================================
// KeithleyDDCProtocol::setAmperMeterMode (617 & 6512 Keithley DDC models
// ============================================================================
void KeithleyDDCProtocol::setAmperMeterMode (void)
{
std::stringstream cmd_to_send;
//- mode current
_mode = "CURRent";
//- send command
cmd_to_send << "F1X" << std::ends;
_communication_link->write(cmd_to_send.str());
}
// ============================================================================
// KeithleyDDCProtocol::setAmperMeterMode (487 Keithley DDC model
// ============================================================================
void KeithleyDDCProtocol::setAmperMeterMode_forK487 (void)
{
std::stringstream cmd_to_send;
//- mode current
_mode = "CURRent";
//- send command
cmd_to_send << "F0X" << std::ends;
_communication_link->write(cmd_to_send.str());
}
// ============================================================================
// KeithleyDDCProtocol::setVoltMeterMode (617 & 6512 Keithley DDC models
// ============================================================================
void KeithleyDDCProtocol::setVoltMeterMode (void)
{
std::stringstream cmd_to_send;
//- mode volt
_mode = "VOLTage";
//- send command
cmd_to_send << "F0X" << std::ends;
_communication_link->write(cmd_to_send.str());
}
// ============================================================================
// KeithleyDDCProtocol::setOhmMeterMode (617 & 6512 Keithley DDC models
// ============================================================================
void KeithleyDDCProtocol::setOhmMeterMode (void)
{
std::stringstream cmd_to_send;
//- send command
//- mode ohm
_mode = "RESistance";
cmd_to_send << "F2X" << std::ends;
_communication_link->write(cmd_to_send.str());
}
// ============================================================================
// KeithleyDDCProtocol::setCoulombMeterMode (617 & 6512 Keithley DDC models
// ============================================================================
void KeithleyDDCProtocol::setCoulombMeterMode (void)
{
std::stringstream cmd_to_send;
//- mode coulomb
_mode = "CHARge";
//- send command
cmd_to_send << "F3X" << std::ends;
_communication_link->write(cmd_to_send.str());
}
// ============================================================================
// KeithleyDDCProtocol::get_value
// ============================================================================
std::string KeithleyDDCProtocol::get_value (void)
{
std::stringstream cmd_to_send;
std::string argout("no data");
//- get data value
cmd_to_send << "X" << std::ends;
_communication_link->write(cmd_to_send.str());
argout = _communication_link->read();
//- check if device range is overloaded : First char of the prefix !
if(argout[0] == 'O') //- O means overload !
_is_overloaded = true;
else
_is_overloaded = false;
//- return value : data begin at idx 4
argout = argout.substr(4);
return argout;
}
// ============================================================================
// KeithleyDDCProtocol::get_integratedValue
// ============================================================================
std::vector<double> KeithleyDDCProtocol::get_integratedValue (void)
{
std::string tmp("");
//- This command queries the bufferised values after an integration
tmp = _communication_link->read();
//- extract all data
return buildDataList(tmp);
}
// ============================================================================
// KeithleyDDCProtocol::get_fetchValue
// ============================================================================
std::vector<double> KeithleyDDCProtocol::get_fetchValue (void)
{
std::string tmp("");
//- This command queries the last bufferised value(s)
tmp = _communication_link->read();
//- extract all data
return buildDataList(tmp);
}
// ============================================================================
// KeithleyDDCProtocol::buildDataList
//
// This method extract and convert data from the received string
// ============================================================================
std::vector<double> KeithleyDDCProtocol::buildDataList(std::string datalist)
{
std::string dataStr("");
std::vector<double> argout;
std::string::size_type posBeg;
std::string::size_type posEnd;
//-
posBeg = 0;
posEnd = datalist.find(',', posBeg);
//- there is just one value
if(posEnd == std::string::npos)
{
argout.push_back( XString<double>::convertFromString(datalist) );
}
else
{
for(; posEnd != std::string::npos; )
{
dataStr = datalist.substr(posBeg,posEnd);
argout.push_back( XString<double>::convertFromString(dataStr) );
posBeg = posEnd+1;
posEnd = datalist.find(',', posBeg);
//- end of string reached so latest data is here
if(posEnd == std::string::npos)
{
dataStr = datalist.substr(posBeg);
argout.push_back( XString<double>::convertFromString(dataStr) );
break;
}
}
}
return argout;
}
// ============================================================================
// KeithleyDDCProtocol::reset
// ============================================================================
void KeithleyDDCProtocol::reset (void)
{
std::stringstream cmd_to_send;
//- send command to return to default conditions !!
cmd_to_send << "*RST" << std::ends;
_communication_link->write(cmd_to_send.str());
}
// ============================================================================
// KeithleyDDCProtocol::get_raw_status
// ============================================================================
std::string KeithleyDDCProtocol::get_raw_status (void)
{
std::stringstream cmd_to_send;
std::string argout("no data");
cmd_to_send.str("");
//- get status word
cmd_to_send << "U1X" << std::endl;
_communication_link->write(cmd_to_send.str());
//- DDC devices are to slow to give a response for a write_read cmd
argout = _communication_link->read();
return argout;
}
// ============================================================================
// KeithleyDDCProtocol::get_DDC_configuration
// ============================================================================
std::string KeithleyDDCProtocol::get_DDC_configuration (void)
{
std::stringstream cmd_to_send;
std::string argout("no data");
cmd_to_send.str("");
//- get status word
cmd_to_send << "U0X" << std::endl;
_communication_link->write(cmd_to_send.str());
argout = _communication_link->read();
return argout;
}
// ============================================================================
// KeithleyDDCProtocol::clear_registers
// ============================================================================
void KeithleyDDCProtocol::clear_registers (void)
{
std::stringstream cmd_to_send;
//- send command
cmd_to_send << "*CLS" << std::ends;
_communication_link->write(cmd_to_send.str());
}
// ============================================================================
// KeithleyDDCProtocol::set_buffer_size()
// ============================================================================
void KeithleyDDCProtocol::set_buffer_size (std::string cmd)
{
//- send command
_communication_link->write(cmd);
}
// ============================================================================
// KeithleyDDCProtocol::set_triggerMode()
// ============================================================================
void KeithleyDDCProtocol::set_triggerMode (std::string cmd)
{
//- send command
_communication_link->write(cmd);
}
// ============================================================================
// KeithleyDDCProtocol::enable_SRQBufferFull()
// ============================================================================
void KeithleyDDCProtocol::enable_SRQBufferFull (void)
{
std::string cmd_to_send("M2X");
//- send command : enable buffer full in the Measurement event enable register
_communication_link->write(cmd_to_send);
}
// ============================================================================
// KeithleyDDCProtocol::disable_SRQBufferFull()
// ============================================================================
void KeithleyDDCProtocol::disable_SRQBufferFull (void)
{
std::string cmd_to_send("M0X");
//- send command : disable buffer full event
_communication_link->write(cmd_to_send);
}
// ============================================================================
// KeithleyDDCProtocol::SRQLineState()
// ============================================================================
bool KeithleyDDCProtocol::SRQLineState (void)
{
//- if asserted -> the programmed event occurs : the device can be asked !
return _communication_link->SRQLineState();
}
// ============================================================================
// KeithleyDDCProtocol::readStatusByteRegister()
// ============================================================================
short KeithleyDDCProtocol::readStatusByteRegister (void)
{
//- if asserted -> the programmed event occurs : the device can be asked !
return _communication_link->readStatusByteRegister();
}
// ============================================================================
// KeithleyDDCProtocol::set_conversionRate()
// ============================================================================
void KeithleyDDCProtocol::set_conversionRate (void)
{
std::string cmd_to_send("Q0X");
//- send command : ADC default conversion rate
_communication_link->write(cmd_to_send);
}
// ============================================================================
// KeithleyDDCProtocol::enable_readingWithPrefix()
// ============================================================================
void KeithleyDDCProtocol::enable_readingWithPrefix (void)
{
std::string cmd_to_send("G0X");
//- send command : ADC default conversion rate
_communication_link->write(cmd_to_send);
}
// ============================================================================
// KeithleyDDCProtocol::disable_readingWithPrefix()
// ============================================================================
void KeithleyDDCProtocol::disable_readingWithPrefix (void)
{
std::string cmd_to_send("G1X");
//- send command : ADC default conversion rate
_communication_link->write(cmd_to_send);
}
// ============================================================================
// KeithleyDDCProtocol::enable_ReadingsFromElectrometer() -> disable storing mode
// ============================================================================
void KeithleyDDCProtocol::enable_ReadingsFromElectrometer (void)
{
std::string cmd_to_send("B0X");
//- send command : readings from Electrometer
_communication_link->write(cmd_to_send);
}
// ============================================================================
// KeithleyDDCProtocol::enable_readingsFromBuffer_K617_6512()
// ============================================================================
void KeithleyDDCProtocol::enable_readingsFromBuffer_K617_6512 (void)
{
std::string cmd_to_send("B1X");
//- send command : ADC default conversion rate
_communication_link->write(cmd_to_send);
}
// ============================================================================
// KeithleyDDCProtocol::enable_readingsFromBuffer_K486_487()
// ============================================================================
void KeithleyDDCProtocol::enable_readingsFromBuffer_K486_487 (void)
{
std::string cmd_to_send("B2X");
//- send command : ADC default conversion rate
_communication_link->write(cmd_to_send);
}
// ============================================================================
// KeithleyDDCProtocol::enable_integrationPeriod()
// ============================================================================
void KeithleyDDCProtocol::enable_integrationPeriod (void)
{
std::string cmd_to_send("S1X");
//-
//- send command : this command is only for k_486 or K_487
//- S1 is for : "Line cycle integration period (5-I /2d resolution)"
_communication_link->write(cmd_to_send);
}
/*// ============================================================================
// KeithleyDDCProtocol::init_keithley to perform reading(s) data
// ============================================================================
void KeithleyDDCProtocol::init_keithley (void)
{
//- Set default conversion rate (internal keithley device conversion rate)
this->set_conversionRate();
//- Set default conversion rate (internal keithley device conversion rate)
this->set_conversionRate();
//- Disable readings with prefix
this->disable_readingWithPrefix();
//- send command : INIT to trigg readings !
_communication_link->write(cmd_to_send);
}
// Following functions are part of commands supported via the DDC protocol.
// We may have to implement them after first tests on beamlines
// ============================================================================
// KeithleyDDCProtocol::setExternalFeedbackMeterMode (617 & 6512 Keithley DDC models
// ============================================================================
void KeithleyDDCProtocol::setExternalFeedbackMeterMode (void)
throw (electrometer::ElectrometerException, Tango::DevFailed)
{
std::stringstream cmd_to_send;
//- send command
cmd_to_send << "F4X" << std::ends;
_communication_link->write(cmd_to_send.str());
}
// ============================================================================
// KeithleyDDCProtocol::setVonIMeterMode (only 617 Keithley DDC model
// ============================================================================
void KeithleyDDCProtocol::setVonIMeterMode (void)
throw (electrometer::ElectrometerException, Tango::DevFailed)
{
std::stringstream cmd_to_send;
//- send command
cmd_to_send << "F5X" << std::ends;
_communication_link->write(cmd_to_send.str());
}
// ============================================================================
// KeithleyDDCProtocol::setVonIMeterMode (only 487 Keithley DDC model
// ============================================================================
void KeithleyDDCProtocol::setVonIMeterMode_forK487 (void)
throw (electrometer::ElectrometerException, Tango::DevFailed)
{
std::stringstream cmd_to_send;
//- send command
cmd_to_send << "F1X" << std::ends;
_communication_link->write(cmd_to_send.str());
}
... TO BE IMPLEMENTED !!!!!
// ============================================================================
// KeithleyDDCProtocol::reading_source
// ============================================================================
void KeithleyDDCProtocol::reading_source (void)
throw (electrometer::ElectrometerException, Tango::DevFailed)
{
}
// ============================================================================
// KeithleyDDCProtocol::reading_source
// ============================================================================
void KeithleyDDCProtocol::data_store (void)
throw (electrometer::ElectrometerException, Tango::DevFailed)
{
}
// ============================================================================
// KeithleyDDCProtocol::reading_source
// ============================================================================
void KeithleyDDCProtocol::data_format (void)
throw (electrometer::ElectrometerException, Tango::DevFailed)
{
}
// ============================================================================
// KeithleyDDCProtocol::reading_source
// ============================================================================
void KeithleyDDCProtocol::baseline_suppression_ON (void)
throw (electrometer::ElectrometerException, Tango::DevFailed)
{
}
// ============================================================================
// KeithleyDDCProtocol::reading_source
// ============================================================================
void KeithleyDDCProtocol::baseline_suppression_OFF (void)
throw (electrometer::ElectrometerException, Tango::DevFailed)
{
}
// ============================================================================
// KeithleyDDCProtocol::reading_source
// ============================================================================
void KeithleyDDCProtocol::keithley_status (void)
throw (electrometer::ElectrometerException, Tango::DevFailed)
{
}
*/