diff --git a/ground/openpilotgcs/src/plugins/notify/NotificationItem.h b/ground/openpilotgcs/src/plugins/notify/NotificationItem.h index d4929a1e5..e64609a53 100644 --- a/ground/openpilotgcs/src/plugins/notify/NotificationItem.h +++ b/ground/openpilotgcs/src/plugins/notify/NotificationItem.h @@ -49,6 +49,7 @@ class NotificationItem : public QObject public: enum { eDefaultTimeout = 15 }; // in sec + enum {equal,bigger,smaller,inrange}; explicit NotificationItem(QObject *parent = 0); void copyTo(NotificationItem*) const; @@ -57,8 +58,11 @@ public: DECLARE_SOUND(2) DECLARE_SOUND(3) - QString range() const { return _rangeLimit; } - void setRange(QString text) { _rangeLimit = text; } + bool getCurrentUpdatePlayed() const {return _currentUpdatePlayed;} + void setCurrentUpdatePlayed(bool value){_currentUpdatePlayed=value;} + + int getCondition() const { return _condition; } + void setCondition(int value) { _condition = value; } QString getSayOrder() const { return _sayOrder; } void setSayOrder(QString text) { _sayOrder = text; } @@ -100,8 +104,8 @@ public: UAVDataObject* getUAVObject(void); UAVObjectField* getUAVObjectField(void); - void seriaize(QDataStream& stream); - void deseriaize(QDataStream& stream); + void serialize(QDataStream& stream); + void deserialize(QDataStream& stream); /** * Convert notification item fields in single string, @@ -152,6 +156,8 @@ private: private: + bool _currentUpdatePlayed; + QTimer* _timer; //! time from putting notification in queue till moment when notification became out-of-date @@ -175,7 +181,7 @@ private: QString _objectField; //! fire condition for UAV field value (lower, greater, in range) - QString _rangeLimit; + int _condition; //! possible sounds(at least one required to play notification) QString _sound1; diff --git a/ground/openpilotgcs/src/plugins/notify/notificationitem.cpp b/ground/openpilotgcs/src/plugins/notify/notificationitem.cpp index ec86aabcd..68674bc90 100644 --- a/ground/openpilotgcs/src/plugins/notify/notificationitem.cpp +++ b/ground/openpilotgcs/src/plugins/notify/notificationitem.cpp @@ -45,7 +45,9 @@ static const QString cStrBefore1st("Before first"); static const QString cStrBefore2nd("Before second"); static const QString cStrAfter2nd("After second"); +static const QString cStrRetryOncePUpdate("Repeat Once per update"); static const QString cStrRetryOnce("Repeat Once"); + static const QString cStrRetryInstantly("Repeat Instantly"); static const QString cStrRetry10sec("Repeat 10 seconds"); static const QString cStrRetry30sec("Repeat 30 seconds"); @@ -58,6 +60,7 @@ QStringList NotificationItem::retryValues; NotificationItem::NotificationItem(QObject *parent) : QObject(parent) + , _currentUpdatePlayed(false) , isNowPlaying(0) , _isPlayed(false) , _timer(NULL) @@ -66,7 +69,7 @@ NotificationItem::NotificationItem(QObject *parent) , _currentLanguage("default") , _dataObject("") , _objectField("") - , _rangeLimit("Equal to") + , _condition(0) , _sound1("") , _sound2("") , _sound3("") @@ -78,12 +81,14 @@ NotificationItem::NotificationItem(QObject *parent) , _mute(false) { NotificationItem::sayOrderValues.clear(); + NotificationItem::sayOrderValues.append(cStrNever); NotificationItem::sayOrderValues.append(cStrBefore1st); NotificationItem::sayOrderValues.append(cStrBefore2nd); NotificationItem::sayOrderValues.append(cStrAfter2nd); NotificationItem::retryValues.clear(); NotificationItem::retryValues.append(cStrRetryOnce); + NotificationItem::retryValues.append(cStrRetryOncePUpdate); NotificationItem::retryValues.append(cStrRetryInstantly); NotificationItem::retryValues.append(cStrRetry10sec); NotificationItem::retryValues.append(cStrRetry30sec); @@ -100,7 +105,7 @@ void NotificationItem::copyTo(NotificationItem* that) const that->_soundCollectionPath = _soundCollectionPath; that->_dataObject = _dataObject; that->_objectField = _objectField; - that->_rangeLimit = _rangeLimit; + that->_condition = _condition; that->_sound1 = _sound1; that->_sound2 = _sound2; that->_sound3 = _sound3; @@ -120,7 +125,7 @@ void NotificationItem::saveState(QSettings* settings) const settings->setValue(QLatin1String("CurrentLanguage"), getCurrentLanguage()); settings->setValue(QLatin1String("ObjectField"), getObjectField()); settings->setValue(QLatin1String("DataObject"), getDataObject()); - settings->setValue(QLatin1String("RangeLimit"), range()); + settings->setValue(QLatin1String("RangeLimit"), getCondition()); settings->setValue(QLatin1String("Value1"), singleValue()); settings->setValue(QLatin1String("Value2"), valueRange2()); settings->setValue(QLatin1String("Sound1"), getSound1()); @@ -139,7 +144,7 @@ void NotificationItem::restoreState(QSettings* settings) setCurrentLanguage(settings->value(QLatin1String("CurrentLanguage"), tr("")).toString()); setDataObject(settings->value(QLatin1String("DataObject"), tr("")).toString()); setObjectField(settings->value(QLatin1String("ObjectField"), tr("")).toString()); - setRange(settings->value(QLatin1String("RangeLimit"), tr("")).toString()); + setCondition(settings->value(QLatin1String("RangeLimit"), tr("")).toInt()); setSound1(settings->value(QLatin1String("Sound1"), tr("")).toString()); setSound2(settings->value(QLatin1String("Sound2"), tr("")).toString()); setSound3(settings->value(QLatin1String("Sound3"), tr("")).toString()); @@ -152,13 +157,14 @@ void NotificationItem::restoreState(QSettings* settings) setMute(settings->value(QLatin1String("Mute"), tr("")).toInt()); } -void NotificationItem::seriaize(QDataStream& stream) +void NotificationItem::serialize(QDataStream& stream) { stream << this->_soundCollectionPath; stream << this->_currentLanguage; stream << this->_dataObject; stream << this->_objectField; - stream << this->_rangeLimit; + stream << this->_condition; + qNotifyDebug()<<"getOptionsPageValues seriaize"<<_condition; stream << this->_sound1; stream << this->_sound2; stream << this->_sound3; @@ -170,13 +176,13 @@ void NotificationItem::seriaize(QDataStream& stream) stream << this->_mute; } -void NotificationItem::deseriaize(QDataStream& stream) +void NotificationItem::deserialize(QDataStream& stream) { stream >> this->_soundCollectionPath; stream >> this->_currentLanguage; stream >> this->_dataObject; stream >> this->_objectField; - stream >> this->_rangeLimit; + stream >> this->_condition; stream >> this->_sound1; stream >> this->_sound2; stream >> this->_sound3; @@ -252,7 +258,7 @@ void NotificationItem::disposeExpireTimer() int getValuePosition(QString sayOrder) { - return NotificationItem::sayOrderValues.indexOf(sayOrder); + return NotificationItem::sayOrderValues.indexOf(sayOrder)-1; } QString NotificationItem::checkSoundExists(QString fileName) @@ -275,11 +281,16 @@ QString NotificationItem::checkSoundExists(QString fileName) QStringList valueToSoundList(QString value) { + // replace point chr if exists value = value.replace(',', '.'); QStringList numberParts = value.trimmed().split("."); QStringList digitWavs; - + if(numberParts.at(0).toInt()<0) + { + digitWavs.append("moved"); + numberParts[0]=QString::number(numberParts.at(0).toInt()*-1); + } if ( (numberParts.at(0).size() == 1) || (numberParts.at(0).toInt() < 20) ) { // [1] check, is this number < 20, these numbers played by one wav file digitWavs.append(numberParts.at(0)); diff --git a/ground/openpilotgcs/src/plugins/notify/notifyplugin.cpp b/ground/openpilotgcs/src/plugins/notify/notifyplugin.cpp index 5ac05776a..601bd157d 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifyplugin.cpp +++ b/ground/openpilotgcs/src/plugins/notify/notifyplugin.cpp @@ -246,7 +246,7 @@ void SoundNotifyPlugin::on_arrived_Notification(UAVObject *object) // notification can be accepted again; // 2. Once time notifications, they removed immediately after first playing; // 3. Instant notifications(played one by one without interval); - if (ntf->retryString() != "Repeat Instantly" && + if (ntf->retryString() != "Repeat Instantly" && ntf->retryString() != "Repeat Once per update" && ntf->retryString() != "Repeat Once" && ntf->_isPlayed) continue; @@ -345,6 +345,7 @@ void SoundNotifyPlugin::stateChanged(Phonon::State newstate, Phonon::State oldst NotificationItem* notification = _pendingNotifications.takeFirst(); qNotifyDebug_if(notification) << "play audioFree - " << notification->toString(); playNotification(notification); + qNotifyDebug()<<"end playNotification"; } } else { if (newstate == Phonon::ErrorState) { @@ -356,13 +357,13 @@ void SoundNotifyPlugin::stateChanged(Phonon::State newstate, Phonon::State oldst } } -bool checkRange(QString fieldValue, QString enumValue, QStringList values, char direction) +bool checkRange(QString fieldValue, QString enumValue, QStringList values, int direction) { bool ret = false; switch(direction) { - case 'E': + case NotificationItem::equal: ret = !QString::compare(enumValue, fieldValue, Qt::CaseInsensitive) ? true : false; break; @@ -373,21 +374,21 @@ bool checkRange(QString fieldValue, QString enumValue, QStringList values, char return ret; } -bool checkRange(double fieldValue, double min, double max, char direction) +bool checkRange(double fieldValue, double min, double max, int direction) { bool ret = false; Q_ASSERT(min < max); switch(direction) { - case 'E': + case NotificationItem::equal: ret = (fieldValue == min); break; - case 'G': + case NotificationItem::bigger: ret = (fieldValue > min); break; - case 'L': + case NotificationItem::smaller: ret = (fieldValue < min); break; @@ -406,7 +407,7 @@ void SoundNotifyPlugin::checkNotificationRule(NotificationItem* notification, UA if (notification->mute()) return; - QString direction = notification->range(); + int direction = notification->getCondition(); QString fieldName = notification->getObjectField(); UAVObjectField* field = object->getField(fieldName); @@ -415,15 +416,25 @@ void SoundNotifyPlugin::checkNotificationRule(NotificationItem* notification, UA QVariant value = field->getValue(); if(UAVObjectField::ENUM == field->getType()) { + qNotifyDebug()<<"Check range ENUM"<singleValue().toString()<<"|"<getOptions()<<"|"<< + direction<singleValue().toString(), + field->getOptions(), + direction);; condition = checkRange(value.toString(), notification->singleValue().toString(), field->getOptions(), - direction[0].toAscii()); + direction); } else { + qNotifyDebug()<<"Check range VAL"<singleValue().toString()<<"|"<getOptions()<<"|"<< + direction<singleValue().toDouble(), + notification->valueRange2(), + direction); condition = checkRange(value.toDouble(), notification->singleValue().toDouble(), notification->valueRange2(), - direction[0].toAscii()); + direction); } notification->_isPlayed = condition; @@ -431,9 +442,11 @@ void SoundNotifyPlugin::checkNotificationRule(NotificationItem* notification, UA // we should reset _isPlayed flag and stop repeat timer if (!notification->_isPlayed) { notification->stopTimer(); + notification->setCurrentUpdatePlayed(false); return; } - + if(notification->retryString() == "Repeat Once per update" && notification->getCurrentUpdatePlayed()) + return; volatile QMutexLocker lock(&_mutex); if (!playNotification(notification)) { @@ -473,7 +486,10 @@ bool SoundNotifyPlugin::playNotification(NotificationItem* notification) if (notification->retryString() == "Repeat Once") { _toRemoveNotifications.append(_notificationList.takeAt(_notificationList.indexOf(notification))); - } else { + } + else if(notification->retryString() == "Repeat Once per update") + notification->setCurrentUpdatePlayed(true); + else { if (notification->retryString() != "Repeat Instantly") { QRegExp rxlen("(\\d+)"); QString value; @@ -505,7 +521,9 @@ bool SoundNotifyPlugin::playNotification(NotificationItem* notification) ms->setAutoDelete(true); phonon.mo->enqueue(*ms); } + qNotifyDebug()<<"begin play"; phonon.mo->play(); + qNotifyDebug()<<"end play"; phonon.firstPlay = false; // On Linux, you sometimes have to nudge Phonon to play 1 time before // the state is not "Loading" anymore. return true; diff --git a/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.cpp b/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.cpp index 49b274e38..5eaf13efa 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.cpp +++ b/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.cpp @@ -57,7 +57,7 @@ NotifyPluginOptionsPage::NotifyPluginOptionsPage(QObject *parent) : IOptionsPage(parent) , _objManager(*ExtensionSystem::PluginManager::instance()->getObject()) , _owner(qobject_cast(parent)) - , _dynamicFieldLimit(NULL) + , _dynamicFieldCondition(NULL) , _dynamicFieldWidget(NULL) , _dynamicFieldType(-1) , _sayOrder(NULL) @@ -74,7 +74,7 @@ QWidget *NotifyPluginOptionsPage::createPage(QWidget *parent) //main widget QWidget* optionsPageWidget = new QWidget; _dynamicFieldWidget = NULL; - _dynamicFieldLimit = NULL; + _dynamicFieldCondition = NULL; resetFieldType(); //save ref to form, needed for binding dynamic fields in future _form = optionsPageWidget; @@ -224,8 +224,8 @@ void NotifyPluginOptionsPage::addDynamicFieldLayout() labelValueIs->setSizePolicy(labelSizePolicy); _optionsPage->dynamicValueLayout->addWidget(labelValueIs); - _dynamicFieldLimit = new QComboBox(_form); - _optionsPage->dynamicValueLayout->addWidget(_dynamicFieldLimit); + _dynamicFieldCondition = new QComboBox(_form); + _optionsPage->dynamicValueLayout->addWidget(_dynamicFieldCondition); UAVObjectField* field = getObjectFieldFromSelected(); addDynamicField(field); } @@ -245,23 +245,42 @@ void NotifyPluginOptionsPage::addDynamicField(UAVObjectField* objField) return; } - disconnect(_dynamicFieldLimit, SIGNAL(currentIndexChanged(QString)), + disconnect(_dynamicFieldCondition, SIGNAL(currentIndexChanged(QString)), this, SLOT(on_changedIndex_rangeValue(QString))); - _dynamicFieldLimit->clear(); + _dynamicFieldCondition->clear(); QStringList rangeValues; + QList rangeCode; if (UAVObjectField::ENUM == objField->getType()) { rangeValues << cStrEqualTo << cStrInRange; - _dynamicFieldLimit->addItems(rangeValues); - _dynamicFieldLimit->setCurrentIndex(rangeValues.indexOf(_selectedNotification->range())); + rangeCode<addItem(value,rangeCode[x]); + if(_selectedNotification->getCondition()==rangeCode[x]) + selected=x; + ++x; + } + qNotifyDebug()<<"setcurrentindex"<setCurrentIndex(selected); } else { rangeValues << cStrEqualTo << cStrLargeThan << cStrLowerThan << cStrInRange; - _dynamicFieldLimit->addItems(rangeValues); - connect(_dynamicFieldLimit, SIGNAL(currentIndexChanged(QString)), + rangeCode<addItem(value,rangeCode[x]); + if(_selectedNotification->getCondition()==rangeCode[x]) + selected=x; + ++x; + } + qNotifyDebug()<<"setcurrentindex"<setCurrentIndex(selected); + connect(_dynamicFieldCondition, SIGNAL(currentIndexChanged(QString)), this, SLOT(on_changedIndex_rangeValue(QString))); } - addDynamicFieldWidget(objField); } @@ -295,16 +314,16 @@ void NotifyPluginOptionsPage::addDynamicFieldWidget(UAVObjectField* objField) break; default: - Q_ASSERT(_dynamicFieldLimit); - if (_dynamicFieldLimit->currentText() == cStrInRange) { + Q_ASSERT(_dynamicFieldCondition); + if (_dynamicFieldCondition->currentText() == cStrInRange) { _dynamicFieldWidget = new QLineEdit(_form); - (static_cast(_dynamicFieldWidget))->setInputMask("999.99 - 999.99;"); + (static_cast(_dynamicFieldWidget))->setInputMask("#999.99 : #999.99;"); (static_cast(_dynamicFieldWidget))->setText("0000000000"); (static_cast(_dynamicFieldWidget))->setCursorPosition(0); } else { _dynamicFieldWidget = new QDoubleSpinBox(_form); - (dynamic_cast(_dynamicFieldWidget))->setRange(000.00, 999.99); + (dynamic_cast(_dynamicFieldWidget))->setRange(-999.99, 999.99); } break; }; @@ -351,7 +370,8 @@ void NotifyPluginOptionsPage::getOptionsPageValues(NotificationItem* notificatio notification->setSound2(_optionsPage->Sound2->currentText()); notification->setSound3(_optionsPage->Sound3->currentText()); notification->setSayOrder(_sayOrder->currentText()); - notification->setRange(_dynamicFieldLimit->currentText()); + notification->setCondition(_dynamicFieldCondition->itemData(_dynamicFieldCondition->currentIndex()).toInt()); + qNotifyDebug()<<"getOptionsPageValues SETRANGE"<<_dynamicFieldCondition->currentIndex()<<_dynamicFieldCondition->itemData(_dynamicFieldCondition->currentIndex()).toInt(); if (QDoubleSpinBox* spinValue = dynamic_cast(_dynamicFieldWidget)) notification->setSingleValue(spinValue->value()); else { @@ -360,7 +380,7 @@ void NotifyPluginOptionsPage::getOptionsPageValues(NotificationItem* notificatio else { if (QLineEdit* rangeValue = dynamic_cast(_dynamicFieldWidget)) { QString str = rangeValue->text(); - QStringList range = str.split('-'); + QStringList range = str.split(':'); notification->setSingleValue(range.at(0).toDouble()); notification->setValueRange2(range.at(1).toDouble()); } @@ -435,11 +455,12 @@ void NotifyPluginOptionsPage::updateConfigView(NotificationItem* notification) _optionsPage->SoundCollectionList->setCurrentIndex(_optionsPage->SoundCollectionList->findText("default")); _optionsPage->Sound3->setCurrentIndex(_optionsPage->Sound3->findText(notification->getSound3())); } - - if (-1 != _dynamicFieldLimit->findText(notification->range())) { - _dynamicFieldLimit->setCurrentIndex(_dynamicFieldLimit->findText(notification->range())); + for(int x=0;x<_dynamicFieldCondition->count();++x) + { + if (_dynamicFieldCondition->itemData(x)==notification->getCondition()) { + _dynamicFieldCondition->setCurrentIndex(x); + } } - if (-1 != _sayOrder->findText(notification->getSayOrder())) { _sayOrder->setCurrentIndex(_sayOrder->findText(notification->getSayOrder())); } @@ -505,6 +526,7 @@ void NotifyPluginOptionsPage::on_changedIndex_soundLanguage(int index) _optionsPage->Sound1->clear(); _optionsPage->Sound2->clear(); _optionsPage->Sound3->clear(); + _optionsPage->Sound1->addItem(""); _optionsPage->Sound1->addItems(listSoundFiles); _optionsPage->Sound2->addItem(""); _optionsPage->Sound2->addItems(listSoundFiles); diff --git a/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.h b/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.h index b270e72a0..317515aaf 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.h +++ b/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.h @@ -152,7 +152,7 @@ private: QScopedPointer _optionsPage; //! Widget to convinient selection of condition for field value (equal, lower, greater) - QComboBox* _dynamicFieldLimit; + QComboBox* _dynamicFieldCondition; //! Represents edit widget for dynamic UAVObjectfield, //! can be spinbox - for numerics, combobox - enums, or