value = int(controls['contrast'])
logging.debug('setting contrast to %(value)s...' % {'value': value})
- v4l2ctl.set_brightness(device, value)
+ v4l2ctl.set_contrast(device, value)
if 'saturation' in controls:
value = int(controls['saturation'])
logging.debug('setting saturation to %(value)s...' % {'value': value})
- v4l2ctl.set_brightness(device, value)
+ v4l2ctl.set_saturation(device, value)
if 'hue' in controls:
value = int(controls['hue'])
logging.debug('setting hue to %(value)s...' % {'value': value})
- v4l2ctl.set_brightness(device, value)
+ v4l2ctl.set_hue(device, value)
def list_cameras(self):
logging.debug('listing cameras')
'width': int(ui['resolution'].split('x')[0]),
'height': int(ui['resolution'].split('x')[1]),
'framerate': int(ui.get('framerate', 1)),
+ 'rotate': int(ui.get('rotation', 0)),
# file storage
'@storage_device': ui.get('storage_device', 'local-disk'),
'hue': int(round(int(data['hue']) / 2.55)),
'resolution': str(data['width']) + 'x' + str(data['height']),
'framerate': int(data['framerate']),
+ 'rotation': int(data['rotate']),
# file storage
'storage_device': data['@storage_device'],
function pushPreview() {
var cameraId = $('#videoDeviceSelect').val();
var brightness = $('#brightnessSlider').val();
- var contrast= $('#brightnessSlider').val();
- var saturation = $('#brightnessSlider').val();
- var hue = $('#brightnessSlider').val();
+ var contrast= $('#contrastSlider').val();
+ var saturation = $('#saturationSlider').val();
+ var hue = $('#hueSlider').val();
var data = {
'brightness': brightness,
/* camera frames */
-function addCameraFrameUi(cameraId, cameraName) {
+function addCameraFrameUi(cameraId, cameraName, framerate) {
var cameraFrameDiv = $(
'<div class="camera-frame">' +
'<div class="camera-top-bar">' +
'</div>' +
'</div>' +
'<div class="camera-container">' +
+ '<div class="camera-placeholder"></div>' +
'<img class="camera">' +
'</div>' +
'</div>');
var cameraImg = cameraFrameDiv.find('img.camera');
cameraFrameDiv.attr('id', 'camera' + cameraId);
+ cameraFrameDiv[0].framerate = framerate;
+ cameraFrameDiv[0].refreshDivider = 0;
nameSpan.html(cameraName);
/* insert the new camera frame at the right position,
doCloseCamera(cameraId);
});
- /* add content to the frame */
- cameraImg.attr('src', staticUrl + 'img/video1.jpg');
+ /* error and load handlers */
+ cameraImg.error(function () {
+ this.error = true;
+ cameraImg.addClass('error');
+ cameraImg.height(Math.round(cameraImg.width() * 0.75));
+ });
+ cameraImg.load(function () {
+ this.error = false;
+ cameraImg.removeClass('error');
+ cameraImg.css('height', '');
+ });
}
function remCameraFrameUi(cameraId) {
}
}
- /* add new camera frames */
+ /* add new camera frames and update existing camera params */
for (i = 0; i < cameras.length; i++) {
camera = cameras[i];
- if (pageContainer.find('div.camera-frame#camera' + camera.id).length === 0) {
- addCameraFrameUi(camera.id);
+ var cameraFrame = pageContainer.find('div.camera-frame#camera' + camera.id);
+ if (cameraFrame.length === 0) { /* not existing, add a new one */
+ addCameraFrameUi(camera.id, camera.name, camera.streaming_framerate);
+ }
+ else { /* existing, update params */
+ cameraFrame[0].framerate = camera.streaming_framerate;
}
+
}
}
});
}
+function refreshCameraFrames() {
+ function refreshCameraFrame(cameraId, img) {
+ img.src = '/snapshot/' + cameraId + '/current/?_=' + new Date().getTime();
+ }
+
+ var cameraFrames = $('div.page-container').find('div.camera-frame');
+ cameraFrames.each(function () {
+ /* limit the refresh rate to 10 fps */
+ var count = Math.max(1, 10 / this.framerate);
+ var img = $(this).find('img.camera')[0];
+
+ if (img.error) {
+ /* in case of error, decrease the refresh rate to 1 fps */
+ count = 10;
+ }
+
+ if (this.refreshDivider < count) {
+ this.refreshDivider++;
+ }
+ else {
+ var cameraId = this.id.substring(6);
+ refreshCameraFrame(cameraId, img);
+
+ this.refreshDivider = 0;
+ }
+ });
+
+ setTimeout(refreshCameraFrames, 100);
+}
+
/* startup function */
initUI();
fetchCurrentConfig();
+ refreshCameraFrames();
});
<td class="settings-item-label"><span class="settings-item-label">Video Rotation</span></td>
<td class="settings-item-value">
<select class="video-resolution styled device" id="rotationSelect">
- <option>0°</option>
- <option>90°</option>
- <option>180°</option>
- <option>270°</option>
+ <option value="0">0°</option>
+ <option value="90">90°</option>
+ <option value="180">180°</option>
+ <option value="270">270°</option>
</select>
<td><span class="help-mark" title="use this to rotate the captured image, if your camera is not positioned correctly">?</span></td>
</td>