Add camera stream reconnect on closing
This commit is contained in:
parent
cc3c6b0087
commit
f25a47beb2
@ -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(() {});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -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();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
Reference in New Issue
Block a user