Add camera stream reconnect on closing

This commit is contained in:
estevez-dev 2019-02-20 13:57:25 +02:00
parent cc3c6b0087
commit f25a47beb2
2 changed files with 36 additions and 16 deletions

View File

@ -19,8 +19,8 @@ class _EntityViewPageState extends State<EntityViewPage> {
void initState() { void initState() {
super.initState(); super.initState();
_stateSubscription = eventBus.on<StateChangedEvent>().listen((event) { _stateSubscription = eventBus.on<StateChangedEvent>().listen((event) {
Logger.d("State change event handled by entity page: ${event.entityId}");
if (event.entityId == widget.entityId) { if (event.entityId == widget.entityId) {
Logger.d("State change event handled by entity page: ${event.entityId}");
setState(() {}); setState(() {});
} }
}); });

View File

@ -15,7 +15,7 @@ class _CameraControlsWidgetState extends State<CameraControlsWidget> {
@override @override
void initState() { void initState() {
super.initState(); super.initState();
_getData(); _connect();
} }
http.Client client; http.Client client;
@ -25,7 +25,8 @@ class _CameraControlsWidgetState extends State<CameraControlsWidget> {
bool timeToStop = false; bool timeToStop = false;
Completer streamCompleter; Completer streamCompleter;
void _getData() async { void _connect() async {
timeToStop = false;
client = new http.Client(); // create a client to make api calls 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 http.Request request = new http.Request("GET", Uri.parse(widget.url)); // create get request
Logger.d("[Sending] ==> ${widget.url}"); Logger.d("[Sending] ==> ${widget.url}");
@ -53,7 +54,7 @@ class _CameraControlsWidgetState extends State<CameraControlsWidget> {
if (primaryBuffer.length >= imageSizeStart + 10) { if (primaryBuffer.length >= imageSizeStart + 10) {
contentType = utf8.decode( contentType = utf8.decode(
primaryBuffer.sublist(frameBoundarySize+16, imageSizeStart + 10), allowMalformed: true).split("\r\n")[0]; primaryBuffer.sublist(frameBoundarySize+16, imageSizeStart + 10), allowMalformed: true).split("\r\n")[0];
Logger.d("$contentType"); //Logger.d("$contentType");
imageSizeStart = frameBoundarySize + 16 + contentType.length + 18; imageSizeStart = frameBoundarySize + 16 + contentType.length + 18;
for (int i = imageSizeStart; i < primaryBuffer.length - 4; i++) { for (int i = imageSizeStart; i < primaryBuffer.length - 4; i++) {
strBuffer = utf8.decode( strBuffer = utf8.decode(
@ -68,7 +69,7 @@ class _CameraControlsWidgetState extends State<CameraControlsWidget> {
imageSize = int.tryParse(utf8.decode( imageSize = int.tryParse(utf8.decode(
primaryBuffer.sublist(imageSizeStart, imageSizeEnd), primaryBuffer.sublist(imageSizeStart, imageSizeEnd),
allowMalformed: true)); allowMalformed: true));
Logger.d("content-length: $imageSize"); //Logger.d("content-length: $imageSize");
if (imageSize != null && if (imageSize != null &&
primaryBuffer.length >= imageStart + imageSize + 2) { primaryBuffer.length >= imageStart + imageSize + 2) {
sink.add( sink.add(
@ -87,16 +88,42 @@ class _CameraControlsWidgetState extends State<CameraControlsWidget> {
Logger.e("Error parsing MJPEG stream: $error"); Logger.e("Error parsing MJPEG stream: $error");
}, },
handleDone: (sink) { handleDone: (sink) {
Logger.d("Camera stream finished. Reconnecting...");
sink?.close(); sink?.close();
streamCompleter?.complete();
_reconnect();
}, },
) )
).listen((d) { ).listen((d) {
if (!timeToStop) {
setState(() { setState(() {
binaryImage = d; 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 @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
if (binaryImage.isEmpty) { if (binaryImage.isEmpty) {
@ -116,14 +143,7 @@ class _CameraControlsWidgetState extends State<CameraControlsWidget> {
@override @override
void dispose() { void dispose() {
disconnect();
super.dispose(); super.dispose();
timeToStop = true;
if (streamCompleter != null && !streamCompleter.isCompleted) {
streamCompleter.future.then((_) {
client?.close();
});
} else {
client?.close();
}
} }
} }