Warning, /education/gcompris/src/activities/digital_electricity/components/Comparator.qml is written in an unsupported language. File is not indexed.
0001 /* GCompris - Comparator.qml 0002 * 0003 * SPDX-FileCopyrightText: 2016 Pulkit Gupta <pulkitnsit@gmail.com> 0004 * 0005 * Authors: 0006 * Bruno Coudoin <bruno.coudoin@gcompris.net> (GTK+ version) 0007 * Pulkit Gupta <pulkitnsit@gmail.com> (Qt Quick port) 0008 * 0009 * SPDX-License-Identifier: GPL-3.0-or-later 0010 */ 0011 import QtQuick 2.12 0012 import GCompris 1.0 0013 0014 ElectricalComponent { 0015 id: comparator 0016 terminalSize: 0.25 0017 noOfInputs: 2 0018 noOfOutputs: 3 0019 property var inputTerminalPosY: [0.25, 0.75] 0020 property var outputTerminalPosY: [0.13, 0.5, 0.87] 0021 0022 information: qsTr("A comparator takes 2 numbers as input, A and B. It compares them and outputs 3 " + 0023 "values. The first output is 1 if A < B, otherwise it's 0. The second output is 1 " + 0024 "if A = B, otherwise it's 0. The third output is 1 if A > B, otherwise it's 0. ") 0025 0026 truthTable: [] 0027 0028 property alias inputTerminals: inputTerminals 0029 property alias outputTerminals: outputTerminals 0030 0031 Repeater { 0032 id: inputTerminals 0033 model: 2 0034 delegate: inputTerminal 0035 Component { 0036 id: inputTerminal 0037 TerminalPoint { 0038 posX: 0.05 0039 posY: inputTerminalPosY[index] 0040 type: "In" 0041 } 0042 } 0043 } 0044 0045 Repeater { 0046 id: outputTerminals 0047 model: 3 0048 delegate: outputTerminal 0049 Component { 0050 id: outputTerminal 0051 TerminalPoint { 0052 posX: 0.95 0053 posY: outputTerminalPosY[index] 0054 type: "Out" 0055 } 0056 } 0057 } 0058 0059 function updateOutput(wireVisited) { 0060 outputTerminals.itemAt(0).value = (inputTerminals.itemAt(0).value < inputTerminals.itemAt(1).value) 0061 outputTerminals.itemAt(1).value = (inputTerminals.itemAt(0).value == inputTerminals.itemAt(1).value) 0062 outputTerminals.itemAt(2).value = (inputTerminals.itemAt(0).value > inputTerminals.itemAt(1).value) 0063 0064 for(var i = 0 ; i < noOfOutputs ; ++i) { 0065 var terminal = outputTerminals.itemAt(i) 0066 for(var j = 0 ; j < terminal.wires.length ; ++j) 0067 terminal.wires[j].to.value = terminal.value 0068 } 0069 0070 var componentVisited = [] 0071 for(var i = 0 ; i < noOfOutputs ; ++i) { 0072 var terminal = outputTerminals.itemAt(i) 0073 for(var j = 0 ; j < terminal.wires.length ; ++j) { 0074 var wire = terminal.wires[j] 0075 var component = wire.to.parent 0076 if(componentVisited[component] != true && wireVisited[wire] != true) { 0077 componentVisited[component] = true 0078 wireVisited[wire] = true 0079 component.updateOutput(wireVisited) 0080 } 0081 } 0082 } 0083 } 0084 }