18#define VI_STATUS_DESC_MAX_LEN 256
20#define READ_STB_WORKAROUND_POLL_PERIOD_MS 10
23#define DEBUG_MTL_VISA_INSTRUMENT 0
24#define DEBUG_MTL_VISA_INSTRUMENT_ERRORS_ONLY 0
25#if (defined(_DEBUG) && defined(DEBUG_MTL_VISA_INSTRUMENT) && DEBUG_MTL_VISA_INSTRUMENT)
26#if (defined(DEBUG_MTL_VISA_INSTRUMENT_ERRORS_ONLY) && DEBUG_MTL_VISA_INSTRUMENT_ERRORS_ONLY)
27#define MTL_VISA_INSTRUMENT_DEBUG_COUT(__X__)
29#define MTL_VISA_INSTRUMENT_DEBUG_COUT(__X__) COUT(__X__)
31#define MTL_VISA_INSTRUMENT_DEBUG_CERR(__X__) CERR(__X__)
33#define MTL_VISA_INSTRUMENT_DEBUG_COUT(__X__)
34#define MTL_VISA_INSTRUMENT_DEBUG_CERR(__X__)
50 viStatusDesc(Session, Status, Desc);
51 return std::string(Desc);
53#if (defined(DEBUG_MTL_VISA_INSTRUMENT) && DEBUG_MTL_VISA_INSTRUMENT)
56 if (VI_SUCCESS != Status)
62#define l_DebugCheckStatus(__X__, __Y__)
93 m_Status = viOpenDefaultRM(&m_DefaultRM);
96 m_DefaultRM =
static_cast<ViSession
>(NULL);
125 viStatusDesc(m_DefaultRM,
Status, Desc);
126 return std::string(Desc);
155 ViChar rsrcName[VI_FIND_BUFLEN];
159 ViString l_Filter =
const_cast<ViString
>(Filter.c_str());
160 m_Status = viFindRsrc(m_DefaultRM, l_Filter, &fList, &numInstrs, rsrcName);
164 while (numInstrs-- &&
m_Status == VI_SUCCESS)
167 m_Status = viFindNext(fList, rsrcName);
172 if (rList.size() > 0)
179 case VI_ERROR_INV_OBJECT:
180 case VI_ERROR_NSUP_OPER:
181 case VI_ERROR_INV_EXPR:
188 case VI_ERROR_RSRC_NFOUND:
208 ViChar rsrcName[VI_FIND_BUFLEN];
212 ViString l_Filter =
const_cast<ViString
>(Filter.c_str());
213 m_Status = viFindRsrc(m_DefaultRM, l_Filter, &fList, &numInstrs, rsrcName);
217 while (numInstrs-- &&
m_Status == VI_SUCCESS)
219 ViUInt16 l_Type, l_Number;
220 ViChar l_Class[100], l_ExpName[100], l_Alias[100];
221 m_Status = viParseRsrcEx(m_DefaultRM,
static_cast<ViRsrc
>(rsrcName), &l_Type, &l_Number, l_Class, l_ExpName, l_Alias);
232 m_Status = viFindNext(fList, rsrcName);
236 else if (VI_ERROR_RSRC_NFOUND !=
m_Status)
250 case VI_ERROR_RSRC_NFOUND:
267 ViUInt16 l_Type, l_Number;
268 m_Status = viParseRsrc(m_DefaultRM,
const_cast<ViRsrc
>(rRsrc.c_str()), &l_Type, &l_Number);
283 case VI_ERROR_INV_OBJECT:
284 case VI_ERROR_NSUP_OPER:
285 case VI_ERROR_INV_RSRC_NAME:
286 case VI_ERROR_RSRC_NFOUND:
288 case VI_ERROR_LIBRARY_NFOUND:
289 case VI_ERROR_INTF_NUM_NCONFIG:
307 ViUInt16 l_Type, l_Number;
308 ViChar l_Class[100], l_ExpName[100], l_Alias[100];
309 m_Status = viParseRsrcEx(m_DefaultRM,
const_cast<ViRsrc
>(rRsrc.c_str()), &l_Type, &l_Number, l_Class, l_ExpName, l_Alias);
324 case VI_WARN_EXT_FUNC_NIMPL:
327 case VI_ERROR_INV_OBJECT:
328 case VI_ERROR_NSUP_OPER:
329 case VI_ERROR_INV_RSRC_NAME:
330 case VI_ERROR_RSRC_NFOUND:
332 case VI_ERROR_LIBRARY_NFOUND:
333 case VI_ERROR_INTF_NUM_NCONFIG:
349 :
CIEEE488Instrument(rRM, Rsrc), m_InstrSession(static_cast<ViSession>(NULL)), m_ExclusiveLock(false)
357 viClose(m_InstrSession);
375 m_Status = viOpen(l_Session,
const_cast<ViRsrc
>(
m_Rsrc.c_str()),
static_cast<ViAccessMode
>(AccessMode), Timeout_ms, &m_InstrSession);
403 return (0 != m_InstrSession);
418 viStatusDesc(m_InstrSession,
Status, Desc);
419 return std::string(Desc);
426 return m_InstrSession;
441 return Write(
reinterpret_cast<ViBuf
>(
const_cast<char *
>(Str)),
static_cast<ViUInt32
>(std::strlen(Str)));
447 return Write(
reinterpret_cast<ViBuf
>(
const_cast<char *
>(rStr.c_str())),
static_cast<ViUInt32
>(rStr.length()));
453 return Write(
reinterpret_cast<ViBuf
>(
const_cast<char *
>(rBuf.
data())),
static_cast<ViUInt32
>(rBuf.
size()));
462 m_Status = viWrite(m_InstrSession, WriteBuf, BuffLen, &retCount);
470 viClear(m_InstrSession);
473 return (
m_Status == VI_SUCCESS && BuffLen == retCount);
483 l_Ret =
Read(
reinterpret_cast<ViPBuf
>(rBuf.
data()),
static_cast<ViUInt32
>(rBuf.
capacity()), l_RetLen);
489 size_t l_Size = rBuf.
size();
490 size_t l_Capacity = rBuf.
capacity();
491 if (l_Size >= l_Capacity)
496 l_Ret =
Read(
reinterpret_cast<ViPBuf
>(rBuf.
data() + l_Size),
static_cast<ViUInt32
>(l_Capacity - l_Size), l_RetLen);
497 rBuf.
resize(l_Size + l_RetLen);
506 m_Status = viRead(m_InstrSession, ReadBuf, ReadLen, &rRetLen);
510 case VI_SUCCESS_TERM_CHAR:
511 case VI_SUCCESS_MAX_CNT:
547#if (defined(ACTIVATE_READ_STB_WORKAROUND) && ACTIVATE_READ_STB_WORKAROUND)
556 ViUInt32 l_CurrentTimeout;
557 m_Status = viGetAttribute(m_InstrSession, VI_ATTR_TMO_VALUE, &l_CurrentTimeout);
558 if (
m_Status != VI_SUCCESS)
throw false;
561 if (
m_Status != VI_SUCCESS)
throw false;
563 for (
unsigned char NoRetries = 5; NoRetries > 0; NoRetries--)
565 m_Status = viReadSTB(m_InstrSession, &rSTB);
579 m_Status = viSetAttribute(m_InstrSession, VI_ATTR_TMO_VALUE, l_CurrentTimeout);
580 if (
m_Status != VI_SUCCESS)
throw false;
589 m_Status = viReadSTB(m_InstrSession, &rSTB);
603 m_Status = viAssertTrigger(m_InstrSession,
static_cast<ViUInt16
>(Protocol));
615 m_Status = viLock(m_InstrSession, VI_EXCLUSIVE_LOCK,
static_cast<ViUInt32
>(
Timeout),
nullptr,
nullptr);
619 case VI_SUCCESS_NESTED_EXCLUSIVE:
620 case VI_SUCCESS_NESTED_SHARED:
621 m_ExclusiveLock =
true;
633 m_Status = viLock(m_InstrSession, VI_SHARED_LOCK,
Timeout, RequestedKey, AccessKey);
637 case VI_SUCCESS_NESTED_EXCLUSIVE:
638 case VI_SUCCESS_NESTED_SHARED:
650 m_Status = viUnlock(m_InstrSession);
654 case VI_SUCCESS_NESTED_EXCLUSIVE:
655 case VI_SUCCESS_NESTED_SHARED:
656 m_ExclusiveLock =
false;
665 return m_ExclusiveLock;
691 m_Status = viEnableEvent(m_InstrSession,
static_cast<ViEventType
>(Type),
static_cast<ViUInt16
>(Mechanism), VI_NULL);
695 case VI_SUCCESS_EVENT_EN:
707 m_Status = viDisableEvent(m_InstrSession,
static_cast<ViEventType
>(Type),
static_cast<ViUInt16
>(Mechanism));
711 case VI_SUCCESS_EVENT_DIS:
723 m_Status = viWaitOnEvent(m_InstrSession,
static_cast<ViEventType
>(Type),
Timeout,
nullptr,
nullptr);
727 case VI_SUCCESS_QUEUE_NEMPTY:
739 m_Status = viWaitOnEvent(m_InstrSession, VI_ALL_ENABLED_EVENTS,
Timeout,
nullptr,
nullptr);
743 case VI_SUCCESS_QUEUE_NEMPTY:
755 m_Status = viDiscardEvents(m_InstrSession,
static_cast<ViEventType
>(Type),
static_cast<ViUInt16
>(Mechanism));
759 case VI_SUCCESS_QUEUE_EMPTY:
774 m_Status = viGetAttribute(m_InstrSession, Attribute, Value);
779 case VI_ERROR_INV_OBJECT:
780 case VI_ERROR_NSUP_ATTR:
789bool CVISAInstrument::UsbControlIn(ViInt16 bmRequestType, ViInt16 bRequest, ViUInt16 wValue, ViUInt16 wIndex, ViUInt16 wLength, ViPBuf buf, ViUInt16 & rretCnt)
794 m_Status = viUsbControlIn(m_InstrSession, bmRequestType, bRequest, wValue, wIndex, wLength, buf, &rretCnt);
799 case VI_ERROR_INV_OBJECT:
800 case VI_ERROR_RSRC_LOCKED:
802 case VI_ERROR_INV_SETUP:
804 case VI_ERROR_CONN_LOST:
805 case VI_ERROR_INV_PARAMETER:
806 case VI_ERROR_INV_MASK:
818 m_Status = viUsbControlOut(m_InstrSession, bmRequestType, bRequest, wValue, wIndex, wLength, buf);
823 case VI_ERROR_INV_OBJECT:
824 case VI_ERROR_RSRC_LOCKED:
826 case VI_ERROR_INV_SETUP:
828 case VI_ERROR_CONN_LOST:
829 case VI_ERROR_INV_PARAMETER:
830 case VI_ERROR_INV_MASK:
846 m_Status = viSetAttribute(m_InstrSession, VI_ATTR_ASRL_BAUD,
static_cast<ViAttrState
>(rPortSettings.
Baudrate));
847 if (
m_Status != VI_SUCCESS)
throw false;
850 m_Status = viSetAttribute(m_InstrSession, VI_ATTR_ASRL_DATA_BITS,
static_cast<ViAttrState
>(rPortSettings.
DataBits));
851 if (
m_Status != VI_SUCCESS)
throw false;
854 m_Status = viSetAttribute(m_InstrSession, VI_ATTR_ASRL_PARITY,
static_cast<ViAttrState
>(rPortSettings.
Parity));
855 if (
m_Status != VI_SUCCESS)
throw false;
858 m_Status = viSetAttribute(m_InstrSession, VI_ATTR_ASRL_STOP_BITS,
static_cast<ViAttrState
>(rPortSettings.
StopBits));
859 if (
m_Status != VI_SUCCESS)
throw false;
862 m_Status = viSetAttribute(m_InstrSession, VI_ATTR_ASRL_FLOW_CNTRL,
static_cast<ViAttrState
>(rPortSettings.
Handshake));
863 if (
m_Status != VI_SUCCESS)
throw false;
866 m_Status = viSetAttribute(m_InstrSession, VI_ATTR_ASRL_END_IN,
static_cast<ViAttrState
>(rPortSettings.
ReadTermMode));
867 if (
m_Status != VI_SUCCESS)
throw false;
872 m_Status = viSetAttribute(m_InstrSession, VI_ATTR_TERMCHAR,
static_cast<ViAttrState
>(rPortSettings.
ReadTermChar));
873 if (
m_Status != VI_SUCCESS)
throw false;
876 m_Status = viSetAttribute(m_InstrSession, VI_ATTR_TERMCHAR_EN,
static_cast<ViAttrState
>(
true));
877 if (
m_Status != VI_SUCCESS)
throw false;
882 m_Status = viSetAttribute(m_InstrSession, VI_ATTR_TERMCHAR_EN,
static_cast<ViAttrState
>(
false));
883 if (
m_Status != VI_SUCCESS)
throw false;
Collection of utility macros for error messages.
Platform Dependent Definitions.
int I32
32-bit signed integer.
unsigned int U32
32-bit unsigned integer.
#define MTL_VISA_INSTRUMENT_DEBUG_CERR(__X__)
#define READ_STB_WORKAROUND_POLL_PERIOD_MS
#define VI_STATUS_DESC_MAX_LEN
#define MTL_VISA_INSTRUMENT_DEBUG_COUT(__X__)
#define l_DebugCheckStatus(__X__, __Y__)
C++ wrapper for NI-VISA: interface definition.
CRecursiveMutex m_Lock
Lock onto the class interface.
tResourceName m_Rsrc
Resource name of the instrument.
CIEEE488ResourceManager & m_rRrsrcMan
Reference to the associated resource manager.
bool SetTimeout(U32 Timeout)
Set the timeout for this instrument.
CIEEE488Instrument(CIEEE488ResourceManager &rRM, tResourceName Rsrc)
Constructor.
I32 m_Status
Status of last operation.
CMutex m_Lock
Lock onto the resource manager.
I32 m_Status
Status of last operation.
Parsed resource information for a list of instruments.
List of VISA resource names.
void resize(size_t size)
Resize the buffer.
MTL_INSTRUMENT_BUFFER_TYPE * data() noexcept
Return a pointer to the data.
void reserve(size_t capacity)
Allocate at least a given amount of space.
size_t capacity() const
Return the buffer capacity (allocated size).
size_t size() const
Return the buffer size.
virtual bool Unlock()
Unlock the session.
virtual bool Open(void)
Open a session to this VISA instrument.
const ViSession & Session()
Return instrument session identifier.
virtual ~CVISAInstrument()
Destructor.
virtual bool LockExclusive(U32 Timeout)
Obtain an exclusive lock for this session.
virtual bool Read(CSCPIBuffer &rBuf, bool Append=false)
Read from a VISA instrument: SCPI buffer class variant.
virtual bool Timeout()
Last operation timed out.
virtual bool Clear()
Clear the instrument.
virtual bool ReadSTB(ViUInt16 &rSTB)
Read status byte.
virtual bool LockedExclusive()
Check whether session is locked exclusively.
virtual bool DiscardEvents(void)
Discard service requests.
bool WaitOnAllEvents(ViUInt32 Timeout)
Wait for all events.
virtual void Close()
Close session to this VISA instrument.
virtual bool IsOpen()
Check whether a session to this instrument is open.
bool ConfigSerialPort(const sSerialPortSettings &rPortSettings)
Set all the instrument attributes to configure the serial communication.
virtual bool AssertTrigger(void)
Assert a trigger.
virtual bool Write(const char *Str)
Write to a VISA instrument: C string variant.
virtual bool SetTimeout(ViUInt32 Timeout)
Set the timeout for this instrument session.
virtual bool DisableEvent(void)
Disable service requests.
bool UsbControlIn(ViInt16 bmRequestType, ViInt16 bRequest, ViUInt16 wValue, ViUInt16 wIndex, ViUInt16 wLength, ViPBuf buf, ViUInt16 &rretCnt)
Performs a USB control pipe transfer from the instrument.
bool LockShared(ViUInt32 Timeout, ViKeyId RequestedKey, ViChar AccessKey[])
Obtain a shared lock for this session.
bool UsbControlOut(ViInt16 bmRequestType, ViInt16 bRequest, ViUInt16 wValue, ViUInt16 wIndex, ViUInt16 wLength, ViBuf buf)
Performs a USB control pipe transfer to the instrument.
virtual bool WaitOnEvent(U32 Timeout)
Wait for a service request.
bool GetAttribute(ViAttr Attribute, void *Value)
Retrieves the state of an attribute.
virtual std::string StatusDescription(I32 Status)
Return description of status word.
CVISAInstrument(CVISAResourceManager &rRM, tResourceName Rsrc)
Constructor.
virtual bool EnableEvent(void)
Enable service requests.
VISA Resource Manager class.
virtual ~CVISAResourceManager()
Destructor.
virtual bool Initialize()
Initialize the Resource Manager.
const ViSession & Session()
Return Resource Manager session identifier.
virtual std::string StatusDescription(I32 Status)
Return description of status word.
CVISAResourceManager()
Constructor.
virtual bool Timeout()
Last operation timed out.
ViStatus Status()
Return Resource Manager status.
bool ResourceInfo(tResourceName &rRsrc, eInterfaceType &rIntfType, tInterfaceNumber &rIntfNumber)
Get the interface type and number for the given VISA resource name.
virtual bool FindResources(CResourceList &rList, std::string Filter="?*")
Find VISA resources.
Information about a VISA resource.
std::string tClass
Class: INSTR / RAW / ...
std::string tAlias
Alias, if any.
std::string tExpandedName
Full resource name.
std::string tResourceName
IEEE488 resource name.
eEventMechanism
Event mechanisms.
@ Queue
Enable the session to queue events.
std::string StatusDescription(ViSession Session, ViStatus Status)
Return user-readable description of the given status code.
ViUInt16 tInterfaceNumber
Interface number.
eOpenAccessMode
Access modes for VISA resources.
@ NoLock
Open session without using an exclusive lock or loading configuration information.
eInterfaceType
VISA interface types.
eTriggerProtocol
Trigger protocols.
@ Default
Default protocol.
@ kEndTermChar
Set termination character to the one specified by VI_ATTR_TERMCHAR()
@ ServiceRequest
Service request was received from device or interface.
Parsed information about a VISA resource.
eSerialDataBits DataBits
[-] Number of transmitted bits per packet
eSerialHandshake Handshake
[-] Handshake configuration of the serial communication
eSerialBaudrate Baudrate
[bd] Speed of the serial communication
eSerialStopBits StopBits
[-] Stop bit configuration of the serial communication
eSerialParity Parity
[-] Parity configuration of the serial communication
eSerialTermMode ReadTermMode
[-] Termination Read mode of the serial communication
char ReadTermChar
[-] Specific termination character when readTermMode = kEndTermChar