def test_central_offset(self, mock_consume): """The offset should default to Sparkfun, or be loaded from the KML course. """ telemetry = Telemetry() self.assertLess( telemetry.distance_m( # From Google Earth 40.090764, -105.184879, CENTRAL_LATITUDE, CENTRAL_LONGITUDE), 100) # Smoke test course = {'course': ((1, 2), (3, 4)), 'inner': ()} with mock.patch.object(Telemetry, 'load_kml_from_file_name', return_value=course): with mock.patch('builtins.open'): Telemetry('file.kml')
def test_handle_telemetry_message(self, mpic): """Tests the handling of telemetry messages received from telemetry sources, such as phones or SUP800F. """ telemetry = Telemetry() self.assertEqual(len(telemetry._speed_history), 0) telemetry._handle_message( json.dumps({ 'device_id': 'test', 'speed_m_s': 1.0 })) self.assertEqual(len(telemetry._speed_history), 1) mpic.return_value = True self.assertEqual(mpic.call_count, 0) telemetry._handle_message( json.dumps({ 'device_id': 'test', 'latitude_d': 1.0, 'longitude_d': 1.0, 'accuracy_m': 1.0, 'speed_m_s': 1.0, 'heading_d': 0.0 })) self.assertEqual(mpic.call_count, 1) mpic.return_value = False self.assertEqual(mpic.call_count, 1) telemetry._handle_message( json.dumps({ 'device_id': 'test', 'latitude_d': 1.0, 'longitude_d': 1.0, 'accuracy_m': 1.0, 'speed_m_s': 1.0, 'heading_d': 0.0 })) self.assertEqual(mpic.call_count, 2) self.assertEqual(len(telemetry._ignored_points), 1) self.assertEqual(telemetry._ignored_points['test'], 1)
def benchmark_command_run_course_iterator(): """Benchmark the logic for driving the car.""" logger = DummyLogger() telemetry = Telemetry(logger) waypoint_generator = SimpleWaypointGenerator( SimpleWaypointGenerator.get_waypoints_from_file_name( 'paths/solid-state-depot.kmz')) driver = DummyDriver(telemetry, logger) command = Command(telemetry, driver, waypoint_generator, logger) iterations = 250 start = time.time() iterator = command._run_course_iterator() step = None for step in zip(range(iterations), iterator): pass assert step is not None assert step[0] == iterations - 1 end = time.time() print('{} iterations of Command._run_course_iterator, each took {:.5}'. format(iterations, (end - start) / float(iterations)))
def start_threads( waypoint_generator, logger, web_socket_handler, max_throttle, kml_file_name, ): """Runs everything.""" logger.info('Creating Telemetry') telemetry = Telemetry(kml_file_name) telemetry_dumper = TelemetryDumper( telemetry, waypoint_generator, web_socket_handler ) logger.info('Done creating Telemetry') global DRIVER DRIVER = Driver(telemetry) DRIVER.set_max_throttle(max_throttle) logger.info('Setting SUP800F to NMEA mode') serial_ = serial.Serial('/dev/ttyAMA0', 115200) serial_.setTimeout(1.0) for _ in range(10): serial_.readline() try: switch_to_nmea_mode(serial_) except: # pylint: disable=W0702 logger.error('Unable to set mode') for _ in range(10): serial_.readline() logger.info('Done') # The following objects must be created in order, because of message # exchange dependencies: # sup800f_telemetry: reads from command forwarded # command: reads from command, writes to command forwarded # button: writes to command # cherry_py_server: writes to command # TODO(2016-08-21) Have something better than sleeps to work around race # conditions logger.info('Creating threads') sup800f_telemetry = Sup800fTelemetry(serial_) time.sleep(0.5) command = Command(telemetry, DRIVER, waypoint_generator) time.sleep(0.5) button = Button() port = int(get_configuration('PORT', 8080)) address = get_configuration('ADDRESS', '0.0.0.0') cherry_py_server = CherryPyServer( port, address, telemetry, waypoint_generator ) time.sleep(0.5) global THREADS THREADS += ( button, cherry_py_server, command, sup800f_telemetry, telemetry_dumper, ) for thread in THREADS: thread.start() logger.info('Started all threads') # Use a fake timeout so that the main thread can still receive signals sup800f_telemetry.join(100000000000) # Once we get here, sup800f_telemetry has died and there's no point in # continuing because we're not receiving telemetry messages any more, so # stop the command module command.stop() command.join(100000000000) cherry_py_server.kill() cherry_py_server.join(100000000000) button.kill() button.join(100000000000)