begin to address UDP reliability issues

master
Firmware Batman 2017-08-13 02:01:56 +01:00
parent f832f34413
commit c536a8333c
4 changed files with 56 additions and 10 deletions

View File

@ -1 +1 @@
from .panda import Panda
from .panda import Panda, PandaWifiStreaming

View File

@ -28,10 +28,14 @@ def parse_can_buffer(dat):
class PandaWifiStreaming(object):
def __init__(self, ip="192.168.0.10", port=1338):
self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self.sock.sendto("hello", (ip, port))
self.sock.setblocking(0)
self.ip = ip
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):
ret = []

View File

@ -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()

View File

@ -27,24 +27,25 @@ def connect_wifi():
# TODO: Ubuntu
os.system("networksetup -setairportnetwork en0 %s %s" % (ssid, pw))
def time_many_sends(p, bus):
MSG_COUNT = 100
def time_many_sends(p, bus, precv=None, msg_count=100):
if precv == None:
precv = p
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 = []
while len(r) < 200 and (time.time() - st) < 3:
r.extend(p.can_recv())
while len(r) < (msg_count*2) and (time.time() - st) < 3:
r.extend(precv.can_recv())
sent_echo = filter(lambda x: x[3] == 0x80 | bus, r)
loopback_resp = filter(lambda x: x[3] == bus, r)
assert_equal(len(sent_echo), 100)
assert_equal(len(loopback_resp), 100)
assert_equal(len(sent_echo), msg_count)
assert_equal(len(loopback_resp), msg_count)
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