You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					133 lines
				
				4.2 KiB
			
		
		
			
		
	
	
					133 lines
				
				4.2 KiB
			| 
								 
											6 years ago
										 
									 | 
							
								#!/usr/bin/env python3
							 | 
						||
| 
								 | 
							
								import os
							 | 
						||
| 
								 | 
							
								import unittest
							 | 
						||
| 
								 | 
							
								import requests
							 | 
						||
| 
								 | 
							
								from cereal import car
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								from tools.lib.logreader import LogReader
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								from opendbc.can.parser import CANParser
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								from selfdrive.car.honda.values import CAR as HONDA
							 | 
						||
| 
								 | 
							
								from selfdrive.car.honda.interface import CarInterface as HondaCarInterface
							 | 
						||
| 
								 | 
							
								from selfdrive.car.honda.carcontroller import CarController as HondaCarController
							 | 
						||
| 
								 | 
							
								from selfdrive.car.honda.radar_interface import RadarInterface as HondaRadarInterface
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								from selfdrive.car.toyota.values import CAR as TOYOTA
							 | 
						||
| 
								 | 
							
								from selfdrive.car.toyota.interface import CarInterface as ToyotaCarInterface
							 | 
						||
| 
								 | 
							
								from selfdrive.car.toyota.carcontroller import CarController as ToyotaCarController
							 | 
						||
| 
								 | 
							
								from selfdrive.car.toyota.radar_interface import RadarInterface as ToyotaRadarInterface
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								BASE_URL = "https://commadataci.blob.core.windows.net/openpilotci/"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def run_route(route, car_name, CarInterface, CarController):
							 | 
						||
| 
								 | 
							
								  lr = LogReader("/tmp/"+route + ".bz2")
							 | 
						||
| 
								 | 
							
								  print(lr)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  cps = []
							 | 
						||
| 
								 | 
							
								  def CANParserHook(dbc_name, signals, checks=None, bus=0, sendcan=False, tcp_addr="127.0.0.1", timeout=-1):
							 | 
						||
| 
								 | 
							
								    cp = CANParser(dbc_name, signals, checks, bus, sendcan, "", timeout)
							 | 
						||
| 
								 | 
							
								    cps.append(cp)
							 | 
						||
| 
								 | 
							
								    return cp
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  params = CarInterface.get_params(car_name)
							 | 
						||
| 
								 | 
							
								  CI = CarInterface(params, CarController, CANParserHook)
							 | 
						||
| 
								 | 
							
								  print(CI)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  i = 0
							 | 
						||
| 
								 | 
							
								  last_monotime = 0
							 | 
						||
| 
								 | 
							
								  for msg in lr:
							 | 
						||
| 
								 | 
							
								    if msg.which() == 'can':
							 | 
						||
| 
								 | 
							
								      msg_bytes = msg.as_builder().to_bytes()
							 | 
						||
| 
								 | 
							
								      monotime = msg.logMonoTime
							 | 
						||
| 
								 | 
							
								      for x in cps:
							 | 
						||
| 
								 | 
							
								        x.update_string(monotime, msg_bytes)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (monotime-last_monotime) > 0.01:
							 | 
						||
| 
								 | 
							
								      control = car.CarControl.new_message()
							 | 
						||
| 
								 | 
							
								      CS = CI.update(control)
							 | 
						||
| 
								 | 
							
								      if i % 100 == 0:
							 | 
						||
| 
								 | 
							
								        print('\033[2J\033[H'+str(CS))
							 | 
						||
| 
								 | 
							
								      last_monotime = monotime
							 | 
						||
| 
								 | 
							
								      i += 1
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return True
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def run_route_radar(route, car_name, RadarInterface, CarInterface):
							 | 
						||
| 
								 | 
							
								  lr = LogReader("/tmp/"+route + ".bz2")
							 | 
						||
| 
								 | 
							
								  print(lr)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  cps = []
							 | 
						||
| 
								 | 
							
								  def CANParserHook(dbc_name, signals, checks=None, bus=0, sendcan=False, tcp_addr="127.0.0.1", timeout=-1):
							 | 
						||
| 
								 | 
							
								    cp = CANParser(dbc_name, signals, checks, bus, sendcan, "", timeout)
							 | 
						||
| 
								 | 
							
								    print(signals)
							 | 
						||
| 
								 | 
							
								    cps.append(cp)
							 | 
						||
| 
								 | 
							
								    return cp
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  params = CarInterface.get_params(car_name)
							 | 
						||
