diff --git a/src/audio/QGCAudioWorker.cpp b/src/audio/QGCAudioWorker.cpp index 5b7f4eb6d15218e8d35f38139703eecd9a9044b1..e0d9ee86cc1b15793fca620acf52c49f4c317935 100644 --- a/src/audio/QGCAudioWorker.cpp +++ b/src/audio/QGCAudioWorker.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include "QGC.h" #include "QGCAudioWorker.h" @@ -89,7 +90,7 @@ QGCAudioWorker::~QGCAudioWorker() #endif } -void QGCAudioWorker::say(QString text, int severity) +void QGCAudioWorker::say(QString inText, int severity) { static bool threadInit = false; if (!threadInit) { @@ -99,6 +100,7 @@ void QGCAudioWorker::say(QString text, int severity) if (!muted) { + QString text = _fixMillisecondString(inText); // Prepend high priority text with alert beep if (severity < GAudioOutput::AUDIO_SEVERITY_CRITICAL) { beep(); @@ -139,7 +141,7 @@ void QGCAudioWorker::say(QString text, int severity) #else // Make sure there isn't an unused variable warning when speech output is disabled - Q_UNUSED(text); + Q_UNUSED(inText); #endif } } @@ -170,3 +172,40 @@ bool QGCAudioWorker::isMuted() { return this->muted; } + +bool QGCAudioWorker::_getMillisecondString(const QString& string, QString& match, int& number) { + QRegularExpression re("([0-9]*ms)"); + QRegularExpressionMatchIterator i = re.globalMatch(string); + while (i.hasNext()) { + QRegularExpressionMatch qmatch = i.next(); + if (qmatch.hasMatch()) { + match = qmatch.captured(0); + number = qmatch.captured(0).replace("ms", "").toInt(); + return true; + } + } + return false; +} + +QString QGCAudioWorker::_fixMillisecondString(const QString& string) { + QString match; + QString newNumber; + QString result = string; + int number; + if(_getMillisecondString(string, match, number) && number > 1000) { + if(number < 60000) { + int seconds = number / 1000; + newNumber = QString("%1 second%2").arg(seconds).arg(seconds > 1 ? "s" : ""); + } else { + int minutes = number / 60000; + int seconds = (number - (minutes * 60000)) / 1000; + if (!seconds) { + newNumber = QString("%1 minute%2").arg(minutes).arg(minutes > 1 ? "s" : ""); + } else { + newNumber = QString("%1 minute%2 and %3 second%4").arg(minutes).arg(minutes > 1 ? "s" : "").arg(seconds).arg(seconds > 1 ? "s" : ""); + } + } + result.replace(match, newNumber); + } + return result; +} diff --git a/src/audio/QGCAudioWorker.h b/src/audio/QGCAudioWorker.h index 7e06023e54264968dd4d84c2133fc59baf0ab614..beafe429e7329040576ba11728787def41dcad60 100644 --- a/src/audio/QGCAudioWorker.h +++ b/src/audio/QGCAudioWorker.h @@ -50,6 +50,9 @@ protected: bool emergency; ///< Emergency status flag QTimer *emergencyTimer; bool muted; +private: + QString _fixMillisecondString(const QString& string); + bool _getMillisecondString(const QString& string, QString& match, int& number); }; #endif // QGCAUDIOWORKER_H diff --git a/src/qgcunittest/MockQGCUASParamManager.cc b/src/qgcunittest/MockQGCUASParamManager.cc index c2cad7b3f18a92c626b62ed33362226a63cfc5aa..e8e574ecbd07063e07a40044e1b2070983059a6f 100644 --- a/src/qgcunittest/MockQGCUASParamManager.cc +++ b/src/qgcunittest/MockQGCUASParamManager.cc @@ -102,3 +102,14 @@ void MockQGCUASParamManager::_loadParams(void) _mapParams[paramName] = paramValue; } } + +QList MockQGCUASParamManager::getComponentForParam(const QString& parameter) const +{ + if (_mapParams.contains(parameter)) { + QList list; + list << 50; + return list; + } else { + return QList(); + } +} diff --git a/src/qgcunittest/MockQGCUASParamManager.h b/src/qgcunittest/MockQGCUASParamManager.h index e5d5871005700569a277ef821bfba6e7f881c75c..257e5fbdb392f8de70afad2efb7bffe4e646a121 100644 --- a/src/qgcunittest/MockQGCUASParamManager.h +++ b/src/qgcunittest/MockQGCUASParamManager.h @@ -77,7 +77,7 @@ public: public: // Unimplemented QGCUASParamManagerInterface overrides - virtual QList getComponentForParam(const QString& parameter) const { Q_ASSERT(false); Q_UNUSED(parameter); return _bogusQListInt; } + virtual QList getComponentForParam(const QString& parameter) const; virtual void setParamDescriptions(const QMap& paramDescs) { Q_ASSERT(false); Q_UNUSED(paramDescs); } virtual int countPendingParams() { Q_ASSERT(false); return 0; } virtual UASParameterDataModel* dataModel() { Q_ASSERT(false); return NULL; } diff --git a/src/ui/px4_configuration/PX4RCCalibration.cc b/src/ui/px4_configuration/PX4RCCalibration.cc index 5503a1145259b18bfd14bd48faabccb122f83ad5..e4df03db45c8b2c0d15c256e20d00c05e47f28a4 100644 --- a/src/ui/px4_configuration/PX4RCCalibration.cc +++ b/src/ui/px4_configuration/PX4RCCalibration.cc @@ -924,6 +924,11 @@ void PX4RCCalibration::_writeCalibration(void) paramMgr->setPendingParam(0, _rgFunctionInfo[i].parameterName, paramChannel); } + // If the RC_CHAN_COUNT parameter is available write the channel count + if (paramMgr->getComponentForParam("RC_CHAN_CNT").count() != 0) { + paramMgr->setPendingParam(0, "RC_CHAN_CNT", _chanCount); + } + //let the param mgr manage sending all the pending RC_foo updates and persisting after paramMgr->sendPendingParameters(true, true);