Some changes for things to work with qml
This commit is contained in:
parent
c262935377
commit
73d62d01d8
8 changed files with 88 additions and 22 deletions
|
@ -12,5 +12,9 @@ unix:LIBS += -L$$SCSTWLIBRARIES_LIB_OUTPUT_DIR -lScStwLibraries
|
||||||
|
|
||||||
win32:LIBS += -L$$SCSTWLIBRARIES_LIB_OUTPUT_DIR -lScStwLibraries1
|
win32:LIBS += -L$$SCSTWLIBRARIES_LIB_OUTPUT_DIR -lScStwLibraries1
|
||||||
|
|
||||||
|
android {
|
||||||
|
ANDROID_EXTRA_LIBS += $$SCSTWLIBRARIES_LIB_OUTPUT_DIR/libScStwLibraries.so
|
||||||
|
}
|
||||||
|
|
||||||
INCLUDEPATH += "$$PWD"
|
INCLUDEPATH += "$$PWD"
|
||||||
INCLUDEPATH += "$$PWD"/headers
|
INCLUDEPATH += "$$PWD"/headers
|
||||||
|
|
|
@ -137,7 +137,7 @@ public:
|
||||||
* \see ScStw::BaseStationSetting
|
* \see ScStw::BaseStationSetting
|
||||||
* \see ScStw::baseStationSettingFromString()
|
* \see ScStw::baseStationSettingFromString()
|
||||||
*/
|
*/
|
||||||
static QString baseStationSettingToString(BaseStationSetting s);
|
Q_INVOKABLE static QString baseStationSettingToString(BaseStationSetting s);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief Function to convert an int to a SignalKey
|
* \brief Function to convert an int to a SignalKey
|
||||||
|
@ -148,8 +148,8 @@ public:
|
||||||
*/
|
*/
|
||||||
static SignalKey signalKeyFromInt(int i);
|
static SignalKey signalKeyFromInt(int i);
|
||||||
|
|
||||||
private:
|
|
||||||
ScStw() : QObject(nullptr) {};
|
ScStw() : QObject(nullptr) {};
|
||||||
|
private:
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // SCSTW_HPP
|
#endif // SCSTW_HPP
|
||||||
|
|
|
@ -12,15 +12,24 @@ class ScStwRace : public QObject
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
Q_PROPERTY(RaceState state READ getState NOTIFY stateChanged)
|
Q_PROPERTY(RaceState state READ getState NOTIFY stateChanged)
|
||||||
|
Q_PROPERTY(QVariantList timers READ getTimerDetailList NOTIFY timersChanged)
|
||||||
|
Q_PROPERTY(QVariantList nextStartActionDetails READ getNextStartActionDetails NOTIFY nextStartActionDetailsChanged)
|
||||||
public:
|
public:
|
||||||
explicit ScStwRace(QObject *parent = nullptr);
|
explicit ScStwRace(QObject *parent = nullptr);
|
||||||
|
|
||||||
enum RaceState { IDLE, STARTING, WAITING, RUNNING, STOPPED };
|
enum RaceState { IDLE, STARTING, WAITING, RUNNING, STOPPED };
|
||||||
Q_ENUM(RaceState)
|
Q_ENUM(RaceState)
|
||||||
|
|
||||||
enum StartAction { None = -1, AtYourMarks, Ready, Start };
|
enum StartAction { None = -1, AtYourMarks = 0, Ready = 1, Start = 2 };
|
||||||
Q_ENUM(StartAction)
|
Q_ENUM(StartAction)
|
||||||
|
|
||||||
|
enum NextStartActionDetailAttributes {
|
||||||
|
NextStartAction = 0,
|
||||||
|
NextStartActionTotalDelay = 1,
|
||||||
|
NextStartActionDelayProgress = 2
|
||||||
|
};
|
||||||
|
Q_ENUM(NextStartActionDetailAttributes);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
RaceState state;
|
RaceState state;
|
||||||
|
|
||||||
|
@ -53,12 +62,16 @@ public slots:
|
||||||
void handleTimerStop();
|
void handleTimerStop();
|
||||||
int reset();
|
int reset();
|
||||||
void cancelStart(bool falseStart);
|
void cancelStart(bool falseStart);
|
||||||
QVariantMap getNextStartActionDetails();
|
|
||||||
|
// setters
|
||||||
bool writeStartActionSetting(StartAction action, bool enabled, int delay);
|
bool writeStartActionSetting(StartAction action, bool enabled, int delay);
|
||||||
bool setSoundVolume(double volume);
|
bool setSoundVolume(double volume);
|
||||||
bool addTimer(ScStwTimer *timer);
|
bool addTimer(ScStwTimer *timer);
|
||||||
|
|
||||||
|
// getters
|
||||||
RaceState getState();
|
RaceState getState();
|
||||||
StartAction getNextStartAction();
|
StartAction getNextStartAction();
|
||||||
|
QVariantList getNextStartActionDetails();
|
||||||
QVariantList getTimerDetailList();
|
QVariantList getTimerDetailList();
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
@ -72,6 +85,8 @@ signals:
|
||||||
void resetTimers();
|
void resetTimers();
|
||||||
void stateChanged(RaceState state);
|
void stateChanged(RaceState state);
|
||||||
void nextStartActionChanged();
|
void nextStartActionChanged();
|
||||||
|
void nextStartActionDetailsChanged();
|
||||||
|
void timersChanged();
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -63,6 +63,7 @@ public:
|
||||||
CANCELLED, /*!< Timer was cancelled */
|
CANCELLED, /*!< Timer was cancelled */
|
||||||
DISABLED /*!< Timer is disabled */
|
DISABLED /*!< Timer is disabled */
|
||||||
};
|
};
|
||||||
|
Q_ENUM(TimerState);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief The StopReason enum contains all possible reasons for a stop
|
* \brief The StopReason enum contains all possible reasons for a stop
|
||||||
|
@ -186,6 +187,12 @@ public slots:
|
||||||
*/
|
*/
|
||||||
double getReactionTime();
|
double getReactionTime();
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \brief Function to get the text, a timer display is supposed to show
|
||||||
|
* \return The text to show
|
||||||
|
*/
|
||||||
|
QString getText();
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief Function to set if the timer is supposed to be disabled
|
* \brief Function to set if the timer is supposed to be disabled
|
||||||
*
|
*
|
||||||
|
|
Binary file not shown.
|
@ -11,8 +11,10 @@ ScStwRace::ScStwRace(QObject *parent) : QObject(parent)
|
||||||
this->nextActionTimer = new QTimer(this);
|
this->nextActionTimer = new QTimer(this);
|
||||||
nextActionTimer->setSingleShot(true);
|
nextActionTimer->setSingleShot(true);
|
||||||
this->nextActionLoop = new QEventLoop();
|
this->nextActionLoop = new QEventLoop();
|
||||||
|
this->nextStartAction = None;
|
||||||
|
|
||||||
connect(this->nextActionTimer, &QTimer::timeout, this->nextActionLoop, &QEventLoop::quit);
|
connect(this->nextActionTimer, &QTimer::timeout, this->nextActionLoop, &QEventLoop::quit);
|
||||||
|
connect(this, &ScStwRace::nextStartActionChanged, this, &ScStwRace::nextStartActionDetailsChanged);
|
||||||
|
|
||||||
// write default settings
|
// write default settings
|
||||||
this->startActionSettings.insert(Start, {{"Enabled", true}, {"Delay", 1}});
|
this->startActionSettings.insert(Start, {{"Enabled", true}, {"Delay", 1}});
|
||||||
|
@ -187,6 +189,7 @@ bool ScStwRace::playSoundsAndStartTimers(StartAction thisAction) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(thisAction < Start) {
|
||||||
this->nextStartAction = StartAction(thisAction + 1);
|
this->nextStartAction = StartAction(thisAction + 1);
|
||||||
qDebug() << "next action is: " << nextStartAction;
|
qDebug() << "next action is: " << nextStartAction;
|
||||||
|
|
||||||
|
@ -195,7 +198,6 @@ bool ScStwRace::playSoundsAndStartTimers(StartAction thisAction) {
|
||||||
nextActionDelay = this->startActionSettings[this->nextStartAction]["Delay"].toInt();
|
nextActionDelay = this->startActionSettings[this->nextStartAction]["Delay"].toInt();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(this->nextStartAction <= Start) {
|
|
||||||
// perform next action
|
// perform next action
|
||||||
this->nextActionTimer->start(nextActionDelay > 0 ? nextActionDelay:1);
|
this->nextActionTimer->start(nextActionDelay > 0 ? nextActionDelay:1);
|
||||||
if(nextActionDelay > 0)
|
if(nextActionDelay > 0)
|
||||||
|
@ -269,7 +271,7 @@ void ScStwRace::refreshTimerStates() {
|
||||||
bool raceIsOver = true;
|
bool raceIsOver = true;
|
||||||
|
|
||||||
foreach(ScStwTimer * timer, this->timers){
|
foreach(ScStwTimer * timer, this->timers){
|
||||||
if(timer->getState() < ScStwTimer::WON){
|
if(timer->getState() < ScStwTimer::WON && timer->getState() != ScStwTimer::WAITING){
|
||||||
// if the timer is not in stoped state
|
// if the timer is not in stoped state
|
||||||
raceIsOver = false;
|
raceIsOver = false;
|
||||||
break;
|
break;
|
||||||
|
@ -307,9 +309,9 @@ void ScStwRace::handleTimerEnable(ScStwTimer* timer) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QVariantMap ScStwRace::getNextStartActionDetails() {
|
QVariantList ScStwRace::getNextStartActionDetails() {
|
||||||
int nextActionDelay = 0;
|
int nextActionDelay = 0;
|
||||||
double nextActionDelayProg = 0;
|
double nextActionDelayProg = -1;
|
||||||
|
|
||||||
if(this->nextStartAction == AtYourMarks || this->nextStartAction == Ready) {
|
if(this->nextStartAction == AtYourMarks || this->nextStartAction == Ready) {
|
||||||
// get the total delay and the delay progress of the next action timer
|
// get the total delay and the delay progress of the next action timer
|
||||||
|
@ -321,7 +323,11 @@ QVariantMap ScStwRace::getNextStartActionDetails() {
|
||||||
nextActionDelayProg = 1 - (remaining / nextActionDelay);
|
nextActionDelayProg = 1 - (remaining / nextActionDelay);
|
||||||
}
|
}
|
||||||
|
|
||||||
return {{"nextAction", this->nextStartAction}, {"nextActionDelay", nextActionDelay}, {"nextActionDelayProg", nextActionDelayProg}};
|
return {
|
||||||
|
this->nextStartAction,
|
||||||
|
nextActionDelay,
|
||||||
|
nextActionDelayProg
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ScStwRace::writeStartActionSetting(StartAction action, bool enabled, int delay) {
|
bool ScStwRace::writeStartActionSetting(StartAction action, bool enabled, int delay) {
|
||||||
|
@ -362,6 +368,8 @@ bool ScStwRace::addTimer(ScStwTimer *timer) {
|
||||||
connect(timer, &ScStwTimer::startCanceled, this, &ScStwRace::cancelStart);
|
connect(timer, &ScStwTimer::startCanceled, this, &ScStwRace::cancelStart);
|
||||||
connect(timer, &ScStwTimer::stateChanged, this, &ScStwRace::refreshTimerStates);
|
connect(timer, &ScStwTimer::stateChanged, this, &ScStwRace::refreshTimerStates);
|
||||||
connect(timer, &ScStwTimer::requestEnableChange, this, &ScStwRace::handleTimerEnable);
|
connect(timer, &ScStwTimer::requestEnableChange, this, &ScStwRace::handleTimerEnable);
|
||||||
|
connect(timer, &ScStwTimer::stateChanged, this, &ScStwRace::timersChanged);
|
||||||
|
connect(timer, &ScStwTimer::reactionTimeChanged, this, &ScStwRace::timersChanged);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
@ -385,6 +393,7 @@ QVariantList ScStwRace::getTimerDetailList() {
|
||||||
tmpTimer.insert("state", timer->getState());
|
tmpTimer.insert("state", timer->getState());
|
||||||
tmpTimer.insert("currentTime", timer->getCurrentTime());
|
tmpTimer.insert("currentTime", timer->getCurrentTime());
|
||||||
tmpTimer.insert("reactionTime", timer->getReactionTime());
|
tmpTimer.insert("reactionTime", timer->getReactionTime());
|
||||||
|
tmpTimer.insert("text", timer->getText());
|
||||||
tmpTimers.append(tmpTimer);
|
tmpTimers.append(tmpTimer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -38,6 +38,7 @@ bool ScStwSoundPlayer::play(int action, double volume, double *timeOfStart) {
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// stop playback
|
// stop playback
|
||||||
|
if(this->audioOutput->state() == QAudio::ActiveState)
|
||||||
this->audioOutput->stop();
|
this->audioOutput->stop();
|
||||||
|
|
||||||
// update currently playing action
|
// update currently playing action
|
||||||
|
@ -61,8 +62,6 @@ bool ScStwSoundPlayer::play(int action, double volume, double *timeOfStart) {
|
||||||
// start
|
// start
|
||||||
this->audioOutput->start(playbackFile);
|
this->audioOutput->start(playbackFile);
|
||||||
|
|
||||||
qDebug() << "playback stared, took " << this->audioOutput->elapsedUSecs();
|
|
||||||
|
|
||||||
// pass the time of start if requested
|
// pass the time of start if requested
|
||||||
if(timeOfStart != nullptr) {
|
if(timeOfStart != nullptr) {
|
||||||
*timeOfStart = QDateTime::currentMSecsSinceEpoch() - (this->audioOutput->elapsedUSecs() / 1000);
|
*timeOfStart = QDateTime::currentMSecsSinceEpoch() - (this->audioOutput->elapsedUSecs() / 1000);
|
||||||
|
@ -111,7 +110,6 @@ bool ScStwSoundPlayer::waitForSoundFinish(double *timeOfStop) {
|
||||||
// wait until the audio output reports the sound is over
|
// wait until the audio output reports the sound is over
|
||||||
waitLoop->exec();
|
waitLoop->exec();
|
||||||
|
|
||||||
qDebug() << "waitLoop exited!! elapsed: " << this->audioOutput->elapsedUSecs() << " processed: " << this->audioOutput->processedUSecs();
|
|
||||||
// wait until the sound is actually over
|
// wait until the sound is actually over
|
||||||
// the timeOffset is the buffer time before the audio started!
|
// the timeOffset is the buffer time before the audio started!
|
||||||
int timeOffset = ((this->audioOutput->processedUSecs() - this->audioOutput->elapsedUSecs()) / 1000);
|
int timeOffset = ((this->audioOutput->processedUSecs() - this->audioOutput->elapsedUSecs()) / 1000);
|
||||||
|
@ -128,8 +126,6 @@ bool ScStwSoundPlayer::waitForSoundFinish(double *timeOfStop) {
|
||||||
*timeOfStop = QDateTime::currentMSecsSinceEpoch() - latency;
|
*timeOfStop = QDateTime::currentMSecsSinceEpoch() - latency;
|
||||||
}
|
}
|
||||||
|
|
||||||
qDebug() << "finished now";
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -138,7 +134,6 @@ void ScStwSoundPlayer::handleStateChanged(QAudio::State newState)
|
||||||
switch (newState) {
|
switch (newState) {
|
||||||
case QAudio::IdleState:
|
case QAudio::IdleState:
|
||||||
// Finished playing (no more data)
|
// Finished playing (no more data)
|
||||||
qDebug() << "sound reported over!! elapsed: " << this->audioOutput->elapsedUSecs() << " processed: " << this->audioOutput->processedUSecs();
|
|
||||||
waitLoop->exit();
|
waitLoop->exit();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -177,6 +177,42 @@ double ScStwTimer::getReactionTime() {
|
||||||
return this->reactionTime;
|
return this->reactionTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString ScStwTimer::getText() {
|
||||||
|
//qDebug() << this->getState();
|
||||||
|
QString newText;
|
||||||
|
switch (this->state) {
|
||||||
|
case ScStwTimer::IDLE:
|
||||||
|
newText = "0.000 sec";
|
||||||
|
break;
|
||||||
|
case ScStwTimer::STARTING:
|
||||||
|
newText = "0.000 sec";
|
||||||
|
break;
|
||||||
|
case ScStwTimer::WAITING:
|
||||||
|
newText = "please wait...";
|
||||||
|
break;
|
||||||
|
case ScStwTimer::RUNNING:
|
||||||
|
newText = QString::number( this->getCurrentTime() / 1000.0, 'f', 3 ) + " sec";
|
||||||
|
break;
|
||||||
|
case ScStwTimer::WON:
|
||||||
|
newText = QString::number( this->getCurrentTime() / 1000.0, 'f', 3 ) + " sec";
|
||||||
|
break;
|
||||||
|
case ScStwTimer::LOST:
|
||||||
|
newText = QString::number( this->getCurrentTime() / 1000.0, 'f', 3 ) + " sec";
|
||||||
|
break;
|
||||||
|
case ScStwTimer::FAILED:
|
||||||
|
newText = "false start";
|
||||||
|
break;
|
||||||
|
case ScStwTimer::CANCELLED:
|
||||||
|
newText = "cancelled";
|
||||||
|
break;
|
||||||
|
case ScStwTimer::DISABLED:
|
||||||
|
newText = "---";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return newText;
|
||||||
|
}
|
||||||
|
|
||||||
void ScStwTimer::setDisabled(bool disabled) {
|
void ScStwTimer::setDisabled(bool disabled) {
|
||||||
if(disabled)
|
if(disabled)
|
||||||
this->setState(DISABLED);
|
this->setState(DISABLED);
|
||||||
|
|
Reference in a new issue