X-Plane Remote Access Plugin and Client Library
MultiSetter.cc
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 //------------------------------------------------------------------------------
30 
31 #include "MultiSetter.h"
32 
33 #include "XPlane.h"
34 
35 #include <xplra/Protocol.h>
36 
37 #include <hu/varadiistvan/scpl/io/DataStream.h>
38 
39 //------------------------------------------------------------------------------
40 
42 
43 using xplra::Protocol;
44 
45 using std::vector;
46 using std::min;
47 
48 //------------------------------------------------------------------------------
49 
50 MultiSetter::MultiSetter(XPlane& xplane) noexcept :
51  MultiBuffer(xplane, Protocol::COMMAND_REGISTER_SET_MULTI,
52  Protocol::COMMAND_UNREGISTER_SET_MULTI)
53 {
54 }
55 
56 //------------------------------------------------------------------------------
57 
58 inline void MultiSetter::write(const DataRef& dataRef) const
59 {
60  switch (dataRef.type) {
61  case Protocol::TYPE_INT:
62  xplane.stream->writeS32(*reinterpret_cast<const int32_t*>
63  (data + dataRef.dataOffset));
64  break;
65  case Protocol::TYPE_FLOAT:
66  xplane.stream->writeFloat(*reinterpret_cast<const float*>
67  (data + dataRef.dataOffset));
68  break;
69  case Protocol::TYPE_DOUBLE:
70  xplane.stream->writeDouble(*reinterpret_cast<const double*>
71  (data + dataRef.dataOffset));
72  break;
73  case Protocol::TYPE_FLOAT_ARRAY:
74  case Protocol::TYPE_INT_ARRAY:
75  case Protocol::TYPE_BYTE_ARRAY:
76  {
77  size_t elementSize =
78  (dataRef.type==Protocol::TYPE_FLOAT_ARRAY) ? sizeof(float) :
79  ((dataRef.type==Protocol::TYPE_INT_ARRAY) ?
80  sizeof(int32_t) : sizeof(uint8_t));
81  xplane.stream->write(data + dataRef.dataOffset,
82  dataRef.length * elementSize);
83  }
84  }
85 }
86 
87 //------------------------------------------------------------------------------
88 
90 {
92  xplane.stream->writeU8(Protocol::COMMAND_EXECUTE_SET_MULTI);
93  xplane.stream->writeU32(registeredID);
94  for(vector<DataRef>::const_iterator i = dataRefs.begin();
95  i!=dataRefs.end(); ++i)
96  {
97  const DataRef& dataRef = *i;
98  write(dataRef);
99  }
100  xplane.stream->flush();
101  xplane.checkResult(true);
102 }
103 
104 //------------------------------------------------------------------------------
105 
107 {
108  xplane.stream->writeU8(Protocol::COMMAND_SET_MULTI);
109  xplane.stream->writeU32(dataRefs.size());
110  for(vector<DataRef>::const_iterator i = dataRefs.begin();
111  i!=dataRefs.end(); ++i)
112  {
113  const DataRef& dataRef = *i;
114  xplane.stream->writeString(dataRef.name);
115  xplane.stream->writeU8(dataRef.type);
116  if (dataRef.isArray()) {
117  xplane.stream->writeS32(dataRef.length);
118  xplane.stream->writeS32(dataRef.offset);
119  }
120  write(dataRef);
121  }
122  xplane.stream->flush();
123  xplane.checkResult(true);
124 }
125 
126 //------------------------------------------------------------------------------
127 
128 // Local Variables:
129 // mode: C++
130 // c-basic-offset: 4
131 // indent-tabs-mode: nil
132 // End:
std::vector< DataRef > dataRefs
Definition: MultiBuffer.h:122
void write(const DataRef &dataRef) const
Definition: MultiSetter.cc:58
scpl::io::DataStream * stream
Definition: XPlane.h:94
void checkResult(uint8_t result, bool hasParameter=false, long parameter=0)
Definition: XPlane.cc:113