2018-08-12 20:51:57 +02:00
/ *
Speed Climbing Stopwatch - Simple Stopwatch for Climbers
Copyright ( C ) 2018 Itsblue Development - Dorian Zeder
This program is free software: you can redistribute it and / or modify
it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation , version 3 of the License .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU Affero General Public License for more details .
You should have received a copy of the GNU Affero General Public License
along with this program . If not , see < https: //www.gnu.org/licenses/>.
* /
2018-07-17 19:17:25 +02:00
import QtQuick 2.9
import QtMultimedia 5.8
import QtQuick . Window 2.2
import QtQuick . Controls 2.2
2018-08-28 23:03:35 +02:00
import "."
import "./components"
import "./styles"
2018-07-22 21:08:11 +02:00
//import QtQuick.Layouts 1.11
2018-07-22 16:47:55 +02:00
import com . itsblue . speedclimbingstopwatch 1.0
2018-07-17 19:17:25 +02:00
Window {
visible: true
width: 540
height: 960
2018-07-18 14:06:04 +02:00
title: qsTr ( "Speedclimbing stw" )
2018-07-17 19:17:25 +02:00
property date currentTime: new Date ( )
property int millis: 0
2018-08-28 23:03:35 +02:00
onBeforeRendering: {
StyleSettings . refreshTheme ( )
}
2018-07-17 19:17:25 +02:00
Page {
id:root
anchors.fill: parent
property double startTime: 0
property double stoppedTime: 0
2018-07-26 14:54:11 +02:00
property double currTime
2018-07-17 19:17:25 +02:00
2018-09-17 23:06:34 +02:00
property double buzzer_offset: buzzerConn . offset
property double last_button_pressed: buzzerConn . lastTriggered
2018-07-25 00:32:20 +02:00
2018-08-14 17:07:42 +02:00
property var last_run : {
2018-08-28 23:03:35 +02:00
'stop_type' : "" , 'time' : 0 , 'react_time' : 0
2018-08-18 21:27:18 +02:00
} ;
2018-07-25 00:32:20 +02:00
2018-08-28 23:03:35 +02:00
//array that contains all connections an their atatus
property var connections: {
'buzzer' : buzzerConn . status ,
2018-09-23 17:54:20 +02:00
'startpad' : startpadConn . status ,
'baseStation' : baseConn . status
2018-08-28 23:03:35 +02:00
}
2018-08-14 17:07:42 +02:00
//set default state to IDLE
2018-07-22 16:47:55 +02:00
state: "IDLE"
2018-08-28 23:03:35 +02:00
Rectangle {
id: backgroundRect
anchors.fill: parent
color: StyleSettings . backgroundColor
2018-07-25 00:32:20 +02:00
}
2018-10-04 18:35:29 +02:00
Item {
id: connections
2018-09-17 23:06:34 +02:00
2018-10-04 18:35:29 +02:00
BuzzerConn {
id: buzzerConn
ipAdress: "192.168.4.10"
property var status: { 'status' : buzzerConn . state , 'progress' : buzzerConn . progress }
onLastTriggeredChanged: {
timer_1 . handleToppad ( )
}
2018-09-17 23:06:34 +02:00
}
2018-10-04 18:35:29 +02:00
Timer {
id: buzzerRefreshTimer
running: buzzerConn . state === "connected"
interval: root . state === "RUNNING" ? 1 : 1000
repeat: false
onTriggered: {
buzzerConn . refresh ( )
this . start ( )
}
2018-09-17 23:06:34 +02:00
}
2018-10-04 18:35:29 +02:00
StartpadConn {
id: startpadConn
ipAdress: "192.168.4.11"
property var status: { 'status' : startpadConn . state , 'progress' : startpadConn . progress }
property string color: root . state === "RUNNING" ? "SET_LED_RUNNING" : "SET_LED_STARTING"
onColorChanged: {
appendCommand ( color )
2018-09-17 23:06:34 +02:00
}
2018-10-04 18:35:29 +02:00
onLastTriggeredChanged: {
timer_1 . handleStartpad ( )
}
2018-09-17 23:06:34 +02:00
}
2018-10-04 18:35:29 +02:00
Timer {
id: startpadRefreshTimer
running: startpadConn . state === "connected"
interval: root . state === "RUNNING" || root . state === "STARTING" ? 1 : 1000
repeat: false
onTriggered: {
startpadConn . refresh ( )
this . start ( )
2018-09-23 17:54:20 +02:00
}
2018-09-09 20:18:00 +02:00
}
2018-10-04 18:35:29 +02:00
BaseStationConn {
id: baseConn
ipAdress: "localhost" //"raspberrypi.local"
property var status: { 'status' : baseConn . state , 'progress' : baseConn . progress , 'connections' : baseConn . connections }
function getTime ( type ) {
var time = parseInt ( sendCommand ( "GET_CURRTIME" ) )
if ( type === "readable" ) {
return ( time / 1000 ) . toFixed ( 3 )
2018-09-23 19:31:10 +02:00
}
2018-10-04 18:35:29 +02:00
else if ( type === "raw" ) {
return ( time )
2018-09-23 17:54:20 +02:00
}
}
2018-10-04 18:35:29 +02:00
}
Timer {
id: baseRefreshTimer
running: baseConn . state === "connected"
repeat: false
interval: 1
onTriggered: {
switch ( root . state ) {
case "RUNNING" :
var baseReactTime = parseInt ( baseConn . sendCommand ( "GET_REACTTIME" ) )
console . log ( baseReactTime )
if ( baseReactTime !== 0 ) {
root . last_run . react_time = baseReactTime
}
timer_1 . text = baseConn . getTime ( "readable" ) + " sec"
if ( baseConn . sendCommand ( "GET_TIMER_STATE" ) === "STOPPED" ) {
root . stop ( "manual" )
}
break
case "STARTING" :
var baseReactTime = parseInt ( baseConn . sendCommand ( "GET_REACTTIME" ) )
if ( baseReactTime !== 0 ) {
root . last_run . react_time = baseReactTime
}
var baseNextAction = baseConn . sendCommand ( "GET_NEXT_ACTION" )
if ( baseNextAction === "at_marks" ) {
timer_1 . text = qsTr ( "at your\nmarks" )
var baseNextActionDelay = parseFloat ( baseConn . sendCommand ( "GET_NEXT_ACTION_DELAY_PROG" ) )
prog . progress = baseNextActionDelay * 100
}
else if ( baseNextAction === "ready" ) {
timer_1 . text = qsTr ( "ready" )
var baseNextActionDelay = parseFloat ( baseConn . sendCommand ( "GET_NEXT_ACTION_DELAY_PROG" ) )
prog . progress = baseNextActionDelay * 100
}
else if ( baseNextAction === "start" ) {
timer_1 . text = "0.000 sec"
}
var baseState = baseConn . sendCommand ( "GET_TIMER_STATE" )
console . log ( baseState )
if ( baseState === "RUNNING" ) {
timer_1 . start ( 1 )
root . state = "RUNNING" ;
}
else if ( baseState === "STOPPED" ) {
var baseReactTime = parseInt ( baseConn . sendCommand ( "GET_REACTTIME" ) )
if ( baseReactTime < 0 ) {
root . stop ( "false" )
}
else {
root . stop ( "cancel" )
}
root . state = "STOPPED"
}
break
2018-09-23 19:31:10 +02:00
}
2018-10-04 18:35:29 +02:00
start ( )
2018-08-29 18:33:39 +02:00
}
}
2018-09-23 17:54:20 +02:00
2018-08-28 23:03:35 +02:00
}
2018-10-04 18:35:29 +02:00
2018-07-28 21:17:41 +02:00
Timer {
id: next_actionTimer
property string action
property double started_at
running: false
repeat: false
onRunningChanged: {
if ( ! running ) {
started_at = 0
if ( action == "NONE" ) {
2018-10-04 18:35:29 +02:00
timer_1 . text = "0.000 sec"
2018-07-28 21:17:41 +02:00
}
return
}
if ( action === "at_marks" ) {
started_at = new Date ( ) . getTime ( )
2018-10-04 18:35:29 +02:00
timer_1 . text = "at your\nmarks"
2018-07-28 21:17:41 +02:00
}
else if ( action === "ready" ) {
started_at = new Date ( ) . getTime ( )
2018-10-04 18:35:29 +02:00
timer_1 . text = "ready"
2018-07-28 21:17:41 +02:00
}
}
onTriggered: {
if ( action === "at_marks" ) {
at_marksSound . play ( )
}
else if ( action === "ready" ) {
action = "NONE"
readySound . play ( )
}
}
}
2018-10-04 18:35:29 +02:00
Item {
id: sounds
SoundEffect {
id: at_marksSound
source: "qrc:/sounds/at_marks_1.wav"
onPlayingChanged: {
if ( ! playing && root . state === "STARTING" ) {
if ( _cppAppSettings . loadSetting ( "ready_en" ) === "true" ) {
next_actionTimer . action = "ready"
next_actionTimer . interval = _cppAppSettings . loadSetting ( "ready_delay" ) > 0 ? _cppAppSettings . loadSetting ( "ready_delay" ) : 1
next_actionTimer . start ( )
}
else {
startSound . play ( )
}
2018-07-28 21:17:41 +02:00
}
}
}
2018-10-04 18:35:29 +02:00
SoundEffect {
id: readySound
source: "qrc:/sounds/ready_1.wav"
onPlayingChanged: {
if ( ! playing && root . state === "STARTING" ) {
2018-09-09 20:18:00 +02:00
2018-10-04 18:35:29 +02:00
startSound . play ( )
}
2018-07-28 21:17:41 +02:00
}
}
2018-10-04 18:35:29 +02:00
SoundEffect {
//start sound
id: startSound
source: "qrc:/sounds/OFFICAL_IFSC_STARTIGNAL.wav"
2018-07-22 16:47:55 +02:00
2018-10-04 18:35:29 +02:00
onPlayingChanged: {
if ( ! playing && root . state === "STARTING" ) {
root . state = "RUNNING"
}
else if ( playing ) {
console . log ( "start sound started" )
2018-08-02 18:10:08 +02:00
2018-10-04 18:35:29 +02:00
timer_1 . start ( 3100 )
}
2018-09-09 20:18:00 +02:00
}
2018-10-04 18:35:29 +02:00
}
2018-07-22 16:47:55 +02:00
2018-10-04 18:35:29 +02:00
SoundEffect {
//false-start sound
id: falseSound
source: "qrc:/sounds/false.wav"
}
2018-09-17 23:06:34 +02:00
}
2018-07-22 16:47:55 +02:00
/ * - - - - - - - - - - - - - - - - - - - - - - - -
Timer text an upper line
-- -- -- -- -- -- -- -- -- -- -- -- * /
2018-07-17 19:17:25 +02:00
Item {
id: time_container
anchors {
top: parent . top
left: parent . left
2018-07-22 16:47:55 +02:00
right: root . landscape ( ) ? startButt.left: parent . right
bottom: root . landscape ( ) ? parent.bottom: startButt . top
bottomMargin: root . landscape ( ) ? undefined: parent . height * 0.1
rightMargin: root . landscape ( ) ? parent . width * 0.05 : 0
2018-07-17 19:17:25 +02:00
}
2018-08-28 23:03:35 +02:00
Rectangle {
anchors.fill: parent
color: StyleSettings . menuColor
}
2018-10-04 18:35:29 +02:00
SpeedTimer {
id: timer_1
2018-07-17 19:17:25 +02:00
anchors.centerIn: parent
2018-07-22 16:47:55 +02:00
elide: "ElideRight"
2018-08-28 23:03:35 +02:00
color: StyleSettings . textColor
2018-10-04 18:35:29 +02:00
toppadConn: buzzerConn
baseConn: baseConn
startpadConn: startpadConn
text: "0.000 sec"
onStopped: {
root . state = "STOPPED"
}
onStartCanceled: {
root . state = "STOPPED"
next_actionTimer . stop ( )
at_marksSound . stop ( )
readySound . stop ( )
startSound . stop ( )
if ( falseStart && baseConn . state !== "connected" ) {
falseSound . play ( )
2018-08-14 17:07:42 +02:00
}
}
2018-07-17 19:17:25 +02:00
}
2018-08-29 18:33:39 +02:00
Label {
id: react_time
property int rtime: root . last_run . react_time
text: qsTr ( "reaction time (ms): " ) + Math . round ( rtime )
opacity: ( root . state === "RUNNING" || root . sate === "STARTING" || root . state === "STOPPED" ) && rtime !== 0 ? 1 : 0
color: StyleSettings . textColor
anchors {
horizontalCenter: parent . horizontalCenter
2018-10-04 18:35:29 +02:00
top: timer_1 . bottom
2018-08-29 18:33:39 +02:00
topMargin: parent . height * 0.1
}
Timer {
running: root . state === "RUNNING" || root . sate === "STARTING" || root . state === "STOPPED"
repeat: true
interval: 1
onTriggered: {
react_time . rtime = root . last_run . react_time
}
}
}
2018-07-17 19:17:25 +02:00
}
2018-08-28 23:03:35 +02:00
ConnectionIcon {
2018-08-02 18:10:08 +02:00
id: buzzerLogo
source: "qrc:/graphics/icons/buzzer_black.png"
2018-08-28 23:03:35 +02:00
status: root . connections [ "buzzer" ] . status
2018-08-02 12:50:55 +02:00
anchors {
top: parent . top
topMargin: 10
left: parent . left
leftMargin: 10
}
2018-08-28 23:03:35 +02:00
height: root . landscape ( ) ? root . height * 0.1 : root . width * 0.1
}
ConnectionIcon {
id: startpadLogo
source: "qrc:/graphics/icons/startpad_black.png"
status: root . connections [ "startpad" ] . status
anchors {
top: parent . top
topMargin: 10
left: parent . left
leftMargin: 5 + buzzerLogo . width
}
height: root . landscape ( ) ? root . height * 0.1 : root . width * 0.1
2018-08-02 12:50:55 +02:00
}
Rectangle {
id: upper_line
2018-07-22 16:47:55 +02:00
width: root . landscape ( ) ? 1 : parent . width
height: root . landscape ( ) ? parent.height: 1
2018-08-28 23:03:35 +02:00
color: StyleSettings . lineColor
2018-07-22 16:47:55 +02:00
anchors.left: root . landscape ( ) ? time_container.right: parent . left
anchors.top: root . landscape ( ) ? parent.top: time_container . bottom
anchors.bottom: root . landscape ( ) ? parent.bottom: undefined
2018-07-17 19:17:25 +02:00
}
2018-07-22 16:47:55 +02:00
/ * - - - - - - - - - - - - - - - - - - - - - -
2018-08-14 17:07:42 +02:00
Start / Stop / Reset button
2018-07-22 16:47:55 +02:00
-- -- -- -- -- -- -- -- -- -- -- * /
2018-07-25 00:32:20 +02:00
Button {
id : startButt
2018-07-17 19:17:25 +02:00
2018-08-14 17:07:42 +02:00
text: qsTr ( "start" )
2018-07-22 16:47:55 +02:00
property int size: root . landscape ( ) ? parent . width * 0.5 : parent . height * 0.5
2018-07-17 19:17:25 +02:00
anchors {
bottom: parent . bottom
2018-07-25 00:32:20 +02:00
bottomMargin: root . height * 0.5 - height * 0.5
2018-07-22 16:47:55 +02:00
right: parent . right
2018-07-25 00:32:20 +02:00
rightMargin: root . width * 0.5 - width * 0.5
}
contentItem: Text {
//make text disappear
2018-07-17 19:17:25 +02:00
}
2018-07-22 16:47:55 +02:00
height: root . landscape ( ) ? size > parent . height * 0.9 ? parent . height * 0.9 : size : size
width: root . landscape ( ) ? size : size > parent . width * 0.9 ? parent . width * 0.9 : size
2018-07-17 19:17:25 +02:00
2018-07-25 00:32:20 +02:00
background: Rectangle {
2018-08-28 23:03:35 +02:00
color: parent . pressed ? StyleSettings.buttonPressedColor: StyleSettings . buttonColor
border.color: StyleSettings . buttonBorderColor
2018-07-25 00:32:20 +02:00
border.width: 1
radius: width / 2
Label {
id: startButt_text
text: startButt . text
anchors.centerIn: parent
font.pixelSize: parent . height * 0.16
font.family: "Helvetica"
2018-08-28 23:03:35 +02:00
color: enabled ? StyleSettings.textColor: StyleSettings . disabledTextColor
2018-07-25 00:32:20 +02:00
}
2018-07-17 19:17:25 +02:00
}
2018-07-22 16:47:55 +02:00
2018-08-14 17:07:42 +02:00
Behavior on text {
//animate a text change
enabled: true
FadeAnimation {
target: startButt_text
}
}
2018-07-25 00:32:20 +02:00
onClicked: {
switch ( root . state ) {
case "IDLE" :
2018-08-14 17:07:42 +02:00
root . start ( )
2018-07-25 00:32:20 +02:00
break
case "RUNNING" :
2018-08-14 17:07:42 +02:00
root . stop ( "manual" )
2018-07-25 00:32:20 +02:00
break
case "STOPPED" :
2018-08-14 17:07:42 +02:00
root . reset ( )
2018-07-25 00:32:20 +02:00
break
2018-07-22 16:47:55 +02:00
}
}
2018-07-28 21:17:41 +02:00
}
ProgressCircle {
id: prog
anchors.fill: startButt
2018-10-04 18:35:29 +02:00
opacity: baseConn . state !== "connected" ?
next_actionTimer . started_at > 0 ? 1 : 0
: progress > 0 ? 1 : 0
2018-07-28 21:17:41 +02:00
lineWidth: 5
2018-10-04 18:35:29 +02:00
property int progress: 0
2018-07-28 21:17:41 +02:00
arcBegin: 0
2018-10-04 18:35:29 +02:00
arcEnd: baseConn . state !== "connected" ? 360 * ( ( next_actionTimer . interval - ( new Date ( ) . getTime ( ) - next_actionTimer . started_at ) ) / next_actionTimer . interval )
: ( 360 / 100 ) * progress
2018-07-28 21:17:41 +02:00
colorCircle: "grey"
2018-10-04 18:35:29 +02:00
animationDuration: baseConn . state === "connected" ? 150 : 0
2018-07-28 21:17:41 +02:00
Timer {
id: prog_refresh
2018-10-04 18:35:29 +02:00
running: parent . opacity === 1 && baseConn . state !== "connected"
2018-07-28 21:17:41 +02:00
interval: 1
repeat: true
onTriggered: {
prog . arcEnd = 360 * ( ( next_actionTimer . interval - ( new Date ( ) . getTime ( ) - next_actionTimer . started_at ) ) / next_actionTimer . interval )
}
}
2018-07-22 16:47:55 +02:00
}
/ * - - - - - - - - - - - - - - - - - - - - - -
Cancel button
-- -- -- -- -- -- -- -- -- -- -- * /
2018-07-25 00:32:20 +02:00
RoundButton {
2018-07-22 16:47:55 +02:00
id: cancelButt
2018-08-14 17:07:42 +02:00
text: qsTr ( "cancel" )
2018-07-22 16:47:55 +02:00
anchors {
right: startButt . right
bottom: startButt . bottom
}
2018-07-25 00:32:20 +02:00
contentItem: Text {
//make text disappear
}
2018-07-22 16:47:55 +02:00
height: startButt . height * 0.3
scale: 0
width: height
2018-07-28 21:17:41 +02:00
enabled: root . state === "STARTING"
2018-07-22 16:47:55 +02:00
2018-07-25 00:32:20 +02:00
onClicked: {
2018-10-04 18:35:29 +02:00
root . stop ( "cancel" )
2018-07-25 00:32:20 +02:00
}
2018-07-22 16:47:55 +02:00
Behavior on scale {
PropertyAnimation {
duration: 200
}
}
2018-07-25 00:32:20 +02:00
background: Rectangle {
2018-08-28 23:03:35 +02:00
color: parent . pressed ? StyleSettings.buttonPressedColor: StyleSettings . buttonColor
border.color: StyleSettings . buttonBorderColor
2018-07-25 00:32:20 +02:00
border.width: 1
radius: width / 2
Label {
id: cancelButt_text
text: cancelButt . text
anchors.centerIn: parent
font.pixelSize: parent . height * 0.16
font.family: "Helvetica"
2018-08-28 23:03:35 +02:00
color: StyleSettings . textColor
2018-07-25 00:32:20 +02:00
}
}
}
/ * - - - - - -
Popups
-- -- -- * /
SettingsDialog {
2018-08-02 12:50:55 +02:00
id: settingsDialog
2018-08-28 23:03:35 +02:00
connections: root . connections
2018-08-18 21:27:18 +02:00
onConnectRequested: {
switch ( type ) {
case "buzzer" :
2018-08-28 23:03:35 +02:00
buzzerConn . connect ( )
break
case "startpad" :
startpadConn . connect ( )
2018-08-18 21:27:18 +02:00
break
2018-10-04 18:35:29 +02:00
case "baseStation" :
baseConn . connectToHost ( )
break
2018-08-18 21:27:18 +02:00
}
}
2018-07-22 16:47:55 +02:00
}
2018-08-28 23:03:35 +02:00
// ProfilesDialog {
// id: profilesDialog
// }
2018-07-25 00:32:20 +02:00
2018-07-22 16:47:55 +02:00
/ * - - - - - - - - - - - - - - - - - - -
lower line and menu
-- -- -- -- -- -- -- -- -- - * /
Rectangle {
width: root . landscape ( ) ? 1 : parent . width
height: root . landscape ( ) ? parent.height: 1
2018-08-28 23:03:35 +02:00
color: StyleSettings . lineColor
2018-07-22 16:47:55 +02:00
anchors.right: root . landscape ( ) ? menu_container.left: parent . right
anchors.bottom: root . landscape ( ) ? parent.bottom: menu_container . top
anchors.top: root . landscape ( ) ? parent.top: undefined
}
Item {
id: menu_container
anchors {
bottom: parent . bottom
right: parent . right
left: root . landscape ( ) ? startButt.right: parent . left
top: root . landscape ( ) ? parent.top: startButt . bottom
topMargin: root . landscape ( ) ? undefined: parent . height * 0.1
leftMargin: root . landscape ( ) ? parent . width * 0.05 : 0
}
2018-08-28 23:03:35 +02:00
Rectangle {
anchors.fill: parent
color: StyleSettings . menuColor
}
2018-07-25 00:32:20 +02:00
RoundButton {
2018-07-22 16:47:55 +02:00
id: settingsButt
anchors {
//center
verticalCenter: root . landscape ( ) ? undefined: parent . verticalCenter
horizontalCenter: root . landscape ( ) ? parent.horizontalCenter: undefined
//set anchors
left: root . landscape ( ) ? undefined: parent . left
top: root . landscape ( ) ? parent.top: undefined
//align in landscape mode
2018-08-11 23:54:34 +02:00
//for two buttons: topMargin: root.landscape() ? (parent.height - (height * 2)) / 3:undefined
topMargin: root . landscape ( ) ? ( parent . height * 0.5 - ( height * 0.5 ) ) : undefined
2018-07-22 16:47:55 +02:00
//align in portrait mode
2018-08-11 23:54:34 +02:00
//for two buttons: leftMargin: root.landscape() ? undefined:(parent.width - width * 2) / 3
leftMargin: root . landscape ( ) ? undefined: ( parent . width * 0.5 - width * 0.5 )
2018-07-22 16:47:55 +02:00
}
2018-07-25 00:32:20 +02:00
2018-07-22 16:47:55 +02:00
height: root . landscape ( ) ? parent . width * 0.7 : parent . height * 0.7
width: height
2018-07-25 00:32:20 +02:00
onClicked: {
2018-08-28 23:03:35 +02:00
settingsDialog . open ( )
2018-07-22 16:47:55 +02:00
}
2018-07-25 00:32:20 +02:00
background: Rectangle {
2018-08-28 23:03:35 +02:00
color: parent . pressed ? StyleSettings.buttonPressedColor: StyleSettings . buttonColor
border.color: StyleSettings . buttonBorderColor
2018-07-25 00:32:20 +02:00
border.width: 1
radius: width / 2
Image {
id: settungsButt_Image
2018-08-28 23:03:35 +02:00
source: StyleSettings . settIcon
2018-07-25 00:32:20 +02:00
anchors.centerIn: parent
height: parent . height * 0.7
width: parent . width * 0.7
mipmap: true
2018-07-22 16:47:55 +02:00
}
}
}
2018-07-25 00:32:20 +02:00
2018-08-11 23:54:34 +02:00
/ *
2018-07-25 00:32:20 +02:00
RoundButton {
2018-07-22 16:47:55 +02:00
id: profilesButt
anchors {
verticalCenter: root . landscape ( ) ? undefined: parent . verticalCenter
horizontalCenter: root . landscape ( ) ? parent.horizontalCenter: undefined
left: root . landscape ( ) ? undefined: settingsButt . right
top: root . landscape ( ) ? settingsButt.bottom: undefined
topMargin: root . landscape ( ) ? ( parent . height - ( height * 2 ) ) / 3 : undefined
leftMargin: root . landscape ( ) ? undefined: ( parent . width - width * 2 ) / 3
}
2018-07-25 00:32:20 +02:00
height: root . landscape ( ) ? parent . width * 0.7 : parent . height * 0.7
2018-07-22 16:47:55 +02:00
width: height
2018-07-25 00:32:20 +02:00
onPressedChanged: {
if ( pressed ) {
background . color = "lightgrey"
}
else {
background . color = "white"
}
2018-07-22 16:47:55 +02:00
}
2018-07-25 00:32:20 +02:00
onClicked: {
2018-08-02 12:50:55 +02:00
profilesDialog . open ( )
2018-07-22 16:47:55 +02:00
}
2018-07-17 19:17:25 +02:00
2018-07-25 00:32:20 +02:00
background: Rectangle {
color: "white"
border.color: "grey"
border.width: 1
radius: width / 2
Image {
id: profilesButt_Image
source: "qrc:/graphics/icons/user.png"
anchors.centerIn: parent
height: parent . height * 0.5
width: parent . width * 0.5
mipmap: true
2018-07-22 16:47:55 +02:00
}
2018-07-17 19:17:25 +02:00
}
}
2018-08-11 23:54:34 +02:00
* /
2018-07-17 19:17:25 +02:00
}
2018-07-22 16:47:55 +02:00
/ * - - - - - - - - - - - - - - - - - - - - - -
Timer states
-- -- -- -- -- -- -- -- -- -- -- * /
2018-07-17 19:17:25 +02:00
states: [
2018-07-22 16:47:55 +02:00
State {
name: "IDLE"
//state for the start page
2018-10-04 18:35:29 +02:00
PropertyChanges { target: timer_1 ; pixelSize: root . landscape ( ) ? parent . width * 0.1 : parent . height * 0.3 ; scale: 1 }
2018-07-22 16:47:55 +02:00
PropertyChanges {
target: time_container ;
anchors.bottomMargin: root . landscape ( ) ? undefined: parent . height * 0.1 ;
anchors.rightMargin: root . landscape ( ) ? parent . height * 0.05 : 0
}
PropertyChanges {
target: startButt ;
2018-08-14 17:07:42 +02:00
enabled: true ; text: qsTr ( "start" ) ;
2018-07-22 16:47:55 +02:00
size: root . landscape ( ) ? parent . width * 0.5 : parent . height * 0.5
anchors.bottomMargin: parent . height * 0.5 - startButt . height * 0.5
anchors.rightMargin: parent . width * 0.5 - startButt . width * 0.5
}
} ,
State {
name: "STARTING"
//state for the start sequence
2018-08-14 17:07:42 +02:00
PropertyChanges { target: startButt ; enabled: false ; text: qsTr ( "starting..." ) ;
2018-07-29 11:23:32 +02:00
anchors.rightMargin: root . landscape ( ) ? parent . width * 0.05 : parent . width * 0.5 - startButt . width * 0.5 //put the button more to the right to hide the menu (only in landscape mode)
anchors.bottomMargin: root . landscape ( ) ? parent . height * 0.5 - startButt . height * 0.5 : parent . height * 0.1 //put the button lower to hide the menu (only in portrait mode)
2018-07-22 16:47:55 +02:00
}
2018-10-04 18:35:29 +02:00
PropertyChanges { target: timer_1 ; pixelSize: root . landscape ( ) ? parent . width * 0.2 : parent . height * 0.3 ; scale: 1 }
2018-07-22 16:47:55 +02:00
PropertyChanges { target: cancelButt ; scale: 1 }
PropertyChanges { target: menu_container ; }
} ,
State {
name: "RUNNING"
//state when the timer is running
2018-10-04 18:35:29 +02:00
PropertyChanges { target: timer_1 ; pixelSize: root . landscape ( ) ? parent . width * 0.2 : parent . height * 0.3 ; scale: 1 }
2018-07-22 16:47:55 +02:00
PropertyChanges { target: startButt ; enabled: true ;
text: "stop"
2018-07-29 11:23:32 +02:00
anchors.rightMargin: root . landscape ( ) ? parent . width * 0.05 : parent . width * 0.5 - startButt . width * 0.5 //put the button more to the right to hide the menu (only in landscape mode)
anchors.bottomMargin: root . landscape ( ) ? parent . height * 0.5 - startButt . height * 0.5 : parent . height * 0.1 //put the button lower to hide the menu (only in portrait mode)
2018-07-22 16:47:55 +02:00
}
} ,
State {
name: "STOPPED"
//state when the meassuring is over
PropertyChanges {
2018-10-04 18:35:29 +02:00
target: timer_1 ;
pixelSize: root . landscape ( ) ? parent . width * 0.15 : parent . height * 0.1 ;
2018-07-22 16:47:55 +02:00
scale: 1
}
PropertyChanges {
target: startButt ;
2018-08-14 17:07:42 +02:00
enabled: true ; text: qsTr ( "reset" ) ;
2018-07-22 16:47:55 +02:00
size: root . landscape ( ) ? parent . height * 0.35 : parent . height * 0.2 ;
anchors.bottomMargin: root . landscape ( ) ? parent . height * 0.5 - startButt . height * 0.5 : parent . height * 0.2 - startButt . height * 0.5
anchors.rightMargin: root . landscape ( ) ? parent . height * 0.2 - startButt . height * 0.5 : parent . width * 0.5 - startButt . width * 0.5
}
PropertyChanges {
target: time_container ;
anchors.rightMargin: root . landscape ( ) ? 0 - startButt . width / 2 : undefined
anchors.bottomMargin: root . landscape ( ) ? undefined: 0 - startButt . height / 2
}
}
]
/ * - - - - - - - - - - - - - - - - - - - - - -
Timer animations
-- -- -- -- -- -- -- -- -- -- -- * /
2018-07-17 19:17:25 +02:00
transitions: [
Transition {
2018-10-04 18:35:29 +02:00
NumberAnimation { properties: "size,rightMargin,height,width,bottomMargin,font.pixelSize,pixelSize" ; easing.type: Easing . InOutQuad ; duration: 700 }
2018-07-17 19:17:25 +02:00
} ,
Transition {
2018-07-18 14:06:04 +02:00
to: "STOPPED"
2018-10-04 18:35:29 +02:00
NumberAnimation { properties: "size,rightMargin,height,width,bottomMargin,font.pixelSize,pixelSize" ; easing.type: Easing . InOutQuad ; duration: 700 }
2018-07-18 14:06:04 +02:00
} ,
Transition {
to: "IDLE"
2018-10-04 18:35:29 +02:00
NumberAnimation { properties: "size,rightMargin,height,width,bottomMargin,font.pixelSize,pixelSize" ; easing.type: Easing . InOutQuad ; duration: 700 }
2018-07-18 14:06:04 +02:00
} ,
Transition {
to: "RUNNING"
//disable transitions for the RUNNING state
2018-07-17 19:17:25 +02:00
}
]
2018-07-22 16:47:55 +02:00
/ * - - - - - - - - - - - - - - - - - - - - - -
Timer functions
-- -- -- -- -- -- -- -- -- -- -- * /
function landscape ( ) {
return ( root . height < root . width )
}
2018-08-14 17:07:42 +02:00
/*----Functions to control the stopwatch----*/
function start ( ) {
2018-09-23 17:54:20 +02:00
if ( baseConn . state === "connected" ) {
var ret = baseConn . sendCommand ( "CMD_START_TIMER" )
if ( ret === "OK" ) {
root . state = "STARTING"
2018-10-04 18:35:29 +02:00
timer_1 . setStarting ( )
2018-09-23 17:54:20 +02:00
return
}
}
2018-08-14 17:07:42 +02:00
root . state = "STARTING"
2018-10-04 18:35:29 +02:00
timer_1 . setStarting ( )
2018-08-14 17:07:42 +02:00
if ( _cppAppSettings . loadSetting ( "at_marks_en" ) === "true" ) {
next_actionTimer . action = "at_marks"
next_actionTimer . interval = _cppAppSettings . loadSetting ( "at_marks_delay" ) > 0 ? _cppAppSettings . loadSetting ( "at_marks_delay" ) : 1
next_actionTimer . start ( )
return
}
if ( _cppAppSettings . loadSetting ( "ready_en" ) === "true" ) {
next_actionTimer . action = "ready"
next_actionTimer . interval = _cppAppSettings . loadSetting ( "ready_delay" ) > 0 ? _cppAppSettings . loadSetting ( "ready_delay" ) : 1
next_actionTimer . start ( )
return
}
startSound . play ( )
}
function stop ( type ) {
2018-10-04 18:35:29 +02:00
if ( type === "manual" || type === "cancel" ) {
2018-09-23 17:54:20 +02:00
if ( baseConn . state === "connected" ) {
2018-09-23 19:31:10 +02:00
baseConn . sendCommand ( "CMD_STOP_TIMER" )
2018-09-23 17:54:20 +02:00
}
2018-08-14 17:07:42 +02:00
}
2018-10-04 18:35:29 +02:00
root . state = "STOPPED"
timer_1 . stop ( type )
2018-08-14 17:07:42 +02:00
}
function reset ( ) {
2018-09-23 17:54:20 +02:00
if ( baseConn . state === "connected" ) {
2018-10-04 18:35:29 +02:00
baseConn . sendCommand ( "CMD_RESET_TIMER" )
2018-09-23 17:54:20 +02:00
}
2018-10-04 18:35:29 +02:00
timer_1 . reset ( )
2018-08-14 17:07:42 +02:00
root . state = "IDLE"
}
2018-07-17 19:17:25 +02:00
}
}