Beispiel #1
0
 def _init_video_streaming_service(self):
     self._tcp_stream_writer = TcpStreamWriter(self.STREAMING_SERVER_IP_ADDRESS, self.STREAMING_SERVER_PORT, self.VIDEO_STREAM_BUFFER_SIZE, self.MAX_TCP_STREAM_IMAGE_SIZE)
     self._local_world_map_stream_writer = LocalWorldMapStreamWriter(self._local_world_map_service)
     self._local_world_map_stream_writer.add_output_stream_writer(self._tcp_stream_writer)
     self._video_stream_dispatcher = VideoStreamDispatcher(Image.from_file(self.DEFAULT_STREAM_IMAGE_FILE_NAME))
     self._video_stream_dispatcher.add_stream_writer( self._local_world_map_stream_writer)
     self._video_streaming_service = VideoStreamingService(self._video_stream_dispatcher, None, self._tcp_stream_writer)
     self._video_streaming_service.set_camera_source(self.DEFAULT_EMBEDDED_CAMERA_ID, self.EMBEDDED_CAMERA_FRAME_ROTATION_ANGLE)
    def setup(self, stream_reader_mock, stream_writer_mock):
        self._stream_reader_mock = stream_reader_mock
        self._stream_writer_mock = stream_writer_mock

        self._stream_reader_mock.read_next.side_effect = self._read_next_mock

        self._video_stream_dispatcher = VideoStreamDispatcher(self.SAMPLE_DEFAULT_IMAGE)
        self._video_stream_dispatcher.stream_reader = stream_reader_mock
        self._video_stream_dispatcher.add_stream_writer(stream_writer_mock)
Beispiel #3
0
 def _init_video_streaming_service(self):
     self._original_stream_buffer = InMemoryBufferedStreamWriter(self.VIDEO_STREAM_BUFFER_SIZE)
     self._processed_stream_buffer = InMemoryBufferedStreamWriter(self.VIDEO_STREAM_BUFFER_SIZE)
     self._world_map_stream_writer = WorldMapStreamWriter(self._world_map_service, self._pathfinding_service)
     self._world_map_stream_writer.add_output_stream_writer(self._processed_stream_buffer)
     self._video_stream_dispatcher = VideoStreamDispatcher(Image.from_file(self.DEFAULT_STREAM_IMAGE_FILE_NAME))
     self._video_stream_dispatcher.add_stream_writer(self._original_stream_buffer)
     self._video_stream_dispatcher.add_stream_writer(self._world_map_stream_writer)
     self._tcp_stream_reader = TcpStreamReader(self.STREAMING_SERVER_IP_ADDRESS, self.STREAMING_SERVER_PORT, self.VIDEO_STREAM_BUFFER_SIZE, False)
     self._video_streaming_service = VideoStreamingService(self._video_stream_dispatcher, self._original_stream_buffer, self._processed_stream_buffer, self._tcp_stream_reader)
class TestVideoStreamDispatcher(object):
    
    SAMPLE_DEFAULT_IMAGE = object()
    SAMPLE_IMAGE = object()
    SAMPLE_FPS = 5

    @mock.patch('services.video_streaming.stream_writers.InMemoryBufferedStreamWriter.InMemoryBufferedStreamWriter', autospec = False)
    @mock.patch('services.video_streaming.stream_readers.CameraStreamReader.CameraStreamReader', autospec = False)
    def setup(self, stream_reader_mock, stream_writer_mock):
        self._stream_reader_mock = stream_reader_mock
        self._stream_writer_mock = stream_writer_mock

        self._stream_reader_mock.read_next.side_effect = self._read_next_mock

        self._video_stream_dispatcher = VideoStreamDispatcher(self.SAMPLE_DEFAULT_IMAGE)
        self._video_stream_dispatcher.stream_reader = stream_reader_mock
        self._video_stream_dispatcher.add_stream_writer(stream_writer_mock)

    def _read_next_mock(self):
        time.sleep(1 / self.SAMPLE_FPS)
        return self.SAMPLE_IMAGE
        
    def test_when_dispatching_then_image_is_dispatched_to_stream_writer(self):
        self._dispatch()
        self._stream_writer_mock.write.assert_called_with(self.SAMPLE_IMAGE)
        
    def test_given_read_error_when_dispatching_then_last_image_is_dispatched_to_stream_writer(self):
        self._stream_reader_mock.read_next.side_effect = [self.SAMPLE_IMAGE, IOError]
        self._dispatch()
        self._stream_writer_mock.write.assert_called_with(self.SAMPLE_IMAGE)

    def test_given_read_error_and_no_last_image_when_dispatching_then_default_image_is_dispatched_to_stream_writer(self):
        self._stream_reader_mock.read_next.side_effect = IOError
        self._dispatch()
        self._stream_writer_mock.write.assert_called_with(self.SAMPLE_DEFAULT_IMAGE)

    def _dispatch(self):
        self._video_stream_dispatcher.start_dispatching_async()
        time.sleep(0.25)
        self._video_stream_dispatcher.stop_dispatching()
