mirror of
https://github.com/hyperion-project/hyperion.ng.git
synced 2023-10-10 13:36:59 +02:00
378 lines
15 KiB
JavaScript
378 lines
15 KiB
JavaScript
$(document).ready(function () {
|
|
performTranslation();
|
|
var conf_editor_v4l2 = null;
|
|
var conf_editor_fg = null;
|
|
var conf_editor_instCapt = null;
|
|
var V4L2_AVAIL = window.serverInfo.grabbers.available.includes("v4l2");
|
|
|
|
if (V4L2_AVAIL) {
|
|
// Dynamic v4l2 enum schema
|
|
var v4l2_dynamic_enum_schema = {
|
|
"available_devices":
|
|
{
|
|
"type": "string",
|
|
"title": "edt_conf_v4l2_device_title",
|
|
"propertyOrder": 1,
|
|
"required": true
|
|
},
|
|
"device_inputs":
|
|
{
|
|
"type": "string",
|
|
"title": "edt_conf_v4l2_input_title",
|
|
"propertyOrder": 3,
|
|
"required": true
|
|
},
|
|
"resolutions":
|
|
{
|
|
"type": "string",
|
|
"title": "edt_conf_v4l2_resolution_title",
|
|
"propertyOrder": 6,
|
|
"required": true
|
|
},
|
|
"framerates":
|
|
{
|
|
"type": "string",
|
|
"title": "edt_conf_v4l2_framerate_title",
|
|
"propertyOrder": 9,
|
|
"required": true
|
|
}
|
|
};
|
|
|
|
// Build dynamic v4l2 enum schema parts
|
|
var buildSchemaPart = function (key, schema, device) {
|
|
if (schema[key]) {
|
|
var enumVals = [];
|
|
var enumTitelVals = [];
|
|
var v4l2_properties = JSON.parse(JSON.stringify(window.serverInfo.grabbers.v4l2_properties));
|
|
|
|
if (key === 'available_devices') {
|
|
for (var i = 0; i < v4l2_properties.length; i++) {
|
|
enumVals.push(v4l2_properties[i]['device']);
|
|
|
|
v4l2_properties[i].hasOwnProperty('name')
|
|
? enumTitelVals.push(v4l2_properties[i]['name'])
|
|
: enumTitelVals.push(v4l2_properties[i]['device']);
|
|
}
|
|
} else if (key == 'resolutions' || key == 'framerates') {
|
|
for (var i = 0; i < v4l2_properties.length; i++) {
|
|
if (v4l2_properties[i]['device'] == device) {
|
|
enumVals = enumTitelVals = v4l2_properties[i][key];
|
|
break;
|
|
}
|
|
}
|
|
} else if (key == 'device_inputs') {
|
|
for (var i = 0; i < v4l2_properties.length; i++) {
|
|
if (v4l2_properties[i]['device'] == device) {
|
|
for (var index = 0; index < v4l2_properties[i]['inputs'].length; index++) {
|
|
enumVals.push(v4l2_properties[i]['inputs'][index]['inputIndex'].toString());
|
|
enumTitelVals.push(v4l2_properties[i]['inputs'][index]['inputName']);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
window.schema.grabberV4L2.properties[key] = {
|
|
"type": schema[key].type,
|
|
"title": schema[key].title,
|
|
"enum": [].concat(["auto"], enumVals, ["custom"]),
|
|
"options":
|
|
{
|
|
"enum_titles": [].concat(["edt_conf_enum_automatic"], enumTitelVals, ["edt_conf_enum_custom"]),
|
|
},
|
|
"propertyOrder": schema[key].propertyOrder,
|
|
"required": schema[key].required
|
|
};
|
|
}
|
|
};
|
|
|
|
// Switch between visible states
|
|
function toggleOption(option, state) {
|
|
$('[data-schemapath="root.grabberV4L2.' + option + '"]').toggle(state);
|
|
if (state) (
|
|
$('[data-schemapath="root.grabberV4L2.' + option + '"]').addClass('col-md-12'),
|
|
$('label[for="root_grabberV4L2_' + option + '"]').css('left', '10px'),
|
|
$('[id="root_grabberV4L2_' + option + '"]').css('left', '10px')
|
|
);
|
|
}
|
|
|
|
// Watch all v4l2 dynamic fields
|
|
var setWatchers = function (schema) {
|
|
var path = 'root.grabberV4L2.';
|
|
Object.keys(schema).forEach(function (key) {
|
|
conf_editor_v4l2.watch(path + key, function () {
|
|
var ed = conf_editor_v4l2.getEditor(path + key);
|
|
var val = ed.getValue();
|
|
|
|
if (key == 'available_devices') {
|
|
var V4L2properties = ['device_inputs', 'resolutions', 'framerates'];
|
|
if (val == 'custom') {
|
|
var grabberV4L2 = ed.parent;
|
|
V4L2properties.forEach(function (item) {
|
|
buildSchemaPart(item, v4l2_dynamic_enum_schema, 'none');
|
|
grabberV4L2.original_schema.properties[item] = window.schema.grabberV4L2.properties[item];
|
|
grabberV4L2.schema.properties[item] = window.schema.grabberV4L2.properties[item];
|
|
conf_editor_v4l2.validator.schema.properties.grabberV4L2.properties[item] = window.schema.grabberV4L2.properties[item];
|
|
|
|
grabberV4L2.removeObjectProperty(item);
|
|
delete grabberV4L2.cached_editors[item];
|
|
grabberV4L2.addObjectProperty(item);
|
|
|
|
conf_editor_v4l2.getEditor(path + item).enable();
|
|
});
|
|
|
|
conf_editor_v4l2.getEditor(path + 'standard').enable();
|
|
toggleOption('device', true);
|
|
} else if (val == 'auto') {
|
|
V4L2properties.forEach(function (item) {
|
|
conf_editor_v4l2.getEditor(path + item).setValue('auto');
|
|
conf_editor_v4l2.getEditor(path + item).disable();
|
|
});
|
|
|
|
conf_editor_v4l2.getEditor(path + 'standard').setValue('auto');
|
|
conf_editor_v4l2.getEditor(path + 'standard').disable();
|
|
|
|
(toggleOption('device', false), toggleOption('input', false),
|
|
toggleOption('width', false), toggleOption('height', false),
|
|
toggleOption('fps', false));
|
|
} else {
|
|
var grabberV4L2 = ed.parent;
|
|
V4L2properties.forEach(function (item) {
|
|
buildSchemaPart(item, v4l2_dynamic_enum_schema, val);
|
|
grabberV4L2.original_schema.properties[item] = window.schema.grabberV4L2.properties[item];
|
|
grabberV4L2.schema.properties[item] = window.schema.grabberV4L2.properties[item];
|
|
conf_editor_v4l2.validator.schema.properties.grabberV4L2.properties[item] = window.schema.grabberV4L2.properties[item];
|
|
|
|
grabberV4L2.removeObjectProperty(item);
|
|
delete grabberV4L2.cached_editors[item];
|
|
grabberV4L2.addObjectProperty(item);
|
|
|
|
conf_editor_v4l2.getEditor(path + item).enable();
|
|
});
|
|
|
|
conf_editor_v4l2.getEditor(path + 'standard').enable();
|
|
toggleOption('device', false);
|
|
}
|
|
}
|
|
|
|
if (key == 'resolutions')
|
|
val != 'custom'
|
|
? (toggleOption('width', false), toggleOption('height', false))
|
|
: (toggleOption('width', true), toggleOption('height', true));
|
|
|
|
if (key == 'framerates')
|
|
val != 'custom'
|
|
? toggleOption('fps', false)
|
|
: toggleOption('fps', true);
|
|
|
|
if (key == 'device_inputs')
|
|
val != 'custom'
|
|
? toggleOption('input', false)
|
|
: toggleOption('input', true);
|
|
});
|
|
});
|
|
};
|
|
|
|
// Insert dynamic v4l2 enum schema parts
|
|
Object.keys(v4l2_dynamic_enum_schema).forEach(function (key) {
|
|
buildSchemaPart(key, v4l2_dynamic_enum_schema, window.serverConfig.grabberV4L2.device);
|
|
});
|
|
}
|
|
|
|
if (window.showOptHelp) {
|
|
// Instance Capture
|
|
$('#conf_cont').append(createRow('conf_cont_instCapt'));
|
|
$('#conf_cont_instCapt').append(createOptPanel('fa-camera', $.i18n("edt_conf_instCapture_heading_title"), 'editor_container_instCapt', 'btn_submit_instCapt'));
|
|
$('#conf_cont_instCapt').append(createHelpTable(window.schema.instCapture.properties, $.i18n("edt_conf_instCapture_heading_title")));
|
|
|
|
// Framegrabber
|
|
$('#conf_cont').append(createRow('conf_cont_fg'));
|
|
$('#conf_cont_fg').append(createOptPanel('fa-camera', $.i18n("edt_conf_fg_heading_title"), 'editor_container_fg', 'btn_submit_fg'));
|
|
$('#conf_cont_fg').append(createHelpTable(window.schema.framegrabber.properties, $.i18n("edt_conf_fg_heading_title")));
|
|
|
|
// V4L2 - hide if not available
|
|
if (V4L2_AVAIL) {
|
|
$('#conf_cont').append(createRow('conf_cont_v4l'));
|
|
$('#conf_cont_v4l').append(createOptPanel('fa-camera', $.i18n("edt_conf_v4l2_heading_title"), 'editor_container_v4l2', 'btn_submit_v4l2'));
|
|
$('#conf_cont_v4l').append(createHelpTable(window.schema.grabberV4L2.properties, $.i18n("edt_conf_v4l2_heading_title")));
|
|
}
|
|
} else {
|
|
$('#conf_cont').addClass('row');
|
|
$('#conf_cont').append(createOptPanel('fa-camera', $.i18n("edt_conf_instCapture_heading_title"), 'editor_container_instCapt', 'btn_submit_instCapt'));
|
|
$('#conf_cont').append(createOptPanel('fa-camera', $.i18n("edt_conf_fg_heading_title"), 'editor_container_fg', 'btn_submit_fg'));
|
|
if (V4L2_AVAIL) {
|
|
$('#conf_cont').append(createOptPanel('fa-camera', $.i18n("edt_conf_v4l2_heading_title"), 'editor_container_v4l2', 'btn_submit_v4l2'));
|
|
}
|
|
}
|
|
|
|
// Instance Capture
|
|
conf_editor_instCapt = createJsonEditor('editor_container_instCapt', {
|
|
instCapture: window.schema.instCapture
|
|
}, true, true);
|
|
|
|
conf_editor_instCapt.on('change', function () {
|
|
conf_editor_instCapt.validate().length || window.readOnlyMode ? $('#btn_submit_instCapt').attr('disabled', true) : $('#btn_submit_instCapt').attr('disabled', false);
|
|
});
|
|
|
|
$('#btn_submit_instCapt').off().on('click', function () {
|
|
requestWriteConfig(conf_editor_instCapt.getValue());
|
|
});
|
|
|
|
// Framegrabber
|
|
conf_editor_fg = createJsonEditor('editor_container_fg', {
|
|
framegrabber: window.schema.framegrabber
|
|
}, true, true);
|
|
|
|
conf_editor_fg.on('change', function () {
|
|
//Remove Grabbers which are not supported
|
|
var grabbers = window.serverInfo.grabbers.available;
|
|
|
|
var selector = "root_framegrabber_type";
|
|
var options = $("#" + selector + " option");
|
|
|
|
for (var i = 0; i < options.length; i++) {
|
|
var type = options[i].value;
|
|
if (grabbers.indexOf(type) === -1) {
|
|
$("#" + selector + " option[value='" + type + "']").remove();
|
|
}
|
|
}
|
|
|
|
if (window.serverInfo.grabbers.active)
|
|
{
|
|
var activegrabber = window.serverInfo.grabbers.active.toLowerCase();
|
|
$("#" + selector + " option[value='" + activegrabber + "']").attr('selected', 'selected');
|
|
}
|
|
|
|
var selectedType = $("#root_framegrabber_type").val();
|
|
filerFgGrabberOptions(selectedType);
|
|
|
|
conf_editor_fg.validate().length || window.readOnlyMode ? $('#btn_submit_fg').attr('disabled', true) : $('#btn_submit_fg').attr('disabled', false);
|
|
});
|
|
|
|
$('#btn_submit_fg').off().on('click', function () {
|
|
requestWriteConfig(conf_editor_fg.getValue());
|
|
});
|
|
|
|
if (V4L2_AVAIL) {
|
|
conf_editor_v4l2 = createJsonEditor('editor_container_v4l2', {
|
|
grabberV4L2: window.schema.grabberV4L2
|
|
}, true, true);
|
|
|
|
conf_editor_v4l2.on('change', function () {
|
|
conf_editor_v4l2.validate().length || window.readOnlyMode ? $('#btn_submit_v4l2').attr('disabled', true) : $('#btn_submit_v4l2').attr('disabled', false);
|
|
});
|
|
|
|
conf_editor_v4l2.on('ready', function () {
|
|
setWatchers(v4l2_dynamic_enum_schema);
|
|
|
|
if (window.serverConfig.grabberV4L2.available_devices == 'custom' && window.serverConfig.grabberV4L2.device != 'auto')
|
|
toggleOption('device', true);
|
|
|
|
if (window.serverConfig.grabberV4L2.device == 'auto')
|
|
conf_editor_v4l2.getEditor('root.grabberV4L2.available_devices').setValue('auto');
|
|
|
|
if (window.serverConfig.grabberV4L2.available_devices == 'auto') {
|
|
['device_inputs', 'standard', 'resolutions', 'framerates'].forEach(function (item) {
|
|
conf_editor_v4l2.getEditor('root.grabberV4L2.' + item).setValue('auto');
|
|
conf_editor_v4l2.getEditor('root.grabberV4L2.' + item).disable();
|
|
});
|
|
}
|
|
|
|
if (window.serverConfig.grabberV4L2.device_inputs == 'custom' && window.serverConfig.grabberV4L2.device != 'auto')
|
|
toggleOption('input', true);
|
|
|
|
if (window.serverConfig.grabberV4L2.resolutions == 'custom' && window.serverConfig.grabberV4L2.device != 'auto')
|
|
(toggleOption('width', true), toggleOption('height', true));
|
|
|
|
if (window.serverConfig.grabberV4L2.framerates == 'custom' && window.serverConfig.grabberV4L2.device != 'auto')
|
|
toggleOption('fps', true);
|
|
});
|
|
|
|
$('#btn_submit_v4l2').off().on('click', function () {
|
|
var v4l2Options = conf_editor_v4l2.getValue();
|
|
|
|
if (v4l2Options.grabberV4L2.available_devices != 'custom' && v4l2Options.grabberV4L2.available_devices != 'auto')
|
|
v4l2Options.grabberV4L2.device = v4l2Options.grabberV4L2.available_devices;
|
|
|
|
if (v4l2Options.grabberV4L2.available_devices == 'auto')
|
|
v4l2Options.grabberV4L2.device = 'auto';
|
|
|
|
if (v4l2Options.grabberV4L2.device_inputs != 'custom' && v4l2Options.grabberV4L2.device_inputs != 'auto' && v4l2Options.grabberV4L2.available_devices != 'auto')
|
|
v4l2Options.grabberV4L2.input = parseInt(v4l2Options.grabberV4L2.device_inputs);
|
|
|
|
if (v4l2Options.grabberV4L2.device_inputs == 'auto')
|
|
v4l2Options.grabberV4L2.input = -1;
|
|
|
|
if (v4l2Options.grabberV4L2.resolutions != 'custom' && v4l2Options.grabberV4L2.resolutions != 'auto' && v4l2Options.grabberV4L2.available_devices != 'auto')
|
|
(v4l2Options.grabberV4L2.width = parseInt(v4l2Options.grabberV4L2.resolutions.split('x')[0]),
|
|
v4l2Options.grabberV4L2.height = parseInt(v4l2Options.grabberV4L2.resolutions.split('x')[1]));
|
|
|
|
if (v4l2Options.grabberV4L2.resolutions == 'auto')
|
|
(v4l2Options.grabberV4L2.width = 0, v4l2Options.grabberV4L2.height = 0);
|
|
|
|
if (v4l2Options.grabberV4L2.framerates != 'custom' && v4l2Options.grabberV4L2.framerates != 'auto' && v4l2Options.grabberV4L2.available_devices != 'auto')
|
|
v4l2Options.grabberV4L2.fps = parseInt(v4l2Options.grabberV4L2.framerates);
|
|
|
|
if (v4l2Options.grabberV4L2.framerates == 'auto')
|
|
v4l2Options.grabberV4L2.fps = 15;
|
|
|
|
requestWriteConfig(v4l2Options);
|
|
});
|
|
}
|
|
|
|
//////////////////////////////////////////////////
|
|
|
|
//create introduction
|
|
if (window.showOptHelp) {
|
|
createHint("intro", $.i18n('conf_grabber_fg_intro'), "editor_container_fg");
|
|
if (V4L2_AVAIL) {
|
|
createHint("intro", $.i18n('conf_grabber_v4l_intro'), "editor_container_v4l2");
|
|
}
|
|
}
|
|
|
|
function toggleFgOptions(el, state) {
|
|
for (var i = 0; i < el.length; i++) {
|
|
$('[data-schemapath*="root.framegrabber.' + el[i] + '"]').toggle(state);
|
|
}
|
|
}
|
|
|
|
function filerFgGrabberOptions(type) {
|
|
//hide specific options for grabbers found
|
|
|
|
var grabbers = window.serverInfo.grabbers.available;
|
|
if (grabbers.indexOf(type) > -1) {
|
|
toggleFgOptions(["width", "height", "pixelDecimation", "display"], true);
|
|
|
|
switch (type) {
|
|
case "dispmanx":
|
|
toggleFgOptions(["pixelDecimation", "display"], false);
|
|
break;
|
|
case "x11":
|
|
case "xcb":
|
|
toggleFgOptions(["width", "height", "display"], false);
|
|
break;
|
|
case "framebuffer":
|
|
toggleFgOptions(["display"], false);
|
|
break;
|
|
case "amlogic":
|
|
toggleFgOptions(["pixelDecimation", "display"], false);
|
|
break;
|
|
case "qt":
|
|
break;
|
|
case "dx":
|
|
break;
|
|
case "osx":
|
|
break;
|
|
default:
|
|
}
|
|
}
|
|
};
|
|
|
|
$('#root_framegrabber_type').change(function () {
|
|
var selectedType = $("#root_framegrabber_type").val();
|
|
filerFgGrabberOptions(selectedType);
|
|
});
|
|
|
|
removeOverlay();
|
|
});
|