implemented shared libraries for local timer

(remote is still not working)
This commit is contained in:
Dorian Zedler 2020-04-17 19:57:33 +02:00
parent 32012fa67b
commit e73d1106be
Signed by: dorian
GPG key ID: 989DE36109AFA354
5 changed files with 80 additions and 72 deletions

View file

@ -15,12 +15,9 @@ class ScStwAppBackend : public QObject
//Q_PROPERTY(int state READ getState NOTIFY stateChanged) //Q_PROPERTY(int state READ getState NOTIFY stateChanged)
Q_PROPERTY(int mode READ getMode NOTIFY modeChanged) Q_PROPERTY(int mode READ getMode NOTIFY modeChanged)
Q_PROPERTY(QVariant timers READ getTimerTextList NOTIFY timerTextChanged)
//Q_PROPERTY(QString baseStationState READ getBaseStationState NOTIFY baseStationStateChanged) //Q_PROPERTY(QString baseStationState READ getBaseStationState NOTIFY baseStationStateChanged)
Q_PROPERTY(ScStwRace* race READ getRace NOTIFY raceChanged) Q_PROPERTY(ScStwRace* race READ getRace NOTIFY raceChanged)
Q_PROPERTY(QVariant baseStationConnections READ getBaseStationConnections NOTIFY baseStationConnectionsChanged) Q_PROPERTY(QVariant baseStationConnections READ getBaseStationConnections NOTIFY baseStationConnectionsChanged)
Q_PROPERTY(double nextStartActionDelayProgress READ getNextStartActionDelayProgress NOTIFY nextStartActionDelayProgressChanged)
Q_PROPERTY(int nextStartAction READ getNextStartAction NOTIFY nextStartActionChanged)
Q_PROPERTY(QVariantMap baseStationProperties READ getBaseStationProperties NOTIFY baseStationPropertiesChanged) Q_PROPERTY(QVariantMap baseStationProperties READ getBaseStationProperties NOTIFY baseStationPropertiesChanged)
public: public:
@ -48,9 +45,6 @@ public slots:
Q_INVOKABLE ScStwRace *getRace(); Q_INVOKABLE ScStwRace *getRace();
//Q_INVOKABLE int getState(); //Q_INVOKABLE int getState();
Q_INVOKABLE int getMode(); Q_INVOKABLE int getMode();
Q_INVOKABLE QVariant getTimerTextList();
Q_INVOKABLE double getNextStartActionDelayProgress();
Q_INVOKABLE int getNextStartAction();
Q_INVOKABLE void writeSetting(QString key, QVariant value); Q_INVOKABLE void writeSetting(QString key, QVariant value);
Q_INVOKABLE void writeSetting(ScStw::BaseStationSetting key, QVariant value); Q_INVOKABLE void writeSetting(ScStw::BaseStationSetting key, QVariant value);
@ -79,15 +73,12 @@ public slots:
private slots: private slots:
void refreshTimerText(); void refreshTimerText();
void refreshMode(); void refreshMode();
void reloadRaceSettings();
signals: signals:
void modeChanged(); void modeChanged();
void raceChanged(); void raceChanged();
void nextStartActionChanged();
void nextStartActionDelayProgressChanged();
void timerTextChanged();
void baseStationStateChanged(); void baseStationStateChanged();
void baseStationConnectionsChanged(); void baseStationConnectionsChanged();
void baseStationPropertiesChanged(); void baseStationPropertiesChanged();

View file

