rohdeschwarz  0.2.0
TCPIP socket library for Rohde & Schwarz instrument control
visa.cpp
Go to the documentation of this file.
2 using namespace rohdeschwarz::busses::visa;
3 
4 
5 // std lib
6 #include <cerrno>
7 
8 
9 Visa::Visa(std::string resource, unsigned int connection_timeout_ms)
10 {
11  // check for visa
12  if (!_visa.isVisa())
13  {
14  auto error_code = make_error_code(std::errc::not_connected);
15  throw system_error(error_code, "Error loading visa shared library");
16  }
17 
18  // get default visa resource manager
19  if (!openDefaultResourceManager())
20  {
21  auto error_code = make_error_code(std::errc::not_connected);
22  throw system_error(error_code, "Error retrieveing VISA default Resource Manager.");
23  }
24 
25 
26  if (!openInstrument(resource, connection_timeout_ms))
27  {
28  closeResourceManager();
29 
30  // throw exception
31  auto error_code = make_error_code(std::errc::not_connected);
32  throw system_error(error_code, "Error connecting to instrument");
33  }
34 }
35 
36 
38 {
39  closeInstrument();
40  closeResourceManager();
41 }
42 
43 
44 std::string Visa::endpoint() const
45 {
46  return _resource;
47 }
48 
49 
50 int Visa::timeout_ms() const
51 {
52  // get timeout
53  ViAttrState value = -999;
54  attribute(VI_ATTR_TMO_VALUE, &value);
55 
56  // convert to int
57  return int(value);
58 }
59 
60 bool Visa::setTimeout(int timeout_ms)
61 {
62  return setAttribute(VI_ATTR_TMO_VALUE, ViAttrState(timeout_ms)) >= VI_SUCCESS;
63 }
64 
65 
66 bool Visa::readData(unsigned char* buffer, std::size_t bufferSize, std::size_t* readSize)
67 {
68  _status = _visa.viRead(
69  _instrument,
70  ViPBuf(buffer),
71  ViUInt32(bufferSize),
72  ViPUInt32(readSize)
73  );
74  return isError();
75 }
76 
77 
78 bool Visa::writeData(const unsigned char* data, std::size_t dataSize, std::size_t* writeSize)
79 {
80  _status = _visa.viWrite(
81  _instrument,
82  ViBuf(data),
83  ViUInt32(dataSize),
84  ViPUInt32(writeSize)
85  );
86  return isError();
87 }
88 
89 
90 bool Visa::attribute(ViAttr name, ViAttrState* value) const
91 {
92  auto status = _visa.viGetAttribute(_instrument, name, value);
93  return status >= VI_SUCCESS;
94 }
95 
96 
97 bool Visa::setAttribute(ViAttr name, ViAttrState value)
98 {
99  _status = _visa.viSetAttribute(_instrument, name, value);
100  return isError();
101 }
102 
103 
104 ViStatus Visa::status() const
105 {
106  return _status;
107 }
108 
109 
110 std::string Visa::statusMessage() const
111 {
112  // get description
113  ViChar description[1000];
114  ViStatus status = _visa.viStatusDesc(
115  _instrument,
116  _status,
117  description
118  );
119 
120  // success?
121  if (status < VI_SUCCESS)
122  {
123  // visa error
124  return std::string();
125  }
126 
127  // return std::string
128  return std::string(description);
129 }
130 
131 
132 bool Visa::isError() const
133 {
134  return _status < VI_SUCCESS;
135 }
136 
137 
138 bool Visa::isResourceManager() const
139 {
140  return _resource_manager != VI_NULL;
141 }
142 
143 
144 bool Visa::openDefaultResourceManager()
145 {
146  _status = _visa.viOpenDefaultRM(&_resource_manager);
147  return !isError();
148 }
149 
150 
151 bool Visa::closeResourceManager()
152 {
153  // check if resource manager exists
154  if (!isResourceManager())
155  {
156  // nothing to close
157  return true;
158  }
159 
160  // close
161  ViObject rm_obj = ViObject(_resource_manager);
162  _status = _visa.viClose(rm_obj);
163  if (isError())
164  {
165  // error
166  return false;
167  }
168 
169  // clear
170  _resource_manager = VI_NULL;
171  return !isError();
172 }
173 
174 
175 bool Visa::isInstrument() const
176 {
177  return _instrument != VI_NULL;
178 }
179 
180 
181 bool Visa::openInstrument(std::string resource, unsigned int timeout_ms)
182 {
183  // save resource for use in endpoint()
184  _resource = resource;
185 
186  // open instrument connection
187  ViRsrc visaResource = ViRsrc(_resource.c_str());
188  ViUInt32 visaMode = VI_NULL;
189  ViUInt32 visaTimeout = ViUInt32(timeout_ms);
190  _status = _visa.viOpen(
191  _resource_manager,
192  visaResource,
193  visaMode,
194  visaTimeout,
195  &_instrument
196  );
197  return !isError();
198 }
199 
200 
201 bool Visa::closeInstrument()
202 {
203  // check if instrument exists
204  if (!isInstrument())
205  {
206  // nothing to close
207  return true;
208  }
209 
210  // close
211  ViObject instrument_obj = ViObject(_instrument);
212  _status = _visa.viClose(instrument_obj);
213  if (isError())
214  {
215  // error
216  return false;
217  }
218 
219  // clear
220  _instrument = VI_NULL;
221  return !isError();
222 }
std::vector< unsigned char > * buffer()
Definition: bus.cpp:53
VI_OPEN_PTR viOpen
Function pointer to VISA function viOpen
Definition: cvisa.hpp:96
VI_OPEN_DEFAULT_RM_PTR viOpenDefaultRM
Function pointer to VISA function viOpenDefaultRM()
Definition: cvisa.hpp:72
VI_SET_ATTRIBUTE_PTR viSetAttribute
Function pointer to VISA function viSetAttribute
Definition: cvisa.hpp:156
bool isVisa() const
Checks if VISA was loaded.
Definition: cvisa.cpp:50
VI_READ_PTR viRead
Function pointer to VISA function viRead
Definition: cvisa.hpp:114
VI_CLOSE_PTR viClose
Function pointer to VISA function viClose
Definition: cvisa.hpp:102
VI_WRITE_PTR viWrite
Function pointer to VISA function viWrite
Definition: cvisa.hpp:108
VI_GET_ATTRIBUTE_PTR viGetAttribute
Function pointer to VISA function viGetAttribute
Definition: cvisa.hpp:162
VI_STATUS_DESC_PTR viStatusDesc
Function pointer to VISA function viStatusDesc
Definition: cvisa.hpp:168
bool setAttribute(ViAttr name, ViAttrState value)
set VISA attribute
Definition: visa.cpp:97
virtual ~Visa()
Destructor.
Definition: visa.cpp:37
virtual std::string statusMessage() const
Returns a human-friendly message for the current ViStatus value.
Definition: visa.cpp:110
ViStatus status() const
Returns current ViStatus value.
Definition: visa.cpp:104
virtual std::string endpoint() const
Definition: visa.cpp:44
Visa(std::string resource, unsigned int connection_timeout_ms=2000)
Constructor.
Definition: visa.cpp:9
virtual bool readData(unsigned char *buffer, std::size_t bufferSize, std::size_t *readSize=nullptr)
Definition: visa.cpp:66
virtual bool writeData(const unsigned char *data, std::size_t dataSize, std::size_t *writeSize=nullptr)
Definition: visa.cpp:78
virtual int timeout_ms() const
Definition: visa.cpp:50
virtual bool setTimeout(int timeout_ms)
Definition: visa.cpp:60
bool attribute(ViAttr name, ViAttrState *value) const
get VISA attribute
Definition: visa.cpp:90
bool isError() const
Checks if there is a visa error.
Definition: visa.cpp:132
std::system_error system_error
System error exception.
Definition: visa.hpp:28