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

0001 /* GCompris - SignalGenerator.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 import "../digital_electricity.js" as Activity
0014 import "../../../core"
0015 
0016 ElectricalComponent {
0017     id: signalGenerator
0018     terminalSize: 0.25
0019     noOfInputs: 0
0020     noOfOutputs: 1
0021 
0022     information: qsTr("A signal generator is used to generate alternating signals of 0 and 1. " +
0023     "The time between two changes can be modified by pressing the arrows on the generator.")
0024 
0025     property alias outputTerminals: outputTerminals
0026     property double period: 1
0027     property var periodFraction: ["1/4","1/2","1","2"]
0028     property int periodIndex: 2
0029 
0030     Repeater {
0031         id: outputTerminals
0032         model: 1
0033         delegate: outputTerminal
0034         Component {
0035             id: outputTerminal
0036             TerminalPoint {
0037                 posX: 0.94
0038                 posY: 0.5
0039                 value: 0
0040                 type: "Out"
0041             }
0042         }
0043     }
0044 
0045     function updateOutput(wireVisited) {
0046         var terminal = outputTerminals.itemAt(0)
0047         terminal.value = terminal.value == 1 ? 0 : 1
0048         for(var i = 0 ; i < terminal.wires.length ; ++i)
0049             terminal.wires[i].to.value = terminal.value
0050 
0051         var componentVisited = []
0052         for(var i = 0 ; i < terminal.wires.length ; ++i) {
0053             var wire = terminal.wires[i]
0054             var component = wire.to.parent
0055             if(componentVisited[component] != true && wireVisited[wire] != true) {
0056                 componentVisited[component] = true
0057                 wireVisited[wire] = true
0058                 component.updateOutput(wireVisited)
0059             }
0060         }
0061     }
0062 
0063     Timer {
0064         id: timer
0065         interval: 1000 * signalGenerator.period
0066         running: true
0067         repeat: true
0068         onTriggered: Activity.updateComponent(signalGenerator.index)
0069     }
0070 
0071     Image {
0072         source: Activity.url + "arrowUp.svg"
0073         height: 0.437 * parent.height
0074         width: 0.208 * parent.width
0075         sourceSize.height: height
0076         sourceSize.width: width
0077         property double posX: 0.6
0078         property double posY: 0.28
0079         x: (parent.width - parent.paintedWidth) / 2 + posX * parent.paintedWidth - width / 2
0080         y: (parent.height - parent.paintedHeight) / 2 + posY * parent.paintedHeight - height / 2
0081         fillMode: Image.PreserveAspectFit
0082         antialiasing: true
0083         opacity: 0
0084         MouseArea {
0085             anchors.fill: parent
0086             anchors.centerIn: parent
0087             enabled: signalGenerator.period != 2
0088             onPressed: {
0089                 parent.opacity = 1
0090                 signalGenerator.period *= 2
0091                 periodIndex++
0092                 timer.restart()
0093                 outputTerminals.itemAt(0).value = 1
0094                 Activity.updateComponent(signalGenerator.index)
0095             }
0096             onReleased: {
0097                 parent.opacity = 0
0098             }
0099         }
0100     }
0101 
0102     Image {
0103         source: Activity.url + "arrowDown.svg"
0104         height: 0.437 * parent.height
0105         width: 0.208 * parent.width
0106         sourceSize.height: height
0107         sourceSize.width: width
0108         property double posX: 0.6
0109         property double posY: 0.72
0110         x: (parent.width - parent.paintedWidth) / 2 + posX * parent.paintedWidth - width / 2
0111         y: (parent.height - parent.paintedHeight) / 2 + posY * parent.paintedHeight - height / 2
0112         fillMode: Image.PreserveAspectFit
0113         antialiasing: true
0114         opacity: 0
0115         MouseArea {
0116             anchors.fill: parent
0117             anchors.centerIn: parent
0118             enabled: signalGenerator.period != 0.25
0119             onPressed: {
0120                 parent.opacity = 1
0121                 signalGenerator.period /= 2
0122                 periodIndex--
0123                 timer.restart()
0124                 outputTerminals.itemAt(0).value = 1
0125                 Activity.updateComponent(signalGenerator.index)
0126             }
0127             onReleased: {
0128                 parent.opacity = 0
0129             }
0130         }
0131     }
0132 
0133     Rectangle {
0134         height: 0.625 * parent.height
0135         width: 0.35 * parent.width
0136         color: "#00000000"
0137         property double posX: 0.25
0138         property double posY: 0.5
0139         x: (parent.width - parent.paintedWidth) / 2 + posX * parent.paintedWidth - width / 2
0140         y: (parent.height - parent.paintedHeight) / 2 + posY * parent.paintedHeight - height / 2
0141         GCText {
0142             id: value
0143             anchors.centerIn: parent
0144             fontSizeMode: Text.Fit
0145             minimumPointSize: 6
0146             font.pointSize: 32
0147             color: "#3f6f71"
0148             horizontalAlignment: Text.AlignHCenter
0149             verticalAlignment: Text.AlignVCenter
0150             height: parent.height - 10
0151             width: parent.width - 10
0152             text: qsTr("%1 s").arg(signalGenerator.periodFraction[periodIndex])
0153         }
0154     }
0155 }