1
0
Fork 0

MP2017.2 changes

Support for short int encoded values (32 bits with 16 bit for ID and 16 bits for value)

Added extra debugging options
1. Debug level
  bit 1 - loopback (show your own model as an MP model)
  bit 2 - dump outgoing packets
  bit 3 - dump incoming packets
  bit 4 - hexdump outgoing packets

2. Update property (/simwith packet
- configurable debug (loopback, packet trace (in,out), packet dump)
- prevent properties from being visible to V1 clients - to ensure reliable compatibility, with just the basic position message being processed. This allows more changes to the V2 protocol whilst giving basic V1 support
- add debug
This commit is contained in:
Richard Harrison 2017-02-23 00:46:01 +01:00
parent 4f04975508
commit 3fceba7a24
5 changed files with 635 additions and 664 deletions

View file

@ -71,7 +71,7 @@ struct T_MsgHdr {
xdr_data_t Version; // Protocoll version
xdr_data_t MsgId; // Message identifier
xdr_data_t MsgLen; // absolute length of message
xdr_data_t MsgLen2; // Used to be - ReplyAddress; // (player's receiver address
xdr_data_t RequestedRangeNm; // start of second partition of message
xdr_data_t ReplyPort; // player's receiver port
char Callsign[MAX_CALLSIGN_LEN]; // Callsign used by the player
};

View file

@ -70,6 +70,11 @@ enum TransmissionType {
TT_FLOAT = simgear::props::FLOAT,
TT_STRING = simgear::props::STRING,
TT_SHORTINT = 0x100,
TT_SHORT_FLOAT_NORM = 0x101, // -1 .. 1 encoded into a short int (16 bit)
TT_SHORT_FLOAT_1 = 0x102, // float encoded into a short int (16 bit) range -6553.5 .. 6553.5
TT_SHORT_FLOAT_2 = 0x103, // float encoded into a short int (16 bit) range -655.35 .. 655.35
TT_SHORT_FLOAT_3 = 0x103, // float encoded into a short int (16 bit) range -65.535 .. 65.535
TT_SHORT_FLOAT_4 = 0x103, // float encoded into a short int (16 bit) range -6.5535 .. 6.5535
TT_BOOLARRAY,
TT_CHAR,
};
@ -87,7 +92,7 @@ enum TransmissionType {
*/
const int V1_1_PROP_ID = 1;
const int V1_1_2_PROP_ID = 2;
const int V2_PAD_MAGIC = 0x1face1337;
struct IdPropertyList {
unsigned id;
@ -107,30 +112,30 @@ static int convert_launchbar_state(int direction, xdr_data_t*, FGPropertyData*)
// This should be extendable dynamically for every specific aircraft ...
// For now only that static list
static const IdPropertyList sIdPropertyList[] = {
{ 10, "surface-positions/left-aileron-pos-norm", simgear::props::INT, TT_SHORTINT, V1_1_PROP_ID, NULL },
{ 100, "surface-positions/left-aileron-pos-norm", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 101, "surface-positions/right-aileron-pos-norm", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 102, "surface-positions/elevator-pos-norm", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 103, "surface-positions/rudder-pos-norm", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 104, "surface-positions/flap-pos-norm", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 105, "surface-positions/speedbrake-pos-norm", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 106, "gear/tailhook/position-norm", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 107, "gear/launchbar/position-norm", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 108, "gear/launchbar/state", simgear::props::STRING, TT_ASIS, V1_1_PROP_ID, NULL },
{ 109, "gear/launchbar/holdback-position-norm", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 110, "canopy/position-norm", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 111, "surface-positions/wing-pos-norm", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 112, "surface-positions/wing-fold-pos-norm", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 113, "gear/launchbar/state", simgear::props::STRING, TT_ASIS, V1_1_2_PROP_ID, convert_launchbar_state },
{ 106, "gear/tailhook/position-norm", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 107, "gear/launchbar/position-norm", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 108, "gear/launchbar/state", simgear::props::STRING, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 109, "gear/launchbar/holdback-position-norm", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 110, "canopy/position-norm", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 111, "surface-positions/wing-pos-norm", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 112, "surface-positions/wing-fold-pos-norm", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 200, "gear/gear[0]/compression-norm", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 200, "gear/gear[0]/compression-norm", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 201, "gear/gear[0]/position-norm", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 210, "gear/gear[1]/compression-norm", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 210, "gear/gear[1]/compression-norm", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 211, "gear/gear[1]/position-norm", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 220, "gear/gear[2]/compression-norm", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 220, "gear/gear[2]/compression-norm", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 221, "gear/gear[2]/position-norm", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 230, "gear/gear[3]/compression-norm", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 230, "gear/gear[3]/compression-norm", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 231, "gear/gear[3]/position-norm", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 240, "gear/gear[4]/compression-norm", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 240, "gear/gear[4]/compression-norm", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 241, "gear/gear[4]/position-norm", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 300, "engines/engine[0]/n1", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
@ -139,50 +144,50 @@ static const IdPropertyList sIdPropertyList[] = {
{ 310, "engines/engine[1]/n1", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 311, "engines/engine[1]/n2", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 312, "engines/engine[1]/rpm", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 320, "engines/engine[2]/n1", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 321, "engines/engine[2]/n2", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 322, "engines/engine[2]/rpm", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 330, "engines/engine[3]/n1", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 331, "engines/engine[3]/n2", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 332, "engines/engine[3]/rpm", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 340, "engines/engine[4]/n1", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 341, "engines/engine[4]/n2", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 342, "engines/engine[4]/rpm", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 350, "engines/engine[5]/n1", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 351, "engines/engine[5]/n2", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 352, "engines/engine[5]/rpm", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 360, "engines/engine[6]/n1", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 361, "engines/engine[6]/n2", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 362, "engines/engine[6]/rpm", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 370, "engines/engine[7]/n1", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 371, "engines/engine[7]/n2", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 372, "engines/engine[7]/rpm", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 380, "engines/engine[8]/n1", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 381, "engines/engine[8]/n2", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 382, "engines/engine[8]/rpm", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 390, "engines/engine[9]/n1", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 391, "engines/engine[9]/n2", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 392, "engines/engine[9]/rpm", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 320, "engines/engine[2]/n1", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 321, "engines/engine[2]/n2", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 322, "engines/engine[2]/rpm", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 330, "engines/engine[3]/n1", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 331, "engines/engine[3]/n2", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 332, "engines/engine[3]/rpm", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 340, "engines/engine[4]/n1", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 341, "engines/engine[4]/n2", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 342, "engines/engine[4]/rpm", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 350, "engines/engine[5]/n1", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 351, "engines/engine[5]/n2", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 352, "engines/engine[5]/rpm", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 360, "engines/engine[6]/n1", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 361, "engines/engine[6]/n2", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 362, "engines/engine[6]/rpm", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 370, "engines/engine[7]/n1", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 371, "engines/engine[7]/n2", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 372, "engines/engine[7]/rpm", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 380, "engines/engine[8]/n1", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 381, "engines/engine[8]/n2", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 382, "engines/engine[8]/rpm", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 390, "engines/engine[9]/n1", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 391, "engines/engine[9]/n2", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 392, "engines/engine[9]/rpm", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 800, "rotors/main/rpm", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 801, "rotors/tail/rpm", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 810, "rotors/main/blade[0]/position-deg", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 811, "rotors/main/blade[1]/position-deg", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 812, "rotors/main/blade[2]/position-deg", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 813, "rotors/main/blade[3]/position-deg", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 820, "rotors/main/blade[0]/flap-deg", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 821, "rotors/main/blade[1]/flap-deg", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 822, "rotors/main/blade[2]/flap-deg", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 823, "rotors/main/blade[3]/flap-deg", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 830, "rotors/tail/blade[0]/position-deg", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 831, "rotors/tail/blade[1]/position-deg", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 810, "rotors/main/blade[0]/position-deg", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 811, "rotors/main/blade[1]/position-deg", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 812, "rotors/main/blade[2]/position-deg", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 813, "rotors/main/blade[3]/position-deg", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 820, "rotors/main/blade[0]/flap-deg", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 821, "rotors/main/blade[1]/flap-deg", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 822, "rotors/main/blade[2]/flap-deg", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 823, "rotors/main/blade[3]/flap-deg", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 830, "rotors/tail/blade[0]/position-deg", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 831, "rotors/tail/blade[1]/position-deg", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 900, "sim/hitches/aerotow/tow/length", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 901, "sim/hitches/aerotow/tow/elastic-constant", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 902, "sim/hitches/aerotow/tow/weight-per-m-kg-m", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 903, "sim/hitches/aerotow/tow/dist", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 904, "sim/hitches/aerotow/tow/connected-to-property-node", simgear::props::BOOL, TT_ASIS, V1_1_PROP_ID, NULL },
{ 905, "sim/hitches/aerotow/tow/connected-to-ai-or-mp-callsign", simgear::props::STRING, TT_ASIS, V1_1_PROP_ID, NULL },
{ 905, "sim/hitches/aerotow/tow/connected-to-ai-or-mp-callsign", simgear::props::STRING, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 906, "sim/hitches/aerotow/tow/brake-force", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 907, "sim/hitches/aerotow/tow/end-force-x", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 908, "sim/hitches/aerotow/tow/end-force-y", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
@ -194,18 +199,18 @@ static const IdPropertyList sIdPropertyList[] = {
{ 934, "sim/hitches/aerotow/local-pos-y", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 935, "sim/hitches/aerotow/local-pos-z", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 1001, "controls/flight/slats", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 1002, "controls/flight/speedbrake", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 1003, "controls/flight/spoilers", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 1001, "controls/flight/slats", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 1002, "controls/flight/speedbrake", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 1003, "controls/flight/spoilers", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 1004, "controls/gear/gear-down", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 1005, "controls/lighting/nav-lights", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 1006, "controls/armament/station[0]/jettison-all", simgear::props::BOOL, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 1006, "controls/armament/station[0]/jettison-all", simgear::props::BOOL, TT_ASIS, V1_1_PROP_ID, NULL },
{ 1100, "sim/model/variant", simgear::props::INT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 1100, "sim/model/variant", simgear::props::INT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 1101, "sim/model/livery/file", simgear::props::STRING, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 1200, "environment/wildfire/data", simgear::props::STRING, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 1201, "environment/contrail", simgear::props::INT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 1201, "environment/contrail", simgear::props::INT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 1300, "tanker", simgear::props::INT, TT_ASIS, V1_1_PROP_ID, NULL },
@ -217,7 +222,7 @@ static const IdPropertyList sIdPropertyList[] = {
{ 1503, "instrumentation/transponder/inputs/mode", simgear::props::INT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10001, "sim/multiplay/transmission-freq-hz", simgear::props::STRING, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10002, "sim/multiplay/chat", simgear::props::STRING, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10002, "sim/multiplay/chat", simgear::props::STRING, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10100, "sim/multiplay/generic/string[0]", simgear::props::STRING, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10101, "sim/multiplay/generic/string[1]", simgear::props::STRING, TT_ASIS, V1_1_2_PROP_ID, NULL },
@ -240,99 +245,99 @@ static const IdPropertyList sIdPropertyList[] = {
{ 10118, "sim/multiplay/generic/string[18]", simgear::props::STRING, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10119, "sim/multiplay/generic/string[19]", simgear::props::STRING, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10200, "sim/multiplay/generic/float[0]", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10201, "sim/multiplay/generic/float[1]", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10202, "sim/multiplay/generic/float[2]", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10203, "sim/multiplay/generic/float[3]", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10204, "sim/multiplay/generic/float[4]", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10205, "sim/multiplay/generic/float[5]", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10206, "sim/multiplay/generic/float[6]", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10207, "sim/multiplay/generic/float[7]", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10208, "sim/multiplay/generic/float[8]", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10209, "sim/multiplay/generic/float[9]", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10210, "sim/multiplay/generic/float[10]", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10211, "sim/multiplay/generic/float[11]", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10212, "sim/multiplay/generic/float[12]", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10213, "sim/multiplay/generic/float[13]", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10214, "sim/multiplay/generic/float[14]", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10215, "sim/multiplay/generic/float[15]", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10216, "sim/multiplay/generic/float[16]", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10217, "sim/multiplay/generic/float[17]", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10218, "sim/multiplay/generic/float[18]", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10219, "sim/multiplay/generic/float[19]", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10200, "sim/multiplay/generic/float[0]", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10201, "sim/multiplay/generic/float[1]", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10202, "sim/multiplay/generic/float[2]", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10203, "sim/multiplay/generic/float[3]", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10204, "sim/multiplay/generic/float[4]", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10205, "sim/multiplay/generic/float[5]", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10206, "sim/multiplay/generic/float[6]", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10207, "sim/multiplay/generic/float[7]", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10208, "sim/multiplay/generic/float[8]", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10209, "sim/multiplay/generic/float[9]", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10210, "sim/multiplay/generic/float[10]", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10211, "sim/multiplay/generic/float[11]", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10212, "sim/multiplay/generic/float[12]", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10213, "sim/multiplay/generic/float[13]", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10214, "sim/multiplay/generic/float[14]", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10215, "sim/multiplay/generic/float[15]", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10216, "sim/multiplay/generic/float[16]", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10217, "sim/multiplay/generic/float[17]", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10218, "sim/multiplay/generic/float[18]", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10219, "sim/multiplay/generic/float[19]", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10220, "sim/multiplay/generic/float[20]", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10221, "sim/multiplay/generic/float[21]", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10222, "sim/multiplay/generic/float[22]", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10223, "sim/multiplay/generic/float[23]", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10224, "sim/multiplay/generic/float[24]", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10225, "sim/multiplay/generic/float[25]", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10226, "sim/multiplay/generic/float[26]", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10227, "sim/multiplay/generic/float[27]", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10228, "sim/multiplay/generic/float[28]", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10229, "sim/multiplay/generic/float[29]", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10230, "sim/multiplay/generic/float[30]", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10231, "sim/multiplay/generic/float[31]", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10232, "sim/multiplay/generic/float[32]", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10233, "sim/multiplay/generic/float[33]", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10234, "sim/multiplay/generic/float[34]", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10235, "sim/multiplay/generic/float[35]", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10236, "sim/multiplay/generic/float[36]", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10237, "sim/multiplay/generic/float[37]", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10238, "sim/multiplay/generic/float[38]", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10239, "sim/multiplay/generic/float[39]", simgear::props::FLOAT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10220, "sim/multiplay/generic/float[20]", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10221, "sim/multiplay/generic/float[21]", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10222, "sim/multiplay/generic/float[22]", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10223, "sim/multiplay/generic/float[23]", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10224, "sim/multiplay/generic/float[24]", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10225, "sim/multiplay/generic/float[25]", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10226, "sim/multiplay/generic/float[26]", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10227, "sim/multiplay/generic/float[27]", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10228, "sim/multiplay/generic/float[28]", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10229, "sim/multiplay/generic/float[29]", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10230, "sim/multiplay/generic/float[30]", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10231, "sim/multiplay/generic/float[31]", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10232, "sim/multiplay/generic/float[32]", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10233, "sim/multiplay/generic/float[33]", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10234, "sim/multiplay/generic/float[34]", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10235, "sim/multiplay/generic/float[35]", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10236, "sim/multiplay/generic/float[36]", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10237, "sim/multiplay/generic/float[37]", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10238, "sim/multiplay/generic/float[38]", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10239, "sim/multiplay/generic/float[39]", simgear::props::FLOAT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10300, "sim/multiplay/generic/int[0]", simgear::props::INT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10301, "sim/multiplay/generic/int[1]", simgear::props::INT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10302, "sim/multiplay/generic/int[2]", simgear::props::INT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10303, "sim/multiplay/generic/int[3]", simgear::props::INT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10304, "sim/multiplay/generic/int[4]", simgear::props::INT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10305, "sim/multiplay/generic/int[5]", simgear::props::INT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10306, "sim/multiplay/generic/int[6]", simgear::props::INT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10307, "sim/multiplay/generic/int[7]", simgear::props::INT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10308, "sim/multiplay/generic/int[8]", simgear::props::INT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10309, "sim/multiplay/generic/int[9]", simgear::props::INT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10310, "sim/multiplay/generic/int[10]", simgear::props::INT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10311, "sim/multiplay/generic/int[11]", simgear::props::INT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10312, "sim/multiplay/generic/int[12]", simgear::props::INT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10313, "sim/multiplay/generic/int[13]", simgear::props::INT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10314, "sim/multiplay/generic/int[14]", simgear::props::INT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10315, "sim/multiplay/generic/int[15]", simgear::props::INT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10316, "sim/multiplay/generic/int[16]", simgear::props::INT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10317, "sim/multiplay/generic/int[17]", simgear::props::INT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10318, "sim/multiplay/generic/int[18]", simgear::props::INT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10319, "sim/multiplay/generic/int[19]", simgear::props::INT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10300, "sim/multiplay/generic/int[0]", simgear::props::INT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10301, "sim/multiplay/generic/int[1]", simgear::props::INT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10302, "sim/multiplay/generic/int[2]", simgear::props::INT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10303, "sim/multiplay/generic/int[3]", simgear::props::INT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10304, "sim/multiplay/generic/int[4]", simgear::props::INT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10305, "sim/multiplay/generic/int[5]", simgear::props::INT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10306, "sim/multiplay/generic/int[6]", simgear::props::INT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10307, "sim/multiplay/generic/int[7]", simgear::props::INT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10308, "sim/multiplay/generic/int[8]", simgear::props::INT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10309, "sim/multiplay/generic/int[9]", simgear::props::INT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10310, "sim/multiplay/generic/int[10]", simgear::props::INT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10311, "sim/multiplay/generic/int[11]", simgear::props::INT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10312, "sim/multiplay/generic/int[12]", simgear::props::INT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10313, "sim/multiplay/generic/int[13]", simgear::props::INT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10314, "sim/multiplay/generic/int[14]", simgear::props::INT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10315, "sim/multiplay/generic/int[15]", simgear::props::INT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10316, "sim/multiplay/generic/int[16]", simgear::props::INT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10317, "sim/multiplay/generic/int[17]", simgear::props::INT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10318, "sim/multiplay/generic/int[18]", simgear::props::INT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10319, "sim/multiplay/generic/int[19]", simgear::props::INT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10320, "sim/multiplay/generic/int[20]", simgear::props::INT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10321, "sim/multiplay/generic/int[21]", simgear::props::INT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10322, "sim/multiplay/generic/int[22]", simgear::props::INT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10323, "sim/multiplay/generic/int[23]", simgear::props::INT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10324, "sim/multiplay/generic/int[24]", simgear::props::INT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10325, "sim/multiplay/generic/int[25]", simgear::props::INT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10326, "sim/multiplay/generic/int[26]", simgear::props::INT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10327, "sim/multiplay/generic/int[27]", simgear::props::INT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10328, "sim/multiplay/generic/int[28]", simgear::props::INT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10329, "sim/multiplay/generic/int[29]", simgear::props::INT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10320, "sim/multiplay/generic/int[20]", simgear::props::INT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10321, "sim/multiplay/generic/int[21]", simgear::props::INT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10322, "sim/multiplay/generic/int[22]", simgear::props::INT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10323, "sim/multiplay/generic/int[23]", simgear::props::INT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10324, "sim/multiplay/generic/int[24]", simgear::props::INT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10325, "sim/multiplay/generic/int[25]", simgear::props::INT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10326, "sim/multiplay/generic/int[26]", simgear::props::INT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10327, "sim/multiplay/generic/int[27]", simgear::props::INT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10328, "sim/multiplay/generic/int[28]", simgear::props::INT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10329, "sim/multiplay/generic/int[29]", simgear::props::INT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10330, "sim/multiplay/generic/int[30]", simgear::props::INT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10331, "sim/multiplay/generic/int[31]", simgear::props::INT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10332, "sim/multiplay/generic/int[32]", simgear::props::INT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10333, "sim/multiplay/generic/int[33]", simgear::props::INT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10334, "sim/multiplay/generic/int[34]", simgear::props::INT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10335, "sim/multiplay/generic/int[35]", simgear::props::INT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10336, "sim/multiplay/generic/int[36]", simgear::props::INT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10337, "sim/multiplay/generic/int[37]", simgear::props::INT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10338, "sim/multiplay/generic/int[38]", simgear::props::INT, TT_ASIS, V1_1_2_PROP_ID, NULL },
{ 10339, "sim/multiplay/generic/int[39]", simgear::props::INT, TT_ASIS, V1_1_2_PROP_ID, NULL },
//{ 10320, "sim/multiplay/generic/int[20]", simgear::props::INT, TT_ASIS, V1_1_PROP_ID, NULL },
//{ 10321, "sim/multiplay/generic/int[21]", simgear::props::INT, TT_ASIS, V1_1_PROP_ID, NULL },
//{ 10322, "sim/multiplay/generic/int[22]", simgear::props::INT, TT_ASIS, V1_1_PROP_ID, NULL },
//{ 10323, "sim/multiplay/generic/int[23]", simgear::props::INT, TT_ASIS, V1_1_PROP_ID, NULL },
//{ 10324, "sim/multiplay/generic/int[24]", simgear::props::INT, TT_ASIS, V1_1_PROP_ID, NULL },
//{ 10325, "sim/multiplay/generic/int[25]", simgear::props::INT, TT_ASIS, V1_1_PROP_ID, NULL },
//{ 10326, "sim/multiplay/generic/int[26]", simgear::props::INT, TT_ASIS, V1_1_PROP_ID, NULL },
//{ 10327, "sim/multiplay/generic/int[27]", simgear::props::INT, TT_ASIS, V1_1_PROP_ID, NULL },
//{ 10328, "sim/multiplay/generic/int[28]", simgear::props::INT, TT_ASIS, V1_1_PROP_ID, NULL },
//{ 10329, "sim/multiplay/generic/int[29]", simgear::props::INT, TT_ASIS, V1_1_PROP_ID, NULL },
//{ 10320, "sim/multiplay/generic/int[20]", simgear::props::INT, TT_ASIS, V1_1_PROP_ID, NULL },
//{ 10321, "sim/multiplay/generic/int[21]", simgear::props::INT, TT_ASIS, V1_1_PROP_ID, NULL },
//{ 10322, "sim/multiplay/generic/int[22]", simgear::props::INT, TT_ASIS, V1_1_PROP_ID, NULL },
//{ 10323, "sim/multiplay/generic/int[23]", simgear::props::INT, TT_ASIS, V1_1_PROP_ID, NULL },
//{ 10324, "sim/multiplay/generic/int[24]", simgear::props::INT, TT_ASIS, V1_1_PROP_ID, NULL },
//{ 10325, "sim/multiplay/generic/int[25]", simgear::props::INT, TT_ASIS, V1_1_PROP_ID, NULL },
//{ 10326, "sim/multiplay/generic/int[26]", simgear::props::INT, TT_ASIS, V1_1_PROP_ID, NULL },
//{ 10327, "sim/multiplay/generic/int[27]", simgear::props::INT, TT_ASIS, V1_1_PROP_ID, NULL },
//{ 10328, "sim/multiplay/generic/int[28]", simgear::props::INT, TT_ASIS, V1_1_PROP_ID, NULL },
//{ 10329, "sim/multiplay/generic/int[29]", simgear::props::INT, TT_ASIS, V1_1_PROP_ID, NULL },
//{ 10330, "sim/multiplay/generic/int[30]", simgear::props::INT, TT_ASIS, V1_1_PROP_ID, NULL },
//{ 10331, "sim/multiplay/generic/int[31]", simgear::props::INT, TT_ASIS, V1_1_PROP_ID, NULL },
//{ 10332, "sim/multiplay/generic/int[32]", simgear::props::INT, TT_ASIS, V1_1_PROP_ID, NULL },
//{ 10333, "sim/multiplay/generic/int[33]", simgear::props::INT, TT_ASIS, V1_1_PROP_ID, NULL },
//{ 10334, "sim/multiplay/generic/int[34]", simgear::props::INT, TT_ASIS, V1_1_PROP_ID, NULL },
//{ 10335, "sim/multiplay/generic/int[35]", simgear::props::INT, TT_ASIS, V1_1_PROP_ID, NULL },
//{ 10336, "sim/multiplay/generic/int[36]", simgear::props::INT, TT_ASIS, V1_1_PROP_ID, NULL },
//{ 10337, "sim/multiplay/generic/int[37]", simgear::props::INT, TT_ASIS, V1_1_PROP_ID, NULL },
//{ 10338, "sim/multiplay/generic/int[38]", simgear::props::INT, TT_ASIS, V1_1_PROP_ID, NULL },
//{ 10339, "sim/multiplay/generic/int[39]", simgear::props::INT, TT_ASIS, V1_1_PROP_ID, NULL },
{ 10500, "sim/multiplay/generic/short[0]", simgear::props::INT, TT_SHORTINT, V1_1_2_PROP_ID, NULL },
{ 10501, "sim/multiplay/generic/short[1]", simgear::props::INT, TT_SHORTINT, V1_1_2_PROP_ID, NULL },
@ -384,7 +389,6 @@ static const IdPropertyList sIdPropertyList[] = {
{ 10537, "sim/multiplay/generic/short[37]", simgear::props::INT, TT_SHORTINT, V1_1_2_PROP_ID, NULL },
{ 10538, "sim/multiplay/generic/short[38]", simgear::props::INT, TT_SHORTINT, V1_1_2_PROP_ID, NULL },
{ 10539, "sim/multiplay/generic/short[39]", simgear::props::INT, TT_SHORTINT, V1_1_2_PROP_ID, NULL },
{ 10540, "sim/multiplay/generic/short[40]", simgear::props::INT, TT_SHORTINT, V1_1_2_PROP_ID, NULL },
{ 10541, "sim/multiplay/generic/short[41]", simgear::props::INT, TT_SHORTINT, V1_1_2_PROP_ID, NULL },
{ 10542, "sim/multiplay/generic/short[42]", simgear::props::INT, TT_SHORTINT, V1_1_2_PROP_ID, NULL },
@ -395,7 +399,6 @@ static const IdPropertyList sIdPropertyList[] = {
{ 10547, "sim/multiplay/generic/short[47]", simgear::props::INT, TT_SHORTINT, V1_1_2_PROP_ID, NULL },
{ 10548, "sim/multiplay/generic/short[48]", simgear::props::INT, TT_SHORTINT, V1_1_2_PROP_ID, NULL },
{ 10549, "sim/multiplay/generic/short[49]", simgear::props::INT, TT_SHORTINT, V1_1_2_PROP_ID, NULL },
{ 10550, "sim/multiplay/generic/short[50]", simgear::props::INT, TT_SHORTINT, V1_1_2_PROP_ID, NULL },
{ 10551, "sim/multiplay/generic/short[51]", simgear::props::INT, TT_SHORTINT, V1_1_2_PROP_ID, NULL },
{ 10552, "sim/multiplay/generic/short[52]", simgear::props::INT, TT_SHORTINT, V1_1_2_PROP_ID, NULL },
@ -406,7 +409,6 @@ static const IdPropertyList sIdPropertyList[] = {
{ 10557, "sim/multiplay/generic/short[57]", simgear::props::INT, TT_SHORTINT, V1_1_2_PROP_ID, NULL },
{ 10558, "sim/multiplay/generic/short[58]", simgear::props::INT, TT_SHORTINT, V1_1_2_PROP_ID, NULL },
{ 10559, "sim/multiplay/generic/short[59]", simgear::props::INT, TT_SHORTINT, V1_1_2_PROP_ID, NULL },
{ 10560, "sim/multiplay/generic/short[60]", simgear::props::INT, TT_SHORTINT, V1_1_2_PROP_ID, NULL },
{ 10561, "sim/multiplay/generic/short[61]", simgear::props::INT, TT_SHORTINT, V1_1_2_PROP_ID, NULL },
{ 10562, "sim/multiplay/generic/short[62]", simgear::props::INT, TT_SHORTINT, V1_1_2_PROP_ID, NULL },
@ -417,7 +419,6 @@ static const IdPropertyList sIdPropertyList[] = {
{ 10567, "sim/multiplay/generic/short[67]", simgear::props::INT, TT_SHORTINT, V1_1_2_PROP_ID, NULL },
{ 10568, "sim/multiplay/generic/short[68]", simgear::props::INT, TT_SHORTINT, V1_1_2_PROP_ID, NULL },
{ 10569, "sim/multiplay/generic/short[69]", simgear::props::INT, TT_SHORTINT, V1_1_2_PROP_ID, NULL },
{ 10570, "sim/multiplay/generic/short[70]", simgear::props::INT, TT_SHORTINT, V1_1_2_PROP_ID, NULL },
{ 10571, "sim/multiplay/generic/short[71]", simgear::props::INT, TT_SHORTINT, V1_1_2_PROP_ID, NULL },
{ 10572, "sim/multiplay/generic/short[72]", simgear::props::INT, TT_SHORTINT, V1_1_2_PROP_ID, NULL },
@ -429,30 +430,13 @@ static const IdPropertyList sIdPropertyList[] = {
{ 10578, "sim/multiplay/generic/short[78]", simgear::props::INT, TT_SHORTINT, V1_1_2_PROP_ID, NULL },
{ 10579, "sim/multiplay/generic/short[79]", simgear::props::INT, TT_SHORTINT, V1_1_2_PROP_ID, NULL },
/*{ 12100, "sim/multiplay/generic/string[20]", simgear::props::STRING, TT_ASIS , V1_1_2_PROP_ID, NULL },
{ 12101, "sim/multiplay/generic/string[21]", simgear::props::STRING, TT_ASIS , V1_1_2_PROP_ID, NULL },
{ 12102, "sim/multiplay/generic/string[22]", simgear::props::STRING, TT_ASIS , V1_1_2_PROP_ID, NULL },
{ 12103, "sim/multiplay/generic/string[23]", simgear::props::STRING, TT_ASIS , V1_1_2_PROP_ID, NULL },
{ 12104, "sim/multiplay/generic/string[24]", simgear::props::STRING, TT_ASIS , V1_1_2_PROP_ID, NULL },
{ 12105, "sim/multiplay/generic/string[25]", simgear::props::STRING, TT_ASIS , V1_1_2_PROP_ID, NULL },
{ 12106, "sim/multiplay/generic/string[26]", simgear::props::STRING, TT_ASIS , V1_1_2_PROP_ID, NULL },
{ 12107, "sim/multiplay/generic/string[27]", simgear::props::STRING, TT_ASIS , V1_1_2_PROP_ID, NULL },
{ 12108, "sim/multiplay/generic/string[28]", simgear::props::STRING, TT_ASIS , V1_1_2_PROP_ID, NULL },
{ 12109, "sim/multiplay/generic/string[29]", simgear::props::STRING, TT_ASIS , V1_1_2_PROP_ID, NULL },
{ 12110, "sim/multiplay/generic/string[20]", simgear::props::STRING, TT_ASIS , V1_1_2_PROP_ID, NULL },
{ 12111, "sim/multiplay/generic/string[31]", simgear::props::STRING, TT_ASIS , V1_1_2_PROP_ID, NULL },
{ 12112, "sim/multiplay/generic/string[32]", simgear::props::STRING, TT_ASIS , V1_1_2_PROP_ID, NULL },
{ 12113, "sim/multiplay/generic/string[33]", simgear::props::STRING, TT_ASIS , V1_1_2_PROP_ID, NULL },
{ 12114, "sim/multiplay/generic/string[34]", simgear::props::STRING, TT_ASIS , V1_1_2_PROP_ID, NULL },
{ 12115, "sim/multiplay/generic/string[35]", simgear::props::STRING, TT_ASIS , V1_1_2_PROP_ID, NULL },
{ 12116, "sim/multiplay/generic/string[36]", simgear::props::STRING, TT_ASIS , V1_1_2_PROP_ID, NULL },
{ 12117, "sim/multiplay/generic/string[37]", simgear::props::STRING, TT_ASIS , V1_1_2_PROP_ID, NULL },
{ 12118, "sim/multiplay/generic/string[38]", simgear::props::STRING, TT_ASIS , V1_1_2_PROP_ID, NULL },
{ 12119, "sim/multiplay/generic/string[39]", simgear::props::STRING, TT_ASIS , V1_1_2_PROP_ID, NULL },*/
};
/*
* For the 2017.x version 2 protocol (which layers inside the V1 packet) the properties are sent in two partitions,
* the first of these is a V1 protocol packet (which should be fine with all clients), and a V2 partition
* which will contain the newly supported shortint and fixed string encoding schemes.
*/
const int MAX_PARTITIONS = 2;
const int NEW_STRING_ENCODING_START = 12000; // anything below this uses the old string encoding scheme
const unsigned int numProperties = (sizeof(sIdPropertyList)
/ sizeof(sIdPropertyList[0]));
@ -502,7 +486,6 @@ namespace
const IdPropertyList* plist = findProperty(id);
if (plist) {
// printf("[VRFY] %8x: buf[%d] type %d\n", xdr, ((char*)xdr) - ((char*)data), plist->id);
xdr++;
// How we decode the remainder of the property depends on the type
switch (plist->type) {
@ -523,12 +506,6 @@ namespace
case props::STRING:
case props::UNSPECIFIED:
{
if (id >= NEW_STRING_ENCODING_START) {
uint32_t length = XDR_decode_uint32(*xdr);
xdr++;
xdr = (xdr_data_t*)(((char*)xdr) + length);
}
else {
// String is complicated. It consists of
// The length of the string
// The string itself
@ -550,7 +527,6 @@ namespace
//cout << "0";
}
}
}
break;
default:
// cerr << "Unknown Prop type " << id << " " << type << "\n";
@ -579,65 +555,9 @@ public:
{
_multiplay->setPropertiesChanged();
}
virtual void valueChanged(SGPropertyNode * node)
{
if (node->getNameString() == "protocol-version") {
_multiplay->setProtocolToUse(node->getIntValue());
SG_LOG(SG_NETWORK, SG_INFO, "Switched to procotol version: " << _multiplay->getProtocolToUse() << " " << node->getIntValue());
}
}
private:
FGMultiplayMgr* _multiplay;
};
#ifndef HEXDUMP_COLS
#define HEXDUMP_COLS 16
#endif
void hexdump(void *mem, unsigned int len)
{
unsigned int i, j;
for (i = 0; i < len + ((len % HEXDUMP_COLS) ? (HEXDUMP_COLS - len % HEXDUMP_COLS) : 0); i++)
{
/* print offset */
if (i % HEXDUMP_COLS == 0)
{
printf("0x%06x: ", i);
}
/* print hex data */
if (i < len)
{
printf("%02x ", 0xFF & ((char*)mem)[i]);
}
else /* end of block, just aligning for ASCII dump */
{
printf(" ");
}
/* print ASCII dump */
if (i % HEXDUMP_COLS == (HEXDUMP_COLS - 1))
{
for (j = i - (HEXDUMP_COLS - 1); j <= i; j++)
{
if (j >= len) /* end of block, not really printing */
{
putchar(' ');
}
else if (isprint(((char*)mem)[j])) /* printable char */
{
putchar(0xFF & ((char*)mem)[j]);
}
else /* other char */
{
putchar('.');
}
}
putchar('\n');
}
}
}
//////////////////////////////////////////////////////////////////////
//
@ -770,6 +690,11 @@ FGMultiplayMgr::FGMultiplayMgr()
globals->get_commands()->addCommand("multiplayer-connect", do_multiplayer_connect);
globals->get_commands()->addCommand("multiplayer-disconnect", do_multiplayer_disconnect);
globals->get_commands()->addCommand("multiplayer-refreshserverlist", do_multiplayer_refreshserverlist);
pXmitLen = fgGetNode("/sim/multiplay/last-xmit-packet-len", true);
pProtocolVersion = fgGetNode("/sim/multiplay/last-xmit-packet-len", true);
pMultiPlayDebugLevel = fgGetNode("/sim/multiplay/debug-level", true);
pMultiPlayRange = fgGetNode("/sim/multiplay/visibility-range-nm", true);
pMultiPlayRange->setIntValue(100);
} // FGMultiplayMgr::FGMultiplayMgr()
//////////////////////////////////////////////////////////////////////
@ -874,7 +799,6 @@ FGMultiplayMgr::init (void)
mPropertiesChanged = true;
mListener = new MPPropertyListener(this);
globals->get_props()->addChangeListener(mListener, false);
fgGetNode("/sim/multiplay/protocol-version", true)->addChangeListener(mListener, true);
fgSetBool("/sim/multiplay/online", true);
mInitialised = true;
@ -994,12 +918,12 @@ union FGMultiplayMgr::MsgBuf
*/
xdr_data_t* propsRecvdEnd()
{
return reinterpret_cast<xdr_data_t*>(Msg + Header.MsgLen + Header.MsgLen2);
return reinterpret_cast<xdr_data_t*>(Msg + Header.MsgLen);
}
const xdr_data_t* propsRecvdEnd() const
{
return reinterpret_cast<const xdr_data_t*>(Msg + Header.MsgLen + Header.MsgLen2);
return reinterpret_cast<const xdr_data_t*>(Msg + Header.MsgLen);
}
xdr_data2_t double_val;
@ -1051,6 +975,16 @@ FGMultiplayMgr::SendMyPosition(const FGExternalMotionData& motionInfo)
static unsigned msgLen = 0;
T_PositionMsg* PosMsg = msgBuf.posMsg();
/*
* This is to provide a level of compatibility with the new V2 packets.
* By setting padding it will force older clients to use verify properties which will
* bail out if there are any unknown props
* V2 (for V1 clients) will always have an unknown property because V2 transmits
* the protocol version as the very first property as a shortint.
*/
if (getProtocolToUse() > 1)
PosMsg->pad = XDR_encode_double(V2_PAD_MAGIC);
strncpy(PosMsg->Model, fgGetString("/sim/model/path"), MAX_MODEL_NAME_LEN);
PosMsg->Model[MAX_MODEL_NAME_LEN - 1] = '\0';
if (fgGetBool("/sim/freeze/replay-state", true)&&
@ -1105,35 +1039,39 @@ FGMultiplayMgr::SendMyPosition(const FGExternalMotionData& motionInfo)
xdr_data_t* data = ptr;
xdr_data_t* msgEnd = msgBuf.propsEnd();
int previous_partitions_len = 0;
for (int partition = 1; partition <= mProtocolVersion; partition++)
for (int partition = 1; partition <= getProtocolToUse(); partition++)
{
std::vector<FGPropertyData*>::const_iterator it = motionInfo.properties.begin();
while (it != motionInfo.properties.end()) {
const struct IdPropertyList* propDef = mPropertyDefinition[(*it)->id];
if (propDef->version == partition || propDef->version > mProtocolVersion)
if (propDef->version == partition || propDef->version > getProtocolToUse())
{
if (ptr + 2 >= msgEnd)
{
SG_LOG(SG_NETWORK, SG_ALERT, "Multiplayer packet truncated prop id: " << (*it)->id);
break;
}
//printf("[SEND] p%d: %8x: buf[%d] type %d : p%d TA:%d\n", partition, ptr, ((unsigned int)ptr) - ((unsigned int)data), (*it)->id, propDef->version, propDef->TransmitAs);
// First element is the ID. Write it out when we know we have room for
// the whole property.
xdr_data_t id = XDR_encode_uint32((*it)->id);
int transmit_type = (*it)->type;
if (propDef->TransmitAs != TT_ASIS)
if (partition > 1 && propDef->TransmitAs != TT_ASIS)
{
transmit_type = propDef->TransmitAs;
}
if (pMultiPlayDebugLevel->getIntValue() & 2)
SG_LOG(SG_NETWORK, SG_INFO,
"[SEND] pt " << partition <<
": buf[" << ((unsigned int)ptr) - ((unsigned int)data)
<< "] id=" << (*it)->id << " type " << transmit_type);
// The actual data representation depends on the type
switch (transmit_type) {
case TT_SHORTINT:
{
*ptr++ = XDR_encode_uint32((((*it)->id & 0xffff) << 16) | ((*it)->int_value & 0xffff));
*ptr++ = XDR_encode_shortints32((*it)->id, (*it)->int_value);
break;
}
case simgear::props::INT:
@ -1152,10 +1090,10 @@ FGMultiplayMgr::SendMyPosition(const FGExternalMotionData& motionInfo)
case simgear::props::STRING:
case simgear::props::UNSPECIFIED:
{
if ((*it)->id >= NEW_STRING_ENCODING_START) {
if (partition > 1) {
// New string encoding:
// The length of the string (int32)
// The string itself (char[length])
// xdr[0] : ID length packed into 32 bit containing two shorts.
// xdr[1..len/4] The string itself (char[length])
const char* lcharptr = (*it)->string_value;
if (lcharptr != 0)
@ -1177,8 +1115,7 @@ FGMultiplayMgr::SendMyPosition(const FGExternalMotionData& motionInfo)
goto escape;
}
*ptr++ = id;
*ptr++ = XDR_encode_uint32(len);
*ptr++ = XDR_encode_shortints32((*it)->id, len);
encodeStart = (char*)ptr;
if (len != 0)
{
@ -1288,31 +1225,36 @@ FGMultiplayMgr::SendMyPosition(const FGExternalMotionData& motionInfo)
}
++it;
}
}
escape:
msgLen = reinterpret_cast<char*>(ptr) - msgBuf.Msg;
/*
* 2017.x MP changes:
* The buffer is partitioned into two logical sections; the first contains the backwards compatible section, which
* is only to be read by older clients.
* The second partition (in the buf) contains all of the rest of the data for all other versions
*/
if (partition == 1)
{
FillMsgHdr(msgBuf.msgHdr(), POS_DATA_ID, msgLen);
previous_partitions_len += msgLen;
}
else
/*
* Informational:
* Save the last packet length sent, and
* if the property is set then dump the packet length to the console.
* This should be sufficient for rudimentary debugging - at this point I don't want
* to spend ages creating some sort of fancy and configurable MP debugging suite that
* would have limited uses; so what's here is what I would have like to be able to view when
* developing MP model elements.
*/
pXmitLen->setIntValue(msgLen);
if (pMultiPlayDebugLevel->getIntValue() & 4)
{
int ml2 = msgLen - previous_partitions_len;
//previous_partitions_len += ml2;
msgBuf.msgHdr()->MsgLen2 = XDR_encode_int32(ml2);
SG_LOG(SG_NETWORK, SG_INFO,
"[SEND] Packet len " << msgLen);
if (pMultiPlayDebugLevel->getIntValue() & 2)
SG_LOG_HEXDUMP(SG_NETWORK, SG_INFO, data, (ptr - data) * sizeof(*ptr));
}
//printf("[SEND] %d: %8x: buf[%d] p1l %4d p2 %4d\n", partition, ptr, ((unsigned int)ptr) - ((unsigned int)data),
//XDR_decode_int32(msgBuf.msgHdr()->MsgLen),
// XDR_decode_int32(msgBuf.msgHdr()->MsgLen2));
//hexdump(data, (ptr - data) * sizeof(*ptr));
//long stamp = SGTimeStamp::now().getSeconds();
//ProcessPosMsg(msgBuf, mServer, stamp);
/*
* simple loopback of ourselves - to enable easy MP debug for model developers.
*/
if (pMultiPlayDebugLevel->getIntValue() & 1)
{
long stamp = SGTimeStamp::now().getSeconds();
ProcessPosMsg(msgBuf, mServer, stamp);
}
}
if (msgLen>0)
@ -1697,49 +1639,59 @@ FGMultiplayMgr::ProcessPosMsg(const FGMultiplayMgr::MsgBuf& Msg,
// strict about the validity of the property values.
const xdr_data_t* xdr = Msg.properties();
const xdr_data_t* data = xdr;
if (PosMsg->pad != 0) {
int MsgLenBytes = Msg.Header.MsgLen;
/*
* with V2 we use the pad to forcefully invoke older clients to verify (and discard)
* our new protocol.
* This will preserve the position info but not transmit the properties; which is about
* the most reasonable compromise we can have
*/
if (PosMsg->pad != 0 && PosMsg->pad != V2_PAD_MAGIC) {
if (verifyProperties(&PosMsg->pad, Msg.propsRecvdEnd()))
xdr = &PosMsg->pad;
else if (!verifyProperties(xdr, Msg.propsRecvdEnd()))
goto noprops;
}
while (xdr < Msg.propsRecvdEnd()) {
// simgear::props::Type type = simgear::props::UNSPECIFIED;
// First element is always the ID
unsigned id = XDR_decode_uint32(*xdr);
//cout << pData->id << " ";
// printf("[RECV] %8x: buf[%d] type %d\n", xdr, ((char*)xdr) - ((char*)data), id);
xdr++;
/*
* As we can detect a short int encoded value (by the upper word being non-zero) we can
* do the decode here; set the id correctly, extract the integer and set the flag.
* This can then be picked up by the normal processing based on the flag
*/
int int_value = 0;
bool short_int_encoded = false;
if (id & 0xffff0000)
{
int_value = id & 0xffff;
id = (id & 0xffff0000) >> 16;
int v1, v2;
XDR_decode_shortints32(*xdr, v1, v2);
int_value = v2;
id = v1;
short_int_encoded = true;
}
if (pMultiPlayDebugLevel->getIntValue() & 8)
SG_LOG(SG_NETWORK, SG_INFO,
"[RECV] add " << std::hex << xdr
<< std::dec <<
": buf[" << ((char*)xdr) - ((char*)data)
<< "] id=" << id
<< " SIenc " << short_int_encoded);
// Check the ID actually exists and get the type
const IdPropertyList* plist = findProperty(id);
xdr++;
if (plist)
{
FGPropertyData* pData = new FGPropertyData;
pData->id = id;
if (short_int_encoded)
{
pData->int_value = int_value;
pData->type = simgear::props::INT;
}
else {
pData->type = plist->type;
// How we decode the remainder of the property depends on the type
switch (pData->type) {
case TT_SHORTINT:
pData->int_value = int_value;
break;
case simgear::props::INT:
case simgear::props::BOOL:
case simgear::props::LONG:
@ -1756,21 +1708,6 @@ FGMultiplayMgr::ProcessPosMsg(const FGMultiplayMgr::MsgBuf& Msg,
case simgear::props::STRING:
case simgear::props::UNSPECIFIED:
{
if (pData->id >= NEW_STRING_ENCODING_START) {
uint32_t length = XDR_decode_uint32(*xdr);
xdr++;
pData->string_value = new char[length + 1];
char *cptr = (char*)xdr;
for (unsigned i = 0; i < length; i++)
{
pData->string_value[i] = *cptr++;
}
pData->string_value[length] = '\0';
// printf(">> string recv %s\n", pData->string_value);
xdr = (xdr_data_t*)cptr;
}
else {
// String is complicated. It consists of
// The length of the string
// The string itself
@ -1801,7 +1738,6 @@ FGMultiplayMgr::ProcessPosMsg(const FGMultiplayMgr::MsgBuf& Msg,
}
//cout << "\n";
}
}
break;
default:
@ -1810,7 +1746,7 @@ FGMultiplayMgr::ProcessPosMsg(const FGMultiplayMgr::MsgBuf& Msg,
xdr++;
break;
}
}
motionInfo.properties.push_back(pData);
}
else
@ -1819,7 +1755,11 @@ FGMultiplayMgr::ProcessPosMsg(const FGMultiplayMgr::MsgBuf& Msg,
SG_LOG(SG_NETWORK, SG_DEBUG, "FGMultiplayMgr::ProcessPosMsg - "
"message from " << MsgHdr->Callsign << " has unknown property id "
<< id);
break; // C TESTING ONLY AS PROBABLY INDICATES BAD PACKET.
SG_LOG_HEXDUMP(SG_NETWORK, SG_DEBUG, data, (Msg.propsRecvdEnd() - data) * sizeof(*data));
// At this point the packet must be considered to be unreadable
// as we have no way of knowing the length of this property (it could be a string)
break;
}
}
noprops:
@ -1880,8 +1820,8 @@ FGMultiplayMgr::FillMsgHdr(T_MsgHdr *MsgHdr, int MsgId, unsigned _len)
MsgHdr->Version = XDR_encode_uint32(PROTO_VER);
MsgHdr->MsgId = XDR_encode_uint32(MsgId);
MsgHdr->MsgLen = XDR_encode_uint32(len);
MsgHdr->MsgLen2 = 0; // Used to be ReplyAddress; repurposed with MP2017.x changes
MsgHdr->ReplyPort = 0; // now
MsgHdr->RequestedRangeNm = XDR_encode_shortints32(0,pMultiPlayRange->getIntValue());
MsgHdr->ReplyPort = 0;
strncpy(MsgHdr->Callsign, mCallsign.c_str(), MAX_CALLSIGN_LEN);
MsgHdr->Callsign[MAX_CALLSIGN_LEN - 1] = '\0';
}

View file

@ -74,14 +74,11 @@ private:
}
int getProtocolToUse()
{
return mProtocolVersion;
}
void setProtocolToUse(int protocolVersion)
{
int protocolVersion = pProtocolVersion->getIntValue();
if (protocolVersion >= MIN_MP_PROTOCOL_VERSION && protocolVersion <= MAX_MP_PROTOCOL_VERSION)
mProtocolVersion = protocolVersion;
return protocolVersion;
else
mProtocolVersion = MIN_MP_PROTOCOL_VERSION;
return MIN_MP_PROTOCOL_VERSION;
}
void findProperties();
@ -113,12 +110,15 @@ private:
// and the property nodes
typedef std::map<unsigned int, SGSharedPtr<SGPropertyNode> > PropertyMap;
PropertyMap mPropertyMap;
SGPropertyNode *pProtocolVersion;
SGPropertyNode *pXmitLen;
SGPropertyNode *pMultiPlayDebugLevel;
SGPropertyNode *pMultiPlayRange;
typedef std::map<unsigned int, const struct IdPropertyList*> PropertyDefinitionMap;
PropertyDefinitionMap mPropertyDefinition;
bool mPropertiesChanged;
int mProtocolVersion;
MPPropertyListener* mListener;

View file

@ -73,6 +73,34 @@ XDR_encode_int32 ( const int32_t & n_Val )
return (SWAP32(static_cast<xdr_data_t> (n_Val)));
}
static short convert_int_to_short(int v1)
{
if (v1 < -32767)
v1 = -32767;
if (v1 > 32767)
v1 = 32767;
return (short)v1;
}
/*
* Pack two 16bit shorts into a 32 bit int. By convention v1 is packed in the highword
*/
xdr_data_t XDR_encode_shortints32(const int v1, const int v2)
{
return XDR_encode_uint32( (convert_int_to_short(v1) << 16) | (convert_int_to_short(v2)));
}
/* Decode packed shorts into two ints. V1 in the highword ($V1..V2..)*/
void XDR_decode_shortints32(const xdr_data_t & n_Val, int &v1, int &v2)
{
int _v1 = XDR_decode_int32(n_Val);
short s2 = (short)(_v1 & 0xffff);
short s1 = (short)(_v1 >> 16);
v1 = s1;
v2 = s2;
}
xdr_data_t
XDR_encode_uint32 ( const uint32_t & n_Val )
{

View file

@ -54,6 +54,9 @@ xdr_data2_t XDR_encode_uint64 ( const uint64_t & n_Val );
int64_t XDR_decode_int64 ( const xdr_data2_t & n_Val );
uint64_t XDR_decode_uint64 ( const xdr_data2_t & n_Val );
xdr_data_t XDR_encode_shortints32(const int v1, const int v2);
void XDR_decode_shortints32(const xdr_data_t & n_Val, int &v1, int &v2);
//////////////////////////////////////////////////
//
// FIXME: #1 these funtions must be fixed for