From 2704a77cd99f06a0c4d9a34033b17dc973779ae6 Mon Sep 17 00:00:00 2001 From: Joseph Coffland Date: Fri, 7 Feb 2020 13:14:00 -0800 Subject: [PATCH] Fixed crosshair cookie, Allow up to 4 camera clients, Improved video camera performance. --- CHANGELOG.md | 3 ++- src/js/app.js | 2 +- src/py/bbctrl/Camera.py | 14 ++++++++++---- src/py/bbctrl/__init__.py | 2 ++ src/resources/images/in-use.jpg | Bin 11880 -> 8970 bytes src/resources/images/offline.jpg | Bin 12970 -> 9856 bytes 6 files changed, 15 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index deda624..ebb7d17 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,8 @@ Buildbotics CNC Controller Firmware Changelog - Support for OMRON MX2 VFD. - Better error handling in WiFi configuration. - Fix open WiFi access. - - Fixes for MJPEG video format. Should help with video on iPhone. + - Improved video camera performance. + - Allow up to 4 camera clients at once. - Add axis bounds GCode variables ``#<_x_min>``, ``#<_x_max>``, etc. - Expose ``junction-accel`` planning parameter. diff --git a/src/js/app.js b/src/js/app.js index df14c72..7d22d76 100644 --- a/src/js/app.js +++ b/src/js/app.js @@ -105,7 +105,7 @@ module.exports = new Vue({ }, state: {messages: []}, video_size: cookie.get('video-size', 'small'), - crosshair: cookie.get('crosshair', false), + crosshair: cookie.get('crosshair', 'false') != 'false', errorTimeout: 30, errorTimeoutStart: 0, errorShow: false, diff --git a/src/py/bbctrl/Camera.py b/src/py/bbctrl/Camera.py index 940b946..66c2f71 100755 --- a/src/py/bbctrl/Camera.py +++ b/src/py/bbctrl/Camera.py @@ -77,7 +77,6 @@ def get_image_resource(path): return format_frame(f.read()) - class VideoDevice(object): def __init__(self, path = '/dev/video0'): self.fd = os.open(path, os.O_RDWR | os.O_NONBLOCK | os.O_CLOEXEC) @@ -208,7 +207,7 @@ class VideoDevice(object): buf = self._dqbuf() mm = self.buffers[buf.index] - frame = mm.read() + frame = mm.read(buf.bytesused) mm.seek(0) self._qbuf(buf) @@ -286,6 +285,7 @@ class Camera(object): self.height = args.height self.fps = args.fps self.fourcc = string_to_fourcc(args.fourcc) + self.max_clients = args.camera_clients self.overtemp = False self.dev = None @@ -328,7 +328,11 @@ class Camera(object): if not len(self.clients): return try: - self.clients[-1].write_frame(format_frame(frame)) + frame = format_frame(frame) + for i in range(self.max_clients): + if i < len(self.clients): + self.clients[-(i + 1)].write_frame(frame) + except Exception as e: self.log.warning('Failed to write frame to client: %s' % e) @@ -420,7 +424,9 @@ class Camera(object): def add_client(self, client): self.log.info('Adding camera client: %d' % len(self.clients)) - if len(self.clients): self.clients[-1].write_img('in-use') + if self.max_clients <= len(self.clients): + self.clients[-self.max_clients].write_img('in-use') + self.clients.append(client) self._update_client_image() diff --git a/src/py/bbctrl/__init__.py b/src/py/bbctrl/__init__.py index bf6dd24..acde54c 100644 --- a/src/py/bbctrl/__init__.py +++ b/src/py/bbctrl/__init__.py @@ -152,6 +152,8 @@ def parse_args(): help = 'Camera frames per second') parser.add_argument('--fourcc', default = 'MJPG', help = 'Camera frame format') + parser.add_argument('--camera-clients', default = 4, + help = 'Maximum simultaneous camera clients') parser.add_argument('--demo', action = 'store_true', help = 'Enter demo mode') parser.add_argument('--debug', default = 0, type = int, diff --git a/src/resources/images/in-use.jpg b/src/resources/images/in-use.jpg index c82090f35dd8b78e8bb5ac750878ec556651b7c3..00cd9b160745e538077dc89665dbc8ff35605d5c 100644 GIT binary patch delta 12 TcmaD6)8)qW|HkG7ZVqJtC?*9r delta 2952 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