source: xplra/src/client/c/hu/varadiistvan/xplra/XPlane.h@ 66:f7c8521991df

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

Added the Doxygen configuration file and updated the documentation to eliminate the warnings

File size: 12.4 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 * Reload the plugins loaded in X-Plane. After this the connection
153 * fails.
154 */
155 void reloadPlugins() throw(Exception);
156
157 /**
158 * Get the integer value of the dataref with the given name.
159 */
160 int getInt(const char* name) throw(Exception);
161
162 /**
163 * Get a float value.
164 */
165 float getFloat(const char* name) throw(Exception);
166
167 /**
168 * Get a double value.
169 */
170 double getDouble(const char* name) throw(Exception);
171
172 /**
173 * Get a possibly partial array of floats.
174 *
175 * @param name the name of the dataref
176 * @param dest the destination buffer
177 * @param length the length of the destination buffer
178 * @param offset the offset from which to get the array
179 *
180 * @return the number of values acquired actually
181 */
182 size_t getFloatArray(const char* name, float* dest,
183 size_t length, size_t offset = 0) throw(Exception);
184
185 /**
186 * Get a possibly partial array of floats. The result array will
187 * be created with a length needed to hold the returned value.
188 *
189 * @param name the name of the dataref
190 * @param length will contain the number of floats read
191 * @param offset the offset from which to get the array
192 */
193 float* getFloatArray(const char* name, size_t& length,
194 size_t offset = 0) throw(Exception);
195
196 /**
197 * Get a possibly partial array of integers.
198 *
199 * @param name the name of the dataref
200 * @param dest the destination buffer
201 * @param length the length of the destination buffer
202 * @param offset the offset from which to get the array
203 *
204 * @return the number of values acquired actually
205 */
206 size_t getIntArray(const char* name, int32_t* dest,
207 size_t length, size_t offset = 0) throw(Exception);
208
209 /**
210 * Get a possibly partial array of integers. The result array will
211 * be created with a length needed to hold the returned value.
212 *
213 * @param name the name of the dataref
214 * @param length will contain the number of integers read
215 * @param offset the offset from which to get the array
216 */
217 int32_t* getIntArray(const char* name, size_t& length,
218 size_t offset = 0) throw(Exception);
219
220 /**
221 * Get a possibly partial array of bytes.
222 *
223 * @param name the name of the dataref
224 * @param dest the destination buffer
225 * @param length the length of the destination buffer
226 * @param offset the offset from which to get the array
227 *
228 * @return the number of values acquired actually
229 */
230 size_t getByteArray(const char* name, uint8_t* dest,
231 size_t length, size_t offset = 0) throw(Exception);
232
233 /**
234 * Get a possibly partial array of bytes. The result array will
235 * be created with a length needed to hold the returned value.
236 *
237 * @param name the name of the dataref
238 * @param length will contain the number of bytes read on return
239 * @param offset the offset from which to get the array
240 */
241 uint8_t* getByteArray(const char* name, size_t& length,
242 size_t offset = 0) throw(Exception);
243
244 /**
245 * Get a string. A string is a byte array.
246 */
247 std::string getString(const char* name, size_t offset = 0) throw(Exception);
248
249 /**
250 * Set the given dataref to the given integer value.
251 */
252 void setInt(const char* name, int value) throw(Exception);
253
254 /**
255 * Set the given dataref to the given float value.
256 */
257 void setFloat(const char* name, float value) throw(Exception);
258
259 /**
260 * Set the given dataref to the given double value.
261 */
262 void setDouble(const char* name, double value) throw(Exception);
263
264 /**
265 * Set the given float array to values in the given buffer.
266 */
267 void setFloatArray(const char* name, const float* values, size_t length,
268 size_t offset = 0) throw(Exception);
269
270 /**
271 * Set the given integer array to values in the given buffer.
272 */
273 void setIntArray(const char* name, const int32_t* values, size_t length,
274 size_t offset = 0) throw(Exception);
275
276 /**
277 * Set the given byte array to values in the given buffer.
278 */
279 void setByteArray(const char* name, const uint8_t* values, size_t length,
280 size_t offset = 0) throw(Exception);
281
282 /**
283 * Set the given string to the given value. Since strings are byte
284 * arrays, and the bytes after the string should be zeroed, the
285 * length must be given. The string will be converted to a byte
286 * array of the given length, padded with 0s.
287 */
288 void setString(const char* name, const char* value, size_t length,
289 size_t offset = 0) throw(Exception);
290
291 /**
292 * Show a textual message for a certain duration.
293 */
294 void showMessage(const char* message, float duration) throw(Exception);
295
296 /**
297 * Register the given hotkey codes for listening. If there is an
298 * existing set of hotkeys registered, those will be overwritten.
299 */
300 void registerHotkeys(const uint16_t* codes, size_t length) throw(Exception);
301
302 /**
303 * Query the registered hotkeys whether they were pressed.
304 */
305 void queryHotkeys(uint8_t* states, size_t length) throw(Exception);
306
307 /**
308 * Unregister the hotkeys.
309 */
310 void unregisterHotkeys();
311
312private:
313 /**
314 * Check if we have a stream and if it has not failed.
315 */
316 void checkStream() throw(NotConnectedException, IOException);
317
318 /**
319 * Check the given protocol result. If it signifies an error,
320 * throw a ProtocolException with the correct error code.
321 */
322 void checkResult(uint8_t result, bool hasParameter = false,
323 long parameter = 0) throw(ProtocolException);
324
325 /**
326 * Read and check the result. If it signifies an error,
327 * throw a ProtocolException with the correct error code. If there
328 * is some problem with the stream, an IOException is thrown.
329 */
330 void checkResult(bool multi = false) throw(ProtocolException, IOException);
331
332 /**
333 * Issue the command to get a single, scalar value. The result is
334 * also checked, but the value should be read by the caller.
335 */
336 void getScalar(const char* name, uint8_t type) throw(Exception);
337
338 /**
339 * Issue the command to get an array of values of the given
340 * type. It checks the result and retrieves the number of value
341 * items available.
342 *
343 * @return the number of value items available
344 */
345 size_t getArray(const char* name, uint8_t type,
346 ssize_t length, size_t offset) throw(Exception);
347
348
349 /**
350 * Issue the command to set a scalar value of the given type.
351 */
352 void setScalar(const char* name, uint8_t type) throw(Exception);
353
354 /**
355 * Issue the command to set an array value of the given type.
356 */
357 void setArray(const char* name, uint8_t type, size_t length,
358 size_t offset) throw(Exception);
359
360 friend class MultiBuffer;
361 friend class MultiGetter;
362 friend class MultiSetter;
363};
364
365//------------------------------------------------------------------------------
366// Inline definitions
367//------------------------------------------------------------------------------
368
369inline XPlane::XPlane() throw() :
370 socket(0),
371 stream(0)
372{
373}
374
375//------------------------------------------------------------------------------
376
377inline bool XPlane::isConnected() const throw()
378{
379 return socket!=0;
380}
381
382//------------------------------------------------------------------------------
383
384} /* namespace hu::varadiistvan::xplra */ } /* namespace hu::varadiistvan */ } /* namespace hu */
385
386//------------------------------------------------------------------------------
387#endif // HU_VARADIISTVAN_XPLRA_XPLANE_H
388
389// Local Variables:
390// mode: C++
391// c-basic-offset: 4
392// indent-tabs-mode: nil
393// End:
Note: See TracBrowser for help on using the repository browser.