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)
Пример #3
0
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)))
Пример #4
0
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)