Beispiel #5
0
class BaseStationApplication(object):

    LOGGING_DIRECTORY = "../data/logs"
    IMAGE_LOGGING_DIRECTORY = "../data/logs/images"
    SERVER_PORT = 8080
    REMOTE_SERVER_PORT = 8081
    STREAMING_SERVER_PORT = 5000
    STREAMING_SERVER_IP_ADDRESS = "192.168.0.60"
    REMOTE_SERVER_IP_ADDRESS = "192.168.0.60"
    DEFAULT_STREAM_IMAGE_FILE_NAME = "../resources/default-stream-image.png"
    VIDEO_STREAM_BUFFER_SIZE = 1

    def initialize(self):
        #ptvsd.enable_attach(secret = 'd3sign3')

        self._init_logging()
        self._init_services()
        self._embedded_application = RemotableOf(EmbeddedApplication, self._remoting_client)
        self._init_web_app()
        self._logger.close()

    def _init_logging(self):
        self._logger = Logger()
        self._logger.similar_log_entry_skip_interval = 0
        self._csv_log_subscriber = CsvLogSubscriber(self.LOGGING_DIRECTORY)
        self._image_log_subscriber = ImageLogSubscriber(self.IMAGE_LOGGING_DIRECTORY)
        self._console_log_subscriber = ConsoleLogSubscriber()
        self._logger.subscribe(self._csv_log_subscriber)
        self._logger.subscribe(self._image_log_subscriber)
        self._logger.subscribe(self._console_log_subscriber)

    def _init_services(self):
        self._init_remoting_services()
        self._coordinate_factory = CoordinateFactory()
        self._world_map_service = WorldMapService(self._coordinate_factory)
        self._local_world_map_service =  RemotableOf(LocalWorldMapService, self._remoting_client)
        self._pathfinding_service = PathfindingService(Pathfinder(PathSimplifier()), self._world_map_service, self._coordinate_factory)
        self._embedded_video_streaming_service = RemotableOf(VideoStreamingService, self._remoting_client)
        self._movement_executor = RemotableOf(MovementExecutor, self._remoting_client)
        self._path_navigator = PathNavigator(self._movement_executor, self._world_map_service, self._coordinate_factory)
        self._motion_service = MotionService(self._movement_executor, self._path_navigator)
        self._hardware_status_collector_service = RemotableOf(HardwareStatusCollectorService, self._remoting_client)
        self._secret_code_decoding_service = RemotableOf(SecretCodeDecodingService, self._remoting_client)
        self._treasure_handling_service = RemotableOf(TreasureHandlingService, self._remoting_client)
        self._camera_arm_control_service = RemotableOf(CameraArmControlService, self._remoting_client)
        self._game_cycle_control_service = GameCycleControlService(StateFactory(), self._world_map_service, self._pathfinding_service, self._motion_service, self._secret_code_decoding_service, self._treasure_handling_service, self._hardware_status_collector_service, self._local_world_map_service)
        self._init_video_streaming_service()

    def _init_video_streaming_service(self):
        self._original_stream_buffer = InMemoryBufferedStreamWriter(self.VIDEO_STREAM_BUFFER_SIZE)
        self._processed_stream_buffer = InMemoryBufferedStreamWriter(self.VIDEO_STREAM_BUFFER_SIZE)
        self._world_map_stream_writer = WorldMapStreamWriter(self._world_map_service, self._pathfinding_service)
        self._world_map_stream_writer.add_output_stream_writer(self._processed_stream_buffer)
        self._video_stream_dispatcher = VideoStreamDispatcher(Image.from_file(self.DEFAULT_STREAM_IMAGE_FILE_NAME))
        self._video_stream_dispatcher.add_stream_writer(self._original_stream_buffer)
        self._video_stream_dispatcher.add_stream_writer(self._world_map_stream_writer)
        self._tcp_stream_reader = TcpStreamReader(self.STREAMING_SERVER_IP_ADDRESS, self.STREAMING_SERVER_PORT, self.VIDEO_STREAM_BUFFER_SIZE, False)
        self._video_streaming_service = VideoStreamingService(self._video_stream_dispatcher, self._original_stream_buffer, self._processed_stream_buffer, self._tcp_stream_reader)

    def _init_remoting_services(self):
        self._remote_method_invoker = RemoteMethodInvoker(JsonSerializer())
        self._remoting_client = RemotingClient(self._remote_method_invoker, self.REMOTE_SERVER_IP_ADDRESS, self.REMOTE_SERVER_PORT)

    def _init_web_app(self):
        self._web_server = WebServer(self.SERVER_PORT, self._logger, self._embedded_application, self._remoting_client, self._world_map_service,
                                     self._local_world_map_service, self._pathfinding_service, self._video_streaming_service, self._embedded_video_streaming_service, self._game_cycle_control_service, 
                                     self._motion_service, self._hardware_status_collector_service, self._secret_code_decoding_service, self._treasure_handling_service, self._camera_arm_control_service)
        self._web_server.run()
