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 }