[5] | 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 XPLRA_PROTOCOL_H
|
---|
| 30 | #define XPLRA_PROTOCOL_H
|
---|
| 31 | //------------------------------------------------------------------------------
|
---|
| 32 |
|
---|
[100] | 33 | #include <cstdlib>
|
---|
[98] | 34 | #include <inttypes.h>
|
---|
| 35 |
|
---|
| 36 | //------------------------------------------------------------------------------
|
---|
| 37 |
|
---|
[5] | 38 | namespace xplra {
|
---|
| 39 |
|
---|
| 40 | //------------------------------------------------------------------------------
|
---|
| 41 |
|
---|
| 42 | /**
|
---|
| 43 | * Constants and helpers for the protocol.
|
---|
| 44 | */
|
---|
| 45 | class Protocol
|
---|
| 46 | {
|
---|
| 47 | public:
|
---|
| 48 | /**
|
---|
| 49 | * Command: get the value of a single dataref.
|
---|
| 50 | */
|
---|
[6] | 51 | static const uint8_t COMMAND_GET_SINGLE = 0x01;
|
---|
[5] | 52 |
|
---|
| 53 | /**
|
---|
[7] | 54 | * Command: set the value of a single dataref.
|
---|
| 55 | */
|
---|
| 56 | static const uint8_t COMMAND_SET_SINGLE = 0x02;
|
---|
| 57 |
|
---|
| 58 | /**
|
---|
[10] | 59 | * Command: get the value of a multiple datarefs.
|
---|
| 60 | */
|
---|
| 61 | static const uint8_t COMMAND_GET_MULTI = 0x03;
|
---|
| 62 |
|
---|
| 63 | /**
|
---|
| 64 | * Command: set the value of a multiple datarefs.
|
---|
| 65 | */
|
---|
| 66 | static const uint8_t COMMAND_SET_MULTI = 0x04;
|
---|
| 67 |
|
---|
| 68 | /**
|
---|
[8] | 69 | * Command: register a multiple-data query request
|
---|
| 70 | */
|
---|
| 71 | static const uint8_t COMMAND_REGISTER_GET_MULTI = 0x11;
|
---|
| 72 |
|
---|
| 73 | /**
|
---|
| 74 | * Command: unregister a multiple-data query request
|
---|
| 75 | */
|
---|
| 76 | static const uint8_t COMMAND_UNREGISTER_GET_MULTI = 0x12;
|
---|
| 77 |
|
---|
| 78 | /**
|
---|
| 79 | * Command: execute a registered multiple-data query request
|
---|
| 80 | */
|
---|
| 81 | static const uint8_t COMMAND_EXECUTE_GET_MULTI = 0x13;
|
---|
| 82 |
|
---|
| 83 | /**
|
---|
[9] | 84 | * Command: register a multiple-data update request
|
---|
| 85 | */
|
---|
| 86 | static const uint8_t COMMAND_REGISTER_SET_MULTI = 0x21;
|
---|
| 87 |
|
---|
| 88 | /**
|
---|
| 89 | * Command: unregister a multiple-data update request
|
---|
| 90 | */
|
---|
| 91 | static const uint8_t COMMAND_UNREGISTER_SET_MULTI = 0x22;
|
---|
| 92 |
|
---|
| 93 | /**
|
---|
| 94 | * Command: execute a registered multiple-data update request
|
---|
| 95 | */
|
---|
| 96 | static const uint8_t COMMAND_EXECUTE_SET_MULTI = 0x23;
|
---|
| 97 |
|
---|
| 98 | /**
|
---|
[36] | 99 | * Command: get the versions of the simulator
|
---|
| 100 | */
|
---|
| 101 | static const uint8_t COMMAND_GET_VERSIONS = 0x31;
|
---|
| 102 |
|
---|
| 103 | /**
|
---|
[39] | 104 | * Command: reload the plugins
|
---|
| 105 | */
|
---|
| 106 | static const uint8_t COMMAND_RELOAD_PLUGINS = 0x32;
|
---|
| 107 |
|
---|
| 108 | /**
|
---|
[81] | 109 | * Command: save the current situation.
|
---|
| 110 | *
|
---|
| 111 | * Followed by a string containing the path of the file to save
|
---|
| 112 | * relative to the X-System directory.
|
---|
| 113 | */
|
---|
| 114 | static const uint8_t COMMAND_SAVE_SITUATION = 0x33;
|
---|
| 115 |
|
---|
| 116 | /**
|
---|
[38] | 117 | * Command: show a message in the message window.
|
---|
| 118 | */
|
---|
| 119 | static const uint8_t COMMAND_SHOW_MESSAGE = 0x41;
|
---|
| 120 |
|
---|
| 121 | /**
|
---|
[45] | 122 | * Command: register a set of hotkeys for the client. Old hotkeys,
|
---|
| 123 | * if any, are forgotten.
|
---|
| 124 | *
|
---|
| 125 | * The command is followed by the following data:
|
---|
| 126 | * - The number of the hotkeys defined (U32).
|
---|
| 127 | * - The code of the hotkeys (U16*number of the hotkeys).
|
---|
| 128 | * The lower byte is the same as the X-Plane virtual key code
|
---|
| 129 | * (the same as the ASCII code for numbers and upper-case letters),
|
---|
| 130 | * the upper one is a logical OR of the HOTKEY_MODIFIER_XXX
|
---|
| 131 | * codes.
|
---|
| 132 | *
|
---|
| 133 | * The reply consists of a result code only. It may fail with an
|
---|
| 134 | * invalid length code if the number of hotkeys is too large.
|
---|
| 135 | */
|
---|
| 136 | static const uint8_t COMMAND_REGISTER_HOTKEYS = 0x51;
|
---|
| 137 |
|
---|
| 138 | /**
|
---|
| 139 | * Command: query the hotkeys.
|
---|
| 140 | *
|
---|
| 141 | * The reply consists of a result code, followed by the following
|
---|
| 142 | * data, if the result code is RESULT_OK:
|
---|
| 143 | * - The number of hotkeys defined (U32).
|
---|
| 144 | * - An array of U8 values each being 0 or 1 depending on whether
|
---|
| 145 | * the corresponding hotkey has been pressed since the last
|
---|
| 146 | * query (or the registration, whichever is later). The value at
|
---|
| 147 | * index i corresponds to the hotkey code at index i in the
|
---|
| 148 | * array passed with COMMAND_REGISTER_HOTKEYS.
|
---|
| 149 | *
|
---|
| 150 | * If not hotkey has been registered, the number of hotkeys is
|
---|
| 151 | * returned as 0.
|
---|
| 152 | */
|
---|
| 153 | static const uint8_t COMMAND_QUERY_HOTKEYS = 0x52;
|
---|
| 154 |
|
---|
| 155 | /**
|
---|
| 156 | * Command: unregister the previously registered hotkeys.
|
---|
| 157 | *
|
---|
| 158 | * The reply is a result code.
|
---|
| 159 | */
|
---|
| 160 | static const uint8_t COMMAND_UNREGISTER_HOTKEYS = 0x53;
|
---|
| 161 |
|
---|
| 162 | /**
|
---|
[5] | 163 | * Data type: int
|
---|
| 164 | */
|
---|
| 165 | static const uint8_t TYPE_INT = 0x01;
|
---|
| 166 |
|
---|
| 167 | /**
|
---|
| 168 | * Data type: float
|
---|
| 169 | */
|
---|
| 170 | static const uint8_t TYPE_FLOAT = 0x02;
|
---|
| 171 |
|
---|
| 172 | /**
|
---|
| 173 | * Data type: double
|
---|
| 174 | */
|
---|
| 175 | static const uint8_t TYPE_DOUBLE = 0x03;
|
---|
| 176 |
|
---|
| 177 | /**
|
---|
| 178 | * Data type: float array
|
---|
| 179 | */
|
---|
| 180 | static const uint8_t TYPE_FLOAT_ARRAY = 0x11;
|
---|
| 181 |
|
---|
| 182 | /**
|
---|
| 183 | * Data type: int array
|
---|
| 184 | */
|
---|
| 185 | static const uint8_t TYPE_INT_ARRAY = 0x12;
|
---|
| 186 |
|
---|
| 187 | /**
|
---|
| 188 | * Data type: byte array
|
---|
| 189 | */
|
---|
| 190 | static const uint8_t TYPE_BYTE_ARRAY = 0x13;
|
---|
| 191 |
|
---|
| 192 | /**
|
---|
| 193 | * Result code: no error, everything is OK.
|
---|
| 194 | */
|
---|
| 195 | static const uint8_t RESULT_OK = 0x00;
|
---|
| 196 |
|
---|
| 197 | /**
|
---|
| 198 | * Result code: invalid command
|
---|
| 199 | */
|
---|
| 200 | static const uint8_t RESULT_INVALID_COMMAND = 0x01;
|
---|
| 201 |
|
---|
| 202 | /**
|
---|
| 203 | * Result code: unknown dataref
|
---|
| 204 | */
|
---|
| 205 | static const uint8_t RESULT_UNKNOWN_DATAREF = 0x02;
|
---|
| 206 |
|
---|
| 207 | /**
|
---|
| 208 | * Result code: invalid type
|
---|
| 209 | */
|
---|
| 210 | static const uint8_t RESULT_INVALID_TYPE = 0x03;
|
---|
| 211 |
|
---|
| 212 | /**
|
---|
[7] | 213 | * Result code: invalid length
|
---|
| 214 | */
|
---|
| 215 | static const uint8_t RESULT_INVALID_LENGTH = 0x04;
|
---|
| 216 |
|
---|
| 217 | /**
|
---|
| 218 | * Result code: invalid offset
|
---|
| 219 | */
|
---|
| 220 | static const uint8_t RESULT_INVALID_OFFSET = 0x05;
|
---|
| 221 |
|
---|
| 222 | /**
|
---|
[8] | 223 | * Result code: invalid count
|
---|
| 224 | */
|
---|
| 225 | static const uint8_t RESULT_INVALID_COUNT = 0x06;
|
---|
| 226 |
|
---|
| 227 | /**
|
---|
| 228 | * Result code: invalid ID
|
---|
| 229 | */
|
---|
| 230 | static const uint8_t RESULT_INVALID_ID = 0x07;
|
---|
| 231 |
|
---|
| 232 | /**
|
---|
[38] | 233 | * Result code: invalid duration
|
---|
| 234 | */
|
---|
| 235 | static const uint8_t RESULT_INVALID_DURATION = 0x08;
|
---|
| 236 |
|
---|
| 237 | /**
|
---|
[5] | 238 | * Result code: other error
|
---|
| 239 | */
|
---|
| 240 | static const uint8_t RESULT_OTHER_ERROR = 0xff;
|
---|
[7] | 241 |
|
---|
| 242 | /**
|
---|
[45] | 243 | * Hotkey modifier: shift
|
---|
| 244 | */
|
---|
| 245 | static const uint16_t HOTKEY_MODIFIER_SHIFT = 0x0100;
|
---|
| 246 |
|
---|
| 247 | /**
|
---|
| 248 | * Hotkey modifier: control
|
---|
| 249 | */
|
---|
| 250 | static const uint16_t HOTKEY_MODIFIER_CONTROL = 0x0200;
|
---|
| 251 |
|
---|
| 252 | /**
|
---|
[7] | 253 | * The maximal length we accept (in order to protect ourselves).
|
---|
| 254 | */
|
---|
| 255 | static const int MAX_LENGTH = 2048;
|
---|
[8] | 256 |
|
---|
| 257 | /**
|
---|
| 258 | * The maximal count of requests in a multiple-data query or
|
---|
| 259 | * update.
|
---|
| 260 | */
|
---|
| 261 | static const size_t MAX_MULTI_COUNT = 1024;
|
---|
[36] | 262 |
|
---|
| 263 | /**
|
---|
[38] | 264 | * The maximal message duration
|
---|
| 265 | */
|
---|
[92] | 266 | static constexpr float MAX_MESSAGE_DURATION = 5*60;
|
---|
[38] | 267 |
|
---|
| 268 | /**
|
---|
[45] | 269 | * The maximal number of hotkeys that can be registered for a
|
---|
| 270 | * client.
|
---|
| 271 | */
|
---|
| 272 | static const size_t MAX_HOTKEY_COUNT = 128;
|
---|
| 273 |
|
---|
| 274 | /**
|
---|
[36] | 275 | * The version of the plugin.
|
---|
| 276 | */
|
---|
| 277 | static const int version = 10;
|
---|
[5] | 278 | };
|
---|
| 279 |
|
---|
| 280 | //------------------------------------------------------------------------------
|
---|
| 281 |
|
---|
| 282 | } /* namespace xplra */
|
---|
| 283 |
|
---|
| 284 | //------------------------------------------------------------------------------
|
---|
| 285 | #endif // XPLRA_PROTOCOL_H
|
---|
| 286 |
|
---|
| 287 | // Local Variables:
|
---|
| 288 | // mode: C++
|
---|
| 289 | // c-basic-offset: 4
|
---|
| 290 | // indent-tabs-mode: nil
|
---|
| 291 | // End:
|
---|