Beispiel #6
0
class EmbeddedApplication(object):

    LOGGING_DIRECTORY = "../data/logs"
    IMAGE_LOGGING_DIRECTORY = "../data/logs/images"
    SERVER_PORT = 8081
    REMOTE_SERVER_PORT = 8080
    STREAMING_SERVER_PORT = 5000
    STREAMING_SERVER_IP_ADDRESS = "0.0.0.0"
    DEFAULT_STREAM_IMAGE_FILE_NAME = "../resources/default-stream-image.png"
    DEFAULT_EMBEDDED_CAMERA_ID = 0
    EMBEDDED_CAMERA_FRAME_ROTATION_ANGLE = 90
    VIDEO_STREAM_BUFFER_SIZE = 1
    MAX_TCP_STREAM_IMAGE_SIZE = Vector2(360, 480)

    def initialize(self):
        #ptvsd.enable_attach(secret = 'd3sign3')
        #ptvsd.wait_for_attach()

        self._init_logging()
        self._init_drivers()
        self._init_services()
        self._publish_remoting_objects()
        self._init_web_app()
        self._logger.close()

    def _init_logging(self):
        self._logger = Logger()
        self._logger.logging_level = LogEntryType.INFORMATIONAL
        self._logger.save_blob_data = True
        self._csv_log_subscriber = CsvLogSubscriber(self.LOGGING_DIRECTORY)
        self._image_log_subscriber = ImageLogSubscriber(self.IMAGE_LOGGING_DIRECTORY)
        self._console_log_subscriber = ConsoleLogSubscriber()
        self._logger.subscribe(self._csv_log_subscriber)
        self._logger.subscribe(self._image_log_subscriber)
        self._logger.subscribe(self._console_log_subscriber)

    def _init_drivers(self):
        self._uart_driver = UartDriver()
        self._pololu_driver = PololuDriver(self._uart_driver)
        self._microcontroller_driver = MicrocontrollerDriver(self._uart_driver)

    def _init_services(self):
        self._init_remoting_services()
        self._camera_arm_control_service = CameraArmControlService(self._pololu_driver)
        self._hardware_status_collector_service = HardwareStatusCollectorService(self._microcontroller_driver)
        self._local_world_map_service = LocalWorldMapService(self._camera_arm_control_service)
        self._movement_executor = MovementExecutor(self._microcontroller_driver)
        self._secret_code_decoding_service = SecretCodeDecodingService(self._microcontroller_driver)
        self._treasure_handling_service = TreasureHandlingService(self._microcontroller_driver, self._local_world_map_service, self._movement_executor)
        self._init_video_streaming_service()

    def _init_video_streaming_service(self):
        self._tcp_stream_writer = TcpStreamWriter(self.STREAMING_SERVER_IP_ADDRESS, self.STREAMING_SERVER_PORT, self.VIDEO_STREAM_BUFFER_SIZE, self.MAX_TCP_STREAM_IMAGE_SIZE)
        self._local_world_map_stream_writer = LocalWorldMapStreamWriter(self._local_world_map_service)
        self._local_world_map_stream_writer.add_output_stream_writer(self._tcp_stream_writer)
        self._video_stream_dispatcher = VideoStreamDispatcher(Image.from_file(self.DEFAULT_STREAM_IMAGE_FILE_NAME))
        self._video_stream_dispatcher.add_stream_writer( self._local_world_map_stream_writer)
        self._video_streaming_service = VideoStreamingService(self._video_stream_dispatcher, None, self._tcp_stream_writer)
        self._video_streaming_service.set_camera_source(self.DEFAULT_EMBEDDED_CAMERA_ID, self.EMBEDDED_CAMERA_FRAME_ROTATION_ANGLE)

    def _init_remoting_services(self):
        self._remoting_server = RemotingServer(JsonSerializer())

    def _publish_remoting_objects(self):
        self._remoting_server.publish_object(self._movement_executor)
        self._remoting_server.publish_object(self._hardware_status_collector_service)
        self._remoting_server.publish_object(self._secret_code_decoding_service)
        self._remoting_server.publish_object(self._treasure_handling_service)
        self._remoting_server.publish_object(self._video_streaming_service)
        self._remoting_server.publish_object(self._camera_arm_control_service)
        self._remoting_server.publish_object(self._local_world_map_service)
        self._remoting_server.publish_object(self)

    def _init_web_app(self):
        self._web_server = EmbeddedWebServer(self.SERVER_PORT, self._logger, self._remoting_server)
        self._web_server.run()

    def restart(self):
        python = sys.executable
        script = os.path.realpath(__file__)
        subprocess.Popen([python, script])
        self.stop()

    def stop(self):
        self._web_server.shutdown()
        sys.exit(0)