{
    "i18n": true,
    "type": "tabs",
    "tabsStyle": {
        "width": "calc(100% - 100px)"
        },
    "items": {
        "tabCanAdapter": {
            "type": "panel",
            "xs": 12,
            "sm": 12,
            "md": 6,
            "lg": 4,
            "xl": 4,
            "label": "CAN Adapter",
            "items": {
                "introTabCanInstanceNotActiveTxt": {
                    "xs": 12,
                    "sm": 12,
                    "md": 12,
                    "lg": 12,
                    "xl": 12,
                    "type": "staticText",
                    "text": "Please start this adapter instance to enable further configuration options.",
                    "newLine": true,
                    "hidden": "_alive",
                    "style": {
                        "color": "red"
                    }
                },
                "introTabCanPressSaveTxt": {
                    "xs": 12,
                    "sm": 12,
                    "md": 12,
                    "lg": 12,
                    "xl": 12,
                    "type": "staticText",
                    "text": "Please press button 'Save', when you're done on this tab.",
                    "newLine": true,
                    "hidden": "!_changed",
                    "style": {
                        "color": "red"
                    }
                },
                "canExtHeader": {
                    "type": "header",
                    "text": "UDS CAN Adapter",
                    "size": 2,
                    "newLine": true
                },
                "canExtName": {
                    "xs": 12,
                    "sm": 2,
                    "md": 2,
                    "lg": 2,
                    "xl": 2,
                    "type": "text",
                    "tooltip": "Device mame of CAN adapter connected to UDS-capable bus, e.g. can0",
                    "default" : "can0",
                    "newLine": false
                },
                "canExtActivated": {
                    "xs": 12,
                    "sm": 4,
                    "md": 4,
                    "lg": 4,
                    "xl": 4,
                    "type": "checkbox",
                    "label": "Connect to Adapter",
                    "tooltip": "Check, if this adapter shall be used.",
                    "default" : false,
                    "newLine": false
                },        
                "canIntHeader": {
                    "type": "header",
                    "text": "Second CAN Adapter",
                    "size": 2,
                    "newLine": true
                },
                "canIntName": {
                    "xs": 12,
                    "sm": 2,
                    "md": 2,
                    "lg": 2,
                    "xl": 2,
                    "type": "text",
                    "tooltip": "Device mame of CAN adapter connected to second bus, e.g. can1",
                    "default" : "can1",
                    "newLine": false
                },
               "canIntActivated": {
                    "xs": 12,
                    "sm": 4,
                    "md": 4,
                    "lg": 4,
                    "xl": 4,
                    "type": "checkbox",
                    "label": "Connect to Adapter",
                    "tooltip": "Check, if this adapter shall be used.",
                    "default" : false,
                    "newLine": false
                }        
            }
        },
        "tabUdsDevices": {
            "type": "panel",
            "xs": 12,
            "sm": 12,
            "md": 6,
            "lg": 4,
            "xl": 4,
            "label": "List of UDS devices",
            "hidden": "if (!data.canExtActivated) { return true; } else {return false; }",
            "items": {
                "tableUdsDevicesHdr": {
                    "type": "header",
                    "text": "List of available devices",
                    "size": 2
                },

                "tableUdsDevicesWarning": {
                    "xs": 12,
                    "sm": 12,
                    "md": 12,
                    "lg": 12,
                    "xl": 12,
                    "type": "staticText",
                    "text": "Configuration requires a running adapter instance!",
                    "hidden": "_alive",
                    "newLine": true,
                    "style": {
                        "color": "red"
                    }
                },
                "introTabUdsDevicesSaveTxt": {
                    "xs": 12,
                    "sm": 12,
                    "md": 12,
                    "lg": 12,
                    "xl": 12,
                    "type": "staticText",
                    "text": "Please press button 'Save', when you're done on this tab.",
                    "newLine": true,
                    "hidden": "!_changed",
                    "style": {
                        "color": "red"
                    }
                },
                "introtableUdsDevicesTxt": {
                    "xs": 12,
                    "sm": 12,
                    "md": 12,
                    "lg": 12,
                    "xl": 12,
                    "type": "staticText",
                    "text": "You may edit 2nd column to set name of state for the device (visible in object tree).",
                    "hidden": "if ((data.tableUdsDevices) && (data.tableUdsDevices.length > 0)) { return true; } else {return false; }",
                    "newLine": true
                },
                "introTableNoEmptyDevNameTxt": {
                    "xs": 12,
                    "sm": 12,
                    "md": 12,
                    "lg": 12,
                    "xl": 12,
                    "type": "staticText",
                    "text": "'Device state name' must not be blank!",
                    "newLine": true,
                    "hidden": "if ( (data.tableUdsDevices) && (data.tableUdsDevices.length > 0) ) {for (const c of data.tableUdsDevices) {if (c.devStateName === '') return false;}; return true;} else return true;",
                    "style": {
                        "color": "red"
                    }
                },
                "introTableNoDotInDevNameTxt": {
                    "xs": 12,
                    "sm": 12,
                    "md": 12,
                    "lg": 12,
                    "xl": 12,
                    "type": "staticText",
                    "text": "Symbol '.' not allowed in 'Device state name'!",
                    "newLine": true,
                    "hidden": "if ( (data.tableUdsDevices) && (data.tableUdsDevices.length > 0) ) {for (const c of data.tableUdsDevices) {if (c.devStateName.includes('.')) return false;}; return true;} else return true;",
                    "style": {
                        "color": "red"
                    }
                },
                "tableUdsDevicesButton": {
                    "type": "sendTo",
                    "label": "Start scan to update list of devices",
                    "variant": "outlined",
                    "showProcess": true,
                    "command": "getUdsDevices",
                    "jsonData": "{}",
                    "useNative": true,
                    "hidden": "!_alive",
                    "newLine": true,
                    "xs": 12,
                    "sm": 12,
                    "md": 12,
                    "lg": 12,
                    "xl": 12
                },

                "tableUdsDevices": {
                    "type": "table",
                    "uniqueColumns": ["devStateName"],
                    "newLine": true,
                    "xs": 12,
                    "sm": 12,
                    "md": 12,
                    "lg": 12,
                    "xl": 12,
                    "label": "List of available devices",
                    "hidden": "!_alive",
                    "noDelete": true,
                    "import": true,
                    "export": true,
                    "items": [
                        {
                            "type": "text",
                            "attr": "devName",
                            "width": "15% ",
                            "title": "Device name (Viessmann)",
                            "tooltip": "Device ECU name (fixed)",
                            "filter": false,
                            "sort": false,
                            "readOnly": true
                        },
                        {
                            "type": "text",
                            "attr": "devStateName",
                            "width": "15% ",
                            "title": "Device state name",
                            "tooltip": "Device name in object tree. Must not contain dots.",
                            "filter": false,
                            "sort": false,
                            "validator": "if ( (data.devStateName === '') || (data.devStateName.includes('.')) ) { return false; } else { return true; }",
                            "validatorNoSaveOnError": true
                        },
                        {
                            "type": "text",
                            "attr": "devAddr",
                            "width": "10% ",
                            "title": "Device Address",
                            "tooltip": "Device ECU address (fixed)",
                            "filter": false,
                            "sort": false,
                            "readOnly": true
                        },
                        {
                            "type": "text",
                            "attr": "collectCanId",
                            "width": "10% ",
                            "title": "CAN id for collecting data",
                            "tooltip": "CAN id - still experimental. Leave blank for deactivation.",
                            "filter": false,
                            "sort": false,
                            "readOnly": false
                        }
                    ]
                }
            }
        },
        "tabUdsDids": {
            "type": "panel",
            "xs": 12,
            "sm": 12,
            "md": 6,
            "lg": 4,
            "xl": 4,
            "label": "List of datapoints",
            "hidden": "if ((data.tableUdsDevices) && (data.tableUdsDevices.length == 0)) { return true; } else {return false; }",
            "items": {
                "tableUdsDidsWarning": {
                    "xs": 12,
                    "sm": 12,
                    "md": 12,
                    "lg": 12,
                    "xl": 12,
                    "type": "staticText",
                    "text": "Configuration requires a running adapter instance!",
                    "hidden": "_alive",
                    "newLine": true,
                    "style": {
                        "color": "red"
                    }
                },
                "tableUdsDidsStartScan": {
                    "type": "sendTo",
                    "label": "Start scan for datapoints of all devices",
                    "variant": "outlined",
                    "showProcess": true,
                    "jsonData": "{}",
                    "command": "startDidScan",
                    "confirm": {
                        "condition": "true",
                        "title": "Confirm scan for datapoints",
                        "text": "Scan will take up to 5 minutes. Plaese make sure, no other UDSonCAN client (e.g. Open3Eclient.py) is running. Please do not close the tab during scan. You may follow up the progress by watching the Log in an additional tab.",
                        "ok": "OK",
                        "cancel": "Cancel"
                    },
                    "hidden": "!_alive",
                    "newLine": true,
                    "xs": 12,
                    "sm": 12,
                    "md": 12,
                    "lg": 12,
                    "xl": 12
                },
                "tableUdsDidsSelDev": {
                    "xs": 12,
                    "sm": 12,
                    "md": 12,
                    "lg": 12,
                    "xl": 12,
                    "type": "selectSendTo",
                    "label": "Select device",
                    "jsonData": "{}",
                    "command": "getUdsDidsDevSelect",
                    "default": "Select device",
                    "hidden": "!_alive",
                    "alsoDependsOn": ["udsSchedule","tableUdsDevices"],
                    "newLine": true
                },

                "tableUdsDidsButton": {
                    "type": "sendTo",
                    "command": "getUdsDids",
                    "jsonData": "${JSON.stringify(data.tableUdsDidsSelDev)}",
                    "label": "Update list of datapoints",
                    "variant": "outlined",
                    "hidden": "if ( (_alive) && (data.tableUdsDidsSelDev) ) { return false; }; return true;",
                    "useNative": true,
                    "showProcess": true,
                    "newLine": true,
                    "xs": 12,
                    "sm": 12,
                    "md": 12,
                    "lg": 12,
                    "xl": 12
                },

                "tableUdsDids": {
                    "type": "table",
                    "newLine": true,
                    "xs": 12,
                    "sm": 12,
                    "md": 12,
                    "lg": 12,
                    "xl": 12,
                    "label": "List of device specific datapoints",
                    "hidden": "if ( (_alive) && (data.tableUdsDidsSelDev) ) { return false; }; return true;",
                    "noDelete": true,
                    "import": true,
                    "export": true,
                    "items": [
                        {
                            "type": "number",
                            "attr": "didId",
                            "doNotSave": true,
                            "width": "10% ",
                            "title": "ID",
                            "tooltip": "Id of datapoint",
                            "filter": false,
                            "sort": false
                        },
                        {
                            "type": "number",
                            "attr": "didLen",
                            "doNotSave": true,
                            "width": "10% ",
                            "title": "Length",
                            "tooltip": "Length of datapoint",
                            "filter": false,
                            "sort": false
                        },
                        {
                            "type": "text",
                            "attr": "didName",
                            "doNotSave": true,
                            "width": "55% ",
                            "title": "Name",
                            "tooltip": "Name of datapoint",
                            "filter": true,
                            "sort": false,
                            "readOnly": true
                        },
                        {
                            "type": "text",
                            "attr": "didCodec",
                            "doNotSave": true,
                            "width": "25% ",
                            "title": "Codec",
                            "tooltip": "Codec used for datapoint",
                            "filter": true,
                            "sort": false,
                            "readOnly": true
                        }
                   ]
                }
            }
        },
        "tabCanAdapterExt": {
            "type": "panel",
            "xs": 12,
            "sm": 12,
            "md": 6,
            "lg": 4,
            "xl": 4,
            "label": "Assignments to UDS CAN Adapter",
            "hidden": "if ((data.tableUdsDevices) && (data.tableUdsDevices.length == 0)) { return true; } else {return false; }",
            "items": {
                "tableCanAdapterExtWarning": {
                    "xs": 12,
                    "sm": 12,
                    "md": 12,
                    "lg": 12,
                    "xl": 12,
                    "type": "staticText",
                    "text": "Configuration requires a running adapter instance!",
                    "hidden": "_alive",
                    "newLine": true,
                    "style": {
                        "color": "red"
                    }
                },
                "energyMetersHeader": {
                    "type": "header",
                    "text": "Energy Meters",
                    "size": 2,
                    "newLine": true
                },
                "energyMetersWarnUpdateTime": {
                    "xs": 12,
                    "sm": 12,
                    "md": 12,
                    "lg": 12,
                    "xl": 12,
                    "type": "staticText",
                    "text": "WARNING: Values below 2 seconds may cause heavy system load!",
                    "newLine": true,
                    "hidden": "if ( (data.e380Delay < 2) || (data.e3100cbDelay < 2) ) { return false; }; return true;",
                    "style": {
                        "color": "red"
                    }
                },
                "e380Active": {
                    "xs": 12,
                    "sm": 2,
                    "md": 2,
                    "lg": 2,
                    "xl": 2,
                    "type": "checkbox",
                    "label": "active",
                    "tooltip": "Activate communication",
                    "default" : false,
                    "newLine": true
                },
                "e380Name": {
                    "xs": 12,
                    "sm": 2,
                    "md": 2,
                    "lg": 2,
                    "xl": 2,
                    "type": "text",
                    "label": "Device state name",
                    "tooltip": "This text will be used as base for object tree",
                    "default" : "e380",
                    "newLine": false
                },
                "e380Delay": {
                    "xs": 12,
                    "sm": 2,
                    "md": 2,
                    "lg": 2,
                    "xl": 2,
                    "type": "number",
                    "label": "Min. update time (s)",
                    "tooltip": "Minumum update time for states. 0 for immediate update.",
                    "default" : 5,
                    "min": 0,
                    "newLine": false
                },
                "e3100cbActive": {
                    "xs": 12,
                    "sm": 2,
                    "md": 2,
                    "lg": 2,
                    "xl": 2,
                    "type": "checkbox",
                    "label": "active",
                    "tooltip": "Activate communication",
                    "default" : false,
                    "newLine": true
                },
                "e3100cbName": {
                    "xs": 12,
                    "sm": 2,
                    "md": 2,
                    "lg": 2,
                    "xl": 2,
                    "type": "text",
                    "label": "Device state name",
                    "tooltip": "This text will be used as base for object tree",
                    "default" : "e3100cb",
                    "newLine": false
                },
                "e3100cbDelay": {
                    "xs": 12,
                    "sm": 2,
                    "md": 2,
                    "lg": 2,
                    "xl": 2,
                    "type": "number",
                    "label": "Min. update time (s)",
                    "tooltip": "Minumum update time for states. 0 for immediate update.",
                    "default" : 5,
                    "min": 0,
                    "newLine": false
                },
                "tableHdrCol": {
                    "type": "header",
                    "text": "Collecting Data on UDS CAN Adapter",
                    "size": 2
                },

                "introTableColExt": {
                    "xs": 12,
                    "sm": 12,
                    "md": 12,
                    "lg": 12,
                    "xl": 12,
                    "type": "staticText",
                    "text": "Devices for collecting data. No writing to CAN bus. Press '+' to add device.",
                    "hidden": "if (data.tableUdsDevices) {for(let i=0; i<data.tableUdsDevices.length; i++){if (data.tableUdsDevices[i].collectCanId != '') return false;}; return true;} else {return true;}",
                    "newLine": true
                },

                "introTableColExtNoDevs": {
                    "xs": 12,
                    "sm": 12,
                    "md": 12,
                    "lg": 12,
                    "xl": 12,
                    "type": "staticText",
                    "text": "No device for collecting available (missing CAN ID).",
                    "hidden": "if (data.tableUdsDevices) {for(let i=0; i<data.tableUdsDevices.length; i++){if (data.tableUdsDevices[i].collectCanId != '') return true;}; return false;} else {return false;}",
                    "newLine": true
                },

                "tableColExtErrDevName": {
                    "xs": 12,
                    "sm": 12,
                    "md": 12,
                    "lg": 12,
                    "xl": 12,
                    "type": "staticText",
                    "text": "ERROR: column 'Device state name' must contain unique text.",
                    "newLine": true,
                    "hidden": "const x={}; for(let ii=0; data.tableCollectCanExt && ii<data.tableCollectCanExt.length; ii++){const t=data.tableCollectCanExt[ii].collectCanId; if (x[t]==='x') return false; x[t]='x';}; return true;",
                    "style": {
                        "color": "red"
                    }
                },

                "tableCollectCanExt": {
                    "type": "table",
                    "newLine": true,
                    "xs": 12,
                    "sm": 12,
                    "md": 12,
                    "lg": 12,
                    "xl": 12,
                    "label": "",
                    "hidden": "if (data.tableUdsDevices) {for(let i=0; i<data.tableUdsDevices.length; i++){if (data.tableUdsDevices[i].collectCanId != '') return false;}; return true;} else {return true;}",
                    "showSecondAddAt": 5,
                    "items": [
                        {
                            "type": "checkbox",
                            "attr": "collectActive",
                            "width": "5% ",
                            "title": "active",
                            "tooltip": "Activate communication",
                            "filter": false,
                            "sort": false,
                            "default": true
                        },
                        {   "type": "selectSendTo",
                            "title": "Select device",
                            "command": "getExtColDeviceSelect",
                            "attr": "collectCanId",
                            "jsonData": "${JSON.stringify(globalData.tableUdsDevices)}",
                            "width": "15%",
                            "default": "Select device",
                            "alsoDependsOn": ["collectActive","tableUdsDevices"],
                            "newLine": false,
                            "validator": "if (data.collectCanId === 'Select device') { return false; } else { return true; }",
                            "validatorNoSaveOnError": true
                        },
                        {
                            "type": "number",
                            "attr": "collectDelayTime",
                            "width": "15% ",
                            "title": "Min. update time (s)",
                            "tooltip": "Minumum update time for states. 0 for immediate update.",
                            "filter": false,
                            "sort": false,
                            "min": 0,
                            "step": 1,
                            "default": 5
                        }
                    ]
                },
                "tableHdrUds": {
                    "type": "header",
                    "text": "Requesting data on UDS CAN Adapter via UDSonCAN",
                    "size": 2
                },

                "introTableUds": {
                    "xs": 12,
                    "sm": 12,
                    "md": 12,
                    "lg": 12,
                    "xl": 12,
                    "type": "staticText",
                    "text": "Specify schedules for devices, press '+' to begin.",
                    "newLine": true
                },
                "tableUdsSchedules": {
                    "type": "table",
                    "newLine": true,
                    "xs": 12,
                    "sm": 12,
                    "md": 12,
                    "lg": 12,
                    "xl": 12,
                    "label": "",
                    "showSecondAddAt": 5,
                    "items": [
                        {
                            "type": "checkbox",
                            "attr": "udsScheduleActive",
                            "width": "5% ",
                            "title": "active",
                            "tooltip": "Activate communication",
                            "filter": false,
                            "sort": false,
                            "default": true
                        },
                        {
                            "type": "number",
                            "attr": "udsSchedule",
                            "width": "10% ",
                            "title": "Schedule (s)",
                            "tooltip": "Schedule for requesting given datapoints. 0 for one time request on start of adapter instance.",
                            "filter": false,
                            "sort": false,
                            "min": 0,
                            "step": 1,
                            "default": 0
                        },
                        {   "type": "selectSendTo",
                            "title": "Select device",
                            "command": "getUdsDeviceSelect",
                            "attr": "udsSelectDevAddr",
                            "jsonData": "${JSON.stringify(globalData.tableUdsDevices)}",
                            "width": "15%",
                            "default": "Select device",
                            "alsoDependsOn": ["udsSchedule","tableUdsDevices"],
                            "newLine": false,
                            "validator": "if (data.udsSelectDevAddr === 'Select device') { return false; } else { return true; }",
                            "validatorNoSaveOnError": true
                        },
                        {
                            "type": "text",
                            "attr": "udsScheduleDids",
                            "width": "30% ",
                            "title": "List of datapoints",
                            "tooltip": "Separate by comma! All given datapoints will be requested with specified schedule and ECU address.",
                            "filter": false,
                            "sort": false,
                            "default": "256"
                        },
                        {
                            "type": "text",
                            "attr": "udsScheduleUserComment",
                            "width": "30% ",
                            "title": "Description",
                            "tooltip": "Optional description of this schedule.",
                            "filter": false,
                            "sort": false,
                            "default": ""
                        }
                    ]
                }

            }
        },
        "tabCanAdapterInt": {
            "type": "panel",
            "xs": 12,
            "sm": 12,
            "md": 6,
            "lg": 4,
            "xl": 4,
            "label": "Assignments to second CAN Adapter",
            "hidden": "return !data.canIntActivated;",
            "items": {
                "tableHdr": {
                    "type": "header",
                    "text": "Collecting Data on second CAN Adapter",
                    "size": 2
                },

                "introTableColInt": {
                    "xs": 12,
                    "sm": 12,
                    "md": 12,
                    "lg": 12,
                    "xl": 12,
                    "type": "staticText",
                    "text": "Devices for collecting data. No writing to CAN bus. Press '+' to add device.",
                    "newLine": true
                },

                "tableCanAdapterIntWarning": {
                    "xs": 12,
                    "sm": 12,
                    "md": 12,
                    "lg": 12,
                    "xl": 12,
                    "type": "staticText",
                    "text": "Configuration requires a running adapter instance!",
                    "hidden": "_alive",
                    "newLine": true,
                    "style": {
                        "color": "red"
                    }
                },
                "tableColIntErrDevName": {
                    "xs": 12,
                    "sm": 12,
                    "md": 12,
                    "lg": 12,
                    "xl": 12,
                    "type": "staticText",
                    "text": "ERROR: column 'Device state name' must contain unique text.",
                    "newLine": true,
                    "hidden": "const x={}; for(let ii=0; data.tableCollectCanInt && ii<data.tableCollectCanInt.length; ii++){const t=data.tableCollectCanInt[ii].collectCanId; if (x[t]==='x') return false; x[t]='x';}; return true;",
                    "style": {
                        "color": "red"
                    }
                },
                "tableCollectCanInt": {
                    "type": "table",
                    "newLine": true,
                    "xs": 12,
                    "sm": 12,
                    "md": 12,
                    "lg": 12,
                    "xl": 12,
                    "label": "",
                    "showSecondAddAt": 5,

                    "items": [
                        {
                            "type": "checkbox",
                            "attr": "collectActive",
                            "width": "5% ",
                            "title": "active",
                            "tooltip": "Activate communication",
                            "filter": false,
                            "sort": false,
                            "default": true
                        },
                        {   "type": "selectSendTo",
                            "title": "Select device",
                            "command": "getIntColDeviceSelect",
                            "attr": "collectCanId",
                            "jsonData": "${JSON.stringify(globalData.tableUdsDevices)}",
                            "width": "15%",
                            "default": "Select device",
                            "alsoDependsOn": ["collectActive","tableUdsDevices"],
                            "newLine": false,
                            "validator": "if (data.collectCanId === 'Select device') { return false; } else { return true; }",
                            "validatorNoSaveOnError": true
                        },
                        {
                            "type": "number",
                            "attr": "collectDelayTime",
                            "width": "15% ",
                            "title": "Min. update time (s)",
                            "tooltip": "Minumum update time for states. 0 for immediate update.",
                            "filter": false,
                            "sort": false,
                            "min": 0,
                            "step": 1,
                            "default": 5
                        }
                    ]
                }
            }
        }
    }
}