| 
								 | 
							
								  RI = RadarInterface(params, CANParserHook)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  i = 0
							 | 
						||
| 
								 | 
							
								  updated_messages = set()
							 | 
						||
| 
								 | 
							
								  for msg in lr:
							 | 
						||
| 
								 | 
							
								    if msg.which() == 'can':
							 | 
						||
| 
								 | 
							
								      msg_bytes = msg.as_builder().to_bytes()
							 | 
						||
| 
								 | 
							
								      _, vls = cps[0].update_string(msg.logMonoTime, msg_bytes)
							 | 
						||
| 
								 | 
							
								      updated_messages.update(vls)
							 | 
						||
| 
								 | 
							
								      if RI.trigger_msg in updated_messages:
							 | 
						||
| 
								 | 
							
								        ret = RI._update(updated_messages)
							 | 
						||
| 
								 | 
							
								        if i % 10 == 0:
							 | 
						||
| 
								 | 
							
								          print('\033[2J\033[H'+str(ret))
							 | 
						||
| 
								 | 
							
								        updated_messages = set()
							 | 
						||
| 
								 | 
							
								        i += 1
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return True
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# TODO: make this generic
							 | 
						||
| 
								 | 
							
								class TestCarInterface(unittest.TestCase):
							 | 
						||
| 
								 | 
							
								  def setUp(self):
							 | 
						||
| 
								 | 
							
								    self.routes = {
							 | 
						||
| 
								 | 
							
								      HONDA.CIVIC: "b0c9d2329ad1606b|2019-05-30--20-23-57",
							 | 
						||
| 
								 | 
							
								      HONDA.ACCORD: "0375fdf7b1ce594d|2019-05-21--20-10-33",
							 | 
						||
| 
								 | 
							
								      TOYOTA.PRIUS: "38bfd238edecbcd7|2019-06-07--10-15-25",
							 | 
						||
| 
								 | 
							
								      TOYOTA.RAV4: "02ec6bea180a4d36|2019-04-17--11-21-35"
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    for route in self.routes.values():
							 | 
						||
| 
								 | 
							
								      route_filename = route + ".bz2"
							 | 
						||
| 
								 | 
							
								      if not os.path.isfile("/tmp/"+route_filename):
							 | 
						||
| 
								 | 
							
								        with open("/tmp/"+route + ".bz2", "w") as f:
							 | 
						||
| 
								 | 
							
								          f.write(requests.get(BASE_URL + route_filename).content)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  def test_parser_civic(self):
							 | 
						||
| 
								 | 
							
								    #self.assertTrue(run_route(self.routes[HONDA.CIVIC], HONDA.CIVIC, HondaCarInterface, HondaCarController))
							 | 
						||
| 
								 | 
							
								    pass
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  def test_parser_accord(self):
							 | 
						||
| 
								 | 
							
								    # one honda
							 | 
						||
| 
								 | 
							
								    #self.assertTrue(run_route(self.routes[HONDA.ACCORD], HONDA.ACCORD, HondaCarInterface, HondaCarController))
							 | 
						||
| 
								 | 
							
								    pass
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  def test_parser_prius(self):
							 | 
						||
| 
								 | 
							
								    #self.assertTrue(run_route(self.routes[TOYOTA.PRIUS], TOYOTA.PRIUS, ToyotaCarInterface, ToyotaCarController))
							 | 
						||
| 
								 | 
							
								    pass
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  def test_parser_rav4(self):
							 | 
						||
| 
								 | 
							
								    # hmm, rav4 is broken
							 | 
						||
| 
								 | 
							
								    #self.assertTrue(run_route(self.routes[TOYOTA.RAV4], TOYOTA.RAV4, ToyotaCarInterface, ToyotaCarController))
							 | 
						||
| 
								 | 
							
								    pass
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  def test_radar_civic(self):
							 | 
						||
| 
								 | 
							
								    #self.assertTrue(run_route_radar(self.routes[HONDA.CIVIC], HONDA.CIVIC, HondaRadarInterface, HondaCarInterface))
							 | 
						||
| 
								 | 
							
								    pass
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  def test_radar_prius(self):
							 | 
						||
| 
								 | 
							
								    self.assertTrue(run_route_radar(self.routes[TOYOTA.PRIUS], TOYOTA.PRIUS, ToyotaRadarInterface, ToyotaCarInterface))
							 | 
						||
| 
								 | 
							
								    pass
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if __name__ == "__main__":
							 | 
						||
| 
								 | 
							
								  unittest.main()
							 | 
						||
| 
								 | 
							
								
							 |