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