From: Joseph Coffland Date: Fri, 7 Feb 2020 21:14:00 +0000 (-0800) Subject: Fixed crosshair cookie, Allow up to 4 camera clients, Improved video camera performance. X-Git-Url: https://git.buildbotics.com/?a=commitdiff_plain;h=2704a77cd99f06a0c4d9a34033b17dc973779ae6;p=bbctrl-firmware Fixed crosshair cookie, Allow up to 4 camera clients, Improved video camera performance. --- 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 c82090f..00cd9b1 100644 Binary files a/src/resources/images/in-use.jpg and b/src/resources/images/in-use.jpg differ diff --git a/src/resources/images/offline.jpg b/src/resources/images/offline.jpg index 1a4399b..23dab13 100644 Binary files a/src/resources/images/offline.jpg and b/src/resources/images/offline.jpg differ