@ -18,7 +18,7 @@ Column {
function updateSetting(key, val, del){ function updateSetting(key, val, del){
del.busy = true del.busy = true
speedBackend.writeSetting(key, val) speedBackend.writeSetting(scStw.baseStationSettingToString(key) , val)
del.busy = false del.busy = false
} }
@ -38,10 +38,10 @@ Column {
text: qsTr("say 'ready'") text: qsTr("say 'ready'")
checked: parent.loadSetting("ReadySoundEnable", ready_del) === "true" checked: parent.loadSetting(ScStw.ReadySoundEnableSetting, ready_del) === "true"
onCheckedChanged: { onCheckedChanged: {
parent.updateSetting("ReadySoundEnable", checked, ready_del) parent.updateSetting(ScStw.ReadySoundEnableSetting, checked, ready_del)
} }
} }
@ -59,10 +59,10 @@ Column {
inputHint: qsTr("time") inputHint: qsTr("time")
inputMethodHints: Qt.ImhFormattedNumbersOnly inputMethodHints: Qt.ImhFormattedNumbersOnly
inputText: control.loadSetting("ReadySoundDelay", ready_delay_del) inputText: control.loadSetting(ScStw.ReadySoundDelaySetting, ready_delay_del)
onInputFinished: { onInputFinished: {
control.updateSetting("ReadySoundDelay", inputText, ready_delay_del) control.updateSetting(ScStw.ReadySoundDelaySetting, inputText, ready_delay_del)
} }
} }
@ -78,10 +78,10 @@ Column {
text: qsTr("say 'at your marks'") text: qsTr("say 'at your marks'")
checked: control.loadSetting("AtYourMarksSoundEnable", ready_del) === "true" checked: control.loadSetting(ScStw.AtYourMarksSoundEnableSetting , ready_del) === "true"
onCheckedChanged: { onCheckedChanged: {
parent.updateSetting("AtYourMarksSoundEnable", at_marks_del.checked, at_marks_del) parent.updateSetting(ScStw.AtYourMarksSoundEnableSetting, at_marks_del.checked, at_marks_del)
} }
} }
@ -99,10 +99,10 @@ Column {
enabled: !busy && at_marks_del.checked enabled: !busy && at_marks_del.checked
inputText: control.loadSetting("AtYourMarksSoundDelay", at_marks_delay_del) inputText: control.loadSetting(ScStw.AtYourMarksSoundDelaySetting, at_marks_delay_del)
onInputFinished: { onInputFinished: {
control.updateSetting("AtYourMarksSoundDelay", inputText, at_marks_delay_del) control.updateSetting(ScStw.AtYourMarksSoundDelaySetting, inputText, at_marks_delay_del)
} }
} }
} }

View file

