Warning, /education/gcompris/src/activities/digital_electricity/components/BcdCounter.qml is written in an unsupported language. File is not indexed.

0001 /* GCompris - BcdCounter.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 import "../digital_electricity.js" as Activity
0015 
0016 ElectricalComponent {
0017     id: bcdTo7Segment
0018     terminalSize: 0.125
0019     noOfInputs: 1
0020     noOfOutputs: 4
0021     property var outputTerminalPosY: [0.125, 0.375, 0.625, 0.875]
0022     property int count: 0
0023     property int previousInput: 0
0024 
0025     information: qsTr("A BCD counter usually takes a signal generator as input. " +
0026                       "The output is a BCD number starting from 0 which is increased by one at each tick.")
0027 
0028     truthTable: []
0029     property var outputTable: [['0','0','0','0'],
0030                                    ['0','0','0','1'],
0031                                    ['0','0','1','0'],
0032                                    ['0','0','1','1'],
0033                                    ['0','1','0','0'],
0034                                    ['0','1','0','1'],
0035                                    ['0','1','1','0'],
0036                                    ['0','1','1','1'],
0037                                    ['1','0','0','0'],
0038                                    ['1','0','0','1']]
0039 
0040     property alias inputTerminals: inputTerminals
0041     property alias outputTerminals: outputTerminals
0042 
0043     Repeater {
0044         id: inputTerminals
0045         model: 1
0046         delegate: inputTerminal
0047         Component {
0048             id: inputTerminal
0049             TerminalPoint {
0050                 posX: 0.07
0051                 posY: 0.5
0052                 type: "In"
0053             }
0054         }
0055     }
0056 
0057     Repeater {
0058         id: outputTerminals
0059         model: 4
0060         delegate: outputTerminal
0061         Component {
0062             id: outputTerminal
0063             TerminalPoint {
0064                 posX: 0.93
0065                 posY: outputTerminalPosY[index]
0066                 type: "Out"
0067             }
0068         }
0069     }
0070 
0071     function updateOutput(wireVisited) {
0072         for(var i = 0 ; i < noOfOutputs ; ++i) {
0073             var terminal = outputTerminals.itemAt(i)
0074             terminal.value = outputTable[count][i]
0075             for(var j = 0 ; j < terminal.wires.length ; ++j)
0076                 terminal.wires[j].to.value = terminal.value
0077         }
0078 
0079         if(previousInput != inputTerminals.itemAt(0).value) {
0080             previousInput = inputTerminals.itemAt(0).value
0081             count = (count + 1) % 10;
0082 
0083             var componentVisited = []
0084             for(var i = 0 ; i < noOfOutputs ; ++i) {
0085                 var terminal = outputTerminals.itemAt(i)
0086                 for(var j = 0 ; j < terminal.wires.length ; ++j) {
0087                     var wire = terminal.wires[j]
0088                     var component = wire.to.parent
0089                     if(componentVisited[component] != true && wireVisited[wire] != true) {
0090                         componentVisited[component] = true
0091                         wireVisited[wire] = true
0092                         component.updateOutput(wireVisited)
0093                     }
0094                 }
0095             }
0096         }
0097     }
0098 }