Fixed disabling gmlan.
parent
b59aeb6d87
commit
5e1e45a4af
41
board/main.c
41
board/main.c
|
@ -512,13 +512,42 @@ int usb_cb_control_msg(USB_Setup_TypeDef *setup, uint8_t *resp, int hardwired) {
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 0xdb: // toggle GMLAN
|
case 0xdb: // toggle GMLAN
|
||||||
if (setup->b.wIndex.w == 3) {
|
puts("Toggle GMLAN canid: ");
|
||||||
set_can_mode(2, 0);
|
|
||||||
set_can_mode(3, setup->b.wValue.w);
|
uint16_t canid = setup->b.wValue.w;
|
||||||
} else {
|
bool gmlan_enable = setup->b.wIndex.w;
|
||||||
set_can_mode(3, 0);
|
|
||||||
set_can_mode(2, setup->b.wValue.w);
|
puth(canid);
|
||||||
|
puts(" mode ");
|
||||||
|
puth(gmlan_enable);
|
||||||
|
puts("\n");
|
||||||
|
|
||||||
|
if (canid >= CAN_MAX){
|
||||||
|
puts(" Out of range!\n");
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
can_port_desc *port = &can_ports[canid];
|
||||||
|
|
||||||
|
//Fail if canid doesn't support gmlan
|
||||||
|
if(!port->gmlan_support)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
//ACK the USB pipe but don't do anything; nothing to do.
|
||||||
|
if(port->gmlan == gmlan_enable){
|
||||||
|
puts("The CAN bus is already in the requested gmlan config.\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check to see if anyther canid is acting as gmlan, disable it.
|
||||||
|
if(gmlan_enable)
|
||||||
|
for(i = 0; i < CAN_MAX; i++)
|
||||||
|
if(can_ports[i].gmlan){
|
||||||
|
puts("Disable old gmlan mode\n");
|
||||||
|
set_can_mode(i, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
set_can_mode(canid, gmlan_enable);
|
||||||
break;
|
break;
|
||||||
case 0xdc: // set controls allowed
|
case 0xdc: // set controls allowed
|
||||||
controls_allowed = setup->b.wValue.w == 0x1337;
|
controls_allowed = setup->b.wValue.w == 0x1337;
|
||||||
|
|
|
@ -157,8 +157,8 @@ class Panda(object):
|
||||||
def get_can_baud(self, bus):
|
def get_can_baud(self, bus):
|
||||||
return struct.unpack("I", self._handle.controlRead(Panda.REQUEST_TYPE, 0xdf, bus, 0, 4))[0]
|
return struct.unpack("I", self._handle.controlRead(Panda.REQUEST_TYPE, 0xdf, bus, 0, 4))[0]
|
||||||
|
|
||||||
def set_gmlan(self, on, bus=2):
|
def set_gmlan(self, bus, on):
|
||||||
self._handle.controlWrite(Panda.REQUEST_TYPE, 0xdb, 1, bus, b'')
|
self._handle.controlWrite(Panda.REQUEST_TYPE, 0xdb, bus, bool(on), b'')
|
||||||
|
|
||||||
def set_uart_baud(self, uart, rate):
|
def set_uart_baud(self, uart, rate):
|
||||||
self._handle.controlWrite(Panda.REQUEST_TYPE, 0xe1, uart, rate, b'')
|
self._handle.controlWrite(Panda.REQUEST_TYPE, 0xe1, uart, rate, b'')
|
||||||
|
|
|
@ -4,6 +4,7 @@ import os
|
||||||
import sys
|
import sys
|
||||||
import time
|
import time
|
||||||
import random
|
import random
|
||||||
|
import argparse
|
||||||
|
|
||||||
from hexdump import hexdump
|
from hexdump import hexdump
|
||||||
from itertools import permutations
|
from itertools import permutations
|
||||||
|
@ -14,7 +15,7 @@ from panda import Panda
|
||||||
def get_test_string():
|
def get_test_string():
|
||||||
return b"test"+os.urandom(10)
|
return b"test"+os.urandom(10)
|
||||||
|
|
||||||
def run_test():
|
def run_test(can_speeds, gmlan_speeds, sleep_duration=0):
|
||||||
pandas = Panda.list()
|
pandas = Panda.list()
|
||||||
print(pandas)
|
print(pandas)
|
||||||
|
|
||||||
|
@ -25,9 +26,9 @@ def run_test():
|
||||||
if len(pandas) == 1:
|
if len(pandas) == 1:
|
||||||
# if we only have one on USB, assume the other is on wifi
|
# if we only have one on USB, assume the other is on wifi
|
||||||
pandas.append("WIFI")
|
pandas.append("WIFI")
|
||||||
run_test_w_pandas(pandas)
|
run_test_w_pandas(pandas, can_speeds, gmlan_speeds, sleep_duration)
|
||||||
|
|
||||||
def run_test_w_pandas(pandas):
|
def run_test_w_pandas(pandas, can_speeds, gmlan_speeds, sleep_duration=0):
|
||||||
h = list(map(lambda x: Panda(x), pandas))
|
h = list(map(lambda x: Panda(x), pandas))
|
||||||
print("H", h)
|
print("H", h)
|
||||||
|
|
||||||
|
@ -60,19 +61,30 @@ def run_test_w_pandas(pandas):
|
||||||
hexdump(ret)
|
hexdump(ret)
|
||||||
assert st == ret
|
assert st == ret
|
||||||
print("K/L pass", bus, ho, "\n")
|
print("K/L pass", bus, ho, "\n")
|
||||||
|
time.sleep(sleep_duration)
|
||||||
|
|
||||||
# **** test can line loopback ****
|
# **** test can line loopback ****
|
||||||
for bus, gmlan in [(0, False), (1, False), (2, False), (1, True), (2, True)]:
|
for bus, gmlan in [(0, None), (1, False), (2, False), (1, True), (2, True)]:
|
||||||
panda0 = h[ho[0]]
|
panda0 = h[ho[0]]
|
||||||
panda1 = h[ho[1]]
|
panda1 = h[ho[1]]
|
||||||
print("\ntest can", bus)
|
print("\ntest can", bus, "gmlan" if gmlan else "")
|
||||||
# flush
|
# flush
|
||||||
cans_echo = panda0.can_recv()
|
cans_echo = panda0.can_recv()
|
||||||
cans_loop = panda1.can_recv()
|
cans_loop = panda1.can_recv()
|
||||||
|
|
||||||
# set GMLAN mode
|
# set GMLAN mode
|
||||||
panda0.set_gmlan(gmlan, bus)
|
if(gmlan is not None):
|
||||||
panda1.set_gmlan(gmlan, bus)
|
panda0.set_gmlan(bus, gmlan)
|
||||||
|
panda1.set_gmlan(bus, gmlan)
|
||||||
|
|
||||||
|
if gmlan:
|
||||||
|
print("Setting GMLAN %d Speed to %d" % (bus, gmlan_speeds[bus]))
|
||||||
|
panda0.set_can_baud(bus, gmlan_speeds[bus])
|
||||||
|
panda1.set_can_baud(bus, gmlan_speeds[bus])
|
||||||
|
else:
|
||||||
|
print("Setting CanBus %d Speed to %d" % (bus, can_speeds[bus]))
|
||||||
|
panda0.set_can_baud(bus, can_speeds[bus])
|
||||||
|
panda1.set_can_baud(bus, can_speeds[bus])
|
||||||
|
|
||||||
# send the characters
|
# send the characters
|
||||||
# pick addresses high enough to not conflict with honda code
|
# pick addresses high enough to not conflict with honda code
|
||||||
|
@ -100,16 +112,27 @@ def run_test_w_pandas(pandas):
|
||||||
if cans_loop[0][3] != bus:
|
if cans_loop[0][3] != bus:
|
||||||
print("EXPECTED %d GOT %d" % (bus, cans_loop[0][3]))
|
print("EXPECTED %d GOT %d" % (bus, cans_loop[0][3]))
|
||||||
assert cans_loop[0][3] == bus
|
assert cans_loop[0][3] == bus
|
||||||
|
time.sleep(sleep_duration)
|
||||||
|
|
||||||
print("CAN pass", bus, ho)
|
print("CAN pass", bus, ho)
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
if len(sys.argv) > 1:
|
parser = argparse.ArgumentParser()
|
||||||
for i in range(int(sys.argv[1])):
|
parser.add_argument("-n", type=int, help="Number of test iterations to run")
|
||||||
run_test()
|
parser.add_argument("-can1baud", type=int, help="Baud Rate of CAN1", default=500000)
|
||||||
else :
|
parser.add_argument("-can2baud", type=int, help="Baud Rate of CAN2", default=500000)
|
||||||
i = 0
|
parser.add_argument("-can3baud", type=int, help="Baud Rate of CAN3", default=500000)
|
||||||
|
parser.add_argument("-gmlan2baud", type=int, help="Baud Rate of GMLAN2", default=33333)
|
||||||
|
parser.add_argument("-gmlan3baud", type=int, help="Baud Rate of GMLAN3", default=33333)
|
||||||
|
parser.add_argument("-sleep", type=int, help="Sleep time between tests", default=0)
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
can_speeds = (args.can1baud, args.can2baud, args.can3baud)
|
||||||
|
gmlan_speeds = (None, args.gmlan2baud, args.gmlan2baud)
|
||||||
|
|
||||||
|
if args.n is None:
|
||||||
while True:
|
while True:
|
||||||
print("************* testing %d" % i)
|
run_test(can_speeds, gmlan_speeds, sleep_duration=args.sleep)
|
||||||
run_test()
|
else:
|
||||||
i += 1
|
for i in range(args.n):
|
||||||
|
run_test(can_speeds, gmlan_speeds, sleep_duration=args.sleep)
|
||||||
|
|
Loading…
Reference in New Issue