1/* GCompris - BcdCounter.qml 2 * 3 * SPDX-FileCopyrightText: 2016 Pulkit Gupta <pulkitnsit@gmail.com> 4 * 5 * Authors: 6 * Bruno Coudoin <bruno.coudoin@gcompris.net> (GTK+ version) 7 * Pulkit Gupta <pulkitnsit@gmail.com> (Qt Quick port) 8 * 9 * SPDX-License-Identifier: GPL-3.0-or-later 10 */ 11import QtQuick 2.9 12import GCompris 1.0 13 14import "../digital_electricity.js" as Activity 15 16ElectricalComponent { 17 id: bcdTo7Segment 18 terminalSize: 0.125 19 noOfInputs: 1 20 noOfOutputs: 4 21 property var outputTerminalPosY: [0.125, 0.375, 0.625, 0.875] 22 property int count: 0 23 property int previousInput: 0 24 25 information: qsTr("A BCD counter usually takes a signal generator as input. " + 26 "The output is a BCD number starting from 0 which is increased by one at each tick.") 27 28 truthTable: [] 29 property var outputTable: [['0','0','0','0'], 30 ['0','0','0','1'], 31 ['0','0','1','0'], 32 ['0','0','1','1'], 33 ['0','1','0','0'], 34 ['0','1','0','1'], 35 ['0','1','1','0'], 36 ['0','1','1','1'], 37 ['1','0','0','0'], 38 ['1','0','0','1']] 39 40 property alias inputTerminals: inputTerminals 41 property alias outputTerminals: outputTerminals 42 43 Repeater { 44 id: inputTerminals 45 model: 1 46 delegate: inputTerminal 47 Component { 48 id: inputTerminal 49 TerminalPoint { 50 posX: 0.07 51 posY: 0.5 52 type: "In" 53 } 54 } 55 } 56 57 Repeater { 58 id: outputTerminals 59 model: 4 60 delegate: outputTerminal 61 Component { 62 id: outputTerminal 63 TerminalPoint { 64 posX: 0.93 65 posY: outputTerminalPosY[index] 66 type: "Out" 67 } 68 } 69 } 70 71 function updateOutput(wireVisited) { 72 for(var i = 0 ; i < noOfOutputs ; ++i) { 73 var terminal = outputTerminals.itemAt(i) 74 terminal.value = outputTable[count][i] 75 for(var j = 0 ; j < terminal.wires.length ; ++j) 76 terminal.wires[j].to.value = terminal.value 77 } 78 79 if(previousInput != inputTerminals.itemAt(0).value) { 80 previousInput = inputTerminals.itemAt(0).value 81 count = (count + 1) % 10; 82 83 var componentVisited = [] 84 for(var i = 0 ; i < noOfOutputs ; ++i) { 85 var terminal = outputTerminals.itemAt(i) 86 for(var j = 0 ; j < terminal.wires.length ; ++j) { 87 var wire = terminal.wires[j] 88 var component = wire.to.parent 89 if(componentVisited[component] != true && wireVisited[wire] != true) { 90 componentVisited[component] = true 91 wireVisited[wire] = true 92 component.updateOutput(wireVisited) 93 } 94 } 95 } 96 } 97 } 98} 99