diff --git a/lib/entity.page.dart b/lib/entity.page.dart index 71e953b..b537167 100644 --- a/lib/entity.page.dart +++ b/lib/entity.page.dart @@ -19,8 +19,8 @@ class _EntityViewPageState extends State { void initState() { super.initState(); _stateSubscription = eventBus.on().listen((event) { - Logger.d("State change event handled by entity page: ${event.entityId}"); if (event.entityId == widget.entityId) { + Logger.d("State change event handled by entity page: ${event.entityId}"); setState(() {}); } }); diff --git a/lib/entity_widgets/controls/camera_controls.dart b/lib/entity_widgets/controls/camera_controls.dart index 73b86c6..e93bfd5 100644 --- a/lib/entity_widgets/controls/camera_controls.dart +++ b/lib/entity_widgets/controls/camera_controls.dart @@ -15,7 +15,7 @@ class _CameraControlsWidgetState extends State { @override void initState() { super.initState(); - _getData(); + _connect(); } http.Client client; @@ -25,7 +25,8 @@ class _CameraControlsWidgetState extends State { bool timeToStop = false; Completer streamCompleter; - void _getData() async { + void _connect() async { + timeToStop = false; client = new http.Client(); // create a client to make api calls http.Request request = new http.Request("GET", Uri.parse(widget.url)); // create get request Logger.d("[Sending] ==> ${widget.url}"); @@ -53,7 +54,7 @@ class _CameraControlsWidgetState extends State { if (primaryBuffer.length >= imageSizeStart + 10) { contentType = utf8.decode( primaryBuffer.sublist(frameBoundarySize+16, imageSizeStart + 10), allowMalformed: true).split("\r\n")[0]; - Logger.d("$contentType"); + //Logger.d("$contentType"); imageSizeStart = frameBoundarySize + 16 + contentType.length + 18; for (int i = imageSizeStart; i < primaryBuffer.length - 4; i++) { strBuffer = utf8.decode( @@ -68,7 +69,7 @@ class _CameraControlsWidgetState extends State { imageSize = int.tryParse(utf8.decode( primaryBuffer.sublist(imageSizeStart, imageSizeEnd), allowMalformed: true)); - Logger.d("content-length: $imageSize"); + //Logger.d("content-length: $imageSize"); if (imageSize != null && primaryBuffer.length >= imageStart + imageSize + 2) { sink.add( @@ -87,16 +88,42 @@ class _CameraControlsWidgetState extends State { Logger.e("Error parsing MJPEG stream: $error"); }, handleDone: (sink) { + Logger.d("Camera stream finished. Reconnecting..."); sink?.close(); + streamCompleter?.complete(); + _reconnect(); }, ) ).listen((d) { - setState(() { - binaryImage = d; - }); + if (!timeToStop) { + setState(() { + binaryImage = d; + }); + } }); } + void _reconnect() { + disconnect().then((_){ + _connect(); + }); + } + + Future disconnect() { + Completer disconF = Completer(); + timeToStop = true; + if (streamCompleter != null && !streamCompleter.isCompleted) { + streamCompleter.future.then((_) { + client?.close(); + disconF.complete(); + }); + } else { + client?.close(); + disconF.complete(); + } + return disconF.future; + } + @override Widget build(BuildContext context) { if (binaryImage.isEmpty) { @@ -116,14 +143,7 @@ class _CameraControlsWidgetState extends State { @override void dispose() { + disconnect(); super.dispose(); - timeToStop = true; - if (streamCompleter != null && !streamCompleter.isCompleted) { - streamCompleter.future.then((_) { - client?.close(); - }); - } else { - client?.close(); - } } } \ No newline at end of file