source: xplra/src/client/c/hu/varadiistvan/xplra/XPlane.h@ 36:29e3b676c0c2

Last change on this file since 36:29e3b676c0c2 was 36:29e3b676c0c2, checked in by István Váradi <ivaradi@…>, 11 years ago

Added a new command to query the versions

File size: 11.0 KB
Line 
1// Copyright (c) 2013 by István Váradi
2
3// This file is part of XPLRA, a remote-access plugin for X-Plane
4
5// Redistribution and use in source and binary forms, with or without
6// modification, are permitted provided that the following conditions are met:
7
8// 1. Redistributions of source code must retain the above copyright notice, this
9// list of conditions and the following disclaimer.
10// 2. Redistributions in binary form must reproduce the above copyright notice,
11// this list of conditions and the following disclaimer in the documentation
12// and/or other materials provided with the distribution.
13
14// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
15// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
18// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
19// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
20// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
21// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
23// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24
25// The views and conclusions contained in the software and documentation are those
26// of the authors and should not be interpreted as representing official policies,
27// either expressed or implied, of the FreeBSD Project.
28
29#ifndef HU_VARADIISTVAN_XPLRA_XPLANE_H
30#define HU_VARADIISTVAN_XPLRA_XPLANE_H
31//-----------------------------------------------------------------------------
32
33#include "Exception.h"
34
35#include <hu/varadiistvan/scpl/io/Waiter.h>
36
37#include <set>
38
39#include <inttypes.h>
40
41//-----------------------------------------------------------------------------
42
43namespace hu { namespace varadiistvan { namespace scpl { namespace io {
44
45class LocalClientSocket;
46class DataStream;
47
48} /* namespace hu::varadiistvan::scpl::io */ } /* namespace hu::varadiistvan::scpl */ } /* namespace hu::varadiistvan */ } /* namespace hu */
49
50//------------------------------------------------------------------------------
51
52namespace hu { namespace varadiistvan { namespace xplra {
53
54//------------------------------------------------------------------------------
55
56class MultiBuffer;
57class MultiGetter;
58class MultiSetter;
59
60//------------------------------------------------------------------------------
61
62/**
63 * The main class to access X-Plane.
64 *
65 * The calls are synchronous and not thread-safe.
66 */
67class XPlane
68{
69private:
70 /**
71 * Type for the set of multi-dataref buffers.
72 */
73 typedef std::set<MultiBuffer*> multiBuffers_t;
74
75 /**
76 * The waiter to use.
77 */
78 scpl::io::Waiter waiter;
79
80 /**
81 * The local client socket over which we are communicating with X-Plane.
82 */
83 scpl::io::LocalClientSocket* socket;
84
85 /**
86 * The data stream to handle the data conversions.
87 */
88 scpl::io::DataStream* stream;
89
90 /**
91 * The buffers created by this object.
92 */
93 multiBuffers_t multiBuffers;
94
95public:
96 /**
97 * Construct the object. It will not be connected to the simulator
98 * yet.
99 */
100 XPlane() throw();
101
102 /**
103 * Destroy the object. If connected, the connection will be
104 * closed. It destroys all existing buffers, so their references
105 * become invalid.
106 */
107 ~XPlane() throw();
108
109 /**
110 * Connect to the simulator.
111 */
112 void connect() throw(IOException);
113
114 /**
115 * Check if we are connected to the simulator.
116 */
117 bool isConnected() const throw();
118
119 /**
120 * Disconnect from the simulator.
121 */
122 void disconnect() throw();
123
124 /**
125 * Create a new getter of multiple datarefs and return a reference
126 * to it.
127 */
128 MultiGetter& createMultiGetter() throw();
129
130 /**
131 * Create a new setter of multiple datarefs and return a reference
132 * to it.
133 */
134 MultiSetter& createMultiSetter() throw();
135
136 /**
137 * Destroy the given getter or setter of multiple datarefs. As the
138 * buffer is unregistered, if it has been registered previously,
139 * and unregistration may fail, this function might throw an
140 * exception.
141 *
142 * @return if the buffer was found and could be destroyed
143 */
144 bool destroyMultiBuffer(MultiBuffer& buffer) throw(Exception);
145
146 /**
147 * Get the versions of X-Plane, XPLM and the XPLRA plugin.
148 */
149 void getVersions(int& xplaneVersion, int& xplmVersion, int& xplraVersion) throw(Exception);
150
151 /**
152 * Get the integer value of the dataref with the given name.
153 */
154 int getInt(const char* name) throw(Exception);
155
156 /**
157 * Get a float value.
158 */
159 float getFloat(const char* name) throw(Exception);
160
161 /**
162 * Get a double value.
163 */
164 double getDouble(const char* name) throw(Exception);
165
166 /**
167 * Get a possibly partial array of floats.
168 *
169 * @param length the length of the destination buffer
170 * @param offset the offset from which to get the array
171 *
172 * @return the number of values acquired actually
173 */
174 size_t getFloatArray(const char* name, float* dest,
175 size_t length, size_t offset = 0) throw(Exception);
176
177 /**
178 * Get a possibly partial array of floats. The result array will
179 * be created with a length needed to hold the returned value.
180 *
181 * @param offset the offset from which to get the array
182 */
183 float* getFloatArray(const char* name, size_t& length,
184 size_t offset = 0) throw(Exception);
185
186 /**
187 * Get a possibly partial array of integers.
188 *
189 * @param length the length of the destination buffer
190 * @param offset the offset from which to get the array
191 *
192 * @return the number of values acquired actually
193 */
194 size_t getIntArray(const char* name, int32_t* dest,
195 size_t length, size_t offset = 0) throw(Exception);
196
197 /**
198 * Get a possibly partial array of integers. The result array will
199 * be created with a length needed to hold the returned value.
200 *
201 * @param offset the offset from which to get the array
202 */
203 int32_t* getIntArray(const char* name, size_t& length,
204 size_t offset = 0) throw(Exception);
205
206 /**
207 * Get a possibly partial array of bytes.
208 *
209 * @param length the length of the destination buffer
210 * @param offset the offset from which to get the array
211 *
212 * @return the number of values acquired actually
213 */
214 size_t getByteArray(const char* name, uint8_t* dest,
215 size_t length, size_t offset = 0) throw(Exception);
216
217 /**
218 * Get a possibly partial array of bytes. The result array will
219 * be created with a length needed to hold the returned value.
220 *
221 * @param offset the offset from which to get the array
222 */
223 uint8_t* getByteArray(const char* name, size_t& lengyh,
224 size_t offset = 0) throw(Exception);
225
226 /**
227 * Get a string. A string is a byte array.
228 */
229 std::string getString(const char* name, size_t offset = 0) throw(Exception);
230
231 /**
232 * Set the given dataref to the given integer value.
233 */
234 void setInt(const char* name, int value) throw(Exception);
235
236 /**
237 * Set the given dataref to the given float value.
238 */
239 void setFloat(const char* name, float value) throw(Exception);
240
241 /**
242 * Set the given dataref to the given double value.
243 */
244 void setDouble(const char* name, double value) throw(Exception);
245
246 /**
247 * Set the given float array to values in the given buffer.
248 */
249 void setFloatArray(const char* name, const float* values, size_t length,
250 size_t offset = 0) throw(Exception);
251
252 /**
253 * Set the given integer array to values in the given buffer.
254 */
255 void setIntArray(const char* name, const int32_t* values, size_t length,
256 size_t offset = 0) throw(Exception);
257
258 /**
259 * Set the given byte array to values in the given buffer.
260 */
261 void setByteArray(const char* name, const uint8_t* values, size_t length,
262 size_t offset = 0) throw(Exception);
263
264 /**
265 * Set the given string to the given value. Since strings are byte
266 * arrays, and the bytes after the string should be zeroed, the
267 * length must be given. The string will be converted to a byte
268 * array of the given length, padded with 0s.
269 */
270 void setString(const char* name, const char* value, size_t length,
271 size_t offset = 0) throw(Exception);
272
273private:
274 /**
275 * Check if we have a stream and if it has not failed.
276 */
277 void checkStream() throw(NotConnectedException, IOException);
278
279 /**
280 * Check the given protocol result. If it signifies an error,
281 * throw a ProtocolException with the correct error code.
282 */
283 void checkResult(uint8_t result) throw(ProtocolException);
284
285 /**
286 * Read and check the result. If it signifies an error,
287 * throw a ProtocolException with the correct error code. If there
288 * is some problem with the stream, an IOException is thrown.
289 */
290 void checkResult() throw(ProtocolException, IOException);
291
292 /**
293 * Issue the command to get a single, scalar value. The result is
294 * also checked, but the value should be read by the caller.
295 */
296 void getScalar(const char* name, uint8_t type) throw(Exception);
297
298 /**
299 * Issue the command to get an array of values of the given
300 * type. It checks the result and retrieves the number of value
301 * items available.
302 *
303 * @return the number of value items available
304 */
305 size_t getArray(const char* name, uint8_t type,
306 ssize_t length, size_t offset) throw(Exception);
307
308
309 /**
310 * Issue the command to set a scalar value of the given type.
311 */
312 void setScalar(const char* name, uint8_t type) throw(Exception);
313
314 /**
315 * Issue the command to set an array value of the given type.
316 */
317 void setArray(const char* name, uint8_t type, size_t length,
318 size_t offset) throw(Exception);
319
320 friend class MultiBuffer;
321 friend class MultiGetter;
322 friend class MultiSetter;
323};
324
325//------------------------------------------------------------------------------
326// Inline definitions
327//------------------------------------------------------------------------------
328
329inline XPlane::XPlane() throw() :
330 socket(0),
331 stream(0)
332{
333}
334
335//------------------------------------------------------------------------------
336
337inline bool XPlane::isConnected() const throw()
338{
339 return socket!=0;
340}
341
342//------------------------------------------------------------------------------
343
344} /* namespace hu::varadiistvan::xplra */ } /* namespace hu::varadiistvan */ } /* namespace hu */
345
346//------------------------------------------------------------------------------
347#endif // HU_VARADIISTVAN_XPLRA_XPLANE_H
348
349// Local Variables:
350// mode: C++
351// c-basic-offset: 4
352// indent-tabs-mode: nil
353// End:
Note: See TracBrowser for help on using the repository browser.