From b24330686654f1bd18678672543a3f389c06ec92 Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Thu, 30 Apr 2015 11:03:42 -0700 Subject: [PATCH 01/81] Added namespace qualifiers for memcpy in Message logging. --- xpcPlugin/Message.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/xpcPlugin/Message.cpp b/xpcPlugin/Message.cpp index 312231c..4448dec 100644 --- a/xpcPlugin/Message.cpp +++ b/xpcPlugin/Message.cpp @@ -108,7 +108,7 @@ namespace XPC for (int i = 0; i < numCols; ++i) { values[i][0] = buffer[5 + 36 * i]; - memcpy(values[i] + 1, buffer + 9 + 36 * i, 9 * sizeof(float)); + std::memcpy(values[i] + 1, buffer + 9 + 36 * i, 9 * sizeof(float)); } ss << " (" << numCols << " lines)"; Log::WriteLine(ss.str()); @@ -157,8 +157,8 @@ namespace XPC float gear = *((float*)(buffer + 30)); float pos[3]; float orient[3]; - memcpy(pos, buffer + 6, 12); - memcpy(orient, buffer + 18, 12); + std::memcpy(pos, buffer + 6, 12); + std::memcpy(orient, buffer + 18, 12); ss << " AC:" << (int)aircraft; ss << " Pos:(" << pos[0] << ' ' << pos[1] << ' ' << pos[2] << ") Orient:("; ss << orient[3] << ' ' << orient[4] << ' ' << orient[5] << ") Gear:"; From 6ed9c67469070ea0d3033d17b76c9f257c42ae80 Mon Sep 17 00:00:00 2001 From: Chris Teubert Date: Thu, 30 Apr 2015 11:16:08 -0700 Subject: [PATCH 02/81] Fixed Typo --- TestScripts/C Tests/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TestScripts/C Tests/main.c b/TestScripts/C Tests/main.c index ffce4ce..252ff86 100644 --- a/TestScripts/C Tests/main.c +++ b/TestScripts/C Tests/main.c @@ -623,7 +623,7 @@ int psendPOSITest() // sendPOSI test POSI[5] = -10.0F; POSI[6] = 1; - // Execution 2 + // Execution 3 pauseSim(sock, 1); sendPOSI(sock, POSI, 3, 0); result = getDREFs(sock, drefs, data, 7, sizes); From 2c9982fea002d00054c0a9971a4bb00415a9e351 Mon Sep 17 00:00:00 2001 From: Chris Teubert Date: Thu, 30 Apr 2015 11:16:20 -0700 Subject: [PATCH 03/81] Remove Todo Comment --- TestScripts/C Tests/main.c | 1 - 1 file changed, 1 deletion(-) diff --git a/TestScripts/C Tests/main.c b/TestScripts/C Tests/main.c index 252ff86..4a92c3e 100644 --- a/TestScripts/C Tests/main.c +++ b/TestScripts/C Tests/main.c @@ -663,7 +663,6 @@ int sendPOSITest() // sendPOSI test int i; // Iterator char* drefs[100] = { - // TODO: Can't get global position for multiplayer a/c? "sim/multiplayer/position/plane1_lat", "sim/multiplayer/position/plane1_lon", "sim/multiplayer/position/plane1_el", From 8898ff9be9ede9220c3df8ba195cf92d30dca0f1 Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Thu, 30 Apr 2015 11:19:13 -0700 Subject: [PATCH 04/81] Added explicit -m64 flag to CMakeLists. --- xpcPlugin/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xpcPlugin/CMakeLists.txt b/xpcPlugin/CMakeLists.txt index 0f889fd..b0c7198 100644 --- a/xpcPlugin/CMakeLists.txt +++ b/xpcPlugin/CMakeLists.txt @@ -20,7 +20,7 @@ add_library(xpc64 SHARED XPCPlugin.cpp MessageHandlers.cpp UDPSocket.cpp) set_target_properties(xpc64 PROPERTIES PREFIX "" SUFFIX ".xpl") -set_target_properties(xpc64 PROPERTIES COMPILE_FLAGS "-std=gnu++11" LINK_FLAGS "-shared -rdynamic -nodefaultlibs -undefined_warning") +set_target_properties(xpc64 PROPERTIES COMPILE_FLAGS "-std=gnu++11 -m64" LINK_FLAGS "-shared -rdynamic -nodefaultlibs -undefined_warning -m64") add_library(xpc32 SHARED XPCPlugin.cpp DataManager.cpp From 85e3ce91dd18361435acbe2b0bdc43367ee4ea0c Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Thu, 30 Apr 2015 13:03:11 -0700 Subject: [PATCH 05/81] Removed -nodefaultlibs flag on Linux 64 bit builds. --- xpcPlugin/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xpcPlugin/CMakeLists.txt b/xpcPlugin/CMakeLists.txt index b0c7198..7e4d565 100644 --- a/xpcPlugin/CMakeLists.txt +++ b/xpcPlugin/CMakeLists.txt @@ -20,7 +20,7 @@ add_library(xpc64 SHARED XPCPlugin.cpp MessageHandlers.cpp UDPSocket.cpp) set_target_properties(xpc64 PROPERTIES PREFIX "" SUFFIX ".xpl") -set_target_properties(xpc64 PROPERTIES COMPILE_FLAGS "-std=gnu++11 -m64" LINK_FLAGS "-shared -rdynamic -nodefaultlibs -undefined_warning -m64") +set_target_properties(xpc64 PROPERTIES COMPILE_FLAGS "-std=gnu++11 -m64" LINK_FLAGS "-shared -rdynamic -undefined_warning -m64") add_library(xpc32 SHARED XPCPlugin.cpp DataManager.cpp From 37eb6b6b032bd93a3ae07f65bba03332e2ca9718 Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Thu, 30 Apr 2015 13:53:02 -0700 Subject: [PATCH 06/81] Added X-Plane version information to the XPC log file. --- xpcPlugin/Log.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/xpcPlugin/Log.cpp b/xpcPlugin/Log.cpp index c08de8d..77943fa 100644 --- a/xpcPlugin/Log.cpp +++ b/xpcPlugin/Log.cpp @@ -1,6 +1,9 @@ //Copyright (c) 2013-2015 United States Government as represented by the Administrator of the //National Aeronautics and Space Administration. All Rights Reserved. #include "Log.h" + +#include "XPLMUtilities.h" + #include #include #include @@ -51,6 +54,13 @@ namespace XPC fprintf(fd, "an issue on GitHub (https://github.com/nasa/XPlaneConnect/issues) or by\n"); fprintf(fd, "emailing Christopher Teubert (christopher.a.teubert@nasa.gov).\n\n"); + int xpVer; + int xplmVer; + XPLMHostApplicationID hostID; + XPLMGetVersions(&xpVer, &xplmVer, &hostID); + fprintf(fd, "X-Plane Version: %d\n", xpVer); + fprintf(fd, "Plugin Manager Version: %d\n", xplmVer); + fprintf(fd, "Host Application ID: %d\n", hostID); fprintf(fd, "Log file generated on %s.\n", timeStr); fclose(fd); } From aaf25a993376f6e0fb896955e0b34ee9a34112a2 Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Thu, 30 Apr 2015 15:11:14 -0700 Subject: [PATCH 07/81] Updated Log to use C++ headers cstdio and ctime instead of stdio.h and time.h. --- xpcPlugin/Log.cpp | 72 +++++++++++++++++++++++------------------------ 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/xpcPlugin/Log.cpp b/xpcPlugin/Log.cpp index 77943fa..81ebf23 100644 --- a/xpcPlugin/Log.cpp +++ b/xpcPlugin/Log.cpp @@ -5,64 +5,64 @@ #include "XPLMUtilities.h" #include -#include -#include +#include +#include // Implementation note: I initial wrote this class using C++ iostreams, but I couldn't find any // way to implement FormatLine without adding in a call to sprintf. It therefore seems more -// efficient to me to just use C-style IO and call fprintf directly. +// efficient to me to just use C-style IO and call std::fprintf directly. namespace XPC { static void WriteTime(FILE* fd) { - time_t rawtime; - tm* timeinfo; - time(&rawtime); - timeinfo = localtime(&rawtime); + std::time_t rawtime; + std::tm* timeinfo; + std::time(&rawtime); + timeinfo = std::localtime(&rawtime); char buffer[16] = { 0 }; // Format is equivalent to [%F %T], but neither of those specifiers is // supported on Windows as of Visual Studio 13 - strftime(buffer, 16, "[%H:%M:%S] ", timeinfo); + std::strftime(buffer, 16, "[%H:%M:%S] ", timeinfo); - fprintf(fd, buffer); + std::fprintf(fd, buffer); } void Log::Initialize(std::string version) { - FILE* fd = fopen("XPCLog.txt", "w"); + std::FILE* fd = std::fopen("XPCLog.txt", "w"); if (fd != NULL) { - time_t rawtime; - tm* timeinfo; - time(&rawtime); - timeinfo = localtime(&rawtime); + std::time_t rawtime; + std::tm* timeinfo; + std::time(&rawtime); + timeinfo = std::localtime(&rawtime); char timeStr[16] = { 0 }; // Format is equivalent to %F, but neither of those specifiers is // supported on Windows as of Visual Studio 13 - strftime(timeStr, 16, "%Y-%m-%d", timeinfo); + std::strftime(timeStr, 16, "%Y-%m-%d", timeinfo); - fprintf(fd, "X-Plane Connect [Version %s]\n", version.c_str()); - fprintf(fd, "Compiled %s %s\n", __DATE__, __TIME__); - fprintf(fd, "Copyright (c) 2013-2015 United States Government as represented by the\n"); - fprintf(fd, "Administrator of the National Aeronautics and Space Administration.\n"); - fprintf(fd, "All Rights Reserved.\n\n"); + std::fprintf(fd, "X-Plane Connect [Version %s]\n", version.c_str()); + std::fprintf(fd, "Compiled %s %s\n", __DATE__, __TIME__); + std::fprintf(fd, "Copyright (c) 2013-2015 United States Government as represented by the\n"); + std::fprintf(fd, "Administrator of the National Aeronautics and Space Administration.\n"); + std::fprintf(fd, "All Rights Reserved.\n\n"); - fprintf(fd, "This file contains debugging information about the X-Plane Connect plugin.\n"); - fprintf(fd, "If you have technical issues with the plugin, please report them by opening\n"); - fprintf(fd, "an issue on GitHub (https://github.com/nasa/XPlaneConnect/issues) or by\n"); - fprintf(fd, "emailing Christopher Teubert (christopher.a.teubert@nasa.gov).\n\n"); + std::fprintf(fd, "This file contains debugging information about the X-Plane Connect plugin.\n"); + std::fprintf(fd, "If you have technical issues with the plugin, please report them by opening\n"); + std::fprintf(fd, "an issue on GitHub (https://github.com/nasa/XPlaneConnect/issues) or by\n"); + std::fprintf(fd, "emailing Christopher Teubert (christopher.a.teubert@nasa.gov).\n\n"); int xpVer; int xplmVer; XPLMHostApplicationID hostID; XPLMGetVersions(&xpVer, &xplmVer, &hostID); - fprintf(fd, "X-Plane Version: %d\n", xpVer); - fprintf(fd, "Plugin Manager Version: %d\n", xplmVer); - fprintf(fd, "Host Application ID: %d\n", hostID); - fprintf(fd, "Log file generated on %s.\n", timeStr); - fclose(fd); + std::fprintf(fd, "X-Plane Version: %d\n", xpVer); + std::fprintf(fd, "Plugin Manager Version: %d\n", xplmVer); + std::fprintf(fd, "Host Application ID: %d\n", hostID); + std::fprintf(fd, "Log file generated on %s.\n", timeStr); + std::fclose(fd); } } @@ -73,23 +73,23 @@ namespace XPC void Log::WriteLine(const char* value) { - FILE* fd = fopen("XPCLog.txt", "a"); + std::FILE* fd = std::fopen("XPCLog.txt", "a"); if (!fd) { return; } WriteTime(fd); - fprintf(fd, "%s\n", value); + std::fprintf(fd, "%s\n", value); - fclose(fd); + std::fclose(fd); } void Log::FormatLine(const char* format, ...) { va_list args; - FILE* fd = fopen("XPCLog.txt", "a"); + std::FILE* fd = std::fopen("XPCLog.txt", "a"); if (!fd) { return; @@ -97,10 +97,10 @@ namespace XPC va_start(args, format); WriteTime(fd); - vfprintf(fd, format, args); - fprintf(fd, "\n"); + std::vfprintf(fd, format, args); + std::fprintf(fd, "\n"); - fclose(fd); + std::fclose(fd); va_end(args); } From d735e0f3ad90d2d781bf7290fd5bdf87434a51a6 Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Thu, 30 Apr 2015 16:17:30 -0700 Subject: [PATCH 08/81] Updated plugin logging. - The plugin now keeps the log file open for the duration of its lifetime. - This greatly improves the performace of the logging component, which was previously a significant bottleneck even at low logging verbosity. - The log now prints timestamps to the millisecond. --- xpcPlugin/Log.cpp | 47 +++++++++++++++++++++++++---------------- xpcPlugin/Log.h | 3 +++ xpcPlugin/XPCPlugin.cpp | 1 + 3 files changed, 33 insertions(+), 18 deletions(-) diff --git a/xpcPlugin/Log.cpp b/xpcPlugin/Log.cpp index 81ebf23..e754312 100644 --- a/xpcPlugin/Log.cpp +++ b/xpcPlugin/Log.cpp @@ -4,33 +4,42 @@ #include "XPLMUtilities.h" +#include #include #include #include +#include +#include // Implementation note: I initial wrote this class using C++ iostreams, but I couldn't find any // way to implement FormatLine without adding in a call to sprintf. It therefore seems more // efficient to me to just use C-style IO and call std::fprintf directly. namespace XPC { + static std::FILE* fd; static void WriteTime(FILE* fd) { - std::time_t rawtime; - std::tm* timeinfo; - std::time(&rawtime); - timeinfo = std::localtime(&rawtime); + using namespace std::chrono; - char buffer[16] = { 0 }; - // Format is equivalent to [%F %T], but neither of those specifiers is - // supported on Windows as of Visual Studio 13 - std::strftime(buffer, 16, "[%H:%M:%S] ", timeinfo); + system_clock::time_point now = system_clock::now(); + std::time_t now_tt = system_clock::to_time_t(now); + system_clock::time_point now_sec = system_clock::from_time_t(now_tt); + milliseconds ms = duration_cast(now - now_sec); + std::tm * tm = std::localtime(&now_tt); + + std::stringstream ss; + ss << std::setfill('0') << "[" + << std::setw(2) << tm->tm_hour << ":" + << std::setw(2) << tm->tm_min << ":" + << std::setw(2) << tm->tm_sec << "." + << std::setw(3) << ms.count() << "]"; - std::fprintf(fd, buffer); + std::fprintf(fd, ss.str().c_str()); } void Log::Initialize(std::string version) { - std::FILE* fd = std::fopen("XPCLog.txt", "w"); + fd = std::fopen("XPCLog.txt", "w"); if (fd != NULL) { std::time_t rawtime; @@ -39,8 +48,6 @@ namespace XPC timeinfo = std::localtime(&rawtime); char timeStr[16] = { 0 }; - // Format is equivalent to %F, but neither of those specifiers is - // supported on Windows as of Visual Studio 13 std::strftime(timeStr, 16, "%Y-%m-%d", timeinfo); std::fprintf(fd, "X-Plane Connect [Version %s]\n", version.c_str()); @@ -62,6 +69,14 @@ namespace XPC std::fprintf(fd, "Plugin Manager Version: %d\n", xplmVer); std::fprintf(fd, "Host Application ID: %d\n", hostID); std::fprintf(fd, "Log file generated on %s.\n", timeStr); + std::fflush(fd); + } + } + + void Log::Close() + { + if (fd) + { std::fclose(fd); } } @@ -73,7 +88,6 @@ namespace XPC void Log::WriteLine(const char* value) { - std::FILE* fd = std::fopen("XPCLog.txt", "a"); if (!fd) { return; @@ -81,15 +95,13 @@ namespace XPC WriteTime(fd); std::fprintf(fd, "%s\n", value); - - std::fclose(fd); + std::fflush(fd); } void Log::FormatLine(const char* format, ...) { va_list args; - std::FILE* fd = std::fopen("XPCLog.txt", "a"); if (!fd) { return; @@ -99,8 +111,7 @@ namespace XPC WriteTime(fd); std::vfprintf(fd, format, args); std::fprintf(fd, "\n"); - - std::fclose(fd); + std::fflush(fd); va_end(args); } diff --git a/xpcPlugin/Log.h b/xpcPlugin/Log.h index a7c941e..84d75c0 100644 --- a/xpcPlugin/Log.h +++ b/xpcPlugin/Log.h @@ -34,6 +34,9 @@ namespace XPC /// writing header information to the log file. static void Initialize(std::string header); + /// Closes the log file. + static void Close(); + /// Writes the C string pointed to by format, followed by a line /// terminator to the XPC log file. If format contains format /// specifiers, additional arguments following format will be formatted diff --git a/xpcPlugin/XPCPlugin.cpp b/xpcPlugin/XPCPlugin.cpp index d8ff645..24063d9 100755 --- a/xpcPlugin/XPCPlugin.cpp +++ b/xpcPlugin/XPCPlugin.cpp @@ -119,6 +119,7 @@ PLUGIN_API void XPluginStop(void) { XPLMUnregisterFlightLoopCallback(XPCFlightLoopCallback, NULL); XPC::Log::WriteLine("[EXEC] Plugin Shutdown"); + XPC::Log::Close(); } PLUGIN_API void XPluginDisable(void) From b6233ab5d7c01e26b8925b2ca2584792e0844f86 Mon Sep 17 00:00:00 2001 From: jwatkins42 Date: Tue, 2 Dec 2014 22:50:47 -0800 Subject: [PATCH 09/81] Started implementation of Python version of XPC client. --- Python/src/xplaneConnect.py | 102 ++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 Python/src/xplaneConnect.py diff --git a/Python/src/xplaneConnect.py b/Python/src/xplaneConnect.py new file mode 100644 index 0000000..7278f2e --- /dev/null +++ b/Python/src/xplaneConnect.py @@ -0,0 +1,102 @@ +import socket + +class XPlaneConnect: + '''XPlaneConnect (XPC) facilitates communication to and from the XPCPlugin.''' + + # Basic Functions + def __init__(self, port, xp_ip = 'localhost', xp_port = 49009): + '''Creates a new XPlaneConnect interface, and binds a UDP socket based on the specified parameters.''' + + # Setup server port + server = (socket.INADDR_ANY, socket.htons(port)) + + # Setup XPlane IP and port + if xp_ip == 'localhost' or xp_ip is None: + self.xp_ip = '127.0.0.1' + else: + self.xp_ip = xp_ip + + self.xp_port = xp_port + + # Create and bind socket + # TODO: Raise a friendly error if socket creation/binding fails + self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) + self.socket.bind(server) + + # Set timeout + timeout_ms = 500 + self.socket.settimeout(timeout_ms / 1000) + + def __del__(self): + self.close() + + def close(): + '''Closes the underlying UDP socket''' + if self.socket is not None: + self.socket.close() + self.socket = None + + def send_udp(msg): + pass + + def read_udp(): + pass + + # Configuration + def set_conn(rec_port): + pass + + def pause_sim(state): + pass + + # UDP Data + def parse_data(msg, dataRef): + pass + + def read_data(msg, dataRef): + pass + + def send_data(msg, dataRef, rows): + pass + + # Position + def parse_pos(msg, resultArray, gear): + pass + + def read_pos(resultArray, gear): + pass + + def send_pos(ACNum, numArgs, valueArray): + pass + + # Controls + def parse_ctrl(msg, resultArray, gear): + pass + + def read_ctrol(resultArray, gear): + pass + + def send_pos(numArgs, valueArray): + pass + + # DREF Manipulation + def read_dref(resultArray): + pass + + def parse_dref(msg, dataRef, length_of_dref, values): + pass + + def send_dref(dataRef, length_of_dref, values): + pass + + def request_dref(dref_array, dref_sizes, list_len, resultArray): + pass + + def parse_getd(msg, dref_array, dref_sizes): + pass + + def parse_request(msg, result_array, array_sizes): + pass + + def read_request(data_ref, array_sizes, recv_addr): + pass \ No newline at end of file From 04897b878e7b63733b08bcfb0c77e64949c9de98 Mon Sep 17 00:00:00 2001 From: jwatkins42 Date: Sat, 6 Dec 2014 14:29:11 -0800 Subject: [PATCH 10/81] More python! --- Python/src/xplaneConnect.py | 194 ++++++++++++++++++++++++++++-------- 1 file changed, 154 insertions(+), 40 deletions(-) diff --git a/Python/src/xplaneConnect.py b/Python/src/xplaneConnect.py index 7278f2e..34fa61d 100644 --- a/Python/src/xplaneConnect.py +++ b/Python/src/xplaneConnect.py @@ -1,4 +1,5 @@ import socket +import struct class XPlaneConnect: '''XPlaneConnect (XPC) facilitates communication to and from the XPCPlugin.''' @@ -24,79 +25,192 @@ class XPlaneConnect: self.socket.bind(server) # Set timeout - timeout_ms = 500 - self.socket.settimeout(timeout_ms / 1000) + timeout_us = 500 + self.socket.settimeout(timeout_ms / 1000000) def __del__(self): self.close() - def close(): + def close(self): '''Closes the underlying UDP socket''' if self.socket is not None: self.socket.close() self.socket = None - def send_udp(msg): - pass + def send_udp(self, msg): + '''Sends a message over the underlying UDP socket.''' + msg_len = len(msg) + msg[4] = msg_len - def read_udp(): - pass + # Preconditions + if(msg_len <= 0): # Require message length greater than 0. + raise RuntimeError("send_udp: message length must be psoitive >0") + + # Code + self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # TODO: Why? + + self.socket.send(msg) + + def read_udp(self, recv_addr = None): + if recv_addr is None: + recv_addr = (self.xp_ip, self.xp_port) + + return self.socket.recv(5000) # TODO: Validate that this matches the behavior of the C version # Configuration - def set_conn(rec_port): - pass + def set_conn(self, rec_port): + msg = struct.pack("!4sH", ("CONN", rec_port)) + self.send_udp(msg) - def pause_sim(state): - pass + def pause_sim(self, pause): + '''Pauses or unpauses the X-Plane simulation''' + pause_val = 0 + if pause: + pause_val = 1 + + msg = struct.pack("4sBB", ("SIMU", pause_val, 0)) + self.send_udp(msg) # UDP Data - def parse_data(msg, dataRef): + def parse_data(self, data): pass - def read_data(msg, dataRef): - pass + def read_data(self): + buf = self.read_udp() + if buf[0] != 0: + return self.parse_data(buf) + else: + return None - def send_data(msg, dataRef, rows): - pass + def send_data(self, dataRef): + '''Sends X-Plane data over the underlying UDP socket.''' + msg = struct.pack("4s", "DATA") + for row in dataRef: + struct.pack_into("!I", msg, len(msg), row[0]) + for i in range(8): + struct.pack_into("!f", msg, len(msg), row[1][i]) + self.send_udp(msg) # Position - def parse_pos(msg, resultArray, gear): + def parse_pos(self, data): pass - def read_pos(resultArray, gear): - pass + def read_pos(self, resultArray, gear): + buf = self.read_udp() + if buf[0] != 0: + return self.parse_pos(buf) + else: + return None - def send_pos(ACNum, numArgs, valueArray): - pass + def send_pos(self, ac_num, values): + # Preconditions + if len(values) < 1: + raise RuntimeError("send_pos: Must have at least one argument") + # Header and Aircraft num + msg = struct.pack("!4sB", ("POSI", ac_num)) + + # States + for i in range(7): + val = -998.5 # TODO: Why? + if i < len(values): + val = values[i] + struct.pack_into("!f", msg, len(msg), val) + + # Send + self.send_udp(msg) +#} # Controls - def parse_ctrl(msg, resultArray, gear): + def parse_ctrl(self, data): pass - def read_ctrol(resultArray, gear): - pass + def read_ctrol(self, resultArray, gear): + buf = self.read_udp() + if buf[0] != 0: + return self.parse_ctrl(buf) + else: + return float("NaN") - def send_pos(numArgs, valueArray): - pass + def send_ctrol(self, values): + # Preconditions + if len(values) < 1: + raise RuntimeError("send_ctrl: Must have at least one argument") + + # Header + msg = struct.pack("!4s", "CTRL") + + # States + for i in range(6): + val = -998.5 # TODO: Why? + if i < len(values): + val = values[i] + struct.pack_into("!f", msg, len(msg), val) + + # Send + self.send_udp(msg) # DREF Manipulation - def read_dref(resultArray): + def read_dref(self, resultArray): + buf = self.read_udp() + if buf[0] != 0: + return self.parse_dref(buf) + else: + return None + + def parse_dref(self, data): pass - def parse_dref(msg, dataRef, length_of_dref, values): + def send_dref(self, data_ref, values): + '''Sends X-Plane dref over the underlying UDP socket.''' + msg_len = 7 + len(data_ref) + len(values) * 4 + + # Header + msg = struct.pack("4s", "DREF") + + # DRef + struct.pack_into("B", msg, len(msg), len(data_ref)) + struct.pack_into(str(len(data_ref)) + "B", msg, len(msg), data_ref) # TODO: Verify byte order (should be network order?) + + # Values + struct.pack_into("B", msg, len(msg), len(values)) + struct.pack_into(str(len(values)) + "f", msg, len(msg), values) # TODO: Verify byte order (should be network order?) + + self.send_udp(msg) + + def request_dref(self, dref_array, resultArray): + '''Requests drefs and reads the response.''' + self.send_request(dref_array) + for i in range(80): + size = self.read_dref(resultArray) + if size != -1: + return size + + return -1 + + def parse_getd(self, msg, dref_array, dref_sizes): pass - def send_dref(dataRef, length_of_dref, values): + def send_request(self, dref_array): + '''Sends a request over the underlying UDP socket.''' + # Header + msg = struct.pack("4s", "GETD"); + + # Number of values; + struct.pack_into("B", msg, len(msg), len(dref_array)) + + # The Rest + for dref in dref_array: + struct.pack_into("B", msg, len(msg), len(dref_array)) + struct.pack_into("100B", msg, len(msg), dref_array) + + self.send_udp(msg) + + def parse_request(self, data): pass - def request_dref(dref_array, dref_sizes, list_len, resultArray): - pass - - def parse_getd(msg, dref_array, dref_sizes): - pass - - def parse_request(msg, result_array, array_sizes): - pass - - def read_request(data_ref, array_sizes, recv_addr): - pass \ No newline at end of file + def read_request(self, data_ref, array_sizes, recv_addr): + buf = self.read_udp() + if buf[0] != 0: + return self.parse_request(buf) + else: + return None \ No newline at end of file From fd63976e4decfb87498b72b3561147cb04b97797 Mon Sep 17 00:00:00 2001 From: jwatkins42 Date: Mon, 8 Dec 2014 20:08:04 -0800 Subject: [PATCH 11/81] Finished basic Python impl. --- Python/src/xplaneConnect.py | 72 +++++++++++++++++++++++++++++-------- 1 file changed, 58 insertions(+), 14 deletions(-) diff --git a/Python/src/xplaneConnect.py b/Python/src/xplaneConnect.py index 34fa61d..6f10e65 100644 --- a/Python/src/xplaneConnect.py +++ b/Python/src/xplaneConnect.py @@ -72,8 +72,18 @@ class XPlaneConnect: self.send_udp(msg) # UDP Data - def parse_data(self, data): - pass + def parse_data(self, msg): + total_cols = ((len(data) - 5) / 36) + data = [] + + # Input Validation + for i in range(total_cols): + data.append([]) + data[i].append(struct.unpack_from("f", msg, 5 + 36*i)) + for j in range(1, 9): + data[i].append(struct.unpack_from("f", msg, 5 + 4*j + 36*i)) + + return data def read_data(self): buf = self.read_udp() @@ -92,8 +102,16 @@ class XPlaneConnect: self.send_udp(msg) # Position - def parse_pos(self, data): - pass + def parse_pos(self, msg, array_size): + if array_size < 1: + return None + + gear = struct.unpack_from("f", msg, 30) + result = [] + for i in range(min(array_size, 6)): + result.append(struct.unpack_from("f", msg, i*4 + 6)) + + return result, gear def read_pos(self, resultArray, gear): buf = self.read_udp() @@ -109,7 +127,6 @@ class XPlaneConnect: # Header and Aircraft num msg = struct.pack("!4sB", ("POSI", ac_num)) - # States for i in range(7): val = -998.5 # TODO: Why? @@ -119,10 +136,15 @@ class XPlaneConnect: # Send self.send_udp(msg) -#} + # Controls - def parse_ctrl(self, data): - pass + def parse_ctrl(self, msg): + result = [] + for i in range(4): + result.append(struct.unpack_from("f", msg, i*4 + i)) + gear = struct.unpack_from("B", msg, 21) + flaps = struct.unpack_from("f", msg, 22) + return flaps, gear, result def read_ctrol(self, resultArray, gear): buf = self.read_udp() @@ -157,8 +179,12 @@ class XPlaneConnect: else: return None - def parse_dref(self, data): - pass + def parse_dref(self, msg): + len_dref = struct.unpack_from("B", msg, 5) + dref = struct.unpack_from(str(len_dref) + "B", msg, 6) + len_val = struct.unpack_from("B", msg, 6 + len_dref) + values = struct.unpack_from(str(len_val) + "f", msg, 7 + len_dref) + return dref, values def send_dref(self, data_ref, values): '''Sends X-Plane dref over the underlying UDP socket.''' @@ -188,7 +214,16 @@ class XPlaneConnect: return -1 def parse_getd(self, msg, dref_array, dref_sizes): - pass + len_list = struct.unpack_from("B", msg, 5) + counter = 6 + drefs = [] + + for i in range(len_list): + dref_size = struct.unpack_from("B", msg, counter) + drefs.append(struct.unpack_from(str(dref_size) + "B", msg, counter + 1)) + counter += dref_size + 1 + + return drefs def send_request(self, dref_array): '''Sends a request over the underlying UDP socket.''' @@ -205,10 +240,19 @@ class XPlaneConnect: self.send_udp(msg) - def parse_request(self, data): - pass + def parse_request(self, msg): + count = msg[5] + cursor = 6 + result = [] + for i in range(count): + arr_size = msg[cursor] + data = struct.unpack_from(str(arr_size) + "f", msg, cursor) + result.append(data) + cursor += arr_size - def read_request(self, data_ref, array_sizes, recv_addr): + return result + + def read_request(self, recv_addr): buf = self.read_udp() if buf[0] != 0: return self.parse_request(buf) From 4aaca80d3e66dbaa67aa12a4d6c23b0ccb5a5c3c Mon Sep 17 00:00:00 2001 From: jwatkins42 Date: Mon, 8 Dec 2014 20:09:44 -0800 Subject: [PATCH 12/81] Added PyTools project files for Python API --- Python/xplaneConnect.pyproj | 49 +++++++++++++++++++++++++++++++++++++ Python/xplaneConnect.sln | 20 +++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 Python/xplaneConnect.pyproj create mode 100644 Python/xplaneConnect.sln diff --git a/Python/xplaneConnect.pyproj b/Python/xplaneConnect.pyproj new file mode 100644 index 0000000..3e9e65f --- /dev/null +++ b/Python/xplaneConnect.pyproj @@ -0,0 +1,49 @@ + + + + Debug + 2.0 + 3c7a940d-17c8-4e91-882f-9bc8b1d2f54b + . + src/xplaneConnect.py + + + . + . + xplaneConnect + xplaneConnect + {2af0f10d-7135-4994-9156-5d01c9c11b7e} + 2.7 + + + true + false + + + true + false + + + + + + + + + + + + 10.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Python Tools\Microsoft.PythonTools.targets + + + + + + + + + + \ No newline at end of file diff --git a/Python/xplaneConnect.sln b/Python/xplaneConnect.sln new file mode 100644 index 0000000..415b6fa --- /dev/null +++ b/Python/xplaneConnect.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.31101.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{888888A0-9F3D-457C-B088-3A5042F75D52}") = "xplaneConnect", "xplaneConnect.pyproj", "{3C7A940D-17C8-4E91-882F-9BC8B1D2F54B}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {3C7A940D-17C8-4E91-882F-9BC8B1D2F54B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3C7A940D-17C8-4E91-882F-9BC8B1D2F54B}.Release|Any CPU.ActiveCfg = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal From 9fb2274ae8a0fb664558994c5e17451a12b8140b Mon Sep 17 00:00:00 2001 From: jwatkins42 Date: Tue, 9 Dec 2014 19:09:29 -0800 Subject: [PATCH 13/81] Started implementing tests --- Python/xplaneConnect.sln | 4 ++ TestScripts/Python Tests/Tests.py | 85 +++++++++++++++++++++++++++ TestScripts/Python Tests/Tests.pyproj | 46 +++++++++++++++ 3 files changed, 135 insertions(+) create mode 100644 TestScripts/Python Tests/Tests.py create mode 100644 TestScripts/Python Tests/Tests.pyproj diff --git a/Python/xplaneConnect.sln b/Python/xplaneConnect.sln index 415b6fa..cc45d45 100644 --- a/Python/xplaneConnect.sln +++ b/Python/xplaneConnect.sln @@ -5,6 +5,8 @@ VisualStudioVersion = 12.0.31101.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{888888A0-9F3D-457C-B088-3A5042F75D52}") = "xplaneConnect", "xplaneConnect.pyproj", "{3C7A940D-17C8-4E91-882F-9BC8B1D2F54B}" EndProject +Project("{888888A0-9F3D-457C-B088-3A5042F75D52}") = "Tests", "..\TestScripts\Python Tests\Tests.pyproj", "{6931EBB2-4E01-4C5A-86B6-668C0E75051B}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -13,6 +15,8 @@ Global GlobalSection(ProjectConfigurationPlatforms) = postSolution {3C7A940D-17C8-4E91-882F-9BC8B1D2F54B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3C7A940D-17C8-4E91-882F-9BC8B1D2F54B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6931EBB2-4E01-4C5A-86B6-668C0E75051B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6931EBB2-4E01-4C5A-86B6-668C0E75051B}.Release|Any CPU.ActiveCfg = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/TestScripts/Python Tests/Tests.py b/TestScripts/Python Tests/Tests.py new file mode 100644 index 0000000..412c890 --- /dev/null +++ b/TestScripts/Python Tests/Tests.py @@ -0,0 +1,85 @@ +import random +import unittest +import imp + +xplaneConnect = imp.load_source('xplaneConnect', '../../Python/src/xplaneConnect.py') + +class XPCTests(unittest.TestCase): + """Tests the functionality of the XPlaneConnect class.""" + + def test_init(self): + xpc = xplaneConnect.XPlaneConnect(49062, "127.0.0.1", 49009) + self.assertTrue(True) + + def test_close(self): + xpc = xplaneConnect.XPlaneConnect(49063, "127.0.0.1", 49009) + xpc.close() + self.assertIsNone(xpc.socket) + xpc = xplaneConnect.XPlaneConnect(49063, "127.0.0.1", 49009) + self.assertTrue(True) + + def test_send_read(self): + # Init + test = "\x00\x01\x02\x03\x05" + + # Setup + sender = xplaneConnect.XPlaneConnect(49064, "127.0.0.1", 49063) + receiver = xplaneConnect.XPlaneConnect(49063, "127.0.0.1", 49009) + + # Execution + sender.send_udp(test) + buf = receiver.read_udp() + + # Cleanup + sender.close() + receiver.close() + + # Tests + for a, b in zip(test, buf): + self.assertEqual(a, b) + + def test_request_dref(self): + # Init + dref_array = [] + + # Setup + sender = xplaneConnect.XPlaneConnect(49064, "127.0.0.1", 49009) + dref_array.append("sim/cockpit/switches/gear_handle_status") + dref_array.append("cockpit2/switches/panel_brightness_ratio") + + # Execution + result = sender.request_dref(dref_array) + + # Cleanup + sender.close() + receiver.close() + + # Tests + self.assertEqual(2, len(result)) + self.assertEqual(1, len(result[0])) + self.assertEqual(4, len(result[1])) + + def test_send_dref(self): + # Init + dref_array = [] + + # Setup + sender = xplaneConnect.XPlaneConnect(49066, "127.0.0.1", 49009) + receiver = xplaneConnect.XPlaneConnect(49008, "127.0.0.1", 49009) + dref_array.append("sim/cockpit/switches/gear_handle_status") + + # Execution + sender.send_dref(dref_array[0]) + result = receiver.request_dref(dref_array) + + # Cleanup + sender.close() + receiver.close() + + # Tests + self.assertEqual(1, len(result)) + self.assertEqual(1, len(result[0])) + self.assertEqual(0.0, result[0][0]) + +if __name__ == '__main__': + unittest.main() \ No newline at end of file diff --git a/TestScripts/Python Tests/Tests.pyproj b/TestScripts/Python Tests/Tests.pyproj new file mode 100644 index 0000000..d084785 --- /dev/null +++ b/TestScripts/Python Tests/Tests.pyproj @@ -0,0 +1,46 @@ + + + + Debug + 2.0 + 6931ebb2-4e01-4c5a-86b6-668c0e75051b + . + Tests.py + + + . + . + Tests + Tests + {2af0f10d-7135-4994-9156-5d01c9c11b7e} + 2.7 + + + true + false + + + true + false + + + + + + + + + 10.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Python Tools\Microsoft.PythonTools.targets + + + + + + + + + + \ No newline at end of file From 18aa9fa251403afcdf895246e10963b4fb1e9589 Mon Sep 17 00:00:00 2001 From: jwatkins42 Date: Tue, 9 Dec 2014 19:10:09 -0800 Subject: [PATCH 14/81] Fixed several bugs based on test results --- Python/src/xplaneConnect.py | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/Python/src/xplaneConnect.py b/Python/src/xplaneConnect.py index 6f10e65..e6d0532 100644 --- a/Python/src/xplaneConnect.py +++ b/Python/src/xplaneConnect.py @@ -9,7 +9,7 @@ class XPlaneConnect: '''Creates a new XPlaneConnect interface, and binds a UDP socket based on the specified parameters.''' # Setup server port - server = (socket.INADDR_ANY, socket.htons(port)) + self.server = ("0.0.0.0", port) # Setup XPlane IP and port if xp_ip == 'localhost' or xp_ip is None: @@ -22,11 +22,11 @@ class XPlaneConnect: # Create and bind socket # TODO: Raise a friendly error if socket creation/binding fails self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) - self.socket.bind(server) + self.socket.bind(self.server) # Set timeout timeout_us = 500 - self.socket.settimeout(timeout_ms / 1000000) + self.socket.settimeout(timeout_us / 1000000) def __del__(self): self.close() @@ -40,16 +40,19 @@ class XPlaneConnect: def send_udp(self, msg): '''Sends a message over the underlying UDP socket.''' msg_len = len(msg) - msg[4] = msg_len + msg = list(msg) + msg[4] = chr(msg_len) + msg = "".join(msg) # Preconditions if(msg_len <= 0): # Require message length greater than 0. raise RuntimeError("send_udp: message length must be psoitive >0") + on = 1 # Code - self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # TODO: Why? + self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, on) - self.socket.send(msg) + self.socket.sendto(msg, 0, (self.xp_ip, self.xp_port)) def read_udp(self, recv_addr = None): if recv_addr is None: @@ -172,7 +175,7 @@ class XPlaneConnect: self.send_udp(msg) # DREF Manipulation - def read_dref(self, resultArray): + def read_dref(self): buf = self.read_udp() if buf[0] != 0: return self.parse_dref(buf) @@ -203,15 +206,15 @@ class XPlaneConnect: self.send_udp(msg) - def request_dref(self, dref_array, resultArray): + def request_dref(self, dref_array): '''Requests drefs and reads the response.''' self.send_request(dref_array) for i in range(80): - size = self.read_dref(resultArray) - if size != -1: - return size + result = self.read_dref() + if siresultze is not None: + return result - return -1 + return None def parse_getd(self, msg, dref_array, dref_sizes): len_list = struct.unpack_from("B", msg, 5) From 2a874eb514df800fe6d10556dbe1ab1277ce3370 Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Sun, 26 Apr 2015 09:31:44 -0700 Subject: [PATCH 15/81] Refactored Python client to match other clients. --- Python/src/xplaneConnect.py | 430 ++++++++++++++++++++---------------- Python/xplaneConnect.pyproj | 8 +- Python/xplaneConnect.sln | 2 +- 3 files changed, 241 insertions(+), 199 deletions(-) diff --git a/Python/src/xplaneConnect.py b/Python/src/xplaneConnect.py index e6d0532..6ecfacc 100644 --- a/Python/src/xplaneConnect.py +++ b/Python/src/xplaneConnect.py @@ -5,259 +5,301 @@ class XPlaneConnect: '''XPlaneConnect (XPC) facilitates communication to and from the XPCPlugin.''' # Basic Functions - def __init__(self, port, xp_ip = 'localhost', xp_port = 49009): - '''Creates a new XPlaneConnect interface, and binds a UDP socket based on the specified parameters.''' + def __init__(self, xpHost = 'localhost', xpPort = 49009, port = 0, timeout = 100): + '''Sets up a new connection to an X-Plane Connect plugin running in X-Plane. + + Args: + xpHost: The hostname of the machine running X-Plane. + xpPort: The port on which the XPC plugin is listening. Usually 49007. + port: The port which will be used to send and receive data. + timeout: The period (in milliseconds) after which read attempts will fail. + ''' - # Setup server port - self.server = ("0.0.0.0", port) + # Validate parameters + xpIP = None + try: + xpIP = socket.gethostbyname(xpHost) + except: + raise ValueError("Unable to resolve xpHost.") + + if xpPort < 0 or xpPort > 65535: + raise ValueError("The specified X-Plane port is not a valid port number.") + if port < 0 or port > 65535: + raise ValueError("The specified port is not a valid port number.") + if timeout < 0: + raise ValueError("timeout must be non-negative.") # Setup XPlane IP and port - if xp_ip == 'localhost' or xp_ip is None: - self.xp_ip = '127.0.0.1' - else: - self.xp_ip = xp_ip + self.xpDst = (socket.inet_pton(socket.AF_INET, xpIP), xpPort) - self.xp_port = xp_port - - # Create and bind socket - # TODO: Raise a friendly error if socket creation/binding fails + # Create and bind socket + clientAddr = (socket.INADDR_ANY, port) self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) - self.socket.bind(self.server) - - # Set timeout - timeout_us = 500 - self.socket.settimeout(timeout_us / 1000000) + self.socket.bind(clientAddr) + self.socket.settimeout(timeout / 1000) def __del__(self): self.close() def close(self): - '''Closes the underlying UDP socket''' + '''Closes the specified connection and releases resources associated with it.''' if self.socket is not None: self.socket.close() self.socket = None - def send_udp(self, msg): + def sendUDP(self, buffer): '''Sends a message over the underlying UDP socket.''' - msg_len = len(msg) - msg = list(msg) - msg[4] = chr(msg_len) - msg = "".join(msg) - # Preconditions - if(msg_len <= 0): # Require message length greater than 0. - raise RuntimeError("send_udp: message length must be psoitive >0") + if(len(buffer) == 0): + raise ValueError("sendUDP: buffer is empty.") - on = 1 - # Code - self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, on) + self.socket.sendto(buffer, 0, self.xpDst) - self.socket.sendto(msg, 0, (self.xp_ip, self.xp_port)) - - def read_udp(self, recv_addr = None): - if recv_addr is None: - recv_addr = (self.xp_ip, self.xp_port) - - return self.socket.recv(5000) # TODO: Validate that this matches the behavior of the C version + def readUDP(self): + '''Reads a message from the underlying UDP socket.''' + return self.socket.recv(16384) # Configuration - def set_conn(self, rec_port): - msg = struct.pack("!4sH", ("CONN", rec_port)) - self.send_udp(msg) + def setCONN(self, port): + '''Sets the port on which the client sends and receives data. + + Args: + port: The new port to use. + ''' + #Validate parameters + if port < 0 or port > 65535: + raise ValueError("The specified port is not a valid port number.") - def pause_sim(self, pause): - '''Pauses or unpauses the X-Plane simulation''' + buffer = struct.pack("<4sxH", ("CONN", port)) + self.sendUDP(buffer) + + def pauseSim(self, pause): + '''Pauses or un-pauses the physics simulation engine in X-Plane. + + Args: + pause: True to pause the simulation; False to resume. + ''' pause_val = 0 if pause: pause_val = 1 - msg = struct.pack("4sBB", ("SIMU", pause_val, 0)) - self.send_udp(msg) + buffer = struct.pack("<4sxB", ("SIMU", pause_val)) + self.sendUDP(buffer) - # UDP Data - def parse_data(self, msg): - total_cols = ((len(data) - 5) / 36) - data = [] - - # Input Validation - for i in range(total_cols): - data.append([]) - data[i].append(struct.unpack_from("f", msg, 5 + 36*i)) - for j in range(1, 9): - data[i].append(struct.unpack_from("f", msg, 5 + 4*j + 36*i)) + # X-Plane UDP Data + def readDATA(self): + '''Reads X-Plane data. - return data - - def read_data(self): - buf = self.read_udp() - if buf[0] != 0: - return self.parse_data(buf) - else: + Returns: A 2 dimensional array containing 0 or more rows of data. Each array + in the result will have 9 elements, the first of which is the row number which + that array represents data for, and the rest of which are the data elements in + that row. + ''' + buffer = self.readUDP(); + if len(buffer) < 6: return None + rows = (len(buffer) - 5) / 36 + data = [] + for i in range(rows): + data.append(struct.unpack_from("9f", buffer, 5 + 36*i)) + return data - def send_data(self, dataRef): - '''Sends X-Plane data over the underlying UDP socket.''' - msg = struct.pack("4s", "DATA") - for row in dataRef: - struct.pack_into("!I", msg, len(msg), row[0]) - for i in range(8): - struct.pack_into("!f", msg, len(msg), row[1][i]) - self.send_udp(msg) + def sendDATA(self, data): + '''Sends X-Plane data over the underlying UDP socket. + + Args: + data: An array of values representing data rows to be set. Each array in `data` + should have 9 elements, the first of which is a row number in the range (0-134), + and the rest of which are the values to set for that data row. + ''' + if len(data) > 134: + raise ValueError("Too many rows in data.") + + buffer = struct.pack("4sx", "DATA") + for row in data: + if len(row) != 9: + raise ValueError("Row does not contain exactly 9 values. <" + str(row) + ">") + struct.pack_into(" 7: + raise ValueError("Must have between 0 and 7 items in values.") + if ac < 0 or ac > 20: + raise ValueError("Aircraft number must be between 0 and 20.") - # Header and Aircraft num - msg = struct.pack("!4sB", ("POSI", ac_num)) - # States + # Pack message + buffer = struct.pack("<4sxB", ("POSI", ac)) for i in range(7): - val = -998.5 # TODO: Why? + val = -998 if i < len(values): val = values[i] - struct.pack_into("!f", msg, len(msg), val) + struct.pack_into(" 6: + raise ValueError("Must have between 0 and 6 items in values.") + if ac < 0 or ac > 20: + raise ValueError("Aircraft number must be between 0 and 20.") - # Header - msg = struct.pack("!4s", "CTRL") - - # States + # Pack message + buffer = struct.pack("<4sx", "CTRL") for i in range(6): - val = -998.5 # TODO: Why? + val = -998 if i < len(values): val = values[i] - struct.pack_into("!f", msg, len(msg), val) + struct.pack_into(" 255: + raise ValueError("dref must be a non-empty string less than 256 characters.") + if values == None: + raise ValueError("values must be a scalar or sequence of floats.") + + # Pack message + fmt = "" + buffer = None + if hasattr(values, "__len__"): + if len(values) > 255: + raise ValueError("values must have less than 256 items.") + fmt = "<4sxB" + len(dref) + "sB" + len(values) + "f" + buffer = struct.pack(fmt, ("DREF", len(dref), dref, len(values), values)) else: - return None + fmt = "<4sxB" + len(dref) + "sBf" + buffer = struct.pack(fmt, ("DREF", len(dref), dref, 1, values)) - def parse_dref(self, msg): - len_dref = struct.unpack_from("B", msg, 5) - dref = struct.unpack_from(str(len_dref) + "B", msg, 6) - len_val = struct.unpack_from("B", msg, 6 + len_dref) - values = struct.unpack_from(str(len_val) + "f", msg, 7 + len_dref) - return dref, values + # Send + self.sendUDP(buffer) - def send_dref(self, data_ref, values): - '''Sends X-Plane dref over the underlying UDP socket.''' - msg_len = 7 + len(data_ref) + len(values) * 4 - - # Header - msg = struct.pack("4s", "DREF") + def getDREF(self, dref): + '''Gets the value of an X-Plane dataref. + + Args: + dref: The name of the dataref to get. - # DRef - struct.pack_into("B", msg, len(msg), len(data_ref)) - struct.pack_into(str(len(data_ref)) + "B", msg, len(msg), data_ref) # TODO: Verify byte order (should be network order?) + Returns: A sequence of data representing the values of the requested dataref. + ''' + return getDREFS([dref])[0] - # Values - struct.pack_into("B", msg, len(msg), len(values)) - struct.pack_into(str(len(values)) + "f", msg, len(msg), values) # TODO: Verify byte order (should be network order?) + def getDREFs(self, drefs): + '''Gets the value of one or more X-Plane datarefs. - self.send_udp(msg) + Args: + drefs: The names of the datarefs to get. - def request_dref(self, dref_array): - '''Requests drefs and reads the response.''' - self.send_request(dref_array) - for i in range(80): - result = self.read_dref() - if siresultze is not None: - return result + Returns: A multidimensional sequence of data representing the values of the requested + datarefs. + ''' + # Send request + buffer = struct.pack("<4sxB" ("GETD", len(drefs))) + for dref in drefs: + struct.pack_into(" 3: + raise ValueError("Invalid operation specified.") + if len(points) % 3 != 0: + raise ValueError("Invalid points. Points should be divisible by 3.") + if len(points) / 3 > 255: + raise ValueError("Too many points. You can only send 255 points at a time.") + + buffer = struct.pack("<4sxBB" + len(points) + "f", ("WYPT", op, len(points), points)) + self.sendUDP(buffer) diff --git a/Python/xplaneConnect.pyproj b/Python/xplaneConnect.pyproj index 3e9e65f..83e08b4 100644 --- a/Python/xplaneConnect.pyproj +++ b/Python/xplaneConnect.pyproj @@ -5,13 +5,13 @@ 2.0 3c7a940d-17c8-4e91-882f-9bc8b1d2f54b . - src/xplaneConnect.py + src/XPlaneConnect.py . . - xplaneConnect - xplaneConnect + XPlaneConnect + XPlaneConnect {2af0f10d-7135-4994-9156-5d01c9c11b7e} 2.7 @@ -24,7 +24,7 @@ false - + diff --git a/Python/xplaneConnect.sln b/Python/xplaneConnect.sln index cc45d45..862da8d 100644 --- a/Python/xplaneConnect.sln +++ b/Python/xplaneConnect.sln @@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2013 VisualStudioVersion = 12.0.31101.0 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{888888A0-9F3D-457C-B088-3A5042F75D52}") = "xplaneConnect", "xplaneConnect.pyproj", "{3C7A940D-17C8-4E91-882F-9BC8B1D2F54B}" +Project("{888888A0-9F3D-457C-B088-3A5042F75D52}") = "XPlaneConnect", "XPlaneConnect.pyproj", "{3C7A940D-17C8-4E91-882F-9BC8B1D2F54B}" EndProject Project("{888888A0-9F3D-457C-B088-3A5042F75D52}") = "Tests", "..\TestScripts\Python Tests\Tests.pyproj", "{6931EBB2-4E01-4C5A-86B6-668C0E75051B}" EndProject From 31095b716b6780b1264594f144bcc2563bd5cd51 Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Mon, 27 Apr 2015 15:34:33 -0700 Subject: [PATCH 16/81] Updated Python client unit tests. --- Python/xplaneConnect.pyproj | 4 +-- TestScripts/Python Tests/Tests.py | 42 ++++++++++----------------- TestScripts/Python Tests/Tests.pyproj | 4 +-- 3 files changed, 20 insertions(+), 30 deletions(-) diff --git a/Python/xplaneConnect.pyproj b/Python/xplaneConnect.pyproj index 83e08b4..bc9ff8a 100644 --- a/Python/xplaneConnect.pyproj +++ b/Python/xplaneConnect.pyproj @@ -12,7 +12,7 @@ . XPlaneConnect XPlaneConnect - {2af0f10d-7135-4994-9156-5d01c9c11b7e} + {9a7a9026-48c1-4688-9d5d-e5699d47d074} 2.7 @@ -30,7 +30,7 @@ - + 10.0 diff --git a/TestScripts/Python Tests/Tests.py b/TestScripts/Python Tests/Tests.py index 412c890..46ac11d 100644 --- a/TestScripts/Python Tests/Tests.py +++ b/TestScripts/Python Tests/Tests.py @@ -8,14 +8,14 @@ class XPCTests(unittest.TestCase): """Tests the functionality of the XPlaneConnect class.""" def test_init(self): - xpc = xplaneConnect.XPlaneConnect(49062, "127.0.0.1", 49009) + xpc = xplaneConnect.XPlaneConnect() self.assertTrue(True) def test_close(self): - xpc = xplaneConnect.XPlaneConnect(49063, "127.0.0.1", 49009) + xpc = xplaneConnect.XPlaneConnect("127.0.0.1", 49009, 49063) xpc.close() self.assertIsNone(xpc.socket) - xpc = xplaneConnect.XPlaneConnect(49063, "127.0.0.1", 49009) + xpc = xplaneConnect.XPlaneConnect("127.0.0.1", 49009, 49063) self.assertTrue(True) def test_send_read(self): @@ -23,12 +23,12 @@ class XPCTests(unittest.TestCase): test = "\x00\x01\x02\x03\x05" # Setup - sender = xplaneConnect.XPlaneConnect(49064, "127.0.0.1", 49063) - receiver = xplaneConnect.XPlaneConnect(49063, "127.0.0.1", 49009) + sender = xplaneConnect.XPlaneConnect("127.0.0.1", 49063, 49064) + receiver = xplaneConnect.XPlaneConnect("127.0.0.1", 49009, 49063) # Execution - sender.send_udp(test) - buf = receiver.read_udp() + sender.sendUDP(test) + buf = receiver.readUDP() # Cleanup sender.close() @@ -39,20 +39,15 @@ class XPCTests(unittest.TestCase): self.assertEqual(a, b) def test_request_dref(self): - # Init - dref_array = [] - # Setup - sender = xplaneConnect.XPlaneConnect(49064, "127.0.0.1", 49009) - dref_array.append("sim/cockpit/switches/gear_handle_status") - dref_array.append("cockpit2/switches/panel_brightness_ratio") + xpc = xplaneConnect.XPlaneConnect() + drefs = ["sim/cockpit/switches/gear_handle_status", "cockpit2/switches/panel_brightness_ratio"] # Execution - result = sender.request_dref(dref_array) + result = xpc.getDREFs(drefs) # Cleanup - sender.close() - receiver.close() + xpc.close() # Tests self.assertEqual(2, len(result)) @@ -60,21 +55,16 @@ class XPCTests(unittest.TestCase): self.assertEqual(4, len(result[1])) def test_send_dref(self): - # Init - dref_array = [] - # Setup - sender = xplaneConnect.XPlaneConnect(49066, "127.0.0.1", 49009) - receiver = xplaneConnect.XPlaneConnect(49008, "127.0.0.1", 49009) - dref_array.append("sim/cockpit/switches/gear_handle_status") + xpc = xplaneConnect.XPlaneConnect() + dref = "sim/cockpit/switches/gear_handle_status" # Execution - sender.send_dref(dref_array[0]) - result = receiver.request_dref(dref_array) + sender.sendDREF(dref_array) + result = receiver.getDREF(dref_array) # Cleanup - sender.close() - receiver.close() + xpc.close(); # Tests self.assertEqual(1, len(result)) diff --git a/TestScripts/Python Tests/Tests.pyproj b/TestScripts/Python Tests/Tests.pyproj index d084785..d39f8ab 100644 --- a/TestScripts/Python Tests/Tests.pyproj +++ b/TestScripts/Python Tests/Tests.pyproj @@ -12,7 +12,7 @@ . Tests Tests - {2af0f10d-7135-4994-9156-5d01c9c11b7e} + {9a7a9026-48c1-4688-9d5d-e5699d47d074} 2.7 @@ -27,7 +27,7 @@ - + 10.0 From 685d121edde05fdbdc78e41564f440e6ac748876 Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Tue, 28 Apr 2015 11:54:48 -0700 Subject: [PATCH 17/81] Fixed several bugs found by unit tests. --- .gitignore | 1 + Python/src/xplaneConnect.py | 29 ++++++----- TestScripts/Python Tests/Tests.py | 83 +++++++++++++++++++++++++++---- 3 files changed, 89 insertions(+), 24 deletions(-) diff --git a/.gitignore b/.gitignore index e1c7a44..2575f4c 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ *.exe *.o *.so +*.pyc # Logs and databases # ###################### diff --git a/Python/src/xplaneConnect.py b/Python/src/xplaneConnect.py index 6ecfacc..696f063 100644 --- a/Python/src/xplaneConnect.py +++ b/Python/src/xplaneConnect.py @@ -30,13 +30,14 @@ class XPlaneConnect: raise ValueError("timeout must be non-negative.") # Setup XPlane IP and port - self.xpDst = (socket.inet_pton(socket.AF_INET, xpIP), xpPort) + self.xpDst = (xpIP, xpPort) # Create and bind socket - clientAddr = (socket.INADDR_ANY, port) + clientAddr = ("0.0.0.0", port) self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) self.socket.bind(clientAddr) - self.socket.settimeout(timeout / 1000) + timeout /= 1000.0 + self.socket.settimeout(timeout) def __del__(self): self.close() @@ -212,11 +213,11 @@ class XPlaneConnect: if hasattr(values, "__len__"): if len(values) > 255: raise ValueError("values must have less than 256 items.") - fmt = "<4sxB" + len(dref) + "sB" + len(values) + "f" - buffer = struct.pack(fmt, ("DREF", len(dref), dref, len(values), values)) + fmt = "<4sxB{0:d}sB{1:d}f".format(len(dref), len(values)) + buffer = struct.pack(fmt, "DREF", len(dref), dref, len(values), values) else: - fmt = "<4sxB" + len(dref) + "sBf" - buffer = struct.pack(fmt, ("DREF", len(dref), dref, 1, values)) + fmt = "<4sxB{0:d}sBf".format(len(dref)) + buffer = struct.pack(fmt, "DREF", len(dref), dref, 1, values) # Send self.sendUDP(buffer) @@ -229,7 +230,7 @@ class XPlaneConnect: Returns: A sequence of data representing the values of the requested dataref. ''' - return getDREFS([dref])[0] + return self.getDREFs([dref])[0] def getDREFs(self, drefs): '''Gets the value of one or more X-Plane datarefs. @@ -241,20 +242,22 @@ class XPlaneConnect: datarefs. ''' # Send request - buffer = struct.pack("<4sxB" ("GETD", len(drefs))) + buffer = struct.pack("<4sxB", "GETD", len(drefs)) for dref in drefs: - struct.pack_into(" Date: Fri, 1 May 2015 13:50:48 -0700 Subject: [PATCH 18/81] Finished implementing unit tests and fixed bugs found. --- Python/src/xplaneConnect.py | 30 ++-- TestScripts/Python Tests/Tests.py | 258 ++++++++++++++++++++++++------ 2 files changed, 229 insertions(+), 59 deletions(-) diff --git a/Python/src/xplaneConnect.py b/Python/src/xplaneConnect.py index 696f063..69ab40b 100644 --- a/Python/src/xplaneConnect.py +++ b/Python/src/xplaneConnect.py @@ -1,8 +1,9 @@ import socket import struct -class XPlaneConnect: +class XPlaneConnect(object): '''XPlaneConnect (XPC) facilitates communication to and from the XPCPlugin.''' + socket = None # Basic Functions def __init__(self, xpHost = 'localhost', xpPort = 49009, port = 0, timeout = 100): @@ -71,7 +72,7 @@ class XPlaneConnect: if port < 0 or port > 65535: raise ValueError("The specified port is not a valid port number.") - buffer = struct.pack("<4sxH", ("CONN", port)) + buffer = struct.pack("<4sxH", "CONN", port) self.sendUDP(buffer) def pauseSim(self, pause): @@ -84,7 +85,7 @@ class XPlaneConnect: if pause: pause_val = 1 - buffer = struct.pack("<4sxB", ("SIMU", pause_val)) + buffer = struct.pack("<4sxB", "SIMU", pause_val) self.sendUDP(buffer) # X-Plane UDP Data @@ -116,11 +117,11 @@ class XPlaneConnect: if len(data) > 134: raise ValueError("Too many rows in data.") - buffer = struct.pack("4sx", "DATA") + buffer = struct.pack("<4sxB", "DATA", len(data)) for row in data: if len(row) != 9: raise ValueError("Row does not contain exactly 9 values. <" + str(row) + ">") - struct.pack_into(" 255: raise ValueError("Too many points. You can only send 255 points at a time.") - buffer = struct.pack("<4sxBB" + len(points) + "f", ("WYPT", op, len(points), points)) + if op == 3: + buffer = struct.pack("<4sxBB", "WYPT", 3, 0) + else: + buffer = struct.pack("<4sxBB" + str(len(points)) + "f", "WYPT", op, len(points), *points) self.sendUDP(buffer) diff --git a/TestScripts/Python Tests/Tests.py b/TestScripts/Python Tests/Tests.py index ba36066..a3ea597 100644 --- a/TestScripts/Python Tests/Tests.py +++ b/TestScripts/Python Tests/Tests.py @@ -1,65 +1,66 @@ import random import unittest import imp +import time -xplaneConnect = imp.load_source('xplaneConnect', '../../Python/src/xplaneConnect.py') +xpc = imp.load_source('xplaneConnect', '../../Python/src/xplaneConnect.py') class XPCTests(unittest.TestCase): """Tests the functionality of the XPlaneConnect class.""" def test_init(self): try: - xpc = xplaneConnect.XPlaneConnect() + client = xpc.XPlaneConnect() except: self.fail("Default constructor failed.") try: - xpc = xplaneConnect.XPlaneConnect("I'm not a real host") + client = xpc.XPlaneConnect("I'm not a real host") self.fail("Failed to catch invalid XP host.") except ValueError: pass try: - xpc = xplaneConnect.XPlaneConnect("127.0.0.1", 90001) + client = xpc.XPlaneConnect("127.0.0.1", 90001) self.fail("Failed to catch invalid XP port.") except ValueError: pass try: - xpc = xplaneConnect.XPlaneConnect("127.0.0.1", -1) + client = xpc.XPlaneConnect("127.0.0.1", -1) self.fail("Failed to catch invalid XP port.") except ValueError: pass try: - xpc = xplaneConnect.XPlaneConnect("127.0.0.1", 49009, 90001) + client = xpc.XPlaneConnect("127.0.0.1", 49009, 90001) self.fail("Failed to catch invalid local port.") except ValueError: pass try: - xpc = xplaneConnect.XPlaneConnect("127.0.0.1", 49009, -1) + client = xpc.XPlaneConnect("127.0.0.1", 49009, -1) self.fail("Failed to catch invalid XP port.") except ValueError: pass try: - xpc = xplaneConnect.XPlaneConnect("127.0.0.1", 49009, 0, -1) + client = xpc.XPlaneConnect("127.0.0.1", 49009, 0, -1) self.fail("Failed to catch invalid timeout.") except ValueError: pass def test_close(self): - xpc = xplaneConnect.XPlaneConnect("127.0.0.1", 49009, 49063) - xpc.close() - self.assertIsNone(xpc.socket) - xpc = xplaneConnect.XPlaneConnect("127.0.0.1", 49009, 49063) + client = xpc.XPlaneConnect("127.0.0.1", 49009, 49063) + client.close() + self.assertIsNone(client.socket) + client = xpc.XPlaneConnect("127.0.0.1", 49009, 49063) def test_send_read(self): # Init test = "\x00\x01\x02\x03\x05" # Setup - sender = xplaneConnect.XPlaneConnect("127.0.0.1", 49063, 49064) - receiver = xplaneConnect.XPlaneConnect("127.0.0.1", 49009, 49063) + sender = xpc.XPlaneConnect("127.0.0.1", 49063, 49064) + receiver = xpc.XPlaneConnect("127.0.0.1", 49009, 49063) # Execution sender.sendUDP(test) @@ -75,15 +76,15 @@ class XPCTests(unittest.TestCase): def test_getDREFs(self): # Setup - xpc = xplaneConnect.XPlaneConnect() + client = xpc.XPlaneConnect() drefs = ["sim/cockpit/switches/gear_handle_status",\ "sim/cockpit2/switches/panel_brightness_ratio"] # Execution - result = xpc.getDREFs(drefs) + result = client.getDREFs(drefs) # Cleanup - xpc.close() + client.close() # Tests self.assertEqual(2, len(result)) @@ -91,46 +92,207 @@ class XPCTests(unittest.TestCase): self.assertEqual(4, len(result[1])) def test_sendDREF(self): - # Setup - xpc = xplaneConnect.XPlaneConnect() dref = "sim/cockpit/switches/gear_handle_status" + value = None + def do_test(): + # Setup + client = xpc.XPlaneConnect() - # Execution - xpc.sendDREF(dref, 0.0) - result = xpc.getDREF(dref) + # Execute + client.sendDREF(dref, value) + result = client.getDREF(dref) - # Cleanup - xpc.close() + # Cleanup + client.close() - # Tests - self.assertEqual(1, len(result)) - self.assertEqual(0.0, result[0]) - - def test_pauseSim(self): - # Setup - xpc = xplaneConnect.XPlaneConnect() - dref = "sim/operation/override/override_planepath" - - # Execution 1 - xpc.pauseSim(True) - result = xpc.getDREF(dref) - - # Cleanup 1 - xpc.close() + # Tests + self.assertEqual(1, len(result)) + self.assertEqual(value, result[0]) # Test 1 - self.assertAlmostEqual(1.0, result[0]) + value = 1 + do_test() - # Execution 2 - xpc = xplaneConnect.XPlaneConnect() - xpc.pauseSim(False) - result = xpc.getDREF(dref) + # Test 2 + value = 0 + do_test() + + def test_sendDATA(self): + # Setup + dref = "sim/aircraft/parts/acf_gear_deploy" + data = [[ 14, 1, 0, -998, -998, -998, -998, -998, -998 ]] + client = xpc.XPlaneConnect() + + # Execute + client.sendDATA(data) + result = client.getDREF(dref) + + # Cleanup + client.close() + + #Tests + self.assertEqual(result[0], data[0][1]) + + def test_pauseSim(self): + dref = "sim/operation/override/override_planepath" + value = None + expected = None + def do_test(): + # Setup + client = xpc.XPlaneConnect() + + # Execute + client.pauseSim(value) + result = client.getDREF(dref) + + # Cleanup + client.close() + + # Test + self.assertAlmostEqual(expected, result[0]) + + # Test 1 + value = True + expected = 1.0 + do_test() + + # Test 2 + value = False + expected = 0.0 + do_test() + + + def test_sendCTRL(self): + # Setup + drefs = ["sim/cockpit2/controls/yoke_pitch_ratio",\ + "sim/cockpit2/controls/yoke_roll_ratio",\ + "sim/cockpit2/controls/yoke_heading_ratio",\ + "sim/flightmodel/engine/ENGN_thro",\ + "sim/cockpit/switches/gear_handle_status",\ + "sim/flightmodel/controls/flaprqst"] + ctrl = [] + + def do_test(): + client = xpc.XPlaneConnect() + + # Execute + client.sendCTRL(ctrl) + result = client.getDREFs(drefs) + + # Cleanup + client.close() + + # Tests + self.assertEqual(6, len(result)) + for i in range(6): + self.assertAlmostEqual(ctrl[i], result[i][0], 4) + + # Test 1 + ctrl = [ -1.0, -1.0, -1.0, 0.0, 1.0, 1.0 ] + do_test() + + # Test 2 + ctrl = [ 1.0, 1.0, 1.0, 0.0, 1.0, 0.5 ] + do_test() + + # Test 2 + ctrl = [ 0.0, 0.0, 0.0, 0.8, 1.0, 0.0 ] + do_test() + + def test_sendPOSI(self): + # Setup + drefs = ["sim/flightmodel/position/latitude",\ + "sim/flightmodel/position/longitude",\ + "sim/flightmodel/position/elevation",\ + "sim/flightmodel/position/theta",\ + "sim/flightmodel/position/phi",\ + "sim/flightmodel/position/psi",\ + "sim/cockpit/switches/gear_handle_status"] + posi = None + def do_test(): + client = xpc.XPlaneConnect() + + # Execute + client.pauseSim(True) + client.sendPOSI(posi) + result = client.getDREFs(drefs) + client.pauseSim(False) + + # Cleanup + client.close() + + # Tests + self.assertEqual(7, len(result)) + for i in range(7): + self.assertAlmostEqual(posi[i], result[i][0], 4) + + # Test 1 + posi = [ 37.524, -122.06899, 2500, 5, 7, 11, 1 ] + do_test() + + # Test 2 + posi = [ 38, -121.0, 2000, -10, 0, 0, 0 ] + do_test() + + def test_sendTEXT(self): + # Setup + client = xpc.XPlaneConnect() + x = 200 + y = 700 + msg = "Python sendTEXT test message." + + # Execution + client.sendTEXT(msg, x, y) + # NOTE: Manually verify that msg appears on the screen in X-Plane + + # Cleanup + client.close() + + def test_sendWYPT(self): + # Setup + client = xpc.XPlaneConnect() + points = [\ + 37.5245, -122.06899, 2500,\ + 37.455397, -122.050037, 2500,\ + 37.469567, -122.051411, 2500,\ + 37.479376, -122.060509, 2300,\ + 37.482237, -122.076130, 2100,\ + 37.474881, -122.087288, 1900,\ + 37.467660, -122.079391, 1700,\ + 37.466298, -122.090549, 1500,\ + 37.362562, -122.039223, 1000,\ + 37.361448, -122.034416, 1000,\ + 37.361994, -122.026348, 1000,\ + 37.365541, -122.022572, 1000,\ + 37.373727, -122.024803, 1000,\ + 37.403869, -122.041283, 50,\ + 37.418544, -122.049222, 6] + + # Execution + client.sendPOSI([37.5245, -122.06899, 2500]) + client.sendWYPT(3, []) + client.sendWYPT(1, points) + # NOTE: Manually verify that points appear on the screen in X-Plane + + # Cleanup + client.close() + + def test_setCONN(self): + # Setup + dref = "sim/cockpit/switches/gear_handle_status"; + client = xpc.XPlaneConnect() + + # Execute + client.setCONN(49055) + result = client.getDREF(dref) + + # Cleanup + client.close() + + # Test + self.assertEqual(1, len(result)) - # Cleanup 2 - xpc.close() - # Tests - self.assertEqual(0.0, result[0]) if __name__ == '__main__': unittest.main() \ No newline at end of file From 472ed4feacff64cbb1ef833c3f7c60db6ebfb021 Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Fri, 1 May 2015 14:20:44 -0700 Subject: [PATCH 19/81] Added check to beginning of C example to ensure that the client is connected to X-Plane. --- C/xpcExample/xpcExample/src/main.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/C/xpcExample/xpcExample/src/main.cpp b/C/xpcExample/xpcExample/src/main.cpp index 17b2a81..5792368 100644 --- a/C/xpcExample/xpcExample/src/main.cpp +++ b/C/xpcExample/xpcExample/src/main.cpp @@ -23,6 +23,13 @@ int main() // Open Socket const char* IP = "127.0.0.1"; //IP Address of computer running X-Plane XPCSocket sock = openUDP(IP); + float tVal[1]; + int tSize; + if (getDREF(sock, "sim/test/test_float", tVal, &tSize) < 0) + { + printf("Error establishing connecting. Unable to read data from X-Plane."); + return EXIT_FAILURE; + } // Set Location/Orientation (sendPOSI) // Set Up Position Array From d2282c76951e885175c6bf08ffd42cb52ff6feb3 Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Fri, 1 May 2015 14:26:12 -0700 Subject: [PATCH 20/81] Added check to MATLAB example to ensure connection to X-Plane. --- MATLAB/Example/Example.m | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/MATLAB/Example/Example.m b/MATLAB/Example/Example.m index 9803791..f25e848 100644 --- a/MATLAB/Example/Example.m +++ b/MATLAB/Example/Example.m @@ -11,6 +11,10 @@ import XPlaneConnect.* disp('xplaneconnect Example Script-'); disp('Setting up Simulation'); Socket = openUDP(49005); + +%% Ensure connected +getDREFs('sim/test/test_float') + %% Set position of the player aircraft disp('Setting position'); pauseSim(1); From 200eadd1e93d0391710d0c34afa9be166c287d02 Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Fri, 1 May 2015 14:28:33 -0700 Subject: [PATCH 21/81] Updated Java example. - Removed setCONN, since very few users should need it in the future. - Added test at the beginning of the example to ensure that the client is connected to X-Plane. --- Java/Examples/BasicOperation/src/Main.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Java/Examples/BasicOperation/src/Main.java b/Java/Examples/BasicOperation/src/Main.java index 1ab5bcc..dc82c9f 100644 --- a/Java/Examples/BasicOperation/src/Main.java +++ b/Java/Examples/BasicOperation/src/Main.java @@ -21,8 +21,8 @@ public class Main System.out.println("Setting up simulation..."); try(XPlaneConnect xpc = new XPlaneConnect()) { - System.out.println("Setting inbound port"); - xpc.setCONN(49055); + // Ensure connection established. + xpc.getDREF("sim/test/test_float"); System.out.println("Setting player aircraft position"); float[] posi = new float[] {37.524F, -122.06899F, 2500, 0, 0, 0, 1}; From 1ee3f85b233257b35ac3bd24594e6bdd8cd08d80 Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Fri, 1 May 2015 14:48:33 -0700 Subject: [PATCH 22/81] Added "switch" functionality to plugin SIMU message handler. --- xpcPlugin/MessageHandlers.cpp | 49 +++++++++++++++++++++++++---------- 1 file changed, 36 insertions(+), 13 deletions(-) diff --git a/xpcPlugin/MessageHandlers.cpp b/xpcPlugin/MessageHandlers.cpp index 7629aca..d284d4b 100644 --- a/xpcPlugin/MessageHandlers.cpp +++ b/xpcPlugin/MessageHandlers.cpp @@ -496,28 +496,51 @@ namespace XPC void MessageHandlers::HandleSimu(Message& msg) { // Update log -#if LOG_VERBOSITY > 0 +#if LOG_VERBOSITY > 1 Log::FormatLine("[SIMU] Message Received (Conn %i)", connection.id); #endif - const unsigned char* buffer = msg.GetBuffer(); - - // Set DREF - int value[20]; - for (int i = 0; i < 20; ++i) + char v = msg.GetBuffer()[5]; + if (v < 0 || v > 2) { - value[i] = buffer[5]; +#if LOG_VERBOSITY > 0 + Log::FormatLine("[SIMU] ERROR: Invalid argument: %i", v); + return; +#endif } - DataManager::Set(DREF::Pause, value, 20); - -#if LOG_VERBOSITY > 2 - if (buffer[5] == 0) + + int value[20]; + if (v == 2) { - Log::FormatLine("[SIMU] Simulation Resumed (Conn %i)", connection.id); + DataManager::GetIntArray(DREF::Pause, value, 20); + for (int i = 0; i < 20; ++i) + { + value[i] = value[i] ? 0 : 1; + } } else { - Log::FormatLine("[SIMU] Simulation Paused (Conn %i)", connection.id); + for (int i = 0; i < 20; ++i) + { + value[i] = v; + } + } + + // Set DREF + DataManager::Set(DREF::Pause, value, 20); + +#if LOG_VERBOSITY > 2 + switch (v) + { + case 0: + Log::WriteLine("[SIMU] Simulation Resumed"); + break; + case 1: + Log::WriteLine("[SIMU] Simulation Paused"); + break; + case 2: + Log::WriteLine("[SIMU] Simulation switched."); + break; } #endif } From 0b984c3d4967d656b056657d72b46078098e3346 Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Fri, 1 May 2015 14:55:36 -0700 Subject: [PATCH 23/81] Updated C client to support "switch" argument in SIMU command. --- C/src/xplaneConnect.c | 10 +++++++- TestScripts/C Tests/main.c | 49 ++++++++++++++++++++++---------------- 2 files changed, 37 insertions(+), 22 deletions(-) diff --git a/C/src/xplaneConnect.c b/C/src/xplaneConnect.c index 48c29dc..89b063c 100755 --- a/C/src/xplaneConnect.c +++ b/C/src/xplaneConnect.c @@ -264,9 +264,17 @@ int setCONN(XPCSocket* sock, unsigned short port) int pauseSim(XPCSocket sock, char pause) { + // Validte input + if (pause < 0 || pause > 2) + { + printError("pauseSim", "Invalid argument: %i", pause); + return; + } + // Setup command char buffer[6] = "SIMU"; - buffer[5] = pause == 0 ? 0 : 1; + buffer[5] = pause; + // Send command if (sendUDP(sock, buffer, 6) < 0) { diff --git a/TestScripts/C Tests/main.c b/TestScripts/C Tests/main.c index 4a92c3e..83a23c8 100644 --- a/TestScripts/C Tests/main.c +++ b/TestScripts/C Tests/main.c @@ -833,56 +833,63 @@ int sendWYPTTest() int pauseTest() // pauseSim test { - // Initialize + // Setup // Note: Always run this test to the end so that the sim ends up unpaused in the // case where commands are working but reading results isn't. int result = 0; - char* drefs[100] = - { - "sim/operation/override/override_planepath" - }; - float* data[100]; - int sizes[100]; + char* dref = "sim/operation/override/override_planepath"; + int size = 20; + float data[20]; XPCSocket sock = openUDP(IP); - // Setup - for (int i = 0; i < 100; i++) - { - data[i] = (float*)malloc(40 * sizeof(float)); - sizes[i] = 40; - } - // Execute - pauseSim(sock, 1); - result = getDREF(sock, drefs[0], data[0], sizes); + pauseSim(sock, 0); + result = getDREF(sock, dref, data, &size); // Test if (result < 0) { result = -1; } - if (data[0][0] != 1) + else if (data[0] != 0) { result = -2; - } + } if (result == 0) { // Execute 2 - pauseSim(sock, 0); - result = getDREF(sock, drefs[0], data[0], sizes); + pauseSim(sock, 2); + result = getDREF(sock, dref, data, &size); // Test 2 if (result < 0) { result = -3; } - if (data[0][0] != 0) + else if (data[0] != 1) { result = -4; } } + if (result == 0) + { + // Execute 3 + pauseSim(sock, 0); + result = getDREF(sock, dref, data, &size); + + // Test 2 + if (result < 0) + { + result = -5; + } + else if (data[0] != 0) + { + result = -6; + } + } + // Close closeUDP(sock); From f88d319191c35791965a67e285c69c1671fd7595 Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Fri, 1 May 2015 15:07:42 -0700 Subject: [PATCH 24/81] Updated Java client to support "switch" argument in SIMU command. --- Java/src/XPlaneConnect.java | 20 +++++++++++++++++ TestScripts/Java Tests/XPlaneConnectTest.java | 22 +++++++++++++++++-- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/Java/src/XPlaneConnect.java b/Java/src/XPlaneConnect.java index faa2204..f673074 100644 --- a/Java/src/XPlaneConnect.java +++ b/Java/src/XPlaneConnect.java @@ -214,6 +214,26 @@ public class XPlaneConnect implements AutoCloseable sendUDP(msg); } + /** + * Pauses, unpauses, or switches the pause state of X-Plane. + * + * @param pause {@code 1} to pause the simulator, {@code 0} to unpause, or {@code 2} to switch. + * @throws IllegalArgumentException If the values of {@code pause} is not a valid command. + * @throws IOException If the command cannot be sent. + */ + public void pauseSim(int pause) throws IOException + { + if(pause < 0 || pause > 2) + { + throw new IllegalArgumentException("pause must be a value in the range [0, 2]."); + } + + // S I M U LEN VAL + byte[] msg = {0x53, 0x49, 0x4D, 0x55, 0x00, 0x00}; + msg[5] = (byte)pause; + sendUDP(msg); + } + /** * Requests a single dref value from X-Plane. * diff --git a/TestScripts/Java Tests/XPlaneConnectTest.java b/TestScripts/Java Tests/XPlaneConnectTest.java index aed0883..9223f3d 100644 --- a/TestScripts/Java Tests/XPlaneConnectTest.java +++ b/TestScripts/Java Tests/XPlaneConnectTest.java @@ -208,12 +208,30 @@ public class XPlaneConnectTest { xpc.pauseSim(true); float[] result = xpc.getDREF(dref); - //assertEquals(1, result.length); //TODO: Why is this result 20 elements long in Java? (It's only one in MATLAB) + assertEquals(20, result.length); assertEquals(1, result[0], 1e-4); xpc.pauseSim(false); result = xpc.getDREF(dref); - //assertEquals(1, result.length); + assertEquals(20, result.length); + assertEquals(0, result[0], 1e-4); + } + } + + @Test + public void testPauseSim_Switch() throws IOException + { + String dref = "sim/operation/override/override_planepath"; + try(XPlaneConnect xpc = new XPlaneConnect()) + { + xpc.pauseSim(true); + float[] result = xpc.getDREF(dref); + assertEquals(20, result.length); + assertEquals(1, result[0], 1e-4); + + xpc.pauseSim(2); + result = xpc.getDREF(dref); + assertEquals(20, result.length); assertEquals(0, result[0], 1e-4); } } From dcdd63d0c3ee13bf787b5854fd5460ac8a39d8e9 Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Fri, 1 May 2015 15:08:31 -0700 Subject: [PATCH 25/81] Updated MATLAB client to support "switch" argument in SIMU command. --- MATLAB/+XPlaneConnect/pauseSim.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MATLAB/+XPlaneConnect/pauseSim.m b/MATLAB/+XPlaneConnect/pauseSim.m index c15f809..da44b71 100644 --- a/MATLAB/+XPlaneConnect/pauseSim.m +++ b/MATLAB/+XPlaneConnect/pauseSim.m @@ -29,7 +29,7 @@ if ~exist('socket', 'var') end %% Validate input -pause = logical(pause); +pause = int32(pause); %% Send command socket.pauseSim(pause); From 35abb41e8e578c96d9e34e4507abb47585770b89 Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Fri, 1 May 2015 15:13:27 -0700 Subject: [PATCH 26/81] Updated Python client to support "switch" argument in SIMU command. --- Python/src/xplaneConnect.py | 8 ++++---- TestScripts/Python Tests/Tests.py | 10 ++++++++++ 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/Python/src/xplaneConnect.py b/Python/src/xplaneConnect.py index 69ab40b..9a38c82 100644 --- a/Python/src/xplaneConnect.py +++ b/Python/src/xplaneConnect.py @@ -81,11 +81,11 @@ class XPlaneConnect(object): Args: pause: True to pause the simulation; False to resume. ''' - pause_val = 0 - if pause: - pause_val = 1 + pause = int(pause) + if pause < 0 or pause > 2: + raise ValueError("Invalid argument for pause command.") - buffer = struct.pack("<4sxB", "SIMU", pause_val) + buffer = struct.pack("<4sxB", "SIMU", pause) self.sendUDP(buffer) # X-Plane UDP Data diff --git a/TestScripts/Python Tests/Tests.py b/TestScripts/Python Tests/Tests.py index a3ea597..78c6e32 100644 --- a/TestScripts/Python Tests/Tests.py +++ b/TestScripts/Python Tests/Tests.py @@ -161,6 +161,16 @@ class XPCTests(unittest.TestCase): expected = 0.0 do_test() + # Test 3 + value = 1 + expected = 1.0 + do_test() + + # Test 4 + value = 2 + expected = 0.0 + do_test() + def test_sendCTRL(self): # Setup From c44f521842c1f35a81708aab334bcd8870f618f2 Mon Sep 17 00:00:00 2001 From: Chris Teubert Date: Mon, 4 May 2015 10:30:10 -0700 Subject: [PATCH 27/81] pauseSim should be returning int on error --- C/src/xplaneConnect.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/C/src/xplaneConnect.c b/C/src/xplaneConnect.c index 89b063c..b3fc4e4 100755 --- a/C/src/xplaneConnect.c +++ b/C/src/xplaneConnect.c @@ -268,7 +268,7 @@ int pauseSim(XPCSocket sock, char pause) if (pause < 0 || pause > 2) { printError("pauseSim", "Invalid argument: %i", pause); - return; + return -2; } // Setup command From 63b9ac25d7ad5afcdfc6568c793517ba9feadfdd Mon Sep 17 00:00:00 2001 From: Chris Teubert Date: Mon, 4 May 2015 10:30:21 -0700 Subject: [PATCH 28/81] Mac binary --- xpcPlugin/XPlaneConnect/mac.xpl | Bin 148220 -> 145188 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/xpcPlugin/XPlaneConnect/mac.xpl b/xpcPlugin/XPlaneConnect/mac.xpl index 639ff2b770ca30e869e1b58302bc7ab48d5c134b..1e806491ba1d4afa761633c9b3561b2d36be98cb 100755 GIT binary patch literal 145188 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 z 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 WtVUT|WIPsu_{czzDg5({!2sv literal 148220 zcmeFa34ByVwm;rY(h!hvJ8VWp2^ugcOQJ-H5KNnNxR-Q8lr1Qm1{fS!V$uyLi@{Dy zu9sGHP;o&Smw|C~CNl%PfDpP_(g`AlMF^k}90w~lN&pQ(kp6v7)$L9P&^Pn{{NMZk z-|xwXbXA>m>eQ)I+o|<_`s25k+87MRD1*TegFiF=a^Z0sjPMx@*Ws_KmBBD+(kN@* zC=P1*V-|E_pdJQKg9(4clm1PbF-_i;}*j^Wk!a8e#xI(`C zB1hq)vwjoi-!i`|whF}4w+J^B*2!D)25{1(-{j{{nmR9kYJp>tKrZLE>^nhNr7MlXEz08xe$H8QADuO2(xbDc%?9pret8Wd zf{iK~{)NIKbmi})NmHj!npXJm%&7u*Ilnb$1w6N#a4D>_zLFUrRFCIDA(JL$Sw>kR zNJ90uK!=6G$s$bknD~-Q|4anTtQnJvo|yT_>=}~^ z9EDfNm!!)>?UMdcI5MBa?=g-MKa(cSc=(t24b=H1>r5yd$&d0mvjxAIv#C%YbxfM( zoRxoteA7FL3KEi!!jb&iM(`rHO7G z*FMtWuEl@*>_FWOqn8X!1dP{-HtjG7v@^6vI8Ub){SxKQXy`xki6Y0;nf+~#K2rE_ z;S>F{smafsUHDj0{}BaKXAQOWq})lt-fxefz2`bT=A`a@;K^>4Jm2mL#X z3j5D^^bz{Yzy0=pDgCBA0WYT?7)c-X$1CVX(e=Aej{-c#S^QDCCyz23n&9@qFc=gqI#E`wwX!F@_(ROuJ*g#d*avHXQY-E5MyVtNQy80PVYy8WvcZ@Rky{45 zG}bHiwt8jHLi}|ZfoK&p1(H=CI|p=Ql+n>z)*dnkqU7K zjFny6lOM8-w@kE5ny`(v0*=b2u?<(&Q(Rg83H4yk;g&HY74;It|Hq%WzOF?IOrq4( zZL<4_BS}_|v7R7?E`LHs5VWahkof68@W4Zsi4*ESfuB6vE~^EK8bmFKJ0DpKCX^G$ z(L9A?tQs+G9;X-O`wqD4C5}vmOF9;ms1P=_5s5AU`OoDv9=K5YBjv>>YaukUR^oN^ zk$Sr`g2ABF+mp+kmnL&(WdV1l7E8TnE|YpYS4q7Wmf2L#K!9zkI~k6wdXl*FQUZ6@ z#S>0TPsbcw(b}M5*Fkry-{<-{@&RyY`QtkH2l2RqB8i8fC7L_LEArV)0Z6RQEQFMwI zElX=NVcRm|FL=5t2pKiE1JwtrGU~CEy@41w8?hQ@U`OA%f}gg8CqhYD{dyV#rgN6H zC0tPL6*G7X3f`BDrru=n$rWv=BrnREsj?B=H6%(3y)phrsysy*Hg(+^u0+!ubU3m{ zjz_VrAc)JGA**g)W}Xkr2;z6If&)oGx0xf<@7PNuwBNdlz<%o*6d6h+6I|Sro8VR5 zg4wp|vbu5}hpZG)dAc_B6dObwJf@c^eU}#{?amW1^+aR9lDH#%L$kLjB#PhNpnLti z#>9hEw1qOr<)xT5&t{^LJx)~7Q|xdYHH&rADHYGcGFI|739wn{A$1BWBzppDlCtLJ zAT5JwOHCw<>-aiXb&M(k5omvjX&@v^MpBAvQz8|a!I7SFL}yx&fH3;Ds_ zzm9^`{yN1Haq1w7gIr{SUeVU_EKqo~VA)GYClWisi!gb7Qnd8+e5$E5;H76< zM`cM%jv7IoPCFx#dlKPXl^5g<&;MiKbM)V)Hpu6WE9ybTcgh3?iG`1)ply0`O>+KT zsI_zFv(jx_&q{G6rd8)5Y<|r!&2jT}!?XoA_qb0Re{*j+=u_V?Z6}<%$+U^PYfWq6 z5@Fk6+Nhi3WOcde10C}&xt@$fTiW@;SCQvAd`J^|%4y5}3V z&*oA@rlQOi`lcXzo5MC2@LI?z*oC(!o0k%$r`NPL7_2GZ+C1-xbT=0ewP#%(9Ns;p zZdz?Hpg`Y86eK{klRCX%2TJ!C`>O!+`s+#k47BVI=rnUYwr>q*C3A^~l=2ZY%%yxC z)OPi2@X;eYO%a@kaMmK3(Np``JT96)I=Ibsq3wdt$W-vGqf}X;M6Ky8rTQsvx5pF+ zlFaG1Cn~`mwm~22nWRiePY*^@srQ?Zbb96k)@*5skHknHN~P|065O-74xC6~UBFxq zvd4v{2*viiiN;gBAkk!yN){l>2I$L>as(QxqL}&hnWzGNay*VcMjGWyh+JAfD$x|& zCaw1nO{34~Y%lMrw|U&v2nIUHnx}^1YVKM%7@0oCXrdm)$oVD0L#6eD`w*+KV3p~y zr5nL7E76p;ZNUrmKcf4V(?^ULsmz^)DodGie?TzL<_sz~WW+`VBZ6$rIpWVzEG8_O z;&CLl1~>^Z*uItM#MZAPe@0`aQ7Sow?n2hqB?BO9FAaoKe}X{i_l>V;0bhO}mtDi$Pm5x_VCHtRjMrJ_v~l)+vQx1}JJ z3PirdheAESRDo1KiA=<-@pY0h^=l%5Y7RD|DKa}K&{aCRycwNK=yHL6T}Qu4Xiw@J z5$QeC9D^6dGa|-QdW_!)bQb!!LV=l~W9-cl3n(c&M{iExL&kUP0UAm@Jjnk1J=ZOv z>b+c_W5(rjEn_Y#)+J7BCO zjgC7(M+S8Ujx3oc zX*w66lnpTJYa};~WH9Z?*rn;)1YzF8bgB0c2JS53a(i$23L3G3^>(UhKad)^jY9@j zL~uF5X{w+c8_ znUHY2z==K-i5KM}ili5wZZB(|$zT_n5d7yQ%I*OVYJ#)40I7F=2bK}Vm?Pwhr(%4R z{ID6^aM=p{EDQe&%|tDH4&ypGP*EEd^(R`(pf+{W$ zHQ2Ptth@~H%v-Yh#N=qUJ}3oyxvMDwQ*UQy zV>h15k}9fXjh1E_ZR&Y;iTWD1*LgjODPvNhcwo6$G>0j{wcEr-iZs0}1|FNrFsmFG zQJ1ma6Sy8fJk2g32}FsImmPeGA_PbgeSqNXqw*Lj_Y6?%Mxy=@#mzdwN8mW_`q?)0 z6qhSI3A4qFQs<{g2$G**MPO09upHX{8`MPxx=owMhH5hg$Bgg{7@VVJ4TgrTWl-qg zkV4TPkun>Z0g=fMMc&OI$~Vh@UXdA~6^i71WRJbZviP4=l$f`DYH|IPAggC&DQl0e z*D|}>!2U?x6qI@$pE+=)4vvOSqq$CllpONG*1}^`>!8!5pVO%iBq5!aGZ&A5S;je5 z3oqxc>-0^8Sv65}oo<1Tbh??lel{D$e7R0hYtHhOBC5cRECHmV0=GdAlqIdd#nQOl z=tx$y);4W=xca7|`YuRKvT6A-Hf_F{SK%Ld6~0y0a?F9gKSS@CZ&dc2)X7c5Jfm)b z4SartC%PZXs9&gz^3g2T@QSZ4EEnZPm46kpp>NX5%!Tfc-9_P_sr*ZU6J^HvQf;RO zAZzwDXauWl#^Y32G+N?V2QR322rVlA;MORo*1Vj?iX^?PJv=nCyS(oEsqXtpDs~-6 zsGKO|Wk+752xn>4GZ_eCt{2leVA#z>{Aa5A@$gYGb>*&~(HTN2CVjQX6oYmyRzI$R zGaait#Z>e7B1ong%M<6m;Xy1imVpHnYdOr0-gUAxd>b_|d)ld@EYzZu zAQpZd{VmV7QMBR7%Anx`on55$4OAJ_bHUu{=+SIa*4aQi*>k^9QO6{g(iBJu`t4~y zIk(u=Q?hGenZYqm)~w~Wv^qtyZC844*Q~ox5t%imk*1gKBU_MrgQLH!WhTpmGLeL= zMIkp?>USauManuFh=r<*vYL~u*>{yv#+Bf9=N8+bg*8R;<(wcdYAu-M2zdp+2xeSf zSse*^IVZm@ZDEb`BZ%ph{TZ~Xg92>2tO-lqvxHt*$_ps(>+uuPGA~)N#C49XMzxpy znR&!T%bdI>#&I`Hqz;$_IyyqETsbO7Mn>{vZDel1jA^0bv2~!V`X1qn(oPSBxCR>yof- z!gW{6o(z$0l(p<+SsRllr)@35ggrY?R=3L9oFu3+&=J`s0y78_0Fc#6mdMo^TDyd5 z%%mE)nDmp2UJOm=3%+_8UQf(b)C0UL3)QIDt8SUz=c6D})E$ytM3-%?R?Nl0vMHyNJ zOFQa3Z8Ne;2tsSC%@$oa*JzMq{s}Z+ul$)7YyFzy(}JSjV&8a*_;(wqj-Rpb=xwXJ}s%u{=mB&ODX^cI1m^`P?@cky8_OIanr#ZQ_i0>f=MHV;4;H$Rxl#5@2?- z0E2V^21N)khy-}3S%5(#z@R)&-cV0$)v!G^UTEr^UW7)JZ$u@0xo;__(Q5%~& zCeNa8E8&6wMy0J<8A8j1Ws{{oL?nJ4M)#2JX!V+od;6% zCqoN#ce?IQ)?MBu1D~shW!=rt-GREBth-6No1nY#x~unJL-qa(GeIh#CB<;+|9~H; z&Uq~ajFC#P_5+J1J6^s$+gyJf6QlpH#q@JAF)PAct7*bEn_2_WlIpV|ny7;oK+qeI z>GaYvNS{(2%tcQg>b`j|Eo(zD0*t^2;G+>>C`JHZIq_^9IyuJCP1eT7%i7!oIc+zg zME!?LG{S1C_KL zj*({a#5LBJ}VI0FiF3Pi^O=28MX=HyY#r|(sU@f$5+fLE$)(2!l z?`6e6+k5}h-unc`|2EBI@chsij4^9I#@{9yf9?6-+KoTi)W?$T#!DEN^EBsv#bYlTe;1kEkx5hD68|)Jc<%1Ggu$UNw$mC_6> zQu48s&UEN&7Kdf4H7qz#4+C}m4NyDQh%;#++PXaJ+59dD)@9_wlCyav zEi{i_D!ZC)a7Jf6``GmA~7Oh@JEv@FSviDFBV* z0JvEPECb-50O0gN*_IVCGTS4LYn*MFMQpmzL$$I zir@6=I=&Z)%Hkf+L2>RpxPg9vl(@?%mZ(9ecwL}Df0#HIIE4glDC3zO&MU-ZMz9Smz^>9gp4RW*kMPU4ovg5ouU{^ew|YOL;yaU+2YA zzb+#w)fh?Jfl40$+Xr`orAM%ed#M1?&mbqnhOK$pV4(D-3m_*tBaN$~2$OX}l7&ew zA{^%?;Fi15=8);nMiWfu^d09kjw@=*KtZq;1f(=dQW|Ue^zRg;435(i6nZ5dJdx`o zd87#*1>k{BHQIHdz2xoy8>8NV;<0$L5>KHkk(OXn6E!&Y6#(V@=*6~^r^_8q71RCu!jn`!LaG8<4e;Avo#TPp`uXi7DqJK8?*jtb~71WRD zodUfSZSXPK&1cc)*vhs5bwUFoW}yZ&jdV@h?lI1n>tm_6k5HsndiFc8Baq04)UR54 z_6R^wN!?%Jyylf&^2PX^G0hDn)(?a;`pH%S0OLG)NG#O2>p#%Bm2B1v;B}&}{+r2n9zyPj8zK9rv?$VD9K>DLISnZDQqg^8UZXGhu<>eOOah~54adig>e zWcdj8wE=(KP=U#f{96rJXbh)QnFHAjlqPz7^jq_>IbMXVL|WtiktHpHMd@*LZv%sJ zeD~Jq?`NEc-DIudQ?b!?foPmi+k>jH0y3kATMnra7gmL{hD9MV1u%fBhuLcML=<9Y z7IIGwt0xa%4dn;ckUne=K6I6{PeMf7$%8TM9xw~ZEbNZOC-XW3rG{Noi?5 ziZH9R@2PV zO)x0Cv+*Qtq(K?DSz6yk1qn2EatSZvvID_jak>LA%$@IpGIbrJde!6y$6o9(!CeX$V&G~jTuHnx;dbru6_)83;xkzKmBCkZvov#BRZ zrQ{!#J)Kt~0?r6w7Szb5lgd3)-atw77<#feK*Q5>`A`x&vIdD-wbY4XfH6I`1KGOk zh%*Ep)(B}ZmqmJP@jUXIdhI5MZ|FK@G+U~<5e6HoXJ?A!N&oB_u4CJ0utEG}Z(ppZ z%)*}AOu1+4o&*{4bUX6IhTtdECg?n5DY79<@%5j;$4&7%@Gk#>^Zs7&ZrCsE@Odal za3(u^F?n50J?4@PehOs52CoFA=rmzw^CL7fkYAfrQDo9GJJ8u}Ewi-@b6?B6Ud(Ab zBILyq{vr$1L8oZ9V3ag$L~b#yXRYnDC)wGVc%Q$7W3g3qZzN&L-VH>`MvNeV7uL|( z1+rk^_mcl>eRwA^(Aj?VCv@Mf=Ew3;hwv_pw8AJB$6-k!q2sV|(44S;vHBP~iJt1& zMKLH742pXGd#MZb z434%?XLm58iF5iH7~tq_9tT%Sagdcc+luKG4oI`YCz{JroNlFy>R3d;L1~61DZWbw zm4ki#SuSP0;MYT!ax)5xc1Pe@vZKb&B;;v};bCz{>jaI9DsuS2!8M zNfu6maLmFn2&Vy~2qM%8rv?s=^Tp1kJQhQgfGn-gjg{Sd9d~MZrYx-hne%o)KT4G7 z%xGc$F=UeVS+HmPBlAw@+2C>8v+sVxLleP?E!aaUicW-%YMo{@7g7Z^7jdwemfgZL z8LIb9*Xo)|uh5<-{J^=7z6{StEO6 zCREdx9YbaVy<8WJ&bSEVJ2L>qB5(Sx5TB7e>&*wcDQlq`JYue%Z>qmoUur_Ls3Wz` z*^7lRYaJhxoeeZ5JCB3u4lqT9Gf=)k$)1=4bb66cQ>-e}Lm9HRnWC~XBGLWJ$d9uT`ca8x(BB&7grJS4DGkUW zUm$u6zDmURn?}P&|7d~8O8!byIyunKU2rkz|Ky;AtgEmTGyo8Imtos@1r~^Iq@Zf* z07taYWuf!sD34|A07dkqljVe=x&9QzO+5{#(R3KUM(j+|1&_Wc0g%ljyeHKMhpj-~ z(EO=B&zWY?vIk-rtOf{0%TA)bRHVIu$W_z(1a(zr@EP4o1hA=aOFV}Eo7ez4MpHfrj5f)d{un&yd}hEw(tm_%(TE|-?{{O6n1crT?2QKCN>?u9B?E10_A(UI zs}xk-FTkmE{~o`{*?Vi?V#}<8Qejh(Dt1&$Z!{BcoG%eEW7|;@OYLkv*Gkqztk?;0RSQCk&JH zQ{NIMbs%J8cS04y{<e3m(|qfF+udq*v}>4UB5No_qQH0w(xuN=!2?+d+=7 zO70=61g$H=Dk1Y@;c*xu?Z{U|KB$vAj&jzQIG};Q1DCDGPw0RX^&%7Mhk%ptZG>id z&%*B$aUD{o*~!Pjfb@5oHp#?I5^Cwxwcbj;45l1tx>5=H1(=_+&^VZ_M*}*gDn~3blCoDh zhrI6zMA>@O(}@bcoE}|;l%DM(OF|;~e;1AX?Gp#$ZRq zIi$o3vY?;H<|mX?%bL^cAgmb(h_Khu@7Xr@w03rtgOwnoaq?8)2G$-*<4V$QfS4#L zoNFWlgburWE)Fk6><6^04H)U5i1Rirnd$)T>|huf0oi#Sh$z$kywrL$mucy2WDs>s zlqoMwCqPu1`?yPoagZ*rAYqFFLu-+R@9n6 zl)VR*B!{3c!9eGeHSC+zI)AWv=9sa8f}IfU{usOaE1ZH58b3`Xx7U`o)p5Imoe<~( zB)LCB5|iVP_9KJnyl+4y;mhY07D$`IgRj(`szY--7VVi@uC%^u<5qs2V+^K`bIbvp z=lF(-*LX(meJ0|@U}#4`QTO0(nc_O1Fc%W+hQ~bj*5-bt{w-8{05j(H05$^NBRaDC zsh^G!&8|&JV~XZTtFq&#CdbpQgDvGBO8KLG2L@ukIkr-f{!$AK*i!0bU!cF7vW)+;2Bt z#M&1Qr`WX_X|;CgFEztGiAl20+u4TQN#C~4vT>iy_>Eo5N^7zix5~b)w`1wgW~^6& z)r#vl(%K{Ye1Q4NGoVM=c-U_A+ps;2`4PAUP^WAfc5p^y*o`{^H({$jLsp$NcFm}` zd>M8+A+=Xgx8Z6e?z#X|rD#vEVV>w)Wn|i}J>Fn5o`o1)<&7b^W$7=6W#cwDJ8edv zqCJkZoL)t}s8YyegEX^NR5^n-Plr5xMLP_1Lv>$TP@lp$}vcQjY`Q&uvjNtMKPld^>JvmJ9s9 z!6J#Aaz-}pu^A7MS|A|0iW(VxoZEHL$`#TGo(@n&dkkB^yr@n~f1{cD7)H-RDpSz-DXUA-Q}+#Agp1q(NY0Sl@d-AW$H!uhgdf$8*WYc_?7Wh?`=bJfZK*NG?zVM zVK?-se&BU8oJB@Qr6|y|>EcVL_-IynRrW{w+O3?6Z#=Y11Z|ZP>oIX|^GC zcGNSdx51`O8N%$wU9zWrvQi$Blvjx;X_%*T9I7-{89zo-x`DUoI&2sXLG3-G)?dfN4Zvo4Luk_+&WX#{Va&V;+wMR#K-F|-X>0=aE_Y(% zd@jy&VYtCQB4&)ycO_$(z7$p1jPdM5|7UuTm z!gOFl7Ne+klwndJ8yPk$sukdJlPPr5)(V!eh(o2 z7g#y!u@!7>YM&Yds@Q8TyqKPf2` z%f##iwu<<-P;jr8ud3iCq2Tk@lCK=s%fU}&Y4fLxPkSMQ%V*)UD|ugCz{FhnV3-CA z=)PLWT7;8Z^rS(k?bc&b$mg?{+4p+yD$`QA>Rd(R=^WWJ7>neT{j+Q{xGLHZMQx4E zONWWArm#9OCIz-t2iYI(J3&n z?t~?{h8Lhrb2(>Opbw?uZ_U~9l+r0Be>Pu(sDGRq49HN(BIanAgxt=j$saW-IxQ)y z6PDqxoF?XCvbVzEY%Sk1dQG6Mo)}nYIB`ZR^f(AvLir>{uE8}1+`Z+Q#w!zA6wMcL z-2_$ZX#J}M_T*rSV6UNFL9<=`N!jzQrTA+cyFZG~jBfOrttFVKe&gU%Mw~b=trC;S z`hW@McOp8Foz9VH6@#GJ7k?>&+tdXGR`R{IEz1upjQdM0K?f3r+5$Ke zZ->g-^EosgpHN3bHxrgg?scF-yOA%m1NAezMP_yrDMcHkj|VilrwY;r=cr2_MokN? zV$kX4voveN33?n2o^NKs$y89s*aVQFPr{`R=U05$Bh)VWiY~t*fhSjR5d?b`NNGY% zXx;QM!wwS;3@wVm0;E{taCW04t`#d4Je61VRL;Q_7fnKQ+la-F%Og$EBW>l8&au64 zLsE&AVDwI*ku}+XF8xhVv>aLOo@r)`qz0N}X6kdyOg_iVjDrbJgYCIVROyDoqRCF8 zL6>e{y>*&~#q5|+6W~Wa&7szdna~v@?~Po@AnObFUmAG_^CbRPj=Zlzx2N0?OC!N6}7mT@>Qrya!H_(K!P;0^v8AXl{mo@SfQh_8x2Y z?$W(})0f;whaS@RouJK|)U|-%k+Xlkjy4z{;6y8v1Z_5GVPFWtB0)HY_Fh$Yh9Hy$;mwhR!*q`P1c7_9Ae=4;FHMf%*h3Ij ziNjSmwhYNvmI}hdk%UcSxr`(EaWeNRLAXW`u8$=AR1glqiCDD2ytp?vLKu;2#;bI4wuZKF;t}Q6$^?|LE(#}_zyv`N>Hp36z@h- zyd)^Rf}%=LEQzEj5)^fUf(eS>MpE1_DCkTe3NnT}srE>U{(>SwP$UV8k|Hpg=XSE7peH9#-y3PD57pFaK~XFyN(IHCNQ%{hVwIp+BPcdSQn&?$S5Q<5 zink&u@&!empkRXH=|~ETprC^;qz~?-PK~7KE+`TNMUtS9BPo6w#dDh>C}cr#dnCmX zK`~iSOcxYE8ks}-*uW{K7UL*GDRgxv61P&|RspvLxFeCc#R7-zPt&ST4g4Rxo@Vcp z&EDVWUcYG}_Z8nu2LYT_sKB`Z$e!gl#-Mrep63L6=qyy?+LnMDCSLS?&N}p5xA0pV zsW)@#F1Npeo@)&R_-GXfaCTx7kI$|F2r=uh`Bvwwhd90TgyHSf>@|eES~^{2qg?MM z=f-_6BW3LN+KG=Ry*=o}ae=!8U^VumLH#*VgRB>z)Fsogk{Q^`rk=XRRKk<~I7r!T zXK*%_B$c`slcK`%J~R@6u)Ki;Oh0f}*AXA;kO_q;+yIc#9o|zkbi9WEE5{F?F=5`f z_+$<7#Pp9pFxfkNz{*3VF7QzETEBHa&CD<{H1iy#H%#Uyf8K^rVx{%3I3BbXQ4Q04K3vJN{|#j|Z8EVs#%x@!g$ zx2}RiZ#RB##O3&f`*9d)RRzwV;KCEqvy}5h-$Wd@_lYj3W(TPQ^Q2Pujo)8=!Tg;C2Fh3f;#?sG`BZ^}u~gU7#mb61aVY zgI00APqbBuSFMDw_SmDjLLGFzE&l+Nf|azC>IwB<>+n#n7oS{)k_~5k``h7+OG&0) zPosg;Aw(U7ik6jV#tKUrD(M<3LRzQ7S{)XWRO<>9F&5~ELZbiyIW{`6 zq7BkwOCUJb-Ad~a5S&!&vPdqa;8KjpSY8rb5U>NNb75V;fELbLS)~8ijdOrB2EaQi zu_JpYq%@ompGW!;9Nc`E&^**{D8xrm@kkBoJ6)Q%_o;M?wjdE3)QuYxAQO(*`bJO% zavWcD3(ut|wKdc)%tAUdfm^dEv!J_L%JT7&E2Ck=lUfA_bu1MJgvzOOc*!jnxR(U( zI>G^kl9S{?c5yJ1ilDjZ{ybbSI@HKY>qRuXCVIjvqa-N3Wc>+xNeJl$8n)wHhprch z+QiS_v!0Mn_0i4mC#dcW7ZP+561;+KFfIZ5qJ-wIhUkKsIx4- zv;-n9=niJ>1he*n*{~3^`Y%9$vY-nb6<>5jF@I*q#*mxBS(R=h980CU6`WC(?kEaT z!y1=@1Iee)N_{#XJhH|REmLHYEjYHkc`3_|AMH_*jtS1=E-e~cRO(ltxG&8 za9^#9nJCqzU1GRf(uHE;XlY`w+W7%>>XyeE6J3=iS(DAABxnmKFEUV1v#7GRPt?U_ zjVO}{btTcH+>`nhrf(?B>3Bek7p5pMaUz-&rB85J&?btj`DoJOlMD(#o8pS>S@0Gq zlK1E}HqT6RNSil6o12gb(y95 z^hW3x&FHz6Aa{8$;N4-{qfKde`IPPz`q;gSFL;Z^=(nbwTZEIe>Aw{zm5P*JL`qim z5|zPxUIyY-RH=Rg{E`AlEelD4VrBimWZ~Lid4Wbrebs z7@VKYNOZ2oi(=@#Fug=JPr-poyYOs^MgX-pRRAw@D__ z?S5HZSB1()kA7*U*f+snLpMu1d7EnhuL$B847(rkaeo3~)WJP)aE)Rw99*N=2PYd3 zkyX&ML+mE#7pt)-8Vd4?zC_4eDr9~b4|4KWQ~wq8ZCQLVOgBl;y)Nj|h>qHR{U%pnwT{Eo!t1MuO2GMHK$&Xa(fh9Oie6RFQah2$Lth^Gp`XDpx#Z^V%NVxYHf>ts)k>aBGpG0Pc)ur$=>T0W0Y-G=!p6gCuBxkYb(BQN@l} z?e)v_3GpNKxmLbXpYfoP)qT7-*<3|A(M&gSK3uJqEyO!Zn~LG=Lz34L^jj7OgQS<| zk3uh5v~%#?Mp8QlHii`3-bII9O(u1#^xQTO;E>`0Ja|iL9=JzxGk{X6Q36uQIl^wC za=~tqMLlqz*8Uy5G=vnem-PWxt0nD|Md`@)4nE0Gr8N_g?Ue5+$8HjMm^Qd>Sbpbs z=oAg2%bvA7D$9Z_czdv!C<2KiCLbbQ1M3c=Y_-ojLp_84f~TW!`QDPYUs^f~nNFz= zw*dx2XdaPtW#D!*yNt5jIx zSZ`+>HCeo!iXyVOOhfhJ;>T@sQA(I&JdJ3fIfjb29dMRR4B6H?DamSvIfX6?@Sh#V zD^PR>_8trw{c#R=^}H02*M&y?8jSilRn|P}dwCS9;aecPuc^DM?h@^>4zi28F}Y%1 zGA6sZcIi81yVZSk%Hn5bL1)qJGC^pv^m9!{T2H(9xctHH3JU@&BeZ`;T?HkaCu=u8 zw1TvYEplr^@sC{!$+9TGQV9B?LO5tv4cK!M9WJ^I1NMMjO>H=tBFN?mvT7pZ{p~9t zqXr#uxd;=NIzSDTR&Q>l)iN;dPhn%P9~U+&oLO%PD@Eu3+efT_Rr&v ztIdNGw?5bTHqH}2n@<#=w;~CQ*+-}_5nbtrSl>Vv{)m|sve1`g6Se6Y6h?!y4V00G z4NmrPR*Ra0YD4c{>eVKsj|#!;5jbF0*AUXj*GM=*AFl|qR|VMyBIEk-f(&yJGmQ5| z$R^qGmDa-s+%u_#koxxL2K4Csda~K{nG?D=8`i~Jt_#u5?v}sehFI)Ipm0OXbT&)s zQ!VHFvPx|xZ_tM$@%d0=oGsSt@tTsly(ZVkKqH423&fIW~O*T@d9Gm^Ywyl+ps$JTZu&i862dKFXGKK9j3s6<>p zzZYq~BN|3$N|Wnx2lRvC3LUFq0dBRYKOyLT2Zz6hOZGA@y40YV(M6XF*Fb*@EZlei zXe^8eIOAY8z{#cY!&lb|rUODyW9JO0@*w=BD?h_;R_W#ga4^l=@ICR#03VzW3e{9A z0`^GNeJz@JEebP2dk0ZPp}k5>1EIZPm~!xvhW1K-*HU{)&`hNE4rE-Zy;_W}(3+h` zG=WVPaaRFEFYQqI5>^)2I|Q~2 zAbNHO*mA<&Ca{A9)(em=nq#X7+g@NZ1-1qtyTH~G_PfEL#EOBy)&VqJU>RX+1oi=e zZ2*X#(V_As?B4`-w7?oLsqP}MG4QhG0{fuAngN<8u?=e zflUVJNr4?m*n0%FNMJJn!lhx7N+xVKfn6xDxd7owWy0nW_R=7p-zNojGC-dT>~zA` z3G7^fEdb~Xft^R#tpe*1*kXW=3T!E1-)(_i22cjIbu?qbKGOob3LuNXt|9F77T7X? z?i1K@!VVMI$3?ncfHDQPim-hIc9y`_0F))LwS?^;u#X9B9Y9urWrS_GhihYoz%~Fx zZ?91K5_Ye^>TwOQ3+cfXU}>X+trb|kjLZPhD=Wap6ZYj6oD%?AEwD+1ohPu5igc3! zqK}&(?m)sm*n)EgK=gPIurgr>3+w_BHy5C`0-HzJn*>%b{mB5)i#~`uov;RhT_oZb z0CbJO&LixXX`u9^FBRD0W^5^8w+rktfn5d=y?z4DD+v1sfqh9}R{=y%o&dXsu%!a~ zvcQ%BMDLscTTa;D3he6w>jh}9z*Z5~Ca`Y`Yz;tk*%EPU3ENL#`EcuZ*8!9&u#B)~ zfqhrRZ2;&lfo&q}nStQrNnazd1{kjNUJy9Pz{~av><0pC28bRD0ydto>jkz14J)^0XvYePYUc-fz1Gj-Ub6!ChT~DtrFN=fLhW0OtfFZ4iVVh z0y`O?D1n_$*aU&yFR%pwMGNda!nP9F!vb3jkV#-m3H#OENX3(0C$P%^YAvuU2wN$z zCj@pCKy3te4Pn;^>`8$w11Lsd%L)6ez@8CUFF|}sC3G8&jW(aJ5fh_>2v%tLReEgpCF^vj$$Q%@Ulpc*!~whfCSOMCi}84eu;mFk=|tTfCLkq|=q08dK>n zZblFrcc0t>qnFRwv0MBjXuy#(#-%k+>S~m&cw=xX3XJwg$E8xdZ4k5+=}~j18(p4t z6k@D1A#p>H;yxFS+gp!&V>oUxsHrm$aVf+;h>YtD$Nd(np>&TA2&Fp@)YMgoxD;Xq zk#Wa|Tne#Gk#VmL$NdR9qWqq|GnC&vP?LEg;!=neN5+i_$MxxP*M;Nef||@C z5tl+ND;$@3!gMk)WFQGT3bAfsI+SG%tY}dWCg^G0AC8*=>Yu{pK_OPxF+wlCaNHhx z+%Dm`13`T$9G61u-N?9W!*Tx!U6Ni7-4W7DGN^;$xD;a3Bjdgwj{8SF?#gi7Bv2dC z$V7fA#QH?WeJvb!rXKgLnP!PXB;Y_qN zMkg8__}0LJL^JLrcorlY*?Y-EA}(0G&8LWd_6lGYb%#!lOUWRQ!lJIM(bWI>`#JM0 zwI1{87d2SKjXPR7Zo^FhR)C1O{1Vp&FUWX7x&)+nJZ~lu@qVpXF^>}ewm-d= z_@KA`Nz{D{Zf$6T6R{4HvKKp->`NfQ`3Z2tdpr>Q5ZDK_}^o zcRON=yg!CGk3kmpTb1YiCHO;m?@jXB5j{bo4+oK9WXs7JAhhB3{s0DI@@%ZdJMDNlAI{6a}__qJ8mO4m|h06pH!B8Q#ti%p4}BG7s{1I%TTgiI;b*eZ>s=&&I8ZYio~ z^z&FbwxsQL{sT{@)&G-ht}l@n-p2SAftl~(EM)Z6ur7*JfxAu7#dzv$w~uPkU>|?r z>IEKfGS;C3pmZN;5PKBKBsG91^wQz6#G|9WqHTm}RNwt!e}6`y!;6g}v?O!^Pp=3#W=*C!yV4qVK{* zv0A$HMmk1Aj3yobHZt+PBJo=Ge)~|4!%bS^LR1PNY9Yk=;XKb)wGKj@e}>mdk!k%Y zt>!y4|AHJ}Zi!IBdpzK*Wj9|bhv#-uMuZ%XN6PW|&&m-lcTr)~E34b2ND*!pA~5zA z)gZB!e?AuI;Mg$rKfKb$Uh1W+rklJ3_P5m|qq2T;v#ZILeO z86tbqzqW@e+7gj2uWRh(+pb7guW<*%l`hE39s7*YRPKe5iKdD~>)7Agfe*DU$}H8i zw?%qZwF!mXStLns;oUA03>{~`qQ-rSqX=007B#MA%1xUivilJapri*zrcBjqBv1Lc zNcpuAu4H}qD(MX+q}63f!_n{uVd0uOqvLEPz%44^za!Nnky7;xN%c02tFS&us_$&1 ze_g8R7E*nmbXBQhe^x5}WB`qEe7_NA>@X6JTYx0RJ`K_fpc;~C;emCDgBY|GhPxA2 zH7$lAeSWJHcQ+dh+%hn?!OO2tUPlis-2rUa$mk?Sa|sDNfDF}d1UbfLMWYuQ9e^N7 zVQ}!#_t{-sj*!^j(My!aI=&e+F+ks7QiQ zfI|y1aO;TS`(PNjM;I#IMb>VBFwqVhmy@E*MwI$&SSrE<=_ZFvkPPsI*8lOO&^ot2 zCK(Y}y!~p%$4%ha=WgQI8ytB6Qv4b0>K`IIi0qBWfY!5L*Q-VLGjbs9#bTcQ+3@2K z1<(FR$bg>x#TTlfKxyf6{DQNaV(b(#UO*~b4@*J*Q56URP9z8mWn~MU+gm33@i4Gh zB3S$ge<;!H$V9nqFdGSWrUb_c>T#h2Z=eLp4hZDBk1V=gt;IGm^w9Zvb-9PzC_!J^ z$Ig>@Uq%~($pnE?_M!meAW8i_!Xi0EVi>@M zRnyppY3G+v#M+r9ic zc#97Nv~!**IpXLfReVfGiMP-MdSg2(y`DJXcX|u0=;QMmL$OytmO)udB3SEh0TXzY z{TT{~%zF~=+384PuX&OA9*L)^AI!mn1rJ6+%)t<|EQ*bTpvWNM%u)EuiI$RT@utBc z{2iA19eHx9H1>$pdjghy#06kdApWqA{or2O*N0S9IM!RkMkI>i&r8Cl2ZN(P_e3BT0FegpZ#mI<#zVLcw5^YeO~Og&u` zi(AC?C{zgDRpBouhAPRuq>mhY%eaxhwNHcOMVyaE+rsEXnY4JC&%9%tG+S{SNc_S!ANw+lEc z$~2A$s1l4b(YXw2Je!zPCqjPA)=hv>4ox18AD4;B6lX1GbvhBgC;?7vj~)b1#9>?Y z;3ga(COPcoh(-0#JQ@_^0E!#E7M{_F9yhv-B0;2aRwRk$i|uJOP1^fdL}V z4!SryXGd{KJc>W=Fka0--Hn^DACQ^Ee`b}G^a5X z*tI=lLVX3Gs1)OdqHb`&Hq5lS1QY7t#vF+Hf(iBGrIx({z3PJ-6YN>ABU7ROmIP#s z4efy-_0Q-XGtGFcCLU1KxrMdJI~|eYJJK3%9J;*mNG^0XiSG8}zykLFkFlS?39Gs+ z7Q7;C+hlP^gMD=kB@up4F~qot1konIcv^__|2!?emq?$q;b(4u4!@_E%;#y8Xb2@< zAz=KqW4v|H2{Mo@kL$85hTEbwhx3o}jLbie_e=RVkeI)m|L%JJBhw7O4FsjrLxl=n z#Iw_}e>=YNHD2*3n81H*>+vzYfzl9u-wzK-R4G01j9hdgjsbeda|+J3;%HU-M7(f= zmwwt1F`n_D2W~8o8a(v}Ztz?pf7=Fk9n`^i+y;6p!k z__j^njZ`iF>u%U@C;sKo6a6bjHxWAwO8{3<@4tG(eswo6{C98I)9q*61ma&&oia>+ z(}tY{D@D5(r9jo!#10^AM=PKQZKQ|?ZIrZ1=eN{E=$XEfqsR!onQ7A|;uXwnyn?ya z-s6m;pAE((Jx7WM4FkA8bFbpZcn(=P>-m(Fe<+Lz*n)51$KHdQ^e}aBEj?06uhu*R zsG^?66IC1#aNy}7dM!sAgBH1$9xB}$`Fz!3$3c?PHFyuouK`Pi=)myk3u+FYy~M*i zgYwLdfUIKT(?-^!al{m4#!x^-o4p&kasEEg(WbWFBa(#V5Wu+vy=Z89%zG%CHXmwkcNKg?Xor3<0KiqUFOeDLJau- z(^t!mBMRRuf*bCSLtpSpy2`6%h7T~#{_lLXYyx!jKjrO|oa-*{c=ljIag~ne|JJut z7F`Pk{1^7@-w^*6J$nIW0asD*zuL2Z(iIH<-JU(vQstj}wX6-q#N0jbk5x-(_c| z7*Xkphj{lhvQfR!i7=V4Zt*Fl(087+98773$HV5!Ou(XBTy_FTFwMZ7aaaUt{6#=I zUxOQ*iZ&-k_Kd-kiw7KSQug8@K;6(4@A`!}ii9I~#Axn9Un_PDRkTIm8+3qQch;Wd z!Gr4RF=qpspqXp|MT2a}e3z7JS}yiS?<6P|?c}s7n0NkcKC$G?LvutvGm2olu44q- z7H<@`rFiu(0pBcL=v_%{C(y)JOlRj23!2W-^-*X;+_TQXrQb|wE{a4F=Z|P=dq3_} z@W<_(_<)Q)mrVhKNIO4rp4)}v&as|wc^>|iH~Q-0AoS0_(f1J0G;iGix5XQMp)VUm zyazO9d+tQB4-0L%}R9fgF*{O;k>NqPV)nT`eKF#n~2!!t^8*y~*+Nj;Gu+*B>_6Gy4x#xhKcBlxS zTe_4Xt7i)R9HvRXl>mcvfET6s1ypZvWa9)1itRK4D8$3-vAm6~u50OMXaoI@Xu_Ko z=vYVMN({c&1qNt+@i=u6kB{`(2Bp42C5Qz}vuRugnQmB!tYL4q#|o|y{MmExA+Z9U zSSB5J@!VKKsYnlY!e34keli=_6Cl$;nY2b2+ZoJQK97vlcuIXKB|nn^q~yN27s-vS zmd5U7{Q=rS{T}PiW275-a(zW|U9L>7T?@whQR;_1ndRDarEa>(oU?o+G*{Ut{BezN=n)R z0ImLx^I~}x&n25D)bWMi@pb@+idNU}KMsG-_7DjCr|uH5XayOcfhLxDSm%wi@8|2h zp@1dhm%DqwAPAG6o?4`#^`)AV|?D-4$2R)v}UEI$gekNID%h9x!%4ezvqBtq!_M zw6rT=b*yJ3OcyQg3Ro@ssqK}SuD=3S%RY;Q>DlsK0jpyl0>=2>IW-hsbqmp{OHc2_ z{#~f6OTx%ynI!sQn`XKn1eOiO$ez8oPw{k4mKXm>A)A!Fn-)!S<#T&we>YBJU<}0iVbOIvE zdGg6`hN(+`qFq^qKAN+Y){EZ7*+;&0>xumxX&Db_@CI9ptfMrxp$oPn^#`C+Km0aN ztd|`11dS|%-u;2%(zkjl1F%PN&C=8DDMigX1iKMWCf^SecGMyKL?5Eh^x%_r80+k5 z+Y5KtvEzB!?U9C7 z3iXQqzx<&wQwxh8ojpt5kdV?ZxnIfz6x9gWgDC&<%-OSMP0e>CAQU5)=k?8<@$jsv z2(^*R;o(?R5}<}#Mq2vi<<5}R)|J^EaVI$2obP~rF}NR<{K1V|pegn)WIH4EF_mq? zo~G~IA<0(du70X7_BR^X0^l_3_h<01e3fQxAlG|Fn&`uyDfb?V7iXG>cz8Go8zQOi zaK6Vjnuzc9XxcQuBuyflW??P6l>qqcIf$5lGHkH}m4r#}4{CHNrc7L0!R}FMYyF#0 z7%`K=U*D@`3~=H%5o}18&2zTJCkK*UpqaiMM-Hg0H9=FK*Klz*y$608vN9Ti%F`B6x=w3Z{9*f2bH1YlaY42?SM3gvT{%uJG@lbK;=k|qdPwIV3giY$~5u>v9@BFnOD7g-iv#LDtRR8~>D zSe3UGZ_HYC~ z06zV`h2A*+yNSWiw||f^`_2I;!i{SCk0Fg>`yG&M0za0(51BxpCmuoGsZG&AfQN6c(C-f%jrSob0$Y=SRk6euf0etsg^Z53Ev22IQ7q2N1 zY;;h9n%loP%Dnw@`1V?8OIiLnoG^Tzp8&jN^o8v)V~<-# zX}^>9y|`WL^mp6H-f{tJ&lOv6S%nV>aftKFM|}MC^4+7o+Psf3?_NY)^<%l(Y&XbH>G3lnm)t4Pc`qE=3QalRpwo7-u%(ouIZGq zxodizdCxQN`R09wc`q>Uh34I8-iyq8iFq$G?Z_m$?o*1SJv-s{Z! zD)Xisja}0}W!~4C_j>c*VBXi8_YLNKqj_&M?_13KHuJvSyf>Nm9p-(PdEaf`_n7y+ z=6#=e-*4UznD>L`{g8P-Y~GvA`w{bg)Vv=v@5jyiTju?Qc|U31Tg>|@^M2aApE2)e z&HD%D{hWFK2yax$>)!YIv(Ux0?V5fa^bOs#-0>2I*={VuI6Jn|6rkw`G+}&oc5I;u z-+ImtbcwsV&!g!fnld!qOVcN5+CECI>ki>3?WS z(R46s|Be_PyY zrs+bO&Zg;Rnwn_(51JOzbU3<`9d$G{(^NszwKPqm=_#6yq3PE&9Y)jpG5OswiKb;V zy@_wV?jD-{NE4^cJNR?lZWM>J;|16B98HhXm0yS5{G{5!U;lRhj;4oc;t!B_+(#3C zs=DJ2nogx@BTXNoX+2G=Xj(^8il)nG`Y=ryny#U#lct+!x`3uTX= zLDSPT)zI`)nogx@J52$aUZd$KnkM0!ddDF&9Z6F;O()UBACPy?rs;PyEvD&3n$D%^ zr!?hh;_ubFKSR@#G~G_qqcnYurUz+ylqUX6zWZsKZl~#|G~GbcuW9-eO|R3$U*&fn zcrZ+TG#x`zlBSbs>Y!;BO{-{HNK-RStu!^#6rpJzO<9_%X!JB*--q4bqv=(cR<$%VrMoKf{ds4NGyUAtruUpSJ?7|_n0}w>H(X$P z?!qZfL%JuENXBD8_@Cm`XR?9nxq<4c;A|&2dtR_=-s~WVG6UH}S9d-zBYFzmW}QZY zz{*r257xGPBp=TO7N`5-*;G$Fl@CO6fowdJjpqPB&@m9mcgNv*tS6C5s_ z?@r_bok&U`noi{-iBv8Si+A*PbtO_=fkdh^o$WCJ1tJ~k-n5B*Q@o0A{5k>qGxm+)jxh9eCHtd#sW+0P{M{;o{IGr^f_b|cfOgx34r#O+6 zCvS^PSVIDKNu1#R=5s^NDZ_!xaUhgnyXK|>#(P>%Hw$z~{TcTCF zZVRMnihFZ>4eKoz zP*}?YOB+w0-a8W&yeFNHpI)E~^`qoj2Sz4lHe478wYIKkorhMsI+b3N3PfTtw8&f_ zKah!6IOkiMrH%6f(|ZF9KNhFgwvn(Z(*b12%nJj{CEBg=Xgq-y7ns5BgvF^8Zea2L z3{n9SO=>cp>Ozy5LE>DZr?NB2*4vYg#gmnALQSa*H7{-s=ex7%F#C{fA{IyWLjjH) zu%$SszO{L2^Wu4dP){a55Qs(ckpOy*)$u%<}AJ-xYnpd*g|{F- zX?7#$^0dX#v{1ARG>br|Co0e!5Vh%@@D?@sLez&#(P+@gqyssm&$O&QHYC@#Lct(H zs9vo67X}z9Wsb+@!I+6h@<=oM%8H++Mi#0Sf@hK0{6uunn#D88yXJHNJ$zpx-OJA2 z#0woTt96kl$kL(Xz$&NdLGN75H7IDd-;ryBr5Icd+3z4PkeZOzOeP(Dc0Mqx2B~7N zFtXQ{qAk(Wo3zaX15a;HaVr=^(-P^;6_c>%895+JA!%r`?Ivm3Y&V9HU=79rjI_@A zmaaYCpASTll59LyWQV%poX;+9XM|LvPUwt6;l%JwVY%cgKl>^ zmv@5IbFkQqkmEFv*3SkU%S(l_|FulqQeKjww5| z+f=>+0p!h4RS2I!q7C%)V5IOw3n`4DdF3+cR4&fpZIP2<#X@B?v1H43+SBO(_yz*m z^qO3SLmp#a@ZET08mCQRh0{upd(v5S9bm$Q1{G{g0&}a*L>}`cQ-J9DOjOMe;n{Xm=zV!8njbgv`({JROPQSSp;Zc%DJ!923^` z7^|Ecj*YQf>)gCXTQr#ySc6$7sdL>Jyea~NTYIf7f|-F1OaRlVxm?j6@k|D8cZKCtB$d?pwFIZ1I(t;KeD%D zs4Q|bFNq|w(QKqMn%F<*|`R)&7PFy3%VTwNuZIXq#|%$?_0-_1YgG;xo`J0rcx{3#XAK*^Lnxh{7c^j4JFwoGj3W>&T`g<(70l|uG= znpQ=jl4sJ1R6aLMy<`6LRHBp2n^(9qnU3U*om+D%b&la0!WmAxGm(6EX_VneB8(4} zG`^hD)^m0&mHBi&k_=~iQ=IsRX%)`Jqc%bXcRT$V${94-aGaCqc&ymnJ7uyZl1^2k zm&11nW?G0&HkXN`1N2X?T-toLH(ml+S2o?7iVf{oPa+qs?1|uODD4lYy3#myp<+kl z;S@i$k|WbZ`V*s(Q1Y9tx&izma0RCiYqO+MaZhNa#t z^IoWI5k%3oXA=49%C1OnS3IZLm(J!Y*B~pyCe`89`JD0alJo#(!_n211L@WAF!-X~ zVKX)k;hIe+QS2OvhH&ggC&B7aaCakuc~Ty{xuL@thRhe(FjRv>^;RJ_;7(Mw?4=lD z{S~K}LRye^Qn0$m|@k}y3VEmBiROaxN9PLIf8v=|iu_Ouv>jb?v zdxwk-yj|UqjjWE_$}>1=$#`czY$!&|PP0@oh|U|N+b)(5O1bOQG`v&u@J?rCBO^4! zmJwZBM|3@F_&{5RcWNEp35_Zr8QwY5ofyF}H-ckNq$@L$`=!JC8%bumZJgZFAKYBo zGvtzq3@Tn%HjeqQzxKLi*zNY|LzaHu$j(SdDvnMd+!x6v%tUkekoaN1WswmmFj*Rf zWFQ>r8q{%Cx~Yky(;F=soHU2~M~VdrY-1fVPt3GCeA#F|^o<%u->8A~4GzV>9^j8g zwX7KAD!E#a&!bo2SC*$cz&Bbxf$@9*BZixEW_%BZQAoza;c2Q%pqW(yO-%_jvrC|< zErDiE2{cH1IyHLQN2Nj9N2Nj9N2Nj9N2Nj9N2Nj9N2Lj3PBm)MMG3Gh+R;Bum32aw5hlR<^=n>bBb9BmqbaJ(w`j$w` zxoL@{1CcdY)LdR)Sf);-?7EU!)a25obzQ9MoYS-JtW%Xw4^3`Y)5lCYOeFlia!K8;2%R!?H0%~YajZvXk|H|W>;vc$=qhSPzLru-m2*9`)m!Rop+Of~MjL8!QE;ACVc581{hI08#Tm5P4z9qWWaFs)W0|Ho?4J|=go46ys%yFtO}Uj^8k)C^z?Ge zo?8RC02arS9qIlld*={?_dEiMZcJww0z(~Pa7@BrQJ9!!?*<_Jv#^26(ghuv)BbegTA ziolGl*>y)+x#wy9=bmg=Hqv9aZ;DBP z*99C&a4e3o9YUSpLjq2v&2<1g##%*}EdV^jXIy?PWV4M2IMs#&VbJkMw9iWXaojBn(UtR71V0ayL`4s?uf9iaM;8g(nb}7NZIPJ#h7?=3~0e~y$(gi>= zmLG`bkXGqoQ`9L+(y9Tb3F6>Rf6jP+?3u1K%Rf23xBk+7D+e0 z%|n{$!UIpvHvoPH-MHKcf9diwy8H*gNzng?;B^3c{cD2bah8lHAdO2H00MuU|E9}2 z0FoJ(&jHZ4H|X*maWUciNL-GfGf$>5cZ|z490;T3aeVPtVkfH0`QpMK4>~vx)A1gHCt#SZE`NeyIUb`H!I{~*61vlj7lN>A z6#(+ji9;{D5HDu9Q7}W9@Q;Rp;r}0=GDxB`U@AEx01Th^qm?}foryIr+hB0R=RH~s ze?D|)HePP{tlA8}33^#0UPFbi>0d#jFM;}4JRJnzgn{9=6HLZyrn=MsGyxdJ>cQ|o z1KqhAFE@PNw8ikh0KM!cyat7T$67SiW5S?01y9c1sPaXnvD zG)%?Ao50F$gW*j)Mk&uJmV?=26b)=psQ1CDvrztF?3-8rZ@mlFB;g~ zFUI36#Iu?PDwo!j25o3K1WyOS0z3@LD3>-M77h(eG0V#|mu?!UT-u@nW(RW>ozKD3 zOaqmny%L5GOmv(-F_}AIz^_7_Zxc+w>m-{pkH7zp-pD8#NSkLwUI2Iy%tpC!m@5_z z4a|r0X|V*)2WX&jX@eHyCn+$H_5xZgz;h-IR4(oA_&X?nU4K7lef9XuLCh!`m@HFV z48P7;4Tr+*L0WtiucemKO<@1}1R>QC7gs1Z(lIZ4FY*ZTVT@a4=Zc z5y@e<0_STn&A~e!=~)_WZi5RCV}x<+Hj&RQjfO(7n~P%#*ek#}Tv~)eUQgA(*}sjj`X1W3%A9fmV(y_eJ6eC0z?_^>FobT7 zd3x;4DF_cPHctMg;~f3XTLuQ6=zJ3Kg(QvHZ%jpeFMA^W#(K9d#{b{{t1s|XHDHcb zlxM)OqpAumm~ql6Ev+jSx7IJ8hYj;U0AN|Dp?zL|CTb_~r&U!{*SO=<=Hou`@>!do z;c#h2KUN_&Mq+js<#?dV4nKHe+4ol+fLc{n7Ac!hc7jt*d=~7_g56oLI}3Ja9er4t zvlG>nLv9R=CqHWV4W9oVgz*wB5yp1M=|Mf+0{xpafOj~~^XMA4K%a@p#!l!@px2-F z8w{*xpaDUjkCEqE=nF6;JP*BMG0Nv<7g>`fJx;}*;VDv#4ADYsR_=6C!xOp z{U}r}+)z2`u*026R~+F?`u;neN&W9~CTxF~Q@#Lmlje6j6KjsfICr#De(HOi35Oj6 zzuxOi-1uH+!kh0!ULNO6ScspfZ9mSLG(X@R_}mH3r1d8`ioSyeSA0oBf=oyce026n)VTIV3#b2ee(9H+dt&Y5^`om2MM zT%>cZQ~vOLwTYoU)zg zI?j3LITOEdzEgg4#5rI|hcofp9nORwMx6tu#+~vlUCyLceNOqK1I__=UFJ+Y>cjBk za_4}fu5cz^eT7r@(3MX4s~>eHW-ydZ`lNHvWuJ7WOu8ES)lOOGr=5xST5r%%hu`T;IPXqp$_sZo&hPGYCcbu;Gx_8%Ig`)+5+?G{ ztM9fG8tt;nE^Bql`VT8R?2rQ|bG|kcb>vt)Gfuz{h@k8o1{U>G54)?K5k7u3Gxw9grYxwxY^{96YAJyHtU+C7tY?RUs z5&qL4_>0iLF63@}n?7!0J6w7hFQ)h5lWhDa`S}Htt`W}-CD0{7mleAC!tcgs;m46m zn{PKjze?!PoUGDx3S_vC;^`B*IP zoPW$as1AZz^Z_CFIymr!cZp|X! z1$Z8)v}8Sq3)SRbfu!3Cx+jJ1 zC9!w?U1aM&=_aD)t($HAGqZ5gs(+q%&IH{PLbu-U-?HNTHt7fbiM7_>em}jZzOMsa zR_IbA(A@{R&BOU8{RG2(4s?^}*l_ttV3elEL-!`=E)u%y{dAuEnKlvQyUq- zNdE+$O%0a*At9f9jxU_0w%svaui}~3Xz7nco>NVZ`sjV(Fh7$_!(z+lE|qA!WLzWN z4WNUhG^1_@HcIIh7sk~`L3g>(eL(WZEuZGW0fI7{a?So628el&@EYJ>G+98 zHTioGj7O#M2-$Iu^o?i>S)s?Y$SS4tl`GSi2mSTU*1O^A73ppRU0&!;5^vq~dHRDV zK-Vwf4>$g?-0lP2MM8J4mfK0bbot7S>3b1;heaQzPb zy&QBm2wl)$e!hB5f7y@TxWeXJPU7L_hlFp+4|Km2y1)4877wl$6DOj*NIS=;kyToL z0_pEe58boK6Qh)F=@8=x=sO{nk?QwC?#5Rz)3pwC744P|pF&otzXBQleV}_l=zb>l zu7AFCk$x-aFIZ{)9W8%ZKb{8tMQ2<3kBa}3fA)&C(D)1yP9yr5dxY<9f4=z2k@3od z{wl%B!_6npc=jgf{vvc$emc+m{YB7C zy1@E(qtH$M{maGq;^`lc#H2eZ^j}i?mwoiUeu4RNE%<&ae5K^$qo8jI+h~-MkFS7! z8YDDPm6DIg9*FU@!_tqGkBy+K61ube`6%-d)~}hMyIAN>MqH>S@A{1mKTfp3t4+ua~~^qQAG{c`aeX55jDe zrb8h8eFD!ep?g8>-FOb+@2jBs+9lTC;l4lV@3DyE=Y{T0e|&xU$oO(^=CGvo_Y!|R z1d}cgx>lhJ`Tg~bll+!W_gMcf@Y4-3jyw&TTT_;v`!q&rehoqYCTON)EPYD}^fS>n zoCge-vd_MCX~`ya~E1doA7Ne!3y@i{Cj<^;vpuIu-frqaUqZ{pLpN&q(u=Mg*`4 zGRmn2eaCy|Cu~=DjpE-B^XShb>_PMB8Eb5K8>ZUiO@5j3Z=f`ved%O7xd2avgs=04 z$v^k;dFBttBJWyoGbdFHd1}-M{yz$Wh2sCGg?#c?eg1pu6U(ywYU@8&{f$!pJ>`ES z==%Ke{)o?CPyKri^eOSTZy0}B|Jbe`9WH$7ubFStQ2!?34r8iM`u+3uTcmFX{Y53x zYrA?_=-2rD_v9Db)ud0^c#K5Hc6GMU4a!$fy4bEZ37wATZo3~MU2IpAaCJ9TDfAbB zJ}LAIMyWr{higG|`FiXBoBn+8lZY$_A8!X)%q;)tt&U@Eh zZ|OcNWNtnPX1Q|S+i`=X`?WvZA?9lrfc_Y%x1-HVO!`6pJE5=l`|nxLcnEZpH`;g% zDqo2&=NV0)YZbZ=i~Z!>uPmeH*AVeO67#$pg|C$P7w5f)+-kiYEuG9q&U?2B{b=(q z(sSPX;^(dZqs`x$kDT|ubi1X$Mbhn-r>8&Wym!?XEZv18&`rY}ZN1Pf7>17d{V4pq zTj)M6bdxK8X#*H0zZu_k@c)m(H`4s_KG3}(bi>WlP5MFCLP2Iw2l?xf%=1PY_m26Z z??x49!=nwJ7%SX?2+=Zv(4jYfd{r(Fk-P3r^6uR%C z%^Rip?dcC*g~Kafvi@xqGPhm`W;{9W>3BZhAJ1XtllOhu`g_ta{vIp#p7r!^qf2tf zb%x8dd{X>5MZ%r@-fh-nO^?ih4f;MnSX7K- zBc4A9oqK3NMYpGoN4a(4QvhAF96I2e;=W z9))!&pTFL9IwYj^t2Ua0`fJ~~ufbLwr5U9*rRldlX6f!0{Q=P*5&a3#pAr3e(SIrW zE26(9y7RBrzbT?0Df)4u&k(&@^!cJM61_$A^F)t{o)W!Z^pA;tt>`z3zDe|ZMSn>2 z$3)*E`VU0kD*8*J?-czF(I-A`(=%1{qeVYa^qHd9ioQVfWumu>ev#~W;{RYu*7yTa59~Avj(VrCkS4{S48Uh~6st1)_I~o)P^r(btK-UUZ%rF^Y}aqt<%NG`8@g2&(&3qdCXO0&~Vf zXQyr6yOi#FU4WL3YOT1du5|t4{+f1Z;@`%1+VHNHa3`B1W>^mpeU<2IMSouC9uR%I z@INm4VdC$G--*Get@YvIpg+CC(P=tWAC6A#*Q#L@UHwyiIC72WaPDd^pDVjmSNq}g z!=zuny2?^KEV`fm6|p}AXPrh;)js#U5A&=P)nQh1whdE$;=IRNOniuo-nqv7|C$e5?)~o_ka_qCqMs=G{uk4s zW5jP~s^y|Li*9ZIdT)N4Q}Kd{g*_)Tl6oBevjyWKE;!<$3k_G=u<>L*k^C42ER3&9-$vhF|y6G z!uNgAe<1n~OZ2a1vh{zq=(VEH5xq|IxuW}Hqv4kyWL+kRK2dZEzNVTa`hlWP7G2|g zkl-nzA1wMIq8}>yRMFodx~B6m!H0`}gy`=S{YcR%ew*qj(Kim0E=x7~`^`P%A3cO| zit!v6&w=qA7|((692n1m@f;Y>f$f$f$<#JcR3)(dv@W3=oysnL!EZ}E(YTvjpx944vgo(cn*x`z<3V4-E-jZ z6P!%d#oY~U3-MQfUVUbBdE3I)hP4wW+h4lBYe6`Co(fT{_6kufRf1w;Fx2Oqb?M{{ zUY}-JpLl=zu#z1^jaA@WyLQSLI2qtq@Zgg*`au;=?v=o?uhmoeI{5HP1>*fbGUMxoNoA8M{|QHS6}is&J~h#*I}; zB`JNYZG~g=VK?G3a^0|Tv3>0@Q5nU9Qlhduh4p-K-|LT5iCzsAt5~uHz1Qo1(yC>u zLTXKqsT1L@{{ArTe9fg(xRyLW5bmo&i*>8vhNCcq^5)U#>TtAsb-1fHl8u2eHju=X zule4NFmDUT6-yf&hl8yN>#R$kw^i2!;#^vH_=0d(a$y`7U4ZV=1qL>xlj-cNPFgH6 z79m{R4bWl$uFS~C`>pe;cPD5J{cGn`U^K1g_R5@x|iQh&$8UjNE40c8l#I zM9o8-5o=tZB(}T>D@Tt0Vy6z;tt~6IG_kwdXK7-w!DpEu`$nH-pCR4kw>7l)sBJ6q z2=`)VnVtrSnC?Kn)3XQs1dEc1uI_wOI-T*7ZB{begu^77bUf~}H0jvlvow)=)@Nzr z_Po#1remAm*3fQOTV6svbV_y(CK);{uPfm>>1;CAo^ImRoTgmL?F8{m5!*ec8R8sV z6_5LJ;~Wa<>D9%aRtLjj@5D3Ao8{A~rA-~dP>8)ZZ-HAAw%56bRE# z5E`*_={-IQZ_G=bGS`MN1|{;$598+pd&5s$VulN-LOmvnH}3@>=fKB!wolUi_+IdF zZl*WajZBZO4w+bP*$aL)1Th6|n;mA^Ji8bCGoLf?>-oLlSEQ{Fw{6A#$sj)RxQF>H zZrvVW65D2(6mB28FPgBOWAGxG3z<&q^|A4q{%Y-nqHoQTG63OTVtS0R@tVf9p_sSC zvAx>%2OEo-OPq@~2=}HjaW@M0Jw@EoyJ;ytP~_-#X0vd)0zQJ!#$p|bd>D6`qc=_Q z5^CK388;oNP1xq4`D<*yWV+YKhbEbgJF+5KTP|CQNanga4TK3?7amUK(;3=qbZs(u+))ghO|&sz^}P9v zHuum5S44D&BOSSPvNsJW7&mkq4J^cJlfn6{B;g)`oo?#I0uvOIVu2}5vWq3niiQ4JV)g5Jg1*i|;M5b`(jBc~qu#Cv{Q{#^N& zCuE*4pZZc+_xiH_RR5LNmsQkmnt1ZU*mLC@CpZ$tShTJW5K7&PrRe-+VaD{ zd*IfxN6Sz8O8HY0j$gX2Y|@mg%d4s??l-^8X6p4f>&%E{KHLi2385=5pIwhzLr@HO z_?vRxT|)H>JkvawauL@V7yAM$KSTJxDg26+-y2>tEWMcgyfcUj_vM)U zSNvz-b=JweFPT`3f9%5x@Vj|0{nvc>7*qtWyT(uN(;#O2yqNLhT}D(_fuHq5@ppax z&B5=@hw@+V-BAC%nEvyQB&sigpZ+T*{WLu7G(b^f{Jfa_yjzLtCE-_0dh)YhqM}BA zFDAdrwK*5R<7W7ZNl*R^9x7t;dolT+7r8ih3BO|gzTBH1AM;`LpZ7>oQKSD}O#iE9 z8fWJZ;Ai|4lb-SO)<^PtG5OCB{)47ie#OfFlJ(vV-;2pVO$36agKja*ys1e#Odvr7wIhCcnx{`XAv}to+ye_`R6?D!*sRp*H=BmA}Hr z@5SU-xj!3(U$OGn`uM$={3;*ldEr;A{Cdv`aWh_COn#LsG=Hj%zhdP-*%!VSlV9Zy z-68ynm4Bg+-;2qwa*F;a{EC%7=HvHb@~d2Afn%&3GxMV5F1L z$D8}+;C6&y-aAJ%O)&4Dqne}cJ1kzN?t(7_4p=Ai{<07M&WGzDDAP;-F&}=~hpUe$ zroYLD|Lnt!?<}Tg`eS^F!gQ%SRHZ{G1o^=lmE&(m zPGJ5iCOyM{-8#GBdolTWmm^hN_!TR^-giUH@V%J)w+R1j!mn8QuQI+D^3RLOA6RS& zekA;gl^@-hQN#@2i^-y@3~R`yqNxNTV|R5LHtv!{Fo-V z{xLpYO#a^pe-Gx(EDyz{^1mwl?>xrxD^`A%DHSop_hN?6yEv)pgS@J7Z{%RVas4+cWO#YLX8)xU+@3Z`h zNzb(Bt+UJT#pJ(5_$M51`4ubwBpRToF?=s3|NYIz*;yE{{EA7>@Ml6XZ|8DE-@_RA)mx+M->t|Yi#V&uj^?B$)R@Q@t*j_e4`oskZdIFPiFD z!Mrz`s!}lTkEU8EnD7u=5P1m7%=_&jc>jDM+qB= zKf|5%K{2Ds{^Tj^?A8Y_W_{Rni6uB_w&ho>{1`TkB4&N?V)Fm1@E;-kij`mQ%~F0Z zCjU`M>;JLBuUPp}t&CEBFDCzD;XhgU6)XP>K7KDI|MVV9P$~S1l^@eUqllaF@?!Fz zF8p=EuUPr-qydT=`MsF@+fv5asTY35q-Xg__PYFDO#WqQ%YUZuD_#k_&N`X5`lt7I z5i>qsO#eQUu}uFV{wY@e3uu6%Mt(0Q|I3#eXXod_ubA{qkKXg8{9a7{PvtEC4&hg< z{Ce+~@_RA)f10=aZwS9)<=1<_l;4ZVe@&m|Ke*Pm2gNSGb#~MLbq^+g-5P6gr0^?N ze!VY@xEU`mCjUPQ|8c^vSox>Y07Z@bUQGUf>o?90?vywEfnw4#|Mh+`<@aLp|7F1P zR|~&l<-eQ;DCPHJ@?Rzw?93N_#mcYukSV_xkJP^|f`2g^w0WNm%>J+=Uc7#?`EpD2 zTM1vWhOhU8Y4~2u_%Hdi{)-Z!jPNVI9(btnU@SNIhx|3|H} z8@?Bl|ChplneZ!C{wY3wFDCyh!oNfK6_?8Yn($xwL7RVym0yNCH~wDC@GrT|MsTO_ zD^~t%eew5V^1mkhSI?L51uMTdyk=N>u?he4Hh?#T{}RF5P9M5HZKuaj)aaiV)4$d) z7-y&D3>zQCq-TAYNCOl#@_RA)&)!5=w6hOce#N9G|3Vs|sFB}`$-nW7#@TsB_!X0$ z{G;^`Q|_?*|F*z}uUPpnx6W?(Ud-^X68?i1T7JdK@BQ9o{Jog`Grwd5csJIq`Msc6 z`Mvo?elI3}m3)x@pYSVIe((1#`MsF@v3qRzzi71KD^`B*`VaZNnEW?>#qz%yviypb z{}x~Vc`^B`?zIHJT4ebZEB{44elI5fdg0%Mb!X%|P; zxz7?@BK(S#U+?K7X8aZRgP!XT*S=!;KP7mx;M)YhDENNChyB*lKQ4H_;2#R^7W@+N zJ8*tNJ}CZI@Fu|rHCgw^+ZZ$3Kg6ujU=BkuW3sRJg5HbY56t=M{l4>6Q@&>DAAvjT zlVW;34bO?z+09QcW`52T{+|iIV&%WX$M41De@6Is3BO|HKZFJ-YAg>gCjU?GH_pxp z%WeD>lb-QE+&a7bUQGU%g}+hw6)V5qV@S;Ky_ozDJ!k{y6n@3ZzttDM7n6U(KUjjl z6Mn_YKc5CDY7F0t$^Z02#@YFf@GB-g(|?k6cKH==1^vl~Vm)pSDKSqF{E*-`1#cF7 zaI@nC45fV?@58fvcrh^R^G>O+7YWt_N*Tp+pywLFhY9|?;`40$9u^!B{O^i8tvlZ% zwTEAU-rFAj0PI~KBR})=_mZDit+4e;G2NM;dLJY)%fpMwfAqs}fVx5W6)V5q52^fK zO#WZ~ljZ+M;a9Bu-t{kr@5SUV+idy2CH#t&AKkW5#N_v4@-Gwq9|*r<&7UbIv_gCLV&?A)!e1x+ij{w| zjjo%&UQGU%{@DhwLiiOcf0ZwMFDCy{k640E;a6NL|03bPLiiOce}yl6FJ}08;lES( z6)XS!K7KDI|B2tQ1WyaUV&zAX8AYubFU5ZZJ?rPuzq9TWTP>~v`~q zxa;}uj|kTD);9>&^V44utmmPBC|J)ozb07ED<6(jF@AdfxI(a=CtfO8&j)u3*7Lrf zFnBF8ow?&UTLkNQ*n`fd|7+dzu9pke^QzwwtmjYXo@43tyy#hi_59~Q3D)zR<*O{c zp3nTOU_D>CRj{6yJndXduje1H6s+eNzb{zNCr&%h((8G{q+mTi_>f>d4|w$XmR`^I zT`5@4>pde_&)*$)fu+~;bUg-R{x;j@=NAR*`K$jBtmml?x{&;Z^HHY@*7Hu63fA*W zUlOe6k$xgr&leqv4;%WY=Y{G8>-nF4!FrzOLBV=H=Ow{<-sXK_n?5}+^JBq!{^g2` zt-GFQ`Kn+&pVA$%?s~rD;~heec{tU#q897<4<~N1p6B>br^R|c;|9Tc-s0PW_58%- zE=#ZHA({m1`GyUG^}ND2x-Gq)KY0Ho7VCL}b5>id=K(HGTCDr~t9vZg{rdA$7VG|d zI&HD;r$3UhSog=LWi8hI?gcrEb^m&H-r`p;HreIO?6p|;m#g|L*8SpDYi$3c`@fyQ ztPi?>m=&!1fgcvE`+J`dtowDJ5v==f8wKlr+7|`u{@A^Ob-(K&!McC-m|)$1+9Fu@ zlYSsr_lJHZSoeEg6|DO=e->N^o$A1Tn_k^tIb5*rm%LZ7?te@dtos?2f^~nPO|b44 z{JmgZ|KBQD*YhV0*zk3IzCy6Bw?_o)`uX*Obv=Bux_{QD=LO}z-r|XuS^stYd8S}p zPi_~i>%$KU*7e@!1nYY3{|VOh*XbX&{_A?`B7@hu>!trFSl2t3T~7M7j;>!mDp=Pe z+piG!+id)w6s+ro_g!h-b-nMBk63*6CQEUzqPf^~i5IbgO=T_5-#ao6wt_grh;_51yUg7tg+B4Exp^!s|Pxa;@w*9GhM z?=OU2zh_?)tlv}bzRrfH^XCe|Iv)-R*7@xPf_1){6Rh*kn+5B9@>_y+ez+ZY>H&rG z4`Tu76Dvtm|L3f_43CiC|s-I!~~! zfAt8~^{=&p_51I7!TSAomtg(=dswi}$F~U9`S?!->wNqb;NvE(b@ZO=+6@-#y~$S? zj5+sCoB!7fZV~)t;zQRuYvtbTKL~c@UhNN}AEdk9-~9=}8F7DE@J_)k=qE|PK& zSnvkHe-^CwN;iIv^jJ@od!|o@C!{|Q;o`5f_7%%cT=L-0<) zKNoy-9U3jvK{r_XD#2BXWqq6~H*9%@H_-4Tu3%*@&x8Mf_ zCk1~4c!(i(*7egD1nc_gPQki9b>QDweqEn>k78Mmsury4Q;QVKdQ@1ju21C^ z%lg!{ie)|FcHnm)Yju6*e!;rl@-KpQ{p2~px*qjQ!MZ;5dti7s!PZ{vo7`B8kM!Z` zK0MEdm-z76J{oN?Zy7( zeE2~h{(}$C_(Cy%*oW8n@O3`?q!0hnhyUWk6`P8~`;ZUkeE7>gyw!(~_+qht^L@DA zhad9cKlpIP9mW2w_ThVc_$42nb|?AQy7gnG56?2#{kgs~--nl3?DAje!zmwL=i|TL zhwt*?fAZlcefVh~{-F>5)Q5lW!~f;OFZ=L+`|uk+Ty~eqf49Gy?8Arq@Xt< zAO5uu|K5jR_hIKt#pN}{hmY{#_xkWOA3n{8XZi5yKD@|>XHCRe2|Tm$)Z+Qx1pHP7 z&-d~C0M8HcJcs8$@canRkMTT@=O=i6isxr|w&M9uJe1Y&b3EJd`~uG}@%#$Uf8luv z&#&=p$Fl>^Z}7Z~=M_A^#q&EnzsIu^&wt~270>_Tc^%K6@VtSCvL6mW94FzKjOQRc zQ}7&&=MX%H;(0HgWAPl1CxGWg@VpQDad=L|a}u8EcuvOiempbqoPy_6JRiU_6VGXQ zD)3a|slpS)Q;la1o;o~p@yx^XK|J&EoQ~%VJRicd08c%hg?Jk9G~x;2S%haXo+Wse z;#r30Ogv3^mg8y0vjR^Gp0n^ktz~{32=fVerr~L|_6x?#Z2v5?fK#~=k`{B7(R{qO z1HxD<8`DupGE3!il`YxyCGjW>t6CZY0$@%?Qt^g#Dg~#?{!G+LgsOC!(p?qNOlEKS z*U_6u#tQydSlk%z=fQ9qfNFtwucx%uG!*d~~6{1P==`3wRA*ZrFlSw9ElYo@F z%2m;HEM5`GWGaz2d6R#Q@xFKxQqr=O?dfz9UM7^TG2R*JP39~5qj`0y?9F8>AW_{j73apnoA^~jwsu3EgLamr1RuFU9=cdTDq%cIy1huSd zjYndOAoz_EUc+-&Hny}G>1~A!QOaNq1Q0KebS0wAy*+4JLwGg^6ieXW5KeR9w6M3c zb6CDMR^q|&BVSv(Hya(wF<8|?F?|%W+XdczQ-keY2>T{5x%6Ql1qP9d`y>lRQtQ46 zERlxP{{;H+ebK!^5OU|5m}z8I>~S)OTLT7nz#-Gxf_}lR?cq?Utv1ZgYTrZ`GDA56 z?3>WSRtRQ%PqWAN+r#Zu%=5WnbN7aC*g;XW%?Y;$LE(vW zu+A%|dZe3C21mk(oMjg*La`yeIunT**|O>0JYEJki5 z0YaNw&TJ32)$yMRb*0#{KJA<0H4;wa`z9=#>&PCI3$LR{bwQ48G8uMd;CjoeAZZv= z5AY0~lYYaR-?5-<+<-sFm~WmQR&_aR%&cT5c<*UuE9MBg*wF!XLesCiOXmDLN&b6gKYu-`=%HnFF2hY@Rrq{ zv@KqNgtpaQbnnQXcqo&oz2~9E(02>T-iYH~^ipD}ebiX%wZE?$vp;(&K67&M`08|L zXQDeh(*YUSl<^$eJE6?&<<%u}z0+QZ z_1p~a5ukMLP-1W7LS4E~qL0v#_I;z%pGJC ztQu?;9Aq_Xj_F+5v{~#yqcyXMcGst|RyOO+*?TQQ?R(89_ol2p&ZLID5vMBL_Y@8e zx~%}CxSiOw@5NC3H%jg0K+KI=gQl^ZkVsP8>ab_E$}PdMdm~E`OK@>Q5-W21<q@u~*Se)xJWnxxcZDn{x+roi-d_@*RK}Gkz>1TVfB8lMQFol39qx0d0HsMfOCwfNmBsJXZ>Ox7z~_yIS>^5x)4B$1SQ z=gW_MvhETNcSmr0lbNA-CtS0N8kku*8nh5Tcrl3y_pNmd(|l@Vp93rWOL=i4XQ_i8T~3Ud)2YZO;Rin&bHFEDwUf|qf2cxjudUBQ|#F3{us zJiV#JrM+=-hC)59Scdys&zhP}+~Q>OgXKM2YKOa$$*!8;#ikQXVV{v%+S12Sz?}#URB?^=?gCdW?A8OL7bP$%OoZ=?9jY#78s&9bYs8&bt_ED)_f}c zjm#`Dg0Vh_yraP1WF5uOwokHRKO05N)vkX-qbBQiEG{b;IFiRvps3exvxB5(QndG* z!+ur=_|a6o7sbGhC25#1Xb-I#_GYRN@fiX zaMobIYJz4CGxTmm5MRdp5ek2PVb7ZmNmth`8|ov_1ZNfeIx{{n5@l6^as;v(-u)hO zxHY#tlG)Gp^4(Y!Ht}m$wU}+hJ^S@eLuD=-t#taaRqy^pr~*f`_s%bj_WTz?#Sug5 z&E58)Y!)ZF!}y_23frMhIO3Y3$#gDm>~ir`%owuxwT9T_8&)(o!;eUBE{@G*CrqNo z`u6(W`Sjl##~gC;Xm2)N8O92>kEhv|!MyCrhZN|&`Y&J4b@E6e?CKAD*_1n*o7>;2UP8}3Hjt%2&F;!k7Prg9lP~Imc7w=Z~@VKgveVlgF!@$XKgsfhFXRzl3)$U zR%8?S(WCh>0>=N8$Ra99*}2Gfrt2D<2lSh zYB_s>pB&7xAC_;~IR$U*Nyam>M+6S_R%Uo`iIJj&j~EdIcyP*+*=Mn5{COr9!T#OSHm_`wn?P3a2;v*iaj z`{a05XK%_(!z0PJWv=elQp0{%Cw6nqV84sM>;bdlqy3b$HY=5T@aY%-K=N1V(uUmM z<#soRs-j<+?T!822D`t@QNQz(tl!+zRuHsGC8C7 zpUULvKfR1xTQg?X8Y23{&@ok#QF&v(e>OHvQeA~=` zf{=E?<7(kZE|=)SiTSq0>^6dPAl4$@mBm?Xb6zHr$}jD(9Y`r{dA}PJXGfF#9xVQq z^Dsv{_PfZJx^%zaMSO%!WHVLgfVo?n$nHdCU+f~w=`J+o;&a;kdY04OZ`}}EYMH-H z``XcWVhS^daJ0Wa+?7mspfieaO)VUw$dHluXl4!CG#R`>GI(QU@V-j*oWUMdnJ$p6 zt!Z`)ztHmRmNeD&46@0IO=C8)hU>}u*MhD@s<4w zc)=4qbqeJe8;i>gb9Spaqpc)4bLM9#j;2}Bo(xY!gwAOZZnp*3Ur!y{ZV?CCz4%_o}+C|A|J(WRFowg zXAgK@Q!to^7`cXY3K9?U4tCP)uMzjJqA5hH(9INnDhXL}ri{!10*`g|kk;-xFB^1$ z+8r;8t!pS=!Ko< zxN#U45jU!cxN$jZA_#Xc%TX&-2cvN6cOb=oM7bQjA0vhT=)x) z!--g-ap5ms8H3^76v~9tAmhSc&Ww5`2aF4U$#?~VjSGLt=7M`~b~fbUz;WR(Lx?W* z=lNfA`cnD@UrhEJ5km1`PBlg)z#KBTPM{h50UDxjJZtAwvFh|$M z{K>PQ{ceBs<3WFW0vtv-OgAo(g;Il!=+u(LABf z{j6u-R|ELlU@r5P59)7&JQ#hTcRv8U5?S6VK@7*bDi~`{D^7!Y z#$_3(WDB#q_%|cVpoBeCZ%rFz0Yrr_$ah4M;Duo?yHF<2FOG{CJ%@9w#D?9PH1Bt@ z-_6E7Cj;0W6xE{C&h1Tf#d$f z4E{Cr-jvMY53RJ{;rqEt`wchxh4wc6CD$I`H1GN}*57hL=0nl1qeuD4bh~>~`yNNV zeXnH#ZrHLvtlr}|HS7(as*EhGnvMup*Ar=c`^O_aOFg&U@5NANNhohoAUN|txn2^= z5J_>X!yeQ>Gzhl@_sAQwb?FMx*8$iFS}8&BichMBj6H*YB=k18@j#P4CLuDrEl$K_ z`)&y}()jI} z=z*J-FT$0?MFf!fF1URl6UW^EZc+CBl4NXN&CT@Yx{;$0QMTvt!dD9}RGwWd+;=Q_<=^5Rlce}a+u+#vrx8Qd zgHWUIXaA)!1&iyVe=0F#NVT}cC7&H&zG0KqG*6k~?GC#?w@Tt2CXw#cXUO=DDWqi1 zcmIN|5hI5LCUl3cq?$o9vmv7grc1`cRMd zw{z(3EL4*lNclR*5;VQhu%TeX}W&12fMG#YXTP+N3T zn!a}Ij;gpC9(Oq9F&@M^68SK$GBW~>6R~&}hyTnNUR0beV@)EJfZR8)1Yy@rb^yFB zbFS?IFqjWhcQrX}`MH>x^(0b}eB5|m_<|~_S2opl5YNb6kB_IcHtJ(4v7%b8vzvpM zAwiC7q$AN6x;tp*Eav@VhLqj^5&dvf!S2D!lx{?rfh{V$hf?V_A zRG#ukjWLr?gU5VAP~fK%h7`o^aHJ!bPC`O%*keZ{Iv?ApK!=>@fiE^k Date: Mon, 4 May 2015 10:59:16 -0700 Subject: [PATCH 29/81] Added newline at EOF MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit So X-Code won’t complain anymore. --- xpcPlugin/DataManager.h | 3 +-- xpcPlugin/DataMaps.cpp | 2 +- xpcPlugin/Drawing.h | 3 +-- xpcPlugin/Message.h | 3 +-- xpcPlugin/MessageHandlers.h | 3 +-- xpcPlugin/UDPSocket.h | 3 +-- 6 files changed, 6 insertions(+), 11 deletions(-) diff --git a/xpcPlugin/DataManager.h b/xpcPlugin/DataManager.h index 44e2b65..5524b8c 100644 --- a/xpcPlugin/DataManager.h +++ b/xpcPlugin/DataManager.h @@ -407,5 +407,4 @@ namespace XPC static void SetFlaps(float value); }; } - -#endif \ No newline at end of file +#endif diff --git a/xpcPlugin/DataMaps.cpp b/xpcPlugin/DataMaps.cpp index e0dc087..c269594 100644 --- a/xpcPlugin/DataMaps.cpp +++ b/xpcPlugin/DataMaps.cpp @@ -77,4 +77,4 @@ namespace XPC DREF::ThrottleActual } }; -} \ No newline at end of file +} diff --git a/xpcPlugin/Drawing.h b/xpcPlugin/Drawing.h index 0187810..d24b2bf 100644 --- a/xpcPlugin/Drawing.h +++ b/xpcPlugin/Drawing.h @@ -57,5 +57,4 @@ namespace XPC static void RemoveWaypoints(Waypoint points[], size_t numPoints); }; } - -#endif \ No newline at end of file +#endif diff --git a/xpcPlugin/Message.h b/xpcPlugin/Message.h index 3962dc8..b44b41d 100644 --- a/xpcPlugin/Message.h +++ b/xpcPlugin/Message.h @@ -53,5 +53,4 @@ namespace XPC struct sockaddr source; }; } - -#endif \ No newline at end of file +#endif diff --git a/xpcPlugin/MessageHandlers.h b/xpcPlugin/MessageHandlers.h index 749c00c..2b42268 100644 --- a/xpcPlugin/MessageHandlers.h +++ b/xpcPlugin/MessageHandlers.h @@ -64,5 +64,4 @@ namespace XPC static UDPSocket* sock; // Outgoing network socket }; } - -#endif \ No newline at end of file +#endif diff --git a/xpcPlugin/UDPSocket.h b/xpcPlugin/UDPSocket.h index b6e8e58..184f6e5 100644 --- a/xpcPlugin/UDPSocket.h +++ b/xpcPlugin/UDPSocket.h @@ -70,5 +70,4 @@ namespace XPC #endif }; } - -#endif \ No newline at end of file +#endif From 99e94015c497dabe8a3f7ca06f3f6ccc79d8ccdb Mon Sep 17 00:00:00 2001 From: Chris Teubert Date: Mon, 4 May 2015 11:33:12 -0700 Subject: [PATCH 30/81] Added newline at end of file --- xpcPlugin/DataManager.cpp | 2 +- xpcPlugin/Log.cpp | 2 +- xpcPlugin/Message.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/xpcPlugin/DataManager.cpp b/xpcPlugin/DataManager.cpp index 3f3541e..8354be0 100644 --- a/xpcPlugin/DataManager.cpp +++ b/xpcPlugin/DataManager.cpp @@ -718,4 +718,4 @@ namespace XPC Set(DREF::FlapSetting, value); Set(DREF::FlapActual, value); } -} \ No newline at end of file +} diff --git a/xpcPlugin/Log.cpp b/xpcPlugin/Log.cpp index e754312..6afc271 100644 --- a/xpcPlugin/Log.cpp +++ b/xpcPlugin/Log.cpp @@ -115,4 +115,4 @@ namespace XPC va_end(args); } -} \ No newline at end of file +} diff --git a/xpcPlugin/Message.cpp b/xpcPlugin/Message.cpp index 4448dec..ca921ac 100644 --- a/xpcPlugin/Message.cpp +++ b/xpcPlugin/Message.cpp @@ -181,4 +181,4 @@ namespace XPC } #endif } -} \ No newline at end of file +} From 7f1af73c3ce56a5834159e252a5da4270281396c Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Tue, 5 May 2015 11:44:36 -0700 Subject: [PATCH 31/81] Moved XPData array to DataManager and removed DataMaps. After removing C++11 features, only the declaration of XPData remained in DataMaps, making it somewhat pointless to separate XPData from DataManager. --- xpcPlugin/DataManager.cpp | 3 ++- xpcPlugin/DataManager.h | 3 +++ xpcPlugin/DataMaps.cpp | 8 -------- xpcPlugin/DataMaps.h | 13 ------------- xpcPlugin/MessageHandlers.cpp | 1 - xpcPlugin/xpcPlugin/xpcPlugin.vcxproj | 2 -- xpcPlugin/xpcPlugin/xpcPlugin.vcxproj.filters | 6 ------ 7 files changed, 5 insertions(+), 31 deletions(-) delete mode 100644 xpcPlugin/DataMaps.cpp delete mode 100644 xpcPlugin/DataMaps.h diff --git a/xpcPlugin/DataManager.cpp b/xpcPlugin/DataManager.cpp index 255312e..720f799 100644 --- a/xpcPlugin/DataManager.cpp +++ b/xpcPlugin/DataManager.cpp @@ -15,7 +15,6 @@ // without specific prior written permission from the authors or // Laminar Research, respectively. #include "DataManager.h" -#include "DataMaps.h" #include "Log.h" #include "XPLMDataAccess.h" @@ -33,6 +32,8 @@ namespace XPC static map mdrefs[20]; static map sdrefs; + DREF XPData[134][8] = { DREF_None }; + void DataManager::Initialize() { drefs.insert(make_pair(DREF_None, XPLMFindDataRef("sim/test/test_float"))); diff --git a/xpcPlugin/DataManager.h b/xpcPlugin/DataManager.h index 5fd86ac..9adb9ef 100644 --- a/xpcPlugin/DataManager.h +++ b/xpcPlugin/DataManager.h @@ -135,6 +135,9 @@ namespace XPC DREF_MP7Alt, }; + /// Maps X-Plane dataref lines to XPC DREF values. + extern DREF XPData[134][8]; + /// Marshals data between the plugin and X-Plane. /// /// \author Jason Watkins diff --git a/xpcPlugin/DataMaps.cpp b/xpcPlugin/DataMaps.cpp deleted file mode 100644 index e7404cd..0000000 --- a/xpcPlugin/DataMaps.cpp +++ /dev/null @@ -1,8 +0,0 @@ -//Copyright (c) 2013-2015 United States Government as represented by the Administrator of the -//National Aeronautics and Space Administration. All Rights Reserved. -#include "DataManager.h" - -namespace XPC -{ - DREF XPData[134][8] = { DREF_None }; -} diff --git a/xpcPlugin/DataMaps.h b/xpcPlugin/DataMaps.h deleted file mode 100644 index ef600b7..0000000 --- a/xpcPlugin/DataMaps.h +++ /dev/null @@ -1,13 +0,0 @@ -//Copyright (c) 2013-2015 United States Government as represented by the Administrator of the -//National Aeronautics and Space Administration. All Rights Reserved. -#ifndef XPC_DATAMAPS_H -#define XPC_DATAMAPS_H -#include "DataManager.h" - -namespace XPC -{ - /// Maps X-Plane dataref lines to XPC DREF values. - extern DREF XPData[134][8]; -} - -#endif \ No newline at end of file diff --git a/xpcPlugin/MessageHandlers.cpp b/xpcPlugin/MessageHandlers.cpp index 35e63ec..1522458 100644 --- a/xpcPlugin/MessageHandlers.cpp +++ b/xpcPlugin/MessageHandlers.cpp @@ -2,7 +2,6 @@ //National Aeronautics and Space Administration. All Rights Reserved. #include "MessageHandlers.h" #include "DataManager.h" -#include "DataMaps.h" #include "Drawing.h" #include "Log.h" diff --git a/xpcPlugin/xpcPlugin/xpcPlugin.vcxproj b/xpcPlugin/xpcPlugin/xpcPlugin.vcxproj index 73e1302..70c01f1 100644 --- a/xpcPlugin/xpcPlugin/xpcPlugin.vcxproj +++ b/xpcPlugin/xpcPlugin/xpcPlugin.vcxproj @@ -201,7 +201,6 @@ - @@ -210,7 +209,6 @@ - diff --git a/xpcPlugin/xpcPlugin/xpcPlugin.vcxproj.filters b/xpcPlugin/xpcPlugin/xpcPlugin.vcxproj.filters index e921a5d..e62f3d6 100644 --- a/xpcPlugin/xpcPlugin/xpcPlugin.vcxproj.filters +++ b/xpcPlugin/xpcPlugin/xpcPlugin.vcxproj.filters @@ -30,9 +30,6 @@ Header Files - - Header Files - Header Files @@ -59,9 +56,6 @@ Source Files - - Source Files - From 8f4d50929f4d58c4e1c7c5eb1f8ee79ccc9b4c0e Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Tue, 5 May 2015 11:53:52 -0700 Subject: [PATCH 32/81] Cleaned up implementation of getDREFs in the Java client. - Removed unnecessary loop to try to read several times. - Fixed the way that readUDP detects the length of received packets. --- Java/src/XPlaneConnect.java | 54 ++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 31 deletions(-) diff --git a/Java/src/XPlaneConnect.java b/Java/src/XPlaneConnect.java index f673074..0bc6453 100644 --- a/Java/src/XPlaneConnect.java +++ b/Java/src/XPlaneConnect.java @@ -175,12 +175,12 @@ public class XPlaneConnect implements AutoCloseable */ private byte[] readUDP() throws IOException { - byte[] buffer = new byte[2048]; + byte[] buffer = new byte[65536]; DatagramPacket packet = new DatagramPacket(buffer, buffer.length); try { socket.receive(packet); - return Arrays.copyOf(buffer, buffer[4]); + return Arrays.copyOf(buffer, packet.getLength()); } catch (SocketTimeoutException ex) { @@ -293,37 +293,29 @@ public class XPlaneConnect implements AutoCloseable sendUDP(os.toByteArray()); //Read response - for(int i = 0; i < 40; ++i) + byte[] data = readUDP(); + if(data.length == 0) { - byte[] data = readUDP(); - if(data.length == 0) - { - continue; - } - if(data.length < 6) - { - throw new Error("Response too short"); //TODO: Make custom error type - } - if(data[5] != drefs.length) - { - throw new Error("Unexpected response length"); //TODO: Make custom error type - } - float[][] result = new float[drefs.length][]; - ByteBuffer bb = ByteBuffer.wrap(data); - bb.order(ByteOrder.LITTLE_ENDIAN); - int cur = 6; - for(int j = 0; j < result.length; ++j) - { - result[j] = new float[data[cur++]]; - for(int k = 0; k < result[j].length; ++k) //TODO: There must be a better way to do this - { - result[j][k] = bb.getFloat(cur); - cur += 4; - } - } - return result; + throw new IOException("No response received."); } - throw new IOException("No response received."); + if(data.length < 6) + { + throw new IOException("Response too short"); + } + float[][] result = new float[drefs.length][]; + ByteBuffer bb = ByteBuffer.wrap(data); + bb.order(ByteOrder.LITTLE_ENDIAN); + int cur = 6; + for(int j = 0; j < result.length; ++j) + { + result[j] = new float[data[cur++]]; + for(int k = 0; k < result[j].length; ++k) //TODO: There must be a better way to do this + { + result[j][k] = bb.getFloat(cur); + cur += 4; + } + } + return result; } public void sendDREF(String dref, float value) throws IOException From 3030f67a9daccdbec9162b43eff82dc17e86063a Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Tue, 5 May 2015 08:52:57 -0700 Subject: [PATCH 33/81] Add support for speed brakes to plugin HandleCtrl function. --- xpcPlugin/DataManager.cpp | 5 ++++- xpcPlugin/DataManager.h | 3 ++- xpcPlugin/MessageHandlers.cpp | 13 +++++++++++-- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/xpcPlugin/DataManager.cpp b/xpcPlugin/DataManager.cpp index 720f799..178ac47 100644 --- a/xpcPlugin/DataManager.cpp +++ b/xpcPlugin/DataManager.cpp @@ -69,6 +69,9 @@ namespace XPC drefs.insert(make_pair(DREF_FlapSetting, XPLMFindDataRef("sim/flightmodel/controls/flaprqst"))); drefs.insert(make_pair(DREF_FlapActual, XPLMFindDataRef("sim/flightmodel/controls/flaprat"))); + drefs.insert(make_pair(DREF_SpeedBrakeSet, XPLMFindDataRef("sim/flightmodel/controls/sbrkrqst"))); + drefs.insert(make_pair(DREF_SpeedBrakeActual, XPLMFindDataRef("sim/flightmodel/controls/sbrkrat"))); + drefs.insert(make_pair(DREF_GearDeploy, XPLMFindDataRef("sim/aircraft/parts/acf_gear_deploy"))); drefs.insert(make_pair(DREF_GearHandle, XPLMFindDataRef("sim/cockpit/switches/gear_handle_status"))); drefs.insert(make_pair(DREF_BrakeParking, XPLMFindDataRef("sim/flightmodel/controls/parkbrakel"))); @@ -169,7 +172,7 @@ namespace XPC sprintf(multi, "sim/multiplayer/position/plane%i_spoiler_ratio", i); mdrefs[i][DREF_Spoiler] = XPLMFindDataRef(multi); sprintf(multi, "sim/multiplayer/position/plane%i_speedbrake_ratio", i); - mdrefs[i][DREF_BrakeSpeed] = XPLMFindDataRef(multi); + mdrefs[i][DREF_SpeedBrakeSet] = XPLMFindDataRef(multi); sprintf(multi, "sim/multiplayer/position/plane%i_slat_ratio", i); mdrefs[i][DREF_Slats] = XPLMFindDataRef(multi); sprintf(multi, "sim/multiplayer/position/plane%i_wing_sweep", i); diff --git a/xpcPlugin/DataManager.h b/xpcPlugin/DataManager.h index 9adb9ef..74010d2 100644 --- a/xpcPlugin/DataManager.h +++ b/xpcPlugin/DataManager.h @@ -105,7 +105,8 @@ namespace XPC // Multiplayer Aircraft DREF_FlapActual2, DREF_Spoiler, - DREF_BrakeSpeed, + DREF_SpeedBrakeSet, + DREF_SpeedBrakeActual, DREF_Sweep, DREF_Slats, diff --git a/xpcPlugin/MessageHandlers.cpp b/xpcPlugin/MessageHandlers.cpp index 1522458..85f295b 100644 --- a/xpcPlugin/MessageHandlers.cpp +++ b/xpcPlugin/MessageHandlers.cpp @@ -169,7 +169,7 @@ namespace XPC std::size_t size = msg.GetSize(); //Legacy packets that don't specify an aircraft number should be 26 bytes long. //Packets specifying an A/C num should be 27 bytes. - if (size != 26 && size != 27) + if (size != 26 && size != 27 && size != 31) { #if LOG_VERBOSITY > 0 Log::FormatLine("[CTRL] ERROR: Unexpected message length (%i)", size); @@ -185,10 +185,15 @@ namespace XPC char gear = buffer[21]; float flaps = *((float*)(buffer + 22)); unsigned char aircraft = 0; - if (size == 27) + if (size >= 27) { aircraft = buffer[26]; } + float spdbrk = -998; + if (size >= 31) + { + spdbrk = *((float*)(buffer + 27)); + } float thrArray[8]; for (int i = 0; i < 8; ++i) @@ -213,6 +218,10 @@ namespace XPC { DataManager::Set(DREF_FlapSetting, flaps, aircraft); } + if (spdbrk < -999.5 || spdbrk > -997.5) + { + DataManager::Set(DREF_SpeedBrakeSet, spdbrk, aircraft); + } } void MessageHandlers::HandleData(Message& msg) From c6f9669e36a992e0fcc42c9fc0423e14cd0da402 Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Tue, 5 May 2015 09:04:09 -0700 Subject: [PATCH 34/81] Added support for setting speed brakes to C client. --- C/src/xplaneConnect.c | 7 +-- C/src/xplaneConnect.h | 4 +- TestScripts/C Tests/main.c | 92 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 98 insertions(+), 5 deletions(-) diff --git a/C/src/xplaneConnect.c b/C/src/xplaneConnect.c index 9157b35..98be7f5 100755 --- a/C/src/xplaneConnect.c +++ b/C/src/xplaneConnect.c @@ -560,13 +560,13 @@ int sendCTRL(XPCSocket sock, float values[], int size, char ac) } if (size < 1 || size > 7) { - printError("sendCTRL", "size should be a value between 1 and 6."); + printError("sendCTRL", "size should be a value between 1 and 7."); return -2; } // Setup Command // 5 byte header + 5 float values * 4 + 2 byte values - unsigned char buffer[27] = "CTRL"; + unsigned char buffer[31] = "CTRL"; int cur = 5; for (int i = 0; i < 6; i++) { @@ -587,9 +587,10 @@ int sendCTRL(XPCSocket sock, float values[], int size, char ac) } } buffer[26] = ac; + *((float*)(buffer + 27)) = size == 7 ? values[6]: -998; // Send Command - if (sendUDP(sock, buffer, 27) < 0) + if (sendUDP(sock, buffer, 31) < 0) { printError("sendCTRL", "Failed to send command"); return -3; diff --git a/C/src/xplaneConnect.h b/C/src/xplaneConnect.h index e8520c3..abcfd1f 100644 --- a/C/src/xplaneConnect.h +++ b/C/src/xplaneConnect.h @@ -182,8 +182,8 @@ int sendPOSI(XPCSocket sock, float values[], int size, char ac); /// /// \param sock The socket to use to send the command. /// \param values An array representing position data about the aircraft. The format of values is -/// [Elevator, Aileron, Rudder, Throttle, Gear, Flaps]. If less than 6 values are -/// specified, the unspecified values will be left unchanged. +/// [Elevator, Aileron, Rudder, Throttle, Gear, Flaps, Speed Brakes]. If less than +/// 6 values are specified, the unspecified values will be left unchanged. /// \param size The number of elements in values. /// \param ac The aircraft number to set the control surfaces of. 0 for the player aircraft. /// \returns 0 if successful, otherwise a negative value. diff --git a/TestScripts/C Tests/main.c b/TestScripts/C Tests/main.c index 83a23c8..2718c3d 100644 --- a/TestScripts/C Tests/main.c +++ b/TestScripts/C Tests/main.c @@ -516,6 +516,97 @@ int sendCTRLTest() return 0; } + +int sendCTRLspeedbrakeTest() // sendCTRL test +{ + // Initialize + char* dref = "sim/flightmodel/controls/sbrkrqst"; + float data; + int size = 1; + float CTRL[7] = { -998.0F, -998.0F, -998.0F, -998.0F, -998.0F, -998.0F, -0.5F }; + XPCSocket sock = openUDP(IP); + + // Execute 1 + // Arm speedbrakes + sendCTRL(sock, CTRL, 7, 0); + int result = getDREF(sock, dref, &data, &size); + + // Close socket + closeUDP(sock); + + // Tests + if (result < 0) + { + return -1; + } + if (data != 0.5F) + { + return -11; + } + + sock = openUDP(IP); + // Execute 2 + // Set full speedbrakes + CTRL[6] = 1.0F; + sendCTRL(sock, CTRL, 7, 0); + result = getDREF(sock, dref, &data, &size); + + // Close socket + closeUDP(sock); + + // Tests + if (result < 0) + { + return -2; + } + if (data != 1.0F) + { + return -21; + } + + sock = openUDP(IP); + // Execute 3 + // Retract speedbrakes + CTRL[6] = 0.0F; + sendCTRL(sock, CTRL, 6, 0); + result = getDREF(sock, dref, &data, &size); + + // Close socket + closeUDP(sock); + + // Tests + if (result < 0) + { + return -3; + } + if (data != 0.0F) + { + return -31; + } + + sock = openUDP(IP); + // Execute 4 + // Verify -998 does not change value. + CTRL[6] = -998.0F; + sendCTRL(sock, CTRL, 6, 0); + result = getDREF(sock, dref, &data, &size); + + // Close socket + closeUDP(sock); + + // Tests + if (result < 0) + { + return -4; + } + if (data != 0.0F) + { + return -41; + } + + return 0; +} + int psendPOSITest() // sendPOSI test { // Initialization @@ -952,6 +1043,7 @@ int main(int argc, const char * argv[]) runTest(sendDATATest, "DATA"); runTest(sendCTRLTest, "CTRL"); runTest(psendCTRLTest, "CTRL (player)"); + runTest(sendCTRLspeedbrakeTest, "CTRL (speedbrake)"); runTest(sendPOSITest, "POSI"); runTest(psendPOSITest, "POSI (player)"); runTest(sendWYPTTest, "WYPT"); From 01b55f97c4c6254ec8f8be46c181661ca43ee903 Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Tue, 5 May 2015 10:23:03 -0700 Subject: [PATCH 35/81] Fixed bug in handling of CTRL command Several of the values were not checked for the "don't change" sentinel value. --- xpcPlugin/MessageHandlers.cpp | 37 +++++++++++++++++++++++------------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/xpcPlugin/MessageHandlers.cpp b/xpcPlugin/MessageHandlers.cpp index 85f295b..17e5cb0 100644 --- a/xpcPlugin/MessageHandlers.cpp +++ b/xpcPlugin/MessageHandlers.cpp @@ -195,20 +195,33 @@ namespace XPC spdbrk = *((float*)(buffer + 27)); } - float thrArray[8]; - for (int i = 0; i < 8; ++i) - { - thrArray[i] = thr; - } - DataManager::Set(DREF_YokePitch, pitch, aircraft); - DataManager::Set(DREF_YokeRoll, roll, aircraft); - DataManager::Set(DREF_YokeHeading, yaw, aircraft); - DataManager::Set(DREF_ThrottleSet, thrArray, 8, aircraft); - DataManager::Set(DREF_ThrottleActual, thrArray, 8, aircraft); - if (aircraft == 0) + if (pitch < -999.5 || pitch > -997.5) { - DataManager::Set("sim/flightmodel/engine/ENGN_thro_override", thrArray, 1); + DataManager::Set(DREF_YokePitch, pitch, aircraft); + } + if (roll < -999.5 || roll > -997.5) + { + DataManager::Set(DREF_YokeRoll, roll, aircraft); + } + if (yaw < -999.5 || yaw > -997.5) + { + DataManager::Set(DREF_YokeHeading, yaw, aircraft); + } + if (thr < -999.5 || thr > -997.5) + { + + float thrArray[8]; + for (int i = 0; i < 8; ++i) + { + thrArray[i] = thr; + } + DataManager::Set(DREF_ThrottleSet, thrArray, 8, aircraft); + DataManager::Set(DREF_ThrottleActual, thrArray, 8, aircraft); + if (aircraft == 0) + { + DataManager::Set("sim/flightmodel/engine/ENGN_thro_override", thrArray, 1); + } } if (gear != -1) { From b6e79d43fdc1d139b2dbed335eb407326f0b7466 Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Tue, 5 May 2015 10:36:22 -0700 Subject: [PATCH 36/81] Fixed sendCTRL test bugs. --- TestScripts/C Tests/main.c | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/TestScripts/C Tests/main.c b/TestScripts/C Tests/main.c index 2718c3d..5f84eb8 100644 --- a/TestScripts/C Tests/main.c +++ b/TestScripts/C Tests/main.c @@ -391,8 +391,9 @@ int psendCTRLTest() // sendCTRL test } sock = openUDP(IP); - // Execute 2 + // Execute 3 // Set non-zero pitch, roll, & yaw. Also set throttle, gear, and flaps + float expected[] = { data[0][0], data[1][0], data[2][0], CTRL[3], CTRL[4], CTRL[5] }; CTRL[0] = -998.0F; CTRL[1] = -998.0F; CTRL[2] = -998.0F; @@ -409,7 +410,7 @@ int psendCTRLTest() // sendCTRL test } for (int i = 0; i < 6; i++) { - if (fabs(data[i][0] - CTRL[i]) > 1e-2) + if (fabs(data[i][0] - expected[i]) > 1e-2) { return -i - 31; } @@ -489,8 +490,9 @@ int sendCTRLTest() } sock = openUDP(IP); - // Execute 2 + // Execute 3 // Set non-zero pitch, roll, & yaw. Also set throttle, gear, and flaps + float expected[] = { data[0][0], data[1][0], data[2][0], CTRL[3], CTRL[4], CTRL[5] }; CTRL[0] = -998.0F; CTRL[1] = -998.0F; CTRL[2] = -998.0F; @@ -507,7 +509,7 @@ int sendCTRLTest() } for (int i = 0; i < 6; i++) { - if (fabs(data[i][0] - CTRL[i]) > 1e-2) + if (fabs(data[i][0] - expected[i]) > 1e-2) { return -i - 31; } @@ -539,7 +541,7 @@ int sendCTRLspeedbrakeTest() // sendCTRL test { return -1; } - if (data != 0.5F) + if (fabs(data - CTRL[6]) > 1e-4) { return -11; } @@ -559,7 +561,7 @@ int sendCTRLspeedbrakeTest() // sendCTRL test { return -2; } - if (data != 1.0F) + if (fabs(data - CTRL[6]) > 1e-4) { return -21; } @@ -568,7 +570,7 @@ int sendCTRLspeedbrakeTest() // sendCTRL test // Execute 3 // Retract speedbrakes CTRL[6] = 0.0F; - sendCTRL(sock, CTRL, 6, 0); + sendCTRL(sock, CTRL, 7, 0); result = getDREF(sock, dref, &data, &size); // Close socket @@ -579,7 +581,7 @@ int sendCTRLspeedbrakeTest() // sendCTRL test { return -3; } - if (data != 0.0F) + if (fabs(data - CTRL[6]) > 1e-4) { return -31; } @@ -588,7 +590,7 @@ int sendCTRLspeedbrakeTest() // sendCTRL test // Execute 4 // Verify -998 does not change value. CTRL[6] = -998.0F; - sendCTRL(sock, CTRL, 6, 0); + sendCTRL(sock, CTRL, 7, 0); result = getDREF(sock, dref, &data, &size); // Close socket @@ -599,7 +601,7 @@ int sendCTRLspeedbrakeTest() // sendCTRL test { return -4; } - if (data != 0.0F) + if (data> 1e-4) { return -41; } From 873950a8667410166644f28211506e1a7d784408 Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Tue, 5 May 2015 11:41:33 -0700 Subject: [PATCH 37/81] Added support for setting speed brakes to Java client. --- Java/src/XPlaneConnect.java | 29 +++++++----------- TestScripts/Java Tests/XPlaneConnectTest.java | 30 ++++++++++++++++++- 2 files changed, 40 insertions(+), 19 deletions(-) diff --git a/Java/src/XPlaneConnect.java b/Java/src/XPlaneConnect.java index 0bc6453..511613b 100644 --- a/Java/src/XPlaneConnect.java +++ b/Java/src/XPlaneConnect.java @@ -422,9 +422,9 @@ public class XPlaneConnect implements AutoCloseable { throw new IllegalArgumentException("ctrl must no be null."); } - if(values.length > 6) + if(values.length > 7) { - throw new IllegalArgumentException("ctrl must have 6 or fewer elements."); + throw new IllegalArgumentException("ctrl must have 7 or fewer elements."); } if(ac < 0 || ac > 9) { @@ -434,35 +434,28 @@ public class XPlaneConnect implements AutoCloseable //Pad command values and convert to bytes int i; int cur = 0; - ByteBuffer bb = ByteBuffer.allocate(22); + ByteBuffer bb = ByteBuffer.allocate(26); bb.order(ByteOrder.LITTLE_ENDIAN); - for(i = 0; i < values.length; ++i) + for(i = 0; i < 6; ++i) { if(i == 4) { bb.put(cur, (byte) values[i]); cur += 1; } + else if (i >= values.length) + { + bb.putFloat(cur, -998); + cur+= 4; + } else { bb.putFloat(cur, values[i]); cur += 4; } } - for(; i < 6; ++i) - { - if(i == 4) - { - bb.put(cur, (byte) 0); - cur += 1; - } - else - { - bb.putFloat(cur, -998); - cur += 4; - } - } - bb.put(cur, (byte) ac); + bb.put(cur++, (byte) ac); + bb.putFloat(cur, values.length == 7 ? values[6] : -998); //Build and send message ByteArrayOutputStream os = new ByteArrayOutputStream(); diff --git a/TestScripts/Java Tests/XPlaneConnectTest.java b/TestScripts/Java Tests/XPlaneConnectTest.java index 9223f3d..216a3d7 100644 --- a/TestScripts/Java Tests/XPlaneConnectTest.java +++ b/TestScripts/Java Tests/XPlaneConnectTest.java @@ -463,6 +463,34 @@ public class XPlaneConnectTest } } + @Test + public void testSendCTRL_Speedbrakes() throws IOException + { + String dref = "sim/flightmodel/controls/sbrkrqst"; + float[] ctrl = new float[] { -998.0F, -998.0F, -998.0F, -998.0F, -998.0F, -998.0F, -0.5F }; + try(XPlaneConnect xpc = new XPlaneConnect()) + { + // Speedbrakes armed + xpc.sendCTRL(ctrl); + float[] result = xpc.getDREF(dref); + + assertEquals(-0.5F, result[0], 1e-4); + + ctrl[6] = 1.0F; // Deploy speedbrakes + xpc.sendCTRL(ctrl); + result = xpc.getDREF(dref); + + assertEquals(1.0F, result[0], 1e-4); + + ctrl[6] = 0.0F; // Retract speedbrakes + xpc.sendCTRL(ctrl); + result = xpc.getDREF(dref); + + assertEquals(0.0F, result[0], 1e-4); + } + + } + @Test(expected = IllegalArgumentException.class) public void testSendCTRL_NullCtrl() throws IOException { @@ -475,7 +503,7 @@ public class XPlaneConnectTest @Test(expected = IllegalArgumentException.class) public void testSendCTRL_LongCtrl() throws IOException { - float[] ctrl = new float[] {0, 0, 1, 0.8F, 0, 1, -998}; + float[] ctrl = new float[] {0, 0, 1, 0.8F, 0, 1, 0, -998}; try(XPlaneConnect xpc = new XPlaneConnect()) { xpc.sendCTRL(ctrl); From 7017c314fd256bb414cba3b1db4d655f79392033 Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Tue, 5 May 2015 12:41:20 -0700 Subject: [PATCH 38/81] Added support for setting speed brakes to MATLAB client. - Updated .jar version of the Java client used by the MATLAB client - Added documentation for speed brake setting - No additional changes are needed since the Java client handles the heavy lifting. - Fixed a bug in sendDREF related to the updated .jar --- MATLAB/+XPlaneConnect/XPlaneConnect.jar | Bin 6808 -> 6821 bytes MATLAB/+XPlaneConnect/sendCTRL.m | 1 + MATLAB/+XPlaneConnect/sendDREF.m | 2 +- 3 files changed, 2 insertions(+), 1 deletion(-) diff --git a/MATLAB/+XPlaneConnect/XPlaneConnect.jar b/MATLAB/+XPlaneConnect/XPlaneConnect.jar index 495f2229d11ca87415c21a6aea892282f2fefe8e..755bb2935c7c642d34542cded39df7ee6558f8a8 100644 GIT binary patch delta 5747 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 aP@6`4JtQKt6#xJTlUf=@20 Date: Tue, 5 May 2015 13:00:59 -0700 Subject: [PATCH 39/81] Added support for setting speed brakes to Python client --- Python/src/xplaneConnect.py | 9 ++++++--- TestScripts/Python Tests/Tests.py | 32 ++++++++++++++++++++++++++++++- 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/Python/src/xplaneConnect.py b/Python/src/xplaneConnect.py index 9a38c82..5138d55 100644 --- a/Python/src/xplaneConnect.py +++ b/Python/src/xplaneConnect.py @@ -174,10 +174,11 @@ class XPlaneConnect(object): * Throttle [-1, 1] * Gear (0=up, 1=down) * Flaps [0, 1] + * Speedbrakes [-0.5, 1.5] ac: The aircraft to set the control surfaces of. 0 is the main/player aircraft. ''' # Preconditions - if len(values) < 1 or len(values) > 6: + if len(values) < 1 or len(values) > 7: raise ValueError("Must have between 0 and 6 items in values.") if ac < 0 or ac > 20: raise ValueError("Aircraft number must be between 0 and 20.") @@ -189,11 +190,13 @@ class XPlaneConnect(object): if i < len(values): val = values[i] if i == 4: - val = -1 if val == -998 else val - buffer += struct.pack("B", val) + val = -1 if (abs(val + 998) < 1e-4) else val + buffer += struct.pack("b", val) else: buffer += struct.pack(" Date: Tue, 5 May 2015 14:47:39 -0700 Subject: [PATCH 40/81] Renamed Python client file to decrease ambiguity. - File and class name no longer conflict. - Better matches the structure of Java client. --- Python/src/{xplaneConnect.py => xpc.py} | 0 Python/xplaneConnect.pyproj | 7 +++++-- TestScripts/Python Tests/Tests.py | 2 +- TestScripts/Python Tests/Tests.pyproj | 3 +-- 4 files changed, 7 insertions(+), 5 deletions(-) rename Python/src/{xplaneConnect.py => xpc.py} (100%) diff --git a/Python/src/xplaneConnect.py b/Python/src/xpc.py similarity index 100% rename from Python/src/xplaneConnect.py rename to Python/src/xpc.py diff --git a/Python/xplaneConnect.pyproj b/Python/xplaneConnect.pyproj index bc9ff8a..0919359 100644 --- a/Python/xplaneConnect.pyproj +++ b/Python/xplaneConnect.pyproj @@ -5,7 +5,7 @@ 2.0 3c7a940d-17c8-4e91-882f-9bc8b1d2f54b . - src/XPlaneConnect.py + src\xpc.py . @@ -24,7 +24,10 @@ false - + + + Code + diff --git a/TestScripts/Python Tests/Tests.py b/TestScripts/Python Tests/Tests.py index fc98c26..ac6b1b6 100644 --- a/TestScripts/Python Tests/Tests.py +++ b/TestScripts/Python Tests/Tests.py @@ -3,7 +3,7 @@ import unittest import imp import time -xpc = imp.load_source('xplaneConnect', '../../Python/src/xplaneConnect.py') +import xpc class XPCTests(unittest.TestCase): """Tests the functionality of the XPlaneConnect class.""" diff --git a/TestScripts/Python Tests/Tests.pyproj b/TestScripts/Python Tests/Tests.pyproj index d39f8ab..c1626b5 100644 --- a/TestScripts/Python Tests/Tests.pyproj +++ b/TestScripts/Python Tests/Tests.pyproj @@ -6,8 +6,7 @@ 6931ebb2-4e01-4c5a-86b6-668c0e75051b . Tests.py - - + ..\..\Python\src\ . . Tests From 7d7e0d01b231447628d820959604dfca5f38a168 Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Tue, 5 May 2015 15:17:47 -0700 Subject: [PATCH 41/81] Added example for the Python client. --- Python/src/example.py | 72 +++++++++++++++++++++++++++++++++++++ Python/src/xpc.py | 7 ++++ Python/xplaneConnect.pyproj | 2 +- 3 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 Python/src/example.py diff --git a/Python/src/example.py b/Python/src/example.py new file mode 100644 index 0000000..f381e5d --- /dev/null +++ b/Python/src/example.py @@ -0,0 +1,72 @@ +from time import sleep +import xpc + +def ex(): + print "X-Plane Connect example script" + print "Setting up simulation" + with xpc.XPlaneConnect() as client: + # Verify connection + try: + # If X-Plane does not respond to the request, a timeout error + # will be raised. + client.getDREF("sim/test/test_float") + except: + print "Error establishing connection to X-Plane." + print "Exiting..." + return + + # Set position of the player aircraft + print "Setting position" + # Lat Lon Alt Pitch Roll Yaw Gear + posi = [37.524, -122.06899, 2500, 0, 0, 0, 1] + client.sendPOSI(posi) + + # Set position of a non-player aircraft + print "Setting NPC position" + # Lat Lon Alt Pitch Roll Yaw Gear + posi = [37.52465, -122.06899, 2500, 0, 20, 0, 1] + client.sendPOSI(posi, 1) + + # Set angle of attack, velocity, and orientation using the DATA command + print "Setting orientation" + data = [\ + [18, 0, -998, 0, -998, -998, -998, -998, -998],\ + [ 3, 130, 130, 130, 130, -998, -998, -998, -998],\ + [16, 0, 0, 0, -998, -998, -998, -998, -998]\ + ] + client.sendDATA(data) + + # Set control surfaces and throttle of the player aircraft using sendCTRL + print "Setting controls" + ctrl = [0.0, 0.0, 0.0, 0.8] + client.sendCTRL(ctrl) + + # Pause the sim + print "Pausing" + client.pauseSim(True) + sleep(2) + + # Toggle pause state to resume + print "Resuming" + client.pauseSim(False) + + # Stow landing gear using a dataref + print "Stowing gear" + gear_dref = "sim/cockpit/switches/gear_handle_status" + client.sendDREF(gear_dref, 0) + + # Let the sim run for a bit. + sleep(4) + + # Make sure gear was stowed successfully + gear_status = client.getDREF(gear_dref) + if gear_status[0] == 0: + print "Gear stowed" + else: + print "Error stowing gear" + + print "End of Python client example" + raw_input("Press any key to exit...") + +if __name__ == "__main__": + ex() \ No newline at end of file diff --git a/Python/src/xpc.py b/Python/src/xpc.py index 5138d55..cf7d5e0 100644 --- a/Python/src/xpc.py +++ b/Python/src/xpc.py @@ -43,6 +43,13 @@ class XPlaneConnect(object): def __del__(self): self.close() + # Define __enter__ and __exit__ to support the `with` construct. + def __enter__(self): + return self + + def __exit__(self, type, value, traceback): + self.close() + def close(self): '''Closes the specified connection and releases resources associated with it.''' if self.socket is not None: diff --git a/Python/xplaneConnect.pyproj b/Python/xplaneConnect.pyproj index 0919359..c288a9c 100644 --- a/Python/xplaneConnect.pyproj +++ b/Python/xplaneConnect.pyproj @@ -5,7 +5,7 @@ 2.0 3c7a940d-17c8-4e91-882f-9bc8b1d2f54b . - src\xpc.py + src\example.py . From e3e9c3c55c007da99368e5dfba3a22f7f5315fcd Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Wed, 6 May 2015 10:13:02 -0700 Subject: [PATCH 42/81] Fixed bug in that format of the Python client's DATA command. --- Python/src/xpc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Python/src/xpc.py b/Python/src/xpc.py index cf7d5e0..13d3bbd 100644 --- a/Python/src/xpc.py +++ b/Python/src/xpc.py @@ -124,7 +124,7 @@ class XPlaneConnect(object): if len(data) > 134: raise ValueError("Too many rows in data.") - buffer = struct.pack("<4sxB", "DATA", len(data)) + buffer = struct.pack("<4sx", "DATA") for row in data: if len(row) != 9: raise ValueError("Row does not contain exactly 9 values. <" + str(row) + ">") From e3bc25d5103cba857a487ab804c273fb737100ff Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Wed, 6 May 2015 15:13:58 -0700 Subject: [PATCH 43/81] Updated description of logging levels and changed default logging verbosity. --- xpcPlugin/Log.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/xpcPlugin/Log.h b/xpcPlugin/Log.h index 84d75c0..b7413c1 100644 --- a/xpcPlugin/Log.h +++ b/xpcPlugin/Log.h @@ -12,10 +12,11 @@ // As a result, these log messages may be the only indication of failure. // 2: All errors. Any time something unexpected happens, log it. // 3: Significant actions. Any time something happens outside of normal -// command processing, log it. +// command processing, log it. Will also log when commands are received. +// 4: Detailed actions. Log aditional information as commands are processed. // 5: Everything. Log nearly every single action the plugin takes. This may // have a detrimental impact on X-Plane performance. -#define LOG_VERBOSITY 2 +#define LOG_VERBOSITY 3 namespace XPC { From 0884cfd3955054fc8cb8c94913c122e7a69deeed Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Wed, 6 May 2015 15:13:21 -0700 Subject: [PATCH 44/81] Added support for setting multiple datarefs to the plugin. - The DREF command now uses the packet length to detect and set multiple datarefs in a single packet. --- xpcPlugin/MessageHandlers.cpp | 43 +++++++++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 10 deletions(-) diff --git a/xpcPlugin/MessageHandlers.cpp b/xpcPlugin/MessageHandlers.cpp index 17e5cb0..1a94bf3 100644 --- a/xpcPlugin/MessageHandlers.cpp +++ b/xpcPlugin/MessageHandlers.cpp @@ -402,18 +402,41 @@ namespace XPC void MessageHandlers::HandleDref(Message& msg) { - const unsigned char* buffer = msg.GetBuffer(); - unsigned char len = buffer[5]; - std::string dref = std::string((char*)buffer + 6, len); - - unsigned char valueCount = buffer[6 + len]; - float* values = (float*)(buffer + 7 + len); - -#if LOG_VERBOSITY > 1 - Log::FormatLine("[DREF] Request to set DREF value received (Conn %i): %s", connection.id, dref.c_str()); +#if LOG_VERBOSITY >= 3 + Log::FormatLine("[DREF] Request to set DREF value received (Conn %i)", connection.id); #endif + const unsigned char* buffer = msg.GetBuffer(); + std::size_t size = msg.GetSize(); + std::size_t pos = 5; + while (pos < size) + { + unsigned char len = buffer[pos++]; + if (pos + len > size) + { + break; + } + std::string dref = std::string((char*)buffer + pos, len); + pos += len; - DataManager::Set(dref, values, valueCount); + unsigned char valueCount = buffer[pos++]; + if (pos + 4 * valueCount > size) + { + break; + } + float* values = (float*)(buffer + pos); + pos += 4 * valueCount; + + DataManager::Set(dref, values, valueCount); +#if LOG_VERBOSITY >= 4 + Log::FormatLine("[DREF] Set %d values for %s", valueCount, dref.c_str()); +#endif + } +#if LOG_VERBOSITY >= 2 + if (pos != size) + { + Log::WriteLine("[DREF] Error: Command did not terminate at the expected position."); + } +#endif } void MessageHandlers::HandleGetD(Message& msg) From ec759cbbff1ce48edcb92c2e4060e161173215d4 Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Thu, 7 May 2015 10:04:29 -0700 Subject: [PATCH 45/81] Refactored C Tests The C client tests were getting a bit unwieldy. Moved each block of tests to a separate file based on the functionality being tested. I've just put all of the test code directly in the headers because there doesn't seem to be any reason for the test headers to be included anywhere except in main.c. --- TestScripts/C Tests.win/CTests.vcxproj | 10 + .../C Tests.win/CTests.vcxproj.filters | 30 + TestScripts/C Tests/CtrlTests.h | 147 +++ TestScripts/C Tests/DataTests.h | 62 + TestScripts/C Tests/DrefTests.h | 247 ++++ TestScripts/C Tests/PosiTests.h | 120 ++ TestScripts/C Tests/SimuTests.h | 80 ++ TestScripts/C Tests/Test.c | 51 + TestScripts/C Tests/Test.h | 25 + TestScripts/C Tests/TextTests.h | 32 + TestScripts/C Tests/UDPTests.h | 55 + TestScripts/C Tests/WyptTests.h | 42 + TestScripts/C Tests/main.c | 1079 +---------------- 13 files changed, 940 insertions(+), 1040 deletions(-) create mode 100644 TestScripts/C Tests/CtrlTests.h create mode 100644 TestScripts/C Tests/DataTests.h create mode 100644 TestScripts/C Tests/DrefTests.h create mode 100644 TestScripts/C Tests/PosiTests.h create mode 100644 TestScripts/C Tests/SimuTests.h create mode 100644 TestScripts/C Tests/Test.c create mode 100644 TestScripts/C Tests/Test.h create mode 100644 TestScripts/C Tests/TextTests.h create mode 100644 TestScripts/C Tests/UDPTests.h create mode 100644 TestScripts/C Tests/WyptTests.h diff --git a/TestScripts/C Tests.win/CTests.vcxproj b/TestScripts/C Tests.win/CTests.vcxproj index c057e7d..b546a64 100644 --- a/TestScripts/C Tests.win/CTests.vcxproj +++ b/TestScripts/C Tests.win/CTests.vcxproj @@ -21,9 +21,19 @@ + + + + + + + + + + {BC701AF4-552C-4C9D-82A1-B352542783A4} diff --git a/TestScripts/C Tests.win/CTests.vcxproj.filters b/TestScripts/C Tests.win/CTests.vcxproj.filters index cd3ca2c..6e294b0 100644 --- a/TestScripts/C Tests.win/CTests.vcxproj.filters +++ b/TestScripts/C Tests.win/CTests.vcxproj.filters @@ -21,10 +21,40 @@ Source Files + + Source Files + Header Files + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + \ No newline at end of file diff --git a/TestScripts/C Tests/CtrlTests.h b/TestScripts/C Tests/CtrlTests.h new file mode 100644 index 0000000..3465f70 --- /dev/null +++ b/TestScripts/C Tests/CtrlTests.h @@ -0,0 +1,147 @@ +//Copyright (c) 2013-2015 United States Government as represented by the Administrator of the +//National Aeronautics and Space Administration. All Rights Reserved. +#ifndef CTRLTESTS_H +#define CTRLTESTS_H + +#include "Test.h" +#include "xplaneConnect.h" + +int doCTRLTest(char* drefs[7], float values[], int size, int ac, float expected[7]) +{ + float* data[7]; + int sizes[7]; + for (int i = 0; i < 7; ++i) + { + data[i] = (float*)malloc(sizeof(float) * 16); + sizes[i] = 16; + } + + // Execute command + XPCSocket sock = openUDP(IP); + int result = sendCTRL(sock, values, size, ac); + if (result >= 0) + { + result = getDREFs(sock, drefs, data, 7, sizes); + } + closeUDP(sock); + if (result < 0) + { + return -1; + } + + // Test values + float actual[7]; + for (int i = 0; i < 7; ++i) + { + actual[i] = data[i][0]; + } + return compareArray(expected, actual, 7); +} + +int basicCTRLTest(char** drefs, int ac) +{ + // Set control surfaces to known state. + float CTRL[6] = { 0.0F, 0.0F, 0.0F, 0.8F, 1.0F, 0.5F }; + float expected[7] = { 0.0F, 0.0F, 0.0F, NAN, NAN, NAN, NAN }; + int result = doCTRLTest(drefs, CTRL, 3, ac, expected); + if (result < 0) + { + return -10000 + result; + } + + // Test control surfaces and set other values to known state. + expected[0] = CTRL[0] = 0.2F; + expected[1] = CTRL[1] = 0.1F; + expected[2] = CTRL[2] = 0.1F; + expected[3] = 0.8F; + expected[4] = 1.0F; + expected[5] = 0.5F; + result = doCTRLTest(drefs, CTRL, 6, ac, expected); + if (result < 0) + { + return -20000 + result; + } + + // Test other values and verify control surfaces unchanged. + CTRL[0] = -998; + CTRL[1] = -998; + CTRL[2] = -998; + expected[3] = CTRL[3] = 0.9F; + expected[4] = CTRL[4] = 0.0F; + expected[5] = CTRL[5] = 0.75F; + result = doCTRLTest(drefs, CTRL, 6, ac, expected); + if (result < 0) + { + return -30000 + result; + } +} + +int testCTRL_Player() +{ + char* drefs[] = + { + "sim/cockpit2/controls/yoke_pitch_ratio", + "sim/cockpit2/controls/yoke_roll_ratio", + "sim/cockpit2/controls/yoke_heading_ratio", + "sim/flightmodel/engine/ENGN_thro", + "sim/cockpit/switches/gear_handle_status", + "sim/flightmodel/controls/flaprqst", + "sim/flightmodel/controls/sbrkrqst" + }; + return basicCTRLTest(drefs, 0); +} + +int testCTRL_NonPlayer() +{ + char* drefs[] = + { + "sim/multiplayer/position/plane1_yolk_pitch", + "sim/multiplayer/position/plane1_yolk_roll", + "sim/multiplayer/position/plane1_yolk_yaw", + "sim/multiplayer/position/plane1_throttle", + "sim/multiplayer/position/plane1_gear_deploy", + "sim/multiplayer/position/plane1_flap_ratio", + "sim/multiplayer/position/plane1_sbrkrqst" + }; + return basicCTRLTest(drefs, 1); +} + +int testCTRL_Speedbrakes() +{ + char* drefs[] = + { + "sim/cockpit2/controls/yoke_pitch_ratio", + "sim/cockpit2/controls/yoke_roll_ratio", + "sim/cockpit2/controls/yoke_heading_ratio", + "sim/flightmodel/engine/ENGN_thro", + "sim/cockpit/switches/gear_handle_status", + "sim/flightmodel/controls/flaprqst", + "sim/flightmodel/controls/sbrkrqst" + }; + + // Arm + float CTRL[7] = { -998, -998, -998, -998, -998, -998, -0.5F }; + float expected[7] = { NAN, NAN, NAN, NAN, NAN, NAN, -0.5F }; + int result = doCTRLTest(drefs, CTRL, 7, 0, expected); + if (result < 0) + { + return -10000 + result; + } + + // Set to full + expected[6] = CTRL[6] = 1.5F; + result = doCTRLTest(drefs, CTRL, 7, 0, expected); + if (result < 0) + { + return -20000 + result; + } + + // Retract + expected[6] = CTRL[6] = 0.0F; + result = doCTRLTest(drefs, CTRL, 7, 0, expected); + if (result < 0) + { + return -30000 + result; + } +} +#endif \ No newline at end of file diff --git a/TestScripts/C Tests/DataTests.h b/TestScripts/C Tests/DataTests.h new file mode 100644 index 0000000..2bf1564 --- /dev/null +++ b/TestScripts/C Tests/DataTests.h @@ -0,0 +1,62 @@ +//Copyright (c) 2013-2015 United States Government as represented by the Administrator of the +//National Aeronautics and Space Administration. All Rights Reserved. +#ifndef DATATESTS_H +#define DATATESTS_H + +#include "Test.h" +#include "xplaneConnect.h" + +int testDATA() +{ + // Initialize + int i, j; // Iterator + char* drefs[100] = + { + "sim/aircraft/parts/acf_gear_deploy" + }; + float* data[100]; // array for result of getDREFs + int sizes[100]; + float DATA[4][9]; // Array for sendDATA + XPCSocket sock = openUDP(IP); + + // Setup + for (int i = 0; i < 100; ++i) + { + data[i] = (float*)malloc(40 * sizeof(float)); + sizes[i] = 40; + } + for (i = 0; i < 4; i++) + { + for (j = 0; j < 9; j++) + { + data[i][j] = -998; + } + } + DATA[0][0] = 14; // Gear + DATA[0][1] = 1; + DATA[0][2] = 0; + + // Execution + sendDATA(sock, DATA, 1); + int result = getDREFs(sock, drefs, data, 1, sizes); + + // Close + closeUDP(sock); + + // Tests + if (result < 0)// Request 1 value + { + return -1; + } + if (sizes[0] != 10) + { + return -2; + } + if (*data[0] != data[0][1]) + { + return -3; + } + return 0; +} + +#endif \ No newline at end of file diff --git a/TestScripts/C Tests/DrefTests.h b/TestScripts/C Tests/DrefTests.h new file mode 100644 index 0000000..50338a7 --- /dev/null +++ b/TestScripts/C Tests/DrefTests.h @@ -0,0 +1,247 @@ +//Copyright (c) 2013-2015 United States Government as represented by the Administrator of the +//National Aeronautics and Space Administration. All Rights Reserved. +#ifndef DREFTESTS_H +#define DREFTESTS_H + +#include "Test.h" +#include "xplaneConnect.h" + +int doGETDTest(char* drefs[], float* expected[], int count, int sizes[]) +{ + // Setup memory + int* asizes = (int*)malloc(sizeof(int) * count); + float** actual = (float**)malloc(sizeof(float*) * count); + for (int i = 0; i < count; ++i) + { + asizes[i] = sizes[i]; + actual[i] = (float*)malloc(sizeof(float) * sizes[i]); + } + + // Execute command + XPCSocket sock = openUDP(IP); + int result = getDREFs(sock, drefs, actual, count, asizes); + closeUDP(sock); + if (result < 0) + { + return -1; + } + + // Test sizes and values + result = compareArrays(expected, sizes, actual, asizes, count); + for (int i = 0; i < count; ++i) + { + free(actual[i]); + } + free(actual); + free(asizes); + return result; +} + +int doDREFTest(char* drefs[], float* values[], float* expected[], int count, int sizes[]) +{ + // Setup memory + int* asizes = (int*)malloc(sizeof(int) * count); + float** actual = (float**)malloc(sizeof(float*) * count); + for (int i = 0; i < count; ++i) + { + asizes[i] = sizes[i]; + actual[i] = (float*)malloc(sizeof(float) * sizes[i]); + } + + // Execute command + XPCSocket sock = openUDP(IP); + int result = sendDREFs(sock, drefs, values, sizes, count); + if (result >= 0) + { + result = getDREFs(sock, drefs, actual, count, asizes); + } + closeUDP(sock); + if (result < 0) + { + return -1; + } + + // Test sizes and values + result = compareArrays(expected, sizes, actual, asizes, count); + for (int i = 0; i < count; ++i) + { + free(actual[i]); + } + free(actual); + free(asizes); + return result; +} + +int testGETD_Basic() +{ + char* drefs[] = + { + "sim/cockpit/switches/gear_handle_status", //int + "sim/cockpit/autopilot/altitude", //float + "sim/aircraft/prop/acf_prop_type", //int[8] + "sim/cockpit2/switches/panel_brightness_ratio", //float[4] + "sim/aircraft/view/acf_tailnum", //byte[40] + "sim/flightmodel/position/elevation" //double + }; + int sizes[] = { 1, 1, 8, 4, 40, 1 }; + float* expected[6]; + for (int i = 0; i < 6; ++i) + { + expected[i] = (float*)malloc(sizeof(float) * sizes[i]); + for (int j = 0; j < sizes[i]; ++j) + { + expected[i][j] = NAN; + } + } + + return doGETDTest(drefs, expected, 6, sizes); +} + +int testGETD_TestFloat() +{ + char* dref = "sim/test/test_float"; + int size = 1; + float* expected[1]; + expected[0] = (float*)malloc(sizeof(float)); + expected[0][0] = 0.0F; + + int result = doGETDTest(&dref, &expected, 1, &size); + free(expected[0]); + return result; +} + +int testGETD_Types() +{ + char* drefs[] = + { + "sim/cockpit/switches/gear_handle_status", //int + "sim/cockpit/autopilot/altitude", //float + "sim/aircraft/prop/acf_prop_type", //int[8] + "sim/cockpit2/switches/panel_brightness_ratio", //float[4] + "sim/aircraft/view/acf_tailnum", //byte[40] + "sim/flightmodel/position/elevation" //double + }; + int sizes[] = { 1, 1, 8, 4, 40, 1 }; + float* data[6]; + for (int i = 0; i < 6; ++i) + { + data[i] = (float*)malloc(sizeof(float) * sizes[i]); + } + + // Execute command + XPCSocket sock = openUDP(IP); + int result = getDREFs(sock, drefs, data, 6, sizes); + closeUDP(sock); + + // Tests + if (result < 0) + { + return -1; + } + // Verify sizes + if (sizes[0] != 1 || sizes[1] != 1 || sizes[2] != 8 + || sizes[3] != 4 || sizes[4] != 40 || sizes[5] != 1) + { + return -2; + } + // Verify integer drefs are integers + if ((float)((int)data[0][0]) != data[0][0]) + { + return -3; + } + for (int i = 0; i < 8; ++i) + { + if ((float)((int)data[2][i]) != data[2][i]) + { + return -3; + } + } + for (int i = 0; i < 40; ++i) + { + if ((float)((char)data[4][i]) != data[4][i]) + { + return -3; + } + } + // Verify tail number has at least one valid character + if (data[4][0] <= 0 || data[4][0] > 127) + { + return -4; + } + return 0; +} + +int testDREF() +{ + char* drefs[] = + { + "sim/cockpit/switches/gear_handle_status", //int + "sim/cockpit/autopilot/altitude", //float + "sim/aircraft/prop/acf_prop_type", //int[8] + "sim/cockpit2/switches/panel_brightness_ratio", //float[4] + "sim/aircraft/view/acf_tailnum", //byte[40] + "sim/flightmodel/position/elevation" //double - Read only + }; + float* values[6]; + float* expected[6]; + int sizes[6]; + + // Setup + sizes[0] = 1; + values[0] = (float*)malloc(sizes[0] * sizeof(float)); + expected[0] = values[0]; + values[0][0] = 1; + + sizes[1] = 1; + values[1] = (float*)malloc(sizes[1] * sizeof(float)); + expected[1] = values[1]; + values[1][0] = 4000.0F; + + sizes[2] = 8; + values[2] = (float*)malloc(sizes[2] * sizeof(float)); + expected[2] = values[2]; + for (int i = 0; i < 8; ++i) + { + values[2][i] = 0; + } + + sizes[3] = 4; + values[3] = (float*)malloc(sizes[3] * sizeof(float)); + expected[3] = values[3]; + for (int i = 0; i < 4; ++i) + { + values[3][i] = 0.25F; + } + + sizes[4] = 40; + values[4] = (float*)malloc(sizes[4] * sizeof(float)); + expected[4] = (float*)malloc(sizes[4] * sizeof(float)); + memset(values[4], 0, sizes[4] * sizeof(float)); + values[4][0] = 78.0F; //N + values[4][1] = 55.0F; //7 + values[4][2] = 52.0F; //4 + values[4][3] = 56.0F; //8 + values[4][4] = 53.0F; //5 + values[4][5] = 89.0F; //Y + + expected[4][0] = 78.0F; //N + expected[4][1] = 55.0F; //7 + expected[4][2] = 52.0F; //4 + expected[4][3] = 56.0F; //8 + expected[4][4] = 53.0F; //5 + expected[4][5] = 89.0F; //Y + for (int i = 6; i < sizes[4]; ++i) + { + expected[4][i] = NAN; + } + + sizes[5] = 1; + values[5] = (float*)malloc(sizes[5] * sizeof(float)); + expected[5] = (float*)malloc(sizes[5] * sizeof(float)); + values[5][0] = 5000.0F; + expected[5][0] = NAN; + + return doDREFTest(drefs, values, expected, 6, sizes); +} + +#endif \ No newline at end of file diff --git a/TestScripts/C Tests/PosiTests.h b/TestScripts/C Tests/PosiTests.h new file mode 100644 index 0000000..dfc7e07 --- /dev/null +++ b/TestScripts/C Tests/PosiTests.h @@ -0,0 +1,120 @@ +//Copyright (c) 2013-2015 United States Government as represented by the Administrator of the +//National Aeronautics and Space Administration. All Rights Reserved. +#ifndef POSITESTS_H +#define POSITESTS_H + +#include "Test.h" +#include "xplaneConnect.h" + +int doPOSITest(char* drefs[7], float values[], int size, int ac, float expected[7]) +{ + float* data[7]; + int sizes[7]; + for (int i = 0; i < 7; ++i) + { + data[i] = (float*)malloc(sizeof(float) * 10); + sizes[i] = 10; + } + + // Execute command + XPCSocket sock = openUDP(IP); + pauseSim(sock, 1); + int result = sendPOSI(sock, values, size, ac); + if (result >= 0) + { + result = getDREFs(sock, drefs, data, 7, sizes); + } + pauseSim(sock, 0); + closeUDP(sock); + if (result < 0) + { + return -1; + } + + // Test values + float actual[7]; + for (int i = 0; i < 7; ++i) + { + actual[i] = data[i][0]; + } + return compareArray(expected, actual, 7); +} + +int basicPOSITest(char** drefs, int ac) +{ + // Set psoition and initial orientation + float POSI[7] = { 37.524F, -122.06899F, 2500, 0, 0, 0, 1 }; + float expected[7] = { 37.524F, -122.06899F, 2500, 0, 0, 0, 1 }; + int result = doPOSITest(drefs, POSI, 7, ac, expected); + if (result < 0) + { + return -10000 + result; + } + + // Set orientation + POSI[0] = -998.0F; + POSI[1] = -998.0F; + POSI[2] = -998.0F; + POSI[3] = 5.0F; + POSI[4] = -5.0F; + POSI[5] = 10.0F; + POSI[6] = 0; + + float *loc[3]; + for (int i = 0; i < 3; ++i) + { + loc[i] = (float*)malloc(sizeof(float)); + } + int sizes[3] = { 1, 1, 1 }; + XPCSocket sock = openUDP(IP); + pauseSim(sock, 1); + getDREFs(sock, drefs, loc, 3, sizes); + closeUDP(sock); + + expected[0] = loc[0][0]; + expected[1] = loc[1][0]; + expected[2] = loc[2][0]; + expected[3] = 5.0F; + expected[4] = -5.0F; + expected[5] = 10.0F; + expected[6] = 0.0F; + result = doPOSITest(drefs, POSI, 7, ac, expected); + if (result < 0) + { + return -20000 + result; + } +} + +int testPOSI_Player() +{ + char* drefs[] = + { + "sim/flightmodel/position/latitude", + "sim/flightmodel/position/longitude", + "sim/flightmodel/position/elevation", + "sim/flightmodel/position/theta", + "sim/flightmodel/position/phi", + "sim/flightmodel/position/psi", + "sim/cockpit/switches/gear_handle_status" + }; + return basicPOSITest(drefs, 0); +} + +int testPOSI_NonPlayer() +{ + char* drefs[] = + { + "sim/multiplayer/position/plane1_lat", + "sim/multiplayer/position/plane1_lon", + "sim/multiplayer/position/plane1_el", + "sim/multiplayer/position/plane1_the", + "sim/multiplayer/position/plane1_phi", + "sim/multiplayer/position/plane1_psi", + "sim/multiplayer/position/plane1_gear_deploy" + }; + return basicPOSITest(drefs, 1); +} + + + +#endif \ No newline at end of file diff --git a/TestScripts/C Tests/SimuTests.h b/TestScripts/C Tests/SimuTests.h new file mode 100644 index 0000000..1c807b7 --- /dev/null +++ b/TestScripts/C Tests/SimuTests.h @@ -0,0 +1,80 @@ +//Copyright (c) 2013-2015 United States Government as represented by the Administrator of the +//National Aeronautics and Space Administration. All Rights Reserved. +#ifndef SIMUTESTS_H +#define SIMIUTESTS_H + +#include "Test.h" +#include "xplaneConnect.h" + +int doSIMUTest(int value, float expected) +{ + int size = 20; + float actual[20]; + char* dref = "sim/operation/override/override_planepath"; + + XPCSocket sock = openUDP(IP); + int result = pauseSim(sock, value); + if (result >= 0) + { + result = getDREF(sock, dref, &actual, &size); + } + closeUDP(sock); + if (result < 0) + { + return -1; + } + + for (int i = 0; i < 20; ++i) + { + if (!feq(actual[i], expected) && !isnan(expected)) + { + return -100 - i; + } + } +} + +int testSIMU_Basic() +{ + int result = doSIMUTest(0, 0); + if (result < 0) + { + return -1; + } + + result = doSIMUTest(1, 1); + if (result < 0) + { + return -2; + } + + result = doSIMUTest(0, 0); + if (result < 0) + { + return -3; + } + return 0; +} + +int testSIMU_Toggle() +{ + int result = doSIMUTest(0, 0); + if (result < 0) + { + return -1; + } + + result = doSIMUTest(2, 1); + if (result < 0) + { + return -1; + } + + result = doSIMUTest(2, 0); + if (result < 0) + { + return -3; + } + return 0; +} + +#endif \ No newline at end of file diff --git a/TestScripts/C Tests/Test.c b/TestScripts/C Tests/Test.c new file mode 100644 index 0000000..cce713c --- /dev/null +++ b/TestScripts/C Tests/Test.c @@ -0,0 +1,51 @@ +//Copyright (c) 2013-2015 United States Government as represented by the Administrator of the +//National Aeronautics and Space Administration. All Rights Reserved. +#include "Test.h" + +int testFailed = 0; +int testPassed = 0; + +void runTest(int(*test)(), char* name) +{ + printf("Running test %s... ", name); + int result = test(); // Run Test + if (result == 0) + { + printf("PASSED\n"); + testPassed++; + } + else + { + printf("Test %s - FAILED\n\tError: %i\n", name, result); + testFailed++; + } +} + +int compareFloat(float expected, float actual) +{ + return feq(expected, actual) || isnan(expected) ? 0 : -1; +} + +int compareArray(float expected[], float actual[], int size) +{ + return compareArrays(&expected, &size, &actual, &size, 1); +} + +int compareArrays(float* expected[], int esizes[], float* actual[], int asizes[], int count) +{ + for (int i = 0; i < count; ++i) + { + if (esizes[i] != asizes[i]) + { + return -100 - i; + } + for (int j = 0; j < esizes[i]; ++j) + { + if (!feq(actual[i][j], expected[i][j]) && !isnan(expected[i][j])) + { + return -1000 - i * 100 - j; + } + } + } + return 0; +} \ No newline at end of file diff --git a/TestScripts/C Tests/Test.h b/TestScripts/C Tests/Test.h new file mode 100644 index 0000000..c05a5eb --- /dev/null +++ b/TestScripts/C Tests/Test.h @@ -0,0 +1,25 @@ +//Copyright (c) 2013-2015 United States Government as represented by the Administrator of the +//National Aeronautics and Space Administration. All Rights Reserved. +#ifndef TESTRUNNER_H +#define TESTRUNNER_H + +#include +#include +#include +#include +#include + +#define feq(x, y) (fabs(x - y) < 1e-4) + +#define IP "127.0.0.1" + +extern int testFailed; +extern int testPassed; + +void runTest(int(*test)(), char* name); + +int compareFloat(float expected, float actual); +int compareArray(float expected[], float actual[], int size); +int compareArrays(float* expected[], int esizes[], float* actual[], int asizes[], int count); + +#endif \ No newline at end of file diff --git a/TestScripts/C Tests/TextTests.h b/TestScripts/C Tests/TextTests.h new file mode 100644 index 0000000..badf16e --- /dev/null +++ b/TestScripts/C Tests/TextTests.h @@ -0,0 +1,32 @@ +//Copyright (c) 2013-2015 United States Government as represented by the Administrator of the +//National Aeronautics and Space Administration. All Rights Reserved. +#ifndef TEXTTESTS_H +#define TEXTTESTS_H + +#include "Test.h" +#include "xplaneConnect.h" + +int testTEXT() +{ + // Setup + XPCSocket sendPort = openUDP(IP); + int x = 100; + int y = 700; + char* msg = "This is an X-Plane Connect test message.\nThis should be a new line.\r\nThat will be parsed as two line breaks."; + + // Test + sendTEXT(sendPort, msg, x, y); + // NOTE: Manually verify that msg appears on the screen in X-Plane! + + sendTEXT(sendPort, "Another test message", x, y); + // NOTE: Manually verify that msg appears on the screen and that no part of the previous + // message is visible. + + sendTEXT(sendPort, NULL, -1, -1); + + // Cleanup + closeUDP(sendPort); + return 0; +} + +#endif \ No newline at end of file diff --git a/TestScripts/C Tests/UDPTests.h b/TestScripts/C Tests/UDPTests.h new file mode 100644 index 0000000..3c3d3fa --- /dev/null +++ b/TestScripts/C Tests/UDPTests.h @@ -0,0 +1,55 @@ +//Copyright (c) 2013-2015 United States Government as represented by the Administrator of the +//National Aeronautics and Space Administration. All Rights Reserved. +#ifndef UDPTESTS_H +#define UDPTESTS_H + +#include "Test.h" +#include "xplaneConnect.h" + +int testOpen() +{ + XPCSocket sock = openUDP("localhost"); + int result = strncmp(sock.xpIP, "127.0.0.1", 16); + closeUDP(sock); + return result; +} + +int testClose() +{ + XPCSocket sendPort = aopenUDP(IP, 49009, 49063); + closeUDP(sendPort); + sendPort = aopenUDP(IP, 49009, 49063); + closeUDP(sendPort); + return 0; +} + +int testCONN() +{ + // Initialize + char* drefs[] = + { + "sim/cockpit/switches/gear_handle_status" + }; + float data[1]; + int size = 1; + XPCSocket sock = openUDP(IP); +#if (__APPLE__ || __linux) + usleep(0); +#endif + + // Execution + setCONN(&sock, 49055); + int result = getDREF(sock, drefs[0], data, &size); + + // Close + closeUDP(sock); + + // Test + if (result < 0)// No data received + { + return -1; + } + return 0; +} + +#endif \ No newline at end of file diff --git a/TestScripts/C Tests/WyptTests.h b/TestScripts/C Tests/WyptTests.h new file mode 100644 index 0000000..fce3c2c --- /dev/null +++ b/TestScripts/C Tests/WyptTests.h @@ -0,0 +1,42 @@ +//Copyright (c) 2013-2015 United States Government as represented by the Administrator of the +//National Aeronautics and Space Administration. All Rights Reserved. +#ifndef WYPTTESTS_H +#define WYPTTESTS_H + +#include "Test.h" +#include "xplaneConnect.h" + +int testWYPT() +{ + // Setup + XPCSocket sock = openUDP(IP); + float points[] = + { + 37.5245F, -122.06899F, 2500, + 37.455397F, -122.050037F, 2500, + 37.469567F, -122.051411F, 2500, + 37.479376F, -122.060509F, 2300, + 37.482237F, -122.076130F, 2100, + 37.474881F, -122.087288F, 1900, + 37.467660F, -122.079391F, 1700, + 37.466298F, -122.090549F, 1500, + 37.362562F, -122.039223F, 1000, + 37.361448F, -122.034416F, 1000, + 37.361994F, -122.026348F, 1000, + 37.365541F, -122.022572F, 1000, + 37.373727F, -122.024803F, 1000, + 37.403869F, -122.041283F, 50, + 37.418544F, -122.049222F, 6 + }; + + // Test + sendWYPT(sock, XPC_WYPT_CLR, NULL, 0); + sendWYPT(sock, XPC_WYPT_ADD, points, 15); + // NOTE: Visually ensure waypoints are added in the sim + + // Cleanup + closeUDP(sock); + return 0; +} + +#endif \ No newline at end of file diff --git a/TestScripts/C Tests/main.c b/TestScripts/C Tests/main.c index 5f84eb8..ae01451 100644 --- a/TestScripts/C Tests/main.c +++ b/TestScripts/C Tests/main.c @@ -1,1029 +1,14 @@ -// -// main.cpp -// XPC Tests -// -// Created by Chris Teubert on 11/25/14. -// Copyright (c) 2014 Chris Teubert. All rights reserved. -// - -#include -#include -#include -#include -#include -#include "xplaneConnect.h" - -#define IP "127.0.0.1" - -int testFailed = 0; -int testPassed = 0; - -void runTest(int (*test)(), char* name) -{ - int result = test(); // Run Test - printf("Test %i: %s - ", testPassed + testFailed + 1, name); - if (result == 0) - { - printf("PASSED\n"); - testPassed++; - } - else - { - printf("FAILED\n\tError: %i\n", result); - testFailed++; - } -} - -int openTest() // openUDP Test -{ - XPCSocket sock = openUDP("localhost"); - int result = strncmp(sock.xpIP, "127.0.0.1", 16); - closeUDP(sock); - return result; -} - -int closeTest() // closeUDP test -{ - XPCSocket sendPort = aopenUDP(IP, 49009, 49063); - closeUDP(sendPort); - sendPort = aopenUDP(IP, 49009, 49063); - closeUDP(sendPort); - return 0; -} - -int sendTEXTTest() -{ - // Setup - XPCSocket sendPort = openUDP(IP); - int x = 100; - int y = 700; - char* msg = "This is an X-Plane Connect test message.\nThis should be a new line.\r\nThat will be parsed as two line breaks."; - - // Test - sendTEXT(sendPort, msg, x, y); - // NOTE: Manually verify that msg appears on the screen in X-Plane! - - sendTEXT(sendPort, "Another test message", x, y); - // NOTE: Manually verify that msg appears on the screen and that no part of the previous - // message is visible. - - sendTEXT(sendPort, NULL, -1, -1); - - // Cleanup - closeUDP(sendPort); - return 0; -} - -int getDREFTest() // Request DREF Test (Required for next tests) -{ - // Initialization - // Get one DREF of each type (int, float, int[], float[], double, byte[]) - #define GETD_COUNT 6 - char* drefs[GETD_COUNT] = - { - "sim/cockpit/switches/gear_handle_status", //int - "sim/cockpit/autopilot/altitude", //float - "sim/aircraft/prop/acf_prop_type", //int[8] - "sim/cockpit2/switches/panel_brightness_ratio", //float[4] - "sim/aircraft/view/acf_tailnum", //byte[40] - "sim/flightmodel/position/elevation" //double - }; - float* data[GETD_COUNT]; - int sizes[GETD_COUNT]; - XPCSocket sock = openUDP(IP); - - // Setup - for (int i = 0; i < GETD_COUNT; ++i) - { - data[i] = (float*)malloc(256 * sizeof(float)); - sizes[i] = 256; - } - - // Execution - int result = getDREFs(sock, drefs, data, GETD_COUNT, sizes); - - // Close - closeUDP(sock); - - // Tests - if (result < 0) - { - return -1; - } - // Verify sizes - if (sizes[0] != 1 || sizes[1] != 1 || sizes[2] != 8 - || sizes[3] != 4 || sizes[4] != 40 || sizes[5] != 1) - { - return -2; - } - // Verify integer drefs are integers - if ((float)((int)data[0][0]) != data[0][0]) - { - return -3; - } - for (int i = 0; i < 8; ++i) - { - if ((float)((int)data[2][i]) != data[2][i]) - { - return -3; - } - } - for (int i = 0; i < 40; ++i) - { - if ((float)((char)data[4][i]) != data[4][i]) - { - return -3; - } - } - // Verify tail number has at least one valid character - if (data[4][0] <= 0 || data[4][0] > 127) - { - return -4; - } - return 0; -} - -int sendDREFTest() // sendDREF test -{ - // Initialization - // Set one DREF of each type (int, float, int[], float[], double, byte[]) - // Also set one read-only to make sure it fails - #define DREF_COUNT 6 - char* drefs[DREF_COUNT] = - { - "sim/cockpit/switches/gear_handle_status", //int - "sim/cockpit/autopilot/altitude", //float - "sim/aircraft/prop/acf_prop_type", //int[8] - "sim/cockpit2/switches/panel_brightness_ratio", //float[4] - "sim/aircraft/view/acf_tailnum", //byte[40] - "sim/flightmodel/position/elevation" //double - Read only - }; - float* data[DREF_COUNT]; - int sizes[DREF_COUNT]; - float* values[DREF_COUNT]; - XPCSocket sock = openUDP(IP); - - // Setup - sizes[0] = 1; - values[0] = (float*)malloc(sizes[0] * sizeof(float)); - values[0][0] = 1; - - sizes[1] = 1; - values[1] = (float*)malloc(sizes[1] * sizeof(float)); - values[1][0] = 4000.0F; - - sizes[2] = 8; - values[2] = (float*)malloc(sizes[2] * sizeof(float)); - for (int i = 0; i < 8; ++i) - { - values[2][i] = 0; - } - - sizes[3] = 4; - values[3] = (float*)malloc(sizes[3] * sizeof(float)); - for (int i = 0; i < 4; ++i) - { - values[3][i] = 0.25F; - } - - sizes[4] = 40; - values[4] = (float*)malloc(sizes[4] * sizeof(float)); - memset(values[4], 0, sizes[4] * sizeof(float)); - values[4][0] = 78.0F; //N - values[4][1] = 55.0F; //7 - values[4][2] = 52.0F; //4 - values[4][3] = 56.0F; //8 - values[4][4] = 53.0F; //5 - values[4][5] = 89.0F; //Y - - sizes[5] = 1; - values[5] = (float*)malloc(sizes[5] * sizeof(float)); - values[5][0] = 5000.0F; - - // Execution - for (int i = 0; i < DREF_COUNT; ++i) - { - sendDREF(sock, drefs[i], values[i], sizes[i]); - data[i] = (float*)malloc(256 * sizeof(float)); - sizes[i] = 256; - } - int result = getDREFs(sock, drefs, data, DREF_COUNT, sizes); - - // Close - closeUDP(sock); - - // Tests - if (result < 0) - { - return -1; - } - // Verify gear handle was set - if (sizes[0] != 1 || data[0][0] != 1) - { - return -2; - } - // Verify autopilot altitude was set - if (sizes[1] != 1 || data[1][0] != 4000.0F) - { - return -3; - } - // Verify prop type was set - if (sizes[2] != 8) - { - return -4; - } - for (int i = 0; i < 8; ++i) - { - if (data[2][i] != values[2][i]) - { - return -4; - } - } - // Verify panel brightness was set - if (sizes[3] != 4) - { - return -5; - } - for (int i = 0; i < 4; ++i) - { - if (data[3][i] != values[3][i]) - { - return -5; - } - } - // Verify tail number was set - for (int i = 0; i < 6; ++i) - { - if (data[4][i] != values[4][i]) - { - return -6; - } - } - // Verify aircraft elevation was NOT set - if (sizes[5] != 1 || data[5][0] == 5000.0F) - { - return -7; - } - return 0; -} - -int sendDATATest() // sendDATA test -{ - // Initialize - int i,j; // Iterator - char* drefs[100] = - { - "sim/aircraft/parts/acf_gear_deploy" - }; - float* data[100]; // array for result of getDREFs - int sizes[100]; - float DATA[4][9]; // Array for sendDATA - XPCSocket sock = openUDP(IP); - - // Setup - for (int i = 0; i < 100; ++i) - { - data[i] = (float*)malloc(40 * sizeof(float)); - sizes[i] = 40; - } - for (i = 0; i < 4; i++) - { - for (j = 0; j < 9; j++) - { - data[i][j] = -998; - } - } - DATA[0][0] = 14; // Gear - DATA[0][1] = 1; - DATA[0][2] = 0; - - // Execution - sendDATA(sock, DATA, 1); - int result = getDREFs(sock, drefs, data, 1, sizes); - - // Close - closeUDP(sock); - - // Tests - if ( result < 0 )// Request 1 value - { - return -1; - } - if (sizes[0] != 10) - { - return -2; - } - if (*data[0] != data[0][1]) - { - return -3; - } - return 0; -} - -int psendCTRLTest() // sendCTRL test -{ - // Initialize - char* drefs[100] = - { - "sim/cockpit2/controls/yoke_pitch_ratio", - "sim/cockpit2/controls/yoke_roll_ratio", - "sim/cockpit2/controls/yoke_heading_ratio", - "sim/flightmodel/engine/ENGN_thro", - "sim/cockpit/switches/gear_handle_status", - "sim/flightmodel/controls/flaprqst" - }; - float* data[100]; - int sizes[100]; - float CTRL[6] = { 0.0F, 0.0F, 0.0F, 0.8F, 1.0F, 0.5F }; - XPCSocket sock = openUDP(IP); - - // Setup - for (int i = 0; i < 100; i++) - { - data[i] = (float*)malloc(40 * sizeof(float)); - sizes[i] = 40; - } - - // Execute 1 - // 0 pitch, roll, yaw - sendCTRL(sock, CTRL, 3, 0); - int result = getDREFs(sock, drefs, data, 6, sizes); - - // Close socket - closeUDP(sock); - - // Tests - if (result < 0) - { - return -1; - } - for (int i = 0; i < 3; i++) - { - if (fabs(data[i][0] - CTRL[i]) > 1e-4) - { - return -i - 11; - } - } - - sock = openUDP(IP); - // Execute 2 - // Set non-zero pitch, roll, & yaw. Also set throttle, gear, and flaps - CTRL[0] = 0.2F; - CTRL[1] = 0.1F; - CTRL[2] = 0.1F; - sendCTRL(sock, CTRL, 6, 0); - result = getDREFs(sock, drefs, data, 6, sizes); - - // Close socket - closeUDP(sock); - - // Tests - if (result < 0) - { - return -2; - } - for (int i = 0; i < 6; i++) - { - if (fabs(data[i][0] - CTRL[i]) > 1e-4) - { - return -i - 21; - } - } - - sock = openUDP(IP); - // Execute 3 - // Set non-zero pitch, roll, & yaw. Also set throttle, gear, and flaps - float expected[] = { data[0][0], data[1][0], data[2][0], CTRL[3], CTRL[4], CTRL[5] }; - CTRL[0] = -998.0F; - CTRL[1] = -998.0F; - CTRL[2] = -998.0F; - sendCTRL(sock, CTRL, 6, 0); - result = getDREFs(sock, drefs, data, 6, sizes); - - // Close socket - closeUDP(sock); - - // Tests - if (result < 0) - { - return -3; - } - for (int i = 0; i < 6; i++) - { - if (fabs(data[i][0] - expected[i]) > 1e-2) - { - return -i - 31; - } - } - - return 0; -} - -int sendCTRLTest() -{ - // Initialize - char* drefs[100] = - { - "sim/multiplayer/position/plane1_yolk_pitch", - "sim/multiplayer/position/plane1_yolk_roll", - "sim/multiplayer/position/plane1_yolk_yaw", - "sim/multiplayer/position/plane1_throttle", - "sim/multiplayer/position/plane1_gear_deploy", - "sim/multiplayer/position/plane1_flap_ratio", - }; - float* data[100]; - int sizes[100]; - float CTRL[6] = { 0.0F, 0.0F, 0.0F, 0.8F, 1.0F, 0.5F }; - XPCSocket sock = openUDP(IP); - - // Setup - for (int i = 0; i < 100; i++) - { - data[i] = (float*)malloc(40 * sizeof(float)); - sizes[i] = 40; - } - - // Execute 1 - // 0 pitch, roll, yaw - sendCTRL(sock, CTRL, 3, 1); - int result = getDREFs(sock, drefs, data, 6, sizes); - - // Close socket - closeUDP(sock); - - // Tests - if (result < 0) - { - return -1; - } - for (int i = 0; i < 3; i++) - { - if (fabs(data[i][0] - CTRL[i]) > 1e-4) - { - return -i - 11; - } - } - - sock = openUDP(IP); - // Execute 2 - // Set non-zero pitch, roll, & yaw. Also set throttle, gear, and flaps - CTRL[0] = 0.2F; - CTRL[1] = 0.1F; - CTRL[2] = 0.1F; - sendCTRL(sock, CTRL, 6, 1); - result = getDREFs(sock, drefs, data, 6, sizes); - - // Close socket - closeUDP(sock); - - // Tests - if (result < 0) - { - return -2; - } - for (int i = 0; i < 6; i++) - { - if (fabs(data[i][0] - CTRL[i]) > 1e-4) - { - return -i - 21; - } - } - - sock = openUDP(IP); - // Execute 3 - // Set non-zero pitch, roll, & yaw. Also set throttle, gear, and flaps - float expected[] = { data[0][0], data[1][0], data[2][0], CTRL[3], CTRL[4], CTRL[5] }; - CTRL[0] = -998.0F; - CTRL[1] = -998.0F; - CTRL[2] = -998.0F; - sendCTRL(sock, CTRL, 6, 1); - result = getDREFs(sock, drefs, data, 6, sizes); - - // Close socket - closeUDP(sock); - - // Tests - if (result < 0) - { - return -3; - } - for (int i = 0; i < 6; i++) - { - if (fabs(data[i][0] - expected[i]) > 1e-2) - { - return -i - 31; - } - } - - return 0; -} - - -int sendCTRLspeedbrakeTest() // sendCTRL test -{ - // Initialize - char* dref = "sim/flightmodel/controls/sbrkrqst"; - float data; - int size = 1; - float CTRL[7] = { -998.0F, -998.0F, -998.0F, -998.0F, -998.0F, -998.0F, -0.5F }; - XPCSocket sock = openUDP(IP); - - // Execute 1 - // Arm speedbrakes - sendCTRL(sock, CTRL, 7, 0); - int result = getDREF(sock, dref, &data, &size); - - // Close socket - closeUDP(sock); - - // Tests - if (result < 0) - { - return -1; - } - if (fabs(data - CTRL[6]) > 1e-4) - { - return -11; - } - - sock = openUDP(IP); - // Execute 2 - // Set full speedbrakes - CTRL[6] = 1.0F; - sendCTRL(sock, CTRL, 7, 0); - result = getDREF(sock, dref, &data, &size); - - // Close socket - closeUDP(sock); - - // Tests - if (result < 0) - { - return -2; - } - if (fabs(data - CTRL[6]) > 1e-4) - { - return -21; - } - - sock = openUDP(IP); - // Execute 3 - // Retract speedbrakes - CTRL[6] = 0.0F; - sendCTRL(sock, CTRL, 7, 0); - result = getDREF(sock, dref, &data, &size); - - // Close socket - closeUDP(sock); - - // Tests - if (result < 0) - { - return -3; - } - if (fabs(data - CTRL[6]) > 1e-4) - { - return -31; - } - - sock = openUDP(IP); - // Execute 4 - // Verify -998 does not change value. - CTRL[6] = -998.0F; - sendCTRL(sock, CTRL, 7, 0); - result = getDREF(sock, dref, &data, &size); - - // Close socket - closeUDP(sock); - - // Tests - if (result < 0) - { - return -4; - } - if (data> 1e-4) - { - return -41; - } - - return 0; -} - -int psendPOSITest() // sendPOSI test -{ - // Initialization - int i; // Iterator - char* drefs[100] = - { - "sim/flightmodel/position/latitude", - "sim/flightmodel/position/longitude", - "sim/flightmodel/position/elevation", - "sim/flightmodel/position/theta", - "sim/flightmodel/position/phi", - "sim/flightmodel/position/psi", - "sim/cockpit/switches/gear_handle_status" - }; - float* data[100]; - int sizes[100]; - float POSI[7] = { 37.524F, -122.06899F, 2500, 0, 0, 0, 1 }; - XPCSocket sock = openUDP(IP); - - // Setup - for (i = 0; i < 100; i++) - { - data[i] = (float*)malloc(40 * sizeof(float)); - sizes[i] = 40; - } - - // Execution 1 - pauseSim(sock, 1); - sendPOSI(sock, POSI, 7, 0); - int result = getDREFs(sock, drefs, data, 7, sizes); - pauseSim(sock, 0); - - // Close - closeUDP(sock); - - // Tests - if (result < 0) - { - return -1; - } - for (i = 0; i < 7; ++i) - { - if (fabs(data[i][0] - POSI[i]) > 1e-4) - { - return -i - 11; - } - } - - // Setup 2 - sock = openUDP(IP); - POSI[0] = -998.0F; - POSI[1] = -998.0F; - POSI[2] = -998.0F; - POSI[3] = 5.0F; - POSI[4] = -5.0F; - POSI[5] = 10.0F; - POSI[6] = 0; - - // Execution 2 - pauseSim(sock, 1); - float *loc[3]; - for(int i = 0; i < 3; ++i) - { - loc[i] = (float*)malloc(sizeof(float)); - } - getDREFs(sock, drefs, &loc, 3, sizes); - sendPOSI(sock, POSI, 7, 0); - result = getDREFs(sock, drefs, data, 7, sizes); - pauseSim(sock, 0); - - // Close - closeUDP(sock); - - // Tests - if (result < 0) - { - return -2; - } - // Compare position to make sure they weren't set - for (int i = 0; i < 3; ++i) - { - // Note: Because the sim was paused when both of these were read, we really do expect *exactly* - // the same value even though we are comparing floats. - if (data[i][0] != loc[i][0]) - { - return -i - 21; - } - } - // Compare everything else. - for (i = 3; i < 7; ++i) - { - if (fabs(data[i][0] - POSI[i]) > 1e-4) - { - return -i - 21; - } - } - - // Setup 3 - sock = openUDP(IP); - POSI[0] = 37.524F; - POSI[1] = -122.06899F; - POSI[2] = 20000; - POSI[3] = 15.0F; - POSI[4] = -25.0F; - POSI[5] = -10.0F; - POSI[6] = 1; - - // Execution 3 - pauseSim(sock, 1); - sendPOSI(sock, POSI, 3, 0); - result = getDREFs(sock, drefs, data, 7, sizes); - pauseSim(sock, 0); - - // Close - closeUDP(sock); - - // Tests - if (result < 0) - { - return -3; - } - // Compare position to make sure it was set. - for (int i = 0; i < 3; ++i) - { - if (fabs(data[i][0] - POSI[i]) > 1e-4) - { - return -i - 31; - } - } - // Compare everything else to make sure it *wasn't*. - for (i = 3; i < 7; ++i) - { - if (fabs(data[i][0] - POSI[i]) < 1) - { - return -i - 31; - } - } - - return 0; -} - -int sendPOSITest() // sendPOSI test -{ - // Initialization - int i; // Iterator - char* drefs[100] = - { - "sim/multiplayer/position/plane1_lat", - "sim/multiplayer/position/plane1_lon", - "sim/multiplayer/position/plane1_el", - "sim/multiplayer/position/plane1_the", - "sim/multiplayer/position/plane1_phi", - "sim/multiplayer/position/plane1_psi", - "sim/multiplayer/position/plane1_gear_deploy" - }; - float* data[100]; - int sizes[100]; - float POSI[7] = { 37.524F, -122.06899F, 2500, 0, 0, 0, 1 }; - XPCSocket sock = openUDP(IP); - - // Setup - for (i = 0; i < 100; i++) - { - data[i] = (float*)malloc(40 * sizeof(float)); - sizes[i] = 40; - } - - // Execution 1 - pauseSim(sock, 1); - sendPOSI(sock, POSI, 7, 1); - int result = getDREFs(sock, drefs, data, 7, sizes); - pauseSim(sock, 0); - - // Close - closeUDP(sock); - - // Tests - if (result < 0) - { - return -1; - } - for (i = 0; i < 7; ++i) - { - if (fabs(data[i][0] - POSI[i]) > 1e-4) - { - return -i - 11; - } - } - - // Setup 2 - sock = openUDP(IP); - POSI[0] = -998.0F; - POSI[1] = -998.0F; - POSI[2] = -998.0F; - POSI[3] = 5.0F; - POSI[4] = -5.0F; - POSI[5] = 10.0F; - POSI[6] = 0; - - // Execution 2 - pauseSim(sock, 1); - float* loc[3]; - for(int i = 0; i < 3; ++i) - { - loc[i] = (float*)malloc(sizeof(float)); - } - getDREFs(sock, drefs, loc, 3, sizes); - sendPOSI(sock, POSI, 7, 1); - result = getDREFs(sock, drefs, data, 7, sizes); - pauseSim(sock, 0); - - // Close - closeUDP(sock); - - // Tests - if (result < 0) - { - return -2; - } - // Compare position to make sure they weren't set - for (int i = 0; i < 3; ++i) - { - // Note: Because the sim was paused when both of these were read, we really do expect *exactly* - // the same value even though we are comparing floats. - if (data[i][0] != loc[i][0]) - { - return -i - 21; - } - } - // Compare everything else. - for (i = 3; i < 7; ++i) - { - if (fabs(data[i][0] - POSI[i]) > 1e-4) - { - return -i - 21; - } - } - - // Setup 3 - sock = openUDP(IP); - POSI[0] = 37.524F; - POSI[1] = -122.06899; - POSI[2] = 20000; - POSI[3] = 15.0F; - POSI[4] = -25.0F; - POSI[5] = -10.0F; - POSI[6] = 1; - - // Execution 2 - pauseSim(sock, 1); - sendPOSI(sock, POSI, 3, 1); - result = getDREFs(sock, drefs, data, 7, sizes); - pauseSim(sock, 0); - - // Close - closeUDP(sock); - - // Tests - if (result < 0) - { - return -3; - } - // Compare position to make sure it was set. - for (int i = 0; i < 3; ++i) - { - if (fabs(data[i][0] - POSI[i]) > 1e-4) - { - return -i - 31; - } - } - // Compare everything else to make sure it *wasn't*. - for (i = 3; i < 7; ++i) - { - if (fabs(data[i][0] - POSI[i]) < 1) - { - return -i - 31; - } - } - - return 0; -} - -int sendWYPTTest() -{ - // Setup - XPCSocket sock = openUDP(IP); - float points[] = - { - 37.5245F, -122.06899F, 2500, - 37.455397F, -122.050037F, 2500, - 37.469567F, -122.051411F, 2500, - 37.479376F, -122.060509F, 2300, - 37.482237F, -122.076130F, 2100, - 37.474881F, -122.087288F, 1900, - 37.467660F, -122.079391F, 1700, - 37.466298F, -122.090549F, 1500, - 37.362562F, -122.039223F, 1000, - 37.361448F, -122.034416F, 1000, - 37.361994F, -122.026348F, 1000, - 37.365541F, -122.022572F, 1000, - 37.373727F, -122.024803F, 1000, - 37.403869F, -122.041283F, 50, - 37.418544F, -122.049222F, 6 - }; - - // Test - sendWYPT(sock, XPC_WYPT_CLR, NULL, 0); - sendWYPT(sock, XPC_WYPT_ADD, points, 15); - // NOTE: Visually ensure waypoints are added in the sim - - // Cleanup - closeUDP(sock); - return 0; -} - -int pauseTest() // pauseSim test -{ - // Setup - // Note: Always run this test to the end so that the sim ends up unpaused in the - // case where commands are working but reading results isn't. - int result = 0; - char* dref = "sim/operation/override/override_planepath"; - int size = 20; - float data[20]; - XPCSocket sock = openUDP(IP); - - // Execute - pauseSim(sock, 0); - result = getDREF(sock, dref, data, &size); - - // Test - if (result < 0) - { - result = -1; - } - else if (data[0] != 0) - { - result = -2; - } - - if (result == 0) - { - // Execute 2 - pauseSim(sock, 2); - result = getDREF(sock, dref, data, &size); - - // Test 2 - if (result < 0) - { - result = -3; - } - else if (data[0] != 1) - { - result = -4; - } - } - - if (result == 0) - { - // Execute 3 - pauseSim(sock, 0); - result = getDREF(sock, dref, data, &size); - - // Test 2 - if (result < 0) - { - result = -5; - } - else if (data[0] != 0) - { - result = -6; - } - } - - // Close - closeUDP(sock); - - return result; -} - -int connTest() // setConn test -{ - // Initialize - char* drefs[100] = - { - "sim/cockpit/switches/gear_handle_status" - }; - float* data[100]; - int sizes[100]; - XPCSocket sock = openUDP(IP); -#if (__APPLE__ || __linux) - usleep(0); -#endif - - // Setup - for (int i = 0; i < 100; ++i) - { - data[i] = (float*)malloc(40 * sizeof(float)); - sizes[i] = 40; - } - - // Execution - setCONN(&sock, 49055); - int result = getDREF(sock, drefs[0], data[0], sizes); - - // Close - closeUDP(sock); - - // Test - if ( result < 0 )// No data received - { - return -1; - } - return 0; -} +//Copyright (c) 2013-2015 United States Government as represented by the Administrator of the +//National Aeronautics and Space Administration. All Rights Reserved. +#include "Test.h" +#include "UDPTests.h" +#include "DrefTests.h" +#include "SimuTests.h" +#include "CtrlTests.h" +#include "PosiTests.h" +#include "DataTests.h" +#include "TextTests.h" +#include "WyptTests.h" int main(int argc, const char * argv[]) { @@ -1035,22 +20,36 @@ int main(int argc, const char * argv[]) printf("(Mac) \n"); #elif (__linux) printf("(Linux) \n"); +#else + printf("(Unable to determine operating system) \n") #endif - runTest(openTest, "open"); - runTest(closeTest, "close"); - runTest(pauseTest, "SIMU"); - runTest(getDREFTest, "GETD"); - runTest(sendDREFTest, "DREF"); - runTest(sendDATATest, "DATA"); - runTest(sendCTRLTest, "CTRL"); - runTest(psendCTRLTest, "CTRL (player)"); - runTest(sendCTRLspeedbrakeTest, "CTRL (speedbrake)"); - runTest(sendPOSITest, "POSI"); - runTest(psendPOSITest, "POSI (player)"); - runTest(sendWYPTTest, "WYPT"); - runTest(sendTEXTTest, "TEXT"); - runTest(connTest, "CONN"); + // Basic Networking + runTest(testOpen, "open"); + runTest(testClose, "close"); + // Datarefs + runTest(testGETD_Basic, "GETD"); + runTest(testGETD_Types, "GETD (types)"); + runTest(testGETD_TestFloat, "GETD (test float)"); + runTest(testDREF, "DREF"); + // Pause + runTest(testSIMU_Basic, "SIMU"); + runTest(testSIMU_Toggle, "SIMU (toggle)"); + // CTRL + runTest(testCTRL_Player, "CTRL (player)"); + runTest(testCTRL_NonPlayer, "CTRL (non-player)"); + runTest(testCTRL_Speedbrakes, "CTRL (speedbrakes)"); + // POSI + runTest(testPOSI_Player, "POSI (player)"); + runTest(testPOSI_NonPlayer, "POSI (non-player)"); + // Data + runTest(testDATA, "DATA"); + // Text + runTest(testTEXT, "TEXT"); + // Waypoints + runTest(testWYPT, "WYPT"); + // setConn + runTest(testCONN, "CONN"); printf( "----------------\nTest Summary\n\tFailed: %i\n\tPassed: %i\n", testFailed, testPassed ); From f2e64a30f2fe5f639ed620a8493b532456a3d4eb Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Wed, 6 May 2015 15:30:49 -0700 Subject: [PATCH 46/81] Added support for sending multiple datarefs to the C client. --- C/src/xplaneConnect.c | 60 ++++++++++++++++++++++++++----------------- C/src/xplaneConnect.h | 24 +++++++++++++---- 2 files changed, 56 insertions(+), 28 deletions(-) diff --git a/C/src/xplaneConnect.c b/C/src/xplaneConnect.c index 98be7f5..74b098d 100755 --- a/C/src/xplaneConnect.c +++ b/C/src/xplaneConnect.c @@ -366,32 +366,46 @@ int readDATA(XPCSocket sock, float data[][9], int rows) /*****************************************************************************/ int sendDREF(XPCSocket sock, const char* dref, float value[], int size) { - // Setup command - // 5 byte header + max 255 char dref name + max 255 values * 4 bytes per value = 1279 - unsigned char buffer[1279] = "DREF"; - int drefLen = strnlen(dref, 256); - if (drefLen > 255) - { - printError("setDREF", "dref length is too long. Must be less than 256 characters."); - return -1; - } - if (size > 255) - { - printError("setDREF", "size is too big. Must be less than 256."); - return -2; - } - int len = 7 + drefLen + size * sizeof(float); - - // Copy dref to buffer - buffer[5] = (unsigned char)drefLen; - memcpy(buffer + 6, dref, drefLen); + return sendDREFs(sock, &dref, &value, &size, 1); +} - // Copy values to buffer - buffer[6 + drefLen] = (unsigned char)size; - memcpy(buffer + 7 + drefLen, value, size * sizeof(float)); +int sendDREFs(XPCSocket sock, const char* drefs[], float* values[], int sizes[], int count) +{ + // Setup command + // Max size is technically unlimited. + unsigned char buffer[65536] = "DREF"; + int pos = 5; + for (int i = 0; i < count; ++i) + { + int drefLen = strnlen(drefs[i], 256); + if (pos + drefLen + sizes[i] * 4 + 2 > 65536) + { + printError("sendDREF", "About to overrun the send buffer!"); + return -4; + } + if (drefLen > 255) + { + printError("sendDREF", "dref %d is too long. Must be less than 256 characters.", i); + return -1; + } + if (sizes[i] > 255) + { + printError("sendDREF", "size %d is too big. Must be less than 256.", i); + return -2; + } + // Copy dref to buffer + buffer[pos++] = (unsigned char)drefLen; + memcpy(buffer + pos, drefs[i], drefLen); + pos += drefLen; + + // Copy values to buffer + buffer[pos++] = (unsigned char)sizes[i]; + memcpy(buffer + pos, values[i], sizes[i] * sizeof(float)); + pos += sizes[i] * sizeof(float); + } // Send command - if (sendUDP(sock, buffer, len) < 0) + if (sendUDP(sock, buffer, pos) < 0) { printError("setDREF", "Failed to send command"); return -3; diff --git a/C/src/xplaneConnect.h b/C/src/xplaneConnect.h index abcfd1f..391ec54 100644 --- a/C/src/xplaneConnect.h +++ b/C/src/xplaneConnect.h @@ -127,13 +127,27 @@ int sendDATA(XPCSocket sock, float data[][9], int rows); /// http://www.xsquawkbox.net/xpsdk/docs/DataRefs.html. The size of values should match /// the size given on that page. XPC currently sends all values as floats regardless of /// the type described on the wiki. This doesn't cause any data loss for most datarefs. -/// \param sock The socket to use to send the command. -/// \param dref The name of the dataref to set. -/// \param values An array of values representing the data to set. -/// \param size The number of elements in values. -/// \returns 0 if successful, otherwise a negative value. +/// \param sock The socket to use to send the command. +/// \param dref The name of the dataref to set. +/// \param value An array of values representing the data to set. +/// \param size The number of elements in values. +/// \returns 0 if successful, otherwise a negative value. int sendDREF(XPCSocket sock, const char* dref, float value[], int size); +/// Sets the specified datarefs to the specified values. +/// +/// \details dref names and their associated data types can be found on the XPSDK wiki at +/// http://www.xsquawkbox.net/xpsdk/docs/DataRefs.html. The size of values should match +/// the size given on that page. XPC currently sends all values as floats regardless of +/// the type described on the wiki. This doesn't cause any data loss for most datarefs. +/// \param sock The socket to use to send the command. +/// \param drefs The names of the datarefs to set. +/// \param values A multidimensional array containing the values for each dataref to set. +/// \param sizes The number of elements in each array in values +/// \param count The number of datarefs being set. +/// \returns 0 if successful, otherwise a negative value. +int sendDREFs(XPCSocket sock, const char* drefs[], float* values[], int sizes[], int count); + /// Gets the value of the specified dataref. /// /// \details dref names and their associated data types can be found on the XPSDK wiki at From 5717b0f67a2f4e89cd2d2bab81aeb1a7484415c5 Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Thu, 7 May 2015 14:11:56 -0700 Subject: [PATCH 47/81] Added support for sending multiple datarefs to the Python client and fixed setCONN bug. --- Python/src/xpc.py | 62 ++++++++++++++++++++++--------- TestScripts/Python Tests/Tests.py | 31 ++++++++++++++++ 2 files changed, 75 insertions(+), 18 deletions(-) diff --git a/Python/src/xpc.py b/Python/src/xpc.py index 13d3bbd..32b4d3c 100644 --- a/Python/src/xpc.py +++ b/Python/src/xpc.py @@ -79,8 +79,20 @@ class XPlaneConnect(object): if port < 0 or port > 65535: raise ValueError("The specified port is not a valid port number.") + #Send command buffer = struct.pack("<4sxH", "CONN", port) self.sendUDP(buffer) + + #Rebind socket + clientAddr = ("0.0.0.0", port) + timeout = self.socket.gettimeout(); + self.socket.close(); + self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) + self.socket.bind(clientAddr) + self.socket.settimeout(timeout) + + #Read response + buffer = self.socket.recv(1024) def pauseSim(self, pause): '''Pauses or un-pauses the physics simulation engine in X-Plane. @@ -208,31 +220,45 @@ class XPlaneConnect(object): # Send self.sendUDP(buffer) - # DREF Manipulation + # DREF Manipulation def sendDREF(self, dref, values): '''Sets the specified dataref to the specified value. Args: - dref: The name of the dataref to set. + dref: The name of the datarefs to set. values: Either a scalar value or a sequence of values. ''' - # Preconditions - if len(dref) == 0 or len(dref) > 255: - raise ValueError("dref must be a non-empty string less than 256 characters.") - if values == None: - raise ValueError("values must be a scalar or sequence of floats.") + self.sendDREFs([dref], [values]) + + def sendDREFs(self, drefs, values): + '''Sets the specified datarefs to the specified values. + + Args: + drefs: A list of names of the datarefs to set. + values: A list of scalar or vector values to set. + ''' + if len(drefs) != len(values): + raise ValueError("drefs and values must have the same number of elements.") + + buffer = struct.pack("<4sx", "DREF") + for i in range(len(drefs)): + dref = drefs[i] + value = values[i] + # Preconditions + if len(dref) == 0 or len(dref) > 255: + raise ValueError("dref must be a non-empty string less than 256 characters.") + if value == None: + raise ValueError("value must be a scalar or sequence of floats.") - # Pack message - fmt = "" - buffer = None - if hasattr(values, "__len__"): - if len(values) > 255: - raise ValueError("values must have less than 256 items.") - fmt = "<4sxB{0:d}sB{1:d}f".format(len(dref), len(values)) - buffer = struct.pack(fmt, "DREF", len(dref), dref, len(values), values) - else: - fmt = "<4sxB{0:d}sBf".format(len(dref)) - buffer = struct.pack(fmt, "DREF", len(dref), dref, 1, values) + # Pack message + if hasattr(value, "__len__"): + if len(value) > 255: + raise ValueError("value must have less than 256 items.") + fmt = " Date: Thu, 7 May 2015 15:05:29 -0700 Subject: [PATCH 48/81] Added support for sending multiple datarefs to the Java client. --- Java/src/XPlaneConnect.java | 81 ++++++++++++------- TestScripts/Java Tests/XPlaneConnectTest.java | 27 +++++++ 2 files changed, 81 insertions(+), 27 deletions(-) diff --git a/Java/src/XPlaneConnect.java b/Java/src/XPlaneConnect.java index 511613b..2e1f336 100644 --- a/Java/src/XPlaneConnect.java +++ b/Java/src/XPlaneConnect.java @@ -331,43 +331,70 @@ public class XPlaneConnect implements AutoCloseable * @throws IOException If the command cannot be sent. */ public void sendDREF(String dref, float[] value) throws IOException + { + sendDREFs(new String[] {dref}, new float[][] {value}); + } + + /** + * Sends a command to X-Plane that sets the given DREF. + * + * @param drefs The names of the X-Plane datarefs to set. + * @param values A sequence of arrays of floating point values whose structure depends on the drefs specified. + * @throws IOException If the command cannot be sent. + */ + public void sendDREFs(String[] drefs, float[][] values) throws IOException { //Preconditions - if(dref == null) + if(drefs == null || drefs.length == 0) { - throw new IllegalArgumentException("dref must be a valid string."); + throw new IllegalArgumentException(("drefs must be non-empty.")); } - if(value == null || value.length == 0) + if(values == null || values.length != drefs.length) { - throw new IllegalArgumentException("value must be non-null and should contain at least one value."); + throw new IllegalArgumentException("values must be of the same size as drefs."); } - //Convert drefs to bytes. - byte[] drefBytes = dref.getBytes(StandardCharsets.UTF_8); - if(drefBytes.length == 0) - { - throw new IllegalArgumentException("DREF is an empty string!"); - } - if(drefBytes.length > 255) - { - throw new IllegalArgumentException("dref must be less than 255 bytes in UTF-8. Are you sure this is a valid dref?"); - } - - ByteBuffer bb = ByteBuffer.allocate(4 * value.length); - bb.order(ByteOrder.LITTLE_ENDIAN); - for(int i = 0; i < value.length; ++i) - { - bb.putFloat(i * 4, value[i]); - } - - //Build and send message ByteArrayOutputStream os = new ByteArrayOutputStream(); os.write("DREF".getBytes(StandardCharsets.UTF_8)); os.write(0xFF); //Placeholder for message length - os.write(drefBytes.length); - os.write(drefBytes, 0, drefBytes.length); - os.write(value.length); - os.write(bb.array()); + for(int i = 0; i < drefs.length; ++i) + { + String dref = drefs[i]; + float[] value = values[i]; + + if (dref == null) + { + throw new IllegalArgumentException("dref must be a valid string."); + } + if (value == null || value.length == 0) + { + throw new IllegalArgumentException("value must be non-null and should contain at least one value."); + } + + //Convert drefs to bytes. + byte[] drefBytes = dref.getBytes(StandardCharsets.UTF_8); + if (drefBytes.length == 0) + { + throw new IllegalArgumentException("DREF is an empty string!"); + } + if (drefBytes.length > 255) + { + throw new IllegalArgumentException("dref must be less than 255 bytes in UTF-8. Are you sure this is a valid dref?"); + } + + ByteBuffer bb = ByteBuffer.allocate(4 * value.length); + bb.order(ByteOrder.LITTLE_ENDIAN); + for (int j = 0; j < value.length; ++j) + { + bb.putFloat(j * 4, value[j]); + } + + //Build and send message + os.write(drefBytes.length); + os.write(drefBytes, 0, drefBytes.length); + os.write(value.length); + os.write(bb.array()); + } sendUDP(os.toByteArray()); } diff --git a/TestScripts/Java Tests/XPlaneConnectTest.java b/TestScripts/Java Tests/XPlaneConnectTest.java index 216a3d7..e3caba5 100644 --- a/TestScripts/Java Tests/XPlaneConnectTest.java +++ b/TestScripts/Java Tests/XPlaneConnectTest.java @@ -333,6 +333,33 @@ public class XPlaneConnectTest } } + @Test + public void testSendDREFs() throws IOException + { + String[] drefs = + { + "sim/cockpit/switches/gear_handle_status", + "sim/cockpit/autopilot/altitude" + }; + try(XPlaneConnect xpc = new XPlaneConnect()) + { + float[][] values = {{1}, {2000}}; + xpc.sendDREFs(drefs, values); + + float[][] result = xpc.getDREFs(drefs); + assertEquals(values[0][0], result[0][0], 1e-4); + assertEquals(values[1][0], result[1][0], 1e-4); + + values[0][0] = 0; + values[1][0] = 4000; + xpc.sendDREFs(drefs, values); + + result = xpc.getDREFs(drefs); + assertEquals(values[0][0], result[0][0], 1e-4); + assertEquals(values[1][0], result[1][0], 1e-4); + } + } + @Test(expected = IllegalArgumentException.class) public void testSendDREF_NullDREF() throws IOException { From 22a864a8dc93779e66477cc0f3567983c92894b9 Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Thu, 7 May 2015 15:19:59 -0700 Subject: [PATCH 49/81] Added support for sending multiple datarefs to the MATLAB client. --- MATLAB/+XPlaneConnect/XPlaneConnect.jar | Bin 6821 -> 7035 bytes MATLAB/+XPlaneConnect/sendDREF.m | 34 +++++----------------- MATLAB/+XPlaneConnect/sendDREFs.m | 37 ++++++++++++++++++++++++ 3 files changed, 44 insertions(+), 27 deletions(-) create mode 100644 MATLAB/+XPlaneConnect/sendDREFs.m diff --git a/MATLAB/+XPlaneConnect/XPlaneConnect.jar b/MATLAB/+XPlaneConnect/XPlaneConnect.jar index 755bb2935c7c642d34542cded39df7ee6558f8a8..e4c0af51c2433fa6c376180c7268507b1f57c6bf 100644 GIT binary patch delta 5945 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 bc&A3!q`sV%761S*ER$OrL delta 5730 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 Uz!d-hkSdcg8$ Date: Thu, 7 May 2015 15:22:27 -0700 Subject: [PATCH 50/81] Fixed bug in validation check order of DataManager::SetGear --- xpcPlugin/DataManager.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/xpcPlugin/DataManager.cpp b/xpcPlugin/DataManager.cpp index 178ac47..cb9ec3b 100644 --- a/xpcPlugin/DataManager.cpp +++ b/xpcPlugin/DataManager.cpp @@ -671,18 +671,18 @@ namespace XPC #if LOG_VERBOSITY > 3 Log::FormatLine("[DMAN] Setting gear (value:%f, immediate:%i) for aircraft %i", gear, immediate, aircraft); #endif - if (isnan(gear) || gear < 0 || gear > 1) - { -#if LOG_VERBOSITY > 0 - Log::WriteLine("[GEAR] ERROR: Value must be 0 or 1"); -#endif - return; - } if ((gear < -8.5 && gear > -9.5) || (gear < -997.9 && gear > -999.1)) { return; } + if (isnan(gear) || gear < 0 || gear > 1) + { +#if LOG_VERBOSITY > 1 + Log::WriteLine("[GEAR] ERROR: Value must be 0 or 1"); +#endif + return; + } float gearArray[10]; for (int i = 0; i < 10; i++) From 386adba5616fbcd0812e27bc20208199799a4640 Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Thu, 7 May 2015 15:34:45 -0700 Subject: [PATCH 51/81] Removed Docs folder. All information contained there is superseded by the GitHub wiki. --- Docs/Capability Matrix.xlsx | Bin 29406 -> 0 bytes Docs/Interface Control Document.xlsx | Bin 155106 -> 0 bytes Docs/PBS.pdf | Bin 78989 -> 0 bytes 3 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 Docs/Capability Matrix.xlsx delete mode 100644 Docs/Interface Control Document.xlsx delete mode 100644 Docs/PBS.pdf diff --git a/Docs/Capability Matrix.xlsx b/Docs/Capability Matrix.xlsx deleted file mode 100644 index 4809af991c23adde213321e394d02fd0fb2ed798..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29406 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 Qh$jwf09ZljH2>Q_0dr(y7ytkO diff --git a/Docs/Interface Control Document.xlsx b/Docs/Interface Control Document.xlsx deleted file mode 100644 index c989b60bdaa0f23d2d4c006ea61efbf9e58a607d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 155106 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 TKwyDC-QWpzcn$E|590p-ymZBR diff --git a/Docs/PBS.pdf b/Docs/PBS.pdf deleted file mode 100644 index cc5ad0553dcda80c71c6cce49548cefd6de5996d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 78989 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 From 835f1e6527d360ea509f5b72961337b794b27eed Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Fri, 8 May 2015 09:03:23 -0700 Subject: [PATCH 52/81] Added support for the VIEW command to the plugin. - The VIEW command allows clients to change the camera position in X-Plane. --- xpcPlugin/MessageHandlers.cpp | 39 +++++++++++++++++++++++++++++++++-- xpcPlugin/MessageHandlers.h | 1 + 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/xpcPlugin/MessageHandlers.cpp b/xpcPlugin/MessageHandlers.cpp index 1a94bf3..37c7e71 100644 --- a/xpcPlugin/MessageHandlers.cpp +++ b/xpcPlugin/MessageHandlers.cpp @@ -1,10 +1,26 @@ //Copyright (c) 2013-2015 United States Government as represented by the Administrator of the //National Aeronautics and Space Administration. All Rights Reserved. +// +//X-Plane API +//Copyright(c) 2008, Sandy Barbour and Ben Supnik All rights reserved. +//Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +//associated documentation files(the "Software"), to deal in the Software without restriction, +//including without limitation the rights to use, copy, modify, merge, publish, distribute, +//sublicense, and / or sell copies of the Software, and to permit persons to whom the Software is +//furnished to do so, subject to the following conditions : +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// * Neither the names of the authors nor that of X - Plane or Laminar Research +// may be used to endorse or promote products derived from this software +// without specific prior written permission from the authors or +// Laminar Research, respectively. #include "MessageHandlers.h" #include "DataManager.h" #include "Drawing.h" #include "Log.h" +#include "XPLMUtilities.h" + #include #include @@ -36,8 +52,7 @@ namespace XPC handlers.insert(std::make_pair("SIMU", MessageHandlers::HandleSimu)); handlers.insert(std::make_pair("TEXT", MessageHandlers::HandleText)); handlers.insert(std::make_pair("WYPT", MessageHandlers::HandleWypt)); - // Not implemented messages - handlers.insert(std::make_pair("VIEW", MessageHandlers::HandleUnknown)); + handlers.insert(std::make_pair("VIEW", MessageHandlers::HandleView)); // X-Plane data messages handlers.insert(std::make_pair("DSEL", MessageHandlers::HandleXPlaneData)); handlers.insert(std::make_pair("USEL", MessageHandlers::HandleXPlaneData)); @@ -623,6 +638,26 @@ namespace XPC } } + void MessageHandlers::HandleView(Message& msg) + { + // Update Log +#if LOG_VERBOSITY > 0 + Log::FormatLine("[VIEW] Message Received (Conn %i)", connection.id); +#endif + + const std::size_t size = msg.GetSize(); + if (size != 9) + { +#if LOG_VERBOSITY > 1 + Log::FormatLine("[VIEW] Error: Unexpected length. Message was %d bytes, expected 9.", size); +#endif + return; + } + const unsigned char* buffer = msg.GetBuffer(); + int type = *((int*)(buffer + 5)); + XPLMCommandKeyStroke(type); + } + void MessageHandlers::HandleWypt(Message& msg) { // Update Log diff --git a/xpcPlugin/MessageHandlers.h b/xpcPlugin/MessageHandlers.h index b7cfd25..123c39a 100644 --- a/xpcPlugin/MessageHandlers.h +++ b/xpcPlugin/MessageHandlers.h @@ -46,6 +46,7 @@ namespace XPC static void HandleSimu(Message& msg); static void HandleText(Message& msg); static void HandleWypt(Message& msg); + static void HandleView(Message& msg); static void HandleXPlaneData(Message& msg); static void HandleUnknown(Message& msg); From 579cad0655c4ba47ab6d10040f741997ed66dd2d Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Fri, 8 May 2015 13:09:34 -0700 Subject: [PATCH 53/81] Added support for VIEW command to the C client. --- C/src/xplaneConnect.c | 31 +++++++++-- C/src/xplaneConnect.h | 24 +++++++++ TestScripts/C Tests.win/CTests.vcxproj | 1 + TestScripts/C Tests/ViewTests.h | 73 ++++++++++++++++++++++++++ TestScripts/C Tests/main.c | 5 ++ 5 files changed, 131 insertions(+), 3 deletions(-) create mode 100644 TestScripts/C Tests/ViewTests.h diff --git a/C/src/xplaneConnect.c b/C/src/xplaneConnect.c index 74b098d..f6f0a5d 100755 --- a/C/src/xplaneConnect.c +++ b/C/src/xplaneConnect.c @@ -48,9 +48,6 @@ #include #include - - - void printError(char *functionName, char *format, ...) { va_list args; @@ -694,3 +691,31 @@ int sendWYPT(XPCSocket sock, WYPT_OP op, float points[], int count) /*****************************************************************************/ /**** End Drawing functions ****/ /*****************************************************************************/ + +/*****************************************************************************/ +/**** View functions ****/ +/*****************************************************************************/ +int sendVIEW(XPCSocket sock, VIEW_TYPE view) +{ + // Validate Input + if (view < XPC_VIEW_FORWARDS || view > XPC_VIEW_FULLSCREENNOHUD) + { + printError("sendVIEW", "Unrecognized view"); + return -1; + } + + // Setup Command + char buffer[9] = "VIEW"; + *((int*)(buffer + 5)) = view; + + // Send Command + if (sendUDP(sock, buffer, 9) < 0) + { + printError("sendVIEW", "Failed to send command"); + return -2; + } + return 0; +} +/*****************************************************************************/ +/**** End View functions ****/ +/*****************************************************************************/ \ No newline at end of file diff --git a/C/src/xplaneConnect.h b/C/src/xplaneConnect.h index 391ec54..3827a68 100644 --- a/C/src/xplaneConnect.h +++ b/C/src/xplaneConnect.h @@ -61,6 +61,23 @@ typedef enum XPC_WYPT_DEL = 2, XPC_WYPT_CLR = 3 } WYPT_OP; + +typedef enum +{ + XPC_VIEW_FORWARDS = 73, + XPC_VIEW_DOWN, + XPC_VIEW_LEFT, + XPC_VIEW_RIGHT, + XPC_VIEW_BACK, + XPC_VIEW_TOWER, + XPC_VIEW_RUNWAY, + XPC_VIEW_CHASE, + XPC_VIEW_FOLLOW, + XPC_VIEW_FOLLOWWITHPANEL, + XPC_VIEW_SPOT, + XPC_VIEW_FULLSCREENWITHHUD, + XPC_VIEW_FULLSCREENNOHUD, +} VIEW_TYPE; // Low Level UDP Functions @@ -214,6 +231,13 @@ int sendCTRL(XPCSocket sock, float values[], int size, char ac); /// \returns 0 if successful, otherwise a negative value. int sendTEXT(XPCSocket sock, char* msg, int x, int y); +/// Sets the camera view in X-Plane. +/// +/// \param sock The socket to use to send the command. +/// \param view The view to use. +/// \returns 0 if successful, otherwise a negative value. +int sendVIEW(XPCSocket sock, VIEW_TYPE view); + /// Adds, removes, or clears a set of waypoints. If the command is clear, the points are ignored /// and all points are removed. /// diff --git a/TestScripts/C Tests.win/CTests.vcxproj b/TestScripts/C Tests.win/CTests.vcxproj index b546a64..6c55744 100644 --- a/TestScripts/C Tests.win/CTests.vcxproj +++ b/TestScripts/C Tests.win/CTests.vcxproj @@ -33,6 +33,7 @@ + diff --git a/TestScripts/C Tests/ViewTests.h b/TestScripts/C Tests/ViewTests.h new file mode 100644 index 0000000..a25c14f --- /dev/null +++ b/TestScripts/C Tests/ViewTests.h @@ -0,0 +1,73 @@ +//Copyright (c) 2013-2015 United States Government as represented by the Administrator of the +//National Aeronautics and Space Administration. All Rights Reserved. +#ifndef VIEWTESTS_H +#define VIEWTESTS_H + +#include "Test.h" +#include "xplaneConnect.h" + +typedef enum +{ + XPC_VDREF_FORWARDS = 1000, + XPC_VDREF_DOWN4 = 1001, + XPC_VDREF_DOWN8 = 1002, + XPC_VDREF_LEFT45 = 1004, + XPC_VDREF_RIGHT45 = 1005, + XPC_VDREF_LEFT90 = 1006, + XPC_VDREF_RIGHT90 = 1007, + XPC_VDREF_LEFT135 = 1008, + XPC_VDREF_RIGHT135 = 1009, + XPC_VDREF_BACKWARD = 1010, + XPC_VDREF_LEFTUP = 1011, + XPC_VDREF_RIGHTUP = 1012, + XPC_VDREF_AIRPORTBEACONTOWER = 1014, + XPC_VDREF_ONRUNWAY = 1015, + XPC_VDREF_CHASE = 1017, + XPC_VDREF_FOLLOW = 1018, + XPC_VDREF_FOLLOWWITHPANEL = 1019, + XPC_VDREF_SPOT = 1020, + XPC_VDREF_SPOTMOVING = 1021, + XPC_VDREF_FULLSCREENWITHHUD = 1023, + XPC_VDREF_FULLSCREENNOHUD = 1024, + XPC_VDREF_STRAIGHTDOWN = 1025, + XPC_VDREF_3DCOCKPIT = 1026 +} VIEW_DREF; + +int doViewTest(VIEW_TYPE viewCommand, VIEW_DREF viewResult) +{ + // Setup + char* dref = "sim/graphics/view/view_type"; + float value; + int size = 1; + + // Execute command + XPCSocket sock = openUDP(IP); + int result = sendVIEW(sock, viewCommand); + if (result >= 0) + { + result = getDREF(sock, dref, &value, &size); + } + closeUDP(sock); + if (result < 0) + { + return -1; + } + + if ((int)value != viewResult) + { + return -2; + } + return 0; +} + +int testView() +{ + int result = doViewTest(XPC_VIEW_FORWARDS, XPC_VDREF_FORWARDS); + if (result < 0) + { + return -1; + } + + return doViewTest(XPC_VIEW_CHASE, XPC_VDREF_CHASE); +} +#endif \ No newline at end of file diff --git a/TestScripts/C Tests/main.c b/TestScripts/C Tests/main.c index ae01451..0f5cdd9 100644 --- a/TestScripts/C Tests/main.c +++ b/TestScripts/C Tests/main.c @@ -8,6 +8,7 @@ #include "PosiTests.h" #include "DataTests.h" #include "TextTests.h" +#include "ViewTests.h" #include "WyptTests.h" int main(int argc, const char * argv[]) @@ -48,10 +49,14 @@ int main(int argc, const char * argv[]) runTest(testTEXT, "TEXT"); // Waypoints runTest(testWYPT, "WYPT"); + // View + runTest(testView, "VIEW"); // setConn runTest(testCONN, "CONN"); printf( "----------------\nTest Summary\n\tFailed: %i\n\tPassed: %i\n", testFailed, testPassed ); + printf("Press any key to exit."); + getchar(); return 0; } From 039c92b2f15ec5e94ec391aa68bcd7b454f260f3 Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Fri, 8 May 2015 13:34:32 -0700 Subject: [PATCH 54/81] Added support for VIEW command to Python client. --- Python/src/xpc.py | 32 +++++++++++++++++++++++++++++++ TestScripts/Python Tests/Tests.py | 16 ++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/Python/src/xpc.py b/Python/src/xpc.py index 32b4d3c..c19bbdb 100644 --- a/Python/src/xpc.py +++ b/Python/src/xpc.py @@ -326,6 +326,23 @@ class XPlaneConnect(object): buffer = struct.pack("<4sxiiB" + str(msgLen) + "s", "TEXT", x, y, msgLen, msg) self.sendUDP(buffer) + def sendVIEW(self, view): + '''Sets the camera view in X-Plane + + Args: + view: The view to use. The ViewType class provides named constants + for known views. + ''' + # Preconditions + if view < ViewType.Forwards or view > ViewType.FullscreenNoHud: + raise ValueError("Unknown view command.") + + # Pack buffer + buffer = struct.pack("<4sxi", "VIEW", view) + + # Send message + self.sendUDP(buffer) + def sendWYPT(self, op, points): '''Adds, removes, or clears waypoints. Waypoints are three dimensional points on or above the Earth's surface that are represented visually in the simulator. Each @@ -350,3 +367,18 @@ class XPlaneConnect(object): else: buffer = struct.pack("<4sxBB" + str(len(points)) + "f", "WYPT", op, len(points), *points) self.sendUDP(buffer) + +class ViewType(object): + Forwards = 73 + Down = 74 + Left = 75 + Right = 76 + Back = 77 + Tower = 78 + Runway = 79 + Chase = 80 + Follow = 81 + FollowWithPanel = 82 + Spot = 83 + FullscreenWithHud = 84 + FullscreenNoHud = 85 diff --git a/TestScripts/Python Tests/Tests.py b/TestScripts/Python Tests/Tests.py index 558aa7c..2cdc825 100644 --- a/TestScripts/Python Tests/Tests.py +++ b/TestScripts/Python Tests/Tests.py @@ -319,6 +319,22 @@ class XPCTests(unittest.TestCase): # Cleanup client.close() + def test_sendView(self): + # Setup + dref = "sim/graphics/view/view_type" + fwd = 1000 + chase = 1017 + + #Execution + with xpc.XPlaneConnect() as client: + client.sendVIEW(xpc.ViewType.Forwards) + result = client.getDREF(dref) + self.assertAlmostEqual(fwd, result[0], 1e-4) + client.sendVIEW(xpc.ViewType.Chase) + result = client.getDREF(dref) + self.assertAlmostEqual(chase, result[0], 1e-4) + + def test_sendWYPT(self): # Setup client = xpc.XPlaneConnect() From 255877eee362675210a8df655706195d8edef483 Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Fri, 8 May 2015 13:57:16 -0700 Subject: [PATCH 55/81] Added support for VIEW command to Java client. --- Java/src/ViewType.java | 60 +++++++++++++++++++ Java/src/XPlaneConnect.java | 20 +++++++ TestScripts/Java Tests/XPlaneConnectTest.java | 21 +++++++ 3 files changed, 101 insertions(+) create mode 100644 Java/src/ViewType.java diff --git a/Java/src/ViewType.java b/Java/src/ViewType.java new file mode 100644 index 0000000..2f24c3d --- /dev/null +++ b/Java/src/ViewType.java @@ -0,0 +1,60 @@ +//NOTICES: +// Copyright ã 2013-2015 United States Government as represented by the Administrator of the +// National Aeronautics and Space Administration. All Rights Reserved. +// +// DISCLAIMERS +// No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY OF ANY KIND, +// EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, ANY WARRANTY THAT THE +// SUBJECT SOFTWARE WILL CONFORM TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE SUBJECT +// SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, IF PROVIDED, WILL CONFORM TO +// THE SUBJECT SOFTWARE. THIS AGREEMENT DOES NOT, IN ANY MANNER, CONSTITUTE AN ENDORSEMENT BY +// GOVERNMENT AGENCY OR ANY PRIOR RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, +// SOFTWARE PRODUCTS OR ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT SOFTWARE. +// FURTHER, GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND LIABILITIES REGARDING THIRD-PARTY +// SOFTWARE, IF PRESENT IN THE ORIGINAL SOFTWARE, AND DISTRIBUTES IT "AS IS." +// +// Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS AGAINST THE UNITED STATES +// GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT. IF +// RECIPIENT'S USE OF THE SUBJECT SOFTWARE RESULTS IN ANY LIABILITIES, DEMANDS, DAMAGES, +// EXPENSES OR LOSSES ARISING FROM SUCH USE, INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR +// RESULTING FROM, RECIPIENT'S USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL INDEMNIFY AND HOLD +// HARMLESS THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, AS WELL AS ANY +// PRIOR RECIPIENT, TO THE EXTENT PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY FOR ANY SUCH MATTER +// SHALL BE THE IMMEDIATE, UNILATERAL TERMINATION OF THIS AGREEMENT. +package gov.nasa.xpc; + +/** + * Represents a camera view in X-Plane + * + * @author Jason Watkins + * @version 1.1 + * @since 2015-05-08 + */ +public enum ViewType +{ + Forwards(73), + Down(74), + Left(75), + Right(76), + Back(77), + Tower(78), + Runway(79), + Chase(80), + Follow(81), + FollowWithPanel(82), + Spot(83), + FullscreenWithHud(84), + FullscreenNoHud(85); + + private final int value; + private ViewType(int value) + { + this.value = value; + } + + public int getValue() + { + return value; + } +} diff --git a/Java/src/XPlaneConnect.java b/Java/src/XPlaneConnect.java index 2e1f336..ba545d5 100644 --- a/Java/src/XPlaneConnect.java +++ b/Java/src/XPlaneConnect.java @@ -720,6 +720,26 @@ public class XPlaneConnect implements AutoCloseable sendUDP(os.toByteArray()); } + /** + * Sets the camera view in X-Plane. + * + * @param view The view to use. + * @throws IOException If the command cannot be sent. + */ + public void sendVIEW(ViewType view) throws IOException + { + ByteBuffer bb = ByteBuffer.allocate(4); + bb.order(ByteOrder.LITTLE_ENDIAN); + bb.putInt(view.getValue()); + + //Build and send message + ByteArrayOutputStream os = new ByteArrayOutputStream(); + os.write("VIEW".getBytes(StandardCharsets.UTF_8)); + os.write(0xFF); //Placeholder for message length + os.write(bb.array()); + sendUDP(os.toByteArray()); + } + /** * Adds, removes, or clears a set of waypoints. If the command is clear, the points are ignored * and all points are removed. diff --git a/TestScripts/Java Tests/XPlaneConnectTest.java b/TestScripts/Java Tests/XPlaneConnectTest.java index e3caba5..fc7c76e 100644 --- a/TestScripts/Java Tests/XPlaneConnectTest.java +++ b/TestScripts/Java Tests/XPlaneConnectTest.java @@ -1,5 +1,6 @@ package gov.nasa.xpc.test; +import gov.nasa.xpc.ViewType; import gov.nasa.xpc.WaypointOp; import gov.nasa.xpc.XPlaneConnect; @@ -677,4 +678,24 @@ public class XPlaneConnectTest fail(); } } + + @Test + public void testSendView() throws IOException + { + String dref = "sim/graphics/view/view_type"; + float fwd = 1000; + float chase = 1017; + + try(XPlaneConnect xpc = new XPlaneConnect()) + { + xpc.sendVIEW(ViewType.Forwards); + float result = xpc.getDREF(dref)[0]; + assertEquals(fwd, result, 1e-4); + + xpc.sendVIEW(ViewType.Chase); + result = xpc.getDREF(dref)[0]; + assertEquals(chase, result, 1e-4); + } + + } } \ No newline at end of file From 60795b10a53077ad885d6e0715d8211d0acd5df7 Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Fri, 8 May 2015 14:37:58 -0700 Subject: [PATCH 56/81] Added support for VIEW command in MATLAB client. --- MATLAB/+XPlaneConnect/XPlaneConnect.jar | Bin 7035 -> 8294 bytes MATLAB/+XPlaneConnect/sendVIEW.m | 35 ++++++++++++++++++++++++ TestScripts/MATLAB Tests/sendVIEWTest.m | 26 ++++++++++++++++++ TestScripts/MATLAB Tests/tests.m | 1 + 4 files changed, 62 insertions(+) create mode 100644 MATLAB/+XPlaneConnect/sendVIEW.m create mode 100644 TestScripts/MATLAB Tests/sendVIEWTest.m diff --git a/MATLAB/+XPlaneConnect/XPlaneConnect.jar b/MATLAB/+XPlaneConnect/XPlaneConnect.jar index e4c0af51c2433fa6c376180c7268507b1f57c6bf..c7797111c75228c2b0d16de3685d4e7e92acf838 100644 GIT binary patch delta 7235 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 delta 6005 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 diff --git a/MATLAB/+XPlaneConnect/sendVIEW.m b/MATLAB/+XPlaneConnect/sendVIEW.m new file mode 100644 index 0000000..d95814c --- /dev/null +++ b/MATLAB/+XPlaneConnect/sendVIEW.m @@ -0,0 +1,35 @@ +function sendVIEW(view, socket) +% sendVIEW Sets the camera +% +%Inputs +% view: The view to use. +% socket (optional): The client to use when sending the command. +% +%Use +% 1. import XPlaneConnect.*; +% 2. sendView(Forwards); +% +% Contributors +% [JW] Jason Watkins + +import XPlaneConnect.* + +%% Get client +global clients; +if ~exist('socket', 'var') + assert(isequal(length(clients) < 2, 1), '[pauseSim] ERROR: Multiple clients open. You must specify which client to use.'); + if isempty(clients) + socket = openUDP(); + else + socket = clients(1); + end +end + +%% Validate input + + +%% Send command +socket.sendVIEW(view) + +end + diff --git a/TestScripts/MATLAB Tests/sendVIEWTest.m b/TestScripts/MATLAB Tests/sendVIEWTest.m new file mode 100644 index 0000000..4cfe29c --- /dev/null +++ b/TestScripts/MATLAB Tests/sendVIEWTest.m @@ -0,0 +1,26 @@ +function sendVIEWTest() +%% Setup +addpath('../../MATLAB') +import XPlaneConnect.* + +if ~exist('gov.nasa.xpc.ViewType', 'class') + [folder, ~, ~] = fileparts(which('XPlaneConnect.openUDP')); + javaaddpath(fullfile(folder, 'XPlaneConnect.jar')); +end + +dref = 'sim/graphics/view/view_type'; +fwd = 1000; +chase = 1017; + +%% Excecute +sendVIEW(gov.nasa.xpc.ViewType.Forwards); +result = getDREFs(dref); +assert(isequal(result, fwd)) + +sendVIEW(gov.nasa.xpc.ViewType.Chase); +result = getDREFs(dref); +assert(isequal(result, chase)) + + +end + diff --git a/TestScripts/MATLAB Tests/tests.m b/TestScripts/MATLAB Tests/tests.m index 6871686..11c8800 100644 --- a/TestScripts/MATLAB Tests/tests.m +++ b/TestScripts/MATLAB Tests/tests.m @@ -18,6 +18,7 @@ theTests = {{@openCloseTest, 'Open/Close Test', 0},... {@CTRLTest,'CTRL Test', 0},... {@POSITest,'POSI Test', 0},... {@sendWYPTTest,'WYPT Test', 0},... + {@sendVIEWTest,'VIEW Test', 0},... {@pauseTest,'Pause Test', 0},... {@setConnTest, 'setConn Test', 0}}; From ceba58045049d771d7db726b5bcc63a92b519b2a Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Fri, 8 May 2015 15:18:24 -0700 Subject: [PATCH 57/81] Addressed issues found by Google code lint. Fixed: - Removed trailing whitespace. - Removed out of date TODO's. - Added #include to DataManager.cpp - Reordered includes to include C system headers before C++ system headers. - Added username to TODO's - Renamed include guards to use full project name as prefix. - Made methods and parameters const where possible. - Made UDPSocket constructor explicit. Won't Fix: - snprintf is introduced in C++11. - Trailing comments at the end of namespace & header guards - Did not re-inlude headers already included by the matching XPC header. - localtime is fine since X-Plane is not multithreaded at all on the plugin side. - Linter confuses #elif with parens as a function call. - namespace indentation --- xpcPlugin/DataManager.cpp | 4 ++-- xpcPlugin/DataManager.h | 4 ++-- xpcPlugin/Drawing.h | 4 ++-- xpcPlugin/Log.cpp | 5 +++-- xpcPlugin/Log.h | 4 ++-- xpcPlugin/Message.cpp | 16 ++++++++-------- xpcPlugin/Message.h | 18 +++++++++--------- xpcPlugin/MessageHandlers.cpp | 28 ++++++++++++++-------------- xpcPlugin/MessageHandlers.h | 30 +++++++++++++++--------------- xpcPlugin/UDPSocket.cpp | 8 ++++---- xpcPlugin/UDPSocket.h | 12 ++++++------ xpcPlugin/XPCPlugin.cpp | 19 ++++++++++--------- 12 files changed, 77 insertions(+), 75 deletions(-) diff --git a/xpcPlugin/DataManager.cpp b/xpcPlugin/DataManager.cpp index cb9ec3b..4a2bd97 100644 --- a/xpcPlugin/DataManager.cpp +++ b/xpcPlugin/DataManager.cpp @@ -20,6 +20,7 @@ #include "XPLMDataAccess.h" #include "XPLMGraphics.h" +#include #include #include #include @@ -516,7 +517,7 @@ namespace XPC drefSize = min(drefSize, size); XPLMSetDatavf(xdref, values, 0, drefSize); } - + void DataManager::Set(DREF dref, int values[], int size, char aircraft) { const XPLMDataRef& xdref = aircraft == 0 ? drefs[dref] : mdrefs[aircraft][dref]; @@ -738,7 +739,6 @@ namespace XPC Set(DREF_LocalY, local[1], aircraft); Set(DREF_LocalZ, local[2], aircraft); // If the sim is unpaused, this will override the above settings. - // TODO: Are these setable when paused? Are these necessary? Set(DREF_Latitude, (double)pos[0], aircraft); Set(DREF_Longitude, (double)pos[1], aircraft); Set(DREF_Elevation, (double)pos[2], aircraft); diff --git a/xpcPlugin/DataManager.h b/xpcPlugin/DataManager.h index 74010d2..1bb7ffb 100644 --- a/xpcPlugin/DataManager.h +++ b/xpcPlugin/DataManager.h @@ -1,7 +1,7 @@ //Copyright (c) 2013-2015 United States Government as represented by the Administrator of the //National Aeronautics and Space Administration. All Rights Reserved. -#ifndef XPC_DATAMANAGER_H -#define XPC_DATAMANAGER_H +#ifndef XPCPLUGIN_DATAMANAGER_H_ +#define XPCPLUGIN_DATAMANAGER_H_ #include diff --git a/xpcPlugin/Drawing.h b/xpcPlugin/Drawing.h index d24b2bf..ce1573a 100644 --- a/xpcPlugin/Drawing.h +++ b/xpcPlugin/Drawing.h @@ -1,7 +1,7 @@ //Copyright (c) 2013-2015 United States Government as represented by the Administrator of the //National Aeronautics and Space Administration. All Rights Reserved. -#ifndef XPC_DRAWING_H -#define XPC_DRAWING_H +#ifndef XPCPLUGIN_DRAWING_H_ +#define XPCPLUGIN_DRAWING_H_ #include diff --git a/xpcPlugin/Log.cpp b/xpcPlugin/Log.cpp index 6afc271..2266e99 100644 --- a/xpcPlugin/Log.cpp +++ b/xpcPlugin/Log.cpp @@ -4,10 +4,11 @@ #include "XPLMUtilities.h" -#include #include #include #include + +#include #include #include @@ -33,7 +34,7 @@ namespace XPC << std::setw(2) << tm->tm_min << ":" << std::setw(2) << tm->tm_sec << "." << std::setw(3) << ms.count() << "]"; - + std::fprintf(fd, ss.str().c_str()); } diff --git a/xpcPlugin/Log.h b/xpcPlugin/Log.h index b7413c1..6887eb9 100644 --- a/xpcPlugin/Log.h +++ b/xpcPlugin/Log.h @@ -1,7 +1,7 @@ //Copyright (c) 2013-2015 United States Government as represented by the Administrator of the //National Aeronautics and Space Administration. All Rights Reserved. -#ifndef XPC_LOG_H -#define XPC_LOG_H +#ifndef XPCPLUGIN_LOG_H_ +#define XPCPLUGIN_LOG_H_ #include // LOG_VERBOSITY determines the level of logging throughout the plugin. diff --git a/xpcPlugin/Message.cpp b/xpcPlugin/Message.cpp index 3221a8f..2f8f7e3 100644 --- a/xpcPlugin/Message.cpp +++ b/xpcPlugin/Message.cpp @@ -11,15 +11,15 @@ namespace XPC { Message::Message() {} - Message Message::ReadFrom(UDPSocket& sock) + Message Message::ReadFrom(const UDPSocket& sock) { Message m; int len = sock.Read(m.buffer, bufferSize, &m.source); m.size = len < 0 ? 0 : len; return m; } - - unsigned long Message::GetMagicNumber() + + unsigned long Message::GetMagicNumber() const { if (size < 4) { @@ -28,7 +28,7 @@ namespace XPC return *((unsigned long*)buffer); } - std::string Message::GetHead() + std::string Message::GetHead() const { if (size < 4) { @@ -37,7 +37,7 @@ namespace XPC return std::string((char*)buffer, 4); } - const unsigned char* Message::GetBuffer() + const unsigned char* Message::GetBuffer() const { if (size == 0) { @@ -46,17 +46,17 @@ namespace XPC return buffer; } - std::size_t Message::GetSize() + std::size_t Message::GetSize() const { return size; } - struct sockaddr Message::GetSource() + struct sockaddr Message::GetSource() const { return source; } - void Message::PrintToLog() + void Message::PrintToLog() const { #if LOG_VERBOSITY > 4 std::stringstream ss; diff --git a/xpcPlugin/Message.h b/xpcPlugin/Message.h index b44b41d..56352f6 100644 --- a/xpcPlugin/Message.h +++ b/xpcPlugin/Message.h @@ -1,7 +1,7 @@ //Copyright (c) 2013-2015 United States Government as represented by the Administrator of the //National Aeronautics and Space Administration. All Rights Reserved. -#ifndef XPC_MESSAGE_H -#define XPC_MESSAGE_H +#ifndef XPCPLUGIN_MESSAGE_H_ +#define XPCPLUGIN_MESSAGE_H_ #include "UDPSocket.h" @@ -24,25 +24,25 @@ namespace XPC /// \returns A message parsed from the data read from sock. If no /// data was read or an error occurs, returns a message /// with the size set to 0. - static Message ReadFrom(UDPSocket& sock); + static Message ReadFrom(const UDPSocket& sock); /// Gets the message header in binary form. - unsigned long GetMagicNumber(); + unsigned long GetMagicNumber() const; /// Gets the message header. - std::string GetHead(); + std::string GetHead() const; /// Gets the buffer underlying the message. - const unsigned char* GetBuffer(); + const unsigned char* GetBuffer() const; /// Gets the size of the message in bytes. - std::size_t GetSize(); + std::size_t GetSize() const; /// Gets the address this message was read from. - struct sockaddr GetSource(); + struct sockaddr GetSource() const; /// Prints the contents of the message to the XPC log. - void PrintToLog(); + void PrintToLog() const; private: Message(); diff --git a/xpcPlugin/MessageHandlers.cpp b/xpcPlugin/MessageHandlers.cpp index 37c7e71..281d59f 100644 --- a/xpcPlugin/MessageHandlers.cpp +++ b/xpcPlugin/MessageHandlers.cpp @@ -113,7 +113,7 @@ namespace XPC connection.id, connectionKey.c_str()); #endif } - + // Check if there is a handler for this message type. If so, execute // that handler. Otherwise, execute the unknown message handler. std::map::iterator iter = handlers.find(head); @@ -128,7 +128,7 @@ namespace XPC } } - void MessageHandlers::HandleConn(Message& msg) + void MessageHandlers::HandleConn(const Message& msg) { const unsigned char* buffer = msg.GetBuffer(); @@ -173,7 +173,7 @@ namespace XPC sock->SendTo(response, 6, &connection.addr); } - void MessageHandlers::HandleCtrl(Message& msg) + void MessageHandlers::HandleCtrl(const Message& msg) { // Update Log #if LOG_VERBOSITY > 2 @@ -252,7 +252,7 @@ namespace XPC } } - void MessageHandlers::HandleData(Message& msg) + void MessageHandlers::HandleData(const Message& msg) { // Parse data const unsigned char* buffer = msg.GetBuffer(); @@ -402,7 +402,7 @@ namespace XPC DREF dref = XPData[dataRef][j]; if (dref == DREF_None) { - // TODO: Send single line instead! + // TODO(jason): Send single line instead! HandleXPlaneData(msg); } else @@ -415,7 +415,7 @@ namespace XPC } } - void MessageHandlers::HandleDref(Message& msg) + void MessageHandlers::HandleDref(const Message& msg) { #if LOG_VERBOSITY >= 3 Log::FormatLine("[DREF] Request to set DREF value received (Conn %i)", connection.id); @@ -454,7 +454,7 @@ namespace XPC #endif } - void MessageHandlers::HandleGetD(Message& msg) + void MessageHandlers::HandleGetD(const Message& msg) { const unsigned char* buffer = msg.GetBuffer(); unsigned char drefCount = buffer[5]; @@ -504,7 +504,7 @@ namespace XPC sock->SendTo(response, cur, &connection.addr); } - void MessageHandlers::HandlePosi(Message& msg) + void MessageHandlers::HandlePosi(const Message& msg) { // Update log #if LOG_VERBOSITY > 0 @@ -548,7 +548,7 @@ namespace XPC } } - void MessageHandlers::HandleSimu(Message& msg) + void MessageHandlers::HandleSimu(const Message& msg) { // Update log #if LOG_VERBOSITY > 1 @@ -600,7 +600,7 @@ namespace XPC #endif } - void MessageHandlers::HandleText(Message& msg) + void MessageHandlers::HandleText(const Message& msg) { // Update Log #if LOG_VERBOSITY > 0 @@ -638,7 +638,7 @@ namespace XPC } } - void MessageHandlers::HandleView(Message& msg) + void MessageHandlers::HandleView(const Message& msg) { // Update Log #if LOG_VERBOSITY > 0 @@ -658,7 +658,7 @@ namespace XPC XPLMCommandKeyStroke(type); } - void MessageHandlers::HandleWypt(Message& msg) + void MessageHandlers::HandleWypt(const Message& msg) { // Update Log #if LOG_VERBOSITY > 0 @@ -702,7 +702,7 @@ namespace XPC } } - void MessageHandlers::HandleXPlaneData(Message& msg) + void MessageHandlers::HandleXPlaneData(const Message& msg) { #if LOG_VERBOSITY > 1 Log::WriteLine("[MSGH] Sending raw data to X-Plane"); @@ -714,7 +714,7 @@ namespace XPC sock->SendTo(msg.GetBuffer(), msg.GetSize(), (sockaddr*)&loopback); } - void MessageHandlers::HandleUnknown(Message& msg) + void MessageHandlers::HandleUnknown(const Message& msg) { // UPDATE LOG #if LOG_VERBOSITY > 0 diff --git a/xpcPlugin/MessageHandlers.h b/xpcPlugin/MessageHandlers.h index 123c39a..57ab2f6 100644 --- a/xpcPlugin/MessageHandlers.h +++ b/xpcPlugin/MessageHandlers.h @@ -1,7 +1,7 @@ //Copyright (c) 2013-2015 United States Government as represented by the Administrator of the //National Aeronautics and Space Administration. All Rights Reserved. -#ifndef XPC_MESSAGEHANDLERS_H -#define XPC_MESSAGEHANDLERS_H +#ifndef XPCPLUGIN_MESSAGEHANDLERS_H_ +#define XPCPLUGIN_MESSAGEHANDLERS_H_ #include "Message.h" #include @@ -10,7 +10,7 @@ namespace XPC { /// A function that handles a message. - typedef void(*MessageHandler)(Message&); + typedef void(*MessageHandler)(const Message&); /// Handles incommming messages and manages connections. /// @@ -37,18 +37,18 @@ namespace XPC static void SetSocket(UDPSocket* socket); private: - static void HandleConn(Message& msg); - static void HandleCtrl(Message& msg); - static void HandleData(Message& msg); - static void HandleDref(Message& msg); - static void HandleGetD(Message& msg); - static void HandlePosi(Message& msg); - static void HandleSimu(Message& msg); - static void HandleText(Message& msg); - static void HandleWypt(Message& msg); - static void HandleView(Message& msg); - static void HandleXPlaneData(Message& msg); - static void HandleUnknown(Message& msg); + static void HandleConn(const Message& msg); + static void HandleCtrl(const Message& msg); + static void HandleData(const Message& msg); + static void HandleDref(const Message& msg); + static void HandleGetD(const Message& msg); + static void HandlePosi(const Message& msg); + static void HandleSimu(const Message& msg); + static void HandleText(const Message& msg); + static void HandleWypt(const Message& msg); + static void HandleView(const Message& msg); + static void HandleXPlaneData(const Message& msg); + static void HandleUnknown(const Message& msg); typedef struct { diff --git a/xpcPlugin/UDPSocket.cpp b/xpcPlugin/UDPSocket.cpp index ed4710d..802a06d 100644 --- a/xpcPlugin/UDPSocket.cpp +++ b/xpcPlugin/UDPSocket.cpp @@ -18,7 +18,7 @@ namespace XPC localAddr.sin_family = AF_INET; localAddr.sin_addr.s_addr = INADDR_ANY; localAddr.sin_port = htons(recvPort); - + //Create and bind the socket #ifdef _WIN32 WSADATA wsa; @@ -92,7 +92,7 @@ namespace XPC #endif } - int UDPSocket::Read(unsigned char* dst, int maxLen, sockaddr* recvAddr) + int UDPSocket::Read(unsigned char* dst, int maxLen, sockaddr* recvAddr) const { socklen_t recvaddrlen = sizeof(*recvAddr); int status = 0; @@ -137,7 +137,7 @@ namespace XPC return status; } - void UDPSocket::SendTo(const unsigned char* buffer, std::size_t len, sockaddr* remote) + void UDPSocket::SendTo(const unsigned char* buffer, std::size_t len, sockaddr* remote) const { if (sendto(sock, (char*)buffer, (int)len, 0, remote, sizeof(*remote)) < 0) { @@ -152,7 +152,7 @@ namespace XPC #endif } } - + std::string UDPSocket::GetHost(sockaddr* sa) { char ip[INET6_ADDRSTRLEN + 6] = { 0 }; diff --git a/xpcPlugin/UDPSocket.h b/xpcPlugin/UDPSocket.h index 184f6e5..8f27eb2 100644 --- a/xpcPlugin/UDPSocket.h +++ b/xpcPlugin/UDPSocket.h @@ -1,14 +1,14 @@ //Copyright (c) 2013-2015 United States Government as represented by the Administrator of the //National Aeronautics and Space Administration. All Rights Reserved. -#ifndef XPC_SOCKET_H -#define XPC_SOCKET_H +#ifndef XPCPLUGIN_SOCKET_H_ +#define XPCPLUGIN_SOCKET_H_ #include #include #ifdef _WIN32 #include #include -#pragma comment(lib,"ws2_32.lib") //Winsock Library +#pragma comment(lib, "ws2_32.lib") //Winsock Library #elif (__APPLE__ || __linux) #include #include @@ -34,7 +34,7 @@ namespace XPC /// specified receive port. /// /// \param recvPort The port on which this instance will receive data. - UDPSocket(unsigned short recvPort); + explicit UDPSocket(unsigned short recvPort); /// Closes the underlying socket for this instance. ~UDPSocket(); @@ -48,14 +48,14 @@ namespace XPC /// of the remote host. /// \returns The number of bytes read, or a negative number if /// an error occurs. - int Read(unsigned char* buffer, int size, sockaddr* remoteAddr); + int Read(unsigned char* buffer, int size, sockaddr* remoteAddr) const; /// Sends data to the specified remote endpoint. /// /// \param data The data to be sent. /// \param len The number of bytes to send. /// \param remote The destination socket. - void SendTo(const unsigned char* buffer, std::size_t len, sockaddr* remote); + void SendTo(const unsigned char* buffer, std::size_t len, sockaddr* remote) const; /// Gets a string containing the IP address and port contained in the given sockaddr. /// diff --git a/xpcPlugin/XPCPlugin.cpp b/xpcPlugin/XPCPlugin.cpp index cd25d96..104e2d1 100755 --- a/xpcPlugin/XPCPlugin.cpp +++ b/xpcPlugin/XPCPlugin.cpp @@ -2,7 +2,7 @@ //National Aeronautics and Space Administration. All Rights Reserved. // //DISCLAIMERS -// No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY OF ANY KIND, +// No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY OF ANY KIND, // EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, ANY WARRANTY THAT // THE SUBJECT SOFTWARE WILL CONFORM TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY @@ -75,7 +75,8 @@ XPC::UDPSocket* sock = NULL; -double start,lap; +double start; +double lap; static double timeConvert = 0.0; int benchmarkingSwitch = 0; // 1 = time for operations, 2 = time for op + cycle; int cyclesToClear = -1; // Clear message bus every n cycles. -1 == dont clear @@ -93,12 +94,12 @@ PLUGIN_API int XPluginStart(char* outName, char* outSig, char* outDesc) strcpy(outName, "X-Plane Connect [Version 1.0.1]"); strcpy(outSig, "NASA.XPlaneConnect"); strcpy(outDesc, "X Plane Communications Toolbox\nCopyright (c) 2013-2015 United States Government as represented by the Administrator of the National Aeronautics and Space Administration. All Rights Reserved."); - + #if (__APPLE__) if ( abs(timeConvert) <= 1e-9 ) // is about 0 { mach_timebase_info_data_t timeBase; - (void)mach_timebase_info( &timeBase ); + (void)mach_timebase_info(&timeBase); timeConvert = (double)timeBase.numer / (double)timeBase.denom / 1000000000.0; @@ -107,11 +108,11 @@ PLUGIN_API int XPluginStart(char* outName, char* outSig, char* outDesc) XPC::Log::Initialize("1.0.1"); XPC::Log::WriteLine("[EXEC] Plugin Start"); XPC::DataManager::Initialize(); - + float interval = -1; // Call every frame void* refcon = NULL; // Don't pass anything to the callback directly XPLMRegisterFlightLoopCallback(XPCFlightLoopCallback, interval, refcon); - + return 1; } @@ -151,7 +152,7 @@ PLUGIN_API int XPluginEnable(void) #if LOG_VERBOSITY > 0 XPC::Log::FormatLine("[EXEC] Debug Logging Enabled (Verbosity: %i)", LOG_VERBOSITY); #endif - + return 1; } @@ -196,8 +197,8 @@ float XPCFlightLoopCallback(float inElapsedSinceLastCall, { #if (__APPLE__) lap = (double)mach_absolute_time( ) * timeConvert; - diff_t = lap-start; - XPC::Log::FormatLine("[BENCH] Runtime %.6f",diff_t); + diff_t = lap - start; + XPC::Log::FormatLine("[BENCH] Runtime %.6f", diff_t); #endif } } From abff97a4117275db4a64dfdfd4ee5cd33d19376b Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Mon, 11 May 2015 10:10:12 -0700 Subject: [PATCH 58/81] Tweaks to improve code clarity. --- xpcPlugin/MessageHandlers.cpp | 73 +++++++++++++++++++---------------- xpcPlugin/MessageHandlers.h | 5 ++- 2 files changed, 43 insertions(+), 35 deletions(-) diff --git a/xpcPlugin/MessageHandlers.cpp b/xpcPlugin/MessageHandlers.cpp index 281d59f..b2dc625 100644 --- a/xpcPlugin/MessageHandlers.cpp +++ b/xpcPlugin/MessageHandlers.cpp @@ -80,6 +80,9 @@ namespace XPC std::string head = msg.GetHead(); if (head == "") { +#if LOG_VERBOSITY > 1 + Log::WriteLine("[MSGH] Warning: HandleMessage called with empty message."); +#endif return; // No Message to handle } msg.PrintToLog(); @@ -137,13 +140,13 @@ namespace XPC sockaddr* sa = &connection.addr; switch (sa->sa_family) { - case AF_INET: + case AF_INET: // IPV4 address { sockaddr_in* sin = reinterpret_cast(sa); (*sin).sin_port = htons(port); break; } - case AF_INET6: + case AF_INET6: // IPV6 addres { sockaddr_in6* sin = reinterpret_cast(sa); (*sin).sin6_port = htons(port); @@ -196,13 +199,13 @@ namespace XPC float pitch = *((float*)(buffer + 5)); float roll = *((float*)(buffer + 9)); float yaw = *((float*)(buffer + 13)); - float thr = *((float*)(buffer + 17)); + float throttle = *((float*)(buffer + 17)); char gear = buffer[21]; float flaps = *((float*)(buffer + 22)); - unsigned char aircraft = 0; + unsigned char aircraftNumber = 0; if (size >= 27) { - aircraft = buffer[26]; + aircraftNumber = buffer[26]; } float spdbrk = -998; if (size >= 31) @@ -213,42 +216,42 @@ namespace XPC if (pitch < -999.5 || pitch > -997.5) { - DataManager::Set(DREF_YokePitch, pitch, aircraft); + DataManager::Set(DREF_YokePitch, pitch, aircraftNumber); } if (roll < -999.5 || roll > -997.5) { - DataManager::Set(DREF_YokeRoll, roll, aircraft); + DataManager::Set(DREF_YokeRoll, roll, aircraftNumber); } if (yaw < -999.5 || yaw > -997.5) { - DataManager::Set(DREF_YokeHeading, yaw, aircraft); + DataManager::Set(DREF_YokeHeading, yaw, aircraftNumber); } - if (thr < -999.5 || thr > -997.5) + if (throttle < -999.5 || throttle > -997.5) { - float thrArray[8]; + float throttleArray[8]; for (int i = 0; i < 8; ++i) { - thrArray[i] = thr; + throttleArray[i] = throttle; } - DataManager::Set(DREF_ThrottleSet, thrArray, 8, aircraft); - DataManager::Set(DREF_ThrottleActual, thrArray, 8, aircraft); - if (aircraft == 0) + DataManager::Set(DREF_ThrottleSet, throttleArray, 8, aircraftNumber); + DataManager::Set(DREF_ThrottleActual, throttleArray, 8, aircraftNumber); + if (aircraftNumber == 0) { - DataManager::Set("sim/flightmodel/engine/ENGN_thro_override", thrArray, 1); + DataManager::Set("sim/flightmodel/engine/ENGN_thro_override", throttleArray, 1); } } if (gear != -1) { - DataManager::SetGear(gear, false, aircraft); + DataManager::SetGear(gear, false, aircraftNumber); } if (flaps < -999.5 || flaps > -997.5) { - DataManager::Set(DREF_FlapSetting, flaps, aircraft); + DataManager::Set(DREF_FlapSetting, flaps, aircraftNumber); } if (spdbrk < -999.5 || spdbrk > -997.5) { - DataManager::Set(DREF_SpeedBrakeSet, spdbrk, aircraft); + DataManager::Set(DREF_SpeedBrakeSet, spdbrk, aircraftNumber); } } @@ -282,6 +285,7 @@ namespace XPC float values[134][9]; for (int i = 0; i < numCols; ++i) { + // 5 byte header + (9 * 4 = 36) bytes per row values[i][0] = buffer[5 + 36 * i]; memcpy(values[i] + 1, buffer + 9 + 36 * i, 9 * sizeof(float)); } @@ -303,6 +307,7 @@ namespace XPC switch (dataRef) { + // TODO(jason-watkins): This currently overwrites the velocity several times. Should look into making this case smarter somehow. case 3: // Velocity { float theta = DataManager::GetFloat(DREF_Pitch); @@ -331,11 +336,11 @@ namespace XPC } case 17: // Orientation { - float orient[3]; - orient[0] = values[i][1]; - orient[1] = values[i][2]; - orient[2] = values[i][3]; - DataManager::SetOrientation(orient); + float orientation[3]; + orientation[0] = values[i][1]; + orientation[1] = values[i][2]; + orientation[2] = values[i][3]; + DataManager::SetOrientation(orientation); break; } case 18: // Alpha, hpath etc. @@ -375,12 +380,12 @@ namespace XPC #endif break; } - float thr[8]; + float throttle[8]; for (int j = 0; j < 8; ++j) { - thr[j] = values[i][1]; + throttle[j] = values[i][1]; } - DataManager::Set(DREF_ThrottleSet, thr, 8); + DataManager::Set(DREF_ThrottleSet, throttle, 8); break; } default: // Non-Special dataRefs @@ -392,7 +397,7 @@ namespace XPC #if LOG_VERBOSITY > 1 Log::FormatLine("[DATA] Setting Dataref %i.%i to %f", dataRef, j, line[j]); #endif - + // TODO(jason-watkins): Why is this a special case? if (dataRef == 14 && j == 0) { DataManager::SetGear(line[0], true); @@ -521,30 +526,30 @@ namespace XPC return; } - char aircraft = buffer[5]; + char aircraftNumber = buffer[5]; float gear = *((float*)(buffer + 30)); float pos[3]; float orient[3]; memcpy(pos, buffer + 6, 12); memcpy(orient, buffer + 18, 12); - if (aircraft > 0) + if (aircraftNumber > 0) { - // Enable AI for the aircraft we are setting + // Enable AI for the aircraftNumber we are setting float ai[20]; std::size_t result = DataManager::GetFloatArray(DREF_PauseAI, ai, 20); if (result == 20) // Only set values if they were retrieved successfully. { - ai[aircraft] = 1; + ai[aircraftNumber] = 1; DataManager::Set(DREF_PauseAI, ai, 0, 20); } } - DataManager::SetPosition(pos, aircraft); - DataManager::SetOrientation(orient, aircraft); + DataManager::SetPosition(pos, aircraftNumber); + DataManager::SetOrientation(orient, aircraftNumber); if (gear != -1) { - DataManager::SetGear(gear, true, aircraft); + DataManager::SetGear(gear, true, aircraftNumber); } } diff --git a/xpcPlugin/MessageHandlers.h b/xpcPlugin/MessageHandlers.h index 57ab2f6..87ad20e 100644 --- a/xpcPlugin/MessageHandlers.h +++ b/xpcPlugin/MessageHandlers.h @@ -33,10 +33,12 @@ namespace XPC /// \param msg The message to be processed. static void HandleMessage(Message& msg); - /// Sets the socke that message handlers use to send responses. + /// Sets the socket that message handlers use to send responses. static void SetSocket(UDPSocket* socket); private: + // One handler per message type. Message types are descripbed on the + // wiki at https://github.com/nasa/XPlaneConnect/wiki/Network-Information static void HandleConn(const Message& msg); static void HandleCtrl(const Message& msg); static void HandleData(const Message& msg); @@ -47,6 +49,7 @@ namespace XPC static void HandleText(const Message& msg); static void HandleWypt(const Message& msg); static void HandleView(const Message& msg); + static void HandleXPlaneData(const Message& msg); static void HandleUnknown(const Message& msg); From 044a7498f7ac5a876a5f372e594ef213d3abf95f Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Mon, 11 May 2015 12:29:40 -0700 Subject: [PATCH 59/81] Converted value type string args to const references. --- xpcPlugin/DataManager.cpp | 4 ++-- xpcPlugin/DataManager.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/xpcPlugin/DataManager.cpp b/xpcPlugin/DataManager.cpp index 4a2bd97..435096f 100644 --- a/xpcPlugin/DataManager.cpp +++ b/xpcPlugin/DataManager.cpp @@ -300,7 +300,7 @@ namespace XPC XPData[26][0] = DREF_ThrottleActual; } - int DataManager::Get(string dref, float values[], int size) + int DataManager::Get(const string& dref, float values[], int size) { XPLMDataRef& xdref = sdrefs[dref]; if (xdref == NULL) @@ -529,7 +529,7 @@ namespace XPC XPLMSetDatavi(xdref, values, 0, drefSize); } - void DataManager::Set(string dref, float values[], int size) + void DataManager::Set(const string& dref, float values[], int size) { XPLMDataRef& xdref = sdrefs[dref]; if (xdref == NULL) diff --git a/xpcPlugin/DataManager.h b/xpcPlugin/DataManager.h index 1bb7ffb..4e94832 100644 --- a/xpcPlugin/DataManager.h +++ b/xpcPlugin/DataManager.h @@ -174,7 +174,7 @@ namespace XPC /// doubles where high precision is required, using this method may result /// in a loss of precision. In that case, consider using one of the /// strongly typed methods instead. - static int Get(std::string dref, float values[], int size); + static int Get(const std::string& dref, float values[], int size); /// Gets the value of a double dataref. /// @@ -294,7 +294,7 @@ namespace XPC /// doubles where high precision is required, using this method may result /// in a loss of precision. In that case, consider using one of the /// strongly typed methods instead. - static void Set(std::string dref, float values[], int size); + static void Set(const std::string& dref, float values[], int size); /// Sets the value of a double dataref. /// From a2c1f8362980c43afb2b28aae33b69663309ab29 Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Mon, 11 May 2015 14:51:08 -0700 Subject: [PATCH 60/81] Refactored logging. - Logging levels are now named preprocessor defines - Logging level is now a parameter for WriteLine/FormatLine --- xpcPlugin/DataManager.cpp | 274 ++++++++++---------------- xpcPlugin/Log.cpp | 27 +-- xpcPlugin/Log.h | 46 ++--- xpcPlugin/Message.cpp | 52 +++-- xpcPlugin/MessageHandlers.cpp | 157 +++++---------- xpcPlugin/UDPSocket.cpp | 40 ++-- xpcPlugin/XPCPlugin.cpp | 20 +- xpcPlugin/xpcPlugin/xpcPlugin.vcxproj | 2 +- 8 files changed, 239 insertions(+), 379 deletions(-) diff --git a/xpcPlugin/DataManager.cpp b/xpcPlugin/DataManager.cpp index 435096f..980d1da 100644 --- a/xpcPlugin/DataManager.cpp +++ b/xpcPlugin/DataManager.cpp @@ -29,8 +29,9 @@ namespace XPC { using namespace std; + const size_t PLANE_COUNT = 20; static map drefs; - static map mdrefs[20]; + static map mdrefs[PLANE_COUNT]; static map sdrefs; DREF XPData[134][8] = { DREF_None }; @@ -143,7 +144,7 @@ namespace XPC drefs.insert(make_pair(DREF_MP7Alt, XPLMFindDataRef("sim/multiplayer/position/plane7_el"))); char multi[256]; - for (int i = 1; i < 20; i++) + for (int i = 1; i < PLANE_COUNT; i++) { sprintf(multi, "sim/multiplayer/position/plane%i_x", i); mdrefs[i][DREF_LocalX] = XPLMFindDataRef(multi); @@ -302,6 +303,7 @@ namespace XPC int DataManager::Get(const string& dref, float values[], int size) { + Log::WriteLine(LOG_TRACE, "DMAN", "Entered Get(string, float*, int)"); XPLMDataRef& xdref = sdrefs[dref]; if (xdref == NULL) { @@ -309,24 +311,18 @@ namespace XPC } if (!xdref) // DREF does not exist { -#if LOG_VERBOSITY > 0 - Log::FormatLine("[DMAN] ERROR: invalid DREF %s", dref.c_str()); -#endif + Log::FormatLine(LOG_ERROR, "DMAN", "ERROR: invalid DREF %s", dref); return 0; } XPLMDataTypeID dataType = XPLMGetDataRefTypes(xdref); -#if LOG_VERBOSITY > 4 - Log::FormatLine("[DMAN] Get DREF %s (x:%X) Type: %i", dref.c_str(), xdref, dataType); -#endif + Log::FormatLine(LOG_INFO, "DMAN", "Get DREF %s (x:%X) Type: %i", dref, xdref, dataType); // XPLMDataTypeID is a bit flag, so it may contain more than one of the // following types. We prefer types as close to float as possible. if ((dataType & 2) == 2) // Float { values[0] = XPLMGetDataf(xdref); -#if LOG_VERBOSITY > 4 - Log::FormatLine("[DMAN] -- value was %f", values[0]); -#endif + Log::FormatLine(LOG_INFO, "DMAN", " -- value was %f", values[0]); return 1; } if ((dataType & 8) == 8) // Float array @@ -334,99 +330,80 @@ namespace XPC int drefSize = XPLMGetDatavf(xdref, NULL, 0, 0); if (drefSize > size) { -#if LOG_VERBOSITY > 1 - Log::WriteLine("[DMAN] WARN: dref size is larger than available space"); - Log::FormatLine(" Actual dref size: %i, Available size: %i", drefSize, size); -#endif + Log::WriteLine(LOG_WARN, "DMAN", "Warning: dref size is larger than available space"); + Log::FormatLine(LOG_DEBUG, "DMAN", "Actual dref size : %i, Available size : %i", drefSize, size); drefSize = size; } XPLMGetDatavf(xdref, values, 0, drefSize); -#if LOG_VERBOSITY > 4 - Log::FormatLine("[DMAN] -- value count was %i", drefSize); -#endif + Log::FormatLine(LOG_INFO, "DMAN", " -- value count was %i", drefSize); return drefSize; } if ((dataType & 4) == 4) // Double { values[0] = (float)XPLMGetDatad(xdref); -#if LOG_VERBOSITY > 4 - Log::FormatLine("[DMAN] -- value was %f", values[0]); -#endif + Log::FormatLine(LOG_INFO, "DMAN", " -- value was %f", values[0]); return 1; } if ((dataType & 1) == 1) // Integer { - values[0] = (float)XPLMGetDatai(xdref); -#if LOG_VERBOSITY > 4 - Log::FormatLine("[DMAN] -- value was %i", (int)values[0]); -#endif + int iValue = XPLMGetDatai(xdref); + values[0] = (float)iValue; + Log::FormatLine(LOG_INFO, "DMAN", " -- Real value was %i, cast to %f", iValue, values[0]); return 1; } if ((dataType & 16) == 16) // Integer array { - int iValues[200]; + const std::size_t TMP_SIZE = 200; + int iValues[TMP_SIZE]; int drefSize = XPLMGetDatavi(xdref, NULL, 0, 0); if (drefSize > size) { -#if LOG_VERBOSITY > 1 - Log::WriteLine("[DMAN] WARN: dref size is larger than available space"); - Log::FormatLine(" Actual dref size: %i, Available size: %i", drefSize, size); -#endif + Log::WriteLine(LOG_WARN, "DMAN", "Warning: dref size is larger than available space"); + Log::FormatLine(LOG_DEBUG, "DMAN", "Actual dref size : %i, Available size : %i", drefSize, size); drefSize = size; } - if (drefSize > 200) + if (drefSize > TMP_SIZE) { -#if LOG_VERBOSITY > 1 - Log::WriteLine("[DMAN] WARN: dref size is larger than temp buffer"); - Log::FormatLine(" Actual dref size: %i, Temp buffer size: 200", drefSize); -#endif - drefSize = 200; + Log::WriteLine(LOG_WARN, "DMAN", "Warning: dref size is larger than temp buffer"); + Log::FormatLine(LOG_DEBUG, "DMAN", "Actual dref size : %i, Temp buffer size: %u", drefSize, TMP_SIZE); + drefSize = TMP_SIZE; } XPLMGetDatavi(xdref, iValues, 0, drefSize); for (int i = 0; i < drefSize; ++i) { values[i] = (float)iValues[i]; } -#if LOG_VERBOSITY > 4 - Log::FormatLine("[DMAN] -- value count was %i", drefSize); -#endif + Log::FormatLine(LOG_INFO, "DMAN", " -- value count was %i", drefSize); return drefSize; } if ((dataType & 32) == 32) // Byte array { - char bValues[1024]; + const std::size_t TMP_SIZE = 1024; + char bValues[TMP_SIZE]; int drefSize = XPLMGetDatab(xdref, NULL, 0, 0); if (drefSize > size) { -#if LOG_VERBOSITY > 1 - Log::WriteLine("[DMAN] WARN: dref size is larger than available space"); - Log::FormatLine(" Actual dref size: %i, Available size: %i", drefSize, size); -#endif + Log::WriteLine(LOG_WARN, "DMAN", "Warning: dref size is larger than available space"); + Log::FormatLine(LOG_DEBUG, "DMAN", "Actual dref size : %i, Available size : %i", drefSize, size); drefSize = size; } - if (drefSize > 1024) + if (drefSize > TMP_SIZE) { -#if LOG_VERBOSITY > 1 - Log::WriteLine("[DMAN] WARN: dref size is larger than temp buffer"); - Log::FormatLine(" Actual dref size: %i, Temp buffer size: 1024", drefSize); -#endif - drefSize = 1024; + Log::WriteLine(LOG_WARN, "DMAN", "Warning: dref size is larger than temp buffer"); + Log::FormatLine(LOG_DEBUG, "DMAN", "Actual dref size : %i, Temp buffer size: %u", drefSize, TMP_SIZE); + drefSize = TMP_SIZE; } XPLMGetDatab(xdref, bValues, 0, drefSize); for (int i = 0; i < drefSize; ++i) { values[i] = (float)bValues[i]; } -#if LOG_VERBOSITY > 4 - Log::FormatLine("[DMAN] -- value count was %i", drefSize); -#endif + Log::FormatLine(LOG_INFO, "DMAN", " -- value count was %i", drefSize); return drefSize; } // No match -#if LOG_VERBOSITY > 0 - Log::WriteLine("[DMAN] ERROR: Unrecognized data type."); -#endif + Log::WriteLine(LOG_ERROR, "DMAN", "ERROR: Unrecognized data type."); return 0; } @@ -434,9 +411,8 @@ namespace XPC { const XPLMDataRef& xdref = aircraft == 0 ? drefs[dref] : mdrefs[aircraft][dref]; double value = XPLMGetDatad(xdref); -#if LOG_VERBOSITY > 4 - Log::FormatLine("[DMAN] Get DREF %i (x:%X) result %f for a/c %i", dref, xdref, value, aircraft); -#endif + Log::FormatLine(LOG_INFO, "DMAN", "Get DREF %i (x:%X) result %f for a/c %i", + dref, xdref, value, aircraft); return value; } @@ -444,9 +420,8 @@ namespace XPC { const XPLMDataRef& xdref = aircraft == 0 ? drefs[dref] : mdrefs[aircraft][dref]; float value = XPLMGetDataf(xdref); -#if LOG_VERBOSITY > 4 - Log::FormatLine("[DMAN] Get DREF %i (x:%X) result %f for a/c %i", dref, xdref, value, aircraft); -#endif + Log::FormatLine(LOG_INFO, "DMAN", "Get DREF %i (x:%X) result %f for a/c %i", + dref, xdref, value, aircraft); return value; } @@ -454,9 +429,8 @@ namespace XPC { const XPLMDataRef& xdref = aircraft == 0 ? drefs[dref] : mdrefs[aircraft][dref]; int value = XPLMGetDatai(xdref); -#if LOG_VERBOSITY > 4 - Log::FormatLine("[DMAN] Get DREF %i (x:%X) result %i for a/c %i", dref, xdref, value, aircraft); -#endif + Log::FormatLine(LOG_INFO, "DMAN", "Get DREF %i (x:%X) result %i for a/c %i", + dref, xdref, value, aircraft); return value; } @@ -464,9 +438,8 @@ namespace XPC { const XPLMDataRef& xdref = aircraft == 0 ? drefs[dref] : mdrefs[aircraft][dref]; int resultSize = XPLMGetDatavf(xdref, values, 0, size); -#if LOG_VERBOSITY > 4 - Log::FormatLine("[DMAN] Get DREF %i (x:%X) result size %i for a/c %i", dref, xdref, resultSize, aircraft); -#endif + Log::FormatLine(LOG_INFO, "DMAN", "Get DREF %i (x:%X) result size %i for a/c %i", + dref, xdref, resultSize, aircraft); return resultSize; } @@ -474,46 +447,46 @@ namespace XPC { const XPLMDataRef& xdref = aircraft == 0 ? drefs[dref] : mdrefs[aircraft][dref]; int resultSize = XPLMGetDatavi(xdref, values, 0, size); -#if LOG_VERBOSITY > 4 - Log::FormatLine("[DMAN] Get DREF %i (x:%X) result size %i for a/c %i", dref, xdref, resultSize, aircraft); -#endif + Log::FormatLine(LOG_INFO, "DMAN", "Get DREF %i (x:%X) result size %i for a/c %i", + dref, xdref, resultSize, aircraft); return resultSize; } void DataManager::Set(DREF dref, double value, char aircraft) { const XPLMDataRef& xdref = aircraft == 0 ? drefs[dref] : mdrefs[aircraft][dref]; -#if LOG_VERBOSITY > 4 - Log::FormatLine("[DMAN] Setting DREF %i (x:%X) to %f for a/c %i", dref, xdref, value, aircraft); -#endif + Log::FormatLine(LOG_INFO, "DMAN", "Setting DREF %i (x:%X) to %f for a/c %i", + dref, xdref, value, aircraft); XPLMSetDatad(xdref, value); } void DataManager::Set(DREF dref, float value, char aircraft) { const XPLMDataRef& xdref = aircraft == 0 ? drefs[dref] : mdrefs[aircraft][dref]; -#if LOG_VERBOSITY > 4 - Log::FormatLine("[DMAN] Set DREF %i (x:%X) to %f for a/c %i", dref, xdref, value, aircraft); -#endif + Log::FormatLine(LOG_INFO, "DMAN", "Setting DREF %i (x:%X) to %f for a/c %i", + dref, xdref, value, aircraft); XPLMSetDataf(xdref, value); } void DataManager::Set(DREF dref, int value, char aircraft) { const XPLMDataRef& xdref = aircraft == 0 ? drefs[dref] : mdrefs[aircraft][dref]; -#if LOG_VERBOSITY > 4 - Log::FormatLine("[DMAN] Set DREF %i (x:%X) to %i for a/c %i", dref, xdref, value, aircraft); -#endif + Log::FormatLine(LOG_INFO, "DMAN", "Setting DREF %i (x:%X) to %i for a/c %i", + dref, xdref, value, aircraft); XPLMSetDatai(xdref, value); } void DataManager::Set(DREF dref, float values[], int size, char aircraft) { const XPLMDataRef& xdref = aircraft == 0 ? drefs[dref] : mdrefs[aircraft][dref]; -#if LOG_VERBOSITY > 4 - Log::FormatLine("[DMAN] Set DREF %i (x:%X) (%i values) for a/c %i", dref, xdref, size, aircraft); -#endif + Log::FormatLine(LOG_INFO, "DMAN", "Setting DREF %i (x:%X) (%i values) for a/c %i", + dref, xdref, size, aircraft); int drefSize = XPLMGetDatavf(xdref, NULL, 0, 0); + if (drefSize < size) + { + Log::FormatLine(LOG_WARN, "DMAN", "Warning: Too many values when setting DREF %i. Expected %i, got %i", + dref, drefSize, size); + } drefSize = min(drefSize, size); XPLMSetDatavf(xdref, values, 0, drefSize); } @@ -521,10 +494,14 @@ namespace XPC void DataManager::Set(DREF dref, int values[], int size, char aircraft) { const XPLMDataRef& xdref = aircraft == 0 ? drefs[dref] : mdrefs[aircraft][dref]; -#if LOG_VERBOSITY > 4 - Log::FormatLine("[DMAN] Setting DREF %i (x:%X) (%i values) for a/c %i", dref, xdref, size, aircraft); -#endif + Log::FormatLine(LOG_INFO, "DMAN", "Setting DREF %i (x:%X) (%i values) for a/c %i", + dref, xdref, size, aircraft); int drefSize = XPLMGetDatavi(xdref, NULL, 0, 0); + if (drefSize < size) + { + Log::FormatLine(LOG_WARN, "DMAN", "Warning: Too many values when setting DREF %i. Expected %i, got %i", + dref, drefSize, size); + } drefSize = min(drefSize, size); XPLMSetDatavi(xdref, values, 0, drefSize); } @@ -539,139 +516,113 @@ namespace XPC if (!xdref) { // DREF does not exist -#if LOG_VERBOSITY > 0 - Log::FormatLine("[DMAN] ERROR: invalid DREF %s", dref.c_str()); -#endif + Log::FormatLine(LOG_ERROR, "DMAN", "ERROR: invalid DREF %s", dref); return; } if (isnan(values[0])) { -#if LOG_VERBOSITY > 0 - Log::WriteLine("[DMAN] ERROR: Value must be a number (NaN received)"); -#endif + Log::WriteLine(LOG_ERROR, "DMAN", "ERROR: Value must be a number (NaN received)"); return; } XPLMDataTypeID dataType = XPLMGetDataRefTypes(xdref); -#if LOG_VERBOSITY > 4 - Log::FormatLine("[DMAN] Setting DREF %s (x:%X) Type: %i", dref.c_str(), xdref, dataType); -#endif + Log::FormatLine(LOG_INFO, "DMAN", "Setting DREF %s (x:%X) Type: %i", xdref, dataType); if ((dataType & 2) == 2) // Float { XPLMSetDataf(xdref, values[0]); -#if LOG_VERBOSITY > 4 - Log::FormatLine("[DMAN] -- value was %f", values[0]); -#endif + Log::FormatLine(LOG_INFO, "DMAN", " -- value was %f", values[0]); } else if ((dataType & 8) == 8) // Float Array { int drefSize = XPLMGetDatavf(xdref, NULL, 0, 0); -#if LOG_VERBOSITY > 1 if (size > drefSize) { - Log::WriteLine("[DMAN] WARN: Provided size is larger than actual dref size"); - Log::FormatLine(" Actual dref size: %i, Provided buffer size: %i", drefSize, size); + Log::WriteLine(LOG_WARN, "DMAN", "Warning: dref size is larger than actual dref size"); + Log::FormatLine(LOG_DEBUG, "DMAN", "Actual dref size : %i, Provided buffer size : %i", + drefSize, size); } -#endif drefSize = min(drefSize, size); XPLMSetDatavf(xdref, values, 0, drefSize); -#if LOG_VERBOSITY > 4 - Log::FormatLine("[DMAN] -- value count was %i", drefSize); -#endif + Log::FormatLine(LOG_INFO, "DMAN", " -- value count was %i", drefSize); } else if ((dataType & 4) == 4) // Double { XPLMSetDatad(xdref, values[0]); -#if LOG_VERBOSITY > 4 - Log::FormatLine("[DMAN] -- value was %f", values[0]); -#endif + Log::FormatLine(LOG_INFO, "DMAN", " -- value was %f", values[0]); } else if ((dataType & 1) == 1) // Integer { XPLMSetDatai(xdref, (int)values[0]); -#if LOG_VERBOSITY > 4 - Log::FormatLine("[DMAN] -- value was %i", (int)values[0]); -#endif + Log::FormatLine(LOG_INFO, "DMAN", " -- value was %i", (int)values[0]); } else if ((dataType & 16) == 16) // Integer Array { - int iValues[200]; + const std::size_t TMP_SIZE = 200; + int iValues[TMP_SIZE]; int drefSize = XPLMGetDatavi(xdref, NULL, 0, 0); -#if LOG_VERBOSITY > 1 if (size > drefSize) { - Log::WriteLine("[DMAN] WARN: Provided size is larger than actual dref size"); - Log::FormatLine(" Actual dref size: %i, Provided buffer size: %i", drefSize, size); + Log::WriteLine(LOG_WARN, "DMAN", "Warning: dref size is larger than actual dref size"); + Log::FormatLine(LOG_DEBUG, "DMAN", "Actual dref size : %i, Provided buffer size : %i", + drefSize, size); } -#endif drefSize = min(drefSize, size); - if (drefSize > 200) + if (drefSize > TMP_SIZE) { -#if LOG_VERBOSITY > 1 - Log::WriteLine("[DMAN] WARN: drefSize larger than temp buffer size."); - Log::FormatLine(" Actual dref size: %i, Temp buffer size: 200", drefSize); -#endif - drefSize = 200; + Log::WriteLine(LOG_WARN, "DMAN", "Warning: dref size is larger temp buffer size"); + Log::FormatLine(LOG_DEBUG, "DMAN", "Actual dref size : %i, Temp buffer size: %i", + drefSize, TMP_SIZE); + drefSize = TMP_SIZE; } for (int i = 0; i < drefSize; ++i) { iValues[i] = (int)values[i]; } XPLMSetDatavi(xdref, iValues, 0, drefSize); -#if LOG_VERBOSITY > 4 - Log::FormatLine("[DMAN] -- value count was %i", drefSize); -#endif + Log::FormatLine(LOG_INFO, "DMAN", " -- value count was %i", drefSize); } else if ((dataType & 32) == 32) // Byte Array { - char bValues[1024]; + const std::size_t TMP_SIZE = 1024; + char bValues[TMP_SIZE]; int drefSize = XPLMGetDatab(xdref, NULL, 0, 0); -#if LOG_VERBOSITY > 1 if (size > drefSize) { - Log::WriteLine("[DMAN] WARN: Provided size is larger than actual dref size"); - Log::FormatLine(" Actual dref size: %i, Provided buffer size: %i", drefSize, size); + Log::WriteLine(LOG_WARN, "DMAN", "Warning: dref size is larger than actual dref size"); + Log::FormatLine(LOG_DEBUG, "DMAN", "Actual dref size : %i, Provided buffer size : %i", + drefSize, size); } -#endif drefSize = min(drefSize, size); - if (drefSize > 1024) + if (drefSize > TMP_SIZE) { -#if LOG_VERBOSITY > 1 - Log::WriteLine("[DMAN] WARN: drefSize larger than temp buffer size."); - Log::FormatLine(" Actual dref size: %i, Temp buffer size: 1024", drefSize); -#endif - drefSize = 1024; + Log::WriteLine(LOG_WARN, "DMAN", "Warning: dref size is larger temp buffer size"); + Log::FormatLine(LOG_DEBUG, "DMAN", "Actual dref size : %i, Temp buffer size: %i", + drefSize, TMP_SIZE); + drefSize = TMP_SIZE; } for (int i = 0; i < drefSize; ++i) { bValues[i] = (char)values[i]; } XPLMSetDatab(xdref, bValues, 0, drefSize); -#if LOG_VERBOSITY > 4 - Log::FormatLine("[DMAN] -- value count was %i", drefSize); -#endif + Log::FormatLine(LOG_INFO, "DMAN", " -- value count was %i", drefSize); } else { -#if LOG_VERBOSITY > 0 - Log::WriteLine("[DMAN] ERROR: Unknown type."); -#endif + Log::WriteLine(LOG_ERROR, "DMAN", "ERROR: Unknown type."); } -#if LOG_VERBOSITY > 1 if (!XPLMCanWriteDataRef(xdref)) { - Log::WriteLine("[DMAN] WARN: dref is not writable. The write operation probably failed."); + Log::WriteLine(LOG_WARN, "DMAN", "WARN: dref is not writable. The write operation probably failed."); } -#endif } void DataManager::SetGear(float gear, bool immediate, char aircraft) { -#if LOG_VERBOSITY > 3 - Log::FormatLine("[DMAN] Setting gear (value:%f, immediate:%i) for aircraft %i", gear, immediate, aircraft); -#endif + Log::FormatLine(LOG_INFO, "DMAN", "Setting gear (value:%f, immediate:%i) for aircraft %i", + gear, immediate, aircraft); if ((gear < -8.5 && gear > -9.5) || (gear < -997.9 && gear > -999.1)) { @@ -679,9 +630,7 @@ namespace XPC } if (isnan(gear) || gear < 0 || gear > 1) { -#if LOG_VERBOSITY > 1 - Log::WriteLine("[GEAR] ERROR: Value must be 0 or 1"); -#endif + Log::WriteLine(LOG_ERROR, "DMAN", "ERROR: Gear value must be 0 or 1"); return; } @@ -707,14 +656,11 @@ namespace XPC void DataManager::SetPosition(float pos[3], char aircraft) { -#if LOG_VERBOSITY > 3 - Log::FormatLine("[DMAN] Setting position (%f, %f, %f) for aircraft %i", pos[0], pos[1], pos[2], aircraft); -#endif + Log::FormatLine(LOG_INFO, "DMAN", "Setting position (%f, %f, %f) for aircraft %i", + pos[0], pos[1], pos[2], aircraft); if (isnan(pos[0] + pos[1] + pos[2])) { -#if LOG_VERBOSITY > 0 - Log::WriteLine("[DMAN] ERROR: Position must be a number (NaN received)"); -#endif + Log::WriteLine(LOG_ERROR, "DMAN", "ERROR: Position must be a number (NaN received)"); return; } @@ -746,15 +692,11 @@ namespace XPC void DataManager::SetOrientation(float orient[3], char aircraft) { -#if LOG_VERBOSITY > 3 - Log::FormatLine("[DMAN] Setting orientation (%f, %f, %f) for aircraft %i", + Log::FormatLine(LOG_INFO, "DMAN", "Setting orientation (%f, %f, %f) for aircraft %i", orient[0], orient[1], orient[2], aircraft); -#endif if (isnan(orient[0] + orient[1] + orient[2])) { -#if LOG_VERBOSITY > 0 - Log::WriteLine("[DMAN] ERROR: Orientation must be a number (NaN received)"); -#endif + Log::WriteLine(LOG_ERROR, "DMAN", "ERROR: Orientation must be a number (NaN received)"); return; } @@ -801,11 +743,11 @@ namespace XPC void DataManager::SetFlaps(float value) { + Log::FormatLine(LOG_INFO, "DMAN", "Setting flaps (value:%f)", value); + if (isnan(value)) { -#if LOG_VERBOSITY > 0 - Log::WriteLine("[DMAN] ERROR: Flap value must be a number (NaN received)"); -#endif + Log::WriteLine(LOG_ERROR, "DMAN", "ERROR: Flap value must be a number (NaN received)"); return; } if (value < -997.9 && value > -999.1) diff --git a/xpcPlugin/Log.cpp b/xpcPlugin/Log.cpp index 2266e99..8491402 100644 --- a/xpcPlugin/Log.cpp +++ b/xpcPlugin/Log.cpp @@ -12,7 +12,7 @@ #include #include -// Implementation note: I initial wrote this class using C++ iostreams, but I couldn't find any +// Implementation note: I initially wrote this class using C++ iostreams, but I couldn't find any // way to implement FormatLine without adding in a call to sprintf. It therefore seems more // efficient to me to just use C-style IO and call std::fprintf directly. namespace XPC @@ -38,8 +38,13 @@ namespace XPC std::fprintf(fd, ss.str().c_str()); } - void Log::Initialize(std::string version) + void Log::Initialize(const std::string& version) { + if (LOG_LEVEL == LOG_OFF) + { + return; + } + fd = std::fopen("XPCLog.txt", "w"); if (fd != NULL) { @@ -82,35 +87,31 @@ namespace XPC } } - void Log::WriteLine(const std::string& value) + void Log::WriteLine(int level, const std::string& tag, const std::string& value) { - Log::WriteLine(value.c_str()); - } - - void Log::WriteLine(const char* value) - { - if (!fd) + if (level > LOG_LEVEL || !fd) { return; } WriteTime(fd); - std::fprintf(fd, "%s\n", value); + std::fprintf(fd, "[%s] %s\n", tag.c_str(), value.c_str()); std::fflush(fd); } - void Log::FormatLine(const char* format, ...) + void Log::FormatLine(int level, const std::string& tag, const std::string& format, ...) { va_list args; - if (!fd) + if (level > LOG_LEVEL || !fd) { return; } va_start(args, format); WriteTime(fd); - std::vfprintf(fd, format, args); + std::fprintf(fd, "[%s] ", tag.c_str()); + std::vfprintf(fd, format.c_str(), args); std::fprintf(fd, "\n"); std::fflush(fd); diff --git a/xpcPlugin/Log.h b/xpcPlugin/Log.h index 6887eb9..094d996 100644 --- a/xpcPlugin/Log.h +++ b/xpcPlugin/Log.h @@ -5,18 +5,26 @@ #include // LOG_VERBOSITY determines the level of logging throughout the plugin. -// 0: Minimum logging. Only plugin manager events will be logged. -// 1: Critical errors. When an error that prevents correct operation of the -// plugin, attempt to write useful information to the log. Note that since -// XPC runs inside the X-Plane executable, we try very hard no to crash. -// As a result, these log messages may be the only indication of failure. -// 2: All errors. Any time something unexpected happens, log it. -// 3: Significant actions. Any time something happens outside of normal -// command processing, log it. Will also log when commands are received. -// 4: Detailed actions. Log aditional information as commands are processed. -// 5: Everything. Log nearly every single action the plugin takes. This may -// have a detrimental impact on X-Plane performance. -#define LOG_VERBOSITY 3 +// OFF: No logging at all will be performed. +// FATAL: Critical errors that would normally resulti in termination of the program. Because XPC +// operates in the X-Plane process, we try to never actually crash. As a result, we this +// level of logging may be the only indication of a problem. +// ERROR: All errors not covered by FATAL +// WARN: Potentially, but not definitely, incorrect behavior +// INFO: Information about normal actions taken by the plugin. +// DEBUG: More verbose information usefull for debugging. +// TRACE: Log all the things! +#define LOG_OFF 0 +#define LOG_FATAL 1 +#define LOG_ERROR 2 +#define LOG_WARN 3 +#define LOG_INFO 4 +#define LOG_DEBUG 5 +#define LOG_TRACE 6 + +#ifndef LOG_LEVEL +#define LOG_LEVEL LOG_ERROR +#endif namespace XPC { @@ -33,31 +41,25 @@ namespace XPC public: /// Initializes the logging component by deleting old log files, /// writing header information to the log file. - static void Initialize(std::string header); + static void Initialize(const std::string& header); /// Closes the log file. static void Close(); - /// Writes the C string pointed to by format, followed by a line + /// Writes the string pointed to by format, followed by a line /// terminator to the XPC log file. If format contains format /// specifiers, additional arguments following format will be formatted /// and inserted in the resulting string, replacing their respective /// specifiers. /// /// \param format The format string appropriate for consumption by sprintf. - static void FormatLine(const char* format, ...); + static void FormatLine(int level, const std::string& tag, const std::string& format, ...); /// Writes the specified string value, followed by a line terminator /// to the XPC log file. /// /// \param value The value to write. - static void WriteLine(const std::string& value); - - /// Writes the specified C string value, followed by a line terminator - /// to the XPC log file. - /// - /// \param value The value to write. - static void WriteLine(const char* value); + static void WriteLine(int level, const std::string& tag, const std::string& value); }; } #endif diff --git a/xpcPlugin/Message.cpp b/xpcPlugin/Message.cpp index 2f8f7e3..50d1246 100644 --- a/xpcPlugin/Message.cpp +++ b/xpcPlugin/Message.cpp @@ -58,9 +58,7 @@ namespace XPC void Message::PrintToLog() const { -#if LOG_VERBOSITY > 4 std::stringstream ss; - ss << "[DEBUG]"; // Dump raw bytes to string ss << std::hex << std::setfill('0'); @@ -68,18 +66,18 @@ namespace XPC { ss << ' ' << std::setw(2) << static_cast(buffer[i]); } - Log::WriteLine(ss.str()); + Log::WriteLine(LOG_DEBUG, "DBUG", ss.str()); ss << std::dec; ss.str(""); - ss << "[" << GetHead() << "-DEBUG] (" << GetSize() << ")"; + ss << "Head:" << GetHead() << " Size:" << GetSize(); switch (GetMagicNumber()) // Binary version of head { case 0x4E4EF443: // CONN case 0x54505957: // WYPT case 0x54584554: // TEXT { - Log::WriteLine(ss.str()); + Log::WriteLine(LOG_DEBUG, "DBUG", ss.str()); break; } case 0x4C525443: // CTRL @@ -98,7 +96,7 @@ namespace XPC } ss << " Attitude:(" << pitch << " " << roll << " " << yaw << ")"; ss << " Thr:" << thr << " Gear:" << (int)gear << " Flaps:" << flaps; - Log::WriteLine(ss.str()); + Log::WriteLine(LOG_DEBUG, "DBUG", ss.str()); break; } case 0x41544144: // DATA @@ -110,43 +108,44 @@ namespace XPC values[i][0] = buffer[5 + 36 * i]; std::memcpy(values[i] + 1, buffer + 9 + 36 * i, 9 * sizeof(float)); } - ss << " (" << numCols << " lines)"; - Log::WriteLine(ss.str()); + ss << " (" << numCols << " lines)"; + Log::WriteLine(LOG_DEBUG, "DBUG", ss.str()); for (int i = 0; i < numCols; ++i) { ss.str(""); - ss << "\t#" << values[i][0]; + ss << " #" << values[i][0]; for (int j = 1; j < 9; ++j) { ss << " " << values[i][j]; - } - Log::WriteLine(ss.str()); + } + Log::WriteLine(LOG_DEBUG, "DBUG", ss.str()); } break; } case 0x46455244: // DREF - { - Log::WriteLine(ss.str()); + { + Log::WriteLine(LOG_DEBUG, "DBUG", ss.str()); std::string dref((char*)buffer + 6, buffer[5]); - Log::FormatLine("-\tDREF (size %i) = %s", dref.length(), dref.c_str()); + Log::FormatLine(LOG_DEBUG, "DBUG", " DREF (size %i) = %s", dref.length(), dref); ss.str(""); int values = buffer[6 + buffer[5]]; - ss << "\tValues(size " << values << ") ="; + ss << " Values(size " << values << ") ="; for (int i = 0; i < values; ++i) { ss << " " << *((float*)(buffer + values + 1 + sizeof(float) * i)); - } - Log::WriteLine(ss.str()); + } + Log::WriteLine(LOG_DEBUG, "DBUG", ss.str()); break; } case 0x44544547: // GETD - { - Log::WriteLine(ss.str()); + { + Log::WriteLine(LOG_DEBUG, "DBUG", ss.str()); int cur = 6; for (int i = 0; i < buffer[5]; ++i) { std::string dref((char*)buffer + cur + 1, buffer[cur]); - Log::FormatLine("\t#%i/%i (size:%i) %s", i + 1, buffer[5], dref.length(), dref.c_str()); + Log::FormatLine(LOG_DEBUG, "DBUG", " #%i/%i (size:%i) %s", + i + 1, buffer[5], dref.length(), dref); cur += 1 + buffer[cur]; } break; @@ -162,23 +161,22 @@ namespace XPC ss << " AC:" << (int)aircraft; ss << " Pos:(" << pos[0] << ' ' << pos[1] << ' ' << pos[2] << ") Orient:("; ss << orient[3] << ' ' << orient[4] << ' ' << orient[5] << ") Gear:"; - ss << gear; - Log::WriteLine(ss.str()); + ss << gear; + Log::WriteLine(LOG_DEBUG, "DBUG", ss.str()); break; } case 0x554D4953: // SIMU { - ss << ' ' << (int)buffer[5]; - Log::WriteLine(ss.str()); + ss << ' ' << (int)buffer[5]; + Log::WriteLine(LOG_DEBUG, "DBUG", ss.str()); break; } default: { - ss << " UNKNOWN HEADER "; - Log::WriteLine(ss.str()); + ss << " UNKNOWN HEADER "; + Log::WriteLine(LOG_DEBUG, "DBUG", ss.str()); break; } } -#endif } } diff --git a/xpcPlugin/MessageHandlers.cpp b/xpcPlugin/MessageHandlers.cpp index b2dc625..f89c001 100644 --- a/xpcPlugin/MessageHandlers.cpp +++ b/xpcPlugin/MessageHandlers.cpp @@ -80,19 +80,14 @@ namespace XPC std::string head = msg.GetHead(); if (head == "") { -#if LOG_VERBOSITY > 1 - Log::WriteLine("[MSGH] Warning: HandleMessage called with empty message."); -#endif + Log::WriteLine(LOG_WARN, "MSGH", "Warning: HandleMessage called with empty message."); return; // No Message to handle } - msg.PrintToLog(); // Set current connection sockaddr sourceaddr = msg.GetSource(); connectionKey = UDPSocket::GetHost(&sourceaddr); -#if LOG_VERBOSITY > 4 - Log::FormatLine("[MSGH] Handling message from %s", connectionKey.c_str()); -#endif + Log::FormatLine(LOG_INFO, "MSGH", "Handling message from %s", connectionKey); std::map::iterator conn = connections.find(connectionKey); if (conn == connections.end()) // New connection { @@ -104,19 +99,17 @@ namespace XPC connection.addr = sourceaddr; connection.getdCount = 0; connections[connectionKey] = connection; -#if LOG_VERBOSITY > 2 - Log::FormatLine("[MSGH] New connection. ID=%u, Remote=%s", connection.id, connectionKey.c_str()); -#endif + Log::FormatLine(LOG_TRACE, "MSGH", "New connection. ID=%u, Remote=%s", + connection.id, connectionKey); } else { connection = (*conn).second; -#if LOG_VERBOSITY > 3 - Log::FormatLine("[MSGH] Existing connection. ID=%u, Remote=%s", - connection.id, connectionKey.c_str()); -#endif + Log::FormatLine(LOG_TRACE, "MSGH", "Existing connection. ID=%u, Remote=%s", + connection.id, connectionKey); } + msg.PrintToLog(); // Check if there is a handler for this message type. If so, execute // that handler. Otherwise, execute the unknown message handler. std::map::iterator iter = handlers.find(head); @@ -153,10 +146,8 @@ namespace XPC break; } default: -#if LOG_VERBOSITY > 0 - Log::WriteLine("[CONN] ERROR: Unknown address type."); + Log::WriteLine(LOG_ERROR, "CONN", "ERROR: Unknown address type."); return; -#endif } connections.erase(connectionKey); connectionKey = UDPSocket::GetHost(&connection.addr); @@ -167,10 +158,8 @@ namespace XPC response[5] = connection.id; // Update log -#if LOG_VERBOSITY > 1 - Log::FormatLine("[CONN] ID: %u New destination port: %u", + Log::FormatLine(LOG_TRACE, "CONN", "ID: %u New destination port: %u", connection.id, port); -#endif // Send response sock->SendTo(response, 6, &connection.addr); @@ -179,19 +168,16 @@ namespace XPC void MessageHandlers::HandleCtrl(const Message& msg) { // Update Log -#if LOG_VERBOSITY > 2 - Log::FormatLine("[CTRL] Message Received (Conn %i)", connection.id); -#endif + Log::FormatLine(LOG_TRACE, "CTRL", "Message Received (Conn %i)", connection.id); const unsigned char* buffer = msg.GetBuffer(); std::size_t size = msg.GetSize(); - //Legacy packets that don't specify an aircraft number should be 26 bytes long. - //Packets specifying an A/C num should be 27 bytes. + // Legacy packets that don't specify an aircraft number should be 26 bytes long. + // Packets specifying an A/C num should be 27 bytes. Packets specifying a speedbrake + // should be 31 bytes. if (size != 26 && size != 27 && size != 31) { -#if LOG_VERBOSITY > 0 - Log::FormatLine("[CTRL] ERROR: Unexpected message length (%i)", size); -#endif + Log::FormatLine(LOG_ERROR, "CTRL", "ERROR: Unexpected message length (%i)", size); return; } @@ -263,23 +249,17 @@ namespace XPC std::size_t numCols = (size - 5) / 36; if (numCols > 0) { -#if LOG_VERBOSITY > 1 - Log::FormatLine("[DATA] Message Received (Conn %i)", connection.id); -#endif + Log::FormatLine(LOG_TRACE, "DATA", "Message Received (Conn %i)", connection.id); } else { -#if LOG_VERBOSITY > 0 - Log::FormatLine("[DATA] WARNING: Empty data packet received (Conn %i)", connection.id); -#endif + Log::FormatLine(LOG_WARN, "DATA", "WARNING: Empty data packet received (Conn %i)", connection.id); return; } if (numCols > 134) // Error. Will overflow values { -#if LOG_VERBOSITY > 0 - Log::FormatLine("[DATA] ERROR: numCols to large."); -#endif + Log::FormatLine(LOG_ERROR, "DATA", "ERROR: numCols to large."); return; } float values[134][9]; @@ -299,9 +279,7 @@ namespace XPC unsigned char dataRef = (unsigned char)values[i][0]; if (dataRef >= 134) { -#if LOG_VERBOSITY > 0 - Log::FormatLine("[DATA] ERROR: DataRef # must be between 0 - 134 (Received: %hi)", (int)dataRef); -#endif + Log::FormatLine(LOG_ERROR, "DATA", "ERROR: DataRef # must be between 0 - 134 (Received: %hi)", (int)dataRef); continue; } @@ -315,9 +293,7 @@ namespace XPC float hpath = savedHPath != -998 ? savedHPath : DataManager::GetFloat(DREF_HPath); if (alpha != alpha || hpath != hpath) { -#if LOG_VERBOSITY > 0 - Log::WriteLine("[DATA] ERROR: Value must be a number (NaN received)"); -#endif + Log::WriteLine(LOG_ERROR, "DATA", "ERROR: Value must be a number (NaN received)"); break; } const float deg2rad = 0.0174532925F; @@ -347,9 +323,7 @@ namespace XPC { if (values[i][1] != values[i][1] || values[i][3] != values[i][3]) { -#if LOG_VERBOSITY > 0 - Log::WriteLine("[DATA] ERROR: Value must be a number (NaN received)"); -#endif + Log::WriteLine(LOG_ERROR, "DATA", "ERROR: Value must be a number (NaN received)"); break; } if (values[i][1] != -998) @@ -375,9 +349,7 @@ namespace XPC { if (values[i][1] != values[i][1]) { -#if LOG_VERBOSITY > 0 - Log::WriteLine("[DATA] ERROR: Value must be a number (NaN received)"); -#endif + Log::WriteLine(LOG_ERROR, "DATA", "ERROR: Value must be a number (NaN received)"); break; } float throttle[8]; @@ -394,9 +366,7 @@ namespace XPC memcpy(line, values[i] + 1, 8 * sizeof(float)); for (int j = 0; j < 8; ++j) { -#if LOG_VERBOSITY > 1 - Log::FormatLine("[DATA] Setting Dataref %i.%i to %f", dataRef, j, line[j]); -#endif + Log::FormatLine(LOG_ERROR, "DATA", "Setting Dataref %i.%i to %f", dataRef, j, line[j]); // TODO(jason-watkins): Why is this a special case? if (dataRef == 14 && j == 0) { @@ -465,24 +435,20 @@ namespace XPC unsigned char drefCount = buffer[5]; if (drefCount == 0) // Use last request { -#if LOG_VERBOSITY > 0 - Log::FormatLine("[GETD] DATA Requested: Repeat last request from connection %i (%i data refs)", + Log::FormatLine(LOG_TRACE, "GETD", + "DATA Requested: Repeat last request from connection %i (%i data refs)", connection.id, connection.getdCount); -#endif if (connection.getdCount == 0) // No previous request to use { -#if LOG_VERBOSITY > 1 - Log::FormatLine("[GETD] ERROR: No previous requests from connection %i.", connection.id); -#endif + Log::FormatLine(LOG_ERROR, "GETD", "ERROR: No previous requests from connection %i.", + connection.id); return; } } else // New request { -#if LOG_VERBOSITY > 0 - Log::FormatLine("[GETD] DATA Requested: New Request for connection %i (%i data refs)", + Log::FormatLine(LOG_TRACE, "GETD", "DATA Requested: New Request for connection %i (%i data refs)", connection.id, drefCount); -#endif std::size_t ptr = 6; for (int i = 0; i < drefCount; ++i) { @@ -512,17 +478,13 @@ namespace XPC void MessageHandlers::HandlePosi(const Message& msg) { // Update log -#if LOG_VERBOSITY > 0 - Log::FormatLine("[POSI] Message Received (Conn %i)", connection.id); -#endif + Log::FormatLine(LOG_TRACE, "POSI", "Message Received (Conn %i)", connection.id); const unsigned char* buffer = msg.GetBuffer(); const std::size_t size = msg.GetSize(); if (size < 34) { -#if LOG_VERBOSITY > 1 - Log::FormatLine("[POSI] ERROR: Unexpected size: %i (Expected at least 34)", size); -#endif + Log::FormatLine(LOG_ERROR, "POSI", "ERROR: Unexpected size: %i (Expected at least 34)", size); return; } @@ -556,17 +518,13 @@ namespace XPC void MessageHandlers::HandleSimu(const Message& msg) { // Update log -#if LOG_VERBOSITY > 1 - Log::FormatLine("[SIMU] Message Received (Conn %i)", connection.id); -#endif + Log::FormatLine(LOG_TRACE, "SIMU", "Message Received (Conn %i)", connection.id); char v = msg.GetBuffer()[5]; if (v < 0 || v > 2) { -#if LOG_VERBOSITY > 0 - Log::FormatLine("[SIMU] ERROR: Invalid argument: %i", v); + Log::FormatLine(LOG_ERROR, "SIMU", "ERROR: Invalid argument: %i", v); return; -#endif } int value[20]; @@ -589,28 +547,24 @@ namespace XPC // Set DREF DataManager::Set(DREF_Pause, value, 20); -#if LOG_VERBOSITY > 2 switch (v) { case 0: - Log::WriteLine("[SIMU] Simulation Resumed"); + Log::WriteLine(LOG_INFO, "SIMU", "Simulation resumed"); break; case 1: - Log::WriteLine("[SIMU] Simulation Paused"); + Log::WriteLine(LOG_INFO, "SIMU", "Simulation paused"); break; case 2: - Log::WriteLine("[SIMU] Simulation switched."); + Log::WriteLine(LOG_INFO, "SIMU", "Simulation switched"); break; } -#endif } void MessageHandlers::HandleText(const Message& msg) { // Update Log -#if LOG_VERBOSITY > 0 - Log::FormatLine("[TEXT] Message Received (Conn %i)", connection.id); -#endif + Log::FormatLine(LOG_TRACE, "TEXT", "Message Received (Conn %i)", connection.id); std::size_t len = msg.GetSize(); const unsigned char* buffer = msg.GetBuffer(); @@ -618,18 +572,14 @@ namespace XPC char text[256] = { 0 }; if (len < 14) { -#if LOG_VERBOSITY > 1 - Log::WriteLine("[TEXT] ERROR: Length less than 14 bytes"); -#endif + Log::WriteLine(LOG_ERROR, "TEXT", "ERROR: Length less than 14 bytes"); return; } size_t msgLen = (unsigned char)buffer[13]; if (msgLen == 0) { Drawing::ClearMessage(); -#if LOG_VERBOSITY > 2 - Log::WriteLine("[TEXT] Text cleared"); -#endif + Log::WriteLine(LOG_INFO, "TEXT", "[TEXT] Text cleared"); } else { @@ -637,25 +587,19 @@ namespace XPC int y = *((int*)(buffer + 9)); strncpy(text, (char*)buffer + 14, msgLen); Drawing::SetMessage(x, y, text); -#if LOG_VERBOSITY > 2 - Log::WriteLine("[TEXT] Text set"); -#endif + Log::WriteLine(LOG_INFO, "TEXT", "[TEXT] Text set"); } } void MessageHandlers::HandleView(const Message& msg) { // Update Log -#if LOG_VERBOSITY > 0 - Log::FormatLine("[VIEW] Message Received (Conn %i)", connection.id); -#endif + Log::FormatLine(LOG_TRACE, "VIEW", "Message Received(Conn %i)", connection.id); const std::size_t size = msg.GetSize(); if (size != 9) { -#if LOG_VERBOSITY > 1 - Log::FormatLine("[VIEW] Error: Unexpected length. Message was %d bytes, expected 9.", size); -#endif + Log::FormatLine(LOG_ERROR, "VIEW", "Error: Unexpected length. Message was %d bytes, expected 9.", size); return; } const unsigned char* buffer = msg.GetBuffer(); @@ -666,9 +610,7 @@ namespace XPC void MessageHandlers::HandleWypt(const Message& msg) { // Update Log -#if LOG_VERBOSITY > 0 - Log::FormatLine("[WYPT] Message Received (Conn %i)", connection.id); -#endif + Log::FormatLine(LOG_TRACE, "WYPT", "Message Received (Conn %i)", connection.id); // Parse data const unsigned char* buffer = msg.GetBuffer(); @@ -685,9 +627,7 @@ namespace XPC } // Perform operation -#if LOG_VERBOSITY > 2 - Log::FormatLine("[WYPT] Performing operation %i", op); -#endif + Log::FormatLine(LOG_INFO, "WYPT", "Performing operation %i", op); switch (op) { case 1: @@ -700,18 +640,14 @@ namespace XPC Drawing::ClearWaypoints(); break; default: -#if LOG_VERBOSITY > 1 - Log::FormatLine("[WYPT] ERROR: %i is not a valid operation.", op); -#endif + Log::FormatLine(LOG_ERROR, "WYPT", "ERROR: %i is not a valid operation.", op); break; } } void MessageHandlers::HandleXPlaneData(const Message& msg) { -#if LOG_VERBOSITY > 1 - Log::WriteLine("[MSGH] Sending raw data to X-Plane"); -#endif + Log::WriteLine(LOG_TRACE, "MSGH", "Sending raw data to X - Plane"); sockaddr_in loopback; loopback.sin_family = AF_INET; loopback.sin_addr.s_addr = htonl(INADDR_LOOPBACK); @@ -721,9 +657,6 @@ namespace XPC void MessageHandlers::HandleUnknown(const Message& msg) { - // UPDATE LOG -#if LOG_VERBOSITY > 0 - Log::FormatLine("[EXEC] ERROR: Unknown packet type %s", msg.GetHead().c_str()); -#endif + Log::FormatLine(LOG_ERROR, "MSGH", "ERROR: Unknown packet type %s", msg.GetHead().c_str()); } } diff --git a/xpcPlugin/UDPSocket.cpp b/xpcPlugin/UDPSocket.cpp index 802a06d..8b8dec9 100644 --- a/xpcPlugin/UDPSocket.cpp +++ b/xpcPlugin/UDPSocket.cpp @@ -8,11 +8,11 @@ namespace XPC { + const static std::string tag = "SOCK"; + UDPSocket::UDPSocket(unsigned short recvPort) { -#if LOG_VERBOSITY > 1 - Log::FormatLine("[SOCK] Opening socket (port:%d)", recvPort); -#endif + Log::FormatLine(LOG_TRACE, tag, "Opening socket (port:%d)", recvPort); // Setup Port struct sockaddr_in localAddr; localAddr.sin_family = AF_INET; @@ -25,18 +25,14 @@ namespace XPC int startResult = WSAStartup(MAKEWORD(2, 2), &wsa); if (startResult != 0) { -#if LOG_VERBOSITY > 0 - Log::FormatLine("[SOCK] ERROR: WSAStartup failed with error code %i.", startResult); -#endif + Log::FormatLine(LOG_FATAL, tag, "ERROR: WSAStartup failed with error code %i.", startResult); this->sock = ~0; return; } if ((this->sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == INVALID_SOCKET) { -#if LOG_VERBOSITY > 0 int err = WSAGetLastError(); - Log::FormatLine("[SOCK] ERROR: Failed to open socket. (Error code %i)", err); -#endif + Log::FormatLine(LOG_FATAL, tag, "ERROR: Failed to open socket. (Error code %i)", err); return; } #elif (__APPLE__ || __linux) @@ -52,10 +48,10 @@ namespace XPC if (bind(this->sock, (struct sockaddr*)&localAddr, sizeof(localAddr)) != 0) { #ifdef _WIN32 -#if LOG_VERBOSITY > 0 int err = WSAGetLastError(); - Log::FormatLine("[SOCK] ERROR: Failed to bind socket. (Error code %i)", err); -#endif + Log::FormatLine(LOG_FATAL, tag, "ERROR: Failed to bind socket. (Error code %i)", err); +#else + Log::WriteLine(LOG_FATAL, tag, "ERROR: Failed to bind socket."); #endif return; } @@ -67,10 +63,8 @@ namespace XPC DWORD msTimeOutWin = 1; // Minimum socket timeout in Windows is 1ms if(setsockopt(this->sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&msTimeOutWin, sizeof(msTimeOutWin)) != 0) { -#if LOG_VERBOSITY > 1 int err = WSAGetLastError(); - Log::FormatLine("[SOCK] ERROR: Failed to set timeout. (Error code %i)", err); -#endif + Log::FormatLine(LOG_ERROR, tag, "ERROR: Failed to set timeout. (Error code %i)", err); } #else struct timeval tv; @@ -82,9 +76,7 @@ namespace XPC UDPSocket::~UDPSocket() { -#if LOG_VERBOSITY > 1 - Log::FormatLine("[SOCK] Closing socket (%d)", this->sock); -#endif + Log::FormatLine(LOG_TRACE, tag, "Closing socket (%d)", this->sock); #ifdef _WIN32 closesocket(this->sock); #elif (__APPLE__ || __linux) @@ -116,13 +108,11 @@ namespace XPC // Select Command int result = select(-1, &stReadFDS, (FD_SET *)0, &stExceptFDS, &tv); -#if LOG_VERBOSITY > 1 if (result == SOCKET_ERROR) { int err = WSAGetLastError(); - Log::FormatLine("[SOCK] ERROR: Select failed. (Error code %i)", err); + Log::FormatLine(LOG_ERROR, tag, "ERROR: Select failed. (Error code %i)", err); } -#endif if (result <= 0) // No Data or error { return -1; @@ -141,15 +131,11 @@ namespace XPC { if (sendto(sock, (char*)buffer, (int)len, 0, remote, sizeof(*remote)) < 0) { -#if LOG_VERBOSITY > 0 - Log::FormatLine("[SOCK] Send failed. (remote: %s)", GetHost(remote).c_str()); -#endif + Log::FormatLine(LOG_ERROR, tag, "Send failed. (remote: %s)", GetHost(remote).c_str()); } else { -#if LOG_VERBOSITY > 3 - Log::FormatLine("[SOCK] Datagram sent. (remote: %s)", GetHost(remote).c_str()); -#endif + Log::FormatLine(LOG_INFO, tag, "Send failed. (remote: %s)", GetHost(remote).c_str()); } } diff --git a/xpcPlugin/XPCPlugin.cpp b/xpcPlugin/XPCPlugin.cpp index 104e2d1..3b4f88f 100755 --- a/xpcPlugin/XPCPlugin.cpp +++ b/xpcPlugin/XPCPlugin.cpp @@ -106,7 +106,7 @@ PLUGIN_API int XPluginStart(char* outName, char* outSig, char* outDesc) } #endif XPC::Log::Initialize("1.0.1"); - XPC::Log::WriteLine("[EXEC] Plugin Start"); + XPC::Log::WriteLine(LOG_INFO, "EXEC", "Plugin Start"); XPC::DataManager::Initialize(); float interval = -1; // Call every frame @@ -119,7 +119,7 @@ PLUGIN_API int XPluginStart(char* outName, char* outSig, char* outDesc) PLUGIN_API void XPluginStop(void) { XPLMUnregisterFlightLoopCallback(XPCFlightLoopCallback, NULL); - XPC::Log::WriteLine("[EXEC] Plugin Shutdown"); + XPC::Log::WriteLine(LOG_INFO, "EXEC", "Plugin Shutdown"); XPC::Log::Close(); } @@ -135,7 +135,7 @@ PLUGIN_API void XPluginDisable(void) // Stop rendering waypoints to screen. XPC::Drawing::ClearWaypoints(); - XPC::Log::WriteLine("[EXEC] Plugin Disabled, sockets closed"); + XPC::Log::WriteLine(LOG_INFO, "EXEC", "Plugin Disabled, sockets closed"); } PLUGIN_API int XPluginEnable(void) @@ -144,14 +144,12 @@ PLUGIN_API int XPluginEnable(void) sock = new XPC::UDPSocket(RECVPORT); XPC::MessageHandlers::SetSocket(sock); - XPC::Log::WriteLine("[EXEC] Plugin Enabled, sockets opened"); + XPC::Log::WriteLine(LOG_INFO, "EXEC", "Plugin Enabled, sockets opened"); if (benchmarkingSwitch > 0) { - XPC::Log::FormatLine("[EXEC] Benchmarking Enabled (Verbosity: %i)", benchmarkingSwitch); + XPC::Log::FormatLine(LOG_INFO, "EXEC", "Benchmarking Enabled (Verbosity: %i)", benchmarkingSwitch); } -#if LOG_VERBOSITY > 0 - XPC::Log::FormatLine("[EXEC] Debug Logging Enabled (Verbosity: %i)", LOG_VERBOSITY); -#endif + XPC::Log::FormatLine(LOG_INFO, "EXEC", "Debug Logging Enabled (Verbosity: %i)", LOG_LEVEL); return 1; } @@ -174,7 +172,7 @@ float XPCFlightLoopCallback(float inElapsedSinceLastCall, counter++; if (benchmarkingSwitch > 1) { - XPC::Log::FormatLine("Cycle time %.6f", inElapsedSinceLastCall); + XPC::Log::FormatLine(LOG_DEBUG, "EXEC", "Cycle time %.6f", inElapsedSinceLastCall); } for (int i = 0; i < OPS_PER_CYCLE; i++) @@ -198,14 +196,14 @@ float XPCFlightLoopCallback(float inElapsedSinceLastCall, #if (__APPLE__) lap = (double)mach_absolute_time( ) * timeConvert; diff_t = lap - start; - XPC::Log::FormatLine("[BENCH] Runtime %.6f", diff_t); + XPC::Log::FormatLine(LOG_INFO, "EXEC", "Runtime %.6f", diff_t); #endif } } if (cyclesToClear != -1 && counter%cyclesToClear == 0) { - XPC::Log::WriteLine("[EXEC] Cleared UDP Buffer"); + XPC::Log::WriteLine(LOG_DEBUG, "EXEC", "Cleared UDP Buffer"); delete sock; sock = new XPC::UDPSocket(RECVPORT); } diff --git a/xpcPlugin/xpcPlugin/xpcPlugin.vcxproj b/xpcPlugin/xpcPlugin/xpcPlugin.vcxproj index 70c01f1..2f162aa 100644 --- a/xpcPlugin/xpcPlugin/xpcPlugin.vcxproj +++ b/xpcPlugin/xpcPlugin/xpcPlugin.vcxproj @@ -101,7 +101,7 @@ NotUsing Level3 Disabled - IBM=1;XPLM200;_DEBUG;_WINDOWS;_USRDLL;XPCPLUGIN_EXPORTS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + IBM=1;XPLM200;_DEBUG;_WINDOWS;_USRDLL;XPCPLUGIN_EXPORTS;_CRT_SECURE_NO_WARNINGS;LOG_LEVEL=LOG_TRACE;%(PreprocessorDefinitions) OldStyle true From a406b82f4480c49cb32c0254727d6f1a1af46ff9 Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Mon, 11 May 2015 15:07:41 -0700 Subject: [PATCH 61/81] Updated versions and improved comments. --- xpcPlugin/DataManager.h | 4 ++-- xpcPlugin/Drawing.cpp | 18 ++++++++++++++---- xpcPlugin/Log.cpp | 3 +++ xpcPlugin/Log.h | 4 ++-- xpcPlugin/Message.h | 4 ++-- xpcPlugin/MessageHandlers.h | 4 ++-- xpcPlugin/UDPSocket.h | 4 ++-- 7 files changed, 27 insertions(+), 14 deletions(-) diff --git a/xpcPlugin/DataManager.h b/xpcPlugin/DataManager.h index 4e94832..6480f0c 100644 --- a/xpcPlugin/DataManager.h +++ b/xpcPlugin/DataManager.h @@ -142,10 +142,10 @@ namespace XPC /// Marshals data between the plugin and X-Plane. /// /// \author Jason Watkins - /// \version 1.0.1 + /// \version 1.1 /// \since 1.0.0 /// \date Intial Version: 2015-04-13 - /// \date Last Updated: 2015-04-29 + /// \date Last Updated: 2015-05-11 class DataManager { public: diff --git a/xpcPlugin/Drawing.cpp b/xpcPlugin/Drawing.cpp index 63caf55..06e6502 100644 --- a/xpcPlugin/Drawing.cpp +++ b/xpcPlugin/Drawing.cpp @@ -65,6 +65,8 @@ namespace XPC XPLMDataRef planeZref; //Internal Functions + + /// Comparse two size_t integers. Used by qsort in RemoveWaypoints. static int cmp(const void * a, const void * b) { std::size_t sa = *(size_t*)a; @@ -80,6 +82,12 @@ namespace XPC return 0; } + /// Draws a cube centered at the specified OpenGL world coordinates. + /// + /// \param x The X coordinate. + /// \param y The Y coordinate. + /// \param z The Z coordinate. + /// \param d The distance from the player airplane to the center of the cube. static void gl_drawCube(float x, float y, float z, float d) { //tan(0.25) degrees. Should scale all markers to appear about the same size @@ -118,18 +126,21 @@ namespace XPC glEnd(); } + /// Draws the string set by the TEXT command. static int MessageDrawCallback(XPLMDrawingPhase inPhase, int inIsBefore, void * inRefcon) { + const int LINE_HEIGHT = 16; XPLMDrawString(rgb, msgX, msgY, msgVal, NULL, xplmFont_Basic); - int y = msgY - 16; + int y = msgY - LINE_HEIGHT; for (size_t i = 0; i < newLineCount; ++i) { XPLMDrawString(rgb, msgX, y, msgVal + newLines[i], NULL, xplmFont_Basic); - y -= 16; + y -= LINE_HEIGHT; } return 1; } + /// Draws waypoints. static int RouteDrawCallback(XPLMDrawingPhase inPhase, int inIsBefore, void * inRefcon) { float px = XPLMGetDataf(planeXref); @@ -190,8 +201,7 @@ namespace XPC void Drawing::SetMessage(int x, int y, char* msg) { - //Determine size of message and clear instead if the message string - //is empty. + // Determine the size of the message and clear it if it is empty. size_t len = strnlen(msg, MSG_MAX - 1); if (len == 0) { diff --git a/xpcPlugin/Log.cpp b/xpcPlugin/Log.cpp index 8491402..ae181ea 100644 --- a/xpcPlugin/Log.cpp +++ b/xpcPlugin/Log.cpp @@ -45,6 +45,9 @@ namespace XPC return; } + // Note: Mode "w" deletes an existing file with the same name. This means that we only + // ever get the log from the last run. This matches the way that X-Plane treats its + // log. fd = std::fopen("XPCLog.txt", "w"); if (fd != NULL) { diff --git a/xpcPlugin/Log.h b/xpcPlugin/Log.h index 094d996..aa5a2ba 100644 --- a/xpcPlugin/Log.h +++ b/xpcPlugin/Log.h @@ -32,10 +32,10 @@ namespace XPC /// /// \details Provides functions to write lines to the XPC log file. /// \author Jason Watkins - /// \version 1.0 + /// \version 1.1 /// \since 1.0 /// \date Intial Version: 2015-04-09 - /// \date Last Updated: 2015-04-09 + /// \date Last Updated: 2015-05-11 class Log { public: diff --git a/xpcPlugin/Message.h b/xpcPlugin/Message.h index 56352f6..ca80513 100644 --- a/xpcPlugin/Message.h +++ b/xpcPlugin/Message.h @@ -10,10 +10,10 @@ namespace XPC /// Represents a message received from an XPC client. /// /// \author Jason Watkins - /// \version 1.0 + /// \version 1.1 /// \since 1.0 /// \date Intial Version: 2015-04-11 - /// \date Last Updated: 2015-04-11 + /// \date Last Updated: 2015-05-11 class Message { public: diff --git a/xpcPlugin/MessageHandlers.h b/xpcPlugin/MessageHandlers.h index 87ad20e..bd4cafb 100644 --- a/xpcPlugin/MessageHandlers.h +++ b/xpcPlugin/MessageHandlers.h @@ -15,10 +15,10 @@ namespace XPC /// Handles incommming messages and manages connections. /// /// \author Jason Watkins - /// \version 1.0 + /// \version 1.1 /// \since 1.0 /// \date Intial Version: 2015-04-12 - /// \date Last Updated: 2015-04-12 + /// \date Last Updated: 2015-05-11 class MessageHandlers { public: diff --git a/xpcPlugin/UDPSocket.h b/xpcPlugin/UDPSocket.h index 8f27eb2..90f4832 100644 --- a/xpcPlugin/UDPSocket.h +++ b/xpcPlugin/UDPSocket.h @@ -23,10 +23,10 @@ namespace XPC /// data to XPC clients. /// /// \author Jason Watkins - /// \version 1.0 + /// \version 1.1 /// \since 1.0 /// \date Intial Version: 2015-04-10 - /// \date Last Updated: 2015-04-11 + /// \date Last Updated: 2015-05-11 class UDPSocket { public: From c0efe91b608b1d89c5ad02f707e1d996ef088b29 Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Mon, 11 May 2015 15:17:04 -0700 Subject: [PATCH 62/81] Improved consistency of comment formatting. --- xpcPlugin/DataManager.cpp | 32 ++++++------ xpcPlugin/DataManager.h | 6 +-- xpcPlugin/Drawing.cpp | 74 ++++++++++++++-------------- xpcPlugin/Drawing.h | 4 +- xpcPlugin/Log.cpp | 4 +- xpcPlugin/Log.h | 4 +- xpcPlugin/Message.cpp | 4 +- xpcPlugin/Message.h | 4 +- xpcPlugin/MessageHandlers.cpp | 30 ++++++------ xpcPlugin/MessageHandlers.h | 4 +- xpcPlugin/UDPSocket.cpp | 16 +++--- xpcPlugin/UDPSocket.h | 10 ++-- xpcPlugin/XPCPlugin.cpp | 92 +++++++++++++++++------------------ 13 files changed, 142 insertions(+), 142 deletions(-) diff --git a/xpcPlugin/DataManager.cpp b/xpcPlugin/DataManager.cpp index 980d1da..e18f3c0 100644 --- a/xpcPlugin/DataManager.cpp +++ b/xpcPlugin/DataManager.cpp @@ -1,19 +1,19 @@ -//Copyright (c) 2013-2015 United States Government as represented by the Administrator of the -//National Aeronautics and Space Administration. All Rights Reserved. +// Copyright (c) 2013-2015 United States Government as represented by the Administrator of the +// National Aeronautics and Space Administration. All Rights Reserved. // -//X-Plane API -//Copyright(c) 2008, Sandy Barbour and Ben Supnik All rights reserved. -//Permission is hereby granted, free of charge, to any person obtaining a copy of this software and -//associated documentation files(the "Software"), to deal in the Software without restriction, -//including without limitation the rights to use, copy, modify, merge, publish, distribute, -//sublicense, and / or sell copies of the Software, and to permit persons to whom the Software is -//furnished to do so, subject to the following conditions : -// * Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// * Neither the names of the authors nor that of X - Plane or Laminar Research -// may be used to endorse or promote products derived from this software -// without specific prior written permission from the authors or -// Laminar Research, respectively. +// X-Plane API +// Copyright(c) 2008, Sandy Barbour and Ben Supnik All rights reserved. +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +// associated documentation files(the "Software"), to deal in the Software without restriction, +// including without limitation the rights to use, copy, modify, merge, publish, distribute, +// sublicense, and / or sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions : +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// * Neither the names of the authors nor that of X - Plane or Laminar Research +// may be used to endorse or promote products derived from this software +// without specific prior written permission from the authors or +// Laminar Research, respectively. #include "DataManager.h" #include "Log.h" @@ -724,7 +724,7 @@ namespace XPC { // Convert to Quaternions // from: http://www.xsquawkbox.net/xpsdk/mediawiki/MovingThePlane - // http://ntrs.nasa.gov/archive/nasa/casi.ntrs.nasa.gov/19770024290.pdf + // http://ntrs.nasa.gov/archive/nasa/casi.ntrs.nasa.gov/19770024290.pdf float q[4]; float halfRad = 0.00872664625997F; orient[2] = halfRad * orient[2]; diff --git a/xpcPlugin/DataManager.h b/xpcPlugin/DataManager.h index 6480f0c..7e896c7 100644 --- a/xpcPlugin/DataManager.h +++ b/xpcPlugin/DataManager.h @@ -1,5 +1,5 @@ -//Copyright (c) 2013-2015 United States Government as represented by the Administrator of the -//National Aeronautics and Space Administration. All Rights Reserved. +// Copyright (c) 2013-2015 United States Government as represented by the Administrator of the +// National Aeronautics and Space Administration. All Rights Reserved. #ifndef XPCPLUGIN_DATAMANAGER_H_ #define XPCPLUGIN_DATAMANAGER_H_ @@ -62,7 +62,7 @@ namespace XPC DREF_L, DREF_N, - //PQR (Angular Velocities) + // PQR (Angular Velocities) DREF_QRad = 1600, DREF_PRad, DREF_RRad, diff --git a/xpcPlugin/Drawing.cpp b/xpcPlugin/Drawing.cpp index 06e6502..d7539b6 100644 --- a/xpcPlugin/Drawing.cpp +++ b/xpcPlugin/Drawing.cpp @@ -1,19 +1,19 @@ -//Copyright (c) 2013-2015 United States Government as represented by the Administrator of the -//National Aeronautics and Space Administration. All Rights Reserved. +// Copyright (c) 2013-2015 United States Government as represented by the Administrator of the +// National Aeronautics and Space Administration. All Rights Reserved. // -//X-Plane API -//Copyright(c) 2008, Sandy Barbour and Ben Supnik All rights reserved. -//Permission is hereby granted, free of charge, to any person obtaining a copy of this software and -//associated documentation files(the "Software"), to deal in the Software without restriction, -//including without limitation the rights to use, copy, modify, merge, publish, distribute, -//sublicense, and / or sell copies of the Software, and to permit persons to whom the Software is -//furnished to do so, subject to the following conditions : -// * Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// * Neither the names of the authors nor that of X - Plane or Laminar Research -// may be used to endorse or promote products derived from this software -// without specific prior written permission from the authors or -// Laminar Research, respectively. +// X-Plane API +// Copyright(c) 2008, Sandy Barbour and Ben Supnik All rights reserved. +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +// associated documentation files(the "Software"), to deal in the Software without restriction, +// including without limitation the rights to use, copy, modify, merge, publish, distribute, +// sublicense, and / or sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions : +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// * Neither the names of the authors nor that of X - Plane or Laminar Research +// may be used to endorse or promote products derived from this software +// without specific prior written permission from the authors or +// Laminar Research, respectively. #include "Drawing.h" #include "XPLMDisplay.h" @@ -23,7 +23,7 @@ #include #include #include -//OpenGL includes +// OpenGL includes #if IBM #include #endif @@ -31,11 +31,11 @@ # include #else # include -#endif/*__APPLE__*/ +#endif namespace XPC { - //Internal Structures + // Internal Structures typedef struct { double x; @@ -43,7 +43,7 @@ namespace XPC double z; } LocalPoint; - //Internal Memory + // Internal Memory static const size_t MSG_MAX = 1024; static const size_t MSG_LINE_MAX = MSG_MAX / 16; static bool msgEnabled = false; @@ -64,7 +64,7 @@ namespace XPC XPLMDataRef planeYref; XPLMDataRef planeZref; - //Internal Functions + // Internal Functions /// Comparse two size_t integers. Used by qsort in RemoveWaypoints. static int cmp(const void * a, const void * b) @@ -90,34 +90,34 @@ namespace XPC /// \param d The distance from the player airplane to the center of the cube. static void gl_drawCube(float x, float y, float z, float d) { - //tan(0.25) degrees. Should scale all markers to appear about the same size + // tan(0.25) degrees. Should scale all markers to appear about the same size const float TAN = 0.00436335F; float h = d * TAN; glBegin(GL_QUAD_STRIP); - //Top + // Top glVertex3f(x - h, y + h, z - h); glVertex3f(x + h, y + h, z - h); glVertex3f(x - h, y + h, z + h); glVertex3f(x + h, y + h, z + h); - //Front + // Front glVertex3f(x - h, y - h, z + h); glVertex3f(x + h, y - h, z + h); - //Bottom + // Bottom glVertex3f(x - h, y - h, z - h); glVertex3f(x + h, y - h, z - h); - //Back + // Back glVertex3f(x - h, y + h, z - h); glVertex3f(x + h, y + h, z - h); glEnd(); glBegin(GL_QUADS); - //Left + // Left glVertex3f(x - h, y + h, z - h); glVertex3f(x - h, y + h, z + h); glVertex3f(x - h, y - h, z + h); glVertex3f(x - h, y - h, z - h); - //Right + // Right glVertex3f(x + h, y + h, z + h); glVertex3f(x + h, y + h, z - h); glVertex3f(x + h, y - h, z - h); @@ -147,7 +147,7 @@ namespace XPC float py = XPLMGetDataf(planeYref); float pz = XPLMGetDataf(planeZref); - //Convert to local + // Convert to local for (size_t i = 0; i < numWaypoints; ++i) { Waypoint* g = &waypoints[i]; @@ -157,7 +157,7 @@ namespace XPC } - //Draw posts + // Draw posts glColor3f(1.0F, 1.0F, 1.0F); glBegin(GL_LINES); for (size_t i = 0; i < numWaypoints; ++i) @@ -168,7 +168,7 @@ namespace XPC } glEnd(); - //Draw route + // Draw route glColor3f(1.0F, 0.0F, 0.0F); glBegin(GL_LINE_STRIP); for (size_t i = 0; i < numWaypoints; ++i) @@ -178,7 +178,7 @@ namespace XPC } glEnd(); - //Draw markers + // Draw markers glColor3f(1.0F, 1.0F, 1.0F); for (size_t i = 0; i < numWaypoints; ++i) { @@ -192,7 +192,7 @@ namespace XPC return 1; } - //Public Functions + // Public Functions void Drawing::ClearMessage() { XPLMUnregisterDrawCallback(MessageDrawCallback, xplm_Phase_Window, 0, NULL); @@ -209,7 +209,7 @@ namespace XPC return; } - //Set the message, location, and mark new lines. + // Set the message, location, and mark new lines. strncpy(msgVal, msg, len + 1); newLineCount = 0; for (size_t i = 0; i < len && newLineCount < MSG_LINE_MAX; ++i) @@ -223,7 +223,7 @@ namespace XPC msgX = x < 0 ? 10 : x; msgY = y < 0 ? 600 : y; - //Enable drawing if necessary + // Enable drawing if necessary if (!msgEnabled) { XPLMRegisterDrawCallback(MessageDrawCallback, xplm_Phase_Window, 0, NULL); @@ -268,7 +268,7 @@ namespace XPC void Drawing::RemoveWaypoints(Waypoint points[], size_t numPoints) { - //Build a list of indices of waypoints we should delete. + // Build a list of indices of waypoints we should delete. size_t delPoints[WAYPOINT_MAX]; size_t delPointsCur = 0; for (size_t i = 0; i < numPoints; ++i) @@ -286,10 +286,10 @@ namespace XPC } } } - //Sort the indices so that we only have to iterate them once + // Sort the indices so that we only have to iterate them once qsort(delPoints, delPointsCur, sizeof(size_t), cmp); - //Copy the new array on top of the old array + // Copy the new array on top of the old array size_t copyCur = 0; size_t count = delPointsCur; delPointsCur = 0; diff --git a/xpcPlugin/Drawing.h b/xpcPlugin/Drawing.h index ce1573a..139c1d2 100644 --- a/xpcPlugin/Drawing.h +++ b/xpcPlugin/Drawing.h @@ -1,5 +1,5 @@ -//Copyright (c) 2013-2015 United States Government as represented by the Administrator of the -//National Aeronautics and Space Administration. All Rights Reserved. +// Copyright (c) 2013-2015 United States Government as represented by the Administrator of the +// National Aeronautics and Space Administration. All Rights Reserved. #ifndef XPCPLUGIN_DRAWING_H_ #define XPCPLUGIN_DRAWING_H_ diff --git a/xpcPlugin/Log.cpp b/xpcPlugin/Log.cpp index ae181ea..fadb89a 100644 --- a/xpcPlugin/Log.cpp +++ b/xpcPlugin/Log.cpp @@ -1,5 +1,5 @@ -//Copyright (c) 2013-2015 United States Government as represented by the Administrator of the -//National Aeronautics and Space Administration. All Rights Reserved. +// Copyright (c) 2013-2015 United States Government as represented by the Administrator of the +// National Aeronautics and Space Administration. All Rights Reserved. #include "Log.h" #include "XPLMUtilities.h" diff --git a/xpcPlugin/Log.h b/xpcPlugin/Log.h index aa5a2ba..29d1d8d 100644 --- a/xpcPlugin/Log.h +++ b/xpcPlugin/Log.h @@ -1,5 +1,5 @@ -//Copyright (c) 2013-2015 United States Government as represented by the Administrator of the -//National Aeronautics and Space Administration. All Rights Reserved. +// Copyright (c) 2013-2015 United States Government as represented by the Administrator of the +// National Aeronautics and Space Administration. All Rights Reserved. #ifndef XPCPLUGIN_LOG_H_ #define XPCPLUGIN_LOG_H_ #include diff --git a/xpcPlugin/Message.cpp b/xpcPlugin/Message.cpp index 50d1246..130c17a 100644 --- a/xpcPlugin/Message.cpp +++ b/xpcPlugin/Message.cpp @@ -1,5 +1,5 @@ -//Copyright (c) 2013-2015 United States Government as represented by the Administrator of the -//National Aeronautics and Space Administration. All Rights Reserved. +// Copyright (c) 2013-2015 United States Government as represented by the Administrator of the +// National Aeronautics and Space Administration. All Rights Reserved. #include "Message.h" #include "Log.h" diff --git a/xpcPlugin/Message.h b/xpcPlugin/Message.h index ca80513..095b77d 100644 --- a/xpcPlugin/Message.h +++ b/xpcPlugin/Message.h @@ -1,5 +1,5 @@ -//Copyright (c) 2013-2015 United States Government as represented by the Administrator of the -//National Aeronautics and Space Administration. All Rights Reserved. +// Copyright (c) 2013-2015 United States Government as represented by the Administrator of the +// National Aeronautics and Space Administration. All Rights Reserved. #ifndef XPCPLUGIN_MESSAGE_H_ #define XPCPLUGIN_MESSAGE_H_ diff --git a/xpcPlugin/MessageHandlers.cpp b/xpcPlugin/MessageHandlers.cpp index f89c001..e2f8e22 100644 --- a/xpcPlugin/MessageHandlers.cpp +++ b/xpcPlugin/MessageHandlers.cpp @@ -1,19 +1,19 @@ -//Copyright (c) 2013-2015 United States Government as represented by the Administrator of the -//National Aeronautics and Space Administration. All Rights Reserved. +// Copyright (c) 2013-2015 United States Government as represented by the Administrator of the +// National Aeronautics and Space Administration. All Rights Reserved. // -//X-Plane API -//Copyright(c) 2008, Sandy Barbour and Ben Supnik All rights reserved. -//Permission is hereby granted, free of charge, to any person obtaining a copy of this software and -//associated documentation files(the "Software"), to deal in the Software without restriction, -//including without limitation the rights to use, copy, modify, merge, publish, distribute, -//sublicense, and / or sell copies of the Software, and to permit persons to whom the Software is -//furnished to do so, subject to the following conditions : -// * Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// * Neither the names of the authors nor that of X - Plane or Laminar Research -// may be used to endorse or promote products derived from this software -// without specific prior written permission from the authors or -// Laminar Research, respectively. +// X-Plane API +// Copyright(c) 2008, Sandy Barbour and Ben Supnik All rights reserved. +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +// associated documentation files(the "Software"), to deal in the Software without restriction, +// including without limitation the rights to use, copy, modify, merge, publish, distribute, +// sublicense, and / or sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions : +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// * Neither the names of the authors nor that of X - Plane or Laminar Research +// may be used to endorse or promote products derived from this software +// without specific prior written permission from the authors or +// Laminar Research, respectively. #include "MessageHandlers.h" #include "DataManager.h" #include "Drawing.h" diff --git a/xpcPlugin/MessageHandlers.h b/xpcPlugin/MessageHandlers.h index bd4cafb..857b0b8 100644 --- a/xpcPlugin/MessageHandlers.h +++ b/xpcPlugin/MessageHandlers.h @@ -1,5 +1,5 @@ -//Copyright (c) 2013-2015 United States Government as represented by the Administrator of the -//National Aeronautics and Space Administration. All Rights Reserved. +// Copyright (c) 2013-2015 United States Government as represented by the Administrator of the +// National Aeronautics and Space Administration. All Rights Reserved. #ifndef XPCPLUGIN_MESSAGEHANDLERS_H_ #define XPCPLUGIN_MESSAGEHANDLERS_H_ #include "Message.h" diff --git a/xpcPlugin/UDPSocket.cpp b/xpcPlugin/UDPSocket.cpp index 8b8dec9..8a1aa36 100644 --- a/xpcPlugin/UDPSocket.cpp +++ b/xpcPlugin/UDPSocket.cpp @@ -1,5 +1,5 @@ -//Copyright (c) 2013-2015 United States Government as represented by the Administrator of the -//National Aeronautics and Space Administration. All Rights Reserved. +// Copyright (c) 2013-2015 United States Government as represented by the Administrator of the +// National Aeronautics and Space Administration. All Rights Reserved. #include "Log.h" #include "UDPSocket.h" @@ -19,7 +19,7 @@ namespace XPC localAddr.sin_addr.s_addr = INADDR_ANY; localAddr.sin_port = htons(recvPort); - //Create and bind the socket + // Create and bind the socket #ifdef _WIN32 WSADATA wsa; int startResult = WSAStartup(MAKEWORD(2, 2), &wsa); @@ -56,7 +56,7 @@ namespace XPC return; } - //Set Timout + // Set Timout int usTimeOut = 500; #ifdef _WIN32 @@ -68,8 +68,8 @@ namespace XPC } #else struct timeval tv; - tv.tv_sec = 0; /* Sec Timeout */ - tv.tv_usec = usTimeOut; // Microsec Timeout + tv.tv_sec = 0; + tv.tv_usec = usTimeOut; setsockopt(this->sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval)); #endif } @@ -103,8 +103,8 @@ namespace XPC FD_SET(sock, &stReadFDS); FD_ZERO(&stExceptFDS); FD_SET(sock, &stExceptFDS); - tv.tv_sec = 0; /* Sec Timeout */ - tv.tv_usec = 250; // Microsec Timeout + tv.tv_sec = 0; + tv.tv_usec = 250; // Select Command int result = select(-1, &stReadFDS, (FD_SET *)0, &stExceptFDS, &tv); diff --git a/xpcPlugin/UDPSocket.h b/xpcPlugin/UDPSocket.h index 90f4832..5b87439 100644 --- a/xpcPlugin/UDPSocket.h +++ b/xpcPlugin/UDPSocket.h @@ -1,5 +1,5 @@ -//Copyright (c) 2013-2015 United States Government as represented by the Administrator of the -//National Aeronautics and Space Administration. All Rights Reserved. +// Copyright (c) 2013-2015 United States Government as represented by the Administrator of the +// National Aeronautics and Space Administration. All Rights Reserved. #ifndef XPCPLUGIN_SOCKET_H_ #define XPCPLUGIN_SOCKET_H_ @@ -8,7 +8,7 @@ #ifdef _WIN32 #include #include -#pragma comment(lib, "ws2_32.lib") //Winsock Library +#pragma comment(lib, "ws2_32.lib") // Winsock Library #elif (__APPLE__ || __linux) #include #include @@ -45,9 +45,9 @@ namespace XPC /// \param buffer The array to copy the data into. /// \param size The number of bytes to read. /// \param remoteAddr When at least one byte is read, contains the address - /// of the remote host. + /// of the remote host. /// \returns The number of bytes read, or a negative number if - /// an error occurs. + /// an error occurs. int Read(unsigned char* buffer, int size, sockaddr* remoteAddr) const; /// Sends data to the specified remote endpoint. diff --git a/xpcPlugin/XPCPlugin.cpp b/xpcPlugin/XPCPlugin.cpp index 3b4f88f..98e9de6 100755 --- a/xpcPlugin/XPCPlugin.cpp +++ b/xpcPlugin/XPCPlugin.cpp @@ -1,58 +1,58 @@ -//Copyright (c) 2013-2015 United States Government as represented by the Administrator of the -//National Aeronautics and Space Administration. All Rights Reserved. +// Copyright (c) 2013-2015 United States Government as represented by the Administrator of the +// National Aeronautics and Space Administration. All Rights Reserved. // -//DISCLAIMERS -// No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY OF ANY KIND, -// EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, ANY WARRANTY THAT -// THE SUBJECT SOFTWARE WILL CONFORM TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY -// THAT THE SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, IF PROVIDED, -// WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES NOT, IN ANY MANNER, CONSTITUTE AN -// ENDORSEMENT BY GOVERNMENT AGENCY OR ANY PRIOR RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, -// HARDWARE, SOFTWARE PRODUCTS OR ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT -// SOFTWARE. FURTHER, GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND LIABILITIES REGARDING -// THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL SOFTWARE, AND DISTRIBUTES IT "AS IS." +// DISCLAIMERS +// No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY OF ANY KIND, +// EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, ANY WARRANTY THAT +// THE SUBJECT SOFTWARE WILL CONFORM TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY +// THAT THE SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, IF PROVIDED, +// WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES NOT, IN ANY MANNER, CONSTITUTE AN +// ENDORSEMENT BY GOVERNMENT AGENCY OR ANY PRIOR RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, +// HARDWARE, SOFTWARE PRODUCTS OR ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT +// SOFTWARE. FURTHER, GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND LIABILITIES REGARDING +// THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL SOFTWARE, AND DISTRIBUTES IT "AS IS." // -// Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS AGAINST THE UNITED STATES -// GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT. IF -// RECIPIENT'S USE OF THE SUBJECT SOFTWARE RESULTS IN ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES -// OR LOSSES ARISING FROM SUCH USE, INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR RESULTING -// FROM, RECIPIENT'S USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL INDEMNIFY AND HOLD HARMLESS THE -// UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT, -// TO THE EXTENT PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY FOR ANY SUCH MATTER SHALL BE THE -// IMMEDIATE, UNILATERAL TERMINATION OF THIS AGREEMENT. +// Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS AGAINST THE UNITED STATES +// GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT. IF +// RECIPIENT'S USE OF THE SUBJECT SOFTWARE RESULTS IN ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES +// OR LOSSES ARISING FROM SUCH USE, INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR RESULTING +// FROM, RECIPIENT'S USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL INDEMNIFY AND HOLD HARMLESS THE +// UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT, +// TO THE EXTENT PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY FOR ANY SUCH MATTER SHALL BE THE +// IMMEDIATE, UNILATERAL TERMINATION OF THIS AGREEMENT. // -//X-Plane API -//Copyright(c) 2008, Sandy Barbour and Ben Supnik All rights reserved. -//Permission is hereby granted, free of charge, to any person obtaining a copy of this software and -//associated documentation files(the "Software"), to deal in the Software without restriction, -//including without limitation the rights to use, copy, modify, merge, publish, distribute, -//sublicense, and / or sell copies of the Software, and to permit persons to whom the Software is -//furnished to do so, subject to the following conditions : -// * Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// * Neither the names of the authors nor that of X - Plane or Laminar Research -// may be used to endorse or promote products derived from this software -// without specific prior written permission from the authors or -// Laminar Research, respectively. +// X-Plane API +// Copyright(c) 2008, Sandy Barbour and Ben Supnik All rights reserved. +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +// associated documentation files(the "Software"), to deal in the Software without restriction, +// including without limitation the rights to use, copy, modify, merge, publish, distribute, +// sublicense, and / or sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions : +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// * Neither the names of the authors nor that of X - Plane or Laminar Research +// may be used to endorse or promote products derived from this software +// without specific prior written permission from the authors or +// Laminar Research, respectively. -// X-Plane Connect Plugin +// X-Plane Connect Plugin // -// DESCRIPTION -// XPCPlugin Facilitates Communication to and from the XPlane +// DESCRIPTION +// XPCPlugin Facilitates Communication to and from the XPlane // -// INSTRUCTIONS -// See Readme.md in the root of this repository or the wiki hosted on GitHub at -// https://github.com/nasa/XPlaneConnect/wiki for requirements, installation instructions, -// and detailed documentation. +// INSTRUCTIONS +// See Readme.md in the root of this repository or the wiki hosted on GitHub at +// https://github.com/nasa/XPlaneConnect/wiki for requirements, installation instructions, +// and detailed documentation. // -// CONTACT -// For questions email Christopher Teubert (christopher.a.teubert@nasa.gov) +// CONTACT +// For questions email Christopher Teubert (christopher.a.teubert@nasa.gov) // -// CONTRIBUTORS -// CT: Christopher Teubert (christopher.a.teubert@nasa.gov) -// JW: Jason Watkins (jason.w.watkins@nasa.gov) +// CONTRIBUTORS +// CT: Christopher Teubert (christopher.a.teubert@nasa.gov) +// JW: Jason Watkins (jason.w.watkins@nasa.gov) // XPC Includes #include "DataManager.h" From 46bd09e7b4b928acf8d9139935bcf012c90cc012 Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Mon, 11 May 2015 15:17:36 -0700 Subject: [PATCH 63/81] Increment version number. --- xpcPlugin/XPCPlugin.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xpcPlugin/XPCPlugin.cpp b/xpcPlugin/XPCPlugin.cpp index 98e9de6..bebfbcd 100755 --- a/xpcPlugin/XPCPlugin.cpp +++ b/xpcPlugin/XPCPlugin.cpp @@ -105,7 +105,7 @@ PLUGIN_API int XPluginStart(char* outName, char* outSig, char* outDesc) 1000000000.0; } #endif - XPC::Log::Initialize("1.0.1"); + XPC::Log::Initialize("1.1.0"); XPC::Log::WriteLine(LOG_INFO, "EXEC", "Plugin Start"); XPC::DataManager::Initialize(); From 236cdc02fa04c988895f48835492dda63e2e849b Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Mon, 11 May 2015 16:45:34 -0700 Subject: [PATCH 64/81] Moved flight loop callback registration/unregistration to to the enable/disable functions. --- xpcPlugin/XPCPlugin.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/xpcPlugin/XPCPlugin.cpp b/xpcPlugin/XPCPlugin.cpp index bebfbcd..c8b4aef 100755 --- a/xpcPlugin/XPCPlugin.cpp +++ b/xpcPlugin/XPCPlugin.cpp @@ -109,22 +109,19 @@ PLUGIN_API int XPluginStart(char* outName, char* outSig, char* outDesc) XPC::Log::WriteLine(LOG_INFO, "EXEC", "Plugin Start"); XPC::DataManager::Initialize(); - float interval = -1; // Call every frame - void* refcon = NULL; // Don't pass anything to the callback directly - XPLMRegisterFlightLoopCallback(XPCFlightLoopCallback, interval, refcon); - return 1; } PLUGIN_API void XPluginStop(void) { - XPLMUnregisterFlightLoopCallback(XPCFlightLoopCallback, NULL); XPC::Log::WriteLine(LOG_INFO, "EXEC", "Plugin Shutdown"); XPC::Log::Close(); } PLUGIN_API void XPluginDisable(void) { + XPLMUnregisterFlightLoopCallback(XPCFlightLoopCallback, NULL); + // Close sockets delete sock; sock = NULL; @@ -150,6 +147,10 @@ PLUGIN_API int XPluginEnable(void) XPC::Log::FormatLine(LOG_INFO, "EXEC", "Benchmarking Enabled (Verbosity: %i)", benchmarkingSwitch); } XPC::Log::FormatLine(LOG_INFO, "EXEC", "Debug Logging Enabled (Verbosity: %i)", LOG_LEVEL); + + float interval = -1; // Call every frame + void* refcon = NULL; // Don't pass anything to the callback directly + XPLMRegisterFlightLoopCallback(XPCFlightLoopCallback, interval, refcon); return 1; } From 8e46a905570c0b739a52044c9bf6fb78dc9742bf Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Tue, 12 May 2015 14:32:35 -0700 Subject: [PATCH 65/81] Fixed several typos in comments. --- xpcPlugin/DataManager.h | 4 ++-- xpcPlugin/Log.h | 2 +- xpcPlugin/MessageHandlers.h | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/xpcPlugin/DataManager.h b/xpcPlugin/DataManager.h index 7e896c7..178fb85 100644 --- a/xpcPlugin/DataManager.h +++ b/xpcPlugin/DataManager.h @@ -139,7 +139,7 @@ namespace XPC /// Maps X-Plane dataref lines to XPC DREF values. extern DREF XPData[134][8]; - /// Marshals data between the plugin and X-Plane. + /// Contains methods to martial data between the plugin and X-Plane. /// /// \author Jason Watkins /// \version 1.1 @@ -165,7 +165,7 @@ namespace XPC /// \remarks The first time this method is called for a given dataref, it must /// perform a relatively expensive lookup operation to translate the /// given string into an X-Plane internal pointer. This value is cached, - /// so subsequent calls will incure minimal extra overhead compared to + /// so subsequent calls will incur minimal extra overhead compared to /// the other methods in this class. /// /// \remarks For simplicity, this method is provided with only one output type. diff --git a/xpcPlugin/Log.h b/xpcPlugin/Log.h index 29d1d8d..d71eedb 100644 --- a/xpcPlugin/Log.h +++ b/xpcPlugin/Log.h @@ -6,7 +6,7 @@ // LOG_VERBOSITY determines the level of logging throughout the plugin. // OFF: No logging at all will be performed. -// FATAL: Critical errors that would normally resulti in termination of the program. Because XPC +// FATAL: Critical errors that would normally result in termination of the program. Because XPC // operates in the X-Plane process, we try to never actually crash. As a result, we this // level of logging may be the only indication of a problem. // ERROR: All errors not covered by FATAL diff --git a/xpcPlugin/MessageHandlers.h b/xpcPlugin/MessageHandlers.h index 857b0b8..13742ee 100644 --- a/xpcPlugin/MessageHandlers.h +++ b/xpcPlugin/MessageHandlers.h @@ -12,7 +12,7 @@ namespace XPC /// A function that handles a message. typedef void(*MessageHandler)(const Message&); - /// Handles incommming messages and manages connections. + /// Handles incoming messages and manages connections. /// /// \author Jason Watkins /// \version 1.1 From bd0c15bedeb42d3a3f1501cbc890d5f0bf579163 Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Tue, 12 May 2015 15:47:55 -0700 Subject: [PATCH 66/81] Improved trace logging. --- xpcPlugin/DataManager.cpp | 2 ++ xpcPlugin/Message.cpp | 28 +++++++++++++--------------- xpcPlugin/MessageHandlers.cpp | 20 ++++++++------------ 3 files changed, 23 insertions(+), 27 deletions(-) diff --git a/xpcPlugin/DataManager.cpp b/xpcPlugin/DataManager.cpp index e18f3c0..45a4919 100644 --- a/xpcPlugin/DataManager.cpp +++ b/xpcPlugin/DataManager.cpp @@ -38,6 +38,8 @@ namespace XPC void DataManager::Initialize() { + Log::WriteLine(LOG_TRACE, "DMAN", "Initializing drefs"); + drefs.insert(make_pair(DREF_None, XPLMFindDataRef("sim/test/test_float"))); drefs.insert(make_pair(DREF_Pause, XPLMFindDataRef("sim/operation/override/override_planepath"))); diff --git a/xpcPlugin/Message.cpp b/xpcPlugin/Message.cpp index 130c17a..f74329d 100644 --- a/xpcPlugin/Message.cpp +++ b/xpcPlugin/Message.cpp @@ -13,46 +13,44 @@ namespace XPC Message Message::ReadFrom(const UDPSocket& sock) { + Log::WriteLine(LOG_TRACE, "MESG", "Reading Message"); Message m; int len = sock.Read(m.buffer, bufferSize, &m.source); m.size = len < 0 ? 0 : len; + Log::FormatLine(LOG_TRACE, "MESG", "Read result: %i", len); return m; } unsigned long Message::GetMagicNumber() const { - if (size < 4) - { - return 0; - } - return *((unsigned long*)buffer); + unsigned long val = size < 4 ? 0 : *((unsigned long*)buffer); + Log::FormatLine(LOG_TRACE, "MESG", "Gettting magic number 0x%lX for message 0x%zX", val, this); + return val; } std::string Message::GetHead() const { - if (size < 4) - { - return ""; - } - return std::string((char*)buffer, 4); + std::string val = size < 4 ? "" : std::string((char*)buffer, 4); + Log::FormatLine(LOG_TRACE, "MESG", "Getting head %s for message 0x%zX", val, this); + return val; } const unsigned char* Message::GetBuffer() const { - if (size == 0) - { - return NULL; - } - return buffer; + const unsigned char* val = size == 0 ? NULL : buffer; + Log::FormatLine(LOG_TRACE, "MESG", "Returning buffer 0x%lX for message 0x%zX", val, this); + return val; } std::size_t Message::GetSize() const { + Log::FormatLine(LOG_TRACE, "MESG", "Returning size %zu for message 0x%zX", size, this); return size; } struct sockaddr Message::GetSource() const { + Log::FormatLine(LOG_TRACE, "MESG", "Returning source for message 0x%zX", this); return source; } diff --git a/xpcPlugin/MessageHandlers.cpp b/xpcPlugin/MessageHandlers.cpp index e2f8e22..1688505 100644 --- a/xpcPlugin/MessageHandlers.cpp +++ b/xpcPlugin/MessageHandlers.cpp @@ -35,6 +35,7 @@ namespace XPC void MessageHandlers::SetSocket(UDPSocket* socket) { + Log::WriteLine(LOG_TRACE, "MSGH", "Setting socket"); MessageHandlers::sock = socket; } @@ -42,6 +43,7 @@ namespace XPC { if (handlers.size() == 0) { + Log::WriteLine(LOG_TRACE, "MSGH", "Initializing handlers"); // Common messages handlers.insert(std::make_pair("CONN", MessageHandlers::HandleConn)); handlers.insert(std::make_pair("CTRL", MessageHandlers::HandleCtrl)); @@ -99,13 +101,13 @@ namespace XPC connection.addr = sourceaddr; connection.getdCount = 0; connections[connectionKey] = connection; - Log::FormatLine(LOG_TRACE, "MSGH", "New connection. ID=%u, Remote=%s", + Log::FormatLine(LOG_DEBUG, "MSGH", "New connection. ID=%u, Remote=%s", connection.id, connectionKey); } else { connection = (*conn).second; - Log::FormatLine(LOG_TRACE, "MSGH", "Existing connection. ID=%u, Remote=%s", + Log::FormatLine(LOG_DEBUG, "MSGH", "Existing connection. ID=%u, Remote=%s", connection.id, connectionKey); } @@ -392,9 +394,7 @@ namespace XPC void MessageHandlers::HandleDref(const Message& msg) { -#if LOG_VERBOSITY >= 3 - Log::FormatLine("[DREF] Request to set DREF value received (Conn %i)", connection.id); -#endif + Log::FormatLine(LOG_TRACE, "DREF", "Request to set DREF value received (Conn %i)", connection.id); const unsigned char* buffer = msg.GetBuffer(); std::size_t size = msg.GetSize(); std::size_t pos = 5; @@ -417,16 +417,12 @@ namespace XPC pos += 4 * valueCount; DataManager::Set(dref, values, valueCount); -#if LOG_VERBOSITY >= 4 - Log::FormatLine("[DREF] Set %d values for %s", valueCount, dref.c_str()); -#endif + Log::FormatLine(LOG_DEBUG, "DREF", "Set %d values for %s", valueCount, dref); } -#if LOG_VERBOSITY >= 2 if (pos != size) { - Log::WriteLine("[DREF] Error: Command did not terminate at the expected position."); + Log::WriteLine(LOG_ERROR, "DREF", "ERROR: Command did not terminate at the expected position."); } -#endif } void MessageHandlers::HandleGetD(const Message& msg) @@ -556,7 +552,7 @@ namespace XPC Log::WriteLine(LOG_INFO, "SIMU", "Simulation paused"); break; case 2: - Log::WriteLine(LOG_INFO, "SIMU", "Simulation switched"); + Log::FormatLine(LOG_INFO, "SIMU", "Simulation switched to %i", value[0]); break; } } From 693c5f3d23f6217f38dd2ebb066b88899f7862ff Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Thu, 14 May 2015 13:35:55 -0700 Subject: [PATCH 67/81] Moved handling of deafult values to the DataManager class. --- xpcPlugin/DataManager.cpp | 26 ++++++++++++++++++-------- xpcPlugin/DataManager.h | 11 ++++++++++- xpcPlugin/MessageHandlers.cpp | 28 ++++++++++++++-------------- 3 files changed, 42 insertions(+), 23 deletions(-) diff --git a/xpcPlugin/DataManager.cpp b/xpcPlugin/DataManager.cpp index 45a4919..23a07b5 100644 --- a/xpcPlugin/DataManager.cpp +++ b/xpcPlugin/DataManager.cpp @@ -626,7 +626,7 @@ namespace XPC Log::FormatLine(LOG_INFO, "DMAN", "Setting gear (value:%f, immediate:%i) for aircraft %i", gear, immediate, aircraft); - if ((gear < -8.5 && gear > -9.5) || (gear < -997.9 && gear > -999.1)) + if ((gear < -8.5 && gear > -9.5) || IsDefault(gear)) { return; } @@ -666,15 +666,15 @@ namespace XPC return; } - if (pos[0] < -997.9 && pos[0] > -999.1) + if (IsDefault(pos[0])) { pos[0] = (float)GetDouble(DREF_Latitude, aircraft); } - if (pos[1] < -997.9 && pos[1] > -999.1) + if (IsDefault(pos[1])) { pos[1] = (float)GetDouble(DREF_Longitude, aircraft); } - if (pos[2] < -997.9 && pos[2] > -999.1) + if (IsDefault(pos[2])) { pos[2] = (float)GetDouble(DREF_Elevation, aircraft); } @@ -702,15 +702,15 @@ namespace XPC return; } - if (orient[0] < -997.9 && orient[0] > -999.1) + if (IsDefault(orient[0])) { orient[0] = GetFloat(DREF_Pitch, aircraft); } - if (orient[1] < -997.9 && orient[1] > -999.1) + if (IsDefault(orient[1])) { orient[1] = GetFloat(DREF_Roll, aircraft); } - if (orient[2] < -997.9 && orient[2] > -999.1) + if (IsDefault(orient[2])) { orient[2] = GetFloat(DREF_HeadingTrue, aircraft); } @@ -752,7 +752,7 @@ namespace XPC Log::WriteLine(LOG_ERROR, "DMAN", "ERROR: Flap value must be a number (NaN received)"); return; } - if (value < -997.9 && value > -999.1) + if (IsDefault(value)) { return; } @@ -763,4 +763,14 @@ namespace XPC Set(DREF_FlapSetting, value); Set(DREF_FlapActual, value); } + + float DataManager::GetDefaultValue() + { + return -998.0F; + } + + bool DataManager::IsDefault(float value) + { + return value < -997.9 && value > -999.1; + } } diff --git a/xpcPlugin/DataManager.h b/xpcPlugin/DataManager.h index e5e5a50..cc38619 100644 --- a/xpcPlugin/DataManager.h +++ b/xpcPlugin/DataManager.h @@ -145,7 +145,7 @@ namespace XPC /// \version 1.1 /// \since 1.0.0 /// \date Intial Version: 2015-04-13 - /// \date Last Updated: 2015-05-11 + /// \date Last Updated: 2015-05-14 class DataManager { public: @@ -409,6 +409,15 @@ namespace XPC /// /// \param value The flaps settings. Should be between 0.0 (no flaps) and 1.0 (full flaps). static void SetFlaps(float value); + + /// Gets a default value that indicates that a dataref should not be changed. + static float GetDefaultValue(); + + /// Checks whether the given value should be treated as a default value. + /// + /// \param value The value to check. + /// \returns true if value is a default value; otherwise false. + static bool IsDefault(float value); }; } #endif diff --git a/xpcPlugin/MessageHandlers.cpp b/xpcPlugin/MessageHandlers.cpp index 1688505..4f7c3d3 100644 --- a/xpcPlugin/MessageHandlers.cpp +++ b/xpcPlugin/MessageHandlers.cpp @@ -195,26 +195,26 @@ namespace XPC { aircraftNumber = buffer[26]; } - float spdbrk = -998; + float spdbrk = DataManager::GetDefaultValue(); if (size >= 31) { spdbrk = *((float*)(buffer + 27)); } - if (pitch < -999.5 || pitch > -997.5) + if (!DataManager::IsDefault(pitch)) { DataManager::Set(DREF_YokePitch, pitch, aircraftNumber); } - if (roll < -999.5 || roll > -997.5) + if (!DataManager::IsDefault(roll)) { DataManager::Set(DREF_YokeRoll, roll, aircraftNumber); } - if (yaw < -999.5 || yaw > -997.5) + if (!DataManager::IsDefault(yaw)) { DataManager::Set(DREF_YokeHeading, yaw, aircraftNumber); } - if (throttle < -999.5 || throttle > -997.5) + if (!DataManager::IsDefault(throttle)) { float throttleArray[8]; @@ -233,11 +233,11 @@ namespace XPC { DataManager::SetGear(gear, false, aircraftNumber); } - if (flaps < -999.5 || flaps > -997.5) + if (!DataManager::IsDefault(flaps)) { DataManager::Set(DREF_FlapSetting, flaps, aircraftNumber); } - if (spdbrk < -999.5 || spdbrk > -997.5) + if (!DataManager::IsDefault(spdbrk)) { DataManager::Set(DREF_SpeedBrakeSet, spdbrk, aircraftNumber); } @@ -274,8 +274,8 @@ namespace XPC // Update log - float savedAlpha = -998; - float savedHPath = -998; + float savedAlpha = DataManager::GetDefaultValue(); + float savedHPath = DataManager::GetDefaultValue(); for (int i = 0; i < numCols; ++i) { unsigned char dataRef = (unsigned char)values[i][0]; @@ -291,8 +291,8 @@ namespace XPC case 3: // Velocity { float theta = DataManager::GetFloat(DREF_Pitch); - float alpha = savedAlpha != -998 ? savedAlpha : DataManager::GetFloat(DREF_AngleOfAttack); - float hpath = savedHPath != -998 ? savedHPath : DataManager::GetFloat(DREF_HPath); + float alpha = DataManager::IsDefault(savedAlpha) ? savedAlpha : DataManager::GetFloat(DREF_AngleOfAttack); + float hpath = DataManager::IsDefault(savedHPath) ? savedHPath : DataManager::GetFloat(DREF_HPath); if (alpha != alpha || hpath != hpath) { Log::WriteLine(LOG_ERROR, "DATA", "ERROR: Value must be a number (NaN received)"); @@ -303,7 +303,7 @@ namespace XPC for (int j = 0; j < 3; ++j) { float v = values[i][ind[j]]; - if (v != -998) + if (!DataManager::IsDefault(v)) { DataManager::Set(DREF_LocalVX, v*cos((theta - alpha)*deg2rad)*sin(hpath*deg2rad)); DataManager::Set(DREF_LocalVY, v*sin((theta - alpha)*deg2rad)); @@ -328,11 +328,11 @@ namespace XPC Log::WriteLine(LOG_ERROR, "DATA", "ERROR: Value must be a number (NaN received)"); break; } - if (values[i][1] != -998) + if (!DataManager::IsDefault(values[i][1])) { savedAlpha = values[i][1]; } - if (values[i][3] != -998) + if (DataManager::IsDefault(values[i][3])) { savedHPath = values[i][3]; } From 748d37c4d9c44c9a4611b484ffe6866f2042944e Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Thu, 14 May 2015 14:14:02 -0700 Subject: [PATCH 68/81] Fixed logging bug with varargs and dialed back excessive trace logging in Message. --- xpcPlugin/Log.cpp | 45 ++++++++++++++++++++++++--- xpcPlugin/Log.h | 9 +++--- xpcPlugin/Message.cpp | 11 +++---- xpcPlugin/xpcPlugin/xpcPlugin.vcxproj | 2 +- 4 files changed, 50 insertions(+), 17 deletions(-) diff --git a/xpcPlugin/Log.cpp b/xpcPlugin/Log.cpp index fadb89a..183dc1a 100644 --- a/xpcPlugin/Log.cpp +++ b/xpcPlugin/Log.cpp @@ -29,15 +29,48 @@ namespace XPC std::tm * tm = std::localtime(&now_tt); std::stringstream ss; - ss << std::setfill('0') << "[" + ss << std::setfill('0') << std::setw(2) << tm->tm_hour << ":" << std::setw(2) << tm->tm_min << ":" << std::setw(2) << tm->tm_sec << "." - << std::setw(3) << ms.count() << "]"; + << std::setw(3) << ms.count() << "|"; std::fprintf(fd, ss.str().c_str()); } + static void WriteLevel(FILE* fd, int level) + { + char* str; + switch (level) + { + case LOG_OFF: + str = " OFF|"; + break; + case LOG_FATAL: + str = "FATAL|"; + break; + case LOG_ERROR: + str = "ERROR|"; + break; + case LOG_WARN: + str = " WARN|"; + break; + case LOG_INFO: + str = " INFO|"; + break; + case LOG_DEBUG: + str = "DEBUG|"; + break; + case LOG_TRACE: + str = "TRACE|"; + break; + default: + str = " UNK|"; + break; + } + std::fprintf(fd, str); + } + void Log::Initialize(const std::string& version) { if (LOG_LEVEL == LOG_OFF) @@ -98,11 +131,12 @@ namespace XPC } WriteTime(fd); - std::fprintf(fd, "[%s] %s\n", tag.c_str(), value.c_str()); + WriteLevel(fd, level); + std::fprintf(fd, "%s|%s\n", tag.c_str(), value.c_str()); std::fflush(fd); } - void Log::FormatLine(int level, const std::string& tag, const std::string& format, ...) + void Log::FormatLine(int level, const std::string& tag, std::string format, ...) { va_list args; @@ -113,7 +147,8 @@ namespace XPC va_start(args, format); WriteTime(fd); - std::fprintf(fd, "[%s] ", tag.c_str()); + WriteLevel(fd, level); + std::fprintf(fd, "%s| ", tag.c_str()); std::vfprintf(fd, format.c_str(), args); std::fprintf(fd, "\n"); std::fflush(fd); diff --git a/xpcPlugin/Log.h b/xpcPlugin/Log.h index d71eedb..018bf6c 100644 --- a/xpcPlugin/Log.h +++ b/xpcPlugin/Log.h @@ -22,9 +22,7 @@ #define LOG_DEBUG 5 #define LOG_TRACE 6 -#ifndef LOG_LEVEL -#define LOG_LEVEL LOG_ERROR -#endif +#define LOG_LEVEL LOG_TRACE namespace XPC { @@ -53,7 +51,10 @@ namespace XPC /// specifiers. /// /// \param format The format string appropriate for consumption by sprintf. - static void FormatLine(int level, const std::string& tag, const std::string& format, ...); + /// + /// \remarks Note that Visual C++ silently fails va_start when the last non-varargs + /// argument is a reference, so we need a value-type format here. + static void FormatLine(int level, const std::string& tag, const std::string format, ...); /// Writes the specified string value, followed by a line terminator /// to the XPC log file. diff --git a/xpcPlugin/Message.cpp b/xpcPlugin/Message.cpp index f74329d..bcc5db5 100644 --- a/xpcPlugin/Message.cpp +++ b/xpcPlugin/Message.cpp @@ -13,44 +13,41 @@ namespace XPC Message Message::ReadFrom(const UDPSocket& sock) { - Log::WriteLine(LOG_TRACE, "MESG", "Reading Message"); Message m; int len = sock.Read(m.buffer, bufferSize, &m.source); m.size = len < 0 ? 0 : len; - Log::FormatLine(LOG_TRACE, "MESG", "Read result: %i", len); + if (len > 0) + { + Log::FormatLine(LOG_TRACE, "MESG", "Read message with length %i", len); + } return m; } unsigned long Message::GetMagicNumber() const { unsigned long val = size < 4 ? 0 : *((unsigned long*)buffer); - Log::FormatLine(LOG_TRACE, "MESG", "Gettting magic number 0x%lX for message 0x%zX", val, this); return val; } std::string Message::GetHead() const { std::string val = size < 4 ? "" : std::string((char*)buffer, 4); - Log::FormatLine(LOG_TRACE, "MESG", "Getting head %s for message 0x%zX", val, this); return val; } const unsigned char* Message::GetBuffer() const { const unsigned char* val = size == 0 ? NULL : buffer; - Log::FormatLine(LOG_TRACE, "MESG", "Returning buffer 0x%lX for message 0x%zX", val, this); return val; } std::size_t Message::GetSize() const { - Log::FormatLine(LOG_TRACE, "MESG", "Returning size %zu for message 0x%zX", size, this); return size; } struct sockaddr Message::GetSource() const { - Log::FormatLine(LOG_TRACE, "MESG", "Returning source for message 0x%zX", this); return source; } diff --git a/xpcPlugin/xpcPlugin/xpcPlugin.vcxproj b/xpcPlugin/xpcPlugin/xpcPlugin.vcxproj index 2f162aa..70c01f1 100644 --- a/xpcPlugin/xpcPlugin/xpcPlugin.vcxproj +++ b/xpcPlugin/xpcPlugin/xpcPlugin.vcxproj @@ -101,7 +101,7 @@ NotUsing Level3 Disabled - IBM=1;XPLM200;_DEBUG;_WINDOWS;_USRDLL;XPCPLUGIN_EXPORTS;_CRT_SECURE_NO_WARNINGS;LOG_LEVEL=LOG_TRACE;%(PreprocessorDefinitions) + IBM=1;XPLM200;_DEBUG;_WINDOWS;_USRDLL;XPCPLUGIN_EXPORTS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) OldStyle true From 05e0deeb0ab2173f18014aadcc4ba18959b5e8c4 Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Thu, 14 May 2015 14:41:53 -0700 Subject: [PATCH 69/81] Fixed bug in C client WYPT command. --- C/src/xplaneConnect.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/C/src/xplaneConnect.c b/C/src/xplaneConnect.c index 9eb2f7a..e4e633e 100755 --- a/C/src/xplaneConnect.c +++ b/C/src/xplaneConnect.c @@ -685,7 +685,7 @@ int sendWYPT(XPCSocket sock, WYPT_OP op, float points[], int count) memcpy(buffer + 7, points, ptLen); // Send Command - if (sendUDP(sock, buffer, 40) < 0) + if (sendUDP(sock, buffer, 7 + 12 * count) < 0) { printError("sendWYPT", "Failed to send command"); return -2; From acac0063d7dcc77b3a2956038feac5352d45b4c4 Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Thu, 14 May 2015 14:42:29 -0700 Subject: [PATCH 70/81] Removed extra space in Log::FormatLine --- xpcPlugin/Log.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xpcPlugin/Log.cpp b/xpcPlugin/Log.cpp index 183dc1a..a9898b4 100644 --- a/xpcPlugin/Log.cpp +++ b/xpcPlugin/Log.cpp @@ -148,7 +148,7 @@ namespace XPC WriteTime(fd); WriteLevel(fd, level); - std::fprintf(fd, "%s| ", tag.c_str()); + std::fprintf(fd, "%s|", tag.c_str()); std::vfprintf(fd, format.c_str(), args); std::fprintf(fd, "\n"); std::fflush(fd); From be8f92eaa2cb88a554a4ec145b7ac432d1b98f2f Mon Sep 17 00:00:00 2001 From: Chris Teubert Date: Wed, 20 May 2015 10:17:42 -0700 Subject: [PATCH 71/81] Fixed use of previous writeline format in #if __APPLE__ segment --- xpcPlugin/UDPSocket.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xpcPlugin/UDPSocket.cpp b/xpcPlugin/UDPSocket.cpp index 8a1aa36..349f127 100644 --- a/xpcPlugin/UDPSocket.cpp +++ b/xpcPlugin/UDPSocket.cpp @@ -38,7 +38,7 @@ namespace XPC #elif (__APPLE__ || __linux) if ((this->sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1) { - Log::WriteLine("[SOCK] ERROR: Failed to open socket"); + Log::WriteLine(LOG_FATAL, tag, "ERROR: Failed to open socket"); return; } int optval = 1; From 2889f4e3ce99201bf2922bee503584a361dd47ae Mon Sep 17 00:00:00 2001 From: Chris Teubert Date: Wed, 20 May 2015 10:18:13 -0700 Subject: [PATCH 72/81] Fixed sending string to FormatLine varargs does not support type String. --- xpcPlugin/DataManager.cpp | 6 +++--- xpcPlugin/Message.cpp | 4 ++-- xpcPlugin/MessageHandlers.cpp | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/xpcPlugin/DataManager.cpp b/xpcPlugin/DataManager.cpp index 23a07b5..42048e5 100644 --- a/xpcPlugin/DataManager.cpp +++ b/xpcPlugin/DataManager.cpp @@ -313,12 +313,12 @@ namespace XPC } if (!xdref) // DREF does not exist { - Log::FormatLine(LOG_ERROR, "DMAN", "ERROR: invalid DREF %s", dref); + Log::FormatLine(LOG_ERROR, "DMAN", "ERROR: invalid DREF %s", dref.c_str()); return 0; } XPLMDataTypeID dataType = XPLMGetDataRefTypes(xdref); - Log::FormatLine(LOG_INFO, "DMAN", "Get DREF %s (x:%X) Type: %i", dref, xdref, dataType); + Log::FormatLine(LOG_INFO, "DMAN", "Get DREF %s (x:%X) Type: %i", dref.c_str(), xdref, dataType); // XPLMDataTypeID is a bit flag, so it may contain more than one of the // following types. We prefer types as close to float as possible. if ((dataType & 2) == 2) // Float @@ -518,7 +518,7 @@ namespace XPC if (!xdref) { // DREF does not exist - Log::FormatLine(LOG_ERROR, "DMAN", "ERROR: invalid DREF %s", dref); + Log::FormatLine(LOG_ERROR, "DMAN", "ERROR: invalid DREF %s", dref.c_str()); return; } if (isnan(values[0])) diff --git a/xpcPlugin/Message.cpp b/xpcPlugin/Message.cpp index bcc5db5..897dda4 100644 --- a/xpcPlugin/Message.cpp +++ b/xpcPlugin/Message.cpp @@ -121,7 +121,7 @@ namespace XPC { Log::WriteLine(LOG_DEBUG, "DBUG", ss.str()); std::string dref((char*)buffer + 6, buffer[5]); - Log::FormatLine(LOG_DEBUG, "DBUG", " DREF (size %i) = %s", dref.length(), dref); + Log::FormatLine(LOG_DEBUG, "DBUG", " DREF (size %i) = %s", dref.length(), dref.c_str()); ss.str(""); int values = buffer[6 + buffer[5]]; ss << " Values(size " << values << ") ="; @@ -140,7 +140,7 @@ namespace XPC { std::string dref((char*)buffer + cur + 1, buffer[cur]); Log::FormatLine(LOG_DEBUG, "DBUG", " #%i/%i (size:%i) %s", - i + 1, buffer[5], dref.length(), dref); + i + 1, buffer[5], dref.length(), dref.c_str()); cur += 1 + buffer[cur]; } break; diff --git a/xpcPlugin/MessageHandlers.cpp b/xpcPlugin/MessageHandlers.cpp index 4f7c3d3..d72b8a8 100644 --- a/xpcPlugin/MessageHandlers.cpp +++ b/xpcPlugin/MessageHandlers.cpp @@ -89,7 +89,7 @@ namespace XPC // Set current connection sockaddr sourceaddr = msg.GetSource(); connectionKey = UDPSocket::GetHost(&sourceaddr); - Log::FormatLine(LOG_INFO, "MSGH", "Handling message from %s", connectionKey); + Log::FormatLine(LOG_INFO, "MSGH", "Handling message from %s", connectionKey.c_str()); std::map::iterator conn = connections.find(connectionKey); if (conn == connections.end()) // New connection { @@ -102,13 +102,13 @@ namespace XPC connection.getdCount = 0; connections[connectionKey] = connection; Log::FormatLine(LOG_DEBUG, "MSGH", "New connection. ID=%u, Remote=%s", - connection.id, connectionKey); + connection.id, connectionKey.c_str()); } else { connection = (*conn).second; Log::FormatLine(LOG_DEBUG, "MSGH", "Existing connection. ID=%u, Remote=%s", - connection.id, connectionKey); + connection.id, connectionKey.c_str()); } msg.PrintToLog(); @@ -417,7 +417,7 @@ namespace XPC pos += 4 * valueCount; DataManager::Set(dref, values, valueCount); - Log::FormatLine(LOG_DEBUG, "DREF", "Set %d values for %s", valueCount, dref); + Log::FormatLine(LOG_DEBUG, "DREF", "Set %d values for %s", valueCount, dref.c_str()); } if (pos != size) { From a2fadc5b6a518dbb2282dd5a9e5a0af987b99d3b Mon Sep 17 00:00:00 2001 From: Chris Teubert Date: Wed, 20 May 2015 10:18:21 -0700 Subject: [PATCH 73/81] Update Mac Project --- xpcPlugin/xpcPlugin.xcodeproj/project.pbxproj | 6 ------ 1 file changed, 6 deletions(-) diff --git a/xpcPlugin/xpcPlugin.xcodeproj/project.pbxproj b/xpcPlugin/xpcPlugin.xcodeproj/project.pbxproj index 4bca25c..4dbd663 100755 --- a/xpcPlugin/xpcPlugin.xcodeproj/project.pbxproj +++ b/xpcPlugin/xpcPlugin.xcodeproj/project.pbxproj @@ -10,7 +10,6 @@ BE37D960187C8B0F0033B082 /* XPCPlugin.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BE37D95E187C8B0F0033B082 /* XPCPlugin.cpp */; }; BE8361EF18C5591C00E9C923 /* mac.xpl in CopyFiles */ = {isa = PBXBuildFile; fileRef = D607B19909A556E400699BC3 /* mac.xpl */; }; BEABAD371AE041A3007BA7DA /* DataManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BEABAD2B1AE041A3007BA7DA /* DataManager.cpp */; }; - BEABAD381AE041A3007BA7DA /* DataMaps.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BEABAD2D1AE041A3007BA7DA /* DataMaps.cpp */; }; BEABAD391AE041A3007BA7DA /* Drawing.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BEABAD2F1AE041A3007BA7DA /* Drawing.cpp */; }; BEABAD3A1AE041A3007BA7DA /* Log.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BEABAD311AE041A3007BA7DA /* Log.cpp */; }; BEABAD3B1AE041A3007BA7DA /* Message.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BEABAD331AE041A3007BA7DA /* Message.cpp */; }; @@ -40,8 +39,6 @@ BE37D95E187C8B0F0033B082 /* XPCPlugin.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = XPCPlugin.cpp; sourceTree = SOURCE_ROOT; usesTabs = 1; }; BEABAD2B1AE041A3007BA7DA /* DataManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DataManager.cpp; sourceTree = ""; }; BEABAD2C1AE041A3007BA7DA /* DataManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DataManager.h; sourceTree = ""; }; - BEABAD2D1AE041A3007BA7DA /* DataMaps.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DataMaps.cpp; sourceTree = ""; }; - BEABAD2E1AE041A3007BA7DA /* DataMaps.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DataMaps.h; sourceTree = ""; }; BEABAD2F1AE041A3007BA7DA /* Drawing.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Drawing.cpp; sourceTree = ""; }; BEABAD301AE041A3007BA7DA /* Drawing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Drawing.h; sourceTree = ""; }; BEABAD311AE041A3007BA7DA /* Log.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Log.cpp; sourceTree = ""; }; @@ -82,7 +79,6 @@ BE37D95E187C8B0F0033B082 /* XPCPlugin.cpp */, BEDC620218EDF1A7005DB364 /* xplaneConnect.c */, BEABAD2B1AE041A3007BA7DA /* DataManager.cpp */, - BEABAD2D1AE041A3007BA7DA /* DataMaps.cpp */, BEABAD2F1AE041A3007BA7DA /* Drawing.cpp */, BEABAD311AE041A3007BA7DA /* Log.cpp */, BEABAD331AE041A3007BA7DA /* Message.cpp */, @@ -97,7 +93,6 @@ children = ( BEDC620318EDF1A7005DB364 /* xplaneConnect.h */, BEABAD2C1AE041A3007BA7DA /* DataManager.h */, - BEABAD2E1AE041A3007BA7DA /* DataMaps.h */, BEABAD301AE041A3007BA7DA /* Drawing.h */, BEABAD321AE041A3007BA7DA /* Log.h */, BEABAD341AE041A3007BA7DA /* Message.h */, @@ -192,7 +187,6 @@ BEABAD3A1AE041A3007BA7DA /* Log.cpp in Sources */, BEABAD3B1AE041A3007BA7DA /* Message.cpp in Sources */, BEABAD3C1AE041A3007BA7DA /* MessageHandlers.cpp in Sources */, - BEABAD381AE041A3007BA7DA /* DataMaps.cpp in Sources */, BEDC620418EDF1A7005DB364 /* xplaneConnect.c in Sources */, BEABAD371AE041A3007BA7DA /* DataManager.cpp in Sources */, BEABAD391AE041A3007BA7DA /* Drawing.cpp in Sources */, From bb104b63f4bbb04afaf3512737d407b769df6e6b Mon Sep 17 00:00:00 2001 From: Chris Teubert Date: Wed, 20 May 2015 10:18:28 -0700 Subject: [PATCH 74/81] New Mac Binary --- xpcPlugin/XPlaneConnect/mac.xpl | Bin 145188 -> 166772 bytes 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 xpcPlugin/XPlaneConnect/mac.xpl diff --git a/xpcPlugin/XPlaneConnect/mac.xpl b/xpcPlugin/XPlaneConnect/mac.xpl old mode 100644 new mode 100755 index 1e806491ba1d4afa761633c9b3561b2d36be98cb..fe97721901107fca4dd1e9b7e259f2b652947c3b GIT binary patch literal 166772 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 K0WCt2$o~huEI*C_ literal 145188 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 z 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 WtVUT|WIPsu_{czzDg5({!2sv From a3fa77d87ccde0b43c3b53d0931530bbc79a03bc Mon Sep 17 00:00:00 2001 From: Chris Teubert Date: Wed, 20 May 2015 10:22:59 -0700 Subject: [PATCH 75/81] Fixed missing return in some c tests --- TestScripts/C Tests/CtrlTests.h | 2 ++ TestScripts/C Tests/PosiTests.h | 1 + TestScripts/C Tests/SimuTests.h | 1 + 3 files changed, 4 insertions(+) diff --git a/TestScripts/C Tests/CtrlTests.h b/TestScripts/C Tests/CtrlTests.h index 3465f70..ccf0569 100644 --- a/TestScripts/C Tests/CtrlTests.h +++ b/TestScripts/C Tests/CtrlTests.h @@ -74,6 +74,7 @@ int basicCTRLTest(char** drefs, int ac) { return -30000 + result; } + return 0; } int testCTRL_Player() @@ -143,5 +144,6 @@ int testCTRL_Speedbrakes() { return -30000 + result; } + return 0; } #endif \ No newline at end of file diff --git a/TestScripts/C Tests/PosiTests.h b/TestScripts/C Tests/PosiTests.h index dfc7e07..d8b5673 100644 --- a/TestScripts/C Tests/PosiTests.h +++ b/TestScripts/C Tests/PosiTests.h @@ -83,6 +83,7 @@ int basicPOSITest(char** drefs, int ac) { return -20000 + result; } + return 0; } int testPOSI_Player() diff --git a/TestScripts/C Tests/SimuTests.h b/TestScripts/C Tests/SimuTests.h index 1c807b7..0d12012 100644 --- a/TestScripts/C Tests/SimuTests.h +++ b/TestScripts/C Tests/SimuTests.h @@ -31,6 +31,7 @@ int doSIMUTest(int value, float expected) return -100 - i; } } + return 0; } int testSIMU_Basic() From 985d5f94bab3bca8d90a75f94e9209f3ed6e8ee0 Mon Sep 17 00:00:00 2001 From: Chris Teubert Date: Wed, 20 May 2015 10:23:09 -0700 Subject: [PATCH 76/81] Updated C Tests Xcode Project --- TestScripts/C Tests.xcodeproj/project.pbxproj | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/TestScripts/C Tests.xcodeproj/project.pbxproj b/TestScripts/C Tests.xcodeproj/project.pbxproj index 6235e48..a933529 100644 --- a/TestScripts/C Tests.xcodeproj/project.pbxproj +++ b/TestScripts/C Tests.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + BE7CF6311B0CFA34008B1E07 /* Test.c in Sources */ = {isa = PBXBuildFile; fileRef = BE7CF62B1B0CFA34008B1E07 /* Test.c */; }; BEB0F5071A28F9A3001975A6 /* main.c in Sources */ = {isa = PBXBuildFile; fileRef = BEB0F5061A28F9A3001975A6 /* main.c */; }; BEB0F5091A28F9A3001975A6 /* C_Tests.1 in CopyFiles */ = {isa = PBXBuildFile; fileRef = BEB0F5081A28F9A3001975A6 /* C_Tests.1 */; }; BEB0F5111A28F9D5001975A6 /* xplaneConnect.c in Sources */ = {isa = PBXBuildFile; fileRef = BEB0F50F1A28F9D5001975A6 /* xplaneConnect.c */; }; @@ -27,6 +28,17 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + BE7CF6261B0CFA34008B1E07 /* CtrlTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CtrlTests.h; sourceTree = ""; }; + BE7CF6271B0CFA34008B1E07 /* DataTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DataTests.h; sourceTree = ""; }; + BE7CF6281B0CFA34008B1E07 /* DrefTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DrefTests.h; sourceTree = ""; }; + BE7CF6291B0CFA34008B1E07 /* PosiTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PosiTests.h; sourceTree = ""; }; + BE7CF62A1B0CFA34008B1E07 /* SimuTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimuTests.h; sourceTree = ""; }; + BE7CF62B1B0CFA34008B1E07 /* Test.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Test.c; sourceTree = ""; }; + BE7CF62C1B0CFA34008B1E07 /* Test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Test.h; sourceTree = ""; }; + BE7CF62D1B0CFA34008B1E07 /* TextTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TextTests.h; sourceTree = ""; }; + BE7CF62E1B0CFA34008B1E07 /* UDPTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UDPTests.h; sourceTree = ""; }; + BE7CF62F1B0CFA34008B1E07 /* ViewTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ViewTests.h; sourceTree = ""; }; + BE7CF6301B0CFA34008B1E07 /* WyptTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WyptTests.h; sourceTree = ""; }; BEB0F5031A28F9A3001975A6 /* C Tests */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "C Tests"; sourceTree = BUILT_PRODUCTS_DIR; }; BEB0F5061A28F9A3001975A6 /* main.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = main.c; sourceTree = ""; }; BEB0F5081A28F9A3001975A6 /* C_Tests.1 */ = {isa = PBXFileReference; lastKnownFileType = text.man; path = C_Tests.1; sourceTree = ""; }; @@ -66,6 +78,17 @@ BEB0F5051A28F9A3001975A6 /* C Tests */ = { isa = PBXGroup; children = ( + BE7CF6261B0CFA34008B1E07 /* CtrlTests.h */, + BE7CF6271B0CFA34008B1E07 /* DataTests.h */, + BE7CF6281B0CFA34008B1E07 /* DrefTests.h */, + BE7CF6291B0CFA34008B1E07 /* PosiTests.h */, + BE7CF62A1B0CFA34008B1E07 /* SimuTests.h */, + BE7CF62B1B0CFA34008B1E07 /* Test.c */, + BE7CF62C1B0CFA34008B1E07 /* Test.h */, + BE7CF62D1B0CFA34008B1E07 /* TextTests.h */, + BE7CF62E1B0CFA34008B1E07 /* UDPTests.h */, + BE7CF62F1B0CFA34008B1E07 /* ViewTests.h */, + BE7CF6301B0CFA34008B1E07 /* WyptTests.h */, BEB0F5061A28F9A3001975A6 /* main.c */, BEB0F5081A28F9A3001975A6 /* C_Tests.1 */, ); @@ -126,6 +149,7 @@ BEB0F5111A28F9D5001975A6 /* xplaneConnect.c in Sources */, BEB0F5121A28F9D5001975A6 /* xplaneConnect.h in Sources */, BEB0F5071A28F9A3001975A6 /* main.c in Sources */, + BE7CF6311B0CFA34008B1E07 /* Test.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; From 19d901915a01c704adde27ed0db9c891c1a32bd2 Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Wed, 20 May 2015 10:40:39 -0700 Subject: [PATCH 77/81] Remove extraneous line in MATLAB sendDREF command. --- MATLAB/+XPlaneConnect/sendDREF.m | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/MATLAB/+XPlaneConnect/sendDREF.m b/MATLAB/+XPlaneConnect/sendDREF.m index cbfacb3..e9a1b5c 100644 --- a/MATLAB/+XPlaneConnect/sendDREF.m +++ b/MATLAB/+XPlaneConnect/sendDREF.m @@ -15,5 +15,4 @@ if ~exist('socket', 'var') sendDREFs(dref, value) else sendDREFs(dref, value, socket) -end -socket.sendDREF(dref, value); \ No newline at end of file +end \ No newline at end of file From 6ac513b40fbe43fcee3a4245211335dfbaf743ed Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Wed, 20 May 2015 10:54:36 -0700 Subject: [PATCH 78/81] Quick fix to make it possible to run MATLAB tests multiple times. I'm not sure why this is necessary. Should look into object lifetimes in MATLAB to see if there's a valid reason for the second & subsequent test runs to fail when using automatic socket management. --- TestScripts/MATLAB Tests/tests.m | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/TestScripts/MATLAB Tests/tests.m b/TestScripts/MATLAB Tests/tests.m index 11c8800..13e0be4 100644 --- a/TestScripts/MATLAB Tests/tests.m +++ b/TestScripts/MATLAB Tests/tests.m @@ -1,3 +1,6 @@ +addpath('../../MATLAB') +import XPlaneConnect.* + testsPassed=0; testsFailed=0; if ismac() @@ -22,6 +25,7 @@ theTests = {{@openCloseTest, 'Open/Close Test', 0},... {@pauseTest,'Pause Test', 0},... {@setConnTest, 'setConn Test', 0}}; +socket = openUDP(); for i=1:length(theTests) fprintf(['Test ',num2str(i),': ',theTests{i}{2},' - ']); try @@ -36,6 +40,7 @@ for i=1:length(theTests) testsFailed = testsFailed + 1; end end +closeUDP(socket); disp('Results Summary:'); fprintf('Passed: %i\tFailed: %i\n',testsPassed, testsFailed); \ No newline at end of file From 784d2ea2bb002105cbbb9ba4c14720510bbd787e Mon Sep 17 00:00:00 2001 From: Jason Watkins Date: Wed, 20 May 2015 16:32:40 -0700 Subject: [PATCH 79/81] Added message magic number to debug log. --- xpcPlugin/Message.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/xpcPlugin/Message.cpp b/xpcPlugin/Message.cpp index 897dda4..182a274 100644 --- a/xpcPlugin/Message.cpp +++ b/xpcPlugin/Message.cpp @@ -63,9 +63,8 @@ namespace XPC } Log::WriteLine(LOG_DEBUG, "DBUG", ss.str()); - ss << std::dec; ss.str(""); - ss << "Head:" << GetHead() << " Size:" << GetSize(); + ss << "Head: " << GetHead() << "(0x" << std::setw(8) << GetMagicNumber() << ")" << std::dec << " Size: " << GetSize(); switch (GetMagicNumber()) // Binary version of head { case 0x4E4EF443: // CONN From cc094f46c2a9b337ee14a25c26e3263104d5d9c6 Mon Sep 17 00:00:00 2001 From: Chris Teubert Date: Wed, 27 May 2015 10:21:16 -0700 Subject: [PATCH 80/81] Updated Mac Binary --- xpcPlugin/XPlaneConnect/mac.xpl | Bin 166772 -> 166772 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/xpcPlugin/XPlaneConnect/mac.xpl b/xpcPlugin/XPlaneConnect/mac.xpl index fe97721901107fca4dd1e9b7e259f2b652947c3b..da391d2682c5dd27bef1e4be3b0039fb9847e91c 100755 GIT binary patch delta 21 dcmew|jqA%au7)j)C(bZ`|C74?^clvL`v8E-3 Date: Wed, 27 May 2015 10:32:47 -0700 Subject: [PATCH 81/81] Updated Windows binaries. --- xpcPlugin/XPlaneConnect/64/win.xpl | Bin 220160 -> 312320 bytes xpcPlugin/XPlaneConnect/win.xpl | Bin 186880 -> 267264 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/xpcPlugin/XPlaneConnect/64/win.xpl b/xpcPlugin/XPlaneConnect/64/win.xpl index 88b4c11d8deecfa38d676e6b19e52156a8e2f429..a27a63b7a1921d63613c27fe97fce3a872edfdbc 100644 GIT binary patch literal 312320 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%0AaZCmU6 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ⅆ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 Q#yQ{goL5ed{8Lf>9g${xmjD0& delta 99119 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 HQ|UheBH)!} diff --git a/xpcPlugin/XPlaneConnect/win.xpl b/xpcPlugin/XPlaneConnect/win.xpl index 30b68388027a08a689740437c0f3c9e5ca0c894a..ce96503232d96073553c7acb8eee5c1fa3a482ae 100644 GIT binary patch literal 267264 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⩔V4QwSMKx35{Q(urJ+%j)TI^rouYo*xkUO zr0RT*64ot)7;bxCK=l9!`Z_|(tb{EGGAx*|uOG?o3g^ql3IxhWa4&OZIa_^Gh?7)y zmato>+M3zfCppzAms2~AiQ;bW5R9`wnoCfRtGT4dnZMoA+y1)VnZl+B)Qc~p-Uig(I>O6o z>zOwU8bcC^qewgLpAS;a;go~uW*b+bF2HPDg|wn^Q`Q>KGThhn#u~|WBVt)1rc~T; z&RUgG_d2TI<4y*2p-3b>)2Mppem`|!hCYyV5AU7O`M`Xdv4db_6Hd-tpW-`^w32%4 z7OFbyfr%cXNp)N3*E55Dw@k%vM!rSbRExuI%}t-y!|E2QK1?Nh?c1>8ik z??;ei?4W=U_y-Z-pP)v9MLZBpP*miIR(Yw3AoyJox!_!iDoI!-7loll+yVp+orhOr zk*ER~x9SeIQLssQqf`VNg-$6n-e)xrb!@{qQ4bls>qt-BMvbO4dj>X#?hR;NGh%OLLe0vdlff%JgT#jY16J`%Hc)yUZfk)CpmDe0|UI}$auAoTc z*hS^r7F(pp-oU2JYp2?Ii3UY(eU!F^hN5QXOsj5Q+>9XqYMmD~8*n-=IgtsnV81tx zl8W&p)b}(uCGVMMqVeRUjv;zI4$P_JQ0E;=X_i6$Lls812s{A88O)w;h!C|VF~HJ! zC$u#`Jg+`3C#%jg0kAa};zS~ik3slw=hfU2n=n7SehWd=jhe4zU zP@7T?>3)wp6|iXAQs`nJ_$gTOQP(C@~P0>9Q2B2aoP8!#F#o#OJ2JXi@{)nsoAg0;V+XGrd^P`%)((x#0FyFBcb*QjGc z9>(jZ(UAb<{w)-=916`3qd#S!_u#0t+_s1Ml+&W{YJoXGD@-498+tbU;=T4_KUGJY zD0U<#OFx1E#jB;T_^Oo>97VjiG#1JIj;NsEobVD=lk~(n2p2^&!CMFK0_ja4S9C9S4`J#8WF+y2C3fclm&ONH`rk#FZ3iE=NxNpDxUgNP@~Cp#4qoozj)WCt zw6h^fB;h5WMkR+r*2UMsSl2XKdpw>Ov4klpsaT9HdXdLNS)?~YU*?d%P-`qKsqlVB z{hRwj5FCS-^)mO-p~R$0lZAv1U3#Nu3zc|Lp~p>#VZ5GCEQ9tbdA!Dx8a$LtupxoW z)>!=~-@X8j6^-|5i0S47zLXu?g!Q3suE06S44EYlshKl|e2Mr{*g+&{)uo`zvM2DW zr0VDt+n9b%YawS5E36+ZXK^LSN9@BO_Je?=B)e2=#KBjTwq`xnZqUlWM~wED8lZ{z zUb8Xc<1ckrL_(inP0G^RDt{YR)sTnW40T$8CswKI#`&OD1-E(x8N0P9BmVoF0-BLV{FEAR7xWB9H!jBPKshL0kEvh5wpben^*9S zO|z#erM6mB;W#Z8lqAAFwo@u(YY4rSJ-}07`KMH)PDes*2QX%WfrE|$iln$^xSE4Y zLc7WNml8IcLPIr+<|dU{h_2vD59{$#t%W!Hg7r8e!7)2N^jdulq9eW+Y>fD*=gl4l zMzb$Kvu_ABdj@Y~!V{}(;LW~4G`k3D2bc0id~JJ1y}Y7#HN& znN1`f+@&Rub7XhHYFK`)S_PE?HiW`guYx9z3BtjLKBr>0u=Pj=9L(@IzG>}_b2=pS zm-Z&1{RfE&eeYuHfh2S4kc4)KIPM@f*f!K6Dt1PRHqF+Hy^cDYwPS43 z(e+rkCBbmUk$0I>s_mbR9AxO;=VG+NDa&$xx}Dh+Bx zfwgJu)s;kK)l~jDl|3y!XYkJ%%q2eO^3S=X)#;-iILe2@WxujL?uU zftr?02!h8l6S8=lzoY)Q(jK3#6I?4K9L}L|(ETFnu#3l((H26%cUf5pdk)P2@kR+7 zPK0&w-e6((bs!dU5BS3nEITlhaB6-wmE%DhI_Fosi=_>Y0H!@ps3DE$k*!eeBS4nM z(WCWoIjn?D25xYRq>r&;RSJyI#_$cny^o(F6KfB0=t4MIQl%F6Q;Yu*y%B|K&E*ZC zl$&&rZmU&^YSn7TtxL+)O}l{+kG(Xr=2lR}EC00{u83c$bFQ%5HA+mtKu#2Bz z4+dF1o!8++0|_A9tB76*eS@Z7LsUcc!7n|WDhbtCKZIAo8oMD>W8VOlpLUI<8lzhb zSJoJ$S&-F0<_Yx6o5M|vrhNn{l?2KL%C6N4CP=71`~$W4vypoL~3~9kbaTB(u}nIH+pgjnOkl_!BSkEMYH|@gNf%?Z42M$)_Kx z;5jM*aVYrxv>u+g7~ZilLg3vevjb*lar*7k=hobuDqpORnR~B%!`wCUHFMX=qu9Gu z;XQxcLDXr3HyzCL9X&dn&ul#g-7BBz9qy&zBiIki&aICjh4Z(mbK1?M(@WQa$w?u! z*SJD?JxG(+;*x^oI*C_>#mkHGj7U>{1H(j?r+hnVd|Os&`U&1u(lnBl8WQEqQl;@5e1=puP`_c zP)DlLVpsyG*)j5^nwv8v_Zo!qFGqAm2U3(UTV*hbGhS(lM&>vc@ZAbN!gzE_WVDH* zqjbJBM{GqmkN)m*hNFO5X^ABeeVDQu_=#|T2QFPvgIdLU6aEo!fNm;eYagY2agS1R ze~ow?G6$jyA?(58InSu#TnztGAYM|}o7FtJc}z>i%NBh}CqS6$O@u+;Q&sB^wwp$FC4ttJ+Q18Va6!9No5;oH7)GtJ#7Lo$eK23lipwh`M19lulw zwR^HyoM*DOv5B{nx>7|lc@|%739L?JH=}2uotAMJ6hn>TycZ)2E~~Wb0uQAG9!d^8 zG=(Jv0Wn`KE-5Y6zOpu0k68~}d#r)LA%1U7`wDCQMvToBRm9m4djRo)z!w;$s3eDO zQN_qR^_C*`;^*93GRcHjrI{8L1?03uwu2fCgfyARaxuRT{UaLDxW7lkPEIaieRo3| zU2YD59g(VQZZa+i=9)0&ApuQ~@CXNwX}ASkMspN(O_FGoGP4(`>8>EQ1OcDK`T(Ug z(0##jOa-E`kqy6Dc&9RV4=Kdyir=AZos)~%eUR|0Mji^J&Jmtm-1kGqYRnR%A=ikr zKr@e43ry-zb$K$l7^LP=!>Agv;2nY-dteQ;vLcIk`3sP1I^x-?N^mfe-1a%L9H}cx z*>=NU?C=Zz>o&n%((DNQe-w3-F@>1J*xwKvfCjv#Uo18wJ7Mo+K<%h>T=;7x8fBE^3PltEBN)(yb}d-p_J4C z6ASZ^E#R_H26E-RxWlKY<{eaiJ+D2@$Uj1rNR@R(CH}DTeD71af!a&<6;ULJnkzq6 z0tU%LrwUpx(K(a1kMp>4b3h&r)y|>P-dv-(2E=lkDJ{9iS||iWJ9?JjP-T9g_XvEu zHGGTKxEm$M9Zg#BEkyD25JZ)M*Gy!o4xJo89;9z$;uy1h@rvKz9Kt_L->Zu!(QPrH zP#3;20vZ77cs}(4A>{qL)g_ks-b|DOosgj)p}Vr2qqJ*?XR|ia1Y1(Nm&(F-ud_Ul z^Df|j_!_u)R;tO zn*Z>JKkTE`ZTh8p9ZF&dqX?Z+S94v>X%PCxD3GK zW)~p^frD?Ou-jri#{Ck|nC(K@wB|ZjbRRfr7Mv7!*SpUE+T)?$7B>aMaj>+r2HmRkza!0ofV9wjGH zNGgQ@Tb*ktRh2Kc?nVBRZTo0Vqp!^IvgcU}*A6a8Z^C7I;4=I_+`SEaRMoZcJ;_Xx zfdpod01*O2h@ZhW8dSo724Rw*1|~)lA_CfC8b{kwm;tQ>5{GDp(`oHf+iF`sC~a?h z`{li@fVFBuXcDLuP}_o_MMUpT53NyY5`<>n|JvuAB&fZ&_j&H~`@QdLOJ<+7zrWUA zd+qgcz)k2lAyB?}9T=%gPRz?Q$Htx&__^yxW3i;M{M@|6yrV6tW@^hsRK19>%95gg zH7FGK&U`2W&U^0Sw+ixp{r4O`@~)^Jf{O;@%ess&ULDCTUVm3)g0a5dzJ~w#B{mR5 z>$~J==Pt8hJ>T+jxW1n30WCNknF;M{-#gRg`fS}h5kFo+Vl8nUFRM3nS~78(a0g0v zu99-%d$nQ`=Z<_Ej5T`uG2i>SyCv9Vp z=6kjY%7Eh8wn~0uvc$GUB>1A7OQ+Hr{B_2H>+v<@si+4$&r~|5>6GlZhEZD?oF)jC(pK<$3&A0R*qn;y|%jj7BHP@PjkQyb8k53j6cf0Xt z4gFTxta0uekO4`fQyqJm|NIj2OGc2(LW_hCq6Cw zokp*>WMTA_$bn3g9l6^RzhBDZj%T{#Vv;JcQ4nMIuSr}yS5R~$vsyhyS}m3-1kb+` zHLP)yX&f!PGkClZq9oDS$Y5|}QmxSyxnj#aFj%C(w|$J@xCuCjV(iwA-SR*^$-E23 zpL?xu`@EFE{&jDG?HY?+(HGIuDT}q@pyqfi=~=V0ijH@dddcNdpU1N1V3S$4iA7nk z_a2N;)Jog}C2katPl<)8i=*#WtA(_g$yy2K(9*QquVE%Fp7Q^=IRepQi)$4+OW!MQ z=|^jQYxNCKhx+~JCB^qhH)M|B-+7yL%n<}$qqYAHa|G+i`%jxASV-a_a|8jtEOP{+ zIyz*IKs53!iwTZ`ny49yIf5yY|HI}8-a>L?m^p&&jXfOugXRdNusd6EvhnL#ey9Sm zNFX5FB7wppfqcgLkyrgO1r0Y%aBtW$O(26R$WklSIV0K%&>m^qG{LWd{C~$ZfpqF4 zrU?Z2@ums%7}%x>Bs|PCfiCI)Kc)#}IasC%eobh&X@b3_*6r~lrU_(uswtf;lCw+` z2zbaeK?Q;yiQ(Fz$)|L_w>vc2`adyEAS`CVOO9y*nUR0SG=ZcOZovPpX#&ar-!x4i zV=7Jkzipa8FiJ?Z+#t*kxg|~Q)R<7JKFc(Lq!ZwO+cbgGkzu9@1k~NY1;sHHmRg0%;r`wl|*!`a|O&~@7=cWlhgG$ga(*#0beY|Oct!x~a%KwRJ zf?SFMYsIwbBzCk^{-2sAkU>Uz;|cju50%+CZ@6g!-JIcv4(m?pTPRrklSJs`LMRDfxM&QgnCYgxy#Ef<_^n!u*~nzN9@H#Dh6 z)`?JQk#TC|?amEKE&VsDKzbwfKQ~_xm`N#+-Vc7~Qz`!M-J0S*$iITyQvCPu?|%O6 z=ifP>)}{*J8|U!IjVc0eetXL>THuduLT7ZO# zs`rmZ{GcjclcPL#b>2tng-t|t({y#nCC?fAUUijvlTOAyljn+;dG2hTQ*aQr=G2wT zR%mXRx4u>QO#64SA?I%9+U|z~q7Obi&REfPvlwzd( zV^kK~Jwq}cB`CkI+rLNTmnvT2H#(Jwg9LOHui7d8Aiv3V*)`^PqK8AN1b9`IO0tY8 z-&_=SFAb;OTy!{`Ie%sB)SV4kVb9X=$dyGeh10HGCgSM)Pm87Vgozediuw&XwOvqj zZ$o&)U6(Bi#Xr~OEj7lSVdRXtURjWfasz*Cm>Af*;ex=vP16E86*t_YkfqfgjfxQhPn)lY7rQSL2QdwK>^gDW#t}C!Nnu&&jOvR(E=B~gMSrYtC ztGS~}{!?{7MyWSkSbtPj%Z;2kTJ<5m{0O$tVRMRkf#om6m+uZ|sH{&h^|A(@fHNbk zB5^A$tZ=;^b}_e!;1Mnl4&+G|gHXYDpC zQ#7kH_zG*#)jgTNH8tw*!bU8?CYQvkF~}@veCyi`d(UMJO69*MlTPUv=BSa<stR8Ni!50fPS!s}5%7w;Ea_D8VS!@59I5b$T`fzm z!HTyIB_ z9Bi|a{>BpMiPjn}v$d7VMA;cvBFSgBs8<&ja{ zA3$a?3Fzdthw9grkZ|aa*^Q^;f&XS`YTOcV=GvXGw#^SmUKd-{8&`Ewy4&PcF z8@F?0aKcSW#H{lUzxR>R5Ik*1Q;nUsurW>46|Jua`9e{#ED@7~`jNhYaE8&7n4hGC zJANxDw?Kb6r*u=>`QPDa>vVS@hg^~K$cny!JKHjlyk3&K$sKDwUL`DDb2sGO8O)#K4qhbKDmdegRzX+pU?Fk}DcH`PE2warpso01K@B$6+a}mc zj19##mQ4f;)m|qyS@-Bw&f?-+M;$f_lpZX~|K7Qq3_tK0i!5NLXx+-IYHZ^Igl5C}>ftZ2I!YG^ zK4Qr%SRrC8HPuzTEiA~-&TMVSE)!9fzJqm12H z=*HS_yRkkf@-P&rom?L<4;(u1=K}{b4@XZD-_y4$Ki3d9);WW2tg~%5)_&WK_2Oto z->ZEGW3RffCp_pyyGouy7UcV#CS?sZ$xoBAq)6h%O2tD_IYiOJ=p@=S7hZ@{PgLA&hpKSMmHKPM0qP3&7(`|17y`RKr@SDZ2fAKv| z!&izYZeHbFuW(X)7cSb_s(K$lA)~5y;Zh;tA$?ul-{p^}>c#lARQ1;0`(LQ(Jw+k0 zJePTMwW^rQ&eatBa5X(%RBoa;4k>fAdWO_iUH`dS-VaO2(XN(SEo>glrC#1fbzMny zF1?W(iMvq!1 zd1^5ym0P10OPFV>1^SsPI?~aegh|^AvP9mq*4QVSil@>$Ce>d2Vb#vkZ-fr zHLAYF*eks&E{=?fwPhvldr)SjYt1`OXsw4R%R%{OeZj8O;^b){yx0e6(X7~Qh`Zu; zrI&oM4^q(38-JQJYFn70So6N&wop7RfZR{tXWM-scgevnu-xl zZ#6cqf-)#wCCftVX*CrS-5MPMtO=MIZ4$%h7C;8wT-8)8CL44LL84|=Q*pup+$Vr* zn~KHAgHCb304{4P#$vh!*dl>^+E$C2uYHxRtaPM8($taHw3(fH z4`cXz33Nx%;hL(J$qU8_AydNQFs|6W7F;+tkNIcnJ+r1@cC#-L><kB5-q$dk-L$y^?v zEB4g3W$_1k)lHXdyiSKW8#qRD^i3i*9SiLKPI+pSi3PcOMZL$vfrt!Yg}3qQY0)v- zd(uO#rAF72(}0;*B;C}Wwk5pvx97M-z;W|lnt;TsmBL+WzOSLbl!j@|cyD~R7KD;>F6qKT zsR(tJ&TG8-mdGh-W)XG;qEllHInaWM(v-$o)1n@u#~g(?-%G{898up4<{aoYGZ#|3 zrz7K*GTON(`mTt{M&=b)45BTYe}_{rh1!!p0R3;g5nNfn#ri>@Ja< zoii6ZFQ9~SL`-YlJ<_aQqZW-ZdmsLi!I$T8L`O+j;>_WDFXWASVt1OIK zI6v)4ZTU|dRkCwqt=LUNm%zIO`Cu`t^w~2iUIo9PCb^#hcx^eb zC5G8_O1645?deqJwNibC6w7Ou?O|jPRxXi~ekY7dtXXKB^+Os?f5*$QoZN4sh^~!= zIQJ7-8!wPAPx3XAPX%6NSV}~(>mTLWSI;_8V|BU>q{Fsgx4h8R=WoK-nPuxyDwpH= zpD+oOjScO{%2=&*@oF#fVQSpk}B^=#` z?B?V>sm5vKWWf7a`Vku+Bh;T436IkBC(1HgrUbgyXRCt(nYI!or3=5!TitP{2|X_( z)wmgye8OmNQ`zT>F|E1sCwfm&YoHbVPFQnIs554OWcbK zita}MGzKn>dOFfCEyWUCbCMRfq=Oa*y7G^D?rtefNtC9BZ^xPr6qmmDk43%qp|*iN zjc*)nY+K#p?I>}h0n;sPv7*+dHyNA8%yv*I1q#~bOgX#AzQYu1T<4i|IQHhzrZ>9uz|4$}($vc&(Tk<= zijyLH+JR&|R(M}AG>K-o5T#9_2wecy1lNy<&35_j-$nCcw`aSahEXM_q8K_$ZmeP` zZ}dzLW=}tWv`f=5snqxU9(8OfL`-3Aof|hrC`S~pOLb!iQ7ow;?g;w!{iKTt$flgO zZV$qpiz$x%R)>R+AMxkzntxF47Rs$dc4OU@;le~|a@iJdQ68U;h(tsu*@ZrN~uPVjQYRL zq>;`nu5L-!4N>P%FISXTnWr~osZ2juP|-i>;N8AW9*DpZ9r!c^&zYkLTuK0|;0OB- z^KfMh1P*SP_ba*Kk#g^v385RSD%J676dDTSOB92_lIw%fb#TL^O=+=HtJY+P!mCKq z_Hjw3NRp8h5*|sC$A%?|FURUjV_Tuo-!hs-(%5hmiClaLYD3PQL$r#ZfU~@7scNv! z(9RR7S-5+6SGoBz_SteThWjwDl;v7KLVXF10d`levBb}{YghA2n^MJd#E9Zx7CY^8 z603LGv)^Q={Yh4HLoO@}F7+G?FX5CjgxineOBq{tdq^EaWRa4P9}Ge|y&s!(X*9jV zeQ9ECO7lw_$89N1(F>(#*rH4?YMm9#mF&CRJ?v5HrH}0e9qu3&ih?-(LN8#4b0V)x zEJ`hI$d2GICTJ|lF|N&OoQ1h_R_k^5r1!ll6BS;yEb#IMud(ZqzSA!D>d4`rZdbLZ zH|;nYL@6uqw^3Zktr?V%g2BPBPt=v1EeYJYQY(Yh$bV|@H=NV^Z10bWisO)q*>X?H z;xVPV5{y=9ap#M{5*oc=pJv*1!nsiqO2G_FMEmo>2umhla+$}GQ4G8*zCMi?;b+N+ z7IZPjhZ*C7u0-&aP+~sqEZSp5w%JkceeSl9@>NPbatx()WN2iJ^Pg8x9%NyFcGchD zB4HwKQ0nzm4vnyc*Pun%x`_%@I0QA9c+jIgqb~a-3AD*2YoTPTPcM{qF5@=)?_Xyr zJi=1o+=ecmwLB++@v}3K8e@$m*(`_IdO5V!b$SX5g{+fhU}4k}4>s`qIA~O&g;L92 zDy=nB-97B!>je5;pcvs|{S2Wkjaq0ISmXk!E8Xbt`;+PII~eHSkZSZp(%(fc_J6f{ z11=rIy|S^PU+nEvp(fYq1-LX6-J>Mf&{QLySkec^CHq zE+x$7O&0tI7QD)uJjm!_lgFBnX+uAOt--J`sg<(OQKeqF_^kQLW}2+|lF9lEmnSwa z{^dk_eVMvp!m!CI91<#pj*+D|tONV)Ww%Q&2TrxV)TUQCYfv>{%< zp&$^7zEGe`y%(9pAGBvp?y9*}FY9DK98A{o~TF#5MGsn>Fk znQ4xgb9*FnPEg>fH1OSOrd+or{o2wNNzuDP5W`BbE!ZEs z6+8OY=8*$j$A?{Je#|t zZjLW>9=41=YhQ6k8@;8A%PAdvf5oienGbi56^2329Bl~mi)R^WlSK#7G*Rxy)v7ok z4;=~5)p)wC7$?)`UxD?~>UwynF8-vrFdwUSg=B!ZK1Wj_+vPvC{;R^+Eb2{e_rvqF zDBJk`5=N;cHgM6Jx3%T*%3+HhSG(e26w(mAMXz>@%X@J!x2CAIIGD$3$o74`m0?eK zej}uJsM0bXFM{vdNEBQY*T(CcPWRx8XZ`#{)}+KdjCrmrPI#8{VCvH5A=i&p-^gKB z#M$c$L(X3FgN(a&_PS%x*{ca}f>b|9cqR#VVdZk^J;uVVxfesqxsLVv2rDHgBr}*C z_iMTB^rKO-j2SXI6Sw!saju;+EFU|#-cfjA!OQC2dNJgGG!Kn2DR9_nA5up&y2w5I z;9_}(-RdYK&irF4k&l<mEHnKukof6q9H#tGn!RWt)8Qyn)Bk@d=K$e)Ld&f!?)Q71VFjn zlu>q5e4Bfzx@kb#C?p2Z^uIanQ_s{RI@$-vdo(BNlPtE82gchqA<6Bm#5!u@hooHJj%=5))nV2j*OVsbm}BMUh^NA z#qj`bS$;Z{XqI^7`LALTIbZ14iFuVl+b5&PSj)+JN=*MU8;;xP!*Uya@4Lz5b7IM$ zSR0OrToTSw+ZPDR;3`{PFN*f+;In+!Zj-Qcqt);Gr^zdt^*!tfy<`O8iAk2_?Nzw@ z1x^2S5<3XX*0Iw|*2sJCcy<_*!{tl83qM@1k*G&ZdJ17f4qj8gP+^}daHTrUHyyr7 z2*Cxp#|w$25x$iFP`0%sdYSIh!~=~KT~}Nf86T?8$KPl;)xO-`r!S$|O`3gISA11u zd`z0ulkz1q>b?hrVwN9jxW!u&!r*N>QUB$rO)~( z2@;_49p`d2=1>UFxEVx;LGlt`tjVe9P~@IaH5!@b?AR%GF_CNQW2aX}J}ppdAj~PT zQ>oD#F$l1>q7G^w=d!Ox=M(R@+7(h6POGBR!!wrF1rDMg%FZP*G7_?dqh~lXlEJL* z8oum_FntgN_PxVePumT9W~@v56i_lm=mc2)V`~@{qyPQy$MO)Rx^E}T#P;OUbfSj= z7(yJHR}THmQNnoV#+$QQ)$wQj{8c`dU!q0$oAHD=luESh)ZsiG7Ml|B#02q~Xm zXtS{pVUEf3F{7=;pLT+k7hb|D%fUPy>8e!v_4ZQpHQz{NUF_=l(NESDm!@J6_$g^Y zeGZeuK~k+QIY+NF+1VG8lyeVNF4dF|X7En7RI8iR9usx2&KYf>Mk zl|ZG*Dl!PY52!I$96RH!mMF_XK;NIL#j8Xp_8%$g9%v*fA-dj5(Tuu-j6tX-6v=|eSwDxZ||yfg!M=T<8^k&lsRX7wfDiRKWq8B&`$b~v!DF9xMb^(~Zg z1iNki5ed7mmgec|s?}HSry&v}%3$HtM6--^s2=WSUbT9&S)cdJ`ba}Z&|nTYQMQch zZ+Hca*0VB3Wi{3H(mcCyF|e0B&5TLLKPiuTmSy@p<3%;lJ{C;60&YmGV&8j{g6 z9+eriRsnJjtbmLB_9(MB+PfcRVyaXLq*e)H5l-u#Dz`^4n$|5-=OC}IwOCt3+~^qZ z7ccj3oQ78-e`1pdPa75kZnVxSlu>4BAnM=nCVLD#D*vgQBzri!{#L=*C67`rD&@z) zwrT4os23r;Y$?KA(xFQx^QI2LEEHQFN7W;8bzZdEe;!)sDfO~<)Ql=wRwB@HL@dK4 zfq}=LyBa7Mp6tB(+=Y2kk*v}ufs*ZKwX{av!Um8bLK^3|tg3$}PFM+%$@O9gi)8A- z>#UU@8QGb(S+3ev4Y$}ePyou@cX14Cpm8;-db=L<-qO{n(K)uhV6=!fSO-uIiD>R9 zIf0BOq3O4^zAHgFWVdylBsed!Z8vqxsih_W#gKEu5rjbKR^>J1Za0=6w?41cpXO*h z?mZ=SH~vxzcMi7EPMF`FxwZ z$yc3N>#5_pF~EtDT%TW`Ey&}F7dY#oDJtD0Q2i{5odV%<#~nLSmX9z-y`O}3f{apo zmHC>LG$nX4ff0u*k@B0%O71&oyhtVR_a;>s&N!v{->@xD5 zXr94etKSkhyWcLS-)GS%pS7FN_9jaCG7s@bFCs5S*|I}wLC_ioyuvOBWSe`P;b{kn zCswBLh3K? zQ?`z(jc?X*u@6uPkLndDBZSB?79}OnJd3|Zc^>whbs*nv=8Md%0KTr{%RB)L!b)Af z&A+26OivC)J}Nn5x*$9@7z;h|iN>S4u~v_DLG$7_d$295bLloWOD?Mt1kpBp!)Vs^ zC8Slcek9YLrylO_>t$Aeg~FTaTSB07*p#=yJb*D=b$Qd8 zztj&9le}UUybQYlbsaZMY>`R@yOC;|)LJ53pvB}Xe zr9apO{*k?&Pomn$H8RnLUgODMKK=wL@%58W(|RuA}#tKIzpCFZ7mbqEzr5z zDrS&1nCs}?&tgUAs&A2)K#uyV&LvZk{H0!!YSSQu;fb^S<5q-Kk0pLVvvRxNWeZzZ zwW~H+I~Duf@UgAyS}!!+D4CjT1iQ83+E?~1+@BovIIqn%x%8Kf%mU&BVk-b%4g7C4 zSD50#6G9X{Lx+o>{2_m%7imklZxZxv_e`O*#yL}57ByXp=~u|LHE(zCCK^If3`|y6 zg+~bU-*#E(YyQ5(X;bm|hKk-O&(7`UB@4OWZSlgWyilI*@tGM?mm$pu#^VZA8%ZzW z^(t~ccnaG#qA{|M;tSeqLNu_7RXJ2a^gPwYt4^ou66(?2HH+=0XTqqxP_SK(c|o;U zzx+_!qN7w|FstcC6XPt#IR;cMsQ`=7$|(Bv8wa={8BOO_In_j|BATtrDa6tu`DO!8 z1K)KTVqFGPCT&Dkh-U#YV(7dJeDncr1dZc}a-Ob-&H(zP2ZB=zS8UN9h?1;$!wC+m zOq;>IE~ZNR}xElZmh0CL7`eNBN5pU=9A@1F4oZF@-@qH$KPn8##=KG*tPz0Mjft#M`Olf5Uq3PvQT*4|Z8I!~xB^<|P9E;CpH;EF)!x(oH5nn+ZjA13(c zr8K>(p1Vhvmdn2CtTo-VzhePwLx=2!wGCklHi@=*bu`7^KskvDB{ykx=p4#f?uFww zSNLP=5m8V^qg>^DJ3LFx&l&BcZ0pBdhqqG8%jNPeuSuG7C^Vef66|kTeySt*f%q#a z+S9VUzax0cHIGs>QWOb6yuXU5Ab^nCsie;w)KUK|1PFM&>51`r12+ys~`<@#L<`0B{fstsCuluA5z79A&hGtQ@Lls&$HkhhlMTDKBX=hD%_mo`+3xF?*|0P`VC6vC8bLFLD{w^#c_dwwPOnU5}v8}d`0GRzN`Wi z4776Q(EJS5l0_}|4X>q=T4a<`N_lV}IJ$mZHFB`FFVW*NDqYOzC9%0ODy|5-Yw|bs zuwXha2pJXmwfRdckZz5N(Z--8uXvE;mj5H+DzKurwE)@nCHW(9+aBT%PdEAXJB8g- zN#|m>zk-O)ejeM=e-dMK2U%RPfy_-I-Z(qLskH@dk!k$%@^3{!TeMug|1S&#?45(0 zLgR(T`4p?SGk9F8+A4p{70LCtR4cR^*;#^Zc_C zRuxEtg{I16P0DVI4R|9X=~g5yHsC=Hq3qUp@RitSZk34WHAdO0cyNDb*(y0f1ahe{ zs+@-?<3N1L3tMj>Z^*xMZm|RWw%O8uv54{UbYI$dMa)S%(Lr_ zQ6;oV&_MATPh`}cZCSBhSxB@5_OJQtoqMv}6U^JTt@GW=zuWk?y48j7;-T1^J~rar#;dVoo7&8bNMW6CQwsm)`Q=ZZ{1MQ+68RI7 zKex)C)roi`9lbuvc^bLOc(u*+M10VC3thxw+{k}@v^RFl7s(~+^-b-s;2J=Xz! z(;Z32X5IDC50)-#?>ii8_ZPf;qwz92J{o>q^n*5YCo9FMsxHvJ-WzMp^X=&2 zg|$bJBj8K{L)ZXr6-N`CTD)xZL~x_lwG!{1tbh2XLd|Kp#x$AX-FSYMCTZJ&@-B<) zMiv`HAE+4?E}W>EdGoLv`0|=$@>kNpZc8GfrzW;jZUV08wc&ZSH1qYFX=V`*KGMux zb~F2FX1_cO0j8O|2Ac_wgp+x89qgVi6DJvNP3NjpK}e+vIwqMC%Tg;t>TN(A(DW^_ zPG_QT{gL1KcKi`g!G5G#&bU@A8zf+jU4s%lemYEH>fTH`h9|o1T^w|S$7=ccu11mD z8b=KvWVOG#nEZeF?GhHw~()K zUuxrj4E*96(^L1%HDl}IkID)-^i%o!%nfkS4!vc$*ZuZu&vN<2O5tk$y1u<7fuv4y z{~P;H?Qh%Cmhbx`g5*tac;ICiueuMi(vs8v2dX)=$ExShTXyvTeyS^eYyaQ(|7Oc? zsCdiKVXfGIeE;#0yFc0%)yDK6+Vk4Mb|n<4+56hT*A5=~YrFnY?T4TJ6umk8Q~BH5 zd~w8 zJWa=t4spfyZmL6fEB(-2`RVOHa$#aLlD-q7&((e;?N*wvZ5+3Y=&Fdu&XqqA_iL#F ziJcfZiu=VT6xq`GG)DTq*Ol4!Mke2$cvk-58Tql@BPo(qb*-lzy)o~wGEy|4y{>6a zzHax7{F~eB3{QUDTt27N#g67h#^Ga82eNj0DMWR1FTJ__kfe;A@V=IvPmx&Bvr09y zKMIS?wc3j{IlJIXq`c^PPQf|4;MfO~dC)U->FTpXmAsbrCD}rIWW*T7H;zo+z&Cjx z+sRIGt?fKA>N^0;=U+?P{Go&qCm|#3TKCwIQ4dMNZ!oFs?AWORuKxe)JVAM|`&{O% z<~?`k2edKYwYiu^cw;J7dE4H=gskHq&+CaDErG0CKA1`U__M+>1>NS<9~5HcdvHy; zOU0uH#elEnl`lv2=K;-gsr-;ea1plT?id}v4xe4j%gAD;>iHeZGW!xA!M|F$#sjjIYhe@AG{Sb`UC z8*N(_t*f6C1J>2*dsmT_S&h&0LU@kAJFYkWg&cDX0Z(FHHsH>AIq)4^299|Vc8I4y zY#3Vk1EIt{DaE6{!(okJqJ2z4TVrOQ8|Y!peL*2u%5^h|Tog7rU*2Rj10WonF{+%# z+x(w9p%a(F{E*Y=FCICKdWw4OYxSqK9Mz@tSejKBT3^9SwG2J$fkEuPI0VfT&H9yanCglvMgL4wYczD* z6Rb+>V@Wp4yBb1r6ql}1#T8l6^H_?XU_#He)bY+C&eJl+?6#zHC!qYGev#`e%2ZBd zeb25k4%MLU@j)^=rr>piA3a4#K1L=lj=pc^6ui5|Go?kuRU_$(<@znQUs7Ap?pV1j z`c=szZW6+wjs+=6*HZJ}q>7MKG0proJ**rqq6mwSxkn462603`qRXrl)HT#jOr97A zK}|NN@F50w<6`To`#x5`*ZgB~#Ec%Yia27|kT~MksooMt{KbdG5x=VmU8+?Js8ece zjpWtTz&eV0YHG}Mb|`B&oJ3S2+HW)5kVbqT{Vz8qS2>E09tMXs5UhRoZm9 z;dzqAF3`?Nke+%cos?oP-Gi<7A6^9cd8Q%rpt0%uj+G@w|a!XEe|PZiK!h_N^86n{UaF=IZ9_q zYifzmN9pm{?MGY~YyY9tEVt*(j_%K~R{)I?kldVwF>o+;y2OV*C$-Me4in`O19d`V z6>wv#A(jpNeqZc6fP2e4DbZ!x5Y|j;Z(}7n!XFwq9!o;n=zbZ>yywrfx>x4a5*DA7 zz6Foanu!Ubt?o#Hk@KwYCz+90XNeiZUWKvzpwV!YD!Qb(pb*J-tb^1sU()C+n5o;= zHjs|i*3mS#_^Uz$GP-GgH#f$lI8IRTpt+tP<6Ci*9e;b=@(3AA6VC*BXLYV??YKI} zz`tlJ$HX1NQ4_a1ZEvShve6;V23{2MW{|e&Sm5>Wq9^ZmGQjE9usidpmraKn4KGz& zA<9%P-46?=Ro9@@bZbDjWbIOHh4-{2(=1m8IE)be_1*=e8JD@SIir)2s~ox8sYQF> z)%eRJ-ty?!%J50kTN(bF>8=d-CdcJ6c7{jijb){SRdKl6Jzih#i(BoCN{5ys=L6Z>ZW{@suSOs_yRRNUg)|?JA1=mcJ*7Vcu|p4O;ruW-C`Ga zlX1v6g>PYJdFxq>&B;hcXWP9LE@N~`tlJgwFN}B>M#ol5N2{fy)k7WC`QkHCXInu> zT|oCmJ`VxFQ!BnwXcW$2-DE^>0@p z$Y6aY@m9_q+-2guDp7F;OHhdlFE4N7au`KM=@?|1SI&Ez0uj!#r=UxOj;41RyU%wq z0;tDfFRk_=!xi`Bw_hrRXtT@gW?Kj`EN@AF7A#Sk6-ayKUGcOQQd>D6@KNXwq#d*& zU$G$BfwUtwq``vZ1k#S$kUK3%ZXoTr4XL#td4V)#L&_{jejx3H4Y|UC%wlW4XVpI4 zg3Jk|d2GlS3sMqD^V*OkK96YOfcOJZQ>=$*`4}moF$9PCVA7KgQ5T(h zANz=7%Fr1?;c+!QILq6JT1VOJs-9SzA5djDyGFnV0B6Dlfcu8l;&>T|*f@5enbv zfd6d>{K-(b$^n0C2s}#$88KODeeA5_=Y$w!8HLo4x??Cqi8IcCZyW+IaK;&MUjL8BJnF>X_`zj>yF<$trc*8If7d#aSJ4f#?b80BT7i2|yoqKfnQKEIDbM zWBRtFVg<{OMXRhCg)OPqHqLfMPngr@1fnO6_p}OUVqJ=0)%VTg5HETyhqG(n|Gp91 z%!(}90|uC9H1vZT(k&1aFg946F!oryPPi~$TIhsl#!F|4ViayCc&qZ=iqsnE zfi&%46}&V;@?l;pkoJO&J^Jt&48$8q+iyeOvLJ0*=ok(TRZhhSqLy^em7BY^~h8;jD$iO8@4ESNa1~xK)-+JbkOI6V~%qSskq9 zt+FOq$6IA3u!g&#o8(w_PQuTD%EhYN6Yo$z7K$F$zlcfeU%zV6zuBr$|K_N><@ZYU z1^t<)?$E#a>Nfp*k*d|dGgPJiEmRBj?@TpM|K_S<{X0utrhn(Ci}}TAPjX#}nxa7q z)Oh_{u14$M8&taf4XJ^@N(*mNz4~{l`m6rEMZK+mZ&k1B-&N`l`nO)asDJNL9r|~* zdQSgF)OP)QxB8j>-JpKJuQXx1>`C>oKrP3`2_0+^=zTi)B?+$A!3QOHmk!E3S>2|C z4@}KI`~5gUZR6q@O`Qd{#u~fI@l_~5jwbAf&+h%mUT(+ zeS*5lFUZ$hIzq(Y)vG%AiUjxR;6VxQ*1;nZd|C&OO7LeocwBEq4HAs#U`T>@=%7eIsTDf7RDxAHc#8zf zb?{aR&Lt?S!RQ=VjVlk!w)nT1A@qRjObbxK2C4<@L4QydK`|LXv2z9y;X6RG<8D@Eiwr9GKnl4WaN{2mCuL z=>v_d+)(&x2fW<|3*8k8U*muux50wPL*Wu(y^F$o%V60L2wD$?=Q$ZZXJ>d&gRgbK zH8%Jm4W93SOKh;9{!sWL2Ym5R@v`?q;ftLZpPk_e4W8Aw?ii}*5Eww6CF9iiRAL}uXZ*$S?t{_RQ=a%@UJ!4+P#1`*x*(Twl*-} z+lOk91IXFK#9VJ@ki*E?#(-zqU^$hXoeX%g4HirjVn<5{0H+TX|B8;Wwlpy(>aDSm z!^_##fPZg;k7%&9u>n74gO6&kwYLHP3t)SE2JhEkYm)?XNr>e8_0q?ZIa=bd5AMjQiEJv-g{{e3qDqc=r2L%wb+Rh-Su!98v*V)f0q~nPSPpat zF93c4usyYMzB{Oan18o3$XV~82EgC8!E)|9r~$C(+(@lL0|;uc7v^V&iZ9VI7HS|v zm7PJzgHYH)4S?s^V4)L2VGA_?KHmll&ETL0z@vwX7ZSoj4aA(h-D;1J6QQt$8UVj$ zgN3wkPy^r&8!TkTFw{WIPl%E6>9FsX;q3ZGVcb6f?T=CtVrCUbc@c}|zzX|%D>t>V zYI>^k9<^o>^hbwzOKddvHj8V>wf6Pmirfg|u-WHtf&|mrA(6fCinP6lq36cxMDS=x zEnzJ~=m=}*xWlU+2aLOrn__W8xQv#-vd-bLBi4Z3sPl6+8)Ut=(>N_?^}%$xR-VD)>odoM0?Qi` zg%t}JUhBEZdNNh}>7FB6FHfls>oQIE$>HOQIyhp=TE+hF#EAVWt)=nJw>7&KbCn@) zbUY2xE%+lZE+XQ&zx#O-JHlOJqa->}{m>;0bi`p@s`my*xa*sI`nG2-GM4lhZS%t} z-gSBx_|Ns+EIvD<<9*vRjJ?<$L%iTzPxP}}GJM+)nhUqMF_q#m_L}~-HxRRGt;_71 z@7uA5yuR&I%cLlz&+KAyDaL~cLiU!7MZ7Bht?f-K$H6k+j>C0Y>UX9IASW4I*pZ&-%--lw>BVFD3_^(dxS187<*0RQt9UE=~%SN^gUVmiJsw z_?$Ht^EZ3_bRgr+$#s|{AcIuvkNAAsH+w~QM>0#qcK3XO z@t~htt(IZIRI2owpW5PH%mkclyZwx=dPMNdeE3A7mmc)j1?K6R=joc~`OR5C&RKIg zf3w%msB_O7Z(aaH9I3qhtdS+W=!`tqe{%$BbZT;%fTvO^sY9l;mnmgHlfLHPvCy3< z#eC37drq~axh1@(IqYmXt}08!+;{!b1K4+jA#(HWn4EN;-9PN_{c^;PvW;@Ad#cN* z1Ap&+BXrS?MkxPAmCbnbr2i3j?{XPhkndj-LX_ZEDp{4hf|Ryy^%Jz`PGi9@y!sBM11l-m z+<~cWk1asJZl^C8173y0aQ2RoY_pBaYwK;;t6}rcf$Ua z=EzvmAI%{}bgYi_%vl;8v1L&TTDVjNdM(_;5$rRqSAnvNZ~Go;E$%?y z@I-JX9!$nmp*it9<(7MFD$LE~ud#-K0JErntt$VPeaH&yoGPc(nIJ9PLG%XP9 zS%>8+e{8Rak&H9bd_Vt_`yhQpBt*LT7;%f@OZxeL?=EjNlSFQ=zeR`5h0lZ6Hudg8 zq`P-lN_4idD|R$Bf~z0~v2i`47rij>r*+d++G!?mNq?tn8WE&K4E(oAGqZOW{z{hl zzTWQslQq34lL3pI(|6cJFllJQiw-w7D6PnGJSNIr!;QXK!pOsLXEdX}2WtW*Wvi#) zdu!<(wqbarB=V|G+RS8IZ#r|uz%L$Uv}Ip0aASVD2FyOG_=;Q}cq3J+2cbgxah;Wd z{a+#~7m?XglJFeGEc=C(O7k31u{qaBZ=5r0ZgdRzn6)+U0)22XVm?e>8KaSKd0F@f zh})!>xI4|iiAH=)Y_5ySQhfKxQ3z9E{d(Vaq|A4<9rI@HM_l~X_k61lyL{shKkXyI z^nI*`myZ^lDthUC-{*Y@mA_QyiyYwJZ|i)2+&jGs4PM_L_e}5dJ=^B)MExwdpA4~1 zzq!APh(ps49(bduwV-W!*TU()UFIZOuxsU>cBvMId~s20U#CF{P6eetq@kLSP7_Xk-b<~nmduM@=VEScOj908Xj*1RSPtAKadJKfx;VTzo|8j)- zoaC5hzJQ^^s>F&Eqn#8Jw@lc~lZ5ZNm�cxbWr{f62n;JxGf$$?jk!?791##%r$F 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 delta 80694 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