begin to address UDP reliability issues
parent
f832f34413
commit
c536a8333c
|
@ -1 +1 @@
|
||||||
from .panda import Panda
|
from .panda import Panda, PandaWifiStreaming
|
||||||
|
|
|
@ -28,10 +28,14 @@ def parse_can_buffer(dat):
|
||||||
class PandaWifiStreaming(object):
|
class PandaWifiStreaming(object):
|
||||||
def __init__(self, ip="192.168.0.10", port=1338):
|
def __init__(self, ip="192.168.0.10", port=1338):
|
||||||
self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
||||||
self.sock.sendto("hello", (ip, port))
|
|
||||||
self.sock.setblocking(0)
|
self.sock.setblocking(0)
|
||||||
self.ip = ip
|
self.ip = ip
|
||||||
self.port = port
|
self.port = port
|
||||||
|
self.kick()
|
||||||
|
|
||||||
|
def kick(self):
|
||||||
|
# must be called at least every 5 seconds
|
||||||
|
self.sock.sendto("hello", (self.ip, self.port))
|
||||||
|
|
||||||
def can_recv(self):
|
def can_recv(self):
|
||||||
ret = []
|
ret = []
|
||||||
|
|
|
@ -0,0 +1,41 @@
|
||||||
|
from __future__ import print_function
|
||||||
|
import sys
|
||||||
|
import time
|
||||||
|
from helpers import time_many_sends
|
||||||
|
from panda import Panda, PandaWifiStreaming
|
||||||
|
|
||||||
|
def test_high_throughput():
|
||||||
|
p = Panda()
|
||||||
|
p.set_safety_mode(Panda.SAFETY_ALLOUTPUT)
|
||||||
|
p.set_can_loopback(True)
|
||||||
|
pwifi = Panda("WIFI")
|
||||||
|
|
||||||
|
# TODO: msg_count=1000 drops packets, is this fixable?
|
||||||
|
for msg_count in [10,100,200]:
|
||||||
|
speed = 500
|
||||||
|
p.set_can_speed_kbps(0, speed)
|
||||||
|
comp_kbps = time_many_sends(p, 0, pwifi, msg_count)
|
||||||
|
saturation_pct = (comp_kbps/speed) * 100.0
|
||||||
|
|
||||||
|
print("HT WIFI loopback %d messages at speed %d, comp speed is %.2f, percent %.2f" % (msg_count, speed, comp_kbps, saturation_pct))
|
||||||
|
|
||||||
|
def test_udp_doesnt_drop():
|
||||||
|
p = Panda()
|
||||||
|
p.set_safety_mode(Panda.SAFETY_ALLOUTPUT)
|
||||||
|
p.set_can_loopback(True)
|
||||||
|
|
||||||
|
pwifi = PandaWifiStreaming()
|
||||||
|
|
||||||
|
for i in range(30):
|
||||||
|
pwifi.kick()
|
||||||
|
|
||||||
|
speed = 500
|
||||||
|
p.set_can_speed_kbps(0, speed)
|
||||||
|
comp_kbps = time_many_sends(p, 0, pwifi, msg_count=10)
|
||||||
|
saturation_pct = (comp_kbps/speed) * 100.0
|
||||||
|
|
||||||
|
sys.stdout.write(".")
|
||||||
|
sys.stdout.flush()
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -27,24 +27,25 @@ def connect_wifi():
|
||||||
# TODO: Ubuntu
|
# TODO: Ubuntu
|
||||||
os.system("networksetup -setairportnetwork en0 %s %s" % (ssid, pw))
|
os.system("networksetup -setairportnetwork en0 %s %s" % (ssid, pw))
|
||||||
|
|
||||||
def time_many_sends(p, bus):
|
def time_many_sends(p, bus, precv=None, msg_count=100):
|
||||||
MSG_COUNT = 100
|
if precv == None:
|
||||||
|
precv = p
|
||||||
|
|
||||||
st = time.time()
|
st = time.time()
|
||||||
p.can_send_many([(0x1aa, 0, "\xaa"*8, bus)]*MSG_COUNT)
|
p.can_send_many([(0x1aa, 0, "\xaa"*8, bus)]*msg_count)
|
||||||
r = []
|
r = []
|
||||||
|
|
||||||
while len(r) < 200 and (time.time() - st) < 3:
|
while len(r) < (msg_count*2) and (time.time() - st) < 3:
|
||||||
r.extend(p.can_recv())
|
r.extend(precv.can_recv())
|
||||||
|
|
||||||
sent_echo = filter(lambda x: x[3] == 0x80 | bus, r)
|
sent_echo = filter(lambda x: x[3] == 0x80 | bus, r)
|
||||||
loopback_resp = filter(lambda x: x[3] == bus, r)
|
loopback_resp = filter(lambda x: x[3] == bus, r)
|
||||||
|
|
||||||
assert_equal(len(sent_echo), 100)
|
assert_equal(len(sent_echo), msg_count)
|
||||||
assert_equal(len(loopback_resp), 100)
|
assert_equal(len(loopback_resp), msg_count)
|
||||||
|
|
||||||
et = (time.time()-st)*1000.0
|
et = (time.time()-st)*1000.0
|
||||||
comp_kbps = (1+11+1+1+1+4+8*8+15+1+1+1+7)*MSG_COUNT / et
|
comp_kbps = (1+11+1+1+1+4+8*8+15+1+1+1+7)*msg_count / et
|
||||||
|
|
||||||
return comp_kbps
|
return comp_kbps
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue