Fixed several bugs based on test results
This commit is contained in:
committed by
Jason Watkins
parent
9fb2274ae8
commit
18aa9fa251
@@ -9,7 +9,7 @@ class XPlaneConnect:
|
|||||||
'''Creates a new XPlaneConnect interface, and binds a UDP socket based on the specified parameters.'''
|
'''Creates a new XPlaneConnect interface, and binds a UDP socket based on the specified parameters.'''
|
||||||
|
|
||||||
# Setup server port
|
# Setup server port
|
||||||
server = (socket.INADDR_ANY, socket.htons(port))
|
self.server = ("0.0.0.0", port)
|
||||||
|
|
||||||
# Setup XPlane IP and port
|
# Setup XPlane IP and port
|
||||||
if xp_ip == 'localhost' or xp_ip is None:
|
if xp_ip == 'localhost' or xp_ip is None:
|
||||||
@@ -22,11 +22,11 @@ class XPlaneConnect:
|
|||||||
# Create and bind socket
|
# Create and bind socket
|
||||||
# TODO: Raise a friendly error if socket creation/binding fails
|
# 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 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
|
||||||
self.socket.bind(server)
|
self.socket.bind(self.server)
|
||||||
|
|
||||||
# Set timeout
|
# Set timeout
|
||||||
timeout_us = 500
|
timeout_us = 500
|
||||||
self.socket.settimeout(timeout_ms / 1000000)
|
self.socket.settimeout(timeout_us / 1000000)
|
||||||
|
|
||||||
def __del__(self):
|
def __del__(self):
|
||||||
self.close()
|
self.close()
|
||||||
@@ -40,16 +40,19 @@ class XPlaneConnect:
|
|||||||
def send_udp(self, msg):
|
def send_udp(self, msg):
|
||||||
'''Sends a message over the underlying UDP socket.'''
|
'''Sends a message over the underlying UDP socket.'''
|
||||||
msg_len = len(msg)
|
msg_len = len(msg)
|
||||||
msg[4] = msg_len
|
msg = list(msg)
|
||||||
|
msg[4] = chr(msg_len)
|
||||||
|
msg = "".join(msg)
|
||||||
|
|
||||||
# Preconditions
|
# Preconditions
|
||||||
if(msg_len <= 0): # Require message length greater than 0.
|
if(msg_len <= 0): # Require message length greater than 0.
|
||||||
raise RuntimeError("send_udp: message length must be psoitive >0")
|
raise RuntimeError("send_udp: message length must be psoitive >0")
|
||||||
|
|
||||||
|
on = 1
|
||||||
# Code
|
# 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):
|
def read_udp(self, recv_addr = None):
|
||||||
if recv_addr is None:
|
if recv_addr is None:
|
||||||
@@ -172,7 +175,7 @@ class XPlaneConnect:
|
|||||||
self.send_udp(msg)
|
self.send_udp(msg)
|
||||||
|
|
||||||
# DREF Manipulation
|
# DREF Manipulation
|
||||||
def read_dref(self, resultArray):
|
def read_dref(self):
|
||||||
buf = self.read_udp()
|
buf = self.read_udp()
|
||||||
if buf[0] != 0:
|
if buf[0] != 0:
|
||||||
return self.parse_dref(buf)
|
return self.parse_dref(buf)
|
||||||
@@ -203,15 +206,15 @@ class XPlaneConnect:
|
|||||||
|
|
||||||
self.send_udp(msg)
|
self.send_udp(msg)
|
||||||
|
|
||||||
def request_dref(self, dref_array, resultArray):
|
def request_dref(self, dref_array):
|
||||||
'''Requests drefs and reads the response.'''
|
'''Requests drefs and reads the response.'''
|
||||||
self.send_request(dref_array)
|
self.send_request(dref_array)
|
||||||
for i in range(80):
|
for i in range(80):
|
||||||
size = self.read_dref(resultArray)
|
result = self.read_dref()
|
||||||
if size != -1:
|
if siresultze is not None:
|
||||||
return size
|
return result
|
||||||
|
|
||||||
return -1
|
return None
|
||||||
|
|
||||||
def parse_getd(self, msg, dref_array, dref_sizes):
|
def parse_getd(self, msg, dref_array, dref_sizes):
|
||||||
len_list = struct.unpack_from("B", msg, 5)
|
len_list = struct.unpack_from("B", msg, 5)
|
||||||
|
|||||||
Reference in New Issue
Block a user