1
0
mirror of https://bitbucket.org/librepilot/librepilot.git synced 2025-02-21 11:54:15 +01:00
2012-01-09 16:09:50 +00:00

436 lines
14 KiB
C++

/**
******************************************************************************
*
* @file NotificationItem.cpp
* @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010.
* @brief Notify Plugin configuration
* @see The GNU Public License (GPL) Version 3
* @defgroup notifyplugin
* @{
*
*****************************************************************************/
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
//Qt headers
#include <QtCore/QDataStream>
#include <QFile>
// GCS headers
#include "extensionsystem/pluginmanager.h"
#include "utils/pathutils.h"
#include "uavobjectmanager.h"
#include "uavobject.h"
// Notify plugin headers
#include "notificationitem.h"
#include "notifylogging.h"
QStringList NotificationItem::sayOrderValues;
QStringList NotificationItem::retryValues;
NotificationItem::NotificationItem(QObject *parent)
: QObject(parent)
, _currentUpdatePlayed(false)
, isNowPlaying(0)
, _isPlayed(false)
, _timer(NULL)
, _expireTimer(NULL)
, _soundCollectionPath("")
, _currentLanguage("default")
, _dataObject("")
, _objectField("")
, _condition(0)
, _sound1("")
, _sound2("")
, _sound3("")
, _sayOrder(never)
, _singleValue(0)
, _valueRange2(0)
, _repeatValue(repeatInstantly)
, _expireTimeout(eDefaultTimeout)
, _mute(false)
{
NotificationItem::sayOrderValues.clear();
NotificationItem::sayOrderValues.insert(never,QString(tr("Never")));
NotificationItem::sayOrderValues.insert(beforeFirst,QString(tr("Before first")));
NotificationItem::sayOrderValues.insert(beforeSecond,QString(tr("Before second")));
NotificationItem::sayOrderValues.insert(afterSecond,QString(tr("After second")));
NotificationItem::retryValues.clear();
NotificationItem::retryValues.insert(repeatOnce,QString(tr("Repeat Once")));
NotificationItem::retryValues.insert(repeatOncePerUpdate,QString(tr("Repeat Once per update")));
NotificationItem::retryValues.insert(repeatInstantly,QString(tr("Repeat Instantly")));
NotificationItem::retryValues.insert(repeat10seconds,QString(tr("Repeat 10 seconds")));
NotificationItem::retryValues.insert(repeat30seconds,QString(tr("Repeat 30 seconds")));
NotificationItem::retryValues.insert(repeat1minute,QString(tr("Repeat 1 minute")));
}
void NotificationItem::copyTo(NotificationItem* that) const
{
that->isNowPlaying = isNowPlaying;
that->_isPlayed = _isPlayed;
that->_soundCollectionPath = _soundCollectionPath;
that->_currentLanguage = _currentLanguage;
that->_soundCollectionPath = _soundCollectionPath;
that->_dataObject = _dataObject;
that->_objectField = _objectField;
that->_condition = _condition;
that->_sound1 = _sound1;
that->_sound2 = _sound2;
that->_sound3 = _sound3;
that->_sayOrder = _sayOrder;
that->_singleValue = _singleValue;
that->_valueRange2 = _valueRange2;
that->_repeatValue = _repeatValue;
that->_expireTimeout = _expireTimeout;
that->_mute = _mute;
}
void NotificationItem::saveState(QSettings* settings) const
{
settings->setValue("SoundCollectionPath", Utils::PathUtils().RemoveDataPath(getSoundCollectionPath()));
settings->setValue(QLatin1String("CurrentLanguage"), getCurrentLanguage());
settings->setValue(QLatin1String("ObjectField"), getObjectField());
settings->setValue(QLatin1String("DataObject"), getDataObject());
settings->setValue(QLatin1String("RangeLimit"), getCondition());
settings->setValue(QLatin1String("Value1"), singleValue());
settings->setValue(QLatin1String("Value2"), valueRange2());
settings->setValue(QLatin1String("Sound1"), getSound1());
settings->setValue(QLatin1String("Sound2"), getSound2());
settings->setValue(QLatin1String("Sound3"), getSound3());
settings->setValue(QLatin1String("SayOrder"), getSayOrder());
settings->setValue(QLatin1String("Repeat"), retryValue());
settings->setValue(QLatin1String("ExpireTimeout"), lifetime());
settings->setValue(QLatin1String("Mute"), mute());
}
void NotificationItem::restoreState(QSettings* settings)
{
//settings = Core::ICore::instance()->settings();
setSoundCollectionPath(Utils::PathUtils().InsertDataPath(settings->value(QLatin1String("SoundCollectionPath"), tr("")).toString()));
setCurrentLanguage(settings->value(QLatin1String("CurrentLanguage"), tr("")).toString());
setDataObject(settings->value(QLatin1String("DataObject"), tr("")).toString());
setObjectField(settings->value(QLatin1String("ObjectField"), 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());
setSayOrder(settings->value(QLatin1String("SayOrder"), tr("")).toInt());
QVariant value = settings->value(QLatin1String("Value1"), tr(""));
setSingleValue(value);
setValueRange2(settings->value(QLatin1String("Value2"), tr("")).toDouble());
setRetryValue(settings->value(QLatin1String("Repeat"), tr("")).toInt());
setLifetime(settings->value(QLatin1String("ExpireTimeout"), tr("")).toInt());
setMute(settings->value(QLatin1String("Mute"), tr("")).toInt());
}
void NotificationItem::serialize(QDataStream& stream)
{
stream << this->_soundCollectionPath;
stream << this->_currentLanguage;
stream << this->_dataObject;
stream << this->_objectField;
stream << this->_condition;
qNotifyDebug()<<"getOptionsPageValues seriaize"<<_condition;
stream << this->_sound1;
stream << this->_sound2;
stream << this->_sound3;
stream << this->_sayOrder;
stream << this->_singleValue;
stream << this->_valueRange2;
stream << this->_repeatValue;
stream << this->_expireTimeout;
stream << this->_mute;
}
void NotificationItem::deserialize(QDataStream& stream)
{
stream >> this->_soundCollectionPath;
stream >> this->_currentLanguage;
stream >> this->_dataObject;
stream >> this->_objectField;
stream >> this->_condition;
stream >> this->_sound1;
stream >> this->_sound2;
stream >> this->_sound3;
stream >> this->_sayOrder;
stream >> this->_singleValue;
stream >> this->_valueRange2;
stream >> this->_repeatValue;
stream >> this->_expireTimeout;
stream >> this->_mute;
}
void NotificationItem::startTimer(int msec)
{
if (!_timer) {
_timer = new QTimer(this);
_timer->setInterval(msec);
}
if (!_timer->isActive())
_timer->start();
}
void NotificationItem::restartTimer()
{
if (!_timer) {
if (!_timer->isActive())
_timer->start();
}
}
void NotificationItem::stopTimer()
{
if (_timer) {
if (_timer->isActive())
_timer->stop();
}
}
void NotificationItem::disposeTimer()
{
if (_timer) {
_timer->stop();
delete _timer;
_timer = NULL;
}
}
void NotificationItem::startExpireTimer()
{
if (!_expireTimer) {
_expireTimer = new QTimer(this);
}
_expireTimer->start(_expireTimeout * 1000);
}
void NotificationItem::stopExpireTimer()
{
if (_expireTimer) {
if (_expireTimer)
_expireTimer->stop();
}
}
void NotificationItem::disposeExpireTimer()
{
if (_expireTimer) {
_expireTimer->stop();
delete _expireTimer;
_expireTimer = NULL;
}
}
int getValuePosition(QString sayOrder)
{
return NotificationItem::sayOrderValues.indexOf(sayOrder)-1;
}
QString NotificationItem::checkSoundExists(QString fileName)
{
QString name(fileName + ".wav");
QString filePath = QDir::toNativeSeparators(getSoundCollectionPath() + "/" +
getCurrentLanguage() + "/" +
name);
if(QFile::exists(filePath))
return filePath;
else {
filePath = QDir::toNativeSeparators(getSoundCollectionPath() +
"/default/" +
name);
if(!QFile::exists(filePath))
filePath.clear();
}
return filePath;
}
QStringList valueToSoundList(QString value)
{
qNotifyDebug()<<"notificationItem valueToSoundList input param"<<value;
// replace point chr if exists
value = value.replace(',', '.');
QStringList numberParts = value.trimmed().split(".");
QStringList digitWavs;
bool negative=false;
if(numberParts.at(0).toInt()<0)
{
negative=true;
digitWavs.append("minus");
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));
} else {
int i=0;
// [2] store two lowest digits of number
int num = numberParts.at(0).right(2).toInt();
if (num < 20 && num != 0) {
// store eighter number in range [0...10) or in range [10...20)
digitWavs.append(numberParts.at(0).right(1 + num/11));
i=2;
}
// [3] prepend 100 and 1000 digits of number
for (;i<numberParts.at(0).size();i++)
{
int offset=0;
if(negative)
offset=1;
digitWavs.insert(offset,numberParts.at(0).at(numberParts.at(0).size()-i-1));
if(digitWavs.at(offset)==QString("0")) {
digitWavs.removeAt(offset);
continue;
}
if (i==1)
digitWavs.replace(0+offset,digitWavs.at(offset)+'0');
if (i==2)
digitWavs.insert(1+offset,"100");
if (i==3)
digitWavs.insert(1+offset,"1000");
}
}
// check, is there fractional part of number?
if (1 < numberParts.size()) {
digitWavs.append("point");
if (numberParts.at(1).size()==1) {
// this mean -> number < 1
digitWavs.append(numberParts.at(1));
} else {
// append fractional part of number
QString left = numberParts.at(1).left(1);
(left == "0") ? digitWavs.append(left) : digitWavs.append(left + '0');
digitWavs.append(numberParts.at(1).right(1));
}
}
qNotifyDebug()<<"notificationItem valueToSoundList return value"<<digitWavs;
return digitWavs;
}
QString stringFromValue(QVariant value, UAVObjectField* field)
{
if(field==NULL)
return "";
Q_ASSERT(field);
Q_ASSERT(!value.isNull());
QString str;
if (UAVObjectField::ENUM == field->getType()) {
if(!field->getOptions().contains(value.toString()))
return QString();
str = value.toString();
} else {
str = QString("%L1").arg(value.toDouble());
}
return str;
}
QString NotificationItem::toString()
{
QString str;
UAVObjectField* field = getUAVObjectField();
QString value = stringFromValue(singleValue(), field);
int pos = getSayOrder()-1;
QStringList lst;
lst.append(getSoundCaption(getSound1()));
lst.append(getSoundCaption(getSound2()));
lst.append(getSoundCaption(getSound3()));
QStringList valueSounds = valueToSoundList(value);
bool missed = false;
foreach(QString sound, valueSounds) {
if(checkSoundExists(sound).isEmpty()) {
missed = true;
break;
}
}
// if not "Never" case
if(-1 != pos) {
if(missed)
lst.insert(pos, "[missed]" + value);
else
lst.insert(pos, value);
}
str = lst.join(" ");
return str;
}
QStringList& NotificationItem::toSoundList()
{
// tips:
// check of *.wav files exist needed for playing phonon queues;
// if phonon player don't find next file in queue, it buzz
UAVObjectField* field = getUAVObjectField();
QString value = stringFromValue(singleValue(), field);
// generate queue of sound files to play
_messageSequence.clear();
int pos = getSayOrder()-1;
QStringList lst;
if(!getSound1().isEmpty())
lst.append(getSound1());
if(!getSound2().isEmpty())
lst.append(getSound2());
if(!getSound3().isEmpty())
lst.append(getSound3());
// if not "Never" case
if(-1 != pos) {
QStringList valueSounds = valueToSoundList(value);
foreach(QString sound, valueSounds)
lst.insert(pos++, sound);
}
foreach(QString sound, lst) {
QString path = checkSoundExists(sound);
if (!path.isEmpty()) {
_messageSequence.append(path);
} else {
_messageSequence.clear();
break;
}
}
return _messageSequence;
}
QString NotificationItem::getSoundCaption(QString fileName)
{
if(fileName.isEmpty()) return QString();
if(checkSoundExists(fileName).isEmpty()) {
return QString("[missed]") + fileName;
}
return fileName;
}
UAVObjectField* NotificationItem::getUAVObjectField() {
return getUAVObject()->getField(getObjectField());
}
UAVDataObject* NotificationItem::getUAVObject() {
return dynamic_cast<UAVDataObject*>((ExtensionSystem::PluginManager::instance()->getObject<UAVObjectManager>())->getObject(getDataObject()));
}