rohdeschwarz  0.2.0
TCPIP socket library for Rohde & Schwarz instrument control
instrument.cpp
Go to the documentation of this file.
1 
7 // rohdeschwarz
13 #include "rohdeschwarz/helpers.hpp"
15 using namespace rohdeschwarz::busses::socket;
16 using namespace rohdeschwarz::busses::visa;
17 using namespace rohdeschwarz::instruments;
18 using namespace rohdeschwarz::scpi;
19 using namespace rohdeschwarz;
20 
21 
22 // std lib
23 #include <cstring>
24 #include <sstream>
25 
26 
27 // types
28 using const_char_p = const char*;
29 
30 
31 bool Instrument::isOpen() const
32 {
33  return _bus != nullptr;
34 }
35 
36 
37 bool Instrument::openVisa(std::string resource, unsigned int timeout_ms)
38 {
39  // connect to resource
41  try
42  {
43  _bus.reset(new Visa(resource, timeout_ms));
44  }
45 
46  // error
47  catch (const system_error& error)
48  {
49  return false;
50  }
51 
52  // success
53  return true;
54 }
55 
56 
57 bool Instrument::openTcp(std::string host, unsigned int timeout_ms)
58 {
59  // connect to host
61  try
62  {
63  _bus.reset(new Socket(host, timeout_ms));
64  }
65 
66  // error
67  catch (const system_error& error)
68  {
69  return false;
70  }
71 
72  // success
73  return true;
74 }
75 
76 
78 {
79  _bus.reset();
80 }
81 
82 
83 std::size_t Instrument::bufferSize_B() const
84 {
85  return _bus->bufferSize_B();
86 }
87 
88 
89 void Instrument::setBufferSize(std::size_t size_bytes)
90 {
91  _bus->setBufferSize(size_bytes);
92 }
93 
94 
95 std::vector<unsigned char>* Instrument::buffer()
96 {
97  return _bus->buffer();
98 }
99 
100 const std::vector<unsigned char>* Instrument::buffer() const
101 {
102  return _bus->buffer();
103 }
104 
105 std::vector<unsigned char> Instrument::takeData()
106 {
107  return _bus->takeData();
108 }
109 
110 
112 {
113  return _bus->timeout_ms();
114 }
115 
116 
117 bool Instrument::setTimeout(int timeout_ms)
118 {
119  return _bus->setTimeout(timeout_ms);
120 }
121 
122 
123 bool Instrument::readData(unsigned char* buffer, std::size_t bufferSize, std::size_t* readSize)
124 {
125  return _bus->readData(buffer, bufferSize, readSize);
126 }
127 
128 
129 bool Instrument::writeData(const unsigned char* data, std::size_t dataSize, std::size_t* writeSize)
130 {
131  return _bus->writeData(data, dataSize, writeSize);
132 }
133 
134 
135 bool Instrument::readData(std::size_t* readSize)
136 {
137  return _bus->readData(readSize);
138 }
139 
140 
141 std::string Instrument::read()
142 {
143  // read data
144  std::size_t size;
145  if (!readData(&size))
146  {
147  // error
148  return std::string();
149  }
150 
151  // convert to string
152  auto data = const_char_p(buffer()->data());
153  return std::string(data, size);
154 }
155 
156 
157 std::vector<double> Instrument::readAsciiVector()
158 {
159  // TODO
160  return std::vector<double>();
161 }
162 
163 
164 std::vector<std::complex<double>> Instrument::readAsciiComplexVector()
165 {
166  // TODO
167  return std::vector<std::complex<double>>();
168 }
169 
170 
172 {
173  // read initial data
174  std::size_t read_size;
175  if (!readData(&read_size))
176  {
177  // error
178  return scpi::BlockData();
179  }
180 
181  // take initial data from buffer
182  auto data = takeData();
183  data.resize(read_size);
184 
185  // create block
186  scpi::BlockData block_data(std::move(data));
187 
188  // read until block data is complete
189  while (!block_data.isComplete())
190  {
191  if (block_data.isHeaderError())
192  {
193  // cannot complete block without header
194  return scpi::BlockData();
195  }
196 
197  // read more data
198  if (!readData(&read_size))
199  {
200  // error
201  return BlockData();
202  }
203 
204  // push data to block
205  const auto begin = buffer()->begin();
206  block_data.push_back(begin, read_size);
207  }
208 
209  // block data is complete
210  return block_data;
211 }
212 
213 
214 std::vector<double> Instrument::read64BitVector()
215 {
216  // read block data
217  BlockData data = readBlockData();
218  if (!data.isComplete())
219  {
220  // error
221  return std::vector<double>();
222  }
223 
224  // parse block data
225  return to_vector<double>(data.data(), data.size());
226 }
227 
228 
229 std::vector<std::complex<double>> Instrument::read64BitComplexVector()
230 {
231  // read block data
232  BlockData data = readBlockData();
233  if (!data.isComplete())
234  {
235  // error
236  return std::vector<std::complex<double>>();
237  }
238 
239  // parse block data
240  return to_vector_complex_double(data.data(), data.size());
241 }
242 
243 
245 {
246  return _bus->isError();
247 }
248 
249 
250 std::string Instrument::busStatus() const
251 {
252  return _bus->statusMessage();
253 }
254 
255 
256 std::string Instrument::id()
257 {
258  return trim(query("*IDN?"));
259 }
260 
261 
262 std::string Instrument::options()
263 {
264  return trim(query("*OPT?"));
265 }
266 
267 
269 {
270  write("*CLS");
271 }
272 
273 
275 {
276  write("*RST");
277 }
278 
279 
281 {
282  write("*WAI");
283 }
284 
285 
286 bool Instrument::blockUntilOperationComplete(unsigned int timeout_ms)
287 {
288  PreserveTimeout preserve_timeout(this);
289  setTimeout(timeout_ms);
290  return queryScpiBool("*OPC?");
291 }
void clearErrors()
Clears SCPI errors.
Definition: instrument.cpp:268
bool readData(unsigned char *buffer, std::size_t bufferSize, std::size_t *readSize=nullptr)
Definition: instrument.cpp:123
std::vector< double > readAsciiVector()
reads ascii data and parses it into vector <double>
Definition: instrument.cpp:157
void wait()
Instructs instrument to perform previous SCPI commands before proceeding.
Definition: instrument.cpp:280
std::vector< std::complex< double > > readAsciiComplexVector()
reads ascii data and parses it into vector <complex <double>>
Definition: instrument.cpp:164
bool isOpen() const
Check for an open connection to an instrument.
Definition: instrument.cpp:31
std::string options()
Queries instrument options string.
Definition: instrument.cpp:262
int timeout_ms()
Query IO timeout time, in milliseconds.
Definition: instrument.cpp:111
bool writeData(const unsigned char *data, std::size_t dataSize, std::size_t *writeSize=nullptr)
Definition: instrument.cpp:129
bool isBusError() const
Checks the bus status for an error.
Definition: instrument.cpp:244
std::vector< std::complex< double > > read64BitComplexVector()
Reads block data and parses it into vector <complex <double>>
Definition: instrument.cpp:229
std::string id()
Queries instrument ID string.
Definition: instrument.cpp:256
void close()
Close the connection to the instrument.
Definition: instrument.cpp:77
bool openVisa(std::string resource, unsigned int timeout_ms=2000)
Open VISA connection to instrument.
Definition: instrument.cpp:37
std::vector< unsigned char > takeData()
Definition: instrument.cpp:105
std::string busStatus() const
Gets the bus status as a human-readable string.
Definition: instrument.cpp:250
bool setTimeout(int timeout_ms)
Set IO timeout time.
Definition: instrument.cpp:117
bool openTcp(std::string host, unsigned int timeout_ms=2000)
Open tcp socket connection to an instrument.
Definition: instrument.cpp:57
scpi::BlockData readBlockData()
Read Block Data.
Definition: instrument.cpp:171
std::vector< double > read64BitVector()
Reads block data and parses it into vector <double>
Definition: instrument.cpp:214
bool blockUntilOperationComplete(unsigned int timeout_ms=2000)
Queries *OPC? - block until operation complete.
Definition: instrument.cpp:286
std::vector< unsigned char > * buffer()
Definition: instrument.cpp:95
void setBufferSize(std::size_t size_bytes)
Definition: instrument.cpp:89
void preset()
Perform instrument preset.
Definition: instrument.cpp:274
Class for preserving the VISA timeout value in a particular scope.
Object-oriented Block Data storage and manipulation.
Definition: block_data.hpp:24
bool isHeaderError() const
Checks the header for errors.
Definition: block_data.cpp:38
bool isComplete() const
Checks for complete Block Data header and payload.
Definition: block_data.cpp:99
std::size_t size() const
Gets payload size, in bytes, from a complete header.
Definition: block_data.cpp:136
unsigned char * data()
Gets a pointer to the payload data.
Definition: block_data.cpp:142
void push_back(std::vector< unsigned char >::const_iterator begin, std::size_t size)
Copies data to block.
Definition: block_data.cpp:109
rohdeschwarz helper function definition
const char * const_char_p
Definition: instrument.cpp:28
rohdeschwarz::instruments::Instrument definition
boost::system::system_error system_error
System error exception.
Definition: socket.hpp:32
std::system_error system_error
System error exception.
Definition: visa.hpp:28
std::vector< std::complex< double > > to_vector_complex_double(in_type *data, std::size_t data_size)
Converts a vector of a primitive type to a vector of complex<double>
Definition: to_vector.hpp:51
busses::visa::Visa Visa
Definition: busses.hpp:16
std::string trim(const std::string &text)
Trims whitespace beginning and end of string.
Definition: helpers.cpp:56
busses::socket::Socket Socket
Definition: busses.hpp:15
rohdeschwarz::instruments::PreserveTimeout definition
const char * const_char_p
Definition: socket.cpp:25
rohdeschwarz::busses::socket::Socket class definition
rohdeschwarz::to_vector(), rohdeschwarz::to_vector_complex_double() definitions and implementations