import QtQuick 2.0 Item { property int hitIndex: -1 property bool bStimulate: false property int responseTime: 10*1000 property bool bTest: true property int currentIndexTenHz: 0 property var imageFilesTenHz: [ "qrc:/DependFile/Source/brainTrain/upTest/upper_stretch_R01.png", "qrc:/DependFile/Source/brainTrain/upTest/upper_stretch_R02.png", "qrc:/DependFile/Source/brainTrain/upTest/upper_stretch_R03.png", "qrc:/DependFile/Source/brainTrain/upTest/upper_stretch_R04.png", "qrc:/DependFile/Source/brainTrain/upTest/upper_stretch_R05.png", "qrc:/DependFile/Source/brainTrain/upTest/upper_stretch_R06.png", "qrc:/DependFile/Source/brainTrain/upTest/upper_stretch_R07.png", "qrc:/DependFile/Source/brainTrain/upTest/upper_stretch_R08.png", "qrc:/DependFile/Source/brainTrain/upTest/upper_stretch_R09.png", "qrc:/DependFile/Source/brainTrain/upTest/upper_stretch_R10.png", "qrc:/DependFile/Source/brainTrain/upTest/upper_stretch_R11.png", "qrc:/DependFile/Source/brainTrain/upTest/upper_stretch_R12.png", "qrc:/DependFile/Source/brainTrain/upTest/upper_stretch_R13.png", "qrc:/DependFile/Source/brainTrain/upTest/upper_stretch_R14.png", "qrc:/DependFile/Source/brainTrain/upTest/upper_stretch_R15.png" ] property int currentIndexTwelevHz: 0 property var imageFilesTwelevHz: [ "qrc:/DependFile/Source/brainTrain/upTest2D/upper_stretch_R01.png", "qrc:/DependFile/Source/brainTrain/upTest2D/upper_stretch_R02.png", "qrc:/DependFile/Source/brainTrain/upTest2D/upper_stretch_R03.png", "qrc:/DependFile/Source/brainTrain/upTest2D/upper_stretch_R04.png", "qrc:/DependFile/Source/brainTrain/upTest2D/upper_stretch_R05.png", "qrc:/DependFile/Source/brainTrain/upTest2D/upper_stretch_R06.png", "qrc:/DependFile/Source/brainTrain/upTest2D/upper_stretch_R07.png" ] property int currentIndexFifteenHz: 0 property var imageFilesFifteenHz: [ "qrc:/DependFile/Source/brainTrain/upTest3/upper_stretch_R01.png", "qrc:/DependFile/Source/brainTrain/upTest3/upper_stretch_R02.png", "qrc:/DependFile/Source/brainTrain/upTest3/upper_stretch_R03.png", "qrc:/DependFile/Source/brainTrain/upTest3/upper_stretch_R04.png", "qrc:/DependFile/Source/brainTrain/upTest3/upper_stretch_R05.png", "qrc:/DependFile/Source/brainTrain/upTest3/upper_stretch_R06.png", "qrc:/DependFile/Source/brainTrain/upTest3/upper_stretch_R07.png", "qrc:/DependFile/Source/brainTrain/upTest3/upper_stretch_R08.png", "qrc:/DependFile/Source/brainTrain/upTest3/upper_stretch_R09.png", "qrc:/DependFile/Source/brainTrain/upTest3/upper_stretch_R10.png", "qrc:/DependFile/Source/brainTrain/upTest3/upper_stretch_R11.png", "qrc:/DependFile/Source/brainTrain/upTest3/upper_stretch_R12.png", "qrc:/DependFile/Source/brainTrain/upTest3/upper_stretch_R13.png", "qrc:/DependFile/Source/brainTrain/upTest3/upper_stretch_R14.png", "qrc:/DependFile/Source/brainTrain/upTest3/upper_stretch_R15.png", "qrc:/DependFile/Source/brainTrain/upTest3/upper_stretch_R16.png", ] function startStimulate() { animationTenHz.start(); animationTwelveHz.start(); animationFifteenHz.start(); } function stopStimulate() { if(animationTenHz.running) { animationTenHz.stop(); flashingImageTenHz.opacity = 1; } if(animationTwelveHz.running) { animationTwelveHz.stop(); flashingImageTwelveHz.opacity = 1; } if(animationFifteenHz.running) { animationFifteenHz.stop(); flashingImageFifteenHz.opacity = 1; } } function clearHit() { if(hitIndex === 0) { ssvepTenHzTimer.stop(); imageTenHz.source = imageFilesTenHz[0]; }else if(hitIndex === 1) { ssvepTwelveHzTimer.stop(); imageTwelveHz.source = imageFilesTwelevHz[0]; }else if(hitIndex === 2) { ssvepFifteenHzTimer.stop(); imageFifteenHz.source = imageFilesFifteenHz[0]; } if(hitTimer.running) { hitTimer.stop(); } hitIndex = -1; } Timer { id: hitTimer interval: responseTime; repeat: false onTriggered: { clearHit(); startStimulate(); } } function ssvepHit(index) { if(!bStimulate) { return; } if(hitIndex !== -1) { return; } if(index === 0) { ssvepTenHzTimer.start(); hitTimer.start(); }else if(index === 1) { ssvepTwelveHzTimer.start(); hitTimer.start(); }else if(index === 2) { ssvepFifteenHzTimer.start(); hitTimer.start(); }else { return; } hitIndex = index; } Rectangle{ anchors.top: parent.top anchors.topMargin: 42 anchors.left: parent.left anchors.leftMargin: 100 anchors.right: parent.right anchors.rightMargin: 100 anchors.bottom: parent.bottom anchors.bottomMargin: 178 Row { anchors.centerIn: parent spacing: 80 Rectangle { id:ssvepTenHz width: 520; height: 760; Rectangle { width: 520; height: 450; anchors.top: parent.top color:"#F9FAFD"; border.width: 1 border.color: "#ADCFDD" radius: 20; Rectangle { id:tenHzHit visible: ssvepTenHzTimer.running width: 100; height: 36; anchors.top: parent.top; anchors.topMargin: 40; anchors.right: parent.right; anchors.rightMargin: 40; color:Qt.rgba(52,196,163,0.1); border.width: 1; border.color: "#34C4A3"; radius: 18; Rectangle { width: 14; height: 14; anchors.top: parent.top; anchors.topMargin: 11; anchors.left: parent.left; anchors.leftMargin: 14; color:"#34C4A3"; border.width: 1; border.color: "#34C4A3"; radius: 7; } Text { text: qsTr("训练中") width: 72; height: 26; anchors.top: parent.top; anchors.topMargin: 4; anchors.left: parent.left; anchors.leftMargin: 32; color: "#10275A"; horizontalAlignment: Text.AlignLeft verticalAlignment: Text.AlignVCenter font.pixelSize: 18 font.family: "Medium" } } Text { text: qsTr("上肢训练") width: 144; height: 46; anchors.top: parent.top; anchors.topMargin: 34; anchors.left: parent.left; anchors.leftMargin: 40; color: "#10275A"; horizontalAlignment: Text.AlignLeft verticalAlignment: Text.AlignVCenter font.pixelSize: 36; font.family: "Medium"; font.bold: true; } Text { text: qsTr("Upper Limbs Training") width: 194; height: 28; anchors.top: parent.top; anchors.topMargin: 84; anchors.left: parent.left; anchors.leftMargin: 40; color: "#8586A9"; horizontalAlignment: Text.AlignLeft verticalAlignment: Text.AlignVCenter font.pixelSize: 20; font.family: "Medium"; } Image { id: flashingImageTenHz width: 238; height: 238; anchors.top: parent.top; anchors.topMargin: 162; anchors.left: parent.left; anchors.leftMargin: 141; source: "qrc:/DependFile/Source/brainTrain/vision_img_board.png" opacity: 1 SequentialAnimation on opacity { id: animationTenHz running: false; loops: Animation.Infinite NumberAnimation { to: 0; duration: 50 } NumberAnimation { to: 1; duration: 50 } } } } Item { width: 520; height: 280; anchors.bottom: parent.bottom Timer { id: ssvepTenHzTimer interval: 300; repeat: true onTriggered: { currentIndexTenHz = (currentIndexTenHz + 1) % imageFilesTenHz.length; imageTenHz.source = imageFilesTenHz[currentIndexTenHz]; } } Image { id: imageTenHz anchors.centerIn: parent source: imageFilesTenHz[0] } Image { visible: !ssvepTenHzTimer.running anchors.centerIn: parent source: "qrc:/DependFile/Source/brainTrain/vision_btn_start.png" z:1 } } } Rectangle { id:ssvepTwelveHz width: 520; height: 760; Rectangle { width: 520; height: 450; anchors.top: parent.top color:"#F9FAFD"; border.width: 1 border.color: "#ADCFDD" radius: 20; Rectangle { id:twelveHzHit visible: ssvepTwelveHzTimer.running width: 100; height: 36; anchors.top: parent.top; anchors.topMargin: 40; anchors.right: parent.right; anchors.rightMargin: 40; color:Qt.rgba(52,196,163,0.1); border.width: 1; border.color: "#34C4A3"; radius: 18; Rectangle { width: 14; height: 14; anchors.top: parent.top; anchors.topMargin: 11; anchors.left: parent.left; anchors.leftMargin: 14; color:"#34C4A3"; border.width: 1; border.color: "#34C4A3"; radius: 7; } Text { text: qsTr("训练中") width: 72; height: 26; anchors.top: parent.top; anchors.topMargin: 4; anchors.left: parent.left; anchors.leftMargin: 32; color: "#10275A"; horizontalAlignment: Text.AlignLeft verticalAlignment: Text.AlignVCenter font.pixelSize: 18 font.family: "Medium" } } Text { text: qsTr("下肢训练") width: 144; height: 46; anchors.top: parent.top; anchors.topMargin: 34; anchors.left: parent.left; anchors.leftMargin: 40; color: "#10275A"; horizontalAlignment: Text.AlignLeft verticalAlignment: Text.AlignVCenter font.pixelSize: 36; font.family: "Medium"; font.bold: true; } Text { text: qsTr("Lower Limbs Training") width: 194; height: 28; anchors.top: parent.top; anchors.topMargin: 84; anchors.left: parent.left; anchors.leftMargin: 40; color: "#8586A9"; horizontalAlignment: Text.AlignLeft verticalAlignment: Text.AlignVCenter font.pixelSize: 20; font.family: "Medium"; } Image { id: flashingImageTwelveHz width: 238; height: 238; anchors.top: parent.top; anchors.topMargin: 162; anchors.left: parent.left; anchors.leftMargin: 141; source: "qrc:/DependFile/Source/brainTrain/vision_img_board.png" opacity: 1 SequentialAnimation on opacity { id: animationTwelveHz running: false; loops: Animation.Infinite NumberAnimation { to: 0; duration: 42 } NumberAnimation { to: 1; duration: 42 } } } } Item { width: 520; height: 280; anchors.bottom: parent.bottom Timer { id: ssvepTwelveHzTimer interval: 30; repeat: true onTriggered: { currentIndexTwelevHz = (currentIndexTwelevHz + 1) % imageFilesTwelevHz.length; imageTwelveHz.source = imageFilesTwelevHz[currentIndexTwelevHz]; } } Image { id: imageTwelveHz anchors.centerIn: parent source: imageFilesTwelevHz[0] } Image { visible: !ssvepTwelveHzTimer.running anchors.centerIn: parent source: "qrc:/DependFile/Source/brainTrain/vision_btn_start.png" z:1 } } } Rectangle { id:ssvepFifteenHz width: 520; height: 760; Rectangle { width: 520; height: 450; anchors.top: parent.top color:"#F9FAFD"; border.width: 1 border.color: "#ADCFDD" radius: 20; Rectangle { id:fifteenHzHit visible: ssvepFifteenHzTimer.running width: 100; height: 36; anchors.top: parent.top; anchors.topMargin: 40; anchors.right: parent.right; anchors.rightMargin: 40; color:Qt.rgba(52,196,163,0.1); border.width: 1; border.color: "#34C4A3"; radius: 18; Rectangle { width: 14; height: 14; anchors.top: parent.top; anchors.topMargin: 11; anchors.left: parent.left; anchors.leftMargin: 14; color:"#34C4A3"; border.width: 1; border.color: "#34C4A3"; radius: 7; } Text { text: qsTr("训练中") width: 72; height: 26; anchors.top: parent.top; anchors.topMargin: 4; anchors.left: parent.left; anchors.leftMargin: 32; color: "#10275A"; horizontalAlignment: Text.AlignLeft verticalAlignment: Text.AlignVCenter font.pixelSize: 18 font.family: "Medium" } } Text { text: qsTr("上下肢训练") width: 144; height: 46; anchors.top: parent.top; anchors.topMargin: 34; anchors.left: parent.left; anchors.leftMargin: 40; color: "#10275A"; horizontalAlignment: Text.AlignLeft verticalAlignment: Text.AlignVCenter font.pixelSize: 36; font.family: "Medium"; font.bold: true; } Text { text: qsTr("Upper and Lower Limb") width: 194; height: 28; anchors.top: parent.top; anchors.topMargin: 84; anchors.left: parent.left; anchors.leftMargin: 40; color: "#8586A9"; horizontalAlignment: Text.AlignLeft verticalAlignment: Text.AlignVCenter font.pixelSize: 20; font.family: "Medium"; } Image { id: flashingImageFifteenHz width: 238; height: 238; anchors.top: parent.top; anchors.topMargin: 162; anchors.left: parent.left; anchors.leftMargin: 141; source: "qrc:/DependFile/Source/brainTrain/vision_img_board.png" opacity: 1 SequentialAnimation on opacity { id: animationFifteenHz running: false; loops: Animation.Infinite NumberAnimation { to: 0; duration: 33 } NumberAnimation { to: 1; duration: 33 } } } } Item { width: 520; height: 280; anchors.bottom: parent.bottom Timer { id: ssvepFifteenHzTimer interval: 30; repeat: true onTriggered: { currentIndexFifteenHz = (currentIndexFifteenHz + 1) % imageFilesFifteenHz.length; imageFifteenHz.source = imageFilesFifteenHz[currentIndexFifteenHz]; } } Image { id: imageFifteenHz anchors.centerIn: parent source: imageFilesFifteenHz[0] } Image { visible: !ssvepFifteenHzTimer.running anchors.centerIn: parent source: "qrc:/DependFile/Source/brainTrain/vision_btn_start.png" z:1 } } } } } Rectangle { width: 286; height: 88; anchors.bottom: parent.bottom; anchors.bottomMargin: 60; anchors.left: parent.left; anchors.leftMargin: 817; color:"#41B962"; border.width: 1 border.color: "#41B962" radius: 10; Text { id:stimulateText text: qsTr("开始训练") width: 144; height: 51; anchors.top: parent.top; anchors.topMargin: 18; anchors.left: parent.left; anchors.leftMargin: 71; color: "#FFFFFF"; horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter font.pixelSize: 36; font.family: "Medium"; } MouseArea { anchors.fill: parent onClicked: { if(bStimulate) { stimulateText.text = "继续"; stopStimulate(); clearHit(); }else { stimulateText.text = "暂停"; startStimulate(); } bStimulate = !bStimulate; } } } Rectangle { width: 86; height: 88; visible: bTest anchors.bottom: parent.bottom; anchors.bottomMargin: 60; anchors.left: parent.left; anchors.leftMargin: 1200; color:"#41B962"; border.width: 1 border.color: "#41B962" radius: 10; Text { text: qsTr("0") width: 86; height: 51; anchors.top: parent.top; anchors.topMargin: 18; anchors.left: parent.left; anchors.leftMargin: 0; color: "#FFFFFF"; horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter font.pixelSize: 36; font.family: "Medium"; } MouseArea { anchors.fill: parent onClicked: { ssvepHit(0); stopStimulate(); } } } Rectangle { width: 86; height: 88; visible: bTest anchors.bottom: parent.bottom; anchors.bottomMargin: 60; anchors.left: parent.left; anchors.leftMargin: 1300; color:"#41B962"; border.width: 1 border.color: "#41B962" radius: 10; Text { text: qsTr("1") width: 86; height: 51; anchors.top: parent.top; anchors.topMargin: 18; anchors.left: parent.left; anchors.leftMargin: 0; color: "#FFFFFF"; horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter font.pixelSize: 36; font.family: "Medium"; } MouseArea { anchors.fill: parent onClicked: { ssvepHit(1); stopStimulate(); } } } Rectangle { width: 86; height: 88; visible: bTest anchors.bottom: parent.bottom; anchors.bottomMargin: 60; anchors.left: parent.left; anchors.leftMargin: 1400; color:"#41B962"; border.width: 1 border.color: "#41B962" radius: 10; Text { text: qsTr("2") width: 86; height: 51; anchors.top: parent.top; anchors.topMargin: 18; anchors.left: parent.left; anchors.leftMargin: 0; color: "#FFFFFF"; horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter font.pixelSize: 36; font.family: "Medium"; } MouseArea { anchors.fill: parent onClicked: { ssvepHit(2); stopStimulate(); } } } }