@ -55,6 +55,10 @@ Window {
} }
} }
ScStw {
id: scStw
}
SpeedBackend { SpeedBackend {
id: speedBackend id: speedBackend
} }
@ -65,32 +69,31 @@ Window {
var stateString var stateString
console.log("race state changed to: " + state) console.log("race state changed to: " + state)
switch (state){ switch (state){
case 0: case ScStwRace.IDLE:
stateString = "IDLE" stateString = "IDLE"
break; break;
case 1: case ScStwRace.STARTING:
stateString = "STARTING" stateString = "STARTING"
settingsDialog.close() settingsDialog.close()
profilesDialog.close() profilesDialog.close()
break; break;
case 2: case ScStwRace.WAITING:
stateString = "WAITING" stateString = "WAITING"
settingsDialog.close() settingsDialog.close()
profilesDialog.close() profilesDialog.close()
break; break;
case 3: case ScStwRace.RUNNING:
stateString = "RUNNING" stateString = "RUNNING"
settingsDialog.close() settingsDialog.close()
profilesDialog.close() profilesDialog.close()
break; break;
case 4: case ScStwRace.STOPPED:
stateString = "STOPPED" stateString = "STOPPED"
settingsDialog.close() settingsDialog.close()
profilesDialog.close() profilesDialog.close()
} }
app.state = stateString app.state = stateString
} }
} }
AppTheme { AppTheme {
@ -140,12 +143,13 @@ Window {
anchors.centerIn: parent anchors.centerIn: parent
opacity: ( speedBackend.state < 3 ) ? 1:0 opacity: ( speedBackend.race.state < ScStwRace.RUNNING ) ? 1:0
width: parent.width * 0.7 width: parent.width * 0.7
height: parent.height * 0.7 height: parent.height * 0.7
text: implicitText === "NEXT_START_ACTION" ? ["at your \nmarks", "ready", "starting...", ""][speedBackend.nextStartAction]:implicitText text: implicitText === "NEXT_START_ACTION" ?
["", "at your \nmarks", "ready", "starting..."][speedBackend.race.nextStartActionDetails[ScStwRace.NextStartAction]+1]:implicitText
color: appTheme.style.textColor color: appTheme.style.textColor
@ -172,14 +176,14 @@ Window {
anchors.fill: parent anchors.fill: parent
anchors.bottomMargin: app.landscape() ? 0:parent.height * 0.1 anchors.bottomMargin: app.landscape() ? 0:parent.height * 0.1
opacity: ( speedBackend.state < 3 ) ? 0:1 opacity: ( speedBackend.race.state < ScStwRace.RUNNING ) ? 0:1
spacing: height * 0.05 spacing: height * 0.05
Repeater { Repeater {
id: timerRep id: timerRep
model: speedBackend.timers.length model: speedBackend.race.timers.length
delegate: Item { delegate: Item {
id: timerDel id: timerDel
@ -200,9 +204,9 @@ Window {
["LOST", "FAILED"].includes(speedBackend.timers[index]["state"]) ? appTheme.style.errorColor: ["LOST", "FAILED"].includes(speedBackend.timers[index]["state"]) ? appTheme.style.errorColor:
appTheme.style.textColor appTheme.style.textColor
enabled: speedBackend.timers[index]["state"] !== "DISABLED" enabled: speedBackend.race.timers[index]["state"] !== ScStwTimer.DISABLED
text: speedBackend.timers[index]["text"] text: speedBackend.race.timers[index]["text"]
fontSizeMode: Text.Fit fontSizeMode: Text.Fit
@ -224,7 +228,7 @@ Window {
Label { Label {
id: react_time id: react_time
property int rtime: speedBackend.timers[index]["reacttime"] property int rtime: speedBackend.race.timers[index]["reactionTime"]
anchors { anchors {
centerIn: parent centerIn: parent
@ -408,7 +412,7 @@ Window {
app.start() app.start()
break break
case "RUNNING": case "RUNNING":
app.stop(0) app.stop()
break break
case "STOPPED": case "STOPPED":
app.reset() app.reset()
@ -479,6 +483,9 @@ Window {
ProgressCircle { ProgressCircle {
id: prog id: prog
property double progress: speedBackend.race.nextStartActionDetails[ScStwRace.NextStartActionDelayProgress]
anchors.fill: startButt anchors.fill: startButt
opacity: app.state === "STARTING" ? 1:0 opacity: app.state === "STARTING" ? 1:0
@ -487,7 +494,7 @@ Window {
lineWidth: prog.width * 0.02 lineWidth: prog.width * 0.02
arcBegin: 0 arcBegin: 0
arcEnd: 360 * speedBackend.nextStartActionDelayProgress arcEnd: 360 * (1 - (progress > 0 ? progress:1))
colorCircle: "grey" colorCircle: "grey"
@ -521,7 +528,7 @@ Window {
enabled: app.state === "STARTING" enabled: app.state === "STARTING"
onClicked: { onClicked: {
app.stop(1) app.cancel()
} }
Behavior on scale { Behavior on scale {
@ -842,23 +849,30 @@ Window {
/*----Functions to control the stopwatch----*/ /*----Functions to control the stopwatch----*/
function start(){ function start(){
var ret = speedBackend.race.start() var ret = speedBackend.race.start()
if(!ret){ if(ret !== 200){
console.log("+ --- error starting race!") console.log("+ --- error starting race: " + ret)
} }
} }
function stop(type){ function cancel() {
var ret = speedBackend.race.cancelStart(false)
if(ret !== 200){
console.log("+ --- error canellingr race: " + ret)
}
}
var ret = speedBackend.stopRace(type) function stop(){
if(!ret){ var ret = speedBackend.race.stop()
console.log("+ --- error stopping race: ")
if(ret !== 200){
console.log("+ --- error stopping race: " + ret)
} }
} }
function reset(){ function reset(){
var ret = speedBackend.resetRace() var ret = speedBackend.race.reset()
if(ret !== 200){ if(ret !== 200){
console.log("+ --- error resetting race: " + ret) console.log("+ --- error resetting race: " + ret)

View file

@ -17,6 +17,7 @@
#include <QGuiApplication> #include <QGuiApplication>
#include <QQmlApplicationEngine> #include <QQmlApplicationEngine>
#include <QQmlEngine>
#include <QSqlDatabase> #include <QSqlDatabase>
#include <QSqlError> #include <QSqlError>
#include <QDebug> #include <QDebug>
@ -54,7 +55,9 @@
//#include "headers/climbingrace.h" //#include "headers/climbingrace.h"
#include "headers/apptheme.h" #include "headers/apptheme.h"
#include "headers/scstwappbackend.h" #include "headers/scstwappbackend.h"
#include <scstwtimer.h>
#include <scstwrace.h> #include <scstwrace.h>
#include <ScStw.hpp>
#include <QTranslator> #include <QTranslator>
int main(int argc, char *argv[]) int main(int argc, char *argv[])
@ -86,7 +89,10 @@ int main(int argc, char *argv[])
// setup speed backend and App themes // setup speed backend and App themes
qmlRegisterType<ScStwAppBackend>("com.itsblue.speedclimbingstopwatch", 2, 0, "SpeedBackend"); qmlRegisterType<ScStwAppBackend>("com.itsblue.speedclimbingstopwatch", 2, 0, "SpeedBackend");
qmlRegisterType<ScStwRace>("com.itsblue.speedclimbingstopwatch", 2, 0, "ScStwRace"); qmlRegisterType<ScStwRace>("com.itsblue.speedclimbingstopwatch", 2, 0, "ScStwRace");
qmlRegisterType<ScStwTimer>("com.itsblue.speedclimbingstopwatch", 2, 0, "ScStwTimer");
qmlRegisterType<AppTheme>("com.itsblue.speedclimbingstopwatch", 2, 0, "AppTheme"); qmlRegisterType<AppTheme>("com.itsblue.speedclimbingstopwatch", 2, 0, "AppTheme");
//qmlRegisterUncreatableType<ScStw>("com.itsblue.speedclimbingstopwatch", 2, 0, "ScStw", "This is a static class and therefore not instantiable");
qmlRegisterType<ScStw>("com.itsblue.speedclimbingstopwatch", 2, 0, "ScStw");
QQmlApplicationEngine engine; QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

View file

@ -13,6 +13,7 @@ ScStwAppBackend::ScStwAppBackend(QObject *parent) : QObject(parent)
connect(this, &ScStwAppBackend::baseStationStateChanged, this, &ScStwAppBackend::baseStationPropertiesChanged); connect(this, &ScStwAppBackend::baseStationStateChanged, this, &ScStwAppBackend::baseStationPropertiesChanged);
this->localRace->addTimer(new ScStwTimer(this)); this->localRace->addTimer(new ScStwTimer(this));
this->reloadRaceSettings();
this->timerTextRefreshTimer = new QTimer(this); this->timerTextRefreshTimer = new QTimer(this);
this->timerTextRefreshTimer->setInterval(1); this->timerTextRefreshTimer->setInterval(1);
@ -21,11 +22,6 @@ ScStwAppBackend::ScStwAppBackend(QObject *parent) : QObject(parent)
this->refreshTimerText(); this->refreshTimerText();
} }
// --------------------------
// --- Main Functionality ---
// --------------------------
// ------------------------- // -------------------------
// --- Base Station sync --- // --- Base Station sync ---
// ------------------------- // -------------------------
@ -124,8 +120,7 @@ void ScStwAppBackend::refreshMode() {
if(newMode == LOCAL){ if(newMode == LOCAL){
// if the new mode is local -> connection to base station has been lost // if the new mode is local -> connection to base station has been lost
// reset race // reset local race
// reset state
this->getRace()->reset(); this->getRace()->reset();
} }
@ -138,18 +133,14 @@ void ScStwAppBackend::refreshMode() {
void ScStwAppBackend::refreshTimerText() { void ScStwAppBackend::refreshTimerText() {
// --- refresh timer text --- // --- refresh timer text ---
if(this->getRace()->getState() == ScStwRace::RUNNING) {
QVariantList newTimerTextList; emit this->getRace()->timersChanged();
}
newTimerTextList = this->getRace()->getTimerDetailList();
// --- refresh next start action delay progress --- // --- refresh next start action delay progress ---
double nextStartActionDelayProgress = 0; if(this->getRace()->getState() == ScStwRace::STARTING) {
emit this->getRace()->nextStartActionDetailsChanged();
nextStartActionDelayProgress = this->getRace()->getNextStartActionDetails()["nextActionDelayProg"].toDouble(); }
if(nextStartActionDelayProgress < 1.0)
emit this->nextStartActionDelayProgressChanged();
this->timerTextRefreshTimer->start(); this->timerTextRefreshTimer->start();
} }
@ -258,18 +249,6 @@ int ScStwAppBackend::getMode() {
return this->mode; return this->mode;
} }
QVariant ScStwAppBackend::getTimerTextList() {
return this->getRace()->getTimerDetailList();
}
double ScStwAppBackend::getNextStartActionDelayProgress() {
return this->getRace()->getNextStartActionDetails()["nextActionDelayProg"].toDouble();
}
int ScStwAppBackend::getNextStartAction() {
return this->getRace()->getNextStartActionDetails()["nextAction"].toInt();
}
void ScStwAppBackend::writeSetting(QString key, QVariant value) { void ScStwAppBackend::writeSetting(QString key, QVariant value) {
if(this->mode == REMOTE && ScStw::baseStationSettingFromString(key) != ScStw::InvalidSetting ){ if(this->mode == REMOTE && ScStw::baseStationSettingFromString(key) != ScStw::InvalidSetting ){
this->scStwClient->writeRemoteSetting(ScStw::baseStationSettingFromString(key), value.toString()); this->scStwClient->writeRemoteSetting(ScStw::baseStationSettingFromString(key), value.toString());
@ -277,6 +256,8 @@ void ScStwAppBackend::writeSetting(QString key, QVariant value) {
else { else {
this->appSettings->writeSetting(key, value); this->appSettings->writeSetting(key, value);
} }
this->reloadRaceSettings();
} }
void ScStwAppBackend::writeSetting(ScStw::BaseStationSetting key, QVariant value) { void ScStwAppBackend::writeSetting(ScStw::BaseStationSetting key, QVariant value) {
@ -301,6 +282,22 @@ QString ScStwAppBackend::readSetting(ScStw::BaseStationSetting key) {
return "false"; return "false";
} }
void ScStwAppBackend::reloadRaceSettings() {
this->getRace()->writeStartActionSetting(
ScStwRace::AtYourMarks,
this->appSettings->loadSetting(ScStw::baseStationSettingToString(ScStw::AtYourMarksSoundEnableSetting)) == "true",
this->appSettings->loadSetting(ScStw::baseStationSettingToString(ScStw::AtYourMarksSoundDelaySetting)).toDouble()
);
this->getRace()->writeStartActionSetting(
ScStwRace::Ready,
this->appSettings->loadSetting(ScStw::baseStationSettingToString(ScStw::ReadySoundEnableSetting)) == "true",
this->appSettings->loadSetting(ScStw::baseStationSettingToString(ScStw::ReadySoundDelaySetting)).toDouble()
);
this->getRace()->setSoundVolume(1);
}
void ScStwAppBackend::connectBaseStation() { void ScStwAppBackend::connectBaseStation() {
this->reloadBaseStationIpAdress(); this->reloadBaseStationIpAdress();
this->scStwClient->connectToHost(); this->scStwClient->connectToHost();