Fixed crosshair cookie, Allow up to 4 camera clients, Improved video camera performance.
authorJoseph Coffland <joseph@cauldrondevelopment.com>
Fri, 7 Feb 2020 21:14:00 +0000 (13:14 -0800)
committerJoseph Coffland <joseph@cauldrondevelopment.com>
Fri, 7 Feb 2020 21:14:00 +0000 (13:14 -0800)
CHANGELOG.md
src/js/app.js
src/py/bbctrl/Camera.py
src/py/bbctrl/__init__.py
src/resources/images/in-use.jpg
src/resources/images/offline.jpg

index deda624ffa2cf64846e083088bd5b040bfd4f5e8..ebb7d17865f9da858827bc5f3844470e3ed0d825 100644 (file)
@@ -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.
 
index df14c72150d7ebb57b80600727d0540b5a027337..7d22d763bf85ffd9f14c5e2c404ea819ca9a1b33 100644 (file)
@@ -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,
index 940b946c5c60bcf5c4ef02d54728c325bbf2fab0..66c2f714b1f631d50891730db34d9f6065d95070 100755 (executable)
@@ -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()
 
index bf6dd2427d4ffa3fca84cac32072578cf4d4ee16..acde54c45539dbc5b2a4202d385152af3f6554e2 100644 (file)
@@ -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,
index c82090f35dd8b78e8bb5ac750878ec556651b7c3..00cd9b160745e538077dc89665dbc8ff35605d5c 100644 (file)
Binary files a/src/resources/images/in-use.jpg and b/src/resources/images/in-use.jpg differ
index 1a4399bfe6b736fd38b58c413b7a7418ed559713..23dab1348742d57192dc75e4ab187d5fb330f37a 100644 (file)
Binary files a/src/resources/images/offline.jpg and b/src/resources/images/offline.jpg differ