diff --git a/assets/webconfig/i18n/en.json b/assets/webconfig/i18n/en.json index 2b12517f..30db928b 100644 --- a/assets/webconfig/i18n/en.json +++ b/assets/webconfig/i18n/en.json @@ -298,7 +298,6 @@ "edt_conf_fbs_heading_title": "Flatbuffers Server", "edt_conf_fbs_timeout_expl": "If no data are received for the given period, the component will be (soft) disabled.", "edt_conf_fbs_timeout_title": "Timeout", - "edt_conf_fg_device_title": "Device", "edt_conf_fg_display_expl": "Select which desktop should be captured (multi monitor setup)", "edt_conf_fg_display_title": "Display", "edt_conf_fg_frequency_Hz_expl": "How fast new pictures are captured", diff --git a/assets/webconfig/js/content_grabber.js b/assets/webconfig/js/content_grabber.js index 8866a3f2..431c9d65 100644 --- a/assets/webconfig/js/content_grabber.js +++ b/assets/webconfig/js/content_grabber.js @@ -1,45 +1,45 @@ -$(document).ready( function() { +$(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) { + 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 + "propertyOrder": 1, + "required": true }, "device_inputs": { "type": "string", "title": "edt_conf_v4l2_input_title", - "propertyOrder" : 3, - "required" : true + "propertyOrder": 3, + "required": true }, "resolutions": { "type": "string", "title": "edt_conf_v4l2_resolution_title", - "propertyOrder" : 6, - "required" : true + "propertyOrder": 6, + "required": true }, "framerates": { "type": "string", "title": "edt_conf_v4l2_framerate_title", - "propertyOrder" : 9, - "required" : true + "propertyOrder": 9, + "required": true } }; // Build dynamic v4l2 enum schema parts - var buildSchemaPart = function(key, schema, device) { + var buildSchemaPart = function (key, schema, device) { if (schema[key]) { var enumVals = []; var enumTitelVals = []; @@ -76,31 +76,31 @@ $(document).ready( function() { "type": schema[key].type, "title": schema[key].title, "enum": [].concat(["auto"], enumVals, ["custom"]), - "options" : + "options": { - "enum_titles" : [].concat(["edt_conf_enum_automatic"], enumTitelVals, ["edt_conf_enum_custom"]), + "enum_titles": [].concat(["edt_conf_enum_automatic"], enumTitelVals, ["edt_conf_enum_custom"]), }, - "propertyOrder" : schema[key].propertyOrder, - "required" : schema[key].required + "propertyOrder": schema[key].propertyOrder, + "required": schema[key].required }; } }; // Switch between visible states function toggleOption(option, state) { - $('[data-schemapath="root.grabberV4L2.'+option+'"]').toggle(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') + $('[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 setWatchers = function (schema) { var path = 'root.grabberV4L2.'; - Object.keys(schema).forEach(function(key) { - conf_editor_v4l2.watch(path + key, function() { + 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(); @@ -108,7 +108,7 @@ $(document).ready( function() { var V4L2properties = ['device_inputs', 'resolutions', 'framerates']; if (val == 'custom') { var grabberV4L2 = ed.parent; - V4L2properties.forEach(function(item) { + 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]; @@ -123,9 +123,8 @@ $(document).ready( function() { conf_editor_v4l2.getEditor(path + 'standard').enable(); toggleOption('device', true); - } else if (val == 'auto') { - V4L2properties.forEach(function(item) { + V4L2properties.forEach(function (item) { conf_editor_v4l2.getEditor(path + item).setValue('auto'); conf_editor_v4l2.getEditor(path + item).disable(); }); @@ -134,12 +133,11 @@ $(document).ready( function() { conf_editor_v4l2.getEditor(path + 'standard').disable(); (toggleOption('device', false), toggleOption('input', false), - toggleOption('width', false), toggleOption('height', false), - toggleOption('fps', false)); - + toggleOption('width', false), toggleOption('height', false), + toggleOption('fps', false)); } else { var grabberV4L2 = ed.parent; - V4L2properties.forEach(function(item) { + 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]; @@ -176,12 +174,12 @@ $(document).ready( function() { }; // Insert dynamic v4l2 enum schema parts - Object.keys(v4l2_dynamic_enum_schema).forEach(function(key) { + Object.keys(v4l2_dynamic_enum_schema).forEach(function (key) { buildSchemaPart(key, v4l2_dynamic_enum_schema, window.serverConfig.grabberV4L2.device); }); } - if(window.showOptHelp) { + 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')); @@ -193,7 +191,7 @@ $(document).ready( function() { $('#conf_cont_fg').append(createHelpTable(window.schema.framegrabber.properties, $.i18n("edt_conf_fg_heading_title"))); // V4L2 - hide if not available - if(V4L2_AVAIL) { + 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"))); @@ -202,7 +200,7 @@ $(document).ready( function() { $('#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) { + if (V4L2_AVAIL) { $('#conf_cont').append(createOptPanel('fa-camera', $.i18n("edt_conf_v4l2_heading_title"), 'editor_container_v4l2', 'btn_submit_v4l2')); } } @@ -212,11 +210,11 @@ $(document).ready( function() { instCapture: window.schema.instCapture }, true, true); - conf_editor_instCapt.on('change',function() { + 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() { + $('#btn_submit_instCapt').off().on('click', function () { requestWriteConfig(conf_editor_instCapt.getValue()); }); @@ -225,24 +223,46 @@ $(document).ready( function() { framegrabber: window.schema.framegrabber }, true, true); - conf_editor_fg.on('change',function() { + 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() { + $('#btn_submit_fg').off().on('click', function () { requestWriteConfig(conf_editor_fg.getValue()); }); - if(V4L2_AVAIL) { + if (V4L2_AVAIL) { conf_editor_v4l2 = createJsonEditor('editor_container_v4l2', { - grabberV4L2 : window.schema.grabberV4L2 + grabberV4L2: window.schema.grabberV4L2 }, true, true); - conf_editor_v4l2.on('change',function() { + 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() { + conf_editor_v4l2.on('ready', function () { setWatchers(v4l2_dynamic_enum_schema); if (window.serverConfig.grabberV4L2.available_devices == 'custom' && window.serverConfig.grabberV4L2.device != 'auto') @@ -252,7 +272,7 @@ $(document).ready( function() { 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) { + ['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(); }); @@ -266,10 +286,9 @@ $(document).ready( function() { if (window.serverConfig.grabberV4L2.framerates == 'custom' && window.serverConfig.grabberV4L2.device != 'auto') toggleOption('fps', true); - }); - $('#btn_submit_v4l2').off().on('click',function() { + $('#btn_submit_v4l2').off().on('click', function () { var v4l2Options = conf_editor_v4l2.getValue(); if (v4l2Options.grabberV4L2.available_devices != 'custom' && v4l2Options.grabberV4L2.available_devices != 'auto') @@ -304,31 +323,54 @@ $(document).ready( function() { ////////////////////////////////////////////////// //create introduction - if(window.showOptHelp) { + if (window.showOptHelp) { createHint("intro", $.i18n('conf_grabber_fg_intro'), "editor_container_fg"); - if(V4L2_AVAIL){ + if (V4L2_AVAIL) { createHint("intro", $.i18n('conf_grabber_v4l_intro'), "editor_container_v4l2"); } } - function hideEl(el) { - for(var i = 0; i -1) - hideEl(["device","pixelDecimation"]); - else if (grabbers.indexOf('x11') > -1 || grabbers.indexOf('xcb') > -1) - hideEl(["device","width","height"]); - else if (grabbers.indexOf('osx') > -1 ) - hideEl(["device","pixelDecimation"]); - else if (grabbers.indexOf('amlogic') > -1) - hideEl(["pixelDecimation"]); + 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(); diff --git a/config/hyperion.config.json.commented b/config/hyperion.config.json.commented index 3607892d..35ab38af 100644 --- a/config/hyperion.config.json.commented +++ b/config/hyperion.config.json.commented @@ -165,10 +165,7 @@ "pixelDecimation" : 8, // valid for qt - "display" 0, - - // valid for framebuffer - "device" : "/dev/fb0" + "display" 0 }, /// The black border configuration, contains the following items: diff --git a/config/hyperion.config.json.default b/config/hyperion.config.json.default index 8804b451..5fe923aa 100644 --- a/config/hyperion.config.json.default +++ b/config/hyperion.config.json.default @@ -95,7 +95,7 @@ "cropRight" : 0, "cropTop" : 0, "cropBottom" : 0, - "device" : "/dev/fb0" + "display" : 0 }, "blackborderdetector" : diff --git a/include/hyperion/GrabberWrapper.h b/include/hyperion/GrabberWrapper.h index dd1880f0..00a50f6e 100644 --- a/include/hyperion/GrabberWrapper.h +++ b/include/hyperion/GrabberWrapper.h @@ -37,12 +37,12 @@ public: static GrabberWrapper* getInstance(){ return instance; } /// - /// Starts the grabber wich produces led values with the specified update rate + /// Starts the grabber which produces led values with the specified update rate /// virtual bool start(); /// - /// Starts maybe the grabber wich produces led values with the specified update rate + /// Starts maybe the grabber which produces led values with the specified update rate /// virtual void tryStart(); @@ -90,6 +90,12 @@ public: /// virtual QStringList getFramerates(const QString& devicePath) const; + /// + /// @brief Get active grabber name + /// @return Active grabber name + /// + virtual QString getActive() const; + static QStringList availableGrabbers(); public: diff --git a/libsrc/api/JsonAPI.cpp b/libsrc/api/JsonAPI.cpp index 0bb8d228..d899e177 100644 --- a/libsrc/api/JsonAPI.cpp +++ b/libsrc/api/JsonAPI.cpp @@ -467,8 +467,11 @@ void JsonAPI::handleServerInfoCommand(const QJsonObject &message, const QString #if defined(ENABLE_DISPMANX) || defined(ENABLE_V4L2) || defined(ENABLE_FB) || defined(ENABLE_AMLOGIC) || defined(ENABLE_OSX) || defined(ENABLE_X11) || defined(ENABLE_XCB) || defined(ENABLE_QT) + if ( GrabberWrapper::getInstance() != nullptr ) + { + grabbers["active"] = GrabberWrapper::getInstance()->getActive(); + } // get available grabbers - //grabbers["active"] = ????; for (auto grabber : GrabberWrapper::availableGrabbers()) { availableGrabbers.append(grabber); diff --git a/libsrc/hyperion/GrabberWrapper.cpp b/libsrc/hyperion/GrabberWrapper.cpp index c91cf1bd..51f04fe3 100644 --- a/libsrc/hyperion/GrabberWrapper.cpp +++ b/libsrc/hyperion/GrabberWrapper.cpp @@ -65,6 +65,11 @@ bool GrabberWrapper::isActive() const return _timer->isActive(); } +QString GrabberWrapper::getActive() const +{ + return _grabberName; +} + QStringList GrabberWrapper::availableGrabbers() { QStringList grabbers; @@ -101,6 +106,10 @@ QStringList GrabberWrapper::availableGrabbers() grabbers << "qt"; #endif + #ifdef ENABLE_DX + grabbers << "dx"; + #endif + return grabbers; } diff --git a/libsrc/hyperion/SettingsManager.cpp b/libsrc/hyperion/SettingsManager.cpp index 94a6cbba..8a5b4a2b 100644 --- a/libsrc/hyperion/SettingsManager.cpp +++ b/libsrc/hyperion/SettingsManager.cpp @@ -101,7 +101,7 @@ SettingsManager::SettingsManager(quint8 instance, QObject* parent, bool readonly for (auto & schemaError : schemaChecker.getMessages()) Warning(_log, "Config Fix: %s", QSTRING_CSTR(schemaError)); - saveSettings(dbConfig); + saveSettings(dbConfig,true); } else _qconfig = dbConfig; diff --git a/libsrc/hyperion/schema/schema-framegrabber.json b/libsrc/hyperion/schema/schema-framegrabber.json index ac8d57e5..e9800712 100644 --- a/libsrc/hyperion/schema/schema-framegrabber.json +++ b/libsrc/hyperion/schema/schema-framegrabber.json @@ -7,13 +7,13 @@ { "type" : "string", "title" : "edt_conf_fg_type_title", - "enum" : ["auto","dispmanx","amlogic","x11", "xcb", "framebuffer","qt","dx"], + "enum" : ["auto","amlogic","dispmanx","dx","framebuffer","osx","qt","x11", "xcb"], "options": { - "enum_titles": ["edt_conf_enum_automatic","DispmanX","AMLogic","X11", "XCB", "Framebuffer","QT", "DirectX9"] + "enum_titles": ["edt_conf_enum_automatic","AMLogic","DispmanX","DirectX9","Framebuffer","OSX","QT","X11","XCB"] }, "default" : "auto", - "propertyOrder" : 2 + "propertyOrder" : 1 }, "width" : { @@ -22,7 +22,7 @@ "minimum" : 10, "default" : 80, "append" : "edt_append_pixel", - "propertyOrder" : 3 + "propertyOrder" : 2 }, "height" : { @@ -49,7 +49,7 @@ "minimum" : 0, "default" : 0, "append" : "edt_append_pixel", - "propertyOrder" : 6 + "propertyOrder" : 5 }, "cropRight" : { @@ -58,7 +58,7 @@ "minimum" : 0, "default" : 0, "append" : "edt_append_pixel", - "propertyOrder" : 7 + "propertyOrder" : 6 }, "cropTop" : { @@ -67,7 +67,7 @@ "minimum" : 0, "default" : 0, "append" : "edt_append_pixel", - "propertyOrder" : 8 + "propertyOrder" : 7 }, "cropBottom" : { @@ -76,7 +76,7 @@ "minimum" : 0, "default" : 0, "append" : "edt_append_pixel", - "propertyOrder" : 9 + "propertyOrder" : 8 }, "pixelDecimation" : { @@ -85,35 +85,15 @@ "minimum" : 1, "maximum" : 30, "default" : 8, - "propertyOrder" : 10 - }, - "device" : - { - "type" : "string", - "title" : "edt_conf_fg_device_title", - "default" : "/dev/fb0", - "propertyOrder" : 11 + "propertyOrder" : 9 }, "display" : { "type" : "integer", "title" : "edt_conf_fg_display_title", "minimum" : 0, - "propertyOrder" : 12 - }, - "amlogic_grabber" : - { - "type" : "string", - "title" : "edt_conf_fg_amlogic_grabber_title", - "default" : "amvideocap0", - "propertyOrder" : 13 - }, - "ge2d_mode" : - { - "type" : "integer", - "title" : "edt_conf_fg_ge2d_mode_title", "default" : 0, - "propertyOrder" : 14 + "propertyOrder" : 10 } }, "additionalProperties" : false