2020-04-15 21:47:55 +02:00
|
|
|
#include "../headers/scstwappbackend.h"
|
|
|
|
|
|
|
|
ScStwAppBackend::ScStwAppBackend(QObject *parent) : QObject(parent)
|
|
|
|
{
|
2020-07-10 15:20:41 +02:00
|
|
|
this->scStwClient = new ScStwClient(this);
|
|
|
|
this->appSettings = new ScStwAppSettings(this->scStwClient, this);
|
|
|
|
this->localRace = new ScStwRace(this);
|
2020-10-02 19:58:25 +02:00
|
|
|
this->remoteRace = new ScStwRemoteRace(this->scStwClient, this);
|
2020-07-10 15:20:41 +02:00
|
|
|
this->mode = LOCAL;
|
2020-07-06 15:04:02 +02:00
|
|
|
|
2020-07-10 15:20:41 +02:00
|
|
|
connect(this->appSettings, &ScStwAppSettings::settingChanged, this, &ScStwAppBackend::handleSettingChange);
|
|
|
|
|
|
|
|
this->appSettings->setDefaultSetting(ScStwSettings::BaseStationSetting::ReadySoundEnableSetting, false);
|
|
|
|
this->appSettings->setDefaultSetting(ScStwSettings::BaseStationSetting::ReadySoundDelaySetting, 0);
|
|
|
|
this->appSettings->setDefaultSetting(ScStwSettings::BaseStationSetting::AtYourMarksSoundEnableSetting, false);
|
|
|
|
this->appSettings->setDefaultSetting(ScStwSettings::BaseStationSetting::AtYourMarksSoundDelaySetting, 0);
|
2020-07-06 15:04:02 +02:00
|
|
|
|
|
|
|
this->appSettings->setDefaultSetting(ScStwAppSettings::AppThemeSetting, "Light");
|
|
|
|
|
|
|
|
this->appSettings->setDefaultSetting(ScStwAppSettings::BaseStationIpSetting, "192.168.4.1");
|
|
|
|
|
|
|
|
this->scStwClient->setIP(this->appSettings->readSetting(ScStwAppSettings::BaseStationIpSetting).toString());
|
2020-07-10 15:20:41 +02:00
|
|
|
|
2020-04-15 21:47:55 +02:00
|
|
|
connect(this->scStwClient, &ScStwClient::stateChanged, this, &ScStwAppBackend::baseStationStateChanged);
|
|
|
|
connect(this->scStwClient, &ScStwClient::stateChanged, this, &ScStwAppBackend::refreshMode);
|
|
|
|
connect(this, &ScStwAppBackend::baseStationStateChanged, this, &ScStwAppBackend::baseStationPropertiesChanged);
|
|
|
|
|
|
|
|
this->localRace->addTimer(new ScStwTimer(this));
|
2020-04-17 19:57:33 +02:00
|
|
|
this->reloadRaceSettings();
|
2020-04-15 21:47:55 +02:00
|
|
|
|
|
|
|
this->timerTextRefreshTimer = new QTimer(this);
|
|
|
|
this->timerTextRefreshTimer->setInterval(1);
|
|
|
|
this->timerTextRefreshTimer->setSingleShot(true);
|
|
|
|
this->timerTextRefreshTimer->connect(this->timerTextRefreshTimer, &QTimer::timeout, this, &ScStwAppBackend::refreshTimerText);
|
|
|
|
this->refreshTimerText();
|
|
|
|
}
|
|
|
|
|
|
|
|
// ------------------------
|
|
|
|
// --- helper functions ---
|
|
|
|
// ------------------------
|
|
|
|
|
|
|
|
void ScStwAppBackend::refreshMode() {
|
|
|
|
RaceMode newMode;
|
|
|
|
if(this->scStwClient->getState() == ScStwClient::CONNECTED){
|
|
|
|
newMode = REMOTE;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
newMode = LOCAL;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(this->mode != newMode){
|
|
|
|
|
|
|
|
if(newMode == LOCAL){
|
|
|
|
// if the new mode is local -> connection to base station has been lost
|
|
|
|
|
2020-04-17 19:57:33 +02:00
|
|
|
// reset local race
|
2020-04-15 21:47:55 +02:00
|
|
|
this->getRace()->reset();
|
|
|
|
}
|
|
|
|
|
|
|
|
this->mode = newMode;
|
|
|
|
emit this->modeChanged();
|
2020-04-19 13:09:46 +02:00
|
|
|
emit this->raceChanged();
|
|
|
|
emit this->getRace()->stateChanged(this->getRace()->getState());
|
2020-04-15 21:47:55 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
void ScStwAppBackend::refreshTimerText() {
|
|
|
|
|
|
|
|
// --- refresh timer text ---
|
2020-04-17 19:57:33 +02:00
|
|
|
if(this->getRace()->getState() == ScStwRace::RUNNING) {
|
|
|
|
emit this->getRace()->timersChanged();
|
|
|
|
}
|
2020-04-15 21:47:55 +02:00
|
|
|
|
|
|
|
// --- refresh next start action delay progress ---
|
2020-10-01 14:19:47 +02:00
|
|
|
if(this->getRace()->getState() == ScStwRace::WAITING || this->getRace()->getState() == ScStwRace::PREPAIRING) {
|
2020-10-02 16:49:43 +02:00
|
|
|
emit this->getRace()->currentStartDelayChanged();
|
2020-04-17 19:57:33 +02:00
|
|
|
}
|
2020-04-15 21:47:55 +02:00
|
|
|
|
|
|
|
this->timerTextRefreshTimer->start();
|
|
|
|
}
|
|
|
|
|
|
|
|
// - athlete management -
|
|
|
|
|
2020-04-19 13:09:46 +02:00
|
|
|
// TODO: move to client
|
2020-04-15 21:47:55 +02:00
|
|
|
QVariant ScStwAppBackend::getAthletes() {
|
|
|
|
QVariantMap reply = this->scStwClient->sendCommand(4003);
|
|
|
|
|
|
|
|
if(reply["status"] != 200){
|
|
|
|
//handle Error!!
|
|
|
|
qDebug() << "+ --- error getting athletes: " << reply["status"];
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
QVariantMap tmpAthletes = reply["data"].toMap();
|
|
|
|
|
|
|
|
//qDebug() << tmpAthletes;
|
|
|
|
|
|
|
|
return tmpAthletes;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool ScStwAppBackend::createAthlete(QString userName, QString fullName) {
|
|
|
|
|
|
|
|
QVariant requestData = QVariantMap({{"fullName", fullName}, {"userName", userName}});
|
|
|
|
|
|
|
|
QVariantMap reply = this->scStwClient->sendCommand(4001, requestData.toJsonValue());
|
|
|
|
|
|
|
|
if(reply["status"] != 200){
|
|
|
|
//handle Error!!
|
|
|
|
qDebug() << "+ --- error creating athlete: " << reply["status"];
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool ScStwAppBackend::deleteAthlete( QString userName ){
|
|
|
|
|
|
|
|
QVariant requestData = QVariantMap({{"userName", userName}});
|
|
|
|
|
|
|
|
QVariantMap reply = this->scStwClient->sendCommand(4002, requestData.toJsonValue());
|
|
|
|
|
|
|
|
if(reply["status"] != 200){
|
|
|
|
//handle Error!!
|
|
|
|
qDebug() << "+ --- error deleting athlete: " << reply["status"];
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
bool ScStwAppBackend::selectAthlete( QString userName, int timerId ){
|
|
|
|
|
|
|
|
QVariant requestData = QVariantMap({{"userName", userName}, {"timerId", timerId}});
|
|
|
|
|
|
|
|
QVariantMap reply = this->scStwClient->sendCommand(4000, requestData.toJsonValue());
|
|
|
|
|
|
|
|
if(reply["status"] != 200){
|
|
|
|
//handle Error!!
|
|
|
|
qDebug() << "+ --- error selecting athlete: " << reply["status"];
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
QVariant ScStwAppBackend::getResults( QString userName ){
|
|
|
|
QVariantMap reply = this->scStwClient->sendCommand(4004, userName);
|
|
|
|
|
|
|
|
if(reply["status"] != 200){
|
|
|
|
//handle Error!!
|
|
|
|
qDebug() << "+ --- error getting results: " << reply["status"];
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
QVariantList tmpAthletes = reply["data"].toList();
|
|
|
|
|
|
|
|
//qDebug() << tmpAthletes;
|
|
|
|
|
|
|
|
return tmpAthletes;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -------------------------
|
|
|
|
// --- functions for qml ---
|
|
|
|
// -------------------------
|
|
|
|
|
|
|
|
ScStwRace* ScStwAppBackend::getRace() {
|
|
|
|
switch (this->mode) {
|
|
|
|
case LOCAL:
|
|
|
|
return this->localRace;
|
2020-04-19 13:09:46 +02:00
|
|
|
case REMOTE:
|
|
|
|
return this->remoteRace;
|
2020-04-15 21:47:55 +02:00
|
|
|
}
|
2020-04-19 13:09:46 +02:00
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
|
2020-07-06 15:04:02 +02:00
|
|
|
ScStwAppSettings * ScStwAppBackend::getSettings() {
|
|
|
|
return this->appSettings;
|
|
|
|
}
|
|
|
|
|
2020-04-19 13:09:46 +02:00
|
|
|
ScStwClient* ScStwAppBackend::getScStwClient() {
|
|
|
|
return this->scStwClient;
|
2020-04-15 21:47:55 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
int ScStwAppBackend::getMode() {
|
|
|
|
return this->mode;
|
|
|
|
}
|
|
|
|
|
2020-04-17 19:57:33 +02:00
|
|
|
void ScStwAppBackend::reloadRaceSettings() {
|
2020-10-02 16:49:43 +02:00
|
|
|
this->getRace()->writeStartSoundSetting(
|
|
|
|
ScStwSoundPlayer::AtYourMarks,
|
2020-07-10 15:20:41 +02:00
|
|
|
this->appSettings->readSetting(ScStwSettings::BaseStationSetting::AtYourMarksSoundEnableSetting).toBool(),
|
|
|
|
this->appSettings->readSetting(ScStwSettings::BaseStationSetting::AtYourMarksSoundDelaySetting).toDouble()
|
2020-04-17 19:57:33 +02:00
|
|
|
);
|
|
|
|
|
2020-10-02 16:49:43 +02:00
|
|
|
this->getRace()->writeStartSoundSetting(
|
|
|
|
ScStwSoundPlayer::Ready,
|
2020-07-10 15:20:41 +02:00
|
|
|
this->appSettings->readSetting(ScStwSettings::BaseStationSetting::ReadySoundEnableSetting).toBool(),
|
|
|
|
this->appSettings->readSetting(ScStwSettings::BaseStationSetting::ReadySoundDelaySetting).toDouble()
|
2020-04-17 19:57:33 +02:00
|
|
|
);
|
|
|
|
|
|
|
|
this->getRace()->setSoundVolume(1);
|
|
|
|
|
2020-10-02 16:49:43 +02:00
|
|
|
this->getRace()->setCompetitionMode(false);
|
2020-10-01 01:54:38 +02:00
|
|
|
|
2020-04-17 19:57:33 +02:00
|
|
|
}
|
2020-04-15 21:47:55 +02:00
|
|
|
|
2020-04-19 13:09:46 +02:00
|
|
|
void ScStwAppBackend::reloadBaseStationIpAdress() {
|
2020-07-06 15:04:02 +02:00
|
|
|
this->scStwClient->setIP(this->appSettings->readSetting(ScStwAppSettings::BaseStationIpSetting).toString());
|
|
|
|
}
|
|
|
|
|
2020-07-11 20:30:50 +02:00
|
|
|
void ScStwAppBackend::handleSettingChange(int keyInt, int keyLevel, QVariant value) {
|
|
|
|
Q_UNUSED(value)
|
|
|
|
|
2020-07-10 15:20:41 +02:00
|
|
|
if(keyInt == -1) {
|
|
|
|
emit this->settingsChanged();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2020-07-06 15:04:02 +02:00
|
|
|
switch (keyLevel) {
|
|
|
|
case 0: {
|
|
|
|
// BaseStationSetting!!
|
|
|
|
ScStwSettings::BaseStationSetting key = static_cast<ScStwSettings::BaseStationSetting>(keyInt);
|
|
|
|
switch (key) {
|
2020-07-10 15:20:41 +02:00
|
|
|
case ScStwSettings::BaseStationSetting::InvalidSetting:
|
2020-07-06 15:04:02 +02:00
|
|
|
return;
|
|
|
|
default:
|
2020-07-11 11:52:09 +02:00
|
|
|
if(this->mode == LOCAL)
|
|
|
|
this->reloadRaceSettings();
|
2020-07-06 15:04:02 +02:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case 1: {
|
|
|
|
// BaseStationInternalSetting!!
|
|
|
|
ScStwAppSettings::AppInternalSetting key = static_cast<ScStwAppSettings::AppInternalSetting>(keyInt);
|
|
|
|
switch (key) {
|
|
|
|
case ScStwAppSettings::InvalidSetting:
|
|
|
|
return;
|
|
|
|
case ScStwAppSettings::BaseStationIpSetting:
|
|
|
|
this->reloadBaseStationIpAdress();
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2020-04-15 21:47:55 +02:00
|
|
|
}
|