From 3af398d7f9d62f5c78a350afe5d1f8e69f1eea41 Mon Sep 17 00:00:00 2001 From: Nickolay Date: Thu, 15 Sep 2011 00:38:18 +0300 Subject: [PATCH 001/121] initial changes --- ground/ground.pro.user.2.1pre1 | 311 ++++++++++++++++++ .../internals/projections/lks94projection.h | 2 +- .../src/plugins/notify/NotificationItem.h | 154 +++++++++ .../src/plugins/notify/notify.pro | 4 +- .../src/plugins/notify/notifyitemdelegate.cpp | 225 +++++++------ .../src/plugins/notify/notifyitemdelegate.h | 28 +- .../src/plugins/notify/notifyplugin.cpp | 137 ++++---- .../src/plugins/notify/notifyplugin.h | 34 +- .../notify/notifypluginconfiguration.cpp | 118 ++++--- .../notify/notifypluginconfiguration.h | 122 ------- .../notify/notifypluginoptionspage.cpp | 210 +++++------- .../plugins/notify/notifypluginoptionspage.h | 21 +- .../plugins/notify/notifypluginoptionspage.ui | 18 +- .../src/plugins/notify/notifytablemodel.cpp | 47 +-- .../src/plugins/notify/notifytablemodel.h | 24 +- openpilotgcs.bat | 3 + 16 files changed, 865 insertions(+), 593 deletions(-) create mode 100644 ground/ground.pro.user.2.1pre1 create mode 100644 ground/openpilotgcs/src/plugins/notify/NotificationItem.h delete mode 100644 ground/openpilotgcs/src/plugins/notify/notifypluginconfiguration.h create mode 100644 openpilotgcs.bat diff --git a/ground/ground.pro.user.2.1pre1 b/ground/ground.pro.user.2.1pre1 new file mode 100644 index 000000000..0a2acf277 --- /dev/null +++ b/ground/ground.pro.user.2.1pre1 @@ -0,0 +1,311 @@ + + + + ProjectExplorer.Project.ActiveTarget + 0 + + + ProjectExplorer.Project.EditorSettings + + System + + + + ProjectExplorer.Project.Target.0 + + Desktop + Qt4ProjectManager.Target.DesktopTarget + 0 + 0 + + + qmake + QtProjectManager.QMakeBuildStep + + + + Make + Qt4ProjectManager.MakeStep + false + + + + 2 + + Make + Qt4ProjectManager.MakeStep + true + + clean + + + + 1 + false + + Qt in PATH Debug + Qt4ProjectManager.Qt4BuildConfiguration + 2 + D:/!Work/OpenSource/OpenPilot/op/OpenPilot/ground-build + 2 + 2 + true + + + + qmake + QtProjectManager.QMakeBuildStep + + + + Make + Qt4ProjectManager.MakeStep + false + + + + 2 + + Make + Qt4ProjectManager.MakeStep + true + + clean + + + + 1 + false + + Qt in PATH Release + Qt4ProjectManager.Qt4BuildConfiguration + 0 + D:/!Work/OpenSource/OpenPilot/op/OpenPilot/ground-build + 2 + 2 + true + + + + qmake + QtProjectManager.QMakeBuildStep + + + + Make + Qt4ProjectManager.MakeStep + false + + + + 2 + + Make + Qt4ProjectManager.MakeStep + true + + clean + + + + 1 + false + + 4.6.2 Debug + Qt4ProjectManager.Qt4BuildConfiguration + 2 + D:/!Work/OpenSource/OpenPilot/op/OpenPilot/ground-build + 13 + 2 + true + + + + qmake + QtProjectManager.QMakeBuildStep + + + + Make + Qt4ProjectManager.MakeStep + false + + + + 2 + + Make + Qt4ProjectManager.MakeStep + true + + clean + + + + 1 + false + + 4.6.2 Release + Qt4ProjectManager.Qt4BuildConfiguration + 0 + D:/!Work/OpenSource/OpenPilot/op/OpenPilot/ground-build + 13 + 2 + true + + 4 + + bin + Qt4ProjectManager.Qt4RunConfiguration + 2 + + openpilotgcs/bin/bin.pro + false + false + + false + false + + + + translations + Qt4ProjectManager.Qt4RunConfiguration + 2 + + openpilotgcs/share/openpilotgcs/translations/translations.pro + false + false + + false + false + + + + uavobjgenerator + Qt4ProjectManager.Qt4RunConfiguration + 2 + + uavobjgenerator/uavobjgenerator.pro + false + false + + false + false + + + + app + Qt4ProjectManager.Qt4RunConfiguration + 2 + + openpilotgcs/src/app/app.pro + false + false + + false + false + + + + berkeley + Qt4ProjectManager.Qt4RunConfiguration + 2 + + openpilotgcs/src/libs/libqxt/src/berkeley/berkeley.pro + false + false + + false + false + + + + designer + Qt4ProjectManager.Qt4RunConfiguration + 2 + + openpilotgcs/src/libs/libqxt/src/designer/designer.pro + false + false + + false + false + + + + gui + Qt4ProjectManager.Qt4RunConfiguration + 2 + + openpilotgcs/src/libs/libqxt/src/gui/gui.pro + false + false + + false + false + + + + network + Qt4ProjectManager.Qt4RunConfiguration + 2 + + openpilotgcs/src/libs/libqxt/src/network/network.pro + false + false + + false + false + + + + sql + Qt4ProjectManager.Qt4RunConfiguration + 2 + + openpilotgcs/src/libs/libqxt/src/sql/sql.pro + false + false + + false + false + + + + web + Qt4ProjectManager.Qt4RunConfiguration + 2 + + openpilotgcs/src/libs/libqxt/src/web/web.pro + false + false + + false + false + + + + zeroconf + Qt4ProjectManager.Qt4RunConfiguration + 2 + + openpilotgcs/src/libs/libqxt/src/zeroconf/zeroconf.pro + false + false + + false + false + + + 11 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 4 + + diff --git a/ground/openpilotgcs/src/libs/opmapcontrol/src/internals/projections/lks94projection.h b/ground/openpilotgcs/src/libs/opmapcontrol/src/internals/projections/lks94projection.h index 4eee20aaa..dc895f04c 100644 --- a/ground/openpilotgcs/src/libs/opmapcontrol/src/internals/projections/lks94projection.h +++ b/ground/openpilotgcs/src/libs/opmapcontrol/src/internals/projections/lks94projection.h @@ -28,7 +28,7 @@ #define LKS94PROJECTION_H #include #include "cmath" -#include "../pureprojection.h" +#include "D:\!Work\OpenSource\OpenPilot\OpenPilot\ground\openpilotgcs\src\libs\opmapcontrol\src\internals\pureprojection.h" namespace projections { diff --git a/ground/openpilotgcs/src/plugins/notify/NotificationItem.h b/ground/openpilotgcs/src/plugins/notify/NotificationItem.h new file mode 100644 index 000000000..c09e64982 --- /dev/null +++ b/ground/openpilotgcs/src/plugins/notify/NotificationItem.h @@ -0,0 +1,154 @@ +/** + ****************************************************************************** + * + * @file NotificationItem.h + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. + * @brief Notify Plugin configuration header + * @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 + */ + + +#ifndef NOTIFICATION_ITEM_H +#define NOTIFICATION_ITEM_H + +#include +#include "qsettings.h" +#include +#include + +using namespace Core; + +#define DECLARE_SOUND(number) \ + QString getSound##number() const { return _sound##number; } \ + void setSound##number(QString text) { _sound##number = text; } \ + +// QString getSound2() const { return _sound2; } +// void setSound2(QString text) { _sound2 = text; } + +// QString getSound3() const { return _sound3; } +// void setSound3(QString text) { _sound3 = text; } + +class NotificationItem : public QObject +{ + Q_OBJECT +public: + explicit NotificationItem(QObject *parent = 0); + + void copyTo(NotificationItem*) const; + + DECLARE_SOUND(1) + DECLARE_SOUND(2) + DECLARE_SOUND(3) + + QString getValue() const { return _dataValue; } + void setValue(QString text) { _dataValue = text; } + + QString getSayOrder() const { return _sayOrder; } + void setSayOrder(QString text) { _sayOrder = text; } + + double getSpinBoxValue() const { return _spinBoxValue; } + void setSpinBoxValue(double value) { _spinBoxValue = value; } + + + QString getDataObject() const { return _dataObject; } + void setDataObject(QString text) { _dataObject = text; } + + QString getObjectField() const { return _objectField; } + void setObjectField(QString text) { _objectField = text; } + + QString getSoundCollectionPath() const { return _soundCollectionPath; } + void setSoundCollectionPath(QString path) { _soundCollectionPath = path; } + + QString getCurrentLanguage() const { return _currentLanguage; } + void setCurrentLanguage(QString text) { _currentLanguage = text; } + + QStringList getMessageSequence() const { return _messageSequence; } + void setMessageSequence(QStringList sequence) { _messageSequence = sequence; } + + QString getRepeatFlag() const { return _repeatString; } + void setRepeatFlag(QString value) { _repeatString = value; } + + bool getRepeatTimeout() const { return _repeatTimeout; } + void setRepeatTimeout(bool value) { _repeatTimeout = value; } + + int getExpireTimeout() const { return _expireTimeout; } + void setExpireTimeout(int value) { _expireTimeout = value; } + + bool getEnableFlag() const { return _enableFlag; } + void setEnableFlag(bool value) { _enableFlag = value; } + + void saveState(QSettings* settings) const; + void restoreState(QSettings* settings); + QString parseNotifyMessage(); + + QTimer* timer; + QTimer* expireTimer; + bool isNowPlaying; // + bool firstStart; + +private: + + QStringList _messageSequence; + + //! path to folder with sound files + QString _soundCollectionPath; + + //! language in what notifications will be spelled + QString _currentLanguage; + + //! one UAV object per one notification + QString _dataObject; + + //! one field value change can be assigned to one notification + QString _objectField; + + //! poled UAV field value + QString _dataValue; + + //! possible sounds(at least one required to play notification) + QString _sound1; + QString _sound2; + QString _sound3; + + //! order in what sounds 1-3 will be played + QString _sayOrder; + + double _spinBoxValue; + + QString _repeatString; + + //! time when next notification must be fired + bool _repeatTimeout; + + //! how often or what periodicaly notification should be played + int _repeatTimerValue; + + //! time after event occured till notification became invalid + //! and will be removed from list + int _expireTimeout; + + //! enables/disables playing of current notification + bool _enableFlag; +}; + +Q_DECLARE_METATYPE(NotificationItem*) + +#endif // NotificationItem_H diff --git a/ground/openpilotgcs/src/plugins/notify/notify.pro b/ground/openpilotgcs/src/plugins/notify/notify.pro index 9ebebfa22..e70392a6a 100644 --- a/ground/openpilotgcs/src/plugins/notify/notify.pro +++ b/ground/openpilotgcs/src/plugins/notify/notify.pro @@ -10,9 +10,9 @@ QT += phonon HEADERS += notifyplugin.h \ notifypluginoptionspage.h \ - notifypluginconfiguration.h \ notifyitemdelegate.h \ - notifytablemodel.h + notifytablemodel.h \ + NotificationItem.h SOURCES += notifyplugin.cpp \ notifypluginoptionspage.cpp \ diff --git a/ground/openpilotgcs/src/plugins/notify/notifyitemdelegate.cpp b/ground/openpilotgcs/src/plugins/notify/notifyitemdelegate.cpp index 7a2fc2ef4..d6e5161fc 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifyitemdelegate.cpp +++ b/ground/openpilotgcs/src/plugins/notify/notifyitemdelegate.cpp @@ -25,136 +25,135 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#include "notifyitemdelegate.h" #include +#include "notifyitemdelegate.h" +#include "notifytablemodel.h" - NotifyItemDelegate::NotifyItemDelegate(QStringList items,QObject *parent) - : QItemDelegate(parent), - m_parent(parent), - m_items(items) { +NotifyItemDelegate::NotifyItemDelegate(QStringList items, QObject* parent) + : QItemDelegate(parent) + , _parent(parent) + , _items(items) +{ - } +} - QWidget *NotifyItemDelegate::createEditor(QWidget *parent, - const QStyleOptionViewItem &, - const QModelIndex &index) const - { - if (index.column() == 1) { - QComboBox* editor = new QComboBox(parent); - editor->clear(); - editor->addItems(m_items); - //repeatEditor->setCurrentIndex(0); - //repeatEditor->setItemDelegate(new RepeatCounterDelegate()); - - //connect(repeatEditor,SIGNAL(activated (const QString& )),this,SLOT(selectRow(const QString& ))); - //QTableWidgetItem* item = qobject_cast(parent); - //((QTableWidgetItem*)parent)->setSelected(true); -// connect(editor, SIGNAL(editingFinished()), -// this, SLOT(commitAndCloseEditor())); - return editor; - } else - { - if(index.column() == 2) - { - QSpinBox* editor = new QSpinBox(parent); - connect(editor, SIGNAL(editingFinished()), - this, SLOT(commitAndCloseEditor())); - return editor; - } - - } - QLineEdit *editor = new QLineEdit(parent); -// connect(editor, SIGNAL(editingFinished()), -// this, SLOT(commitAndCloseEditor())); - return editor; - } - - void NotifyItemDelegate::commitAndCloseEditor() - { - QLineEdit *editor = qobject_cast(sender()); - if (editor) - { - emit commitData(editor); - emit closeEditor(editor); - - } else { - QComboBox* editor = qobject_cast(sender()); - if (editor) - { - emit commitData(editor); - emit closeEditor(editor); - } else { - QSpinBox* editor = qobject_cast(sender()); - if (editor) - { - emit commitData(editor); - emit closeEditor(editor); - } - } - } - } - - void NotifyItemDelegate::setEditorData(QWidget *editor, - const QModelIndex &index) const - { - QLineEdit *edit = qobject_cast(editor); - if (edit) { - edit->setText(index.model()->data(index, Qt::EditRole).toString()); - } else { - QComboBox * repeatEditor = qobject_cast(editor); - if (repeatEditor) - repeatEditor->setCurrentIndex(repeatEditor->findText(index.model()->data(index, Qt::EditRole).toString())); - else { - QSpinBox * expireEditor = qobject_cast(editor); - if (expireEditor) - expireEditor->setValue(index.model()->data(index, Qt::EditRole).toInt()); - } - } - } - - void NotifyItemDelegate::setModelData(QWidget *editor, - QAbstractItemModel *model, const QModelIndex &index) const - { - QLineEdit *edit = qobject_cast(editor); - if (edit) { - model->setData(index, edit->text()); - } else { - QComboBox * repeatEditor = qobject_cast(editor); - if (repeatEditor) { - model->setData(index, repeatEditor->currentText()); - - } else { - QSpinBox * expireEditor = qobject_cast(editor); - if (expireEditor) { - //expireEditor->interpretText(); - model->setData(index, expireEditor->value(), Qt::EditRole); +QWidget *NotifyItemDelegate::createEditor(QWidget* parent, + const QStyleOptionViewItem& /*none*/, + const QModelIndex& index) const +{ + if(eREPEAT_VALUE == index.column()) { + QComboBox* editor = new QComboBox(parent); + editor->clear(); + editor->addItems(_items); + return editor; + } else { + if(eEXPIRE_TIME == index.column()) { + QSpinBox* editor = new QSpinBox(parent); + connect(editor, SIGNAL(editingFinished()), this, SLOT(commitAndCloseEditor())); + return editor; + } else { + if(eENABLE_NOTIFICATION == index.column()) { + QCheckBox* editor = new QCheckBox(parent); + connect(editor, SIGNAL(editingFinished()), this, SLOT(commitAndCloseEditor())); + return editor; } - } - } - } + } + } + QLineEdit *editor = new QLineEdit(parent); + return editor; +} +void NotifyItemDelegate::commitAndCloseEditor() +{ + QLineEdit* editor = qobject_cast(sender()); + if (editor) { + emit commitData(editor); + emit closeEditor(editor); + } else { + QComboBox* editor = qobject_cast(sender()); + if (editor) + { + emit commitData(editor); + emit closeEditor(editor); + } else { + QSpinBox* editor = qobject_cast(sender()); + if (editor) + { + emit commitData(editor); + emit closeEditor(editor); + } else { + QCheckBox* editor = qobject_cast(sender()); + if (editor) + { + emit commitData(editor); + emit closeEditor(editor); + } + } + } + } +} + +void NotifyItemDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const +{ + QLineEdit* edit = qobject_cast(editor); + if(edit) { + edit->setText(index.model()->data(index, Qt::EditRole).toString()); + } else { + QComboBox* repeatEditor = qobject_cast(editor); + if(repeatEditor) + repeatEditor->setCurrentIndex(repeatEditor->findText(index.model()->data(index, Qt::EditRole).toString())); + else { + QSpinBox* expireEditor = qobject_cast(editor); + if(expireEditor) + expireEditor->setValue(index.model()->data(index, Qt::EditRole).toInt()); + else { + QCheckBox* enablePlayEditor = qobject_cast(editor); + if (enablePlayEditor) + enablePlayEditor->setChecked(index.model()->data(index, Qt::EditRole).toBool()); + } + } + } +} + +void NotifyItemDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const +{ + QLineEdit *edit = qobject_cast(editor); + if(edit) { + model->setData(index, edit->text()); + } else { + QComboBox * repeatEditor = qobject_cast(editor); + if(repeatEditor) { + model->setData(index, repeatEditor->currentText()); + } else { + QSpinBox * expireEditor = qobject_cast(editor); + if(expireEditor) { + model->setData(index, expireEditor->value(), Qt::EditRole); + } else { + QCheckBox* enablePlayEditor = qobject_cast(editor); + if (enablePlayEditor) { + model->setData(index, enablePlayEditor->isChecked(), Qt::EditRole); + } + } + } + } +} void NotifyItemDelegate::selectRow(const QString & text) { - //QList list = ((QTableWidget*)(sender()->parent()))->findItems(text,Qt::MatchExactly); QComboBox* combo = qobject_cast(sender()); QTableWidget* table = new QTableWidget; table = (QTableWidget*)(combo->parent()); - qDebug()<columnCount(); - qDebug()<rowCount(); - qDebug()<currentRow(); - //table->setCurrentIndex(1); - //table->findItems(text,Qt::MatchExactly); - //item->model()->index() - //item->setSelected(true); + + qDebug() << table->columnCount(); + qDebug() << table->rowCount(); + qDebug() << table->currentRow(); } -QSize NotifyItemDelegate::sizeHint ( const QStyleOptionViewItem & option, - const QModelIndex & index ) const +QSize NotifyItemDelegate::sizeHint(const QStyleOptionViewItem & option, + const QModelIndex & index) const { QSize s = QItemDelegate::sizeHint(option, index); s.setHeight(10); - return s; } diff --git a/ground/openpilotgcs/src/plugins/notify/notifyitemdelegate.h b/ground/openpilotgcs/src/plugins/notify/notifyitemdelegate.h index 40d6ced20..01fa0794d 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifyitemdelegate.h +++ b/ground/openpilotgcs/src/plugins/notify/notifyitemdelegate.h @@ -31,21 +31,6 @@ #include #include -//class RepeatCounterDelegate : public QItemDelegate -//{ -// Q_OBJECT - -//public: -// RepeatCounterDelegate(QObject *parent = 0); -// QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &, -// const QModelIndex &index) const; -// void setEditorData(QWidget *editor, const QModelIndex &index) const; -// void setModelData(QWidget *editor, QAbstractItemModel *model, -// const QModelIndex &index) const; - -//private slots: -// void commitAndCloseEditor(); -//}; class NotifyItemDelegate : public QItemDelegate { @@ -58,19 +43,16 @@ public: void setEditorData(QWidget *editor, const QModelIndex &index) const; void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const; -// bool editorEvent(QEvent * event, QAbstractItemModel * model, -// const QStyleOptionViewItem & option, const QModelIndex & index ); QSize sizeHint ( const QStyleOptionViewItem & option, const QModelIndex & index ) const; -private: - QObject* m_parent; - QStringList m_items; - QComboBox* repeatEditor; - - private slots: void selectRow(const QString & text); void commitAndCloseEditor(); + +private: + QObject* _parent; + QStringList _items; + }; #endif // NOTIFYITEMDELEGATE_H diff --git a/ground/openpilotgcs/src/plugins/notify/notifyplugin.cpp b/ground/openpilotgcs/src/plugins/notify/notifyplugin.cpp index 8735f8b60..c959925b4 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifyplugin.cpp +++ b/ground/openpilotgcs/src/plugins/notify/notifyplugin.cpp @@ -26,7 +26,7 @@ */ #include "notifyplugin.h" -#include "notifypluginconfiguration.h" +#include "notificationitem.h" #include "notifypluginoptionspage.h" #include #include @@ -37,15 +37,29 @@ #include #include "qxttimer.h" +#include "backendcapabilities.h" static const QString VERSION = "1.0.0"; //#define DEBUG_NOTIFIES +#ifdef DEBUG_NOTIFIES +QDebug qNotifyDebug() +#endif +#ifndef DEBUG_NOTIFIES +QNoDebug qNotifyDebug() +#endif +{ +#ifdef DEBUG_NOTIFIES + return qDebug(); +#endif + return QNoDebug(); +} + SoundNotifyPlugin::SoundNotifyPlugin() { - phonon.mo = NULL; - configured = false; + phonon.mo = NULL; + configured = false; // Do nothing } @@ -121,7 +135,7 @@ void SoundNotifyPlugin::readConfig( QSettings* settings, UAVConfigInfo *configIn int size = settings->beginReadArray("listNotifies"); for (int i = 0; i < size; ++i) { settings->setArrayIndex(i); - NotifyPluginConfiguration* notification = new NotifyPluginConfiguration; + NotificationItem* notification = new NotificationItem; notification->restoreState(settings); lstNotifications.append(notification); } @@ -145,7 +159,7 @@ void SoundNotifyPlugin::readConfig_0_0_0(){ int size = settings->beginReadArray("listNotifies"); for (int i = 0; i < size; ++i) { settings->setArrayIndex(i); - NotifyPluginConfiguration* notification = new NotifyPluginConfiguration; + NotificationItem* notification = new NotificationItem; notification->restoreState(settings); lstNotifications.append(notification); } @@ -185,7 +199,7 @@ void SoundNotifyPlugin::onAutopilotDisconnect() void SoundNotifyPlugin::resetNotification(void) { //first, reject empty args and unknown fields. - foreach(NotifyPluginConfiguration* notify,lstNotifications) { + foreach(NotificationItem* notify,lstNotifications) { if(notify->timer) { disconnect(notify->timer, SIGNAL(timeout()), this, SLOT(repeatTimerHandler())); @@ -207,7 +221,7 @@ void SoundNotifyPlugin::resetNotification(void) update list of notifies; will be perform on OK or APPLY press of option page */ -void SoundNotifyPlugin::updateNotificationList(QList list) +void SoundNotifyPlugin::updateNotificationList(QList list) { removedNotifies.clear(); resetNotification(); @@ -224,10 +238,10 @@ void SoundNotifyPlugin::connectNotifications() if (obj != NULL) disconnect(obj,SIGNAL(objectUpdated(UAVObject*)),this,SLOT(appendNotification(UAVObject*))); } - if(phonon.mo != NULL) { - delete phonon.mo; - phonon.mo = NULL; - } + if(phonon.mo != NULL) { + delete phonon.mo; + phonon.mo = NULL; + } if(!enableSound) return; @@ -240,25 +254,10 @@ void SoundNotifyPlugin::connectNotifications() removedNotifies.clear(); //first, reject empty args and unknown fields. - foreach(NotifyPluginConfiguration* notify,lstNotifications) { + foreach(NotificationItem* notify, lstNotifications) { notify->firstStart=true; notify->isNowPlaying=false; -// if(notify->timer) -// { -// disconnect(notify->timer, SIGNAL(timeout()), this, SLOT(repeatTimerHandler())); -// notify->timer->stop(); -// delete notify->timer; -// notify->timer = NULL; -// } -// if(notify->expireTimer) -// { -// disconnect(notify->expireTimer, SIGNAL(timeout()), this, SLOT(expireTimerHandler())); -// notify->expireTimer->stop(); -// delete notify->expireTimer; -// notify->expireTimer = NULL; -// } - UAVDataObject* obj = dynamic_cast( objManager->getObject(notify->getDataObject()) ); if (obj != NULL ) { if(!lstNotifiedUAVObjects.contains(obj)) { @@ -269,27 +268,25 @@ void SoundNotifyPlugin::connectNotifications() std::cout << "Error: Object is unknown (" << notify->getDataObject().toStdString() << ")." << std::endl; } - if(lstNotifications.isEmpty()) return; - // set notification message to current event - phonon.mo = Phonon::createPlayer(Phonon::NotificationCategory); - phonon.mo->clearQueue(); - phonon.firstPlay = true; -#ifdef DEBUG_NOTIFIES - QList audioOutputDevices = - Phonon::BackendCapabilities::availableAudioOutputDevices(); - foreach(Phonon::AudioOutputDevice dev, audioOutputDevices) { - qDebug() << "Notify: Audio Output device: " << dev.name() << " - " << dev.description(); - } -#endif - connect(phonon.mo,SIGNAL(stateChanged(Phonon::State,Phonon::State)), - this,SLOT(stateChanged(Phonon::State,Phonon::State))); + if(lstNotifications.isEmpty()) return; + // set notification message to current event + phonon.mo = Phonon::createPlayer(Phonon::NotificationCategory); + phonon.mo->clearQueue(); + phonon.firstPlay = true; + QList audioOutputDevices = + Phonon::BackendCapabilities::availableAudioOutputDevices(); + foreach(Phonon::AudioOutputDevice dev, audioOutputDevices) { + qNotifyDebug() << "Notify: Audio Output device: " << dev.name() << " - " << dev.description(); + } + connect(phonon.mo, SIGNAL(stateChanged(Phonon::State,Phonon::State)), + this, SLOT(stateChanged(Phonon::State,Phonon::State))); } void SoundNotifyPlugin::appendNotification(UAVObject *object) { disconnect(object, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(appendNotification(UAVObject*))); - foreach(NotifyPluginConfiguration* notification, lstNotifications) { + foreach(NotificationItem* notification, lstNotifications) { if(object->getName()!=notification->getDataObject()) continue; @@ -306,7 +303,7 @@ void SoundNotifyPlugin::appendNotification(UAVObject *object) } -void SoundNotifyPlugin::checkNotificationRule(NotifyPluginConfiguration* notification, UAVObject* object) +void SoundNotifyPlugin::checkNotificationRule(NotificationItem* notification, UAVObject* object) { bool condition=false; double threshold; @@ -350,7 +347,7 @@ void SoundNotifyPlugin::checkNotificationRule(NotifyPluginConfiguration* notific #endif // if audio is busy, start expiration timer //ms = (notification->getExpiredTimeout()[in sec])*1000 - //QxtTimer::singleShot(notification->getExpireTimeout()*1000, this, SLOT(expirationTimerHandler(NotifyPluginConfiguration*)), qVariantFromValue(notification)); + //QxtTimer::singleShot(notification->getExpireTimeout()*1000, this, SLOT(expirationTimerHandler(NotificationItem*)), qVariantFromValue(notification)); pendingNotifications.append(notification); if(!notification->expireTimer) { @@ -363,21 +360,22 @@ void SoundNotifyPlugin::checkNotificationRule(NotifyPluginConfiguration* notific } } -bool SoundNotifyPlugin::playNotification(NotifyPluginConfiguration* notification) +bool SoundNotifyPlugin::playNotification(NotificationItem* notification) { // Check: race condition, if phonon.mo got deleted don't go further if (phonon.mo == NULL) return false; + if(!notification->getEnableFlag()) return true; + #ifdef DEBUG_NOTIFIES qDebug() << "Phonon State: " << phonon.mo->state(); #endif - if((phonon.mo->state()==Phonon::PausedState) || - (phonon.mo->state()==Phonon::StoppedState) || - phonon.firstPlay) + if((phonon.mo->state()==Phonon::PausedState) + || (phonon.mo->state()==Phonon::StoppedState) + || phonon.firstPlay) { // don't fire expire timer - //notification->expire = false; nowPlayingConfiguration = notification; if(notification->expireTimer) notification->expireTimer->stop(); @@ -385,7 +383,6 @@ bool SoundNotifyPlugin::playNotification(NotifyPluginConfiguration* notification if(notification->getRepeatFlag()=="Repeat Once") { removedNotifies.append(lstNotifications.takeAt(lstNotifications.indexOf(notification))); - //if(!notification->firstStart) return true; } else { if(notification->getRepeatFlag()!="Repeat Instantly") @@ -407,24 +404,21 @@ bool SoundNotifyPlugin::playNotification(NotifyPluginConfiguration* notification } if(!notification->timer->isActive()) notification->timer->start(); - - //QxtTimer::singleShot(timer_value, this, SLOT(repeatTimerHandler(NotifyPluginConfiguration*)), qVariantFromValue(notification)); } } notification->firstStart=false; - phonon.mo->clear(); + phonon.mo->clear(); QString str = notification->parseNotifyMessage(); -#ifdef DEBUG_NOTIFIES - qDebug() << "play notification - " << str; -#endif - foreach(QString item, notification->getNotifyMessageList()) { - Phonon::MediaSource *ms = new Phonon::MediaSource(item); - ms->setAutoDelete(true); - phonon.mo->enqueue(*ms); - } + qNotifyDebug() << "play notification - " << str; + + foreach(QString item, notification->getMessageSequence()) { + Phonon::MediaSource *ms = new Phonon::MediaSource(item); + ms->setAutoDelete(true); + phonon.mo->enqueue(*ms); + } phonon.mo->play(); - phonon.firstPlay = false; // On Linux, you sometimes have to nudge Phonon to play 1 time before - // the state is not "Loading" anymore. + phonon.firstPlay = false; // On Linux, you sometimes have to nudge Phonon to play 1 time before + // the state is not "Loading" anymore. } else return false; // if audio is busy @@ -432,20 +426,9 @@ bool SoundNotifyPlugin::playNotification(NotifyPluginConfiguration* notification return true; } -//void SoundNotifyPlugin::repeatTimerHandler(NotifyPluginConfiguration* notification) -//{ -// qDebug() << "repeatTimerHandler - " << notification->parseNotifyMessage(); - -// ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); -// UAVObjectManager *objManager = pm->getObject(); -// UAVObject* object = objManager->getObject(notification->getDataObject()); -// if(object) -// checkNotificationRule(notification,object); -//} - void SoundNotifyPlugin::repeatTimerHandler() { - NotifyPluginConfiguration* notification = static_cast(sender()->parent()); + NotificationItem* notification = static_cast(sender()->parent()); #ifdef DEBUG_NOTIFIES qDebug() << "repeatTimerHandler - " << notification->parseNotifyMessage(); #endif @@ -459,7 +442,7 @@ void SoundNotifyPlugin::repeatTimerHandler() void SoundNotifyPlugin::expireTimerHandler() { // fire expire timer - NotifyPluginConfiguration* notification = static_cast(sender()->parent()); + NotificationItem* notification = static_cast(sender()->parent()); notification->expireTimer->stop(); if(!pendingNotifications.isEmpty()) @@ -494,7 +477,7 @@ void SoundNotifyPlugin::stateChanged(Phonon::State newstate, Phonon::State oldst nowPlayingConfiguration=NULL; if(!pendingNotifications.isEmpty()) { - NotifyPluginConfiguration* notification = pendingNotifications.takeFirst(); + NotificationItem* notification = pendingNotifications.takeFirst(); #ifdef DEBUG_NOTIFIES qDebug() << "play audioFree - " << notification->parseNotifyMessage(); #endif diff --git a/ground/openpilotgcs/src/plugins/notify/notifyplugin.h b/ground/openpilotgcs/src/plugins/notify/notifyplugin.h index 0d0eb50d8..afd68fecc 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifyplugin.h +++ b/ground/openpilotgcs/src/plugins/notify/notifyplugin.h @@ -32,7 +32,7 @@ #include "uavtalk/telemetrymanager.h" #include "uavobjectmanager.h" #include "uavobject.h" -#include "notifypluginconfiguration.h" +#include "notificationitem.h" #include #include @@ -44,10 +44,12 @@ class NotifyPluginOptionsPage; typedef struct { Phonon::MediaObject* mo; - NotifyPluginConfiguration* notify; - bool firstPlay; + NotificationItem* notify; + bool firstPlay; } PhononObject, *pPhononObject; + + class SoundNotifyPlugin : public Core::IConfigurablePlugin { Q_OBJECT @@ -62,48 +64,42 @@ public: void shutdown(); - QList getListNotifications() { return lstNotifications; } - //void setListNotifications(QList& list_notify) { } - NotifyPluginConfiguration* getCurrentNotification(){ return ¤tNotification;} + QList getListNotifications() { return lstNotifications; } + NotificationItem* getCurrentNotification(){ return ¤tNotification;} bool getEnableSound() const { return enableSound; } void setEnableSound(bool value) {enableSound = value; } - - private: bool configured; // just for migration,delete later bool enableSound; QList< QList* > lstMediaSource; QStringList mediaSource; - //QMap mapMediaObjects; QMultiMap mapMediaObjects; - QSettings* settings; QList lstNotifiedUAVObjects; + QList lstNotifications; + QList pendingNotifications; + QList removedNotifies; - QList lstNotifications; - QList pendingNotifications; - QList removedNotifies; - - NotifyPluginConfiguration currentNotification; - NotifyPluginConfiguration* nowPlayingConfiguration; + NotificationItem currentNotification; + NotificationItem* nowPlayingConfiguration; QString m_field; PhononObject phonon; NotifyPluginOptionsPage *mop; TelemetryManager* telMngr; - bool playNotification(NotifyPluginConfiguration* notification); - void checkNotificationRule(NotifyPluginConfiguration* notification, UAVObject* object); + bool playNotification(NotificationItem* notification); + void checkNotificationRule(NotificationItem* notification, UAVObject* object); void readConfig_0_0_0(); private slots: void onTelemetryManagerAdded(QObject* obj); void onAutopilotDisconnect(); void connectNotifications(); - void updateNotificationList(QList list); + void updateNotificationList(QList list); void resetNotification(void); void appendNotification(UAVObject *object); void repeatTimerHandler(void); diff --git a/ground/openpilotgcs/src/plugins/notify/notifypluginconfiguration.cpp b/ground/openpilotgcs/src/plugins/notify/notifypluginconfiguration.cpp index 94b88421e..8d5cb25e3 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifypluginconfiguration.cpp +++ b/ground/openpilotgcs/src/plugins/notify/notifypluginconfiguration.cpp @@ -1,7 +1,7 @@ /** ****************************************************************************** * - * @file notifyPluginConfiguration.cpp + * @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 @@ -25,60 +25,60 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#include "notifypluginconfiguration.h" +#include "NotificationItem.h" #include #include #include "utils/pathutils.h" -NotifyPluginConfiguration::NotifyPluginConfiguration(QObject *parent) : +NotificationItem::NotificationItem(QObject *parent) : QObject(parent), isNowPlaying(0), firstStart(1), - soundCollectionPath(""), - currentLanguage("default"), - dataObject(""), - objectField(""), - value("Equal to"), - sound1(""), - sound2(""), - sound3(""), - sayOrder("Never"), - spinBoxValue(0), - repeatString("Repeat Instantly"), - repeatTimeout(true), - expireTimeout(15) + _soundCollectionPath(""), + _currentLanguage("default"), + _dataObject(""), + _objectField(""), + _dataValue("Equal to"), + _sound1(""), + _sound2(""), + _sound3(""), + _sayOrder("Never"), + _spinBoxValue(0), + _repeatString("Repeat Instantly"), + _repeatTimeout(true), + _expireTimeout(15) { timer = NULL; expireTimer = NULL; } -void NotifyPluginConfiguration::copyTo(NotifyPluginConfiguration* that) const +void NotificationItem::copyTo(NotificationItem* that) const { that->isNowPlaying = isNowPlaying; that->firstStart = firstStart; - that->soundCollectionPath = soundCollectionPath; - that->currentLanguage = currentLanguage; - that->soundCollectionPath = soundCollectionPath; - that->dataObject = dataObject; - that->objectField = objectField; - that->value = value; - that->sound1 = sound1; - that->sound2 = sound2; - that->sound3 = sound3; - that->sayOrder = sayOrder; - that->spinBoxValue = spinBoxValue; - that->repeatString = repeatString; - that->repeatTimeout = repeatTimeout; - that->expireTimeout = expireTimeout; + that->_soundCollectionPath = _soundCollectionPath; + that->_currentLanguage = _currentLanguage; + that->_soundCollectionPath = _soundCollectionPath; + that->_dataObject = _dataObject; + that->_objectField = _objectField; + that->_dataValue = _dataValue; + that->_sound1 = _sound1; + that->_sound2 = _sound2; + that->_sound3 = _sound3; + that->_sayOrder = _sayOrder; + that->_spinBoxValue = _spinBoxValue; + that->_repeatString = _repeatString; + that->_repeatTimeout = _repeatTimeout; + that->_expireTimeout = _expireTimeout; } -void NotifyPluginConfiguration::saveState(QSettings* settings) const +void NotificationItem::saveState(QSettings* settings) const { - settings->setValue("SoundCollectionPath", Utils::PathUtils().RemoveDataPath(getSoundCollectionPath())); + settings->setValue("SoundCollectionPath", Utils::PathUtils().RemoveDataPath(getSoundCollectionPath())); settings->setValue(QLatin1String("CurrentLanguage"), getCurrentLanguage()); settings->setValue(QLatin1String("ObjectField"), getObjectField()); settings->setValue(QLatin1String("DataObject"), getDataObject()); @@ -92,7 +92,7 @@ void NotifyPluginConfiguration::saveState(QSettings* settings) const settings->setValue(QLatin1String("ExpireTimeout"), getExpireTimeout()); } -void NotifyPluginConfiguration::restoreState(QSettings* settings) +void NotificationItem::restoreState(QSettings* settings) { //settings = Core::ICore::instance()->settings(); setSoundCollectionPath(Utils::PathUtils().InsertDataPath(settings->value(QLatin1String("SoundCollectionPath"), tr("")).toString())); @@ -110,7 +110,7 @@ void NotifyPluginConfiguration::restoreState(QSettings* settings) } -QString NotifyPluginConfiguration::parseNotifyMessage() +QString NotificationItem::parseNotifyMessage() { // tips: // check of *.wav files exist needed for playing phonon queues; @@ -121,30 +121,30 @@ QString NotifyPluginConfiguration::parseNotifyMessage() str = QString("%L1 ").arg(getSpinBoxValue()); int position = 0xFF; // generate queue of sound files to play - notifyMessageList.clear(); + _messageSequence.clear(); - if(QFile::exists(QDir::toNativeSeparators(getSoundCollectionPath() + "/" + getCurrentLanguage()+"/"+getSound1()+".wav"))) - notifyMessageList.append(QDir::toNativeSeparators(getSoundCollectionPath() + "/" + getCurrentLanguage()+"/"+getSound1()+".wav")); + if(QFile::exists(QDir::toNativeSeparators(getSoundCollectionPath() + "/" + getCurrentLanguage()+"/"+getSound1()+".wav"))) + _messageSequence.append(QDir::toNativeSeparators(getSoundCollectionPath() + "/" + getCurrentLanguage()+"/"+getSound1()+".wav")); else - if(QFile::exists(QDir::toNativeSeparators(getSoundCollectionPath() + "/default/"+getSound1()+".wav"))) - notifyMessageList.append(QDir::toNativeSeparators(getSoundCollectionPath() + "/default/"+getSound1()+".wav")); + if(QFile::exists(QDir::toNativeSeparators(getSoundCollectionPath() + "/default/"+getSound1()+".wav"))) + _messageSequence.append(QDir::toNativeSeparators(getSoundCollectionPath() + "/default/"+getSound1()+".wav")); - if(getSound2()!="") + if("" != getSound2()) { - if(QFile::exists(QDir::toNativeSeparators(getSoundCollectionPath() + "/" + getCurrentLanguage()+"/"+getSound2()+".wav"))) - notifyMessageList.append(QDir::toNativeSeparators(getSoundCollectionPath() + "/" + getCurrentLanguage()+"/"+getSound2()+".wav")); + if(QFile::exists(QDir::toNativeSeparators(getSoundCollectionPath() + "/" + getCurrentLanguage()+"/"+getSound2()+".wav"))) + _messageSequence.append(QDir::toNativeSeparators(getSoundCollectionPath() + "/" + getCurrentLanguage()+"/"+getSound2()+".wav")); else - if(QFile::exists(QDir::toNativeSeparators(getSoundCollectionPath() + "/default/"+getSound2()+".wav"))) - notifyMessageList.append(QDir::toNativeSeparators(getSoundCollectionPath() + "/default/"+getSound2()+".wav")); + if(QFile::exists(QDir::toNativeSeparators(getSoundCollectionPath() + "/default/"+getSound2()+".wav"))) + _messageSequence.append(QDir::toNativeSeparators(getSoundCollectionPath() + "/default/"+getSound2()+".wav")); } - if(getSound3()!="") + if("" != getSound3()) { - if(QFile::exists(QDir::toNativeSeparators(getSoundCollectionPath()+ "/" + getCurrentLanguage()+"/"+getSound3()+".wav"))) - notifyMessageList.append(QDir::toNativeSeparators(getSoundCollectionPath()+ "/" + getCurrentLanguage()+"/"+getSound3()+".wav")); + if(QFile::exists(QDir::toNativeSeparators(getSoundCollectionPath()+ "/" + getCurrentLanguage()+"/"+getSound3()+".wav"))) + _messageSequence.append(QDir::toNativeSeparators(getSoundCollectionPath()+ "/" + getCurrentLanguage()+"/"+getSound3()+".wav")); else - if(QFile::exists(QDir::toNativeSeparators(getSoundCollectionPath()+"/default/"+getSound3()+".wav"))) - notifyMessageList.append(QDir::toNativeSeparators(getSoundCollectionPath()+"/default/"+getSound3()+".wav")); + if(QFile::exists(QDir::toNativeSeparators(getSoundCollectionPath()+"/default/"+getSound3()+".wav"))) + _messageSequence.append(QDir::toNativeSeparators(getSoundCollectionPath()+"/default/"+getSound3()+".wav")); } switch(str1.at(0).toAscii()) @@ -178,7 +178,7 @@ QString NotifyPluginConfiguration::parseNotifyMessage() break; } - if(position!=0xFF) + if(position != 0xFF) { QStringList numberParts = QString("%1").arg(getSpinBoxValue()).trimmed().split("."); QStringList numberFiles; @@ -212,9 +212,9 @@ QString NotifyPluginConfiguration::parseNotifyMessage() } } - if(numberParts.size()>1) { + if(1 < numberParts.size()) { numberFiles.append("point"); - if((numberParts.at(1).size()==1) /*|| (numberParts.at(1).toInt()<20)*/) + if((numberParts.at(1).size()==1)) numberFiles.append(numberParts.at(1)); else { if(numberParts.at(1).left(1)=="0") @@ -226,20 +226,18 @@ QString NotifyPluginConfiguration::parseNotifyMessage() } foreach(QString fileName,numberFiles) { fileName+=".wav"; - QString filePath = QDir::toNativeSeparators(getSoundCollectionPath()+"/"+ getCurrentLanguage()+"/"+fileName); + QString filePath = QDir::toNativeSeparators(getSoundCollectionPath()+"/"+ getCurrentLanguage()+"/"+fileName); if(QFile::exists(filePath)) - notifyMessageList.insert(position++,QDir::toNativeSeparators(getSoundCollectionPath()+ "/"+getCurrentLanguage()+"/"+fileName)); + _messageSequence.insert(position++,QDir::toNativeSeparators(getSoundCollectionPath()+ "/"+getCurrentLanguage()+"/"+fileName)); else { - if(QFile::exists(QDir::toNativeSeparators(getSoundCollectionPath()+"/default/"+fileName))) - notifyMessageList.insert(position++,QDir::toNativeSeparators(getSoundCollectionPath()+"/default/"+fileName)); + if(QFile::exists(QDir::toNativeSeparators(getSoundCollectionPath()+"/default/"+fileName))) + _messageSequence.insert(position++,QDir::toNativeSeparators(getSoundCollectionPath()+"/default/"+fileName)); else { - notifyMessageList.clear(); + _messageSequence.clear(); break; // if no some of *.wav files, then don't play number! } } } } - - //str.replace(QString(".wav | .mp3"), QString("")); return str; } diff --git a/ground/openpilotgcs/src/plugins/notify/notifypluginconfiguration.h b/ground/openpilotgcs/src/plugins/notify/notifypluginconfiguration.h deleted file mode 100644 index ad13a82a0..000000000 --- a/ground/openpilotgcs/src/plugins/notify/notifypluginconfiguration.h +++ /dev/null @@ -1,122 +0,0 @@ -/** - ****************************************************************************** - * - * @file notifypluginconfiguration.h - * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. - * @brief Notify Plugin configuration header - * @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 - */ - - -#ifndef NOTIFYPLUGINCONFIGURATION_H -#define NOTIFYPLUGINCONFIGURATION_H -#include -#include "qsettings.h" -#include -#include - -using namespace Core; - -class NotifyPluginConfiguration : public QObject -{ - Q_OBJECT -public: - explicit NotifyPluginConfiguration(QObject *parent = 0); - - QTimer* timer; - QTimer* expireTimer; - bool isNowPlaying; // - bool firstStart; - - void copyTo(NotifyPluginConfiguration*) const; - - QString getSound1() const { return sound1; } - void setSound1(QString text) {sound1 = text; } - - QString getSound2() const { return sound2; } - void setSound2(QString text) {sound2 = text; } - - QString getSound3() const { return sound3; } - void setSound3(QString text) {sound3 = text; } - - QString getValue() const { return value; } - void setValue(QString text) {value = text; } - - QString getSayOrder() const { return sayOrder; } - void setSayOrder(QString text) {sayOrder = text; } - - double getSpinBoxValue() const { return spinBoxValue; } - void setSpinBoxValue(double value) {spinBoxValue = value; } - - - QString getDataObject() const { return dataObject; } - void setDataObject(QString text) {dataObject = text; } - - QString getObjectField() const { return objectField; } - void setObjectField(QString text) { objectField = text; } - - QString getSoundCollectionPath() const { return soundCollectionPath; } - void setSoundCollectionPath(QString text) { soundCollectionPath = text; } - - QString getCurrentLanguage() const { return currentLanguage; } - void setCurrentLanguage(QString text) { currentLanguage = text; } - - QStringList getNotifyMessageList() const { return notifyMessageList; } - void setNotifyMessageList(QStringList text) { notifyMessageList = text; } - - QString getRepeatFlag() const { return repeatString; } - void setRepeatFlag(QString value) { repeatString = value; } - - bool getRepeatTimeout() const { return repeatTimeout; } - void setRepeatTimeout(bool value) { repeatTimeout = value; } - - int getExpireTimeout() const { return expireTimeout; } - void setExpireTimeout(int value) { expireTimeout = value; } - - - - void saveState(QSettings* settings) const; - void restoreState(QSettings* settings); - QString parseNotifyMessage(); - -private: - QStringList notifyMessageList; - QString soundCollectionPath; - QString currentLanguage; - QString dataObject; - QString objectField; - - QString value; - QString sound1; - QString sound2; - QString sound3; - QString sayOrder; - double spinBoxValue; - QString repeatString; - bool repeatTimeout; - int repeatTimerValue; - int expireTimeout; - -}; - -Q_DECLARE_METATYPE(NotifyPluginConfiguration*) - -#endif // NOTIFYPLUGINCONFIGURATION_H diff --git a/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.cpp b/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.cpp index 5dee5678a..48d8f9132 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.cpp +++ b/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.cpp @@ -27,7 +27,7 @@ #include "notifypluginoptionspage.h" #include -#include "notifypluginconfiguration.h" +#include "notificationitem.h" #include "ui_notifypluginoptionspage.h" #include "extensionsystem/pluginmanager.h" #include "utils/pathutils.h" @@ -44,7 +44,7 @@ #include "notifyitemdelegate.h" #include "notifytablemodel.h" -NotifyPluginOptionsPage::NotifyPluginOptionsPage(/*NotifyPluginConfiguration *config,*/ QObject *parent) : +NotifyPluginOptionsPage::NotifyPluginOptionsPage(/*NotificationItem *config,*/ QObject *parent) : IOptionsPage(parent), owner((SoundNotifyPlugin*)parent), currentCollectionPath(""), @@ -95,36 +95,29 @@ QWidget *NotifyPluginOptionsPage::createPage(QWidget *parent) connect(options_page->buttonAdd, SIGNAL(pressed()), this, SLOT(on_buttonAddNotification_clicked())); connect(options_page->buttonDelete, SIGNAL(pressed()), this, SLOT(on_buttonDeleteNotification_clicked())); connect(options_page->buttonModify, SIGNAL(pressed()), this, SLOT(on_buttonModifyNotification_clicked())); -// connect(options_page->buttonTestSound1, SIGNAL(clicked()), this, SLOT(on_buttonTestSound1_clicked())); -// connect(options_page->buttonTestSound2, SIGNAL(clicked()), this, SLOT(on_buttonTestSound2_clicked())); connect(options_page->buttonPlayNotification, SIGNAL(clicked()), this, SLOT(on_buttonTestSoundNotification_clicked())); connect(options_page->chkEnableSound, SIGNAL(toggled(bool)), this, SLOT(on_chkEnableSound_toggled(bool))); - connect(options_page->UAVObject, SIGNAL(currentIndexChanged(QString)), this, SLOT(on_UAVObject_indexChanged(QString))); - connect(this, SIGNAL(updateNotifications(QList)), - owner, SLOT(updateNotificationList(QList))); + connect(this, SIGNAL(updateNotifications(QList)), + owner, SLOT(updateNotificationList(QList))); connect(this, SIGNAL(resetNotification()),owner, SLOT(resetNotification())); //emit resetNotification(); + privListNotifications.clear(); - privListNotifications.clear(); - - for (int i = 0; i < owner->getListNotifications().size(); ++i) { - NotifyPluginConfiguration* notification = new NotifyPluginConfiguration(); - owner->getListNotifications().at(i)->copyTo(notification); - privListNotifications.append(notification); + for (int i = 0; i < owner->getListNotifications().size(); ++i) { + NotificationItem* notification = new NotificationItem(); + owner->getListNotifications().at(i)->copyTo(notification); + privListNotifications.append(notification); } - updateConfigView(owner->getCurrentNotification()); + updateConfigView(owner->getCurrentNotification()); - options_page->chkEnableSound->setChecked(owner->getEnableSound()); + options_page->chkEnableSound->setChecked(owner->getEnableSound()); - QStringList headerStrings; - headerStrings << "Name" << "Repeats" << "Lifetime,sec"; - - notifyRulesModel = new NotifyTableModel(&privListNotifications,headerStrings); + notifyRulesModel = new NotifyTableModel(&privListNotifications); options_page->notifyRulesView->setModel(notifyRulesModel); options_page->notifyRulesView->resizeRowsToContents(); notifyRulesSelection = new QItemSelectionModel(notifyRulesModel); @@ -135,50 +128,28 @@ QWidget *NotifyPluginOptionsPage::createPage(QWidget *parent) connect(this, SIGNAL(entryAdded(int)), notifyRulesModel, SLOT(entryAdded(int))); + options_page->notifyRulesView->setSelectionModel(notifyRulesSelection); options_page->notifyRulesView->setItemDelegate(new NotifyItemDelegate(delegateItems,this)); - options_page->notifyRulesView->setColumnWidth(0,200); - options_page->notifyRulesView->setColumnWidth(1,150); - options_page->notifyRulesView->setColumnWidth(2,100); + options_page->notifyRulesView->setColumnWidth(eMESSAGE_NAME,200); + options_page->notifyRulesView->setColumnWidth(eREPEAT_VALUE,120); + options_page->notifyRulesView->setColumnWidth(eEXPIRE_TIME,100); + options_page->notifyRulesView->setColumnWidth(eENABLE_NOTIFICATION,60); options_page->buttonModify->setEnabled(false); options_page->buttonDelete->setEnabled(false); options_page->buttonPlayNotification->setEnabled(false); -// sound1 = Phonon::createPlayer(Phonon::NotificationCategory); -// sound2 = Phonon::createPlayer(Phonon::NotificationCategory); notifySound = Phonon::createPlayer(Phonon::NotificationCategory); -// audioOutput = new Phonon::AudioOutput(Phonon::NotificationCategory, this); -// Phonon::createPath(sound1, audioOutput); -// Phonon::createPath(sound2, audioOutput); -// Phonon::createPath(notifySound, audioOutput); - -// connect(sound1,SIGNAL(stateChanged(Phonon::State,Phonon::State)),SLOT(changeButtonText(Phonon::State,Phonon::State))); -// connect(sound2,SIGNAL(stateChanged(Phonon::State,Phonon::State)),SLOT(changeButtonText(Phonon::State,Phonon::State))); connect(notifySound,SIGNAL(stateChanged(Phonon::State,Phonon::State)), this,SLOT(changeButtonText(Phonon::State,Phonon::State))); + connect(notifySound, SIGNAL(finished(void)), this, SLOT(onFinishedPlaying(void))); return optionsPageWidget; } -void NotifyPluginOptionsPage::showPersistentComboBox( const QModelIndex & parent, int start, int end ) -{ -// for (int i=start; itableNotifications->openPersistentEditor(options_page->tableNotifications->item(i,1)); -// } -} - -void NotifyPluginOptionsPage::showPersistentComboBox2( const QModelIndex & topLeft, const QModelIndex & bottomRight ) -{ - //for (QModelIndex i=topLeft; itableNotifications->openPersistentEditor(options_page->tableNotifications->item(options_page->tableNotifications->currentRow(),1)); - } -} - - -void NotifyPluginOptionsPage::getOptionsPageValues(NotifyPluginConfiguration* notification) +void NotifyPluginOptionsPage::getOptionsPageValues(NotificationItem* notification) { notification->setSoundCollectionPath(options_page->SoundDirectoryPathChooser->path()); notification->setCurrentLanguage(options_page->SoundCollectionList->currentText()); @@ -191,26 +162,16 @@ void NotifyPluginOptionsPage::getOptionsPageValues(NotifyPluginConfiguration* no notification->setValue(options_page->Value->currentText()); notification->setSpinBoxValue(options_page->ValueSpinBox->value()); -// if(notifyRulesSelection->currentIndex().row()>-1) -// { -// //qDebug() << "delegate value:" << options_page->tableNotifications->item(options_page->tableNotifications->currentRow(),1)->data(Qt::EditRole); -// notification->setRepeatFlag(notifyRulesModel->data(notifyRulesSelection->currentIndex(),Qt::DisplayRole).toString()); -// } } -//////////////////////////////////////////// -// Called when the user presses apply or OK. -// -// Saves the current values -// -//////////////////////////////////////////// +/*! +* Called when the user presses apply or OK. +* Saves the current values +*/ void NotifyPluginOptionsPage::apply() { - - getOptionsPageValues(owner->getCurrentNotification()); - + getOptionsPageValues(owner->getCurrentNotification()); owner->setEnableSound(options_page->chkEnableSound->isChecked()); - //owner->setListNotifications(privListNotifications); emit updateNotifications(privListNotifications); } @@ -218,25 +179,22 @@ void NotifyPluginOptionsPage::finish() { disconnect(notifySound,SIGNAL(stateChanged(Phonon::State,Phonon::State)), this,SLOT(changeButtonText(Phonon::State,Phonon::State))); - if(notifySound) - { + if (notifySound) { notifySound->stop(); notifySound->clear(); } - - delete options_page; + if (options_page) + delete options_page; } - - ////////////////////////////////////////////////////////////////////////////// // Fills in the combo box when value is changed in the // combo box ////////////////////////////////////////////////////////////////////////////// void NotifyPluginOptionsPage::on_UAVObject_indexChanged(QString val) { options_page->UAVObjectField->clear(); - ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); - UAVObjectManager *objManager = pm->getObject(); + ExtensionSystem::PluginManager* pm = ExtensionSystem::PluginManager::instance(); + UAVObjectManager* objManager = pm->getObject(); UAVDataObject* obj = dynamic_cast( objManager->getObject(val) ); QList fieldList = obj->getFields(); foreach (UAVObjectField* field, fieldList) { @@ -258,8 +216,8 @@ void NotifyPluginOptionsPage::on_soundLanguage_indexChanged(int index) { options_page->SoundCollectionList->setCurrentIndex(index); - currentCollectionPath = options_page->SoundDirectoryPathChooser->path() + - QDir::toNativeSeparators("/" + options_page->SoundCollectionList->currentText()); + currentCollectionPath = options_page->SoundDirectoryPathChooser->path() + + QDir::toNativeSeparators("/" + options_page->SoundCollectionList->currentText()); QDir dirPath(currentCollectionPath); QStringList filters; @@ -280,30 +238,38 @@ void NotifyPluginOptionsPage::on_soundLanguage_indexChanged(int index) void NotifyPluginOptionsPage::changeButtonText(Phonon::State newstate, Phonon::State oldstate) { - if(newstate == Phonon::PausedState || newstate == Phonon::StoppedState){ + Q_ASSERT(Phonon::ErrorState != newstate); + + if (newstate == Phonon::PausedState || newstate == Phonon::StoppedState) { options_page->buttonPlayNotification->setText("Play"); options_page->buttonPlayNotification->setIcon(QPixmap(":/notify/images/play.png")); - } - else - if(newstate == Phonon::PlayingState) { - options_page->buttonPlayNotification->setText("Stop"); - options_page->buttonPlayNotification->setIcon(QPixmap(":/notify/images/stop.png")); + } else { + if (newstate == Phonon::PlayingState) { + options_page->buttonPlayNotification->setText("Stop"); + options_page->buttonPlayNotification->setIcon(QPixmap(":/notify/images/stop.png")); + } } } +void NotifyPluginOptionsPage::onFinishedPlaying() +{ + notifySound->clear(); +} void NotifyPluginOptionsPage::on_buttonTestSoundNotification_clicked() { - // QList messageNotify; - NotifyPluginConfiguration *notification; + NotificationItem* notification = NULL; - if(notifyRulesSelection->currentIndex().row()==-1) return; - - notifySound->clearQueue(); + if (-1 == notifyRulesSelection->currentIndex().row()) + return; + notifySound->clearQueue(); notification = privListNotifications.at(notifyRulesSelection->currentIndex().row()); notification->parseNotifyMessage(); - foreach(QString item, notification->getNotifyMessageList()) - notifySound->enqueue(Phonon::MediaSource(item)); + QStringList sequence = notification->getMessageSequence(); + Q_ASSERT(!!sequence.size()); + foreach(QString item, sequence) + notifySound->enqueue(Phonon::MediaSource(item)); + notifySound->play(); } @@ -316,25 +282,24 @@ void NotifyPluginOptionsPage::on_chkEnableSound_toggled(bool state) audioOutput->setMuted(state1); } -void NotifyPluginOptionsPage::updateConfigView(NotifyPluginConfiguration* notification) +void NotifyPluginOptionsPage::updateConfigView(NotificationItem* notification) { QString path = notification->getSoundCollectionPath(); - if(path=="") - { + if (path == "") { //QDir dir = QDir::currentPath(); //path = QDir::currentPath().left(QDir::currentPath().indexOf("OpenPilot",0,Qt::CaseSensitive))+"../share/sounds"; - path = Utils::PathUtils().InsertDataPath("%%DATAPATH%%sounds"); + path = Utils::PathUtils().InsertDataPath("%%DATAPATH%%sounds"); } + options_page->SoundDirectoryPathChooser->setPath(path); - if(options_page->SoundCollectionList->findText(notification->getCurrentLanguage())!=-1){ + if (-1 != options_page->SoundCollectionList->findText(notification->getCurrentLanguage())){ options_page->SoundCollectionList->setCurrentIndex(options_page->SoundCollectionList->findText(notification->getCurrentLanguage())); - } - else + } else { options_page->SoundCollectionList->setCurrentIndex(options_page->SoundCollectionList->findText("default")); + } - - if(options_page->UAVObject->findText(notification->getDataObject())!=-1){ + if (options_page->UAVObject->findText(notification->getDataObject())!=-1){ options_page->UAVObject->setCurrentIndex(options_page->UAVObject->findText(notification->getDataObject())); } @@ -349,15 +314,13 @@ void NotifyPluginOptionsPage::updateConfigView(NotifyPluginConfiguration* notifi } } - if(options_page->UAVObjectField->findText(notification->getObjectField())!=-1){ + if (-1 != options_page->UAVObjectField->findText(notification->getObjectField())) { options_page->UAVObjectField->setCurrentIndex(options_page->UAVObjectField->findText(notification->getObjectField())); } - if(options_page->Sound1->findText(notification->getSound1())!=-1){ + if (-1 != options_page->Sound1->findText(notification->getSound1())) { options_page->Sound1->setCurrentIndex(options_page->Sound1->findText(notification->getSound1())); - } - else - { + } else { // show item from default location options_page->SoundCollectionList->setCurrentIndex(options_page->SoundCollectionList->findText("default")); options_page->Sound1->setCurrentIndex(options_page->Sound1->findText(notification->getSound1())); @@ -366,10 +329,9 @@ void NotifyPluginOptionsPage::updateConfigView(NotifyPluginConfiguration* notifi //options_page->Sound1->setCurrentIndex(-1); } - if(options_page->Sound2->findText(notification->getSound2())!=-1) { + if (-1 != options_page->Sound2->findText(notification->getSound2())) { options_page->Sound2->setCurrentIndex(options_page->Sound2->findText(notification->getSound2())); - } - else { + } else { // show item from default location options_page->SoundCollectionList->setCurrentIndex(options_page->SoundCollectionList->findText("default")); options_page->Sound2->setCurrentIndex(options_page->Sound2->findText(notification->getSound2())); @@ -378,33 +340,33 @@ void NotifyPluginOptionsPage::updateConfigView(NotifyPluginConfiguration* notifi //options_page->Sound2->setCurrentIndex(-1); } - if(options_page->Sound3->findText(notification->getSound3())!=-1) { + if (-1 != options_page->Sound3->findText(notification->getSound3())) { options_page->Sound3->setCurrentIndex(options_page->Sound3->findText(notification->getSound3())); - } - else { + } else { // show item from default location options_page->SoundCollectionList->setCurrentIndex(options_page->SoundCollectionList->findText("default")); options_page->Sound3->setCurrentIndex(options_page->Sound3->findText(notification->getSound3())); } - if(options_page->Value->findText(notification->getValue())!=-1) { + if (-1 != options_page->Value->findText(notification->getValue())) { options_page->Value->setCurrentIndex(options_page->Value->findText(notification->getValue())); } - if(options_page->SayOrder->findText(notification->getSayOrder())!=-1) { + if (-1 != options_page->SayOrder->findText(notification->getSayOrder())) { options_page->SayOrder->setCurrentIndex(options_page->SayOrder->findText(notification->getSayOrder())); } + options_page->ValueSpinBox->setValue(notification->getSpinBoxValue()); } void NotifyPluginOptionsPage::on_tableNotification_changeSelection( const QItemSelection & selected, const QItemSelection & deselected ) { - bool select = true; + bool select = false; notifySound->stop(); - if(selected.indexes().size()) + if (selected.indexes().size()) { + select = true; updateConfigView(privListNotifications.at(selected.indexes().at(0).row())); - else - select = false; + } options_page->buttonModify->setEnabled(select); options_page->buttonDelete->setEnabled(select); @@ -412,13 +374,11 @@ void NotifyPluginOptionsPage::on_tableNotification_changeSelection( const QItemS } - void NotifyPluginOptionsPage::on_buttonAddNotification_clicked() { - NotifyPluginConfiguration* notification = new NotifyPluginConfiguration; + NotificationItem* notification = new NotificationItem; - if(options_page->SoundDirectoryPathChooser->path()=="") - { + if (options_page->SoundDirectoryPathChooser->path()=="") { QPalette textPalette=options_page->SoundDirectoryPathChooser->palette(); textPalette.setColor(QPalette::Normal,QPalette::Text, Qt::red); options_page->SoundDirectoryPathChooser->setPalette(textPalette); @@ -433,20 +393,20 @@ void NotifyPluginOptionsPage::on_buttonAddNotification_clicked() notification->setValue(options_page->Value->currentText()); notification->setSpinBoxValue(options_page->ValueSpinBox->value()); - if(options_page->Sound1->currentText()!="") + if (options_page->Sound1->currentText().size() > 0) notification->setSound1(options_page->Sound1->currentText()); notification->setSound2(options_page->Sound2->currentText()); notification->setSound3(options_page->Sound3->currentText()); - if(((options_page->Sound2->currentText()=="")&&(options_page->SayOrder->currentText()=="After second")) - || ((options_page->Sound3->currentText()=="")&&(options_page->SayOrder->currentText()=="After third"))) + if ( ((!options_page->Sound2->currentText().size()) && (options_page->SayOrder->currentText()=="After second")) + || ((!options_page->Sound3->currentText().size()) && (options_page->SayOrder->currentText()=="After third")) ) { return; - else + } else { notification->setSayOrder(options_page->SayOrder->currentText()); - + } privListNotifications.append(notification); - emit entryAdded(privListNotifications.size()-1); + emit entryAdded(privListNotifications.size() - 1); notifyRulesSelection->setCurrentIndex(notifyRulesModel->index(privListNotifications.size()-1,0,QModelIndex()), QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows); } @@ -455,7 +415,9 @@ void NotifyPluginOptionsPage::on_buttonAddNotification_clicked() void NotifyPluginOptionsPage::on_buttonDeleteNotification_clicked() { notifyRulesModel->removeRow(notifyRulesSelection->currentIndex().row()); - if(!notifyRulesModel->rowCount() && (notifyRulesSelection->currentIndex().row() > 0 && notifyRulesSelection->currentIndex().row() < notifyRulesModel->rowCount())) + if (!notifyRulesModel->rowCount() + && (notifyRulesSelection->currentIndex().row() > 0 + && notifyRulesSelection->currentIndex().row() < notifyRulesModel->rowCount()) ) { options_page->buttonDelete->setEnabled(false); options_page->buttonModify->setEnabled(false); @@ -466,7 +428,7 @@ void NotifyPluginOptionsPage::on_buttonDeleteNotification_clicked() void NotifyPluginOptionsPage::on_buttonModifyNotification_clicked() { - NotifyPluginConfiguration* notification = new NotifyPluginConfiguration; + NotificationItem* notification = new NotificationItem; getOptionsPageValues(notification); notification->setRepeatFlag(privListNotifications.at(notifyRulesSelection->currentIndex().row())->getRepeatFlag()); privListNotifications.replace(notifyRulesSelection->currentIndex().row(),notification); diff --git a/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.h b/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.h index 9d159e2a4..31da8373f 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.h +++ b/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.h @@ -45,7 +45,7 @@ class NotifyTableModel; -class NotifyPluginConfiguration; +class NotificationItem; class SoundNotifyPlugin; namespace Ui { @@ -59,7 +59,7 @@ class NotifyPluginOptionsPage : public IOptionsPage { Q_OBJECT public: - explicit NotifyPluginOptionsPage(/*NotifyPluginConfiguration *config, */QObject *parent = 0); + explicit NotifyPluginOptionsPage(/*NotificationItem *config, */QObject *parent = 0); QString id() const { return QLatin1String("settings"); } QString trName() const { return tr("settings"); } @@ -73,8 +73,8 @@ public: void finish(); void restoreFromSettings(); - void updateConfigView(NotifyPluginConfiguration* notification); - void getOptionsPageValues(NotifyPluginConfiguration* notification); + void updateConfigView(NotificationItem* notification); + void getOptionsPageValues(NotificationItem* notification); private: UAVObjectManager *objManager; @@ -90,24 +90,18 @@ private: QStringList delegateItems; NotifyTableModel* notifyRulesModel; QItemSelectionModel *notifyRulesSelection; - QList privListNotifications; + QList privListNotifications; Ui::NotifyPluginOptionsPage *options_page; - //NotifyPluginConfiguration *notify; signals: - void updateNotifications(QList list); + void updateNotifications(QList list); void resetNotification(void); void entryUpdated(int index); void entryAdded(int position); private slots: - void showPersistentComboBox( const QModelIndex & parent, int start, int end ); - void showPersistentComboBox2 ( const QModelIndex & topLeft, const QModelIndex & bottomRight ); - -// void on_buttonTestSound1_clicked(); -// void on_buttonTestSound2_clicked(); void on_buttonTestSoundNotification_clicked(); void on_buttonAddNotification_clicked(); @@ -119,6 +113,9 @@ private slots: void on_UAVObject_indexChanged(QString val); void changeButtonText(Phonon::State newstate, Phonon::State oldstate); void on_chkEnableSound_toggled(bool state); + + void onFinishedPlaying(void); + }; #endif // NOTIFYPLUGINOPTIONSPAGE_H diff --git a/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.ui b/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.ui index b3f48432a..4645bd14a 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.ui +++ b/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.ui @@ -24,7 +24,7 @@ 10 10 - 501 + 551 81 @@ -36,7 +36,7 @@ 10 20 - 481 + 531 51 @@ -89,7 +89,7 @@ p, li { white-space: pre-wrap; } 10 220 - 501 + 551 211 @@ -101,7 +101,7 @@ p, li { white-space: pre-wrap; } 10 180 - 481 + 531 26 @@ -203,7 +203,7 @@ p, li { white-space: pre-wrap; } 10 20 - 481 + 531 151 @@ -226,7 +226,7 @@ p, li { white-space: pre-wrap; } 10 100 - 501 + 551 31 @@ -272,7 +272,7 @@ p, li { white-space: pre-wrap; } 7 130 - 501 + 551 20 @@ -285,7 +285,7 @@ p, li { white-space: pre-wrap; } 10 180 - 501 + 551 31 @@ -390,7 +390,7 @@ p, li { white-space: pre-wrap; } 10 150 - 501 + 551 31 diff --git a/ground/openpilotgcs/src/plugins/notify/notifytablemodel.cpp b/ground/openpilotgcs/src/plugins/notify/notifytablemodel.cpp index 6f0584d70..6e503cbd8 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifytablemodel.cpp +++ b/ground/openpilotgcs/src/plugins/notify/notifytablemodel.cpp @@ -26,17 +26,30 @@ */ #include "notifytablemodel.h" +#include + +NotifyTableModel::NotifyTableModel(QList* parentList, QObject* parent) + : QAbstractTableModel(parent) +{ + _headerStrings << "Name" << "Repeats" << "Lifetime,sec" << "Enable"; + _list.reset(parentList); +} + bool NotifyTableModel::setData(const QModelIndex &index, const QVariant &value, int role) { if (index.isValid() && role == Qt::EditRole) { - if(index.column()==1) + if(eREPEAT_VALUE == index.column()) _list->at(index.row())->setRepeatFlag(value.toString()); - else - if(index.column()==2) + else { + if(eEXPIRE_TIME == index.column()) _list->at(index.row())->setExpireTimeout(value.toInt()); - + else { + if(eENABLE_NOTIFICATION == index.column()) + _list->at(index.row())->setEnableFlag(value.toBool()); + } + } emit dataChanged(index, index); return true; } @@ -45,9 +58,10 @@ bool NotifyTableModel::setData(const QModelIndex &index, QVariant NotifyTableModel::data(const QModelIndex &index, int role) const { - - if (!index.isValid()) + if (!index.isValid()) { + qWarning() << "NotifyTableModel::data - index.isValid()"; return QVariant(); + } if (index.row() >= _list->size()) return QVariant(); @@ -56,15 +70,18 @@ QVariant NotifyTableModel::data(const QModelIndex &index, int role) const { switch(index.column()) { - case 0: + case eMESSAGE_NAME: return _list->at(index.row())->parseNotifyMessage(); - case 1: + case eREPEAT_VALUE: return _list->at(index.row())->getRepeatFlag(); - case 2: + case eEXPIRE_TIME: return _list->at(index.row())->getExpireTimeout(); + case eENABLE_NOTIFICATION: + return _list->at(index.row())->getEnableFlag(); + default: return QVariant(); } @@ -72,12 +89,8 @@ QVariant NotifyTableModel::data(const QModelIndex &index, int role) const else { if (Qt::SizeHintRole == role){ - //QVariant size = data(index, Qt::SizeHintRole); return QVariant(10); } - // if(role == Qt::DecorationRole) - // if (index.column() == 0) - // return defectsIcons[defectList->at(index.row()).id-1]; } return QVariant(); } @@ -88,7 +101,7 @@ QVariant NotifyTableModel::headerData(int section, Qt::Orientation orientation, return QVariant(); if (orientation == Qt::Horizontal) - return headerStrings.at(section); + return _headerStrings.at(section); else if(orientation == Qt::Vertical) return QString("%1").arg(section); @@ -100,12 +113,6 @@ bool NotifyTableModel::insertRows(int position, int rows, const QModelIndex &ind { Q_UNUSED(index); beginInsertRows(QModelIndex(), position, position+rows-1); - -// for (int row=0; row < rows; ++row) { -// _list->append(position); -// } - - endInsertRows(); return true; } diff --git a/ground/openpilotgcs/src/plugins/notify/notifytablemodel.h b/ground/openpilotgcs/src/plugins/notify/notifytablemodel.h index 65aa82a86..978605fbe 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifytablemodel.h +++ b/ground/openpilotgcs/src/plugins/notify/notifytablemodel.h @@ -31,26 +31,28 @@ #include #include -#include "notifypluginconfiguration.h" +#include "notificationitem.h" + +enum ColumnNames { eMESSAGE_NAME, eREPEAT_VALUE, eEXPIRE_TIME, eENABLE_NOTIFICATION }; class NotifyTableModel : public QAbstractTableModel { Q_OBJECT - public: - NotifyTableModel(QList *parentList, const QStringList& parentHeaderList, QObject *parent = 0) - : QAbstractTableModel(parent), - _list(parentList), - headerStrings(parentHeaderList) - { } - int rowCount(const QModelIndex &parent = QModelIndex()) const + enum {eColumnCount = 4 }; + +public: + + NotifyTableModel(QList* parentList, QObject* parent = 0); + + int rowCount(const QModelIndex& parent = QModelIndex()) const { return _list->count(); } int columnCount(const QModelIndex &/*parent*/) const { - return 3; + return eColumnCount; } Qt::ItemFlags flags(const QModelIndex &index) const @@ -71,8 +73,8 @@ private slots: void entryUpdated(int offset); void entryAdded(int position); private: - QList *_list; - QStringList headerStrings; + QScopedPointer > _list; + QStringList _headerStrings; }; diff --git a/openpilotgcs.bat b/openpilotgcs.bat new file mode 100644 index 000000000..a656aa85b --- /dev/null +++ b/openpilotgcs.bat @@ -0,0 +1,3 @@ +cd D:\Qt\4.7.3\bin\ + +call D:\!Work\OpenSource\OpenPilot\OpenPilot\build\ground\openpilotgcs\bin\openpilotgcs.exe \ No newline at end of file From e14e0a763b409d83b69bec98ddfef0e44f9225fc Mon Sep 17 00:00:00 2001 From: Nickolay Date: Thu, 15 Sep 2011 01:35:19 +0300 Subject: [PATCH 002/121] - temporary remove assert in finished callback; --- .../openpilotgcs/src/plugins/notify/notifypluginoptionspage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.cpp b/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.cpp index 48d8f9132..686c59c3b 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.cpp +++ b/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.cpp @@ -238,7 +238,7 @@ void NotifyPluginOptionsPage::on_soundLanguage_indexChanged(int index) void NotifyPluginOptionsPage::changeButtonText(Phonon::State newstate, Phonon::State oldstate) { - Q_ASSERT(Phonon::ErrorState != newstate); + //Q_ASSERT(Phonon::ErrorState != newstate); if (newstate == Phonon::PausedState || newstate == Phonon::StoppedState) { options_page->buttonPlayNotification->setText("Play"); From c16e386e6375538b5be59f637ef65f0c408cfa05 Mon Sep 17 00:00:00 2001 From: Nickolay Date: Fri, 16 Sep 2011 02:24:35 +0300 Subject: [PATCH 003/121] +reordering of table items - experimenting with D&D --- ...configuration.cpp => notificationitem.cpp} | 0 .../src/plugins/notify/notify.pro | 6 +- .../src/plugins/notify/notifyplugin.h | 35 +++--- .../notify/notifypluginoptionspage.cpp | 111 ++++++++++-------- .../plugins/notify/notifypluginoptionspage.h | 22 ++-- .../src/plugins/notify/notifytablemodel.cpp | 30 ++--- .../src/plugins/notify/notifytablemodel.h | 9 +- 7 files changed, 120 insertions(+), 93 deletions(-) rename ground/openpilotgcs/src/plugins/notify/{notifypluginconfiguration.cpp => notificationitem.cpp} (100%) diff --git a/ground/openpilotgcs/src/plugins/notify/notifypluginconfiguration.cpp b/ground/openpilotgcs/src/plugins/notify/notificationitem.cpp similarity index 100% rename from ground/openpilotgcs/src/plugins/notify/notifypluginconfiguration.cpp rename to ground/openpilotgcs/src/plugins/notify/notificationitem.cpp diff --git a/ground/openpilotgcs/src/plugins/notify/notify.pro b/ground/openpilotgcs/src/plugins/notify/notify.pro index e70392a6a..b8eeb35fd 100644 --- a/ground/openpilotgcs/src/plugins/notify/notify.pro +++ b/ground/openpilotgcs/src/plugins/notify/notify.pro @@ -12,13 +12,13 @@ HEADERS += notifyplugin.h \ notifypluginoptionspage.h \ notifyitemdelegate.h \ notifytablemodel.h \ - NotificationItem.h + notificationitem.h SOURCES += notifyplugin.cpp \ notifypluginoptionspage.cpp \ - notifypluginconfiguration.cpp \ notifyitemdelegate.cpp \ - notifytablemodel.cpp + notifytablemodel.cpp \ + notificationitem.cpp OTHER_FILES += NotifyPlugin.pluginspec diff --git a/ground/openpilotgcs/src/plugins/notify/notifyplugin.h b/ground/openpilotgcs/src/plugins/notify/notifyplugin.h index afd68fecc..c1e0ce620 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifyplugin.h +++ b/ground/openpilotgcs/src/plugins/notify/notifyplugin.h @@ -71,6 +71,26 @@ public: void setEnableSound(bool value) {enableSound = value; } private: + SoundNotifyPlugin(const SoundNotifyPlugin& rhs); + SoundNotifyPlugin& operator= (const SoundNotifyPlugin& rhs); + + bool playNotification(NotificationItem* notification); + void checkNotificationRule(NotificationItem* notification, UAVObject* object); + void readConfig_0_0_0(); + +private slots: + void onTelemetryManagerAdded(QObject* obj); + void onAutopilotDisconnect(); + void connectNotifications(); + void updateNotificationList(QList list); + void resetNotification(void); + void appendNotification(UAVObject *object); + void repeatTimerHandler(void); + void expireTimerHandler(void); + void stateChanged(Phonon::State newstate, Phonon::State oldstate); + +private: + bool configured; // just for migration,delete later bool enableSound; QList< QList* > lstMediaSource; @@ -90,21 +110,6 @@ private: PhononObject phonon; NotifyPluginOptionsPage *mop; TelemetryManager* telMngr; - - bool playNotification(NotificationItem* notification); - void checkNotificationRule(NotificationItem* notification, UAVObject* object); - void readConfig_0_0_0(); - -private slots: - void onTelemetryManagerAdded(QObject* obj); - void onAutopilotDisconnect(); - void connectNotifications(); - void updateNotificationList(QList list); - void resetNotification(void); - void appendNotification(UAVObject *object); - void repeatTimerHandler(void); - void expireTimerHandler(void); - void stateChanged(Phonon::State newstate, Phonon::State oldstate); }; #endif // SOUNDNOTIFYPLUGIN_H diff --git a/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.cpp b/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.cpp index 686c59c3b..cee9a4027 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.cpp +++ b/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.cpp @@ -44,24 +44,26 @@ #include "notifyitemdelegate.h" #include "notifytablemodel.h" -NotifyPluginOptionsPage::NotifyPluginOptionsPage(/*NotificationItem *config,*/ QObject *parent) : - IOptionsPage(parent), - owner((SoundNotifyPlugin*)parent), - currentCollectionPath(""), - privListNotifications(((SoundNotifyPlugin*)parent)->getListNotifications()) +NotifyPluginOptionsPage::NotifyPluginOptionsPage(/*NotificationItem *config,*/ QObject *parent) + : IOptionsPage(parent) + , objManager(*ExtensionSystem::PluginManager::instance()->getObject()) + , owner(qobject_cast(parent)) + , currentCollectionPath("") + , privListNotifications((qobject_cast(parent))->getListNotifications()) { - } +NotifyPluginOptionsPage::~NotifyPluginOptionsPage() +{ +} //creates options page widget (uses the UI file) QWidget *NotifyPluginOptionsPage::createPage(QWidget *parent) { - - options_page = new Ui::NotifyPluginOptionsPage(); - //main widget - QWidget *optionsPageWidget = new QWidget; - //main layout + options_page.reset(new Ui::NotifyPluginOptionsPage()); + //main widget + QWidget *optionsPageWidget = new QWidget; + //main layout options_page->setupUi(optionsPageWidget); delegateItems.clear(); @@ -73,17 +75,11 @@ QWidget *NotifyPluginOptionsPage::createPage(QWidget *parent) << "Repeat 30 seconds" << "Repeat 1 minute"; - options_page->chkEnableSound->setChecked(owner->getEnableSound()); options_page->SoundDirectoryPathChooser->setExpectedKind(Utils::PathChooser::Directory); options_page->SoundDirectoryPathChooser->setPromptDialogTitle(tr("Choose sound collection directory")); - - - ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); - objManager = pm->getObject(); - // Fills the combo boxes for the UAVObjects - QList< QList > objList = objManager->getDataObjects(); + QList< QList > objList = objManager.getDataObjects(); foreach (QList list, objList) { foreach (UAVDataObject* obj, list) { options_page->UAVObject->addItem(obj->getName()); @@ -92,13 +88,8 @@ QWidget *NotifyPluginOptionsPage::createPage(QWidget *parent) connect(options_page->SoundDirectoryPathChooser, SIGNAL(changed(const QString&)), this, SLOT(on_buttonSoundFolder_clicked(const QString&))); connect(options_page->SoundCollectionList, SIGNAL(currentIndexChanged (int)), this, SLOT(on_soundLanguage_indexChanged(int))); - connect(options_page->buttonAdd, SIGNAL(pressed()), this, SLOT(on_buttonAddNotification_clicked())); - connect(options_page->buttonDelete, SIGNAL(pressed()), this, SLOT(on_buttonDeleteNotification_clicked())); - connect(options_page->buttonModify, SIGNAL(pressed()), this, SLOT(on_buttonModifyNotification_clicked())); - connect(options_page->buttonPlayNotification, SIGNAL(clicked()), this, SLOT(on_buttonTestSoundNotification_clicked())); - connect(options_page->chkEnableSound, SIGNAL(toggled(bool)), this, SLOT(on_chkEnableSound_toggled(bool))); - connect(options_page->UAVObject, SIGNAL(currentIndexChanged(QString)), this, SLOT(on_UAVObject_indexChanged(QString))); + connect(this, SIGNAL(updateNotifications(QList)), owner, SLOT(updateNotificationList(QList))); connect(this, SIGNAL(resetNotification()),owner, SLOT(resetNotification())); @@ -115,20 +106,52 @@ QWidget *NotifyPluginOptionsPage::createPage(QWidget *parent) updateConfigView(owner->getCurrentNotification()); + initButtons(); + initRulesTableModel(); + initRulesTableView(); + initPhononPlayer(); + + return optionsPageWidget; +} + +void NotifyPluginOptionsPage::initButtons() +{ options_page->chkEnableSound->setChecked(owner->getEnableSound()); + connect(options_page->chkEnableSound, SIGNAL(toggled(bool)), this, SLOT(on_chkEnableSound_toggled(bool))); - notifyRulesModel = new NotifyTableModel(&privListNotifications); - options_page->notifyRulesView->setModel(notifyRulesModel); + options_page->buttonModify->setEnabled(false); + options_page->buttonDelete->setEnabled(false); + options_page->buttonPlayNotification->setEnabled(false); + connect(options_page->buttonAdd, SIGNAL(pressed()), this, SLOT(on_buttonAddNotification_clicked())); + connect(options_page->buttonDelete, SIGNAL(pressed()), this, SLOT(on_buttonDeleteNotification_clicked())); + connect(options_page->buttonModify, SIGNAL(pressed()), this, SLOT(on_buttonModifyNotification_clicked())); + connect(options_page->buttonPlayNotification, SIGNAL(clicked()), this, SLOT(on_buttonTestSoundNotification_clicked())); +} + +void NotifyPluginOptionsPage::initPhononPlayer() +{ + notifySound = Phonon::createPlayer(Phonon::NotificationCategory); + connect(notifySound,SIGNAL(stateChanged(Phonon::State,Phonon::State)), + this,SLOT(changeButtonText(Phonon::State,Phonon::State))); + connect(notifySound, SIGNAL(finished(void)), this, SLOT(onFinishedPlaying(void))); +} + +void NotifyPluginOptionsPage::initRulesTableModel() +{ + notifyRulesModel.reset(new NotifyTableModel(&privListNotifications)); + notifyRulesSelection = new QItemSelectionModel(notifyRulesModel.data()); + connect(notifyRulesSelection, SIGNAL(selectionChanged ( const QItemSelection &, const QItemSelection & )), + this, SLOT(on_tableNotification_changeSelection( const QItemSelection & , const QItemSelection & ))); + connect(this, SIGNAL(entryUpdated(int)), + notifyRulesModel.data(), SLOT(entryUpdated(int))); + connect(this, SIGNAL(entryAdded(int)), + notifyRulesModel.data(), SLOT(entryAdded(int))); +} + +void NotifyPluginOptionsPage::initRulesTableView() +{ + options_page->notifyRulesView->setModel(notifyRulesModel.data()); options_page->notifyRulesView->resizeRowsToContents(); - notifyRulesSelection = new QItemSelectionModel(notifyRulesModel); - connect(notifyRulesSelection, SIGNAL(selectionChanged ( const QItemSelection &, const QItemSelection & )), - this, SLOT(on_tableNotification_changeSelection( const QItemSelection & , const QItemSelection & ))); - connect(this, SIGNAL(entryUpdated(int)), - notifyRulesModel, SLOT(entryUpdated(int))); - connect(this, SIGNAL(entryAdded(int)), - notifyRulesModel, SLOT(entryAdded(int))); - - options_page->notifyRulesView->setSelectionModel(notifyRulesSelection); options_page->notifyRulesView->setItemDelegate(new NotifyItemDelegate(delegateItems,this)); @@ -136,17 +159,9 @@ QWidget *NotifyPluginOptionsPage::createPage(QWidget *parent) options_page->notifyRulesView->setColumnWidth(eREPEAT_VALUE,120); options_page->notifyRulesView->setColumnWidth(eEXPIRE_TIME,100); options_page->notifyRulesView->setColumnWidth(eENABLE_NOTIFICATION,60); - - options_page->buttonModify->setEnabled(false); - options_page->buttonDelete->setEnabled(false); - options_page->buttonPlayNotification->setEnabled(false); - - notifySound = Phonon::createPlayer(Phonon::NotificationCategory); - connect(notifySound,SIGNAL(stateChanged(Phonon::State,Phonon::State)), - this,SLOT(changeButtonText(Phonon::State,Phonon::State))); - connect(notifySound, SIGNAL(finished(void)), this, SLOT(onFinishedPlaying(void))); - - return optionsPageWidget; + options_page->notifyRulesView->setDragEnabled(true); + options_page->notifyRulesView->setAcceptDrops(true); + options_page->notifyRulesView->setDropIndicatorShown(true); } void NotifyPluginOptionsPage::getOptionsPageValues(NotificationItem* notification) @@ -183,8 +198,6 @@ void NotifyPluginOptionsPage::finish() notifySound->stop(); notifySound->clear(); } - if (options_page) - delete options_page; } ////////////////////////////////////////////////////////////////////////////// @@ -306,7 +319,7 @@ void NotifyPluginOptionsPage::updateConfigView(NotificationItem* notification) // Now load the object field values: options_page->UAVObjectField->clear(); QString uavDataObject = notification->getDataObject(); - UAVDataObject* obj = dynamic_cast( objManager->getObject(uavDataObject/*objList.at(0).at(0)->getName()*/) ); + UAVDataObject* obj = dynamic_cast(objManager.getObject(uavDataObject)); if (obj != NULL ) { QList fieldList = obj->getFields(); foreach (UAVObjectField* field, fieldList) { diff --git a/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.h b/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.h index 31da8373f..521cf9874 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.h +++ b/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.h @@ -42,16 +42,13 @@ #include #include #include +#include "ui_notifypluginoptionspage.h" +//#include "notifytablemodel.h" class NotifyTableModel; - class NotificationItem; class SoundNotifyPlugin; -namespace Ui { - class NotifyPluginOptionsPage; -} - using namespace Core; @@ -60,7 +57,7 @@ class NotifyPluginOptionsPage : public IOptionsPage Q_OBJECT public: explicit NotifyPluginOptionsPage(/*NotificationItem *config, */QObject *parent = 0); - + ~NotifyPluginOptionsPage(); QString id() const { return QLatin1String("settings"); } QString trName() const { return tr("settings"); } QString category() const { return QLatin1String("Notify Plugin");} @@ -77,7 +74,14 @@ public: void getOptionsPageValues(NotificationItem* notification); private: - UAVObjectManager *objManager; + //Q_DISABLE_COPY(NotifyPluginOptionsPage) + void initButtons(); + void initPhononPlayer(); + void initRulesTableModel(); + void initRulesTableView(); + +private: + UAVObjectManager& objManager; SoundNotifyPlugin* owner; QStringList listDirCollections; QStringList listSoundFiles; @@ -88,11 +92,11 @@ private: Phonon::MediaObject *notifySound; Phonon::AudioOutput *audioOutput; QStringList delegateItems; - NotifyTableModel* notifyRulesModel; + QScopedPointer notifyRulesModel; QItemSelectionModel *notifyRulesSelection; QList privListNotifications; - Ui::NotifyPluginOptionsPage *options_page; + QScopedPointer options_page; signals: void updateNotifications(QList list); diff --git a/ground/openpilotgcs/src/plugins/notify/notifytablemodel.cpp b/ground/openpilotgcs/src/plugins/notify/notifytablemodel.cpp index 6e503cbd8..f3c89b5b7 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifytablemodel.cpp +++ b/ground/openpilotgcs/src/plugins/notify/notifytablemodel.cpp @@ -109,26 +109,26 @@ QVariant NotifyTableModel::headerData(int section, Qt::Orientation orientation, return QVariant(); } -bool NotifyTableModel::insertRows(int position, int rows, const QModelIndex &index) +bool NotifyTableModel::insertRows(int position, int rows, const QModelIndex& index) { - Q_UNUSED(index); - beginInsertRows(QModelIndex(), position, position+rows-1); - endInsertRows(); - return true; + Q_UNUSED(index); + beginInsertRows(QModelIndex(), position, position+rows-1); + endInsertRows(); + return true; } - bool NotifyTableModel::removeRows(int position, int rows, const QModelIndex &index) - { - Q_UNUSED(index); - beginRemoveRows(QModelIndex(), position, position+rows-1); +bool NotifyTableModel::removeRows(int position, int rows, const QModelIndex& index) +{ + Q_UNUSED(index); + beginRemoveRows(QModelIndex(), position, position+rows-1); - for (int row=0; row < rows; ++row) { - _list->removeAt(position); - } + for (int row=0; row < rows; ++row) { + _list->removeAt(position); + } - endRemoveRows(); - return true; - } + endRemoveRows(); + return true; +} void NotifyTableModel::entryUpdated(int offset) { diff --git a/ground/openpilotgcs/src/plugins/notify/notifytablemodel.h b/ground/openpilotgcs/src/plugins/notify/notifytablemodel.h index 978605fbe..affae25da 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifytablemodel.h +++ b/ground/openpilotgcs/src/plugins/notify/notifytablemodel.h @@ -58,11 +58,16 @@ public: Qt::ItemFlags flags(const QModelIndex &index) const { if (!index.isValid()) - return Qt::ItemIsEnabled; + return Qt::ItemIsEnabled | Qt::ItemIsDropEnabled; - return QAbstractItemModel::flags(index) | Qt::ItemIsEditable; + return QAbstractItemModel::flags(index) | Qt::ItemIsEditable | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled; } + Qt::DropActions supportedDropActions() const + { + return Qt::MoveAction; + } + bool setData(const QModelIndex &index, const QVariant &value, int role); QVariant data(const QModelIndex &index, int role) const; QVariant headerData(int section, Qt::Orientation orientation, int role) const; From 56e71cd82ec0fbe0040d8dce03ee8097f70f8d37 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 16 Sep 2011 18:39:20 +0300 Subject: [PATCH 004/121] +removed public members in notificationitem; +cosmetic changes; +fixed indentation; --- .../internals/projections/lks94projection.h | 2 +- .../src/plugins/notify/NotificationItem.h | 156 +++--- .../src/plugins/notify/notificationitem.cpp | 420 ++++++++------- .../src/plugins/notify/notify.pro | 8 +- .../src/plugins/notify/notifyitemdelegate.cpp | 202 ++++---- .../src/plugins/notify/notifylogging.cpp | 42 ++ .../src/plugins/notify/notifylogging.h | 42 ++ .../src/plugins/notify/notifyplugin.cpp | 488 ++++++++---------- .../src/plugins/notify/notifyplugin.h | 1 - .../notify/notifypluginoptionspage.cpp | 469 +++++++++-------- .../notify/notifypluginoptionspage.cpp.orig | 465 +++++++++++++++++ .../plugins/notify/notifypluginoptionspage.h | 2 +- .../src/plugins/notify/notifytablemodel.cpp | 114 ++-- 13 files changed, 1493 insertions(+), 918 deletions(-) create mode 100644 ground/openpilotgcs/src/plugins/notify/notifylogging.cpp create mode 100644 ground/openpilotgcs/src/plugins/notify/notifylogging.h create mode 100644 ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.cpp.orig diff --git a/ground/openpilotgcs/src/libs/opmapcontrol/src/internals/projections/lks94projection.h b/ground/openpilotgcs/src/libs/opmapcontrol/src/internals/projections/lks94projection.h index dc895f04c..efbe9c394 100644 --- a/ground/openpilotgcs/src/libs/opmapcontrol/src/internals/projections/lks94projection.h +++ b/ground/openpilotgcs/src/libs/opmapcontrol/src/internals/projections/lks94projection.h @@ -28,7 +28,7 @@ #define LKS94PROJECTION_H #include #include "cmath" -#include "D:\!Work\OpenSource\OpenPilot\OpenPilot\ground\openpilotgcs\src\libs\opmapcontrol\src\internals\pureprojection.h" +#include "D:\!Work\OpenPilot\OpenPilot\ground\openpilotgcs\src\libs\opmapcontrol\src\internals\pureprojection.h" namespace projections { diff --git a/ground/openpilotgcs/src/plugins/notify/NotificationItem.h b/ground/openpilotgcs/src/plugins/notify/NotificationItem.h index c09e64982..ad7250060 100644 --- a/ground/openpilotgcs/src/plugins/notify/NotificationItem.h +++ b/ground/openpilotgcs/src/plugins/notify/NotificationItem.h @@ -40,113 +40,129 @@ using namespace Core; QString getSound##number() const { return _sound##number; } \ void setSound##number(QString text) { _sound##number = text; } \ -// QString getSound2() const { return _sound2; } -// void setSound2(QString text) { _sound2 = text; } - -// QString getSound3() const { return _sound3; } -// void setSound3(QString text) { _sound3 = text; } class NotificationItem : public QObject { - Q_OBJECT + Q_OBJECT public: - explicit NotificationItem(QObject *parent = 0); + explicit NotificationItem(QObject *parent = 0); - void copyTo(NotificationItem*) const; + void copyTo(NotificationItem*) const; - DECLARE_SOUND(1) - DECLARE_SOUND(2) - DECLARE_SOUND(3) + DECLARE_SOUND(1) + DECLARE_SOUND(2) + DECLARE_SOUND(3) - QString getValue() const { return _dataValue; } - void setValue(QString text) { _dataValue = text; } + QString getValue() const { return _dataValue; } + void setValue(QString text) { _dataValue = text; } - QString getSayOrder() const { return _sayOrder; } - void setSayOrder(QString text) { _sayOrder = text; } + QString getSayOrder() const { return _sayOrder; } + void setSayOrder(QString text) { _sayOrder = text; } - double getSpinBoxValue() const { return _spinBoxValue; } - void setSpinBoxValue(double value) { _spinBoxValue = value; } + double getSpinBoxValue() const { return _spinBoxValue; } + void setSpinBoxValue(double value) { _spinBoxValue = value; } - QString getDataObject() const { return _dataObject; } - void setDataObject(QString text) { _dataObject = text; } + QString getDataObject() const { return _dataObject; } + void setDataObject(QString text) { _dataObject = text; } - QString getObjectField() const { return _objectField; } - void setObjectField(QString text) { _objectField = text; } + QString getObjectField() const { return _objectField; } + void setObjectField(QString text) { _objectField = text; } - QString getSoundCollectionPath() const { return _soundCollectionPath; } - void setSoundCollectionPath(QString path) { _soundCollectionPath = path; } + QString getSoundCollectionPath() const { return _soundCollectionPath; } + void setSoundCollectionPath(QString path) { _soundCollectionPath = path; } - QString getCurrentLanguage() const { return _currentLanguage; } - void setCurrentLanguage(QString text) { _currentLanguage = text; } + QString getCurrentLanguage() const { return _currentLanguage; } + void setCurrentLanguage(QString text) { _currentLanguage = text; } - QStringList getMessageSequence() const { return _messageSequence; } - void setMessageSequence(QStringList sequence) { _messageSequence = sequence; } + QStringList getMessageSequence() const { return _messageSequence; } + void setMessageSequence(QStringList sequence) { _messageSequence = sequence; } - QString getRepeatFlag() const { return _repeatString; } - void setRepeatFlag(QString value) { _repeatString = value; } + QString getRepeatFlag() const { return _repeatString; } + void setRepeatFlag(QString value) { _repeatString = value; } - bool getRepeatTimeout() const { return _repeatTimeout; } - void setRepeatTimeout(bool value) { _repeatTimeout = value; } + bool getRepeatTimeout() const { return _repeatTimeout; } + void setRepeatTimeout(bool value) { _repeatTimeout = value; } - int getExpireTimeout() const { return _expireTimeout; } - void setExpireTimeout(int value) { _expireTimeout = value; } + int getExpireTimeout() const { return _expireTimeout; } + void setExpireTimeout(int value) { _expireTimeout = value; } - bool getEnableFlag() const { return _enableFlag; } - void setEnableFlag(bool value) { _enableFlag = value; } + bool getEnableFlag() const { return _enableFlag; } + void setEnableFlag(bool value) { _enableFlag = value; } - void saveState(QSettings* settings) const; - void restoreState(QSettings* settings); - QString parseNotifyMessage(); + void saveState(QSettings* settings) const; + void restoreState(QSettings* settings); - QTimer* timer; - QTimer* expireTimer; - bool isNowPlaying; // - bool firstStart; + QString parseNotifyMessage(); + + QTimer* getTimer() const { return _timer; } + void startTimer(int value); + void stopTimer(); + void disposeTimer(); + + QTimer* getExpireTimer() const { return _expireTimer; } + void startExpireTimer(); + void stopExpireTimer(); + + void disposeExpireTimer(); + + bool isNowPlaying; + bool firstStart; private: + void checkSoundFilesExisting(); - QStringList _messageSequence; +private: + QTimer* _timer; - //! path to folder with sound files - QString _soundCollectionPath; + //! time from putting notification in queue till moment when notification became out-of-date + //! NOTE: each notification has it lifetime, this time setups individually for each notification + //! according to its priority + QTimer* _expireTimer; - //! language in what notifications will be spelled - QString _currentLanguage; - //! one UAV object per one notification - QString _dataObject; - //! one field value change can be assigned to one notification - QString _objectField; + QStringList _messageSequence; - //! poled UAV field value - QString _dataValue; + //! path to folder with sound files + QString _soundCollectionPath; - //! possible sounds(at least one required to play notification) - QString _sound1; - QString _sound2; - QString _sound3; + //! language in what notifications will be spelled + QString _currentLanguage; - //! order in what sounds 1-3 will be played - QString _sayOrder; + //! one UAV object per one notification + QString _dataObject; - double _spinBoxValue; + //! one field value change can be assigned to one notification + QString _objectField; - QString _repeatString; + //! poled UAV field value + QString _dataValue; - //! time when next notification must be fired - bool _repeatTimeout; + //! possible sounds(at least one required to play notification) + QString _sound1; + QString _sound2; + QString _sound3; - //! how often or what periodicaly notification should be played - int _repeatTimerValue; + //! order in what sounds 1-3 will be played + QString _sayOrder; - //! time after event occured till notification became invalid - //! and will be removed from list - int _expireTimeout; + double _spinBoxValue; - //! enables/disables playing of current notification - bool _enableFlag; + QString _repeatString; + + //! time when next notification must be fired + bool _repeatTimeout; + + //! how often or what periodicaly notification should be played + int _repeatTimerValue; + + //! time after event occured till notification became invalid + //! and will be removed from list + int _expireTimeout; + + //! enables/disables playing of current notification + bool _enableFlag; }; Q_DECLARE_METATYPE(NotificationItem*) diff --git a/ground/openpilotgcs/src/plugins/notify/notificationitem.cpp b/ground/openpilotgcs/src/plugins/notify/notificationitem.cpp index 8d5cb25e3..69f085620 100644 --- a/ground/openpilotgcs/src/plugins/notify/notificationitem.cpp +++ b/ground/openpilotgcs/src/plugins/notify/notificationitem.cpp @@ -25,219 +25,277 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#include "NotificationItem.h" +#include "notificationitem.h" +#include "notifylogging.h" #include #include #include "utils/pathutils.h" -NotificationItem::NotificationItem(QObject *parent) : - QObject(parent), - isNowPlaying(0), - firstStart(1), - _soundCollectionPath(""), - _currentLanguage("default"), - _dataObject(""), - _objectField(""), - _dataValue("Equal to"), - _sound1(""), - _sound2(""), - _sound3(""), - _sayOrder("Never"), - _spinBoxValue(0), - _repeatString("Repeat Instantly"), - _repeatTimeout(true), - _expireTimeout(15) +NotificationItem::NotificationItem(QObject *parent) + : QObject(parent) + , isNowPlaying(0) + , firstStart(true) + , _soundCollectionPath("") + , _currentLanguage("default") + , _dataObject("") + , _objectField("") + , _dataValue("Equal to") + , _sound1("") + , _sound2("") + , _sound3("") + , _sayOrder("Never") + , _spinBoxValue(0) + , _repeatString("Repeat Instantly") + , _repeatTimeout(true) + , _expireTimeout(15) { - timer = NULL; - expireTimer = NULL; + _timer = NULL; + _expireTimer = NULL; } void NotificationItem::copyTo(NotificationItem* that) const { - - that->isNowPlaying = isNowPlaying; - that->firstStart = firstStart; - that->_soundCollectionPath = _soundCollectionPath; - that->_currentLanguage = _currentLanguage; - that->_soundCollectionPath = _soundCollectionPath; - that->_dataObject = _dataObject; - that->_objectField = _objectField; - that->_dataValue = _dataValue; - that->_sound1 = _sound1; - that->_sound2 = _sound2; - that->_sound3 = _sound3; - that->_sayOrder = _sayOrder; - that->_spinBoxValue = _spinBoxValue; - that->_repeatString = _repeatString; - that->_repeatTimeout = _repeatTimeout; - that->_expireTimeout = _expireTimeout; + that->isNowPlaying = isNowPlaying; + that->firstStart = firstStart; + that->_soundCollectionPath = _soundCollectionPath; + that->_currentLanguage = _currentLanguage; + that->_soundCollectionPath = _soundCollectionPath; + that->_dataObject = _dataObject; + that->_objectField = _objectField; + that->_dataValue = _dataValue; + that->_sound1 = _sound1; + that->_sound2 = _sound2; + that->_sound3 = _sound3; + that->_sayOrder = _sayOrder; + that->_spinBoxValue = _spinBoxValue; + that->_repeatString = _repeatString; + that->_repeatTimeout = _repeatTimeout; + that->_expireTimeout = _expireTimeout; } 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("Value"), getValue()); - settings->setValue(QLatin1String("ValueSpinBox"), getSpinBoxValue()); - settings->setValue(QLatin1String("Sound1"), getSound1()); - settings->setValue(QLatin1String("Sound2"), getSound2()); - settings->setValue(QLatin1String("Sound3"), getSound3()); - settings->setValue(QLatin1String("SayOrder"), getSayOrder()); - settings->setValue(QLatin1String("Repeat"), getRepeatFlag()); - settings->setValue(QLatin1String("ExpireTimeout"), getExpireTimeout()); + 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("Value"), getValue()); + settings->setValue(QLatin1String("ValueSpinBox"), getSpinBoxValue()); + settings->setValue(QLatin1String("Sound1"), getSound1()); + settings->setValue(QLatin1String("Sound2"), getSound2()); + settings->setValue(QLatin1String("Sound3"), getSound3()); + settings->setValue(QLatin1String("SayOrder"), getSayOrder()); + settings->setValue(QLatin1String("Repeat"), getRepeatFlag()); + settings->setValue(QLatin1String("ExpireTimeout"), getExpireTimeout()); } 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()); - setValue(settings->value(QLatin1String("Value"), tr("")).toString()); - 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("")).toString()); - setSpinBoxValue(settings->value(QLatin1String("ValueSpinBox"), tr("")).toDouble()); - setRepeatFlag(settings->value(QLatin1String("Repeat"), tr("")).toString()); - setExpireTimeout(settings->value(QLatin1String("ExpireTimeout"), tr("")).toInt()); + //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()); + setValue(settings->value(QLatin1String("Value"), tr("")).toString()); + 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("")).toString()); + setSpinBoxValue(settings->value(QLatin1String("ValueSpinBox"), tr("")).toDouble()); + setRepeatFlag(settings->value(QLatin1String("Repeat"), tr("")).toString()); + setExpireTimeout(settings->value(QLatin1String("ExpireTimeout"), tr("")).toInt()); } +void NotificationItem::startTimer(int value) { + if (!_timer) { + _timer = new QTimer(this); + _timer->setInterval(value); + } + 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; + } +} + QString NotificationItem::parseNotifyMessage() { - // tips: - // check of *.wav files exist needed for playing phonon queues; - // if phonon player don't find next file in queue, it buzz + // tips: + // check of *.wav files exist needed for playing phonon queues; + // if phonon player don't find next file in queue, it buzz - QString str,str1; - str1= getSayOrder(); - str = QString("%L1 ").arg(getSpinBoxValue()); - int position = 0xFF; - // generate queue of sound files to play - _messageSequence.clear(); + QString str,str1; + str1= getSayOrder(); + str = QString("%L1 ").arg(getSpinBoxValue()); + int position = 0xFF; + // generate queue of sound files to play + _messageSequence.clear(); - if(QFile::exists(QDir::toNativeSeparators(getSoundCollectionPath() + "/" + getCurrentLanguage()+"/"+getSound1()+".wav"))) - _messageSequence.append(QDir::toNativeSeparators(getSoundCollectionPath() + "/" + getCurrentLanguage()+"/"+getSound1()+".wav")); - else - if(QFile::exists(QDir::toNativeSeparators(getSoundCollectionPath() + "/default/"+getSound1()+".wav"))) - _messageSequence.append(QDir::toNativeSeparators(getSoundCollectionPath() + "/default/"+getSound1()+".wav")); + checkSoundFilesExisting(); - if("" != getSound2()) - { - if(QFile::exists(QDir::toNativeSeparators(getSoundCollectionPath() + "/" + getCurrentLanguage()+"/"+getSound2()+".wav"))) - _messageSequence.append(QDir::toNativeSeparators(getSoundCollectionPath() + "/" + getCurrentLanguage()+"/"+getSound2()+".wav")); - else - if(QFile::exists(QDir::toNativeSeparators(getSoundCollectionPath() + "/default/"+getSound2()+".wav"))) - _messageSequence.append(QDir::toNativeSeparators(getSoundCollectionPath() + "/default/"+getSound2()+".wav")); - } + if(!_messageSequence.size()) { + qNotifyDebug() << "no any files in message queue"; + } - if("" != getSound3()) - { - if(QFile::exists(QDir::toNativeSeparators(getSoundCollectionPath()+ "/" + getCurrentLanguage()+"/"+getSound3()+".wav"))) - _messageSequence.append(QDir::toNativeSeparators(getSoundCollectionPath()+ "/" + getCurrentLanguage()+"/"+getSound3()+".wav")); - else - if(QFile::exists(QDir::toNativeSeparators(getSoundCollectionPath()+"/default/"+getSound3()+".wav"))) - _messageSequence.append(QDir::toNativeSeparators(getSoundCollectionPath()+"/default/"+getSound3()+".wav")); - } + switch(str1.at(0).toAscii()) + { + case 'N'://NEVER: + str = getSound1()+" "+getSound2()+" "+getSound3(); + position = 0xFF; + break; - switch(str1.at(0).toAscii()) - { - case 'N'://NEVER: - str = getSound1()+" "+getSound2()+" "+getSound3(); - position = 0xFF; - break; + case 'B'://BEFORE: + str = QString("%L1 ").arg(getSpinBoxValue())+getSound1()+" "+getSound2()+" "+getSound3(); + position = 0; + break; - case 'B'://BEFORE: - str = QString("%L1 ").arg(getSpinBoxValue())+getSound1()+" "+getSound2()+" "+getSound3(); - position = 0; - break; + case 'A'://AFTER: + switch(str1.at(6).toAscii()) + { + case 'f': + str = getSound1()+QString(" %L1 ").arg(getSpinBoxValue())+getSound2()+" "+getSound3(); + position = 1; + break; + case 's': + str = getSound1()+" "+getSound2()+QString(" %L1").arg(getSpinBoxValue())+" "+getSound3(); + position = 2; + break; + case 't': + str = getSound1()+" "+getSound2()+" "+getSound3()+QString(" %L1").arg(getSpinBoxValue()); + position = 3; + break; + } + break; + } - case 'A'://AFTER: - switch(str1.at(6).toAscii()) - { - case 'f': - str = getSound1()+QString(" %L1 ").arg(getSpinBoxValue())+getSound2()+" "+getSound3(); - position = 1; - break; - case 's': - str = getSound1()+" "+getSound2()+QString(" %L1").arg(getSpinBoxValue())+" "+getSound3(); - position = 2; - break; - case 't': - str = getSound1()+" "+getSound2()+" "+getSound3()+QString(" %L1").arg(getSpinBoxValue()); - position = 3; - break; - } - break; - } + if(position != 0xFF) + { + QStringList numberParts = QString("%1").arg(getSpinBoxValue()).trimmed().split("."); + QStringList numberFiles; - if(position != 0xFF) - { - QStringList numberParts = QString("%1").arg(getSpinBoxValue()).trimmed().split("."); - QStringList numberFiles; + if((numberParts.at(0).size()==1) || (numberParts.at(0).toInt()<20)) + { + //if(numberParts.at(0)!="0") + numberFiles.append(numberParts.at(0)); + } else { + int i=0; + if(numberParts.at(0).right(2).toInt()<20 && numberParts.at(0).right(2).toInt()!=0) { + if(numberParts.at(0).right(2).toInt()<10) + numberFiles.append(numberParts.at(0).right(1)); + else + numberFiles.append(numberParts.at(0).right(2)); + i=2; + } + for(;i #include "notifyitemdelegate.h" #include "notifytablemodel.h" - +#include "notifylogging.h" NotifyItemDelegate::NotifyItemDelegate(QStringList items, QObject* parent) - : QItemDelegate(parent) - , _parent(parent) - , _items(items) + : QItemDelegate(parent) + , _parent(parent) + , _items(items) { } -QWidget *NotifyItemDelegate::createEditor(QWidget* parent, - const QStyleOptionViewItem& /*none*/, - const QModelIndex& index) const +QWidget *NotifyItemDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem& /*none*/, + const QModelIndex& index) const { - if(eREPEAT_VALUE == index.column()) { - QComboBox* editor = new QComboBox(parent); - editor->clear(); - editor->addItems(_items); - return editor; - } else { - if(eEXPIRE_TIME == index.column()) { - QSpinBox* editor = new QSpinBox(parent); - connect(editor, SIGNAL(editingFinished()), this, SLOT(commitAndCloseEditor())); - return editor; - } else { - if(eENABLE_NOTIFICATION == index.column()) { - QCheckBox* editor = new QCheckBox(parent); - connect(editor, SIGNAL(editingFinished()), this, SLOT(commitAndCloseEditor())); - return editor; - } - } - } - QLineEdit *editor = new QLineEdit(parent); - return editor; + if (eREPEAT_VALUE == index.column()) { + QComboBox* editor = new QComboBox(parent); + editor->clear(); + editor->addItems(_items); + return editor; + } else { + if (eEXPIRE_TIME == index.column()) { + QSpinBox* editor = new QSpinBox(parent); + connect(editor, SIGNAL(editingFinished()), this, SLOT(commitAndCloseEditor())); + return editor; + } else { + if (eENABLE_NOTIFICATION == index.column()) { + QCheckBox* editor = new QCheckBox(parent); + connect(editor, SIGNAL(editingFinished()), this, SLOT(commitAndCloseEditor())); + return editor; + } + } + } + QLineEdit *editor = new QLineEdit(parent); + return editor; } void NotifyItemDelegate::commitAndCloseEditor() { - QLineEdit* editor = qobject_cast(sender()); - if (editor) { - emit commitData(editor); - emit closeEditor(editor); - } else { - QComboBox* editor = qobject_cast(sender()); - if (editor) - { - emit commitData(editor); - emit closeEditor(editor); - } else { - QSpinBox* editor = qobject_cast(sender()); - if (editor) - { - emit commitData(editor); - emit closeEditor(editor); - } else { - QCheckBox* editor = qobject_cast(sender()); - if (editor) - { - emit commitData(editor); - emit closeEditor(editor); - } - } - } - } + QLineEdit* editor = qobject_cast(sender()); + if (editor) { + emit commitData(editor); + emit closeEditor(editor); + } else { + QComboBox* editor = qobject_cast(sender()); + if (editor) + { + emit commitData(editor); + emit closeEditor(editor); + } else { + QSpinBox* editor = qobject_cast(sender()); + if (editor) + { + emit commitData(editor); + emit closeEditor(editor); + } else { + QCheckBox* editor = qobject_cast(sender()); + if (editor) + { + emit commitData(editor); + emit closeEditor(editor); + } + } + } + } } void NotifyItemDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const { - QLineEdit* edit = qobject_cast(editor); - if(edit) { - edit->setText(index.model()->data(index, Qt::EditRole).toString()); - } else { - QComboBox* repeatEditor = qobject_cast(editor); - if(repeatEditor) - repeatEditor->setCurrentIndex(repeatEditor->findText(index.model()->data(index, Qt::EditRole).toString())); - else { - QSpinBox* expireEditor = qobject_cast(editor); - if(expireEditor) - expireEditor->setValue(index.model()->data(index, Qt::EditRole).toInt()); - else { - QCheckBox* enablePlayEditor = qobject_cast(editor); - if (enablePlayEditor) - enablePlayEditor->setChecked(index.model()->data(index, Qt::EditRole).toBool()); - } - } - } + QLineEdit* edit = qobject_cast(editor); + if (edit) { + edit->setText(index.model()->data(index, Qt::EditRole).toString()); + } else { + QComboBox* repeatEditor = qobject_cast(editor); + if (repeatEditor) + repeatEditor->setCurrentIndex(repeatEditor->findText(index.model()->data(index, Qt::EditRole).toString())); + else { + QSpinBox* expireEditor = qobject_cast(editor); + if (expireEditor) + expireEditor->setValue(index.model()->data(index, Qt::EditRole).toInt()); + else { + QCheckBox* enablePlayEditor = qobject_cast(editor); + if (enablePlayEditor) + enablePlayEditor->setChecked(index.model()->data(index, Qt::EditRole).toBool()); + } + } + } } void NotifyItemDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const { - QLineEdit *edit = qobject_cast(editor); - if(edit) { - model->setData(index, edit->text()); - } else { - QComboBox * repeatEditor = qobject_cast(editor); - if(repeatEditor) { - model->setData(index, repeatEditor->currentText()); - } else { - QSpinBox * expireEditor = qobject_cast(editor); - if(expireEditor) { - model->setData(index, expireEditor->value(), Qt::EditRole); - } else { - QCheckBox* enablePlayEditor = qobject_cast(editor); - if (enablePlayEditor) { - model->setData(index, enablePlayEditor->isChecked(), Qt::EditRole); - } - } - } - } + QLineEdit *edit = qobject_cast(editor); + if (edit) { + model->setData(index, edit->text()); + } else { + QComboBox * repeatEditor = qobject_cast(editor); + if (repeatEditor) { + model->setData(index, repeatEditor->currentText()); + } else { + QSpinBox * expireEditor = qobject_cast(editor); + if (expireEditor) { + model->setData(index, expireEditor->value(), Qt::EditRole); + } else { + QCheckBox* enablePlayEditor = qobject_cast(editor); + if (enablePlayEditor) { + model->setData(index, enablePlayEditor->isChecked(), Qt::EditRole); + } + } + } + } } -void NotifyItemDelegate::selectRow(const QString & text) +void NotifyItemDelegate::selectRow(const QString& text) { - QComboBox* combo = qobject_cast(sender()); - QTableWidget* table = new QTableWidget; - table = (QTableWidget*)(combo->parent()); + QComboBox* combo = qobject_cast(sender()); + QTableWidget* table = new QTableWidget; + table = (QTableWidget*)(combo->parent()); - qDebug() << table->columnCount(); - qDebug() << table->rowCount(); - qDebug() << table->currentRow(); + qNotifyDebug() << table->columnCount(); + qNotifyDebug() << table->rowCount(); + qNotifyDebug() << table->currentRow(); } -QSize NotifyItemDelegate::sizeHint(const QStyleOptionViewItem & option, - const QModelIndex & index) const +QSize NotifyItemDelegate::sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const { - QSize s = QItemDelegate::sizeHint(option, index); - s.setHeight(10); - return s; + QSize s = QItemDelegate::sizeHint(option, index); + s.setHeight(10); + return s; } diff --git a/ground/openpilotgcs/src/plugins/notify/notifylogging.cpp b/ground/openpilotgcs/src/plugins/notify/notifylogging.cpp new file mode 100644 index 000000000..616b2ada5 --- /dev/null +++ b/ground/openpilotgcs/src/plugins/notify/notifylogging.cpp @@ -0,0 +1,42 @@ +/** + ****************************************************************************** + * + * @file notifylogging.cpp + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. + * @brief Uses to logging only inside notify plugin, + * can be convinient turned on/off + * @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 + */ + +#include "notifylogging.h" + +#ifdef DEBUG_NOTIFIES +QDebug qNotifyDebug() +#endif +#ifndef DEBUG_NOTIFIES +QNoDebug qNotifyDebug() +#endif +{ +#ifdef DEBUG_NOTIFIES + return qDebug(); +#endif + return QNoDebug(); +} diff --git a/ground/openpilotgcs/src/plugins/notify/notifylogging.h b/ground/openpilotgcs/src/plugins/notify/notifylogging.h new file mode 100644 index 000000000..bf02b86df --- /dev/null +++ b/ground/openpilotgcs/src/plugins/notify/notifylogging.h @@ -0,0 +1,42 @@ +/** + ****************************************************************************** + * + * @file notifylogging.h + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. + * @brief Uses to logging only inside notify plugin, + * can be convinient turned on/off + * @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 + */ + +#ifndef NOTIFYLOGGING_H +#define NOTIFYLOGGING_H + +#include "QDebug.h" + +#ifdef DEBUG_NOTIFIES +QDebug qNotifyDebug(); +#endif +#ifndef DEBUG_NOTIFIES +QNoDebug qNotifyDebug(); +#endif + + +#endif // NOTIFYLOGGING_H diff --git a/ground/openpilotgcs/src/plugins/notify/notifyplugin.cpp b/ground/openpilotgcs/src/plugins/notify/notifyplugin.cpp index c959925b4..9eef49dec 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifyplugin.cpp +++ b/ground/openpilotgcs/src/plugins/notify/notifyplugin.cpp @@ -28,6 +28,7 @@ #include "notifyplugin.h" #include "notificationitem.h" #include "notifypluginoptionspage.h" +#include "notifylogging.h" #include #include #include @@ -43,18 +44,6 @@ static const QString VERSION = "1.0.0"; //#define DEBUG_NOTIFIES -#ifdef DEBUG_NOTIFIES -QDebug qNotifyDebug() -#endif -#ifndef DEBUG_NOTIFIES -QNoDebug qNotifyDebug() -#endif -{ -#ifdef DEBUG_NOTIFIES - return qDebug(); -#endif - return QNoDebug(); -} SoundNotifyPlugin::SoundNotifyPlugin() { @@ -84,15 +73,15 @@ bool SoundNotifyPlugin::initialize(const QStringList& args, QString *errMsg) void SoundNotifyPlugin::extensionsInitialized() { - Core::ICore::instance()->readSettings(this); - if ( !configured ){ - readConfig_0_0_0(); - } + Core::ICore::instance()->readSettings(this); + if ( !configured ){ + readConfig_0_0_0(); + } - ExtensionSystem::PluginManager* pm = ExtensionSystem::PluginManager::instance(); - connect(pm, SIGNAL(objectAdded(QObject*)), this, SLOT(onTelemetryManagerAdded(QObject*))); - removedNotifies.clear(); - connectNotifications(); + ExtensionSystem::PluginManager* pm = ExtensionSystem::PluginManager::instance(); + connect(pm, SIGNAL(objectAdded(QObject*)), this, SLOT(onTelemetryManagerAdded(QObject*))); + removedNotifies.clear(); + connectNotifications(); } void SoundNotifyPlugin::saveConfig( QSettings* settings, UAVConfigInfo *configInfo){ @@ -147,39 +136,39 @@ void SoundNotifyPlugin::readConfig( QSettings* settings, UAVConfigInfo *configIn void SoundNotifyPlugin::readConfig_0_0_0(){ - settings = Core::ICore::instance()->settings(); - settings->beginGroup(QLatin1String("NotifyPlugin")); + settings = Core::ICore::instance()->settings(); + settings->beginGroup(QLatin1String("NotifyPlugin")); - settings->beginReadArray("Current"); - settings->setArrayIndex(0); - currentNotification.restoreState(settings); - settings->endArray(); + settings->beginReadArray("Current"); + settings->setArrayIndex(0); + currentNotification.restoreState(settings); + settings->endArray(); - // read list of notifications from settings - int size = settings->beginReadArray("listNotifies"); - for (int i = 0; i < size; ++i) { - settings->setArrayIndex(i); - NotificationItem* notification = new NotificationItem; - notification->restoreState(settings); - lstNotifications.append(notification); - } - settings->endArray(); - setEnableSound(settings->value(QLatin1String("EnableSound"),0).toBool()); - settings->endGroup(); - - ExtensionSystem::PluginManager* pm = ExtensionSystem::PluginManager::instance(); - connect(pm, SIGNAL(objectAdded(QObject*)), this, SLOT(onTelemetryManagerAdded(QObject*))); - removedNotifies.clear(); - connectNotifications(); - - configured = true; - } + // read list of notifications from settings + int size = settings->beginReadArray("listNotifies"); + for (int i = 0; i < size; ++i) { + settings->setArrayIndex(i); + NotificationItem* notification = new NotificationItem; + notification->restoreState(settings); + lstNotifications.append(notification); + } + settings->endArray(); + setEnableSound(settings->value(QLatin1String("EnableSound"),0).toBool()); + settings->endGroup(); + + ExtensionSystem::PluginManager* pm = ExtensionSystem::PluginManager::instance(); + connect(pm, SIGNAL(objectAdded(QObject*)), this, SLOT(onTelemetryManagerAdded(QObject*))); + removedNotifies.clear(); + connectNotifications(); + + configured = true; +} void SoundNotifyPlugin::onTelemetryManagerAdded(QObject* obj) { - telMngr = qobject_cast(obj); - if(telMngr) - connect(telMngr, SIGNAL(disconnected()), this, SLOT(onAutopilotDisconnect())); + telMngr = qobject_cast(obj); + if (telMngr) + connect(telMngr, SIGNAL(disconnected()), this, SLOT(onAutopilotDisconnect())); } void SoundNotifyPlugin::shutdown() @@ -189,86 +178,76 @@ void SoundNotifyPlugin::shutdown() void SoundNotifyPlugin::onAutopilotDisconnect() { - connectNotifications(); + connectNotifications(); } /*! - clear any notify timers from previous flight; - reset will be perform on start of option page + clear any notify timers from previous flight; + reset will be perform on start of option page */ void SoundNotifyPlugin::resetNotification(void) { - //first, reject empty args and unknown fields. - foreach(NotificationItem* notify,lstNotifications) { - if(notify->timer) - { - disconnect(notify->timer, SIGNAL(timeout()), this, SLOT(repeatTimerHandler())); - notify->timer->stop(); - delete notify->timer; - notify->timer = NULL; - } - if(notify->expireTimer) - { - disconnect(notify->expireTimer, SIGNAL(timeout()), this, SLOT(expireTimerHandler())); - notify->expireTimer->stop(); - delete notify->expireTimer; - notify->expireTimer = NULL; - } - } + //first, reject empty args and unknown fields. + foreach(NotificationItem* ntf, lstNotifications) { + ntf->disposeTimer(); + disconnect(ntf->getTimer(), SIGNAL(timeout()), this, SLOT(repeatTimerHandler())); + ntf->disposeExpireTimer(); + disconnect(ntf->getExpireTimer(), SIGNAL(timeout()), this, SLOT(repeatTimerHandler())); + } } /*! - update list of notifies; - will be perform on OK or APPLY press of option page + update list of notifies; + will be perform on OK or APPLY press of option page */ void SoundNotifyPlugin::updateNotificationList(QList list) { - removedNotifies.clear(); - resetNotification(); - lstNotifications.clear(); - lstNotifications=list; - connectNotifications(); + removedNotifies.clear(); + resetNotification(); + lstNotifications.clear(); + lstNotifications=list; + connectNotifications(); - Core::ICore::instance()->saveSettings(this); + Core::ICore::instance()->saveSettings(this); } void SoundNotifyPlugin::connectNotifications() { - foreach(UAVDataObject* obj,lstNotifiedUAVObjects) { - if (obj != NULL) - disconnect(obj,SIGNAL(objectUpdated(UAVObject*)),this,SLOT(appendNotification(UAVObject*))); - } - if(phonon.mo != NULL) { - delete phonon.mo; - phonon.mo = NULL; - } + foreach(UAVDataObject* obj,lstNotifiedUAVObjects) { + if (obj != NULL) + disconnect(obj,SIGNAL(objectUpdated(UAVObject*)),this,SLOT(appendNotification(UAVObject*))); + } + if (phonon.mo != NULL) { + delete phonon.mo; + phonon.mo = NULL; + } - if(!enableSound) return; + if (!enableSound) return; - ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); - UAVObjectManager *objManager = pm->getObject(); + ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); + UAVObjectManager *objManager = pm->getObject(); - lstNotifiedUAVObjects.clear(); - pendingNotifications.clear(); - lstNotifications.append(removedNotifies); - removedNotifies.clear(); + lstNotifiedUAVObjects.clear(); + pendingNotifications.clear(); + lstNotifications.append(removedNotifies); + removedNotifies.clear(); - //first, reject empty args and unknown fields. - foreach(NotificationItem* notify, lstNotifications) { - notify->firstStart=true; - notify->isNowPlaying=false; + //first, reject empty args and unknown fields. + foreach(NotificationItem* notify, lstNotifications) { + notify->firstStart=true; + notify->isNowPlaying=false; - UAVDataObject* obj = dynamic_cast( objManager->getObject(notify->getDataObject()) ); - if (obj != NULL ) { - if(!lstNotifiedUAVObjects.contains(obj)) { - lstNotifiedUAVObjects.append(obj); - connect(obj, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(appendNotification(UAVObject*))); - } - } else - std::cout << "Error: Object is unknown (" << notify->getDataObject().toStdString() << ")." << std::endl; - } + UAVDataObject* obj = dynamic_cast( objManager->getObject(notify->getDataObject()) ); + if (obj != NULL ) { + if (!lstNotifiedUAVObjects.contains(obj)) { + lstNotifiedUAVObjects.append(obj); + connect(obj, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(appendNotification(UAVObject*))); + } + } else + std::cout << "Error: Object is unknown (" << notify->getDataObject().toStdString() << ")." << std::endl; + } - if(lstNotifications.isEmpty()) return; + if (lstNotifications.isEmpty()) return; // set notification message to current event phonon.mo = Phonon::createPlayer(Phonon::NotificationCategory); phonon.mo->clearQueue(); @@ -284,80 +263,73 @@ void SoundNotifyPlugin::connectNotifications() void SoundNotifyPlugin::appendNotification(UAVObject *object) { - disconnect(object, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(appendNotification(UAVObject*))); + disconnect(object, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(appendNotification(UAVObject*))); - foreach(NotificationItem* notification, lstNotifications) { - if(object->getName()!=notification->getDataObject()) - continue; + foreach(NotificationItem* ntf, lstNotifications) { + if (object->getName() != ntf->getDataObject()) + continue; - if(nowPlayingConfiguration == notification) - continue; + if (nowPlayingConfiguration == ntf) + continue; - if(notification->getRepeatFlag()!= "Repeat Instantly" && - notification->getRepeatFlag()!= "Repeat Once" && !notification->firstStart) - continue; + if (ntf->getRepeatFlag()!= "Repeat Instantly" && + ntf->getRepeatFlag()!= "Repeat Once" && !ntf->firstStart) + continue; - checkNotificationRule(notification,object); - } - connect(object, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(appendNotification(UAVObject*))); + checkNotificationRule(ntf,object); + } + connect(object, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(appendNotification(UAVObject*))); } void SoundNotifyPlugin::checkNotificationRule(NotificationItem* notification, UAVObject* object) { - bool condition=false; - double threshold; - QString direction; - QString fieldName; - threshold = notification->getSpinBoxValue(); - direction = notification->getValue(); - fieldName = notification->getObjectField(); - UAVObjectField* field = object->getField(fieldName); - if (field->getName()!="") { - double value = field->getDouble(); + bool condition=false; + double threshold; + QString direction; + QString fieldName; + threshold = notification->getSpinBoxValue(); + direction = notification->getValue(); + fieldName = notification->getObjectField(); + UAVObjectField* field = object->getField(fieldName); + if (field->getName()!="") { + double value = field->getDouble(); - switch(direction[0].toAscii()) - { - case 'E': - if(value==threshold) - condition = true; - break; - case 'G': - if(value>threshold) - condition = true; - break; - case 'L': - if(valuethreshold) + condition = true; + break; + case 'L': + if (valuetimer) - if(notification->timer->isActive()) - notification->timer->stop(); -#ifdef DEBUG_NOTIFIES - qDebug() << "add to pending list - " << notification->parseNotifyMessage(); -#endif - // if audio is busy, start expiration timer - //ms = (notification->getExpiredTimeout()[in sec])*1000 - //QxtTimer::singleShot(notification->getExpireTimeout()*1000, this, SLOT(expirationTimerHandler(NotificationItem*)), qVariantFromValue(notification)); - pendingNotifications.append(notification); - if(!notification->expireTimer) - { - notification->expireTimer = new QTimer(notification); - connect(notification->expireTimer, SIGNAL(timeout()), this, SLOT(expireTimerHandler())); - } - notification->expireTimer->start(notification->getExpireTimeout()*1000); - } - } - } + if (condition) + { + if (!playNotification(notification)) + { + if (!pendingNotifications.contains(notification)) + { + notification->stopTimer(); + + qNotifyDebug() << "add to pending list - " << notification->parseNotifyMessage(); + // if audio is busy, start expiration timer + //ms = (notification->getExpiredTimeout()[in sec])*1000 + //QxtTimer::singleShot(notification->getExpireTimeout()*1000, this, SLOT(expirationTimerHandler(NotificationItem*)), qVariantFromValue(notification)); + pendingNotifications.append(notification); + notification->startExpireTimer(); + connect(notification->getExpireTimer(), SIGNAL(timeout()), this, SLOT(expireTimerHandler())); + } + } + } } bool SoundNotifyPlugin::playNotification(NotificationItem* notification) @@ -366,132 +338,112 @@ bool SoundNotifyPlugin::playNotification(NotificationItem* notification) if (phonon.mo == NULL) return false; - if(!notification->getEnableFlag()) return true; + if (!notification->getEnableFlag()) return true; -#ifdef DEBUG_NOTIFIES - qDebug() << "Phonon State: " << phonon.mo->state(); -#endif - if((phonon.mo->state()==Phonon::PausedState) - || (phonon.mo->state()==Phonon::StoppedState) - || phonon.firstPlay) - { - // don't fire expire timer - nowPlayingConfiguration = notification; - if(notification->expireTimer) - notification->expireTimer->stop(); + qNotifyDebug() << "Phonon State: " << phonon.mo->state(); + if ((phonon.mo->state()==Phonon::PausedState) + || (phonon.mo->state()==Phonon::StoppedState) + || phonon.firstPlay) + { + // don't fire expire timer + nowPlayingConfiguration = notification; + notification->stopExpireTimer(); - if(notification->getRepeatFlag()=="Repeat Once") - { - removedNotifies.append(lstNotifications.takeAt(lstNotifications.indexOf(notification))); - } - else { - if(notification->getRepeatFlag()!="Repeat Instantly") - { - QRegExp rxlen("(\\d+)"); - QString value; - int timer_value; - int pos = rxlen.indexIn(notification->getRepeatFlag()); - if (pos > -1) { - value = rxlen.cap(1); // "189" - timer_value = (value.toInt()+8)*1000; //ms*1000 + average duration of meassage - } + if (notification->getRepeatFlag()=="Repeat Once") { + removedNotifies.append(lstNotifications.takeAt(lstNotifications.indexOf(notification))); + } else { + if (notification->getRepeatFlag()!="Repeat Instantly") + { + QRegExp rxlen("(\\d+)"); + QString value; + int timer_value; + int pos = rxlen.indexIn(notification->getRepeatFlag()); + if (pos > -1) { + value = rxlen.cap(1); // "189" + timer_value = (value.toInt()+8)*1000; //ms*1000 + average duration of meassage + } - if(!notification->timer) - { - notification->timer = new QTimer(notification); - notification->timer->setInterval(timer_value); - connect(notification->timer, SIGNAL(timeout()), this, SLOT(repeatTimerHandler())); - } - if(!notification->timer->isActive()) - notification->timer->start(); - } - } - notification->firstStart=false; - phonon.mo->clear(); - QString str = notification->parseNotifyMessage(); - qNotifyDebug() << "play notification - " << str; + notification->startTimer(timer_value); + connect(notification->getTimer(), SIGNAL(timeout()), this, SLOT(repeatTimerHandler())); + } + } + notification->firstStart=false; + phonon.mo->clear(); + QString str = notification->parseNotifyMessage(); + qNotifyDebug() << "play notification - " << str; + foreach (QString item, notification->getMessageSequence()) { + Phonon::MediaSource *ms = new Phonon::MediaSource(item); + ms->setAutoDelete(true); + phonon.mo->enqueue(*ms); + } + phonon.mo->play(); + phonon.firstPlay = false; // On Linux, you sometimes have to nudge Phonon to play 1 time before + // the state is not "Loading" anymore. + } + else + return false; // if audio is busy - foreach(QString item, notification->getMessageSequence()) { - Phonon::MediaSource *ms = new Phonon::MediaSource(item); - ms->setAutoDelete(true); - phonon.mo->enqueue(*ms); - } - phonon.mo->play(); - phonon.firstPlay = false; // On Linux, you sometimes have to nudge Phonon to play 1 time before - // the state is not "Loading" anymore. - } - else - return false; // if audio is busy - - return true; + return true; } void SoundNotifyPlugin::repeatTimerHandler() { NotificationItem* notification = static_cast(sender()->parent()); -#ifdef DEBUG_NOTIFIES - qDebug() << "repeatTimerHandler - " << notification->parseNotifyMessage(); -#endif - ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); + + qNotifyDebug() << "repeatTimerHandler - " << notification->parseNotifyMessage(); + + ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); UAVObjectManager *objManager = pm->getObject(); UAVObject* object = objManager->getObject(notification->getDataObject()); - if(object) + if (object) checkNotificationRule(notification,object); } void SoundNotifyPlugin::expireTimerHandler() { - // fire expire timer - NotificationItem* notification = static_cast(sender()->parent()); - notification->expireTimer->stop(); + // fire expire timer + NotificationItem* notification = static_cast(sender()->parent()); + notification->stopExpireTimer(); - if(!pendingNotifications.isEmpty()) - { -#ifdef DEBUG_NOTIFIES - qDebug() << "expireTimerHandler - " << notification->parseNotifyMessage(); -#endif - pendingNotifications.removeOne(notification); - } + if (!pendingNotifications.isEmpty()) { + qNotifyDebug() << "expireTimerHandler - " << notification->parseNotifyMessage(); + pendingNotifications.removeOne(notification); + } } void SoundNotifyPlugin::stateChanged(Phonon::State newstate, Phonon::State oldstate) { Q_UNUSED(oldstate) -#ifdef DEBUG_NOTIFIES - qDebug() << "File length (ms): " << phonon.mo->totalTime(); - qDebug() << "New State: " << newstate; -#endif + qNotifyDebug() << "File length (ms): " << phonon.mo->totalTime(); + qNotifyDebug() << "New State: " << newstate; #ifndef Q_OS_WIN - // This is a hack to force Linux to wait until the end of the - // wav file before moving to the next in the queue. - // I wish I did not have to go through a #define, but I did not - // manage to make this work on both platforms any other way! - if (phonon.mo->totalTime()>0) - phonon.mo->setTransitionTime(phonon.mo->totalTime()); + // This is a hack to force Linux to wait until the end of the + // wav file before moving to the next in the queue. + // I wish I did not have to go through a #define, but I did not + // manage to make this work on both platforms any other way! + if (phonon.mo->totalTime()>0) + phonon.mo->setTransitionTime(phonon.mo->totalTime()); #endif - if((newstate == Phonon::PausedState) || - (newstate == Phonon::StoppedState)) - { - nowPlayingConfiguration=NULL; - if(!pendingNotifications.isEmpty()) - { - NotificationItem* notification = pendingNotifications.takeFirst(); -#ifdef DEBUG_NOTIFIES - qDebug() << "play audioFree - " << notification->parseNotifyMessage(); -#endif - playNotification(notification); - } - } else if (newstate == Phonon::ErrorState) - { - if(phonon.mo->errorType()==0) { - qDebug() << "Phonon::ErrorState: ErrorType = " << phonon.mo->errorType(); - phonon.mo->clearQueue(); - } - } -// if(newstate == Phonon::BufferingState) -// qDebug() << "Phonon::BufferingState!!!"; + if ((newstate == Phonon::PausedState) || + (newstate == Phonon::StoppedState)) + { + nowPlayingConfiguration=NULL; + if (!pendingNotifications.isEmpty()) + { + NotificationItem* notification = pendingNotifications.takeFirst(); + qNotifyDebug() << "play audioFree - " << notification->parseNotifyMessage(); + playNotification(notification); + } + } else { + if (newstate == Phonon::ErrorState) { + if (phonon.mo->errorType()==0) { + qDebug() << "Phonon::ErrorState: ErrorType = " << phonon.mo->errorType(); + phonon.mo->clearQueue(); + } + } + } } Q_EXPORT_PLUGIN(SoundNotifyPlugin) diff --git a/ground/openpilotgcs/src/plugins/notify/notifyplugin.h b/ground/openpilotgcs/src/plugins/notify/notifyplugin.h index c1e0ce620..1d9475469 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifyplugin.h +++ b/ground/openpilotgcs/src/plugins/notify/notifyplugin.h @@ -49,7 +49,6 @@ typedef struct { } PhononObject, *pPhononObject; - class SoundNotifyPlugin : public Core::IConfigurablePlugin { Q_OBJECT diff --git a/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.cpp b/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.cpp index cee9a4027..caad0efff 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.cpp +++ b/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.cpp @@ -64,68 +64,67 @@ QWidget *NotifyPluginOptionsPage::createPage(QWidget *parent) //main widget QWidget *optionsPageWidget = new QWidget; //main layout - options_page->setupUi(optionsPageWidget); + options_page->setupUi(optionsPageWidget); - delegateItems.clear(); - listSoundFiles.clear(); + delegateItems.clear(); + listSoundFiles.clear(); - delegateItems << "Repeat Once" - << "Repeat Instantly" - << "Repeat 10 seconds" - << "Repeat 30 seconds" - << "Repeat 1 minute"; + delegateItems << "Repeat Once" + << "Repeat Instantly" + << "Repeat 10 seconds" + << "Repeat 30 seconds" + << "Repeat 1 minute"; - options_page->SoundDirectoryPathChooser->setExpectedKind(Utils::PathChooser::Directory); - options_page->SoundDirectoryPathChooser->setPromptDialogTitle(tr("Choose sound collection directory")); + options_page->SoundDirectoryPathChooser->setExpectedKind(Utils::PathChooser::Directory); + options_page->SoundDirectoryPathChooser->setPromptDialogTitle(tr("Choose sound collection directory")); - // Fills the combo boxes for the UAVObjects - QList< QList > objList = objManager.getDataObjects(); - foreach (QList list, objList) { - foreach (UAVDataObject* obj, list) { - options_page->UAVObject->addItem(obj->getName()); - } - } + // Fills the combo boxes for the UAVObjects + QList< QList > objList = objManager.getDataObjects(); + foreach (QList list, objList) { + foreach (UAVDataObject* obj, list) { + options_page->UAVObject->addItem(obj->getName()); + } + } - connect(options_page->SoundDirectoryPathChooser, SIGNAL(changed(const QString&)), this, SLOT(on_buttonSoundFolder_clicked(const QString&))); - connect(options_page->SoundCollectionList, SIGNAL(currentIndexChanged (int)), this, SLOT(on_soundLanguage_indexChanged(int))); - connect(options_page->UAVObject, SIGNAL(currentIndexChanged(QString)), this, SLOT(on_UAVObject_indexChanged(QString))); + connect(options_page->SoundDirectoryPathChooser, SIGNAL(changed(const QString&)), this, SLOT(on_buttonSoundFolder_clicked(const QString&))); + connect(options_page->SoundCollectionList, SIGNAL(currentIndexChanged (int)), this, SLOT(on_soundLanguage_indexChanged(int))); + connect(options_page->UAVObject, SIGNAL(currentIndexChanged(QString)), this, SLOT(on_UAVObject_indexChanged(QString))); - connect(this, SIGNAL(updateNotifications(QList)), - owner, SLOT(updateNotificationList(QList))); - connect(this, SIGNAL(resetNotification()),owner, SLOT(resetNotification())); + connect(this, SIGNAL(updateNotifications(QList)), + owner, SLOT(updateNotificationList(QList))); + //connect(this, SIGNAL(resetNotification()),owner, SLOT(resetNotification())); - //emit resetNotification(); - privListNotifications.clear(); + privListNotifications.clear(); - for (int i = 0; i < owner->getListNotifications().size(); ++i) { - NotificationItem* notification = new NotificationItem(); - owner->getListNotifications().at(i)->copyTo(notification); - privListNotifications.append(notification); - } + for (int i = 0; i < owner->getListNotifications().size(); ++i) { + NotificationItem* notification = new NotificationItem(); + owner->getListNotifications().at(i)->copyTo(notification); + privListNotifications.append(notification); + } - updateConfigView(owner->getCurrentNotification()); + updateConfigView(owner->getCurrentNotification()); - initButtons(); - initRulesTableModel(); - initRulesTableView(); - initPhononPlayer(); + initButtons(); + initRulesTableModel(); + initRulesTableView(); + initPhononPlayer(); - return optionsPageWidget; + return optionsPageWidget; } void NotifyPluginOptionsPage::initButtons() { - options_page->chkEnableSound->setChecked(owner->getEnableSound()); - connect(options_page->chkEnableSound, SIGNAL(toggled(bool)), this, SLOT(on_chkEnableSound_toggled(bool))); + options_page->chkEnableSound->setChecked(owner->getEnableSound()); + connect(options_page->chkEnableSound, SIGNAL(toggled(bool)), this, SLOT(on_chkEnableSound_toggled(bool))); - options_page->buttonModify->setEnabled(false); - options_page->buttonDelete->setEnabled(false); - options_page->buttonPlayNotification->setEnabled(false); - connect(options_page->buttonAdd, SIGNAL(pressed()), this, SLOT(on_buttonAddNotification_clicked())); - connect(options_page->buttonDelete, SIGNAL(pressed()), this, SLOT(on_buttonDeleteNotification_clicked())); - connect(options_page->buttonModify, SIGNAL(pressed()), this, SLOT(on_buttonModifyNotification_clicked())); - connect(options_page->buttonPlayNotification, SIGNAL(clicked()), this, SLOT(on_buttonTestSoundNotification_clicked())); + options_page->buttonModify->setEnabled(false); + options_page->buttonDelete->setEnabled(false); + options_page->buttonPlayNotification->setEnabled(false); + connect(options_page->buttonAdd, SIGNAL(pressed()), this, SLOT(on_buttonAddNotification_clicked())); + connect(options_page->buttonDelete, SIGNAL(pressed()), this, SLOT(on_buttonDeleteNotification_clicked())); + connect(options_page->buttonModify, SIGNAL(pressed()), this, SLOT(on_buttonModifyNotification_clicked())); + connect(options_page->buttonPlayNotification, SIGNAL(clicked()), this, SLOT(on_buttonTestSoundNotification_clicked())); } void NotifyPluginOptionsPage::initPhononPlayer() @@ -150,32 +149,32 @@ void NotifyPluginOptionsPage::initRulesTableModel() void NotifyPluginOptionsPage::initRulesTableView() { - options_page->notifyRulesView->setModel(notifyRulesModel.data()); - options_page->notifyRulesView->resizeRowsToContents(); - options_page->notifyRulesView->setSelectionModel(notifyRulesSelection); - options_page->notifyRulesView->setItemDelegate(new NotifyItemDelegate(delegateItems,this)); + options_page->notifyRulesView->setModel(notifyRulesModel.data()); + options_page->notifyRulesView->resizeRowsToContents(); + options_page->notifyRulesView->setSelectionModel(notifyRulesSelection); + options_page->notifyRulesView->setItemDelegate(new NotifyItemDelegate(delegateItems,this)); - options_page->notifyRulesView->setColumnWidth(eMESSAGE_NAME,200); - options_page->notifyRulesView->setColumnWidth(eREPEAT_VALUE,120); - options_page->notifyRulesView->setColumnWidth(eEXPIRE_TIME,100); - options_page->notifyRulesView->setColumnWidth(eENABLE_NOTIFICATION,60); - options_page->notifyRulesView->setDragEnabled(true); - options_page->notifyRulesView->setAcceptDrops(true); - options_page->notifyRulesView->setDropIndicatorShown(true); + options_page->notifyRulesView->setColumnWidth(eMESSAGE_NAME,200); + options_page->notifyRulesView->setColumnWidth(eREPEAT_VALUE,120); + options_page->notifyRulesView->setColumnWidth(eEXPIRE_TIME,100); + options_page->notifyRulesView->setColumnWidth(eENABLE_NOTIFICATION,60); + options_page->notifyRulesView->setDragEnabled(true); + options_page->notifyRulesView->setAcceptDrops(true); + options_page->notifyRulesView->setDropIndicatorShown(true); } void NotifyPluginOptionsPage::getOptionsPageValues(NotificationItem* notification) { - notification->setSoundCollectionPath(options_page->SoundDirectoryPathChooser->path()); - notification->setCurrentLanguage(options_page->SoundCollectionList->currentText()); - notification->setDataObject(options_page->UAVObject->currentText()); - notification->setObjectField(options_page->UAVObjectField->currentText()); - notification->setSound1(options_page->Sound1->currentText()); - notification->setSound2(options_page->Sound2->currentText()); - notification->setSound3(options_page->Sound3->currentText()); - notification->setSayOrder(options_page->SayOrder->currentText()); - notification->setValue(options_page->Value->currentText()); - notification->setSpinBoxValue(options_page->ValueSpinBox->value()); + notification->setSoundCollectionPath(options_page->SoundDirectoryPathChooser->path()); + notification->setCurrentLanguage(options_page->SoundCollectionList->currentText()); + notification->setDataObject(options_page->UAVObject->currentText()); + notification->setObjectField(options_page->UAVObjectField->currentText()); + notification->setSound1(options_page->Sound1->currentText()); + notification->setSound2(options_page->Sound2->currentText()); + notification->setSound3(options_page->Sound3->currentText()); + notification->setSayOrder(options_page->SayOrder->currentText()); + notification->setValue(options_page->Value->currentText()); + notification->setSpinBoxValue(options_page->ValueSpinBox->value()); } @@ -185,19 +184,19 @@ void NotifyPluginOptionsPage::getOptionsPageValues(NotificationItem* notificatio */ void NotifyPluginOptionsPage::apply() { - getOptionsPageValues(owner->getCurrentNotification()); - owner->setEnableSound(options_page->chkEnableSound->isChecked()); - emit updateNotifications(privListNotifications); + getOptionsPageValues(owner->getCurrentNotification()); + owner->setEnableSound(options_page->chkEnableSound->isChecked()); + emit updateNotifications(privListNotifications); } void NotifyPluginOptionsPage::finish() { - disconnect(notifySound,SIGNAL(stateChanged(Phonon::State,Phonon::State)), - this,SLOT(changeButtonText(Phonon::State,Phonon::State))); - if (notifySound) { - notifySound->stop(); - notifySound->clear(); - } + disconnect(notifySound,SIGNAL(stateChanged(Phonon::State,Phonon::State)), + this,SLOT(changeButtonText(Phonon::State,Phonon::State))); + if (notifySound) { + notifySound->stop(); + notifySound->clear(); + } } ////////////////////////////////////////////////////////////////////////////// @@ -205,247 +204,247 @@ void NotifyPluginOptionsPage::finish() // combo box ////////////////////////////////////////////////////////////////////////////// void NotifyPluginOptionsPage::on_UAVObject_indexChanged(QString val) { - options_page->UAVObjectField->clear(); - ExtensionSystem::PluginManager* pm = ExtensionSystem::PluginManager::instance(); - UAVObjectManager* objManager = pm->getObject(); + options_page->UAVObjectField->clear(); + ExtensionSystem::PluginManager* pm = ExtensionSystem::PluginManager::instance(); + UAVObjectManager* objManager = pm->getObject(); UAVDataObject* obj = dynamic_cast( objManager->getObject(val) ); QList fieldList = obj->getFields(); foreach (UAVObjectField* field, fieldList) { - options_page->UAVObjectField->addItem(field->getName()); + options_page->UAVObjectField->addItem(field->getName()); } } // locate collection folder on disk void NotifyPluginOptionsPage::on_buttonSoundFolder_clicked(const QString& path) { - QDir dirPath(path); - listDirCollections = dirPath.entryList(QDir::AllDirs | QDir::NoDotAndDotDot); - options_page->SoundCollectionList->clear(); - options_page->SoundCollectionList->addItems(listDirCollections); + QDir dirPath(path); + listDirCollections = dirPath.entryList(QDir::AllDirs | QDir::NoDotAndDotDot); + options_page->SoundCollectionList->clear(); + options_page->SoundCollectionList->addItems(listDirCollections); } void NotifyPluginOptionsPage::on_soundLanguage_indexChanged(int index) { - options_page->SoundCollectionList->setCurrentIndex(index); + options_page->SoundCollectionList->setCurrentIndex(index); currentCollectionPath = options_page->SoundDirectoryPathChooser->path() + QDir::toNativeSeparators("/" + options_page->SoundCollectionList->currentText()); - QDir dirPath(currentCollectionPath); - QStringList filters; - filters << "*.mp3" << "*.wav"; - dirPath.setNameFilters(filters); - listSoundFiles = dirPath.entryList(filters); - listSoundFiles.replaceInStrings(QRegExp(".mp3|.wav"), ""); - options_page->Sound1->clear(); - options_page->Sound2->clear(); - options_page->Sound3->clear(); - options_page->Sound1->addItems(listSoundFiles); - options_page->Sound2->addItem(""); - options_page->Sound2->addItems(listSoundFiles); - options_page->Sound3->addItem(""); - options_page->Sound3->addItems(listSoundFiles); + QDir dirPath(currentCollectionPath); + QStringList filters; + filters << "*.mp3" << "*.wav"; + dirPath.setNameFilters(filters); + listSoundFiles = dirPath.entryList(filters); + listSoundFiles.replaceInStrings(QRegExp(".mp3|.wav"), ""); + options_page->Sound1->clear(); + options_page->Sound2->clear(); + options_page->Sound3->clear(); + options_page->Sound1->addItems(listSoundFiles); + options_page->Sound2->addItem(""); + options_page->Sound2->addItems(listSoundFiles); + options_page->Sound3->addItem(""); + options_page->Sound3->addItems(listSoundFiles); } void NotifyPluginOptionsPage::changeButtonText(Phonon::State newstate, Phonon::State oldstate) { - //Q_ASSERT(Phonon::ErrorState != newstate); + //Q_ASSERT(Phonon::ErrorState != newstate); - if (newstate == Phonon::PausedState || newstate == Phonon::StoppedState) { - options_page->buttonPlayNotification->setText("Play"); - options_page->buttonPlayNotification->setIcon(QPixmap(":/notify/images/play.png")); - } else { - if (newstate == Phonon::PlayingState) { - options_page->buttonPlayNotification->setText("Stop"); - options_page->buttonPlayNotification->setIcon(QPixmap(":/notify/images/stop.png")); - } - } + if (newstate == Phonon::PausedState || newstate == Phonon::StoppedState) { + options_page->buttonPlayNotification->setText("Play"); + options_page->buttonPlayNotification->setIcon(QPixmap(":/notify/images/play.png")); + } else { + if (newstate == Phonon::PlayingState) { + options_page->buttonPlayNotification->setText("Stop"); + options_page->buttonPlayNotification->setIcon(QPixmap(":/notify/images/stop.png")); + } + } } void NotifyPluginOptionsPage::onFinishedPlaying() { - notifySound->clear(); + notifySound->clear(); } void NotifyPluginOptionsPage::on_buttonTestSoundNotification_clicked() { - NotificationItem* notification = NULL; + NotificationItem* notification = NULL; - if (-1 == notifyRulesSelection->currentIndex().row()) - return; - notifySound->clearQueue(); - notification = privListNotifications.at(notifyRulesSelection->currentIndex().row()); - notification->parseNotifyMessage(); - QStringList sequence = notification->getMessageSequence(); - Q_ASSERT(!!sequence.size()); - foreach(QString item, sequence) - notifySound->enqueue(Phonon::MediaSource(item)); + if (-1 == notifyRulesSelection->currentIndex().row()) + return; + notifySound->clearQueue(); + notification = privListNotifications.at(notifyRulesSelection->currentIndex().row()); + notification->parseNotifyMessage(); + QStringList sequence = notification->getMessageSequence(); + Q_ASSERT(!!sequence.size()); + foreach(QString item, sequence) + notifySound->enqueue(Phonon::MediaSource(item)); - notifySound->play(); + notifySound->play(); } void NotifyPluginOptionsPage::on_chkEnableSound_toggled(bool state) { - bool state1 = 1^state; + bool state1 = 1^state; - QList listOutputs = notifySound->outputPaths(); - Phonon::AudioOutput * audioOutput = (Phonon::AudioOutput*)listOutputs.last().sink(); - audioOutput->setMuted(state1); + QList listOutputs = notifySound->outputPaths(); + Phonon::AudioOutput * audioOutput = (Phonon::AudioOutput*)listOutputs.last().sink(); + audioOutput->setMuted(state1); } void NotifyPluginOptionsPage::updateConfigView(NotificationItem* notification) { - QString path = notification->getSoundCollectionPath(); - if (path == "") { - //QDir dir = QDir::currentPath(); - //path = QDir::currentPath().left(QDir::currentPath().indexOf("OpenPilot",0,Qt::CaseSensitive))+"../share/sounds"; - path = Utils::PathUtils().InsertDataPath("%%DATAPATH%%sounds"); - } + QString path = notification->getSoundCollectionPath(); + if (path == "") { + //QDir dir = QDir::currentPath(); + //path = QDir::currentPath().left(QDir::currentPath().indexOf("OpenPilot",0,Qt::CaseSensitive))+"../share/sounds"; + path = Utils::PathUtils().InsertDataPath("%%DATAPATH%%sounds"); + } - options_page->SoundDirectoryPathChooser->setPath(path); + options_page->SoundDirectoryPathChooser->setPath(path); - if (-1 != options_page->SoundCollectionList->findText(notification->getCurrentLanguage())){ - options_page->SoundCollectionList->setCurrentIndex(options_page->SoundCollectionList->findText(notification->getCurrentLanguage())); - } else { - options_page->SoundCollectionList->setCurrentIndex(options_page->SoundCollectionList->findText("default")); - } + if (-1 != options_page->SoundCollectionList->findText(notification->getCurrentLanguage())){ + options_page->SoundCollectionList->setCurrentIndex(options_page->SoundCollectionList->findText(notification->getCurrentLanguage())); + } else { + options_page->SoundCollectionList->setCurrentIndex(options_page->SoundCollectionList->findText("default")); + } - if (options_page->UAVObject->findText(notification->getDataObject())!=-1){ - options_page->UAVObject->setCurrentIndex(options_page->UAVObject->findText(notification->getDataObject())); - } + if (options_page->UAVObject->findText(notification->getDataObject())!=-1){ + options_page->UAVObject->setCurrentIndex(options_page->UAVObject->findText(notification->getDataObject())); + } - // Now load the object field values: - options_page->UAVObjectField->clear(); - QString uavDataObject = notification->getDataObject(); - UAVDataObject* obj = dynamic_cast(objManager.getObject(uavDataObject)); - if (obj != NULL ) { - QList fieldList = obj->getFields(); - foreach (UAVObjectField* field, fieldList) { - options_page->UAVObjectField->addItem(field->getName()); - } - } + // Now load the object field values: + options_page->UAVObjectField->clear(); + QString uavDataObject = notification->getDataObject(); + UAVDataObject* obj = dynamic_cast(objManager.getObject(uavDataObject)); + if (obj != NULL ) { + QList fieldList = obj->getFields(); + foreach (UAVObjectField* field, fieldList) { + options_page->UAVObjectField->addItem(field->getName()); + } + } - if (-1 != options_page->UAVObjectField->findText(notification->getObjectField())) { - options_page->UAVObjectField->setCurrentIndex(options_page->UAVObjectField->findText(notification->getObjectField())); - } + if (-1 != options_page->UAVObjectField->findText(notification->getObjectField())) { + options_page->UAVObjectField->setCurrentIndex(options_page->UAVObjectField->findText(notification->getObjectField())); + } - if (-1 != options_page->Sound1->findText(notification->getSound1())) { - options_page->Sound1->setCurrentIndex(options_page->Sound1->findText(notification->getSound1())); - } else { - // show item from default location - options_page->SoundCollectionList->setCurrentIndex(options_page->SoundCollectionList->findText("default")); - options_page->Sound1->setCurrentIndex(options_page->Sound1->findText(notification->getSound1())); + if (-1 != options_page->Sound1->findText(notification->getSound1())) { + options_page->Sound1->setCurrentIndex(options_page->Sound1->findText(notification->getSound1())); + } else { + // show item from default location + options_page->SoundCollectionList->setCurrentIndex(options_page->SoundCollectionList->findText("default")); + options_page->Sound1->setCurrentIndex(options_page->Sound1->findText(notification->getSound1())); - // don't show item if it wasn't find in stored location - //options_page->Sound1->setCurrentIndex(-1); - } + // don't show item if it wasn't find in stored location + //options_page->Sound1->setCurrentIndex(-1); + } - if (-1 != options_page->Sound2->findText(notification->getSound2())) { - options_page->Sound2->setCurrentIndex(options_page->Sound2->findText(notification->getSound2())); - } else { - // show item from default location - options_page->SoundCollectionList->setCurrentIndex(options_page->SoundCollectionList->findText("default")); - options_page->Sound2->setCurrentIndex(options_page->Sound2->findText(notification->getSound2())); + if (-1 != options_page->Sound2->findText(notification->getSound2())) { + options_page->Sound2->setCurrentIndex(options_page->Sound2->findText(notification->getSound2())); + } else { + // show item from default location + options_page->SoundCollectionList->setCurrentIndex(options_page->SoundCollectionList->findText("default")); + options_page->Sound2->setCurrentIndex(options_page->Sound2->findText(notification->getSound2())); - // don't show item if it wasn't find in stored location - //options_page->Sound2->setCurrentIndex(-1); - } + // don't show item if it wasn't find in stored location + //options_page->Sound2->setCurrentIndex(-1); + } - if (-1 != options_page->Sound3->findText(notification->getSound3())) { - options_page->Sound3->setCurrentIndex(options_page->Sound3->findText(notification->getSound3())); - } else { - // show item from default location - options_page->SoundCollectionList->setCurrentIndex(options_page->SoundCollectionList->findText("default")); - options_page->Sound3->setCurrentIndex(options_page->Sound3->findText(notification->getSound3())); - } + if (-1 != options_page->Sound3->findText(notification->getSound3())) { + options_page->Sound3->setCurrentIndex(options_page->Sound3->findText(notification->getSound3())); + } else { + // show item from default location + options_page->SoundCollectionList->setCurrentIndex(options_page->SoundCollectionList->findText("default")); + options_page->Sound3->setCurrentIndex(options_page->Sound3->findText(notification->getSound3())); + } - if (-1 != options_page->Value->findText(notification->getValue())) { - options_page->Value->setCurrentIndex(options_page->Value->findText(notification->getValue())); - } + if (-1 != options_page->Value->findText(notification->getValue())) { + options_page->Value->setCurrentIndex(options_page->Value->findText(notification->getValue())); + } - if (-1 != options_page->SayOrder->findText(notification->getSayOrder())) { - options_page->SayOrder->setCurrentIndex(options_page->SayOrder->findText(notification->getSayOrder())); - } + if (-1 != options_page->SayOrder->findText(notification->getSayOrder())) { + options_page->SayOrder->setCurrentIndex(options_page->SayOrder->findText(notification->getSayOrder())); + } - options_page->ValueSpinBox->setValue(notification->getSpinBoxValue()); + options_page->ValueSpinBox->setValue(notification->getSpinBoxValue()); } void NotifyPluginOptionsPage::on_tableNotification_changeSelection( const QItemSelection & selected, const QItemSelection & deselected ) { - bool select = false; - notifySound->stop(); - if (selected.indexes().size()) { - select = true; - updateConfigView(privListNotifications.at(selected.indexes().at(0).row())); - } + bool select = false; + notifySound->stop(); + if (selected.indexes().size()) { + select = true; + updateConfigView(privListNotifications.at(selected.indexes().at(0).row())); + } - options_page->buttonModify->setEnabled(select); - options_page->buttonDelete->setEnabled(select); - options_page->buttonPlayNotification->setEnabled(select); + options_page->buttonModify->setEnabled(select); + options_page->buttonDelete->setEnabled(select); + options_page->buttonPlayNotification->setEnabled(select); } void NotifyPluginOptionsPage::on_buttonAddNotification_clicked() { - NotificationItem* notification = new NotificationItem; + NotificationItem* notification = new NotificationItem; - if (options_page->SoundDirectoryPathChooser->path()=="") { - QPalette textPalette=options_page->SoundDirectoryPathChooser->palette(); - textPalette.setColor(QPalette::Normal,QPalette::Text, Qt::red); - options_page->SoundDirectoryPathChooser->setPalette(textPalette); - options_page->SoundDirectoryPathChooser->setPath("please select sound collection folder"); - return; - } + if (options_page->SoundDirectoryPathChooser->path()=="") { + QPalette textPalette=options_page->SoundDirectoryPathChooser->palette(); + textPalette.setColor(QPalette::Normal,QPalette::Text, Qt::red); + options_page->SoundDirectoryPathChooser->setPalette(textPalette); + options_page->SoundDirectoryPathChooser->setPath("please select sound collection folder"); + return; + } - notification->setSoundCollectionPath(options_page->SoundDirectoryPathChooser->path()); - notification->setCurrentLanguage(options_page->SoundCollectionList->currentText()); - notification->setDataObject(options_page->UAVObject->currentText()); - notification->setObjectField(options_page->UAVObjectField->currentText()); - notification->setValue(options_page->Value->currentText()); - notification->setSpinBoxValue(options_page->ValueSpinBox->value()); + notification->setSoundCollectionPath(options_page->SoundDirectoryPathChooser->path()); + notification->setCurrentLanguage(options_page->SoundCollectionList->currentText()); + notification->setDataObject(options_page->UAVObject->currentText()); + notification->setObjectField(options_page->UAVObjectField->currentText()); + notification->setValue(options_page->Value->currentText()); + notification->setSpinBoxValue(options_page->ValueSpinBox->value()); - if (options_page->Sound1->currentText().size() > 0) - notification->setSound1(options_page->Sound1->currentText()); + if (options_page->Sound1->currentText().size() > 0) + notification->setSound1(options_page->Sound1->currentText()); - notification->setSound2(options_page->Sound2->currentText()); - notification->setSound3(options_page->Sound3->currentText()); + notification->setSound2(options_page->Sound2->currentText()); + notification->setSound3(options_page->Sound3->currentText()); - if ( ((!options_page->Sound2->currentText().size()) && (options_page->SayOrder->currentText()=="After second")) - || ((!options_page->Sound3->currentText().size()) && (options_page->SayOrder->currentText()=="After third")) ) { - return; - } else { - notification->setSayOrder(options_page->SayOrder->currentText()); - } - privListNotifications.append(notification); - emit entryAdded(privListNotifications.size() - 1); - notifyRulesSelection->setCurrentIndex(notifyRulesModel->index(privListNotifications.size()-1,0,QModelIndex()), - QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows); +if ( ((!options_page->Sound2->currentText().size()) && (options_page->SayOrder->currentText()=="After second")) + || ((!options_page->Sound3->currentText().size()) && (options_page->SayOrder->currentText()=="After third")) ) { + return; + } else { + notification->setSayOrder(options_page->SayOrder->currentText()); + } + privListNotifications.append(notification); + emit entryAdded(privListNotifications.size() - 1); + notifyRulesSelection->setCurrentIndex(notifyRulesModel->index(privListNotifications.size()-1,0,QModelIndex()), + QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows); } void NotifyPluginOptionsPage::on_buttonDeleteNotification_clicked() { - notifyRulesModel->removeRow(notifyRulesSelection->currentIndex().row()); - if (!notifyRulesModel->rowCount() - && (notifyRulesSelection->currentIndex().row() > 0 - && notifyRulesSelection->currentIndex().row() < notifyRulesModel->rowCount()) ) - { - options_page->buttonDelete->setEnabled(false); - options_page->buttonModify->setEnabled(false); - options_page->buttonPlayNotification->setEnabled(false); - } + notifyRulesModel->removeRow(notifyRulesSelection->currentIndex().row()); + if (!notifyRulesModel->rowCount() + && (notifyRulesSelection->currentIndex().row() > 0 + && notifyRulesSelection->currentIndex().row() < notifyRulesModel->rowCount()) ) + { + options_page->buttonDelete->setEnabled(false); + options_page->buttonModify->setEnabled(false); + options_page->buttonPlayNotification->setEnabled(false); + } } void NotifyPluginOptionsPage::on_buttonModifyNotification_clicked() { - NotificationItem* notification = new NotificationItem; - getOptionsPageValues(notification); - notification->setRepeatFlag(privListNotifications.at(notifyRulesSelection->currentIndex().row())->getRepeatFlag()); - privListNotifications.replace(notifyRulesSelection->currentIndex().row(),notification); - entryUpdated(notifyRulesSelection->currentIndex().row()); + NotificationItem* notification = new NotificationItem; + getOptionsPageValues(notification); + notification->setRepeatFlag(privListNotifications.at(notifyRulesSelection->currentIndex().row())->getRepeatFlag()); + privListNotifications.replace(notifyRulesSelection->currentIndex().row(),notification); + entryUpdated(notifyRulesSelection->currentIndex().row()); } diff --git a/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.cpp.orig b/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.cpp.orig new file mode 100644 index 000000000..b91317c9f --- /dev/null +++ b/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.cpp.orig @@ -0,0 +1,465 @@ +/** + ****************************************************************************** + * + * @file notifypluginoptionspage.cpp + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. + * @brief Notify Plugin options page + * @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 + */ + +#include "notifypluginoptionspage.h" +#include +#include "notificationitem.h" +#include "ui_notifypluginoptionspage.h" +#include "extensionsystem/pluginmanager.h" +#include "utils/pathutils.h" + +#include +#include +#include +#include +#include +#include +#include + +#include "notifyplugin.h" +#include "notifyitemdelegate.h" +#include "notifytablemodel.h" + +NotifyPluginOptionsPage::NotifyPluginOptionsPage(/*NotificationItem *config,*/ QObject *parent) + : IOptionsPage(parent) + , objManager(*ExtensionSystem::PluginManager::instance()->getObject()) + , owner(qobject_cast(parent)) + , currentCollectionPath("") + , privListNotifications((qobject_cast(parent))->getListNotifications()) +{ +} + +NotifyPluginOptionsPage::~NotifyPluginOptionsPage() +{ +} + +//creates options page widget (uses the UI file) +QWidget *NotifyPluginOptionsPage::createPage(QWidget *parent) +{ + options_page.reset(new Ui::NotifyPluginOptionsPage()); + //main widget + QWidget *optionsPageWidget = new QWidget; + //main layout + options_page->setupUi(optionsPageWidget); + + delegateItems.clear(); + listSoundFiles.clear(); + + delegateItems << "Repeat Once" + << "Repeat Instantly" + << "Repeat 10 seconds" + << "Repeat 30 seconds" + << "Repeat 1 minute"; + + options_page->SoundDirectoryPathChooser->setExpectedKind(Utils::PathChooser::Directory); + options_page->SoundDirectoryPathChooser->setPromptDialogTitle(tr("Choose sound collection directory")); + + // Fills the combo boxes for the UAVObjects + QList< QList > objList = objManager.getDataObjects(); + foreach (QList list, objList) { + foreach (UAVDataObject* obj, list) { + options_page->UAVObject->addItem(obj->getName()); + } + } + + connect(options_page->SoundDirectoryPathChooser, SIGNAL(changed(const QString&)), this, SLOT(on_buttonSoundFolder_clicked(const QString&))); + connect(options_page->SoundCollectionList, SIGNAL(currentIndexChanged (int)), this, SLOT(on_soundLanguage_indexChanged(int))); + connect(options_page->UAVObject, SIGNAL(currentIndexChanged(QString)), this, SLOT(on_UAVObject_indexChanged(QString))); + + connect(this, SIGNAL(updateNotifications(QList)), + owner, SLOT(updateNotificationList(QList))); + connect(this, SIGNAL(resetNotification()),owner, SLOT(resetNotification())); + + //emit resetNotification(); + + privListNotifications.clear(); + + for (int i = 0; i < owner->getListNotifications().size(); ++i) { + NotificationItem* notification = new NotificationItem(); + owner->getListNotifications().at(i)->copyTo(notification); + privListNotifications.append(notification); + } + + updateConfigView(owner->getCurrentNotification()); + + initButtons(); + initRulesTableModel(); + initRulesTableView(); + initPhononPlayer(); + + return optionsPageWidget; +} + +void NotifyPluginOptionsPage::initButtons() +{ + options_page->chkEnableSound->setChecked(owner->getEnableSound()); + connect(options_page->chkEnableSound, SIGNAL(toggled(bool)), this, SLOT(on_chkEnableSound_toggled(bool))); + + options_page->buttonModify->setEnabled(false); + options_page->buttonDelete->setEnabled(false); + options_page->buttonPlayNotification->setEnabled(false); + connect(options_page->buttonAdd, SIGNAL(pressed()), this, SLOT(on_buttonAddNotification_clicked())); + connect(options_page->buttonDelete, SIGNAL(pressed()), this, SLOT(on_buttonDeleteNotification_clicked())); + connect(options_page->buttonModify, SIGNAL(pressed()), this, SLOT(on_buttonModifyNotification_clicked())); + connect(options_page->buttonPlayNotification, SIGNAL(clicked()), this, SLOT(on_buttonTestSoundNotification_clicked())); +} + +void NotifyPluginOptionsPage::initPhononPlayer() +{ + notifySound = Phonon::createPlayer(Phonon::NotificationCategory); + connect(notifySound,SIGNAL(stateChanged(Phonon::State,Phonon::State)), + this,SLOT(changeButtonText(Phonon::State,Phonon::State))); + connect(notifySound, SIGNAL(finished(void)), this, SLOT(onFinishedPlaying(void))); +} + +void NotifyPluginOptionsPage::initRulesTableModel() +{ + notifyRulesModel.reset(new NotifyTableModel(&privListNotifications)); + notifyRulesSelection = new QItemSelectionModel(notifyRulesModel.data()); + connect(notifyRulesSelection, SIGNAL(selectionChanged ( const QItemSelection &, const QItemSelection & )), + this, SLOT(on_tableNotification_changeSelection( const QItemSelection & , const QItemSelection & ))); + connect(this, SIGNAL(entryUpdated(int)), + notifyRulesModel.data(), SLOT(entryUpdated(int))); + connect(this, SIGNAL(entryAdded(int)), + notifyRulesModel.data(), SLOT(entryAdded(int))); +} + +void NotifyPluginOptionsPage::initRulesTableView() +{ + options_page->notifyRulesView->setModel(notifyRulesModel.data()); + options_page->notifyRulesView->resizeRowsToContents(); + options_page->notifyRulesView->setSelectionModel(notifyRulesSelection); + options_page->notifyRulesView->setItemDelegate(new NotifyItemDelegate(delegateItems,this)); + + options_page->notifyRulesView->setColumnWidth(eMESSAGE_NAME,200); + options_page->notifyRulesView->setColumnWidth(eREPEAT_VALUE,120); + options_page->notifyRulesView->setColumnWidth(eEXPIRE_TIME,100); + options_page->notifyRulesView->setColumnWidth(eENABLE_NOTIFICATION,60); + options_page->notifyRulesView->setDragEnabled(true); + options_page->notifyRulesView->setAcceptDrops(true); + options_page->notifyRulesView->setDropIndicatorShown(true); +} + +void NotifyPluginOptionsPage::getOptionsPageValues(NotificationItem* notification) +{ + notification->setSoundCollectionPath(options_page->SoundDirectoryPathChooser->path()); + notification->setCurrentLanguage(options_page->SoundCollectionList->currentText()); + notification->setDataObject(options_page->UAVObject->currentText()); + notification->setObjectField(options_page->UAVObjectField->currentText()); + notification->setSound1(options_page->Sound1->currentText()); + notification->setSound2(options_page->Sound2->currentText()); + notification->setSound3(options_page->Sound3->currentText()); + notification->setSayOrder(options_page->SayOrder->currentText()); + notification->setValue(options_page->Value->currentText()); + notification->setSpinBoxValue(options_page->ValueSpinBox->value()); + +} + +/*! +* Called when the user presses apply or OK. +* Saves the current values +*/ +void NotifyPluginOptionsPage::apply() +{ + getOptionsPageValues(owner->getCurrentNotification()); + owner->setEnableSound(options_page->chkEnableSound->isChecked()); + emit updateNotifications(privListNotifications); +} + +void NotifyPluginOptionsPage::finish() +{ + disconnect(notifySound,SIGNAL(stateChanged(Phonon::State,Phonon::State)), + this,SLOT(changeButtonText(Phonon::State,Phonon::State))); + if (notifySound) { + notifySound->stop(); + notifySound->clear(); + } +} + +////////////////////////////////////////////////////////////////////////////// +// Fills in the combo box when value is changed in the +// combo box +////////////////////////////////////////////////////////////////////////////// +void NotifyPluginOptionsPage::on_UAVObject_indexChanged(QString val) { + options_page->UAVObjectField->clear(); + ExtensionSystem::PluginManager* pm = ExtensionSystem::PluginManager::instance(); + UAVObjectManager* objManager = pm->getObject(); + UAVDataObject* obj = dynamic_cast( objManager->getObject(val) ); + QList fieldList = obj->getFields(); + foreach (UAVObjectField* field, fieldList) { + options_page->UAVObjectField->addItem(field->getName()); + } +} + +// locate collection folder on disk +void NotifyPluginOptionsPage::on_buttonSoundFolder_clicked(const QString& path) +{ + QDir dirPath(path); + listDirCollections = dirPath.entryList(QDir::AllDirs | QDir::NoDotAndDotDot); + options_page->SoundCollectionList->clear(); + options_page->SoundCollectionList->addItems(listDirCollections); +} + + +void NotifyPluginOptionsPage::on_soundLanguage_indexChanged(int index) +{ + options_page->SoundCollectionList->setCurrentIndex(index); + + currentCollectionPath = options_page->SoundDirectoryPathChooser->path() + + QDir::toNativeSeparators("/" + options_page->SoundCollectionList->currentText()); + + QDir dirPath(currentCollectionPath); + QStringList filters; + filters << "*.mp3" << "*.wav"; + dirPath.setNameFilters(filters); + listSoundFiles = dirPath.entryList(filters); + listSoundFiles.replaceInStrings(QRegExp(".mp3|.wav"), ""); + + options_page->Sound1->clear(); + options_page->Sound2->clear(); + options_page->Sound3->clear(); + options_page->Sound1->addItems(listSoundFiles); + options_page->Sound2->addItem(""); + options_page->Sound2->addItems(listSoundFiles); + options_page->Sound3->addItem(""); + options_page->Sound3->addItems(listSoundFiles); + +} + +void NotifyPluginOptionsPage::changeButtonText(Phonon::State newstate, Phonon::State oldstate) +{ + //Q_ASSERT(Phonon::ErrorState != newstate); + + if (newstate == Phonon::PausedState || newstate == Phonon::StoppedState) { + options_page->buttonPlayNotification->setText("Play"); + options_page->buttonPlayNotification->setIcon(QPixmap(":/notify/images/play.png")); + } else { + if (newstate == Phonon::PlayingState) { + options_page->buttonPlayNotification->setText("Stop"); + options_page->buttonPlayNotification->setIcon(QPixmap(":/notify/images/stop.png")); + } + } +} + +void NotifyPluginOptionsPage::onFinishedPlaying() +{ + notifySound->clear(); +} + +void NotifyPluginOptionsPage::on_buttonTestSoundNotification_clicked() +{ + NotificationItem* notification = NULL; + + if (-1 == notifyRulesSelection->currentIndex().row()) + return; + notifySound->clearQueue(); + notification = privListNotifications.at(notifyRulesSelection->currentIndex().row()); + notification->parseNotifyMessage(); + QStringList sequence = notification->getMessageSequence(); + Q_ASSERT(!!sequence.size()); + foreach(QString item, sequence) + notifySound->enqueue(Phonon::MediaSource(item)); + + notifySound->play(); +} + +void NotifyPluginOptionsPage::on_chkEnableSound_toggled(bool state) +{ + bool state1 = 1^state; + + QList listOutputs = notifySound->outputPaths(); + Phonon::AudioOutput * audioOutput = (Phonon::AudioOutput*)listOutputs.last().sink(); + audioOutput->setMuted(state1); +} + +void NotifyPluginOptionsPage::updateConfigView(NotificationItem* notification) +{ + QString path = notification->getSoundCollectionPath(); + if (path == "") { + //QDir dir = QDir::currentPath(); + //path = QDir::currentPath().left(QDir::currentPath().indexOf("OpenPilot",0,Qt::CaseSensitive))+"../share/sounds"; + path = Utils::PathUtils().InsertDataPath("%%DATAPATH%%sounds"); + } + + options_page->SoundDirectoryPathChooser->setPath(path); + + if (-1 != options_page->SoundCollectionList->findText(notification->getCurrentLanguage())){ + options_page->SoundCollectionList->setCurrentIndex(options_page->SoundCollectionList->findText(notification->getCurrentLanguage())); + } else { + options_page->SoundCollectionList->setCurrentIndex(options_page->SoundCollectionList->findText("default")); + } + + if (options_page->UAVObject->findText(notification->getDataObject())!=-1){ + options_page->UAVObject->setCurrentIndex(options_page->UAVObject->findText(notification->getDataObject())); + } + +<<<<<<< Updated upstream + // Now load the object field values: + options_page->UAVObjectField->clear(); + QString uavDataObject = notification->getDataObject(); + UAVDataObject* obj = dynamic_cast(objManager.getObject(uavDataObject)); + if (obj != NULL ) { + QList fieldList = obj->getFields(); + foreach (UAVObjectField* field, fieldList) { + options_page->UAVObjectField->addItem(field->getName()); + } + } +======= + // Now load the object field values: + options_page->UAVObjectField->clear(); + QString uavDataObject = notification->getDataObject(); + UAVDataObject* obj = dynamic_cast( objManager->getObject(uavDataObject/*objList.at(0).at(0)->getName()*/) ); + if (obj != NULL ) { + QList fieldList = obj->getFields(); + foreach (UAVObjectField* field, fieldList) { + options_page->UAVObjectField->addItem(field->getName()); + } + } +>>>>>>> Stashed changes + + if (-1 != options_page->UAVObjectField->findText(notification->getObjectField())) { + options_page->UAVObjectField->setCurrentIndex(options_page->UAVObjectField->findText(notification->getObjectField())); + } + + if (-1 != options_page->Sound1->findText(notification->getSound1())) { + options_page->Sound1->setCurrentIndex(options_page->Sound1->findText(notification->getSound1())); + } else { + // show item from default location + options_page->SoundCollectionList->setCurrentIndex(options_page->SoundCollectionList->findText("default")); + options_page->Sound1->setCurrentIndex(options_page->Sound1->findText(notification->getSound1())); + + // don't show item if it wasn't find in stored location + //options_page->Sound1->setCurrentIndex(-1); + } + + if (-1 != options_page->Sound2->findText(notification->getSound2())) { + options_page->Sound2->setCurrentIndex(options_page->Sound2->findText(notification->getSound2())); + } else { + // show item from default location + options_page->SoundCollectionList->setCurrentIndex(options_page->SoundCollectionList->findText("default")); + options_page->Sound2->setCurrentIndex(options_page->Sound2->findText(notification->getSound2())); + + // don't show item if it wasn't find in stored location + //options_page->Sound2->setCurrentIndex(-1); + } + + if (-1 != options_page->Sound3->findText(notification->getSound3())) { + options_page->Sound3->setCurrentIndex(options_page->Sound3->findText(notification->getSound3())); + } else { + // show item from default location + options_page->SoundCollectionList->setCurrentIndex(options_page->SoundCollectionList->findText("default")); + options_page->Sound3->setCurrentIndex(options_page->Sound3->findText(notification->getSound3())); + } + + if (-1 != options_page->Value->findText(notification->getValue())) { + options_page->Value->setCurrentIndex(options_page->Value->findText(notification->getValue())); + } + + if (-1 != options_page->SayOrder->findText(notification->getSayOrder())) { + options_page->SayOrder->setCurrentIndex(options_page->SayOrder->findText(notification->getSayOrder())); + } + + options_page->ValueSpinBox->setValue(notification->getSpinBoxValue()); +} + +void NotifyPluginOptionsPage::on_tableNotification_changeSelection( const QItemSelection & selected, const QItemSelection & deselected ) +{ + bool select = false; + notifySound->stop(); + if (selected.indexes().size()) { + select = true; + updateConfigView(privListNotifications.at(selected.indexes().at(0).row())); + } + + options_page->buttonModify->setEnabled(select); + options_page->buttonDelete->setEnabled(select); + options_page->buttonPlayNotification->setEnabled(select); +} + + +void NotifyPluginOptionsPage::on_buttonAddNotification_clicked() +{ + NotificationItem* notification = new NotificationItem; + + if (options_page->SoundDirectoryPathChooser->path()=="") { + QPalette textPalette=options_page->SoundDirectoryPathChooser->palette(); + textPalette.setColor(QPalette::Normal,QPalette::Text, Qt::red); + options_page->SoundDirectoryPathChooser->setPalette(textPalette); + options_page->SoundDirectoryPathChooser->setPath("please select sound collection folder"); + return; + } + + notification->setSoundCollectionPath(options_page->SoundDirectoryPathChooser->path()); + notification->setCurrentLanguage(options_page->SoundCollectionList->currentText()); + notification->setDataObject(options_page->UAVObject->currentText()); + notification->setObjectField(options_page->UAVObjectField->currentText()); + notification->setValue(options_page->Value->currentText()); + notification->setSpinBoxValue(options_page->ValueSpinBox->value()); + + if (options_page->Sound1->currentText().size() > 0) + notification->setSound1(options_page->Sound1->currentText()); + + notification->setSound2(options_page->Sound2->currentText()); + notification->setSound3(options_page->Sound3->currentText()); + + if ( ((!options_page->Sound2->currentText().size()) && (options_page->SayOrder->currentText()=="After second")) + || ((!options_page->Sound3->currentText().size()) && (options_page->SayOrder->currentText()=="After third")) ) { + return; + } else { + notification->setSayOrder(options_page->SayOrder->currentText()); + } + privListNotifications.append(notification); + emit entryAdded(privListNotifications.size() - 1); + notifyRulesSelection->setCurrentIndex(notifyRulesModel->index(privListNotifications.size()-1,0,QModelIndex()), + QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows); +} + + +void NotifyPluginOptionsPage::on_buttonDeleteNotification_clicked() +{ + notifyRulesModel->removeRow(notifyRulesSelection->currentIndex().row()); + if (!notifyRulesModel->rowCount() + && (notifyRulesSelection->currentIndex().row() > 0 + && notifyRulesSelection->currentIndex().row() < notifyRulesModel->rowCount()) ) + { + options_page->buttonDelete->setEnabled(false); + options_page->buttonModify->setEnabled(false); + options_page->buttonPlayNotification->setEnabled(false); + } + +} + +void NotifyPluginOptionsPage::on_buttonModifyNotification_clicked() +{ + NotificationItem* notification = new NotificationItem; + getOptionsPageValues(notification); + notification->setRepeatFlag(privListNotifications.at(notifyRulesSelection->currentIndex().row())->getRepeatFlag()); + privListNotifications.replace(notifyRulesSelection->currentIndex().row(),notification); + entryUpdated(notifyRulesSelection->currentIndex().row()); + +} + diff --git a/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.h b/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.h index 521cf9874..acb9f18e7 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.h +++ b/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.h @@ -100,7 +100,7 @@ private: signals: void updateNotifications(QList list); - void resetNotification(void); + //void resetNotification(void); void entryUpdated(int index); void entryAdded(int position); diff --git a/ground/openpilotgcs/src/plugins/notify/notifytablemodel.cpp b/ground/openpilotgcs/src/plugins/notify/notifytablemodel.cpp index f3c89b5b7..7c564a6df 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifytablemodel.cpp +++ b/ground/openpilotgcs/src/plugins/notify/notifytablemodel.cpp @@ -31,82 +31,82 @@ NotifyTableModel::NotifyTableModel(QList* parentList, QObject* parent) : QAbstractTableModel(parent) { - _headerStrings << "Name" << "Repeats" << "Lifetime,sec" << "Enable"; - _list.reset(parentList); + _headerStrings << "Name" << "Repeats" << "Lifetime,sec" << "Enable"; + _list.reset(parentList); } bool NotifyTableModel::setData(const QModelIndex &index, const QVariant &value, int role) { - if (index.isValid() && role == Qt::EditRole) { - if(eREPEAT_VALUE == index.column()) - _list->at(index.row())->setRepeatFlag(value.toString()); - else { - if(eEXPIRE_TIME == index.column()) - _list->at(index.row())->setExpireTimeout(value.toInt()); - else { - if(eENABLE_NOTIFICATION == index.column()) - _list->at(index.row())->setEnableFlag(value.toBool()); - } - } - emit dataChanged(index, index); - return true; - } - return false; + if (index.isValid() && role == Qt::EditRole) { + if(eREPEAT_VALUE == index.column()) + _list->at(index.row())->setRepeatFlag(value.toString()); + else { + if(eEXPIRE_TIME == index.column()) + _list->at(index.row())->setExpireTimeout(value.toInt()); + else { + if(eENABLE_NOTIFICATION == index.column()) + _list->at(index.row())->setEnableFlag(value.toBool()); + } + } + emit dataChanged(index, index); + return true; + } + return false; } QVariant NotifyTableModel::data(const QModelIndex &index, int role) const { - if (!index.isValid()) { - qWarning() << "NotifyTableModel::data - index.isValid()"; - return QVariant(); - } + if (!index.isValid()) { + qWarning() << "NotifyTableModel::data - index.isValid()"; + return QVariant(); + } - if (index.row() >= _list->size()) - return QVariant(); + if (index.row() >= _list->size()) + return QVariant(); - if (role == Qt::DisplayRole || role == Qt::EditRole) - { - switch(index.column()) - { - case eMESSAGE_NAME: - return _list->at(index.row())->parseNotifyMessage(); + if (role == Qt::DisplayRole || role == Qt::EditRole) + { + switch(index.column()) + { + case eMESSAGE_NAME: + return _list->at(index.row())->parseNotifyMessage(); - case eREPEAT_VALUE: - return _list->at(index.row())->getRepeatFlag(); + case eREPEAT_VALUE: + return _list->at(index.row())->getRepeatFlag(); - case eEXPIRE_TIME: - return _list->at(index.row())->getExpireTimeout(); + case eEXPIRE_TIME: + return _list->at(index.row())->getExpireTimeout(); - case eENABLE_NOTIFICATION: - return _list->at(index.row())->getEnableFlag(); + case eENABLE_NOTIFICATION: + return _list->at(index.row())->getEnableFlag(); - default: - return QVariant(); - } - } - else - { - if (Qt::SizeHintRole == role){ - return QVariant(10); - } - } - return QVariant(); + default: + return QVariant(); + } + } + else + { + if (Qt::SizeHintRole == role){ + return QVariant(10); + } + } + return QVariant(); } QVariant NotifyTableModel::headerData(int section, Qt::Orientation orientation, int role) const { - if (role != Qt::DisplayRole) - return QVariant(); + if (role != Qt::DisplayRole) + return QVariant(); - if (orientation == Qt::Horizontal) - return _headerStrings.at(section); - else - if(orientation == Qt::Vertical) - return QString("%1").arg(section); + if (orientation == Qt::Horizontal) + return _headerStrings.at(section); + else + if(orientation == Qt::Vertical) + return QString("%1").arg(section); - return QVariant(); + return QVariant(); } bool NotifyTableModel::insertRows(int position, int rows, const QModelIndex& index) @@ -132,11 +132,11 @@ bool NotifyTableModel::removeRows(int position, int rows, const QModelIndex& ind void NotifyTableModel::entryUpdated(int offset) { - QModelIndex idx = index(offset, 0); - emit dataChanged(idx, idx); + QModelIndex idx = index(offset, 0); + emit dataChanged(idx, idx); } void NotifyTableModel::entryAdded(int position) { - insertRows(position, 1,QModelIndex()); + insertRows(position, 1,QModelIndex()); } From 1665ae8299645c94d7cb6d7081b624e8dafd65b0 Mon Sep 17 00:00:00 2001 From: Nickolay Date: Mon, 19 Sep 2011 00:26:49 +0300 Subject: [PATCH 005/121] +reordering add some changes; --- .../internals/projections/lks94projection.h | 72 ------------------- 1 file changed, 72 deletions(-) delete mode 100644 ground/openpilotgcs/src/libs/opmapcontrol/src/internals/projections/lks94projection.h diff --git a/ground/openpilotgcs/src/libs/opmapcontrol/src/internals/projections/lks94projection.h b/ground/openpilotgcs/src/libs/opmapcontrol/src/internals/projections/lks94projection.h deleted file mode 100644 index efbe9c394..000000000 --- a/ground/openpilotgcs/src/libs/opmapcontrol/src/internals/projections/lks94projection.h +++ /dev/null @@ -1,72 +0,0 @@ -/** -****************************************************************************** -* -* @file lks94projection.h -* @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. -* @brief -* @see The GNU Public License (GPL) Version 3 -* @defgroup OPMapWidget -* @{ -* -*****************************************************************************/ -/* -* 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 -*/ -#ifndef LKS94PROJECTION_H -#define LKS94PROJECTION_H -#include -#include "cmath" -#include "D:\!Work\OpenPilot\OpenPilot\ground\openpilotgcs\src\libs\opmapcontrol\src\internals\pureprojection.h" - - -namespace projections { -class LKS94Projection:public internals::PureProjection -{ -public: - LKS94Projection(); - double GetTileMatrixResolution(int const& zoom); - virtual QString Type(){return "LKS94Projection";} - virtual Size TileSize() const; - virtual double Axis() const; - virtual double Flattening() const; - virtual core::Point FromLatLngToPixel(double lat, double lng, int const& zoom); - virtual internals::PointLatLng FromPixelToLatLng(int const& x, int const& y, int const& zoom); - virtual double GetGroundResolution(int const& zoom, double const& latitude); - virtual Size GetTileMatrixMinXY(int const& zoom); - virtual Size GetTileMatrixMaxXY(int const& zoom); - -private: - const double MinLatitude; - const double MaxLatitude; - const double MinLongitude; - const double MaxLongitude; - const double orignX; - const double orignY; - Size tileSize; - QVector DTM10(const QVector & lonlat); - QVector MTD10(QVector & pnt); - QVector DTM00(QVector & lonlat); - QVector DTM01(QVector & lonlat); - QVector MTD01(QVector & pnt); - QVector MTD11(QVector & p); - double Clip(double const& n, double const& minValue, double const& maxValue); -}; - -} -#endif // LKS94PROJECTION_H - - - - From 1af42e1b32d9d95845f62aa724e4fc0248f4bb7b Mon Sep 17 00:00:00 2001 From: Nickolay Date: Mon, 19 Sep 2011 00:30:57 +0300 Subject: [PATCH 006/121] + notify table reordering some changes --- .../src/plugins/notify/NotificationItem.h | 30 ++- .../src/plugins/notify/notificationitem.cpp | 50 ++++- .../src/plugins/notify/notifyitemdelegate.cpp | 10 +- .../src/plugins/notify/notifyitemdelegate.h | 4 +- .../src/plugins/notify/notifylogging.cpp | 13 +- .../src/plugins/notify/notifylogging.h | 8 +- .../src/plugins/notify/notifyplugin.cpp | 88 ++++----- .../notify/notifypluginoptionspage.cpp | 83 ++++----- .../plugins/notify/notifypluginoptionspage.h | 19 +- .../src/plugins/notify/notifytablemodel.cpp | 175 ++++++++++++++++-- .../src/plugins/notify/notifytablemodel.h | 23 ++- 11 files changed, 350 insertions(+), 153 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/notify/NotificationItem.h b/ground/openpilotgcs/src/plugins/notify/NotificationItem.h index ad7250060..da40d2afb 100644 --- a/ground/openpilotgcs/src/plugins/notify/NotificationItem.h +++ b/ground/openpilotgcs/src/plugins/notify/NotificationItem.h @@ -78,21 +78,22 @@ public: QStringList getMessageSequence() const { return _messageSequence; } void setMessageSequence(QStringList sequence) { _messageSequence = sequence; } - QString getRepeatFlag() const { return _repeatString; } - void setRepeatFlag(QString value) { _repeatString = value; } + QString retryString() const { return _repeatString; } + void setRetryString(QString value) { _repeatString = value; } - bool getRepeatTimeout() const { return _repeatTimeout; } - void setRepeatTimeout(bool value) { _repeatTimeout = value; } + int lifetime() const { return _expireTimeout; } + void setLifetime(int value) { _expireTimeout = value; } - int getExpireTimeout() const { return _expireTimeout; } - void setExpireTimeout(int value) { _expireTimeout = value; } - - bool getEnableFlag() const { return _enableFlag; } - void setEnableFlag(bool value) { _enableFlag = value; } + bool mute() const { return _mute; } + void setMute(bool value) { _mute = value; } void saveState(QSettings* settings) const; void restoreState(QSettings* settings); + + void seriaize(QDataStream& stream); + void deseriaize(QDataStream& stream); + QString parseNotifyMessage(); QTimer* getTimer() const { return _timer; } @@ -120,8 +121,6 @@ private: //! according to its priority QTimer* _expireTimer; - - QStringList _messageSequence; //! path to folder with sound files @@ -149,20 +148,15 @@ private: double _spinBoxValue; - QString _repeatString; - - //! time when next notification must be fired - bool _repeatTimeout; - //! how often or what periodicaly notification should be played - int _repeatTimerValue; + QString _repeatString; //! time after event occured till notification became invalid //! and will be removed from list int _expireTimeout; //! enables/disables playing of current notification - bool _enableFlag; + bool _mute; }; Q_DECLARE_METATYPE(NotificationItem*) diff --git a/ground/openpilotgcs/src/plugins/notify/notificationitem.cpp b/ground/openpilotgcs/src/plugins/notify/notificationitem.cpp index 69f085620..889b84261 100644 --- a/ground/openpilotgcs/src/plugins/notify/notificationitem.cpp +++ b/ground/openpilotgcs/src/plugins/notify/notificationitem.cpp @@ -47,8 +47,8 @@ NotificationItem::NotificationItem(QObject *parent) , _sayOrder("Never") , _spinBoxValue(0) , _repeatString("Repeat Instantly") - , _repeatTimeout(true) , _expireTimeout(15) + , _mute(false) { _timer = NULL; @@ -71,8 +71,9 @@ void NotificationItem::copyTo(NotificationItem* that) const that->_sayOrder = _sayOrder; that->_spinBoxValue = _spinBoxValue; that->_repeatString = _repeatString; - that->_repeatTimeout = _repeatTimeout; that->_expireTimeout = _expireTimeout; + that->_mute = _mute; + } @@ -88,8 +89,10 @@ void NotificationItem::saveState(QSettings* settings) const settings->setValue(QLatin1String("Sound2"), getSound2()); settings->setValue(QLatin1String("Sound3"), getSound3()); settings->setValue(QLatin1String("SayOrder"), getSayOrder()); - settings->setValue(QLatin1String("Repeat"), getRepeatFlag()); - settings->setValue(QLatin1String("ExpireTimeout"), getExpireTimeout()); + settings->setValue(QLatin1String("Repeat"), retryString()); + settings->setValue(QLatin1String("ExpireTimeout"), lifetime()); + settings->setValue(QLatin1String("Mute"), mute()); + } void NotificationItem::restoreState(QSettings* settings) @@ -105,10 +108,45 @@ void NotificationItem::restoreState(QSettings* settings) setSound3(settings->value(QLatin1String("Sound3"), tr("")).toString()); setSayOrder(settings->value(QLatin1String("SayOrder"), tr("")).toString()); setSpinBoxValue(settings->value(QLatin1String("ValueSpinBox"), tr("")).toDouble()); - setRepeatFlag(settings->value(QLatin1String("Repeat"), tr("")).toString()); - setExpireTimeout(settings->value(QLatin1String("ExpireTimeout"), tr("")).toInt()); + setRetryString(settings->value(QLatin1String("Repeat"), tr("")).toString()); + setLifetime(settings->value(QLatin1String("ExpireTimeout"), tr("")).toInt()); + setMute(settings->value(QLatin1String("Mute"), tr("")).toInt()); + } +void NotificationItem::seriaize(QDataStream& stream) +{ + stream << this->_soundCollectionPath; + stream << this->_currentLanguage; + stream << this->_dataObject; + stream << this->_objectField; + stream << this->_dataValue; + stream << this->_sound1; + stream << this->_sound2; + stream << this->_sound3; + stream << this->_sayOrder; + stream << this->_spinBoxValue; + stream << this->_repeatString; + stream << this->_expireTimeout; + stream << this->_mute; +} + +void NotificationItem::deseriaize(QDataStream& stream) +{ + stream >> this->_soundCollectionPath; + stream >> this->_currentLanguage; + stream >> this->_dataObject; + stream >> this->_objectField; + stream >> this->_dataValue; + stream >> this->_sound1; + stream >> this->_sound2; + stream >> this->_sound3; + stream >> this->_sayOrder; + stream >> this->_spinBoxValue; + stream >> this->_repeatString; + stream >> this->_expireTimeout; + stream >> this->_mute; +} void NotificationItem::startTimer(int value) { if (!_timer) { diff --git a/ground/openpilotgcs/src/plugins/notify/notifyitemdelegate.cpp b/ground/openpilotgcs/src/plugins/notify/notifyitemdelegate.cpp index f5f243e43..d418f0d26 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifyitemdelegate.cpp +++ b/ground/openpilotgcs/src/plugins/notify/notifyitemdelegate.cpp @@ -30,11 +30,15 @@ #include "notifytablemodel.h" #include "notifylogging.h" -NotifyItemDelegate::NotifyItemDelegate(QStringList items, QObject* parent) +NotifyItemDelegate::NotifyItemDelegate(QObject* parent) : QItemDelegate(parent) , _parent(parent) - , _items(items) { + _titles << "Repeat Once" + << "Repeat Instantly" + << "Repeat 10 seconds" + << "Repeat 30 seconds" + << "Repeat 1 minute"; } @@ -44,7 +48,7 @@ QWidget *NotifyItemDelegate::createEditor(QWidget* parent, const QStyleOptionVie if (eREPEAT_VALUE == index.column()) { QComboBox* editor = new QComboBox(parent); editor->clear(); - editor->addItems(_items); + editor->addItems(_titles); return editor; } else { if (eEXPIRE_TIME == index.column()) { diff --git a/ground/openpilotgcs/src/plugins/notify/notifyitemdelegate.h b/ground/openpilotgcs/src/plugins/notify/notifyitemdelegate.h index 01fa0794d..494e61c17 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifyitemdelegate.h +++ b/ground/openpilotgcs/src/plugins/notify/notifyitemdelegate.h @@ -37,7 +37,7 @@ class NotifyItemDelegate : public QItemDelegate Q_OBJECT public: - NotifyItemDelegate(QStringList items, QObject *parent = 0); + NotifyItemDelegate(QObject *parent = 0); QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &, const QModelIndex &index) const; void setEditorData(QWidget *editor, const QModelIndex &index) const; @@ -51,7 +51,7 @@ private slots: private: QObject* _parent; - QStringList _items; + QStringList _titles; }; diff --git a/ground/openpilotgcs/src/plugins/notify/notifylogging.cpp b/ground/openpilotgcs/src/plugins/notify/notifylogging.cpp index 616b2ada5..0a29cc6e6 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifylogging.cpp +++ b/ground/openpilotgcs/src/plugins/notify/notifylogging.cpp @@ -28,15 +28,16 @@ #include "notifylogging.h" -#ifdef DEBUG_NOTIFIES +#ifdef DEBUG_NOTIFIES_ENABLE QDebug qNotifyDebug() -#endif -#ifndef DEBUG_NOTIFIES -QNoDebug qNotifyDebug() -#endif { -#ifdef DEBUG_NOTIFIES return qDebug(); +} #endif + +#ifndef DEBUG_NOTIFIES_ENABLE +QNoDebug qNotifyDebug() +{ return QNoDebug(); } +#endif diff --git a/ground/openpilotgcs/src/plugins/notify/notifylogging.h b/ground/openpilotgcs/src/plugins/notify/notifylogging.h index bf02b86df..ea7ea331c 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifylogging.h +++ b/ground/openpilotgcs/src/plugins/notify/notifylogging.h @@ -31,12 +31,16 @@ #include "QDebug.h" -#ifdef DEBUG_NOTIFIES +#define DEBUG_NOTIFIES_ENABLE + +#ifdef DEBUG_NOTIFIES_ENABLE QDebug qNotifyDebug(); #endif -#ifndef DEBUG_NOTIFIES + +#ifndef DEBUG_NOTIFIES_ENABLE QNoDebug qNotifyDebug(); #endif +#define qNotifyDebug_if(test) if(test) qNotifyDebug() #endif // NOTIFYLOGGING_H diff --git a/ground/openpilotgcs/src/plugins/notify/notifyplugin.cpp b/ground/openpilotgcs/src/plugins/notify/notifyplugin.cpp index 9eef49dec..e7878c3da 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifyplugin.cpp +++ b/ground/openpilotgcs/src/plugins/notify/notifyplugin.cpp @@ -272,8 +272,8 @@ void SoundNotifyPlugin::appendNotification(UAVObject *object) if (nowPlayingConfiguration == ntf) continue; - if (ntf->getRepeatFlag()!= "Repeat Instantly" && - ntf->getRepeatFlag()!= "Repeat Once" && !ntf->firstStart) + if (ntf->retryString() != "Repeat Instantly" && + ntf->retryString() != "Repeat Once" && !ntf->firstStart) continue; checkNotificationRule(ntf,object); @@ -288,46 +288,47 @@ void SoundNotifyPlugin::checkNotificationRule(NotificationItem* notification, UA double threshold; QString direction; QString fieldName; + threshold = notification->getSpinBoxValue(); direction = notification->getValue(); fieldName = notification->getObjectField(); UAVObjectField* field = object->getField(fieldName); - if (field->getName()!="") { - double value = field->getDouble(); - switch(direction[0].toAscii()) - { - case 'E': - if (value==threshold) - condition = true; - break; - case 'G': - if (value>threshold) - condition = true; - break; - case 'L': - if (valuegetName() == "") + return; + + double value = field->getDouble(); + switch(direction[0].toAscii()) + { + case 'E': + condition = (value == threshold); + break; + + case 'G': + condition = (value > threshold); + break; + + case 'L': + condition = (value < threshold); + break; } - if (condition) - { - if (!playNotification(notification)) - { - if (!pendingNotifications.contains(notification)) - { - notification->stopTimer(); + if (!condition) + return; - qNotifyDebug() << "add to pending list - " << notification->parseNotifyMessage(); - // if audio is busy, start expiration timer - //ms = (notification->getExpiredTimeout()[in sec])*1000 - //QxtTimer::singleShot(notification->getExpireTimeout()*1000, this, SLOT(expirationTimerHandler(NotificationItem*)), qVariantFromValue(notification)); - pendingNotifications.append(notification); - notification->startExpireTimer(); - connect(notification->getExpireTimer(), SIGNAL(timeout()), this, SLOT(expireTimerHandler())); - } + if (!playNotification(notification)) + { + if (!pendingNotifications.contains(notification)) + { + notification->stopTimer(); + + qNotifyDebug() << "add to pending list - " << notification->parseNotifyMessage(); + // if audio is busy, start expiration timer + //ms = (notification->getExpiredTimeout()[in sec])*1000 + //QxtTimer::singleShot(notification->getExpireTimeout()*1000, this, SLOT(expirationTimerHandler(NotificationItem*)), qVariantFromValue(notification)); + pendingNotifications.append(notification); + notification->startExpireTimer(); + connect(notification->getExpireTimer(), SIGNAL(timeout()), this, SLOT(expireTimerHandler())); } } } @@ -338,26 +339,26 @@ bool SoundNotifyPlugin::playNotification(NotificationItem* notification) if (phonon.mo == NULL) return false; - if (!notification->getEnableFlag()) return true; + if (!notification->mute()) + return true; qNotifyDebug() << "Phonon State: " << phonon.mo->state(); if ((phonon.mo->state()==Phonon::PausedState) - || (phonon.mo->state()==Phonon::StoppedState) - || phonon.firstPlay) + || (phonon.mo->state()==Phonon::StoppedState) + || phonon.firstPlay) { // don't fire expire timer nowPlayingConfiguration = notification; notification->stopExpireTimer(); - if (notification->getRepeatFlag()=="Repeat Once") { + if (notification->retryString() == "Repeat Once") { removedNotifies.append(lstNotifications.takeAt(lstNotifications.indexOf(notification))); } else { - if (notification->getRepeatFlag()!="Repeat Instantly") - { + if (notification->retryString() != "Repeat Instantly") { QRegExp rxlen("(\\d+)"); QString value; int timer_value; - int pos = rxlen.indexIn(notification->getRepeatFlag()); + int pos = rxlen.indexIn(notification->retryString()); if (pos > -1) { value = rxlen.cap(1); // "189" timer_value = (value.toInt()+8)*1000; //ms*1000 + average duration of meassage @@ -379,10 +380,9 @@ bool SoundNotifyPlugin::playNotification(NotificationItem* notification) phonon.mo->play(); phonon.firstPlay = false; // On Linux, you sometimes have to nudge Phonon to play 1 time before // the state is not "Loading" anymore. - } - else + } else { return false; // if audio is busy - + } return true; } diff --git a/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.cpp b/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.cpp index caad0efff..a1122f078 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.cpp +++ b/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.cpp @@ -43,13 +43,13 @@ #include "notifyplugin.h" #include "notifyitemdelegate.h" #include "notifytablemodel.h" +#include "notifylogging.h" NotifyPluginOptionsPage::NotifyPluginOptionsPage(/*NotificationItem *config,*/ QObject *parent) : IOptionsPage(parent) , objManager(*ExtensionSystem::PluginManager::instance()->getObject()) , owner(qobject_cast(parent)) , currentCollectionPath("") - , privListNotifications((qobject_cast(parent))->getListNotifications()) { } @@ -66,15 +66,8 @@ QWidget *NotifyPluginOptionsPage::createPage(QWidget *parent) //main layout options_page->setupUi(optionsPageWidget); - delegateItems.clear(); listSoundFiles.clear(); - delegateItems << "Repeat Once" - << "Repeat Instantly" - << "Repeat 10 seconds" - << "Repeat 30 seconds" - << "Repeat 1 minute"; - options_page->SoundDirectoryPathChooser->setExpectedKind(Utils::PathChooser::Directory); options_page->SoundDirectoryPathChooser->setPromptDialogTitle(tr("Choose sound collection directory")); @@ -95,19 +88,13 @@ QWidget *NotifyPluginOptionsPage::createPage(QWidget *parent) //connect(this, SIGNAL(resetNotification()),owner, SLOT(resetNotification())); - privListNotifications.clear(); - - for (int i = 0; i < owner->getListNotifications().size(); ++i) { - NotificationItem* notification = new NotificationItem(); - owner->getListNotifications().at(i)->copyTo(notification); - privListNotifications.append(notification); - } +// privListNotifications = ((qobject_cast(parent))->getListNotifications()); + privListNotifications = owner->getListNotifications(); updateConfigView(owner->getCurrentNotification()); + initRulesTable(); initButtons(); - initRulesTableModel(); - initRulesTableView(); initPhononPlayer(); return optionsPageWidget; @@ -129,31 +116,32 @@ void NotifyPluginOptionsPage::initButtons() void NotifyPluginOptionsPage::initPhononPlayer() { - notifySound = Phonon::createPlayer(Phonon::NotificationCategory); - connect(notifySound,SIGNAL(stateChanged(Phonon::State,Phonon::State)), + notifySound.reset(Phonon::createPlayer(Phonon::NotificationCategory)); + connect(notifySound.data(),SIGNAL(stateChanged(Phonon::State,Phonon::State)), this,SLOT(changeButtonText(Phonon::State,Phonon::State))); - connect(notifySound, SIGNAL(finished(void)), this, SLOT(onFinishedPlaying(void))); + connect(notifySound.data(), SIGNAL(finished(void)), this, SLOT(onFinishedPlaying(void))); } -void NotifyPluginOptionsPage::initRulesTableModel() +void NotifyPluginOptionsPage::initRulesTable() { - notifyRulesModel.reset(new NotifyTableModel(&privListNotifications)); - notifyRulesSelection = new QItemSelectionModel(notifyRulesModel.data()); - connect(notifyRulesSelection, SIGNAL(selectionChanged ( const QItemSelection &, const QItemSelection & )), + qNotifyDebug_if(_notifyRulesModel.isNull()) << "_notifyRulesModel.isNull())"; + qNotifyDebug_if(!_notifyRulesSelection) << "_notifyRulesSelection.isNull())"; + //QItemSelectionModel* selection = _notifyRulesSelection.take(); + _notifyRulesModel.reset(new NotifyTableModel(privListNotifications)); + _notifyRulesSelection = new QItemSelectionModel(_notifyRulesModel.data()); + + connect(_notifyRulesSelection, SIGNAL(selectionChanged ( const QItemSelection &, const QItemSelection & )), this, SLOT(on_tableNotification_changeSelection( const QItemSelection & , const QItemSelection & ))); connect(this, SIGNAL(entryUpdated(int)), - notifyRulesModel.data(), SLOT(entryUpdated(int))); + _notifyRulesModel.data(), SLOT(entryUpdated(int))); connect(this, SIGNAL(entryAdded(int)), - notifyRulesModel.data(), SLOT(entryAdded(int))); -} + _notifyRulesModel.data(), SLOT(entryAdded(int))); + + options_page->notifyRulesView->setModel(_notifyRulesModel.data()); + options_page->notifyRulesView->setSelectionModel(_notifyRulesSelection); + options_page->notifyRulesView->setItemDelegate(new NotifyItemDelegate(this)); -void NotifyPluginOptionsPage::initRulesTableView() -{ - options_page->notifyRulesView->setModel(notifyRulesModel.data()); options_page->notifyRulesView->resizeRowsToContents(); - options_page->notifyRulesView->setSelectionModel(notifyRulesSelection); - options_page->notifyRulesView->setItemDelegate(new NotifyItemDelegate(delegateItems,this)); - options_page->notifyRulesView->setColumnWidth(eMESSAGE_NAME,200); options_page->notifyRulesView->setColumnWidth(eREPEAT_VALUE,120); options_page->notifyRulesView->setColumnWidth(eEXPIRE_TIME,100); @@ -161,6 +149,9 @@ void NotifyPluginOptionsPage::initRulesTableView() options_page->notifyRulesView->setDragEnabled(true); options_page->notifyRulesView->setAcceptDrops(true); options_page->notifyRulesView->setDropIndicatorShown(true); + options_page->notifyRulesView->setDragDropMode(QAbstractItemView::InternalMove); + + } void NotifyPluginOptionsPage::getOptionsPageValues(NotificationItem* notification) @@ -175,7 +166,6 @@ void NotifyPluginOptionsPage::getOptionsPageValues(NotificationItem* notificatio notification->setSayOrder(options_page->SayOrder->currentText()); notification->setValue(options_page->Value->currentText()); notification->setSpinBoxValue(options_page->ValueSpinBox->value()); - } /*! @@ -191,7 +181,7 @@ void NotifyPluginOptionsPage::apply() void NotifyPluginOptionsPage::finish() { - disconnect(notifySound,SIGNAL(stateChanged(Phonon::State,Phonon::State)), + disconnect(notifySound.data(),SIGNAL(stateChanged(Phonon::State,Phonon::State)), this,SLOT(changeButtonText(Phonon::State,Phonon::State))); if (notifySound) { notifySound->stop(); @@ -272,10 +262,10 @@ void NotifyPluginOptionsPage::on_buttonTestSoundNotification_clicked() { NotificationItem* notification = NULL; - if (-1 == notifyRulesSelection->currentIndex().row()) + if (-1 == _notifyRulesSelection->currentIndex().row()) return; notifySound->clearQueue(); - notification = privListNotifications.at(notifyRulesSelection->currentIndex().row()); + notification = privListNotifications.at(_notifyRulesSelection->currentIndex().row()); notification->parseNotifyMessage(); QStringList sequence = notification->getMessageSequence(); Q_ASSERT(!!sequence.size()); @@ -419,17 +409,17 @@ if ( ((!options_page->Sound2->currentText().size()) && (options_page->SayOrder-> } privListNotifications.append(notification); emit entryAdded(privListNotifications.size() - 1); - notifyRulesSelection->setCurrentIndex(notifyRulesModel->index(privListNotifications.size()-1,0,QModelIndex()), + _notifyRulesSelection->setCurrentIndex(_notifyRulesModel->index(privListNotifications.size()-1,0,QModelIndex()), QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows); } void NotifyPluginOptionsPage::on_buttonDeleteNotification_clicked() { - notifyRulesModel->removeRow(notifyRulesSelection->currentIndex().row()); - if (!notifyRulesModel->rowCount() - && (notifyRulesSelection->currentIndex().row() > 0 - && notifyRulesSelection->currentIndex().row() < notifyRulesModel->rowCount()) ) + _notifyRulesModel->removeRow(_notifyRulesSelection->currentIndex().row()); + if (!_notifyRulesModel->rowCount() + && (_notifyRulesSelection->currentIndex().row() > 0 + && _notifyRulesSelection->currentIndex().row() < _notifyRulesModel->rowCount()) ) { options_page->buttonDelete->setEnabled(false); options_page->buttonModify->setEnabled(false); @@ -442,9 +432,12 @@ void NotifyPluginOptionsPage::on_buttonModifyNotification_clicked() { NotificationItem* notification = new NotificationItem; getOptionsPageValues(notification); - notification->setRepeatFlag(privListNotifications.at(notifyRulesSelection->currentIndex().row())->getRepeatFlag()); - privListNotifications.replace(notifyRulesSelection->currentIndex().row(),notification); - entryUpdated(notifyRulesSelection->currentIndex().row()); + notification->setRetryString(privListNotifications.at(_notifyRulesSelection->currentIndex().row())->retryString()); + notification->setLifetime(privListNotifications.at(_notifyRulesSelection->currentIndex().row())->lifetime()); + notification->setMute(privListNotifications.at(_notifyRulesSelection->currentIndex().row())->mute()); + + privListNotifications.replace(_notifyRulesSelection->currentIndex().row(),notification); + entryUpdated(_notifyRulesSelection->currentIndex().row()); } diff --git a/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.h b/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.h index acb9f18e7..9e49e89ec 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.h +++ b/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.h @@ -42,13 +42,15 @@ #include #include #include -#include "ui_notifypluginoptionspage.h" //#include "notifytablemodel.h" class NotifyTableModel; class NotificationItem; class SoundNotifyPlugin; +namespace Ui { + class NotifyPluginOptionsPage; +}; using namespace Core; @@ -74,11 +76,11 @@ public: void getOptionsPageValues(NotificationItem* notification); private: - //Q_DISABLE_COPY(NotifyPluginOptionsPage) + Q_DISABLE_COPY(NotifyPluginOptionsPage) + void initButtons(); void initPhononPlayer(); - void initRulesTableModel(); - void initRulesTableView(); + void initRulesTable(); private: UAVObjectManager& objManager; @@ -86,14 +88,13 @@ private: QStringList listDirCollections; QStringList listSoundFiles; QString currentCollectionPath; - int sizeNotifyList; Phonon::MediaObject *sound1; Phonon::MediaObject *sound2; - Phonon::MediaObject *notifySound; + QScopedPointer notifySound; Phonon::AudioOutput *audioOutput; - QStringList delegateItems; - QScopedPointer notifyRulesModel; - QItemSelectionModel *notifyRulesSelection; + + QScopedPointer _notifyRulesModel; + QItemSelectionModel* _notifyRulesSelection; QList privListNotifications; QScopedPointer options_page; diff --git a/ground/openpilotgcs/src/plugins/notify/notifytablemodel.cpp b/ground/openpilotgcs/src/plugins/notify/notifytablemodel.cpp index 7c564a6df..0c2337437 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifytablemodel.cpp +++ b/ground/openpilotgcs/src/plugins/notify/notifytablemodel.cpp @@ -26,28 +26,41 @@ */ #include "notifytablemodel.h" +#include "notifylogging.h" #include +#include -NotifyTableModel::NotifyTableModel(QList* parentList, QObject* parent) +static int _dragStartRow = -1; +static int _dragNumRows = -1; +const char* mime_type_notify_table = "openpilot/notify_plugin_table"; + +NotifyTableModel::NotifyTableModel(QList& parentList, QObject* parent) : QAbstractTableModel(parent) + , _list(parentList) { - _headerStrings << "Name" << "Repeats" << "Lifetime,sec" << "Enable"; - _list.reset(parentList); + _headerStrings << "Name" << "Repeats" << "Lifetime,sec" << "Mute"; + connect(this, SIGNAL(dragRows(int, int)), this, SLOT(dropRows(int, int))); } bool NotifyTableModel::setData(const QModelIndex &index, const QVariant &value, int role) { + if (index.isValid() && role == Qt::DisplayRole) { + if(eMESSAGE_NAME == index.column()) { + emit dataChanged(index, index); + return true; + } + } if (index.isValid() && role == Qt::EditRole) { if(eREPEAT_VALUE == index.column()) - _list->at(index.row())->setRepeatFlag(value.toString()); + _list.at(index.row())->setRetryString(value.toString()); else { if(eEXPIRE_TIME == index.column()) - _list->at(index.row())->setExpireTimeout(value.toInt()); + _list.at(index.row())->setLifetime(value.toInt()); else { if(eENABLE_NOTIFICATION == index.column()) - _list->at(index.row())->setEnableFlag(value.toBool()); + _list.at(index.row())->setMute(value.toBool()); } } emit dataChanged(index, index); @@ -63,7 +76,7 @@ QVariant NotifyTableModel::data(const QModelIndex &index, int role) const return QVariant(); } - if (index.row() >= _list->size()) + if (index.row() >= _list.size()) return QVariant(); if (role == Qt::DisplayRole || role == Qt::EditRole) @@ -71,16 +84,16 @@ QVariant NotifyTableModel::data(const QModelIndex &index, int role) const switch(index.column()) { case eMESSAGE_NAME: - return _list->at(index.row())->parseNotifyMessage(); + return _list.at(index.row())->parseNotifyMessage(); case eREPEAT_VALUE: - return _list->at(index.row())->getRepeatFlag(); + return _list.at(index.row())->retryString(); case eEXPIRE_TIME: - return _list->at(index.row())->getExpireTimeout(); + return _list.at(index.row())->lifetime(); case eENABLE_NOTIFICATION: - return _list->at(index.row())->getEnableFlag(); + return _list.at(index.row())->mute(); default: return QVariant(); @@ -112,7 +125,16 @@ QVariant NotifyTableModel::headerData(int section, Qt::Orientation orientation, bool NotifyTableModel::insertRows(int position, int rows, const QModelIndex& index) { Q_UNUSED(index); - beginInsertRows(QModelIndex(), position, position+rows-1); + + if((-1 == position) || (-1 == rows) ) + return false; + + beginInsertRows(QModelIndex(), position, position + rows - 1); + + for (int row = 0; row < rows; ++row) { + _list.insert(position, new NotificationItem()); + } + endInsertRows(); return true; } @@ -120,10 +142,14 @@ bool NotifyTableModel::insertRows(int position, int rows, const QModelIndex& ind bool NotifyTableModel::removeRows(int position, int rows, const QModelIndex& index) { Q_UNUSED(index); - beginRemoveRows(QModelIndex(), position, position+rows-1); - for (int row=0; row < rows; ++row) { - _list->removeAt(position); + if((-1 == position) || (-1 == rows) ) + return false; + + beginRemoveRows(QModelIndex(), position, position + rows - 1); + + for (int row = 0; row < rows; ++row) { + _list.removeAt(position); } endRemoveRows(); @@ -140,3 +166,122 @@ void NotifyTableModel::entryAdded(int position) { insertRows(position, 1,QModelIndex()); } + + +bool NotifyTableModel::dropMimeData( const QMimeData * data, Qt::DropAction action, int row, + int column, const QModelIndex& parent) +{ + if (action == Qt::IgnoreAction) + return true; + + if (!data->hasFormat(mime_type_notify_table)) + return false; + + int beginRow = -1; + + if (row != -1) + beginRow = row; + else { + if (parent.isValid()) + beginRow = parent.row(); + else + beginRow = rowCount(QModelIndex()); + } + + if(-1 == beginRow) + return false; + + QByteArray encodedData = data->data(mime_type_notify_table); + QDataStream stream(&encodedData, QIODevice::ReadOnly); + int rows = beginRow; + while(!stream.atEnd()) { + qint32 ptr; + stream >> ptr; + NotificationItem* item = reinterpret_cast(ptr); + int dragged = _list.indexOf(item); + if(-1 == dragged || rows >= _list.size() || dragged == rows) { + qNotifyDebug() << "no such item"; + return false; + } + removeRows(rows, 1, QModelIndex()); + insertRows(rows, 1, QModelIndex()); + _list.replace(dragged, item); + // _list.swap(dragged, rows); + ++rows; + }; + + QModelIndex idxTopLeft = index(beginRow, 0, QModelIndex()); + QModelIndex idxBotRight = index(beginRow, columnCount(QModelIndex()), QModelIndex()); + emit dataChanged(idxTopLeft, idxBotRight); + //QStringList newItems; + + //removeRows(_dragStartRow, _dragNumRows, QModelIndex()); + //insertRows(beginRow, rows, QModelIndex()); +// int rows = beginRow; +// while (!stream.atEnd()) { +// _list.at(index.row())->deserialize(stream); +// ++rows; +// } + +// while(rows) { +// int column = 0; +// foreach (const QString& text, newItems) { +// QModelIndex idx = index(beginRow, column, QModelIndex()); +// if(!column) +// setData(const_cast(idx), text, Qt::DisplayRole); +// else +// setData(const_cast(idx), text, Qt::EditRole); +// ++column; +// } +// ++beginRow; +// --rows; +// } + return true; +} + +QMimeData* NotifyTableModel::mimeData(const QModelIndexList& indexes) const +{ + QMimeData* mimeData = new QMimeData(); + QByteArray encodedData; + + QDataStream stream(&encodedData, QIODevice::WriteOnly); + int rows = 0; + foreach (const QModelIndex& index, indexes) { + if(!index.column()) { + qint32 item = reinterpret_cast(_list.at(index.row())); + stream << item; + } + ++rows; + } + +// int numRows = 0; +// foreach (const QModelIndex& index, indexes) { +// if (index.isValid() && index.column()) { +// _list.at(index.row())->serialize(stream); +//// if(!index.column()) { +//// numRows++; +//// QString name = data(index, Qt::DisplayRole).toString(); +//// stream << name; +//// } else { +//// QString text = data(index, Qt::EditRole).toString(); +//// stream << text; +//// } +// } +// } + + mimeData->setData(mime_type_notify_table, encodedData); + + //emit dragRows(indexes.at(0).row(), rows); + dropRows(indexes.at(0).row(), rows); + //_dragStartRow = indexes.at(0).row(); + //_dragNumRows = 1/*numRows*/; + + return mimeData; +} + +void NotifyTableModel::dropRows(int position, int count) const +{ + for (int row = 0; row < count; ++row) { + _list.removeAt(position); + } +} diff --git a/ground/openpilotgcs/src/plugins/notify/notifytablemodel.h b/ground/openpilotgcs/src/plugins/notify/notifytablemodel.h index affae25da..f58cc0599 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifytablemodel.h +++ b/ground/openpilotgcs/src/plugins/notify/notifytablemodel.h @@ -43,11 +43,11 @@ class NotifyTableModel : public QAbstractTableModel public: - NotifyTableModel(QList* parentList, QObject* parent = 0); + NotifyTableModel(QList& parentList, QObject* parent = 0); int rowCount(const QModelIndex& parent = QModelIndex()) const { - return _list->count(); + return _list.count(); } int columnCount(const QModelIndex &/*parent*/) const @@ -68,17 +68,34 @@ public: return Qt::MoveAction; } + QStringList mimeTypes() const + { + QStringList types; + types << "application/vnd.text.list"; + return types; + } + + bool dropMimeData( const QMimeData * data, Qt::DropAction action, int row, + int column, const QModelIndex& parent); + QMimeData* mimeData(const QModelIndexList &indexes) const; + + bool setData(const QModelIndex &index, const QVariant &value, int role); QVariant data(const QModelIndex &index, int role) const; QVariant headerData(int section, Qt::Orientation orientation, int role) const; bool insertRows(int position, int rows, const QModelIndex &index); bool removeRows(int position, int rows, const QModelIndex &index); +signals: + void dragRows(int position, int count); + private slots: void entryUpdated(int offset); void entryAdded(int position); + void dropRows(int position, int count) const; + private: - QScopedPointer > _list; + mutable QList& _list; QStringList _headerStrings; }; From 82ec3199d73f0d743d117fc028243dfd038b2ae5 Mon Sep 17 00:00:00 2001 From: Nickolay Date: Thu, 29 Sep 2011 20:26:46 +0300 Subject: [PATCH 007/121] +dynamic field UI; --- .../src/plugins/notify/NotificationItem.h | 30 +- .../src/plugins/notify/notificationitem.cpp | 259 +++--- .../src/plugins/notify/notifyplugin.cpp | 9 +- .../notify/notifypluginoptionspage.cpp | 406 ++++++--- .../notify/notifypluginoptionspage.cpp.orig | 443 +++++----- .../plugins/notify/notifypluginoptionspage.h | 59 +- .../plugins/notify/notifypluginoptionspage.ui | 787 +++++++----------- .../src/plugins/notify/notifytablemodel.cpp | 8 +- .../src/plugins/notify/notifytablemodel.h | 3 +- 9 files changed, 1094 insertions(+), 910 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/notify/NotificationItem.h b/ground/openpilotgcs/src/plugins/notify/NotificationItem.h index da40d2afb..20de7a4f8 100644 --- a/ground/openpilotgcs/src/plugins/notify/NotificationItem.h +++ b/ground/openpilotgcs/src/plugins/notify/NotificationItem.h @@ -40,11 +40,15 @@ using namespace Core; QString getSound##number() const { return _sound##number; } \ void setSound##number(QString text) { _sound##number = text; } \ +class UAVDataObject; +class UAVObjectField; class NotificationItem : public QObject { Q_OBJECT public: + enum { eDefaultTimeout = 15 }; // in sec + explicit NotificationItem(QObject *parent = 0); void copyTo(NotificationItem*) const; @@ -53,15 +57,17 @@ public: DECLARE_SOUND(2) DECLARE_SOUND(3) - QString getValue() const { return _dataValue; } - void setValue(QString text) { _dataValue = text; } + QString range() const { return _rangeLimit; } + void setRange(QString text) { _rangeLimit = text; } QString getSayOrder() const { return _sayOrder; } void setSayOrder(QString text) { _sayOrder = text; } - double getSpinBoxValue() const { return _spinBoxValue; } - void setSpinBoxValue(double value) { _spinBoxValue = value; } + double singleValue() const { return _singleValue; } + void setSingleValue(double value) { _singleValue = value; } + double valueRange2() const { return _valueRange2; } + void setValueRange2(double value) { _valueRange2 = value; } QString getDataObject() const { return _dataObject; } void setDataObject(QString text) { _dataObject = text; } @@ -91,6 +97,9 @@ public: void restoreState(QSettings* settings); + UAVDataObject* getUAVObject(void); + UAVObjectField* getUAVObjectField(void); + void seriaize(QDataStream& stream); void deseriaize(QDataStream& stream); @@ -111,7 +120,7 @@ public: bool firstStart; private: - void checkSoundFilesExisting(); + void checkSoundFilesExisting(bool& missed1, bool& missed2, bool& missed3); private: QTimer* _timer; @@ -135,8 +144,8 @@ private: //! one field value change can be assigned to one notification QString _objectField; - //! poled UAV field value - QString _dataValue; + //! fire condition for UAV field value (lower, greater, in range) + QString _rangeLimit; //! possible sounds(at least one required to play notification) QString _sound1; @@ -146,7 +155,12 @@ private: //! order in what sounds 1-3 will be played QString _sayOrder; - double _spinBoxValue; + //! one-side range, value maybe lower or greater + double _singleValue; + + //! both-side range, value should be inside the range + //double _valueRange1; + double _valueRange2; //! how often or what periodicaly notification should be played QString _repeatString; diff --git a/ground/openpilotgcs/src/plugins/notify/notificationitem.cpp b/ground/openpilotgcs/src/plugins/notify/notificationitem.cpp index 889b84261..d6c803b68 100644 --- a/ground/openpilotgcs/src/plugins/notify/notificationitem.cpp +++ b/ground/openpilotgcs/src/plugins/notify/notificationitem.cpp @@ -25,11 +25,19 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#include "notificationitem.h" -#include "notifylogging.h" +//Qt headers #include #include + +// 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" NotificationItem::NotificationItem(QObject *parent) @@ -40,14 +48,15 @@ NotificationItem::NotificationItem(QObject *parent) , _currentLanguage("default") , _dataObject("") , _objectField("") - , _dataValue("Equal to") + , _rangeLimit("Equal to") , _sound1("") , _sound2("") , _sound3("") , _sayOrder("Never") - , _spinBoxValue(0) + , _singleValue(0) + , _valueRange2(0) , _repeatString("Repeat Instantly") - , _expireTimeout(15) + , _expireTimeout(eDefaultTimeout) , _mute(false) { @@ -64,12 +73,13 @@ void NotificationItem::copyTo(NotificationItem* that) const that->_soundCollectionPath = _soundCollectionPath; that->_dataObject = _dataObject; that->_objectField = _objectField; - that->_dataValue = _dataValue; + that->_rangeLimit = _rangeLimit; that->_sound1 = _sound1; that->_sound2 = _sound2; that->_sound3 = _sound3; that->_sayOrder = _sayOrder; - that->_spinBoxValue = _spinBoxValue; + that->_singleValue = _singleValue; + that->_valueRange2 = _valueRange2; that->_repeatString = _repeatString; that->_expireTimeout = _expireTimeout; that->_mute = _mute; @@ -83,8 +93,9 @@ void NotificationItem::saveState(QSettings* settings) const settings->setValue(QLatin1String("CurrentLanguage"), getCurrentLanguage()); settings->setValue(QLatin1String("ObjectField"), getObjectField()); settings->setValue(QLatin1String("DataObject"), getDataObject()); - settings->setValue(QLatin1String("Value"), getValue()); - settings->setValue(QLatin1String("ValueSpinBox"), getSpinBoxValue()); + settings->setValue(QLatin1String("RangeLimit"), range()); + 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()); @@ -102,12 +113,13 @@ 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()); - setValue(settings->value(QLatin1String("Value"), tr("")).toString()); + setRange(settings->value(QLatin1String("RangeLimit"), tr("")).toString()); 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("")).toString()); - setSpinBoxValue(settings->value(QLatin1String("ValueSpinBox"), tr("")).toDouble()); + setSingleValue(settings->value(QLatin1String("Value1"), tr("")).toDouble()); + setValueRange2(settings->value(QLatin1String("Value2"), tr("")).toDouble()); setRetryString(settings->value(QLatin1String("Repeat"), tr("")).toString()); setLifetime(settings->value(QLatin1String("ExpireTimeout"), tr("")).toInt()); setMute(settings->value(QLatin1String("Mute"), tr("")).toInt()); @@ -120,12 +132,13 @@ void NotificationItem::seriaize(QDataStream& stream) stream << this->_currentLanguage; stream << this->_dataObject; stream << this->_objectField; - stream << this->_dataValue; + stream << this->_rangeLimit; stream << this->_sound1; stream << this->_sound2; stream << this->_sound3; stream << this->_sayOrder; - stream << this->_spinBoxValue; + stream << this->_singleValue; + stream << this->_valueRange2; stream << this->_repeatString; stream << this->_expireTimeout; stream << this->_mute; @@ -137,12 +150,13 @@ void NotificationItem::deseriaize(QDataStream& stream) stream >> this->_currentLanguage; stream >> this->_dataObject; stream >> this->_objectField; - stream >> this->_dataValue; + stream >> this->_rangeLimit; stream >> this->_sound1; stream >> this->_sound2; stream >> this->_sound3; stream >> this->_sayOrder; - stream >> this->_spinBoxValue; + stream >> this->_singleValue; + stream >> this->_valueRange2; stream >> this->_repeatString; stream >> this->_expireTimeout; stream >> this->_mute; @@ -195,145 +209,192 @@ void NotificationItem::disposeExpireTimer() { } } +#define missed "missed sound" +#define CHECK_ADD_SOUND(n) ((!_missedSound##n) ? getSound##n() : (missed#n)) +#define CHECK_REPLACE_SOUND(n) ((!_missedSound##n) ? str.replace(missed#n, getSound##n()) : (missed#n)) + QString NotificationItem::parseNotifyMessage() { // tips: // check of *.wav files exist needed for playing phonon queues; // if phonon player don't find next file in queue, it buzz - QString str,str1; - str1= getSayOrder(); - str = QString("%L1 ").arg(getSpinBoxValue()); - int position = 0xFF; + QString str; + QString value; + QString sayOrder = getSayOrder(); + UAVObjectField* field = getUAVObjectField(); + if (UAVObjectField::ENUM == field->getType()) { + Q_ASSERT(singleValue() < field->getOptions().size()); + value = QString("%L1").arg(field->getOptions().at(singleValue())); + } else { + value = QString("%L1").arg(singleValue()); + } + + int position = -1; // default don't play value wav file + // generate queue of sound files to play _messageSequence.clear(); - checkSoundFilesExisting(); + bool _missedSound1 = false; + bool _missedSound2 = false; + bool _missedSound3 = false; + + checkSoundFilesExisting(_missedSound1, _missedSound2, _missedSound3); + str = CHECK_ADD_SOUND(1)+" "+CHECK_ADD_SOUND(2)+" "+CHECK_ADD_SOUND(3); if(!_messageSequence.size()) { qNotifyDebug() << "no any files in message queue"; } - switch(str1.at(0).toAscii()) + sayOrder = sayOrder.trimmed(); + switch(sayOrder.at(0).toUpper().toAscii()) { - case 'N'://NEVER: - str = getSound1()+" "+getSound2()+" "+getSound3(); - position = 0xFF; - break; - - case 'B'://BEFORE: - str = QString("%L1 ").arg(getSpinBoxValue())+getSound1()+" "+getSound2()+" "+getSound3(); - position = 0; - break; + case 'B'://BEFORE: + CHECK_REPLACE_SOUND(1); + CHECK_REPLACE_SOUND(2); + CHECK_REPLACE_SOUND(3); + str.prepend(value + " "); + position = 0; + break; case 'A'://AFTER: - switch(str1.at(6).toAscii()) + switch(sayOrder.at(6).toLower().toAscii()) { case 'f': - str = getSound1()+QString(" %L1 ").arg(getSpinBoxValue())+getSound2()+" "+getSound3(); + str = CHECK_ADD_SOUND(1)+" "+value+" "+CHECK_ADD_SOUND(2)+" "+CHECK_ADD_SOUND(3); position = 1; break; + case 's': - str = getSound1()+" "+getSound2()+QString(" %L1").arg(getSpinBoxValue())+" "+getSound3(); + str = CHECK_ADD_SOUND(1)+" "+CHECK_ADD_SOUND(2)+" "+value+" "+CHECK_ADD_SOUND(3); position = 2; break; + case 't': - str = getSound1()+" "+getSound2()+" "+getSound3()+QString(" %L1").arg(getSpinBoxValue()); + CHECK_REPLACE_SOUND(1); + CHECK_REPLACE_SOUND(2); + CHECK_REPLACE_SOUND(3); + str.append(" "+value); position = 3; break; } break; + + default: + CHECK_REPLACE_SOUND(1); + CHECK_REPLACE_SOUND(2); + CHECK_REPLACE_SOUND(3); + break; } - if(position != 0xFF) - { - QStringList numberParts = QString("%1").arg(getSpinBoxValue()).trimmed().split("."); - QStringList numberFiles; + if(-1 == position) { + qNotifyDebug() << "NotificationItem::parseNotifyMessage() | value position undefined"; + return str; + } - if((numberParts.at(0).size()==1) || (numberParts.at(0).toInt()<20)) - { - //if(numberParts.at(0)!="0") - numberFiles.append(numberParts.at(0)); - } else { - int i=0; - if(numberParts.at(0).right(2).toInt()<20 && numberParts.at(0).right(2).toInt()!=0) { - if(numberParts.at(0).right(2).toInt()<10) - numberFiles.append(numberParts.at(0).right(1)); - else - numberFiles.append(numberParts.at(0).right(2)); - i=2; - } - for(;igetType()) return str; - if(1 < numberParts.size()) { - numberFiles.append("point"); - if((numberParts.at(1).size()==1)) - numberFiles.append(numberParts.at(1)); - else { - if(numberParts.at(1).left(1)=="0") - numberFiles.append(numberParts.at(1).left(1)); - else - numberFiles.append(numberParts.at(1).left(1)+'0'); - numberFiles.append(numberParts.at(1).right(1)); - } + QStringList numberParts = value.trimmed().split("."); + QStringList digitWavs; + + 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 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)); + } + } + foreach(QString fileName, digitWavs) { + fileName+=".wav"; + QString filePath = QDir::toNativeSeparators(getSoundCollectionPath()+"/"+ getCurrentLanguage()+"/"+fileName); + if(QFile::exists(filePath)) + _messageSequence.insert(position++,QDir::toNativeSeparators(getSoundCollectionPath()+ "/"+getCurrentLanguage()+"/"+fileName)); + else { + if(QFile::exists(QDir::toNativeSeparators(getSoundCollectionPath()+"/default/"+fileName))) + _messageSequence.insert(position++,QDir::toNativeSeparators(getSoundCollectionPath()+"/default/"+fileName)); + else { + _messageSequence.clear(); + break; // if no some of *.wav files, then don't play number! } + } } return str; } +UAVObjectField* NotificationItem::getUAVObjectField() { + return getUAVObject()->getField(getObjectField()); +} -void NotificationItem::checkSoundFilesExisting() { +UAVDataObject* NotificationItem::getUAVObject() { + return dynamic_cast((ExtensionSystem::PluginManager::instance()->getObject())->getObject(getDataObject())); +} + + +void NotificationItem::checkSoundFilesExisting(bool& missed1, bool& missed2, bool& missed3) +{ if(QFile::exists(QDir::toNativeSeparators(getSoundCollectionPath() + "/" + getCurrentLanguage()+"/"+getSound1()+".wav"))) _messageSequence.append(QDir::toNativeSeparators(getSoundCollectionPath() + "/" + getCurrentLanguage()+"/"+getSound1()+".wav")); - else + else { if(QFile::exists(QDir::toNativeSeparators(getSoundCollectionPath() + "/default/"+getSound1()+".wav"))) _messageSequence.append(QDir::toNativeSeparators(getSoundCollectionPath() + "/default/"+getSound1()+".wav")); + else + missed1 = true; + } - - if(!getSound2().size()) - { + if(getSound2().size()) { if(QFile::exists(QDir::toNativeSeparators(getSoundCollectionPath() + "/" + getCurrentLanguage()+"/"+getSound2()+".wav"))) _messageSequence.append(QDir::toNativeSeparators(getSoundCollectionPath() + "/" + getCurrentLanguage()+"/"+getSound2()+".wav")); - else + else { if(QFile::exists(QDir::toNativeSeparators(getSoundCollectionPath() + "/default/"+getSound2()+".wav"))) _messageSequence.append(QDir::toNativeSeparators(getSoundCollectionPath() + "/default/"+getSound2()+".wav")); + else + missed2 = true; + } } - if(!getSound3().size()) - { + if(getSound3().size()) { if(QFile::exists(QDir::toNativeSeparators(getSoundCollectionPath()+ "/" + getCurrentLanguage()+"/"+getSound3()+".wav"))) _messageSequence.append(QDir::toNativeSeparators(getSoundCollectionPath()+ "/" + getCurrentLanguage()+"/"+getSound3()+".wav")); - else + else { if(QFile::exists(QDir::toNativeSeparators(getSoundCollectionPath()+"/default/"+getSound3()+".wav"))) _messageSequence.append(QDir::toNativeSeparators(getSoundCollectionPath()+"/default/"+getSound3()+".wav")); + else + missed3 = true; + } } } diff --git a/ground/openpilotgcs/src/plugins/notify/notifyplugin.cpp b/ground/openpilotgcs/src/plugins/notify/notifyplugin.cpp index e7878c3da..fa55cfc42 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifyplugin.cpp +++ b/ground/openpilotgcs/src/plugins/notify/notifyplugin.cpp @@ -289,8 +289,8 @@ void SoundNotifyPlugin::checkNotificationRule(NotificationItem* notification, UA QString direction; QString fieldName; - threshold = notification->getSpinBoxValue(); - direction = notification->getValue(); + threshold = notification->singleValue(); + direction = notification->range(); fieldName = notification->getObjectField(); UAVObjectField* field = object->getField(fieldName); @@ -311,6 +311,11 @@ void SoundNotifyPlugin::checkNotificationRule(NotificationItem* notification, UA case 'L': condition = (value < threshold); break; + + case 'R': + condition = (value > threshold) && (value < notification->valueRange2()); + break; + } if (!condition) diff --git a/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.cpp b/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.cpp index a1122f078..305e5e13e 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.cpp +++ b/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.cpp @@ -39,30 +39,58 @@ #include #include #include +#include +#include #include "notifyplugin.h" #include "notifyitemdelegate.h" #include "notifytablemodel.h" #include "notifylogging.h" + +static const char* cStrBefore1st = "Before first"; +static const char* cStrBefore2nd = "Before second"; +static const char* cStrAfter2nd = "After second"; + +static const char* cStrEqualTo = "Equal to"; +static const char* cStrLargeThan = "Large than"; +static const char* cStrLowerThan = "Lower than"; +static const char* cStrInRange = "In range"; + + +//----------------------------------------------------------------------------- NotifyPluginOptionsPage::NotifyPluginOptionsPage(/*NotificationItem *config,*/ QObject *parent) : IOptionsPage(parent) , objManager(*ExtensionSystem::PluginManager::instance()->getObject()) , owner(qobject_cast(parent)) , currentCollectionPath("") + , _valueRange(NULL) + , _sayOrder(NULL) + , _fieldValue(NULL) + , _fieldType(-1) + , _form(NULL) { } +//----------------------------------------------------------------------------- NotifyPluginOptionsPage::~NotifyPluginOptionsPage() { } //creates options page widget (uses the UI file) + +//----------------------------------------------------------------------------- QWidget *NotifyPluginOptionsPage::createPage(QWidget *parent) { options_page.reset(new Ui::NotifyPluginOptionsPage()); //main widget - QWidget *optionsPageWidget = new QWidget; + QWidget* optionsPageWidget = new QWidget; + //if(!_fieldValue.isNull()) + _fieldValue = NULL; + _valueRange = NULL; + _fieldType = -1; + //save ref to form, needed for binding dynamic fields in future + _form = optionsPageWidget; //main layout options_page->setupUi(optionsPageWidget); @@ -71,35 +99,161 @@ QWidget *NotifyPluginOptionsPage::createPage(QWidget *parent) options_page->SoundDirectoryPathChooser->setExpectedKind(Utils::PathChooser::Directory); options_page->SoundDirectoryPathChooser->setPromptDialogTitle(tr("Choose sound collection directory")); - // Fills the combo boxes for the UAVObjects - QList< QList > objList = objManager.getDataObjects(); - foreach (QList list, objList) { - foreach (UAVDataObject* obj, list) { - options_page->UAVObject->addItem(obj->getName()); - } - } - connect(options_page->SoundDirectoryPathChooser, SIGNAL(changed(const QString&)), this, SLOT(on_buttonSoundFolder_clicked(const QString&))); connect(options_page->SoundCollectionList, SIGNAL(currentIndexChanged (int)), this, SLOT(on_soundLanguage_indexChanged(int))); - connect(options_page->UAVObject, SIGNAL(currentIndexChanged(QString)), this, SLOT(on_UAVObject_indexChanged(QString))); + + connect(this, SIGNAL(updateNotifications(QList)), owner, SLOT(updateNotificationList(QList))); //connect(this, SIGNAL(resetNotification()),owner, SLOT(resetNotification())); - -// privListNotifications = ((qobject_cast(parent))->getListNotifications()); privListNotifications = owner->getListNotifications(); - updateConfigView(owner->getCurrentNotification()); + // [1] + addDynamicValueLayout(); + _selectedNotification = owner->getCurrentNotification(); + // [2] + updateConfigView(_selectedNotification); initRulesTable(); initButtons(); initPhononPlayer(); +// _notifyRulesSelection->setCurrentIndex(_notifyRulesModel->index(0, 0, QModelIndex()), +// QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows); + return optionsPageWidget; } +//----------------------------------------------------------------------------- +void NotifyPluginOptionsPage::apply() +{ + getOptionsPageValues(owner->getCurrentNotification()); + owner->setEnableSound(options_page->chkEnableSound->isChecked()); + emit updateNotifications(privListNotifications); +} + +void NotifyPluginOptionsPage::finish() +{ + + disconnect(options_page->UAVObjectField, SIGNAL(currentIndexChanged(QString)), this, SLOT(onUAVField_indexChanged(QString))); + + disconnect(notifySound.data(),SIGNAL(stateChanged(Phonon::State,Phonon::State)), + this,SLOT(changeButtonText(Phonon::State,Phonon::State))); + if (notifySound) { + notifySound->stop(); + notifySound->clear(); + } +} + +//----------------------------------------------------------------------------- +void NotifyPluginOptionsPage::addDynamicValueLayout() +{ + NotificationItem* curr = owner->getCurrentNotification(); + Q_ASSERT(curr); + options_page->dynamicValueLayout->addWidget(new QLabel("Say order ", _form)); + + _sayOrder = new QComboBox(_form); + options_page->dynamicValueLayout->addWidget(_sayOrder); + QStringList sayOrderValues; + sayOrderValues << cStrBefore1st << cStrBefore2nd << cStrAfter2nd; + _sayOrder->addItems(sayOrderValues); + + options_page->dynamicValueLayout->addWidget(new QLabel("Value is ", _form)); + + UAVDataObject* obj = dynamic_cast(objManager.getObject(curr->getDataObject())); + UAVObjectField* field = obj->getField(curr->getObjectField()); + Q_ASSERT(obj); + Q_ASSERT(field); + _valueRange = new QComboBox(_form); + options_page->dynamicValueLayout->addWidget(_valueRange); + + addDynamicField(field); +} + +//----------------------------------------------------------------------------- +void NotifyPluginOptionsPage::resetValueRange() +{ + _fieldValue = new QLineEdit(_form); + (static_cast(_fieldValue))->setInputMask("999.99 - 999.99;"); + (static_cast(_fieldValue))->setText("0000000000"); + (static_cast(_fieldValue))->setCursorPosition(0); +} + +//----------------------------------------------------------------------------- +void NotifyPluginOptionsPage::on_rangeValue_indexChanged(QString rangeStr) +{ + Q_ASSERT(_fieldValue); + if(rangeStr == cStrInRange) { + Q_ASSERT(_fieldValue); + options_page->dynamicValueLayout->removeWidget(_fieldValue); + resetValueRange(); + options_page->dynamicValueLayout->addWidget(_fieldValue); + + // _fieldType = -1; + // addDynamicField(field); + } +} + +//----------------------------------------------------------------------------- +void NotifyPluginOptionsPage::addDynamicField(UAVObjectField* objField) +{ + //qDebugNotify_if(!objField || !parent) << "null input params"; + Q_ASSERT(objField); + if(objField->getType() == _fieldType) { + if(QComboBox* fieldValue = dynamic_cast(_fieldValue)) { + fieldValue->clear(); + QStringList enumValues(objField->getOptions()); + fieldValue->addItems(enumValues); + } + return; + } + // check if dynamic fileld already settled, + // so if its exists remove it and install new field + if(_fieldValue) + options_page->dynamicValueLayout->removeWidget(_fieldValue); + + disconnect(_valueRange, SIGNAL(currentIndexChanged(QString)), + this, SLOT(on_rangeValue_indexChanged(QString))); + + _valueRange->clear(); + QStringList rangeValues; + if(UAVObjectField::ENUM == objField->getType()) { + rangeValues << cStrEqualTo << cStrInRange; + _valueRange->addItems(rangeValues); + } + else { + rangeValues << cStrEqualTo << cStrLargeThan << cStrLowerThan << cStrInRange; + _valueRange->addItems(rangeValues); + connect(_valueRange, SIGNAL(currentIndexChanged(QString)), + this, SLOT(on_rangeValue_indexChanged(QString))); + } + + + _fieldType = objField->getType(); + switch(_fieldType) + { + case UAVObjectField::ENUM: + { + _fieldValue = new QComboBox(_form); + QStringList enumValues(objField->getOptions()); + (dynamic_cast(_fieldValue))->addItems(enumValues); + } + break; + + default: + if(_valueRange->currentText() == cStrInRange) { + resetValueRange(); + } else { + _fieldValue = new QSpinBox(_form); + } + break; + }; + options_page->dynamicValueLayout->addWidget(_fieldValue); +} + +//----------------------------------------------------------------------------- void NotifyPluginOptionsPage::initButtons() { options_page->chkEnableSound->setChecked(owner->getEnableSound()); @@ -114,6 +268,7 @@ void NotifyPluginOptionsPage::initButtons() connect(options_page->buttonPlayNotification, SIGNAL(clicked()), this, SLOT(on_buttonTestSoundNotification_clicked())); } +//----------------------------------------------------------------------------- void NotifyPluginOptionsPage::initPhononPlayer() { notifySound.reset(Phonon::createPlayer(Phonon::NotificationCategory)); @@ -122,6 +277,8 @@ void NotifyPluginOptionsPage::initPhononPlayer() connect(notifySound.data(), SIGNAL(finished(void)), this, SLOT(onFinishedPlaying(void))); } + +//----------------------------------------------------------------------------- void NotifyPluginOptionsPage::initRulesTable() { qNotifyDebug_if(_notifyRulesModel.isNull()) << "_notifyRulesModel.isNull())"; @@ -134,8 +291,8 @@ void NotifyPluginOptionsPage::initRulesTable() this, SLOT(on_tableNotification_changeSelection( const QItemSelection & , const QItemSelection & ))); connect(this, SIGNAL(entryUpdated(int)), _notifyRulesModel.data(), SLOT(entryUpdated(int))); - connect(this, SIGNAL(entryAdded(int)), - _notifyRulesModel.data(), SLOT(entryAdded(int))); +// connect(this, SIGNAL(entryAdded(int)), +// _notifyRulesModel.data(), SLOT(entryAdded(int))); options_page->notifyRulesView->setModel(_notifyRulesModel.data()); options_page->notifyRulesView->setSelectionModel(_notifyRulesSelection); @@ -150,12 +307,12 @@ void NotifyPluginOptionsPage::initRulesTable() options_page->notifyRulesView->setAcceptDrops(true); options_page->notifyRulesView->setDropIndicatorShown(true); options_page->notifyRulesView->setDragDropMode(QAbstractItemView::InternalMove); - - } +//----------------------------------------------------------------------------- void NotifyPluginOptionsPage::getOptionsPageValues(NotificationItem* notification) { + Q_ASSERT(notification); notification->setSoundCollectionPath(options_page->SoundDirectoryPathChooser->path()); notification->setCurrentLanguage(options_page->SoundCollectionList->currentText()); notification->setDataObject(options_page->UAVObject->currentText()); @@ -163,48 +320,51 @@ void NotifyPluginOptionsPage::getOptionsPageValues(NotificationItem* notificatio notification->setSound1(options_page->Sound1->currentText()); notification->setSound2(options_page->Sound2->currentText()); notification->setSound3(options_page->Sound3->currentText()); - notification->setSayOrder(options_page->SayOrder->currentText()); - notification->setValue(options_page->Value->currentText()); - notification->setSpinBoxValue(options_page->ValueSpinBox->value()); -} - -/*! -* Called when the user presses apply or OK. -* Saves the current values -*/ -void NotifyPluginOptionsPage::apply() -{ - getOptionsPageValues(owner->getCurrentNotification()); - owner->setEnableSound(options_page->chkEnableSound->isChecked()); - emit updateNotifications(privListNotifications); -} - -void NotifyPluginOptionsPage::finish() -{ - disconnect(notifySound.data(),SIGNAL(stateChanged(Phonon::State,Phonon::State)), - this,SLOT(changeButtonText(Phonon::State,Phonon::State))); - if (notifySound) { - notifySound->stop(); - notifySound->clear(); + notification->setSayOrder(_sayOrder->currentText()); + notification->setRange(_valueRange->currentText()); + if(QSpinBox* spinValue = dynamic_cast(_fieldValue)) + notification->setSingleValue(spinValue->value()); + else { + if(QComboBox* comboBoxValue = dynamic_cast(_fieldValue)) + notification->setSingleValue(comboBoxValue->currentIndex()); + else { + if(QLineEdit* rangeValue = dynamic_cast(_fieldValue)) { + QString str = rangeValue->text(); + QStringList range = str.split('-'); + notification->setSingleValue(range.at(0).toDouble()); + notification->setValueRange2(range.at(1).toDouble()); + } + } } } + +//----------------------------------------------------------------------------- +void NotifyPluginOptionsPage::onUAVField_indexChanged(QString field) { + _fieldType = -1; + UAVDataObject* obj = dynamic_cast( objManager.getObject(options_page->UAVObject->currentText())); + addDynamicField(obj->getField(field)); + +} + ////////////////////////////////////////////////////////////////////////////// // Fills in the combo box when value is changed in the // combo box ////////////////////////////////////////////////////////////////////////////// void NotifyPluginOptionsPage::on_UAVObject_indexChanged(QString val) { - options_page->UAVObjectField->clear(); - ExtensionSystem::PluginManager* pm = ExtensionSystem::PluginManager::instance(); - UAVObjectManager* objManager = pm->getObject(); - UAVDataObject* obj = dynamic_cast( objManager->getObject(val) ); + _fieldType = -1; + UAVDataObject* obj = dynamic_cast( objManager.getObject(val) ); QList fieldList = obj->getFields(); + disconnect(options_page->UAVObjectField, SIGNAL(currentIndexChanged(QString)), this, SLOT(onUAVField_indexChanged(QString))); + options_page->UAVObjectField->clear(); foreach (UAVObjectField* field, fieldList) { options_page->UAVObjectField->addItem(field->getName()); } + connect(options_page->UAVObjectField, SIGNAL(currentIndexChanged(QString)), this, SLOT(onUAVField_indexChanged(QString))); + addDynamicField(fieldList.at(0)); } -// locate collection folder on disk +//----------------------------------------------------------------------------- void NotifyPluginOptionsPage::on_buttonSoundFolder_clicked(const QString& path) { QDir dirPath(path); @@ -213,7 +373,7 @@ void NotifyPluginOptionsPage::on_buttonSoundFolder_clicked(const QString& path) options_page->SoundCollectionList->addItems(listDirCollections); } - +//----------------------------------------------------------------------------- void NotifyPluginOptionsPage::on_soundLanguage_indexChanged(int index) { options_page->SoundCollectionList->setCurrentIndex(index); @@ -238,6 +398,7 @@ void NotifyPluginOptionsPage::on_soundLanguage_indexChanged(int index) } +//----------------------------------------------------------------------------- void NotifyPluginOptionsPage::changeButtonText(Phonon::State newstate, Phonon::State oldstate) { //Q_ASSERT(Phonon::ErrorState != newstate); @@ -253,25 +414,29 @@ void NotifyPluginOptionsPage::changeButtonText(Phonon::State newstate, Phonon:: } } +//----------------------------------------------------------------------------- void NotifyPluginOptionsPage::onFinishedPlaying() { notifySound->clear(); } +//----------------------------------------------------------------------------- void NotifyPluginOptionsPage::on_buttonTestSoundNotification_clicked() { NotificationItem* notification = NULL; if (-1 == _notifyRulesSelection->currentIndex().row()) - return; + return; notifySound->clearQueue(); notification = privListNotifications.at(_notifyRulesSelection->currentIndex().row()); notification->parseNotifyMessage(); QStringList sequence = notification->getMessageSequence(); Q_ASSERT(!!sequence.size()); - foreach(QString item, sequence) - notifySound->enqueue(Phonon::MediaSource(item)); - + qNotifyDebug() << "on_buttonTestSoundNotification_clicked"; + foreach(QString item, sequence) { + qNotifyDebug() << item; + notifySound->enqueue(Phonon::MediaSource(item)); + } notifySound->play(); } @@ -284,90 +449,132 @@ void NotifyPluginOptionsPage::on_chkEnableSound_toggled(bool state) audioOutput->setMuted(state1); } +//----------------------------------------------------------------------------- void NotifyPluginOptionsPage::updateConfigView(NotificationItem* notification) { + Q_ASSERT(notification); + disconnect(options_page->UAVObject, SIGNAL(currentIndexChanged(QString)), + this, SLOT(on_UAVObject_indexChanged(QString))); + disconnect(options_page->UAVObjectField, SIGNAL(currentIndexChanged(QString)), + this, SLOT(onUAVField_indexChanged(QString))); + QString path = notification->getSoundCollectionPath(); if (path == "") { - //QDir dir = QDir::currentPath(); - //path = QDir::currentPath().left(QDir::currentPath().indexOf("OpenPilot",0,Qt::CaseSensitive))+"../share/sounds"; - path = Utils::PathUtils().InsertDataPath("%%DATAPATH%%sounds"); + //QDir dir = QDir::currentPath(); + //path = QDir::currentPath().left(QDir::currentPath().indexOf("OpenPilot",0,Qt::CaseSensitive))+"../share/sounds"; + path = Utils::PathUtils().InsertDataPath("%%DATAPATH%%sounds"); } options_page->SoundDirectoryPathChooser->setPath(path); if (-1 != options_page->SoundCollectionList->findText(notification->getCurrentLanguage())){ - options_page->SoundCollectionList->setCurrentIndex(options_page->SoundCollectionList->findText(notification->getCurrentLanguage())); + options_page->SoundCollectionList->setCurrentIndex(options_page->SoundCollectionList->findText(notification->getCurrentLanguage())); } else { - options_page->SoundCollectionList->setCurrentIndex(options_page->SoundCollectionList->findText("default")); + options_page->SoundCollectionList->setCurrentIndex(options_page->SoundCollectionList->findText("default")); + } + + + // Fills the combo boxes for the UAVObjects + QList< QList > objList = objManager.getDataObjects(); + foreach (QList list, objList) { + foreach (UAVDataObject* obj, list) { + options_page->UAVObject->addItem(obj->getName()); + } } if (options_page->UAVObject->findText(notification->getDataObject())!=-1){ - options_page->UAVObject->setCurrentIndex(options_page->UAVObject->findText(notification->getDataObject())); + options_page->UAVObject->setCurrentIndex(options_page->UAVObject->findText(notification->getDataObject())); } - // Now load the object field values: options_page->UAVObjectField->clear(); QString uavDataObject = notification->getDataObject(); UAVDataObject* obj = dynamic_cast(objManager.getObject(uavDataObject)); if (obj != NULL ) { - QList fieldList = obj->getFields(); - foreach (UAVObjectField* field, fieldList) { - options_page->UAVObjectField->addItem(field->getName()); - } + QList fieldList = obj->getFields(); + foreach (UAVObjectField* field, fieldList) { + options_page->UAVObjectField->addItem(field->getName()); + } } if (-1 != options_page->UAVObjectField->findText(notification->getObjectField())) { - options_page->UAVObjectField->setCurrentIndex(options_page->UAVObjectField->findText(notification->getObjectField())); + options_page->UAVObjectField->setCurrentIndex(options_page->UAVObjectField->findText(notification->getObjectField())); } if (-1 != options_page->Sound1->findText(notification->getSound1())) { - options_page->Sound1->setCurrentIndex(options_page->Sound1->findText(notification->getSound1())); + options_page->Sound1->setCurrentIndex(options_page->Sound1->findText(notification->getSound1())); } else { - // show item from default location - options_page->SoundCollectionList->setCurrentIndex(options_page->SoundCollectionList->findText("default")); - options_page->Sound1->setCurrentIndex(options_page->Sound1->findText(notification->getSound1())); - - // don't show item if it wasn't find in stored location - //options_page->Sound1->setCurrentIndex(-1); + // show item from default location + options_page->SoundCollectionList->setCurrentIndex(options_page->SoundCollectionList->findText("default")); + options_page->Sound1->setCurrentIndex(options_page->Sound1->findText(notification->getSound1())); } if (-1 != options_page->Sound2->findText(notification->getSound2())) { - options_page->Sound2->setCurrentIndex(options_page->Sound2->findText(notification->getSound2())); + options_page->Sound2->setCurrentIndex(options_page->Sound2->findText(notification->getSound2())); } else { - // show item from default location - options_page->SoundCollectionList->setCurrentIndex(options_page->SoundCollectionList->findText("default")); - options_page->Sound2->setCurrentIndex(options_page->Sound2->findText(notification->getSound2())); - - // don't show item if it wasn't find in stored location - //options_page->Sound2->setCurrentIndex(-1); + // show item from default location + options_page->SoundCollectionList->setCurrentIndex(options_page->SoundCollectionList->findText("default")); + options_page->Sound2->setCurrentIndex(options_page->Sound2->findText(notification->getSound2())); } if (-1 != options_page->Sound3->findText(notification->getSound3())) { - options_page->Sound3->setCurrentIndex(options_page->Sound3->findText(notification->getSound3())); + options_page->Sound3->setCurrentIndex(options_page->Sound3->findText(notification->getSound3())); } else { - // show item from default location - options_page->SoundCollectionList->setCurrentIndex(options_page->SoundCollectionList->findText("default")); - options_page->Sound3->setCurrentIndex(options_page->Sound3->findText(notification->getSound3())); + // show item from default location + options_page->SoundCollectionList->setCurrentIndex(options_page->SoundCollectionList->findText("default")); + options_page->Sound3->setCurrentIndex(options_page->Sound3->findText(notification->getSound3())); } - if (-1 != options_page->Value->findText(notification->getValue())) { - options_page->Value->setCurrentIndex(options_page->Value->findText(notification->getValue())); + if (-1 != _valueRange->findText(notification->range())) { + _valueRange->setCurrentIndex(_valueRange->findText(notification->range())); } - if (-1 != options_page->SayOrder->findText(notification->getSayOrder())) { - options_page->SayOrder->setCurrentIndex(options_page->SayOrder->findText(notification->getSayOrder())); + if (-1 != _sayOrder->findText(notification->getSayOrder())) { + _sayOrder->setCurrentIndex(_sayOrder->findText(notification->getSayOrder())); } - options_page->ValueSpinBox->setValue(notification->getSpinBoxValue()); + setDynamicValueField(notification); + + connect(options_page->UAVObject, SIGNAL(currentIndexChanged(QString)), + this, SLOT(on_UAVObject_indexChanged(QString))); + connect(options_page->UAVObjectField, SIGNAL(currentIndexChanged(QString)), + this, SLOT(onUAVField_indexChanged(QString))); + } +//----------------------------------------------------------------------------- +void NotifyPluginOptionsPage::setDynamicValueField(NotificationItem* notification) +{ + if(QSpinBox* spinValue = dynamic_cast(_fieldValue)) + spinValue->setValue(notification->singleValue()); + else { + if(QComboBox* comboBoxValue = dynamic_cast(_fieldValue)) + comboBoxValue->setCurrentIndex(notification->singleValue()); + else { + if(QLineEdit* rangeValue = dynamic_cast(_fieldValue)) { + resetValueRange(); + rangeValue->setText(QString("%1%2").arg(notification->singleValue()) + .arg(notification->valueRange2())); + } else { + qNotifyDebug() << "NotifyPluginOptionsPage::setDynamicValueField | unknown _fieldValue: " << _fieldValue; + } + + } + } +} + +//----------------------------------------------------------------------------- void NotifyPluginOptionsPage::on_tableNotification_changeSelection( const QItemSelection & selected, const QItemSelection & deselected ) { bool select = false; notifySound->stop(); if (selected.indexes().size()) { - select = true; - updateConfigView(privListNotifications.at(selected.indexes().at(0).row())); + select = true; + _selectedNotification = privListNotifications.at(selected.indexes().at(0).row()); + updateConfigView(_selectedNotification); + UAVDataObject* obj = dynamic_cast( objManager.getObject(options_page->UAVObject->currentText())); + UAVObjectField* field = obj->getField(options_page->UAVObjectField->currentText()); + addDynamicField(field); + setDynamicValueField(_selectedNotification); } options_page->buttonModify->setEnabled(select); @@ -375,7 +582,7 @@ void NotifyPluginOptionsPage::on_tableNotification_changeSelection( const QItemS options_page->buttonPlayNotification->setEnabled(select); } - +//----------------------------------------------------------------------------- void NotifyPluginOptionsPage::on_buttonAddNotification_clicked() { NotificationItem* notification = new NotificationItem; @@ -392,34 +599,36 @@ void NotifyPluginOptionsPage::on_buttonAddNotification_clicked() notification->setCurrentLanguage(options_page->SoundCollectionList->currentText()); notification->setDataObject(options_page->UAVObject->currentText()); notification->setObjectField(options_page->UAVObjectField->currentText()); - notification->setValue(options_page->Value->currentText()); - notification->setSpinBoxValue(options_page->ValueSpinBox->value()); + notification->setRange(_valueRange->currentText()); + + if(QSpinBox* spinValue = dynamic_cast(_fieldValue)) + notification->setSingleValue(spinValue->value()); if (options_page->Sound1->currentText().size() > 0) - notification->setSound1(options_page->Sound1->currentText()); + notification->setSound1(options_page->Sound1->currentText()); notification->setSound2(options_page->Sound2->currentText()); notification->setSound3(options_page->Sound3->currentText()); -if ( ((!options_page->Sound2->currentText().size()) && (options_page->SayOrder->currentText()=="After second")) - || ((!options_page->Sound3->currentText().size()) && (options_page->SayOrder->currentText()=="After third")) ) { + if ( ((!options_page->Sound2->currentText().size()) && (_sayOrder->currentText()=="After second")) + || ((!options_page->Sound3->currentText().size()) && (_sayOrder->currentText()=="After third")) ) { return; } else { - notification->setSayOrder(options_page->SayOrder->currentText()); + notification->setSayOrder(_sayOrder->currentText()); } - privListNotifications.append(notification); - emit entryAdded(privListNotifications.size() - 1); + + _notifyRulesModel->entryAdded(notification); _notifyRulesSelection->setCurrentIndex(_notifyRulesModel->index(privListNotifications.size()-1,0,QModelIndex()), QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows); } - +//----------------------------------------------------------------------------- void NotifyPluginOptionsPage::on_buttonDeleteNotification_clicked() { _notifyRulesModel->removeRow(_notifyRulesSelection->currentIndex().row()); if (!_notifyRulesModel->rowCount() && (_notifyRulesSelection->currentIndex().row() > 0 - && _notifyRulesSelection->currentIndex().row() < _notifyRulesModel->rowCount()) ) + && _notifyRulesSelection->currentIndex().row() < _notifyRulesModel->rowCount()) ) { options_page->buttonDelete->setEnabled(false); options_page->buttonModify->setEnabled(false); @@ -428,6 +637,7 @@ void NotifyPluginOptionsPage::on_buttonDeleteNotification_clicked() } +//----------------------------------------------------------------------------- void NotifyPluginOptionsPage::on_buttonModifyNotification_clicked() { NotificationItem* notification = new NotificationItem; diff --git a/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.cpp.orig b/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.cpp.orig index b91317c9f..2ff775e31 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.cpp.orig +++ b/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.cpp.orig @@ -43,13 +43,13 @@ #include "notifyplugin.h" #include "notifyitemdelegate.h" #include "notifytablemodel.h" +#include "notifylogging.h" NotifyPluginOptionsPage::NotifyPluginOptionsPage(/*NotificationItem *config,*/ QObject *parent) : IOptionsPage(parent) , objManager(*ExtensionSystem::PluginManager::instance()->getObject()) , owner(qobject_cast(parent)) , currentCollectionPath("") - , privListNotifications((qobject_cast(parent))->getListNotifications()) { } @@ -64,22 +64,53 @@ QWidget *NotifyPluginOptionsPage::createPage(QWidget *parent) //main widget QWidget *optionsPageWidget = new QWidget; //main layout + options_page->setupUi(optionsPageWidget); + + listSoundFiles.clear(); + + options_page->SoundDirectoryPathChooser->setExpectedKind(Utils::PathChooser::Directory); + options_page->SoundDirectoryPathChooser->setPromptDialogTitle(tr("Choose sound collection directory")); + + // Fills the combo boxes for the UAVObjects + QList< QList > objList = objManager.getDataObjects(); + foreach (QList list, objList) { + foreach (UAVDataObject* obj, list) { + options_page->UAVObject->addItem(obj->getName()); + } + } + +<<<<<<< Updated upstream + connect(options_page->SoundDirectoryPathChooser, SIGNAL(changed(const QString&)), this, SLOT(on_buttonSoundFolder_clicked(const QString&))); + connect(options_page->SoundCollectionList, SIGNAL(currentIndexChanged (int)), this, SLOT(on_soundLanguage_indexChanged(int))); + connect(options_page->UAVObject, SIGNAL(currentIndexChanged(QString)), this, SLOT(on_UAVObject_indexChanged(QString))); +======= + options_page = new Ui::NotifyPluginOptionsPage(); + //main widget + QWidget *optionsPageWidget = new QWidget; + //main layout options_page->setupUi(optionsPageWidget); delegateItems.clear(); listSoundFiles.clear(); + options_page->horizontalLayout_3->addWidget(new QPushButton("testtt")); delegateItems << "Repeat Once" << "Repeat Instantly" << "Repeat 10 seconds" << "Repeat 30 seconds" << "Repeat 1 minute"; + options_page->chkEnableSound->setChecked(owner->getEnableSound()); options_page->SoundDirectoryPathChooser->setExpectedKind(Utils::PathChooser::Directory); options_page->SoundDirectoryPathChooser->setPromptDialogTitle(tr("Choose sound collection directory")); + + + ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); + objManager = pm->getObject(); + // Fills the combo boxes for the UAVObjects - QList< QList > objList = objManager.getDataObjects(); + QList< QList > objList = objManager->getDataObjects(); foreach (QList list, objList) { foreach (UAVDataObject* obj, list) { options_page->UAVObject->addItem(obj->getName()); @@ -88,95 +119,122 @@ QWidget *NotifyPluginOptionsPage::createPage(QWidget *parent) connect(options_page->SoundDirectoryPathChooser, SIGNAL(changed(const QString&)), this, SLOT(on_buttonSoundFolder_clicked(const QString&))); connect(options_page->SoundCollectionList, SIGNAL(currentIndexChanged (int)), this, SLOT(on_soundLanguage_indexChanged(int))); - connect(options_page->UAVObject, SIGNAL(currentIndexChanged(QString)), this, SLOT(on_UAVObject_indexChanged(QString))); + connect(options_page->buttonAdd, SIGNAL(pressed()), this, SLOT(on_buttonAddNotification_clicked())); + connect(options_page->buttonDelete, SIGNAL(pressed()), this, SLOT(on_buttonDeleteNotification_clicked())); + connect(options_page->buttonModify, SIGNAL(pressed()), this, SLOT(on_buttonModifyNotification_clicked())); +// connect(options_page->buttonTestSound1, SIGNAL(clicked()), this, SLOT(on_buttonTestSound1_clicked())); +// connect(options_page->buttonTestSound2, SIGNAL(clicked()), this, SLOT(on_buttonTestSound2_clicked())); + connect(options_page->buttonPlayNotification, SIGNAL(clicked()), this, SLOT(on_buttonTestSoundNotification_clicked())); + connect(options_page->chkEnableSound, SIGNAL(toggled(bool)), this, SLOT(on_chkEnableSound_toggled(bool))); - connect(this, SIGNAL(updateNotifications(QList)), - owner, SLOT(updateNotificationList(QList))); + + connect(options_page->UAVObject, SIGNAL(currentIndexChanged(QString)), this, SLOT(on_UAVObject_indexChanged(QString))); + connect(this, SIGNAL(updateNotifications(QList)), + owner, SLOT(updateNotificationList(QList))); connect(this, SIGNAL(resetNotification()),owner, SLOT(resetNotification())); //emit resetNotification(); - privListNotifications.clear(); - for (int i = 0; i < owner->getListNotifications().size(); ++i) { - NotificationItem* notification = new NotificationItem(); - owner->getListNotifications().at(i)->copyTo(notification); - privListNotifications.append(notification); + privListNotifications.clear(); + + for (int i = 0; i < owner->getListNotifications().size(); ++i) { + NotifyPluginConfiguration* notification = new NotifyPluginConfiguration(); + owner->getListNotifications().at(i)->copyTo(notification); + privListNotifications.append(notification); } - updateConfigView(owner->getCurrentNotification()); + updateConfigView(owner->getCurrentNotification()); - initButtons(); - initRulesTableModel(); - initRulesTableView(); - initPhononPlayer(); + options_page->chkEnableSound->setChecked(owner->getEnableSound()); - return optionsPageWidget; + QStringList headerStrings; + headerStrings << "Name" << "Repeats" << "Lifetime,sec"; +>>>>>>> Stashed changes + + connect(this, SIGNAL(updateNotifications(QList)), + owner, SLOT(updateNotificationList(QList))); + //connect(this, SIGNAL(resetNotification()),owner, SLOT(resetNotification())); + + +// privListNotifications = ((qobject_cast(parent))->getListNotifications()); + privListNotifications = owner->getListNotifications(); + + updateConfigView(owner->getCurrentNotification()); + + initRulesTable(); + initButtons(); + initPhononPlayer(); + + return optionsPageWidget; } void NotifyPluginOptionsPage::initButtons() { - options_page->chkEnableSound->setChecked(owner->getEnableSound()); - connect(options_page->chkEnableSound, SIGNAL(toggled(bool)), this, SLOT(on_chkEnableSound_toggled(bool))); + options_page->chkEnableSound->setChecked(owner->getEnableSound()); + connect(options_page->chkEnableSound, SIGNAL(toggled(bool)), this, SLOT(on_chkEnableSound_toggled(bool))); - options_page->buttonModify->setEnabled(false); - options_page->buttonDelete->setEnabled(false); - options_page->buttonPlayNotification->setEnabled(false); - connect(options_page->buttonAdd, SIGNAL(pressed()), this, SLOT(on_buttonAddNotification_clicked())); - connect(options_page->buttonDelete, SIGNAL(pressed()), this, SLOT(on_buttonDeleteNotification_clicked())); - connect(options_page->buttonModify, SIGNAL(pressed()), this, SLOT(on_buttonModifyNotification_clicked())); - connect(options_page->buttonPlayNotification, SIGNAL(clicked()), this, SLOT(on_buttonTestSoundNotification_clicked())); + options_page->buttonModify->setEnabled(false); + options_page->buttonDelete->setEnabled(false); + options_page->buttonPlayNotification->setEnabled(false); + connect(options_page->buttonAdd, SIGNAL(pressed()), this, SLOT(on_buttonAddNotification_clicked())); + connect(options_page->buttonDelete, SIGNAL(pressed()), this, SLOT(on_buttonDeleteNotification_clicked())); + connect(options_page->buttonModify, SIGNAL(pressed()), this, SLOT(on_buttonModifyNotification_clicked())); + connect(options_page->buttonPlayNotification, SIGNAL(clicked()), this, SLOT(on_buttonTestSoundNotification_clicked())); } void NotifyPluginOptionsPage::initPhononPlayer() { - notifySound = Phonon::createPlayer(Phonon::NotificationCategory); - connect(notifySound,SIGNAL(stateChanged(Phonon::State,Phonon::State)), + notifySound.reset(Phonon::createPlayer(Phonon::NotificationCategory)); + connect(notifySound.data(),SIGNAL(stateChanged(Phonon::State,Phonon::State)), this,SLOT(changeButtonText(Phonon::State,Phonon::State))); - connect(notifySound, SIGNAL(finished(void)), this, SLOT(onFinishedPlaying(void))); + connect(notifySound.data(), SIGNAL(finished(void)), this, SLOT(onFinishedPlaying(void))); } -void NotifyPluginOptionsPage::initRulesTableModel() +void NotifyPluginOptionsPage::initRulesTable() { - notifyRulesModel.reset(new NotifyTableModel(&privListNotifications)); - notifyRulesSelection = new QItemSelectionModel(notifyRulesModel.data()); - connect(notifyRulesSelection, SIGNAL(selectionChanged ( const QItemSelection &, const QItemSelection & )), + qNotifyDebug_if(_notifyRulesModel.isNull()) << "_notifyRulesModel.isNull())"; + qNotifyDebug_if(!_notifyRulesSelection) << "_notifyRulesSelection.isNull())"; + //QItemSelectionModel* selection = _notifyRulesSelection.take(); + _notifyRulesModel.reset(new NotifyTableModel(privListNotifications)); + _notifyRulesSelection = new QItemSelectionModel(_notifyRulesModel.data()); + + connect(_notifyRulesSelection, SIGNAL(selectionChanged ( const QItemSelection &, const QItemSelection & )), this, SLOT(on_tableNotification_changeSelection( const QItemSelection & , const QItemSelection & ))); connect(this, SIGNAL(entryUpdated(int)), - notifyRulesModel.data(), SLOT(entryUpdated(int))); + _notifyRulesModel.data(), SLOT(entryUpdated(int))); connect(this, SIGNAL(entryAdded(int)), - notifyRulesModel.data(), SLOT(entryAdded(int))); -} + _notifyRulesModel.data(), SLOT(entryAdded(int))); + + options_page->notifyRulesView->setModel(_notifyRulesModel.data()); + options_page->notifyRulesView->setSelectionModel(_notifyRulesSelection); + options_page->notifyRulesView->setItemDelegate(new NotifyItemDelegate(this)); + + options_page->notifyRulesView->resizeRowsToContents(); + options_page->notifyRulesView->setColumnWidth(eMESSAGE_NAME,200); + options_page->notifyRulesView->setColumnWidth(eREPEAT_VALUE,120); + options_page->notifyRulesView->setColumnWidth(eEXPIRE_TIME,100); + options_page->notifyRulesView->setColumnWidth(eENABLE_NOTIFICATION,60); + options_page->notifyRulesView->setDragEnabled(true); + options_page->notifyRulesView->setAcceptDrops(true); + options_page->notifyRulesView->setDropIndicatorShown(true); + options_page->notifyRulesView->setDragDropMode(QAbstractItemView::InternalMove); -void NotifyPluginOptionsPage::initRulesTableView() -{ - options_page->notifyRulesView->setModel(notifyRulesModel.data()); - options_page->notifyRulesView->resizeRowsToContents(); - options_page->notifyRulesView->setSelectionModel(notifyRulesSelection); - options_page->notifyRulesView->setItemDelegate(new NotifyItemDelegate(delegateItems,this)); - options_page->notifyRulesView->setColumnWidth(eMESSAGE_NAME,200); - options_page->notifyRulesView->setColumnWidth(eREPEAT_VALUE,120); - options_page->notifyRulesView->setColumnWidth(eEXPIRE_TIME,100); - options_page->notifyRulesView->setColumnWidth(eENABLE_NOTIFICATION,60); - options_page->notifyRulesView->setDragEnabled(true); - options_page->notifyRulesView->setAcceptDrops(true); - options_page->notifyRulesView->setDropIndicatorShown(true); } void NotifyPluginOptionsPage::getOptionsPageValues(NotificationItem* notification) { - notification->setSoundCollectionPath(options_page->SoundDirectoryPathChooser->path()); - notification->setCurrentLanguage(options_page->SoundCollectionList->currentText()); - notification->setDataObject(options_page->UAVObject->currentText()); - notification->setObjectField(options_page->UAVObjectField->currentText()); - notification->setSound1(options_page->Sound1->currentText()); - notification->setSound2(options_page->Sound2->currentText()); - notification->setSound3(options_page->Sound3->currentText()); - notification->setSayOrder(options_page->SayOrder->currentText()); - notification->setValue(options_page->Value->currentText()); - notification->setSpinBoxValue(options_page->ValueSpinBox->value()); - + notification->setSoundCollectionPath(options_page->SoundDirectoryPathChooser->path()); + notification->setCurrentLanguage(options_page->SoundCollectionList->currentText()); + notification->setDataObject(options_page->UAVObject->currentText()); + notification->setObjectField(options_page->UAVObjectField->currentText()); + notification->setSound1(options_page->Sound1->currentText()); + notification->setSound2(options_page->Sound2->currentText()); + notification->setSound3(options_page->Sound3->currentText()); + notification->setSayOrder(options_page->SayOrder->currentText()); + notification->setValue(options_page->Value->currentText()); + notification->setSpinBoxValue(options_page->ValueSpinBox->value()); } /*! @@ -185,19 +243,19 @@ void NotifyPluginOptionsPage::getOptionsPageValues(NotificationItem* notificatio */ void NotifyPluginOptionsPage::apply() { - getOptionsPageValues(owner->getCurrentNotification()); - owner->setEnableSound(options_page->chkEnableSound->isChecked()); - emit updateNotifications(privListNotifications); + getOptionsPageValues(owner->getCurrentNotification()); + owner->setEnableSound(options_page->chkEnableSound->isChecked()); + emit updateNotifications(privListNotifications); } void NotifyPluginOptionsPage::finish() { - disconnect(notifySound,SIGNAL(stateChanged(Phonon::State,Phonon::State)), - this,SLOT(changeButtonText(Phonon::State,Phonon::State))); - if (notifySound) { - notifySound->stop(); - notifySound->clear(); - } + disconnect(notifySound.data(),SIGNAL(stateChanged(Phonon::State,Phonon::State)), + this,SLOT(changeButtonText(Phonon::State,Phonon::State))); + if (notifySound) { + notifySound->stop(); + notifySound->clear(); + } } ////////////////////////////////////////////////////////////////////////////// @@ -205,23 +263,23 @@ void NotifyPluginOptionsPage::finish() // combo box ////////////////////////////////////////////////////////////////////////////// void NotifyPluginOptionsPage::on_UAVObject_indexChanged(QString val) { - options_page->UAVObjectField->clear(); - ExtensionSystem::PluginManager* pm = ExtensionSystem::PluginManager::instance(); - UAVObjectManager* objManager = pm->getObject(); + options_page->UAVObjectField->clear(); + ExtensionSystem::PluginManager* pm = ExtensionSystem::PluginManager::instance(); + UAVObjectManager* objManager = pm->getObject(); UAVDataObject* obj = dynamic_cast( objManager->getObject(val) ); QList fieldList = obj->getFields(); foreach (UAVObjectField* field, fieldList) { - options_page->UAVObjectField->addItem(field->getName()); + options_page->UAVObjectField->addItem(field->getName()); } } // locate collection folder on disk void NotifyPluginOptionsPage::on_buttonSoundFolder_clicked(const QString& path) { - QDir dirPath(path); - listDirCollections = dirPath.entryList(QDir::AllDirs | QDir::NoDotAndDotDot); - options_page->SoundCollectionList->clear(); - options_page->SoundCollectionList->addItems(listDirCollections); + QDir dirPath(path); + listDirCollections = dirPath.entryList(QDir::AllDirs | QDir::NoDotAndDotDot); + options_page->SoundCollectionList->clear(); + options_page->SoundCollectionList->addItems(listDirCollections); } @@ -230,7 +288,7 @@ void NotifyPluginOptionsPage::on_soundLanguage_indexChanged(int index) options_page->SoundCollectionList->setCurrentIndex(index); currentCollectionPath = options_page->SoundDirectoryPathChooser->path() - + QDir::toNativeSeparators("/" + options_page->SoundCollectionList->currentText()); + + QDir::toNativeSeparators("/" + options_page->SoundCollectionList->currentText()); QDir dirPath(currentCollectionPath); QStringList filters; @@ -238,7 +296,6 @@ void NotifyPluginOptionsPage::on_soundLanguage_indexChanged(int index) dirPath.setNameFilters(filters); listSoundFiles = dirPath.entryList(filters); listSoundFiles.replaceInStrings(QRegExp(".mp3|.wav"), ""); - options_page->Sound1->clear(); options_page->Sound2->clear(); options_page->Sound3->clear(); @@ -252,135 +309,122 @@ void NotifyPluginOptionsPage::on_soundLanguage_indexChanged(int index) void NotifyPluginOptionsPage::changeButtonText(Phonon::State newstate, Phonon::State oldstate) { - //Q_ASSERT(Phonon::ErrorState != newstate); + //Q_ASSERT(Phonon::ErrorState != newstate); - if (newstate == Phonon::PausedState || newstate == Phonon::StoppedState) { - options_page->buttonPlayNotification->setText("Play"); - options_page->buttonPlayNotification->setIcon(QPixmap(":/notify/images/play.png")); - } else { - if (newstate == Phonon::PlayingState) { - options_page->buttonPlayNotification->setText("Stop"); - options_page->buttonPlayNotification->setIcon(QPixmap(":/notify/images/stop.png")); - } - } + if (newstate == Phonon::PausedState || newstate == Phonon::StoppedState) { + options_page->buttonPlayNotification->setText("Play"); + options_page->buttonPlayNotification->setIcon(QPixmap(":/notify/images/play.png")); + } else { + if (newstate == Phonon::PlayingState) { + options_page->buttonPlayNotification->setText("Stop"); + options_page->buttonPlayNotification->setIcon(QPixmap(":/notify/images/stop.png")); + } + } } void NotifyPluginOptionsPage::onFinishedPlaying() { - notifySound->clear(); + notifySound->clear(); } void NotifyPluginOptionsPage::on_buttonTestSoundNotification_clicked() { - NotificationItem* notification = NULL; + NotificationItem* notification = NULL; - if (-1 == notifyRulesSelection->currentIndex().row()) - return; - notifySound->clearQueue(); - notification = privListNotifications.at(notifyRulesSelection->currentIndex().row()); - notification->parseNotifyMessage(); - QStringList sequence = notification->getMessageSequence(); - Q_ASSERT(!!sequence.size()); - foreach(QString item, sequence) - notifySound->enqueue(Phonon::MediaSource(item)); + if (-1 == _notifyRulesSelection->currentIndex().row()) + return; + notifySound->clearQueue(); + notification = privListNotifications.at(_notifyRulesSelection->currentIndex().row()); + notification->parseNotifyMessage(); + QStringList sequence = notification->getMessageSequence(); + Q_ASSERT(!!sequence.size()); + foreach(QString item, sequence) + notifySound->enqueue(Phonon::MediaSource(item)); - notifySound->play(); + notifySound->play(); } void NotifyPluginOptionsPage::on_chkEnableSound_toggled(bool state) { - bool state1 = 1^state; + bool state1 = 1^state; - QList listOutputs = notifySound->outputPaths(); - Phonon::AudioOutput * audioOutput = (Phonon::AudioOutput*)listOutputs.last().sink(); - audioOutput->setMuted(state1); + QList listOutputs = notifySound->outputPaths(); + Phonon::AudioOutput * audioOutput = (Phonon::AudioOutput*)listOutputs.last().sink(); + audioOutput->setMuted(state1); } void NotifyPluginOptionsPage::updateConfigView(NotificationItem* notification) { QString path = notification->getSoundCollectionPath(); if (path == "") { - //QDir dir = QDir::currentPath(); - //path = QDir::currentPath().left(QDir::currentPath().indexOf("OpenPilot",0,Qt::CaseSensitive))+"../share/sounds"; - path = Utils::PathUtils().InsertDataPath("%%DATAPATH%%sounds"); + //QDir dir = QDir::currentPath(); + //path = QDir::currentPath().left(QDir::currentPath().indexOf("OpenPilot",0,Qt::CaseSensitive))+"../share/sounds"; + path = Utils::PathUtils().InsertDataPath("%%DATAPATH%%sounds"); } options_page->SoundDirectoryPathChooser->setPath(path); if (-1 != options_page->SoundCollectionList->findText(notification->getCurrentLanguage())){ - options_page->SoundCollectionList->setCurrentIndex(options_page->SoundCollectionList->findText(notification->getCurrentLanguage())); + options_page->SoundCollectionList->setCurrentIndex(options_page->SoundCollectionList->findText(notification->getCurrentLanguage())); } else { - options_page->SoundCollectionList->setCurrentIndex(options_page->SoundCollectionList->findText("default")); + options_page->SoundCollectionList->setCurrentIndex(options_page->SoundCollectionList->findText("default")); } if (options_page->UAVObject->findText(notification->getDataObject())!=-1){ - options_page->UAVObject->setCurrentIndex(options_page->UAVObject->findText(notification->getDataObject())); + options_page->UAVObject->setCurrentIndex(options_page->UAVObject->findText(notification->getDataObject())); } -<<<<<<< Updated upstream - // Now load the object field values: - options_page->UAVObjectField->clear(); - QString uavDataObject = notification->getDataObject(); - UAVDataObject* obj = dynamic_cast(objManager.getObject(uavDataObject)); - if (obj != NULL ) { - QList fieldList = obj->getFields(); - foreach (UAVObjectField* field, fieldList) { - options_page->UAVObjectField->addItem(field->getName()); - } - } -======= // Now load the object field values: options_page->UAVObjectField->clear(); QString uavDataObject = notification->getDataObject(); - UAVDataObject* obj = dynamic_cast( objManager->getObject(uavDataObject/*objList.at(0).at(0)->getName()*/) ); + UAVDataObject* obj = dynamic_cast(objManager.getObject(uavDataObject)); if (obj != NULL ) { - QList fieldList = obj->getFields(); - foreach (UAVObjectField* field, fieldList) { - options_page->UAVObjectField->addItem(field->getName()); - } + QList fieldList = obj->getFields(); + foreach (UAVObjectField* field, fieldList) { + options_page->UAVObjectField->addItem(field->getName()); + } } ->>>>>>> Stashed changes if (-1 != options_page->UAVObjectField->findText(notification->getObjectField())) { - options_page->UAVObjectField->setCurrentIndex(options_page->UAVObjectField->findText(notification->getObjectField())); + options_page->UAVObjectField->setCurrentIndex(options_page->UAVObjectField->findText(notification->getObjectField())); } if (-1 != options_page->Sound1->findText(notification->getSound1())) { - options_page->Sound1->setCurrentIndex(options_page->Sound1->findText(notification->getSound1())); + options_page->Sound1->setCurrentIndex(options_page->Sound1->findText(notification->getSound1())); } else { - // show item from default location - options_page->SoundCollectionList->setCurrentIndex(options_page->SoundCollectionList->findText("default")); - options_page->Sound1->setCurrentIndex(options_page->Sound1->findText(notification->getSound1())); + // show item from default location + options_page->SoundCollectionList->setCurrentIndex(options_page->SoundCollectionList->findText("default")); + options_page->Sound1->setCurrentIndex(options_page->Sound1->findText(notification->getSound1())); - // don't show item if it wasn't find in stored location - //options_page->Sound1->setCurrentIndex(-1); + // don't show item if it wasn't find in stored location + //options_page->Sound1->setCurrentIndex(-1); } if (-1 != options_page->Sound2->findText(notification->getSound2())) { - options_page->Sound2->setCurrentIndex(options_page->Sound2->findText(notification->getSound2())); + options_page->Sound2->setCurrentIndex(options_page->Sound2->findText(notification->getSound2())); } else { - // show item from default location - options_page->SoundCollectionList->setCurrentIndex(options_page->SoundCollectionList->findText("default")); - options_page->Sound2->setCurrentIndex(options_page->Sound2->findText(notification->getSound2())); + // show item from default location + options_page->SoundCollectionList->setCurrentIndex(options_page->SoundCollectionList->findText("default")); + options_page->Sound2->setCurrentIndex(options_page->Sound2->findText(notification->getSound2())); - // don't show item if it wasn't find in stored location - //options_page->Sound2->setCurrentIndex(-1); + // don't show item if it wasn't find in stored location + //options_page->Sound2->setCurrentIndex(-1); } if (-1 != options_page->Sound3->findText(notification->getSound3())) { - options_page->Sound3->setCurrentIndex(options_page->Sound3->findText(notification->getSound3())); + options_page->Sound3->setCurrentIndex(options_page->Sound3->findText(notification->getSound3())); } else { - // show item from default location - options_page->SoundCollectionList->setCurrentIndex(options_page->SoundCollectionList->findText("default")); - options_page->Sound3->setCurrentIndex(options_page->Sound3->findText(notification->getSound3())); + // show item from default location + options_page->SoundCollectionList->setCurrentIndex(options_page->SoundCollectionList->findText("default")); + options_page->Sound3->setCurrentIndex(options_page->Sound3->findText(notification->getSound3())); } if (-1 != options_page->Value->findText(notification->getValue())) { - options_page->Value->setCurrentIndex(options_page->Value->findText(notification->getValue())); + options_page->Value->setCurrentIndex(options_page->Value->findText(notification->getValue())); } if (-1 != options_page->SayOrder->findText(notification->getSayOrder())) { - options_page->SayOrder->setCurrentIndex(options_page->SayOrder->findText(notification->getSayOrder())); + options_page->SayOrder->setCurrentIndex(options_page->SayOrder->findText(notification->getSayOrder())); } options_page->ValueSpinBox->setValue(notification->getSpinBoxValue()); @@ -388,78 +432,81 @@ void NotifyPluginOptionsPage::updateConfigView(NotificationItem* notification) void NotifyPluginOptionsPage::on_tableNotification_changeSelection( const QItemSelection & selected, const QItemSelection & deselected ) { - bool select = false; - notifySound->stop(); - if (selected.indexes().size()) { - select = true; - updateConfigView(privListNotifications.at(selected.indexes().at(0).row())); - } + bool select = false; + notifySound->stop(); + if (selected.indexes().size()) { + select = true; + updateConfigView(privListNotifications.at(selected.indexes().at(0).row())); + } - options_page->buttonModify->setEnabled(select); - options_page->buttonDelete->setEnabled(select); - options_page->buttonPlayNotification->setEnabled(select); + options_page->buttonModify->setEnabled(select); + options_page->buttonDelete->setEnabled(select); + options_page->buttonPlayNotification->setEnabled(select); } void NotifyPluginOptionsPage::on_buttonAddNotification_clicked() { - NotificationItem* notification = new NotificationItem; + NotificationItem* notification = new NotificationItem; - if (options_page->SoundDirectoryPathChooser->path()=="") { - QPalette textPalette=options_page->SoundDirectoryPathChooser->palette(); - textPalette.setColor(QPalette::Normal,QPalette::Text, Qt::red); - options_page->SoundDirectoryPathChooser->setPalette(textPalette); - options_page->SoundDirectoryPathChooser->setPath("please select sound collection folder"); - return; - } + if (options_page->SoundDirectoryPathChooser->path()=="") { + QPalette textPalette=options_page->SoundDirectoryPathChooser->palette(); + textPalette.setColor(QPalette::Normal,QPalette::Text, Qt::red); + options_page->SoundDirectoryPathChooser->setPalette(textPalette); + options_page->SoundDirectoryPathChooser->setPath("please select sound collection folder"); + return; + } - notification->setSoundCollectionPath(options_page->SoundDirectoryPathChooser->path()); - notification->setCurrentLanguage(options_page->SoundCollectionList->currentText()); - notification->setDataObject(options_page->UAVObject->currentText()); - notification->setObjectField(options_page->UAVObjectField->currentText()); - notification->setValue(options_page->Value->currentText()); - notification->setSpinBoxValue(options_page->ValueSpinBox->value()); + notification->setSoundCollectionPath(options_page->SoundDirectoryPathChooser->path()); + notification->setCurrentLanguage(options_page->SoundCollectionList->currentText()); + notification->setDataObject(options_page->UAVObject->currentText()); + notification->setObjectField(options_page->UAVObjectField->currentText()); + notification->setValue(options_page->Value->currentText()); + notification->setSpinBoxValue(options_page->ValueSpinBox->value()); - if (options_page->Sound1->currentText().size() > 0) - notification->setSound1(options_page->Sound1->currentText()); + if (options_page->Sound1->currentText().size() > 0) + notification->setSound1(options_page->Sound1->currentText()); - notification->setSound2(options_page->Sound2->currentText()); - notification->setSound3(options_page->Sound3->currentText()); + notification->setSound2(options_page->Sound2->currentText()); + notification->setSound3(options_page->Sound3->currentText()); - if ( ((!options_page->Sound2->currentText().size()) && (options_page->SayOrder->currentText()=="After second")) - || ((!options_page->Sound3->currentText().size()) && (options_page->SayOrder->currentText()=="After third")) ) { - return; - } else { - notification->setSayOrder(options_page->SayOrder->currentText()); - } - privListNotifications.append(notification); - emit entryAdded(privListNotifications.size() - 1); - notifyRulesSelection->setCurrentIndex(notifyRulesModel->index(privListNotifications.size()-1,0,QModelIndex()), - QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows); +if ( ((!options_page->Sound2->currentText().size()) && (options_page->SayOrder->currentText()=="After second")) + || ((!options_page->Sound3->currentText().size()) && (options_page->SayOrder->currentText()=="After third")) ) { + return; + } else { + notification->setSayOrder(options_page->SayOrder->currentText()); + } + privListNotifications.append(notification); + emit entryAdded(privListNotifications.size() - 1); + _notifyRulesSelection->setCurrentIndex(_notifyRulesModel->index(privListNotifications.size()-1,0,QModelIndex()), + QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows); } void NotifyPluginOptionsPage::on_buttonDeleteNotification_clicked() { - notifyRulesModel->removeRow(notifyRulesSelection->currentIndex().row()); - if (!notifyRulesModel->rowCount() - && (notifyRulesSelection->currentIndex().row() > 0 - && notifyRulesSelection->currentIndex().row() < notifyRulesModel->rowCount()) ) - { - options_page->buttonDelete->setEnabled(false); - options_page->buttonModify->setEnabled(false); - options_page->buttonPlayNotification->setEnabled(false); - } + _notifyRulesModel->removeRow(_notifyRulesSelection->currentIndex().row()); + if (!_notifyRulesModel->rowCount() + && (_notifyRulesSelection->currentIndex().row() > 0 + && _notifyRulesSelection->currentIndex().row() < _notifyRulesModel->rowCount()) ) + { + options_page->buttonDelete->setEnabled(false); + options_page->buttonModify->setEnabled(false); + options_page->buttonPlayNotification->setEnabled(false); + } } void NotifyPluginOptionsPage::on_buttonModifyNotification_clicked() { - NotificationItem* notification = new NotificationItem; - getOptionsPageValues(notification); - notification->setRepeatFlag(privListNotifications.at(notifyRulesSelection->currentIndex().row())->getRepeatFlag()); - privListNotifications.replace(notifyRulesSelection->currentIndex().row(),notification); - entryUpdated(notifyRulesSelection->currentIndex().row()); + NotificationItem* notification = new NotificationItem; + getOptionsPageValues(notification); + notification->setRetryString(privListNotifications.at(_notifyRulesSelection->currentIndex().row())->retryString()); + notification->setLifetime(privListNotifications.at(_notifyRulesSelection->currentIndex().row())->lifetime()); + notification->setMute(privListNotifications.at(_notifyRulesSelection->currentIndex().row())->mute()); + + privListNotifications.replace(_notifyRulesSelection->currentIndex().row(),notification); + entryUpdated(_notifyRulesSelection->currentIndex().row()); } diff --git a/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.h b/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.h index 9e49e89ec..f4a29ae41 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.h +++ b/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.h @@ -42,7 +42,8 @@ #include #include #include -//#include "notifytablemodel.h" +#include +#include class NotifyTableModel; class NotificationItem; @@ -65,8 +66,6 @@ public: QString category() const { return QLatin1String("Notify Plugin");} QString trCategory() const { return tr("Notify Plugin");} - - QWidget *createPage(QWidget *parent); void apply(); void finish(); @@ -75,13 +74,39 @@ public: void updateConfigView(NotificationItem* notification); void getOptionsPageValues(NotificationItem* notification); +signals: + void updateNotifications(QList list); + //void resetNotification(void); + void entryUpdated(int index); + private: Q_DISABLE_COPY(NotifyPluginOptionsPage) + void resetValueRange(); + void setDynamicValueField(NotificationItem* notification); + void addDynamicField(UAVObjectField* objField); + void addDynamicValueLayout(); void initButtons(); void initPhononPlayer(); void initRulesTable(); +private slots: + void on_buttonTestSoundNotification_clicked(); + + void on_buttonAddNotification_clicked(); + void on_buttonDeleteNotification_clicked(); + void on_buttonModifyNotification_clicked(); + void on_tableNotification_changeSelection( const QItemSelection & selected, const QItemSelection & deselected ); + void on_soundLanguage_indexChanged(int index); + void on_buttonSoundFolder_clicked(const QString& path); + void on_UAVObject_indexChanged(QString val); + void onUAVField_indexChanged(QString val); + void changeButtonText(Phonon::State newstate, Phonon::State oldstate); + void on_chkEnableSound_toggled(bool state); + void on_rangeValue_indexChanged(QString); + + void onFinishedPlaying(void); + private: UAVObjectManager& objManager; SoundNotifyPlugin* owner; @@ -99,28 +124,12 @@ private: QScopedPointer options_page; -signals: - void updateNotifications(QList list); - //void resetNotification(void); - void entryUpdated(int index); - void entryAdded(int position); - - -private slots: - void on_buttonTestSoundNotification_clicked(); - - void on_buttonAddNotification_clicked(); - void on_buttonDeleteNotification_clicked(); - void on_buttonModifyNotification_clicked(); - void on_tableNotification_changeSelection( const QItemSelection & selected, const QItemSelection & deselected ); - void on_soundLanguage_indexChanged(int index); - void on_buttonSoundFolder_clicked(const QString& path); - void on_UAVObject_indexChanged(QString val); - void changeButtonText(Phonon::State newstate, Phonon::State oldstate); - void on_chkEnableSound_toggled(bool state); - - void onFinishedPlaying(void); - + QComboBox* _valueRange; + QComboBox* _sayOrder; + QWidget* _fieldValue; + int _fieldType; + QWidget* _form; + NotificationItem* _selectedNotification; }; #endif // NOTIFYPLUGINOPTIONSPAGE_H diff --git a/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.ui b/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.ui index 4645bd14a..23d05c2a0 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.ui +++ b/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.ui @@ -6,7 +6,7 @@ 0 0 - 589 + 570 453 @@ -19,531 +19,364 @@ Form - - - - 10 - 10 - 551 - 81 - + + + QLayout::SetMinimumSize - - Sound Collection - - - - - 10 - 20 - 531 - 51 - - - - - 6 + + + + QLayout::SetFixedSize - - - - Language + + + + + 0 + 0 + - - - - - - true + + Sound Collection - - - 75 - 23 - - - - - - - - - 147 - 0 - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> + + + + + true + + + + 75 + 23 + + + + + 550 + 16777215 + + + + + + + + + 0 + 0 + + + + Language + + + + + + + + 147 + 0 + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Select the sound collection</span></p></body></html> + + + + + + + + + + + + + + + + + DataObject + + + + + + + + 0 + 0 + + + + + + + + ObjectField + + + + + + + + 0 + 0 + - - - - - - 10 - 220 - 551 - 211 - - - - Sound Notifications - - - - - 10 - 180 - 531 - 26 - - - + + + + + Qt::Horizontal + + + + + + + + - + + + + 0 + 0 + + - Enable Sounds + Sound1: - - - Qt::Horizontal + + + + 0 + 0 + - + - 138 - 20 + 110 + 0 - - - - - - Play - - - - :/notify/images/play.png:/notify/images/play.png - - - - - - - Qt::Horizontal - - + - 40 - 20 + 16777215 + 16777215 - + - - - Qt::Horizontal + + + + 0 + 0 + - + + Sound2: + + + + + + + + 0 + 0 + + + - 40 - 20 + 110 + 0 - - - - - - Add - - - - :/notify/images/add.png:/notify/images/add.png + + + 16777215 + 16777215 + - - - Modify + + + + 0 + 0 + - - - :/notify/images/modify.png:/notify/images/modify.png + + Sound3: - - - Delete + + + + 0 + 0 + - - - :/utils/images/removesubmitfield.png:/utils/images/removesubmitfield.png + + + 110 + 0 + + + + + 16777215 + 16777215 + - - - - - 10 - 20 - 531 - 151 - - - - QAbstractItemView::SingleSelection - - - QAbstractItemView::SelectRows - - - 22 - - - 22 - - - - - - - 10 - 100 - 551 - 31 - - - - - - - DataObject - - - - - - - - 0 - 0 - - - - - - - - ObjectField - - - - - - - - 0 - 0 - - - - - - - - - - 7 - 130 - 551 - 20 - - - - Qt::Horizontal - - - - - - 10 - 180 - 551 - 31 - - - - - - - - 0 - 0 - - - - Sound1: - - - - - - - - 0 - 0 - - - - - 110 - 0 - - - - - 16777215 - 16777215 - - - - - - - - Sound2: - - - - - - - - 0 - 0 - - - - - 110 - 0 - - - - - 16777215 - 16777215 - - - - - - - - Sound3: - - - - - - - - 0 - 0 - - - - - 110 - 0 - - - - - 16777215 - 16777215 - - - - - - - - - - 10 - 150 - 551 - 31 - - - - - - - true - - - - 0 - 0 - - - - - 40 - 0 - - - - Value is - - - - - - - - 0 - 0 - - - - - 0 - 0 - - - - - 110 - 16777215 - - + + + + + + + + Sound Notifications + + - - Equal to - + + + QAbstractItemView::SingleSelection + + + QAbstractItemView::SelectRows + + + 22 + + + 22 + + - - Greater than - + + + + + Enable Sounds + + + + + + + Qt::Horizontal + + + + 138 + 20 + + + + + + + + Play + + + + :/notify/images/play.png:/notify/images/play.png + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Add + + + + :/notify/images/add.png:/notify/images/add.png + + + + + + + Modify + + + + :/notify/images/modify.png:/notify/images/modify.png + + + + + + + Delete + + + + :/utils/images/removesubmitfield.png:/utils/images/removesubmitfield.png + + + + - - - Less than - - - - - - - - - 0 - 0 - - - - - 0 - 0 - - - - - 170 - 16777215 - - - - 2 - - - 9999.899999999999636 - - - 1.000000000000000 - - - - - - - - 0 - 0 - - - - Say Order - - - - - - - - 0 - 0 - - - - - 110 - 16777215 - - - - Select if the value of the object should be spoken and if so, either before the configured sound or after it. - - - - Never - - - - - Before first - - - - - After first - - - - - After second - - - - - After third - - - - - - + + + + diff --git a/ground/openpilotgcs/src/plugins/notify/notifytablemodel.cpp b/ground/openpilotgcs/src/plugins/notify/notifytablemodel.cpp index 0c2337437..138af106b 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifytablemodel.cpp +++ b/ground/openpilotgcs/src/plugins/notify/notifytablemodel.cpp @@ -162,9 +162,13 @@ void NotifyTableModel::entryUpdated(int offset) emit dataChanged(idx, idx); } -void NotifyTableModel::entryAdded(int position) +void NotifyTableModel::entryAdded(NotificationItem* item) { - insertRows(position, 1,QModelIndex()); + insertRows(rowCount(), 1, QModelIndex()); + NotificationItem* tmp = _list.at(rowCount() - 1); + _list.replace(rowCount() - 1, item); + delete tmp; + entryUpdated(rowCount() - 1); } diff --git a/ground/openpilotgcs/src/plugins/notify/notifytablemodel.h b/ground/openpilotgcs/src/plugins/notify/notifytablemodel.h index f58cc0599..3168a848f 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifytablemodel.h +++ b/ground/openpilotgcs/src/plugins/notify/notifytablemodel.h @@ -86,12 +86,13 @@ public: bool insertRows(int position, int rows, const QModelIndex &index); bool removeRows(int position, int rows, const QModelIndex &index); + void entryAdded(NotificationItem* item); + signals: void dragRows(int position, int count); private slots: void entryUpdated(int offset); - void entryAdded(int position); void dropRows(int position, int count) const; private: From 6a5589ef5101bef3d7e37a37aad32925adea66e4 Mon Sep 17 00:00:00 2001 From: Nickolay Date: Tue, 4 Oct 2011 01:59:37 +0300 Subject: [PATCH 008/121] +multiple selection with D&D completed; +support of enum and range for value completed; --- .../src/plugins/notify/NotificationItem.h | 35 +- .../src/plugins/notify/notificationitem.cpp | 299 +++++----- .../src/plugins/notify/notifyitemdelegate.cpp | 15 +- .../src/plugins/notify/notifyitemdelegate.h | 24 +- .../src/plugins/notify/notifyplugin.cpp | 62 +- .../src/plugins/notify/notifyplugin.h | 88 +-- .../notify/notifypluginoptionspage.cpp | 539 +++++++++--------- .../plugins/notify/notifypluginoptionspage.h | 136 +++-- .../plugins/notify/notifypluginoptionspage.ui | 2 +- .../src/plugins/notify/notifytablemodel.cpp | 102 ++-- .../src/plugins/notify/notifytablemodel.h | 80 ++- 11 files changed, 699 insertions(+), 683 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/notify/NotificationItem.h b/ground/openpilotgcs/src/plugins/notify/NotificationItem.h index 20de7a4f8..1898f1a55 100644 --- a/ground/openpilotgcs/src/plugins/notify/NotificationItem.h +++ b/ground/openpilotgcs/src/plugins/notify/NotificationItem.h @@ -103,7 +103,31 @@ public: void seriaize(QDataStream& stream); void deseriaize(QDataStream& stream); - QString parseNotifyMessage(); + /** + * Convert notification item fields in single string, + * to show in table for example + * + * @return string which describe notification + */ + QString toString(); + + /** + * Generate list of sound files needed to play notification + * + * @return success - reference to non-empty _messageSequence; + * error - if one of sounds doesn't exist returns + * reference to empty _messageSequence; + */ + QStringList& toSoundList(); + + /** + * Returns sound caption name, needed to create string representation of notification. + * + * @return success - string == , if sound file exists + * error - string == [missind], if sound file doesn't exist + */ + QString getSoundCaption(QString fileName); + QTimer* getTimer() const { return _timer; } void startTimer(int value); @@ -119,10 +143,14 @@ public: bool isNowPlaying; bool firstStart; -private: - void checkSoundFilesExisting(bool& missed1, bool& missed2, bool& missed3); + static QStringList sayOrderValues; + static QStringList retryValues; private: + QString checkSoundExists(QString fileName); + +private: + QTimer* _timer; //! time from putting notification in queue till moment when notification became out-of-date @@ -130,6 +158,7 @@ private: //! according to its priority QTimer* _expireTimer; + //! list of wav files from which notification consists QStringList _messageSequence; //! path to folder with sound files diff --git a/ground/openpilotgcs/src/plugins/notify/notificationitem.cpp b/ground/openpilotgcs/src/plugins/notify/notificationitem.cpp index d6c803b68..1b0e634a6 100644 --- a/ground/openpilotgcs/src/plugins/notify/notificationitem.cpp +++ b/ground/openpilotgcs/src/plugins/notify/notificationitem.cpp @@ -40,10 +40,28 @@ #include "notifylogging.h" +static const QString cStrNever("Never"); +static const QString cStrBefore1st("Before first"); +static const QString cStrBefore2nd("Before second"); +static const QString cStrAfter2nd("After second"); + +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"); +static const QString cStrRetry1min("Repeat 1 minute"); + + +QStringList NotificationItem::sayOrderValues; +QStringList NotificationItem::retryValues; + + NotificationItem::NotificationItem(QObject *parent) : QObject(parent) , isNowPlaying(0) , firstStart(true) + , _timer(NULL) + , _expireTimer(NULL) , _soundCollectionPath("") , _currentLanguage("default") , _dataObject("") @@ -52,16 +70,23 @@ NotificationItem::NotificationItem(QObject *parent) , _sound1("") , _sound2("") , _sound3("") - , _sayOrder("Never") + , _sayOrder(cStrNever) , _singleValue(0) , _valueRange2(0) - , _repeatString("Repeat Instantly") + , _repeatString(cStrRetryInstantly) , _expireTimeout(eDefaultTimeout) , _mute(false) - { - _timer = NULL; - _expireTimer = NULL; + NotificationItem::sayOrderValues.append(cStrBefore1st); + NotificationItem::sayOrderValues.append(cStrBefore2nd); + NotificationItem::sayOrderValues.append(cStrAfter2nd); + + NotificationItem::retryValues.append(cStrRetryOnce); + NotificationItem::retryValues.append(cStrRetryInstantly); + NotificationItem::retryValues.append(cStrRetry10sec); + NotificationItem::retryValues.append(cStrRetry30sec); + NotificationItem::retryValues.append(cStrRetry1min); + } void NotificationItem::copyTo(NotificationItem* that) const @@ -103,7 +128,6 @@ void NotificationItem::saveState(QSettings* settings) const settings->setValue(QLatin1String("Repeat"), retryString()); settings->setValue(QLatin1String("ExpireTimeout"), lifetime()); settings->setValue(QLatin1String("Mute"), mute()); - } void NotificationItem::restoreState(QSettings* settings) @@ -123,7 +147,6 @@ void NotificationItem::restoreState(QSettings* settings) setRetryString(settings->value(QLatin1String("Repeat"), tr("")).toString()); setLifetime(settings->value(QLatin1String("ExpireTimeout"), tr("")).toInt()); setMute(settings->value(QLatin1String("Mute"), tr("")).toInt()); - } void NotificationItem::seriaize(QDataStream& stream) @@ -162,7 +185,8 @@ void NotificationItem::deseriaize(QDataStream& stream) stream >> this->_mute; } -void NotificationItem::startTimer(int value) { +void NotificationItem::startTimer(int value) +{ if (!_timer) { _timer = new QTimer(this); _timer->setInterval(value); @@ -171,14 +195,16 @@ void NotificationItem::startTimer(int value) { _timer->start(); } -void NotificationItem::stopTimer() { +void NotificationItem::stopTimer() +{ if (_timer) { if (_timer->isActive()) _timer->stop(); } } -void NotificationItem::disposeTimer() { +void NotificationItem::disposeTimer() +{ if (_timer) { _timer->stop(); delete _timer; @@ -186,22 +212,24 @@ void NotificationItem::disposeTimer() { } } -void NotificationItem::startExpireTimer() { - if (!_expireTimer) - { +void NotificationItem::startExpireTimer() +{ + if (!_expireTimer) { _expireTimer = new QTimer(this); } _expireTimer->start(_expireTimeout * 1000); } -void NotificationItem::stopExpireTimer() { +void NotificationItem::stopExpireTimer() +{ if (_expireTimer) { if (_expireTimer) _expireTimer->stop(); } } -void NotificationItem::disposeExpireTimer() { +void NotificationItem::disposeExpireTimer() +{ if (_expireTimer) { _expireTimer->stop(); delete _expireTimer; @@ -209,91 +237,33 @@ void NotificationItem::disposeExpireTimer() { } } -#define missed "missed sound" -#define CHECK_ADD_SOUND(n) ((!_missedSound##n) ? getSound##n() : (missed#n)) -#define CHECK_REPLACE_SOUND(n) ((!_missedSound##n) ? str.replace(missed#n, getSound##n()) : (missed#n)) - -QString NotificationItem::parseNotifyMessage() +int getValuePosition(QString sayOrder) { - // tips: - // check of *.wav files exist needed for playing phonon queues; - // if phonon player don't find next file in queue, it buzz + return NotificationItem::sayOrderValues.indexOf(sayOrder); +} - QString str; - QString value; - QString sayOrder = getSayOrder(); - UAVObjectField* field = getUAVObjectField(); - if (UAVObjectField::ENUM == field->getType()) { - Q_ASSERT(singleValue() < field->getOptions().size()); - value = QString("%L1").arg(field->getOptions().at(singleValue())); - } else { - value = QString("%L1").arg(singleValue()); +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; +} - int position = -1; // default don't play value wav file - - // generate queue of sound files to play - _messageSequence.clear(); - - bool _missedSound1 = false; - bool _missedSound2 = false; - bool _missedSound3 = false; - - checkSoundFilesExisting(_missedSound1, _missedSound2, _missedSound3); - str = CHECK_ADD_SOUND(1)+" "+CHECK_ADD_SOUND(2)+" "+CHECK_ADD_SOUND(3); - - if(!_messageSequence.size()) { - qNotifyDebug() << "no any files in message queue"; - } - - sayOrder = sayOrder.trimmed(); - switch(sayOrder.at(0).toUpper().toAscii()) - { - case 'B'://BEFORE: - CHECK_REPLACE_SOUND(1); - CHECK_REPLACE_SOUND(2); - CHECK_REPLACE_SOUND(3); - str.prepend(value + " "); - position = 0; - break; - - case 'A'://AFTER: - switch(sayOrder.at(6).toLower().toAscii()) - { - case 'f': - str = CHECK_ADD_SOUND(1)+" "+value+" "+CHECK_ADD_SOUND(2)+" "+CHECK_ADD_SOUND(3); - position = 1; - break; - - case 's': - str = CHECK_ADD_SOUND(1)+" "+CHECK_ADD_SOUND(2)+" "+value+" "+CHECK_ADD_SOUND(3); - position = 2; - break; - - case 't': - CHECK_REPLACE_SOUND(1); - CHECK_REPLACE_SOUND(2); - CHECK_REPLACE_SOUND(3); - str.append(" "+value); - position = 3; - break; - } - break; - - default: - CHECK_REPLACE_SOUND(1); - CHECK_REPLACE_SOUND(2); - CHECK_REPLACE_SOUND(3); - break; - } - - if(-1 == position) { - qNotifyDebug() << "NotificationItem::parseNotifyMessage() | value position undefined"; - return str; - } - - if (UAVObjectField::ENUM == field->getType()) return str; - +QStringList valueToSoundList(QString value) +{ + // replace point chr if exists + value = value.replace(',', '.'); QStringList numberParts = value.trimmed().split("."); QStringList digitWavs; @@ -338,23 +308,100 @@ QString NotificationItem::parseNotifyMessage() digitWavs.append(numberParts.at(1).right(1)); } } - foreach(QString fileName, digitWavs) { - fileName+=".wav"; - QString filePath = QDir::toNativeSeparators(getSoundCollectionPath()+"/"+ getCurrentLanguage()+"/"+fileName); - if(QFile::exists(filePath)) - _messageSequence.insert(position++,QDir::toNativeSeparators(getSoundCollectionPath()+ "/"+getCurrentLanguage()+"/"+fileName)); - else { - if(QFile::exists(QDir::toNativeSeparators(getSoundCollectionPath()+"/default/"+fileName))) - _messageSequence.insert(position++,QDir::toNativeSeparators(getSoundCollectionPath()+"/default/"+fileName)); - else { - _messageSequence.clear(); - break; // if no some of *.wav files, then don't play number! - } + return digitWavs; +} + +QString NotificationItem::toString() +{ + QString str; + QString value; + UAVObjectField* field = getUAVObjectField(); + if (UAVObjectField::ENUM == field->getType()) { + Q_ASSERT(singleValue() < field->getOptions().size()); + value = field->getOptions().at(singleValue()); + } else { + value = QString("%L1").arg(singleValue()); + } + + int pos = getValuePosition(getSayOrder().trimmed()); + 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 + + QString value; + UAVObjectField* field = getUAVObjectField(); + if (UAVObjectField::ENUM == field->getType()) { + Q_ASSERT(singleValue() < field->getOptions().size()); + value = field->getOptions().at(singleValue()); + } else { + value = QString("%L1").arg(singleValue()); + } + + // generate queue of sound files to play + _messageSequence.clear(); + int pos = getValuePosition(getSayOrder().trimmed()); + 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()); } @@ -362,39 +409,3 @@ UAVObjectField* NotificationItem::getUAVObjectField() { UAVDataObject* NotificationItem::getUAVObject() { return dynamic_cast((ExtensionSystem::PluginManager::instance()->getObject())->getObject(getDataObject())); } - - -void NotificationItem::checkSoundFilesExisting(bool& missed1, bool& missed2, bool& missed3) -{ - - if(QFile::exists(QDir::toNativeSeparators(getSoundCollectionPath() + "/" + getCurrentLanguage()+"/"+getSound1()+".wav"))) - _messageSequence.append(QDir::toNativeSeparators(getSoundCollectionPath() + "/" + getCurrentLanguage()+"/"+getSound1()+".wav")); - else { - if(QFile::exists(QDir::toNativeSeparators(getSoundCollectionPath() + "/default/"+getSound1()+".wav"))) - _messageSequence.append(QDir::toNativeSeparators(getSoundCollectionPath() + "/default/"+getSound1()+".wav")); - else - missed1 = true; - } - - if(getSound2().size()) { - if(QFile::exists(QDir::toNativeSeparators(getSoundCollectionPath() + "/" + getCurrentLanguage()+"/"+getSound2()+".wav"))) - _messageSequence.append(QDir::toNativeSeparators(getSoundCollectionPath() + "/" + getCurrentLanguage()+"/"+getSound2()+".wav")); - else { - if(QFile::exists(QDir::toNativeSeparators(getSoundCollectionPath() + "/default/"+getSound2()+".wav"))) - _messageSequence.append(QDir::toNativeSeparators(getSoundCollectionPath() + "/default/"+getSound2()+".wav")); - else - missed2 = true; - } - } - - if(getSound3().size()) { - if(QFile::exists(QDir::toNativeSeparators(getSoundCollectionPath()+ "/" + getCurrentLanguage()+"/"+getSound3()+".wav"))) - _messageSequence.append(QDir::toNativeSeparators(getSoundCollectionPath()+ "/" + getCurrentLanguage()+"/"+getSound3()+".wav")); - else { - if(QFile::exists(QDir::toNativeSeparators(getSoundCollectionPath()+"/default/"+getSound3()+".wav"))) - _messageSequence.append(QDir::toNativeSeparators(getSoundCollectionPath()+"/default/"+getSound3()+".wav")); - else - missed3 = true; - } - } -} diff --git a/ground/openpilotgcs/src/plugins/notify/notifyitemdelegate.cpp b/ground/openpilotgcs/src/plugins/notify/notifyitemdelegate.cpp index d418f0d26..da7177b35 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifyitemdelegate.cpp +++ b/ground/openpilotgcs/src/plugins/notify/notifyitemdelegate.cpp @@ -29,34 +29,29 @@ #include "notifyitemdelegate.h" #include "notifytablemodel.h" #include "notifylogging.h" +#include "notificationitem.h" NotifyItemDelegate::NotifyItemDelegate(QObject* parent) : QItemDelegate(parent) , _parent(parent) { - _titles << "Repeat Once" - << "Repeat Instantly" - << "Repeat 10 seconds" - << "Repeat 30 seconds" - << "Repeat 1 minute"; - } QWidget *NotifyItemDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem& /*none*/, const QModelIndex& index) const { - if (eREPEAT_VALUE == index.column()) { + if (eRepeatValue == index.column()) { QComboBox* editor = new QComboBox(parent); editor->clear(); - editor->addItems(_titles); + editor->addItems(NotificationItem::retryValues); return editor; } else { - if (eEXPIRE_TIME == index.column()) { + if (eExpireTimer == index.column()) { QSpinBox* editor = new QSpinBox(parent); connect(editor, SIGNAL(editingFinished()), this, SLOT(commitAndCloseEditor())); return editor; } else { - if (eENABLE_NOTIFICATION == index.column()) { + if (eTurnOn == index.column()) { QCheckBox* editor = new QCheckBox(parent); connect(editor, SIGNAL(editingFinished()), this, SLOT(commitAndCloseEditor())); return editor; diff --git a/ground/openpilotgcs/src/plugins/notify/notifyitemdelegate.h b/ground/openpilotgcs/src/plugins/notify/notifyitemdelegate.h index 494e61c17..ace6d4976 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifyitemdelegate.h +++ b/ground/openpilotgcs/src/plugins/notify/notifyitemdelegate.h @@ -34,25 +34,23 @@ class NotifyItemDelegate : public QItemDelegate { - Q_OBJECT + Q_OBJECT public: - NotifyItemDelegate(QObject *parent = 0); - QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &, - const QModelIndex &index) const; - void setEditorData(QWidget *editor, const QModelIndex &index) const; - void setModelData(QWidget *editor, QAbstractItemModel *model, - const QModelIndex &index) const; - QSize sizeHint ( const QStyleOptionViewItem & option, const QModelIndex & index ) const; + NotifyItemDelegate(QObject *parent = 0); + QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &, + const QModelIndex &index) const; + void setEditorData(QWidget *editor, const QModelIndex &index) const; + void setModelData(QWidget *editor, QAbstractItemModel *model, + const QModelIndex &index) const; + QSize sizeHint ( const QStyleOptionViewItem & option, const QModelIndex & index ) const; private slots: - void selectRow(const QString & text); - void commitAndCloseEditor(); + void selectRow(const QString & text); + void commitAndCloseEditor(); private: - QObject* _parent; - QStringList _titles; - + QObject* _parent; }; #endif // NOTIFYITEMDELEGATE_H diff --git a/ground/openpilotgcs/src/plugins/notify/notifyplugin.cpp b/ground/openpilotgcs/src/plugins/notify/notifyplugin.cpp index fa55cfc42..88cb23621 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifyplugin.cpp +++ b/ground/openpilotgcs/src/plugins/notify/notifyplugin.cpp @@ -49,7 +49,6 @@ SoundNotifyPlugin::SoundNotifyPlugin() { phonon.mo = NULL; configured = false; - // Do nothing } SoundNotifyPlugin::~SoundNotifyPlugin() @@ -57,7 +56,6 @@ SoundNotifyPlugin::~SoundNotifyPlugin() Core::ICore::instance()->saveSettings(this); if (phonon.mo != NULL) delete phonon.mo; - // Do nothing } bool SoundNotifyPlugin::initialize(const QStringList& args, QString *errMsg) @@ -99,8 +97,8 @@ void SoundNotifyPlugin::saveConfig( QSettings* settings, UAVConfigInfo *configIn settings->beginWriteArray("listNotifies"); for (int i = 0; i < lstNotifications.size(); i++) { - settings->setArrayIndex(i); - lstNotifications.at(i)->saveState(settings); + settings->setArrayIndex(i); + lstNotifications.at(i)->saveState(settings); } settings->endArray(); settings->setValue(QLatin1String("EnableSound"), enableSound); @@ -147,10 +145,10 @@ void SoundNotifyPlugin::readConfig_0_0_0(){ // read list of notifications from settings int size = settings->beginReadArray("listNotifies"); for (int i = 0; i < size; ++i) { - settings->setArrayIndex(i); - NotificationItem* notification = new NotificationItem; - notification->restoreState(settings); - lstNotifications.append(notification); + settings->setArrayIndex(i); + NotificationItem* notification = new NotificationItem; + notification->restoreState(settings); + lstNotifications.append(notification); } settings->endArray(); setEnableSound(settings->value(QLatin1String("EnableSound"),0).toBool()); @@ -237,14 +235,17 @@ void SoundNotifyPlugin::connectNotifications() notify->firstStart=true; notify->isNowPlaying=false; + if(notify->mute()) continue; + UAVDataObject* obj = dynamic_cast( objManager->getObject(notify->getDataObject()) ); if (obj != NULL ) { if (!lstNotifiedUAVObjects.contains(obj)) { - lstNotifiedUAVObjects.append(obj); - connect(obj, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(appendNotification(UAVObject*))); + lstNotifiedUAVObjects.append(obj); + connect(obj, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(appendNotification(UAVObject*))); } - } else - std::cout << "Error: Object is unknown (" << notify->getDataObject().toStdString() << ")." << std::endl; + } else { + qNotifyDebug() << "Error: Object is unknown (" << notify->getDataObject() << ")."; + } } if (lstNotifications.isEmpty()) return; @@ -294,7 +295,7 @@ void SoundNotifyPlugin::checkNotificationRule(NotificationItem* notification, UA fieldName = notification->getObjectField(); UAVObjectField* field = object->getField(fieldName); - if (field->getName() == "") + if (field->getName().isEmpty()) return; double value = field->getDouble(); @@ -321,13 +322,11 @@ void SoundNotifyPlugin::checkNotificationRule(NotificationItem* notification, UA if (!condition) return; - if (!playNotification(notification)) - { - if (!pendingNotifications.contains(notification)) - { + if (!playNotification(notification)) { + if (!pendingNotifications.contains(notification)) { notification->stopTimer(); - qNotifyDebug() << "add to pending list - " << notification->parseNotifyMessage(); + qNotifyDebug() << "add to pending list - " << notification->toString(); // if audio is busy, start expiration timer //ms = (notification->getExpiredTimeout()[in sec])*1000 //QxtTimer::singleShot(notification->getExpireTimeout()*1000, this, SLOT(expirationTimerHandler(NotificationItem*)), qVariantFromValue(notification)); @@ -344,8 +343,8 @@ bool SoundNotifyPlugin::playNotification(NotificationItem* notification) if (phonon.mo == NULL) return false; - if (!notification->mute()) - return true; + if (notification->mute()) + return false; qNotifyDebug() << "Phonon State: " << phonon.mo->state(); if ((phonon.mo->state()==Phonon::PausedState) @@ -375,9 +374,8 @@ bool SoundNotifyPlugin::playNotification(NotificationItem* notification) } notification->firstStart=false; phonon.mo->clear(); - QString str = notification->parseNotifyMessage(); - qNotifyDebug() << "play notification - " << str; - foreach (QString item, notification->getMessageSequence()) { + qNotifyDebug() << "play notification - " << notification->toString(); + foreach (QString item, notification->toSoundList()) { Phonon::MediaSource *ms = new Phonon::MediaSource(item); ms->setAutoDelete(true); phonon.mo->enqueue(*ms); @@ -393,15 +391,15 @@ bool SoundNotifyPlugin::playNotification(NotificationItem* notification) void SoundNotifyPlugin::repeatTimerHandler() { - NotificationItem* notification = static_cast(sender()->parent()); + NotificationItem* notification = static_cast(sender()->parent()); - qNotifyDebug() << "repeatTimerHandler - " << notification->parseNotifyMessage(); + qNotifyDebug() << "repeatTimerHandler - " << notification->toString(); - ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); - UAVObjectManager *objManager = pm->getObject(); - UAVObject* object = objManager->getObject(notification->getDataObject()); - if (object) - checkNotificationRule(notification,object); + ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); + UAVObjectManager *objManager = pm->getObject(); + UAVObject* object = objManager->getObject(notification->getDataObject()); + if (object) + checkNotificationRule(notification,object); } void SoundNotifyPlugin::expireTimerHandler() @@ -411,7 +409,7 @@ void SoundNotifyPlugin::expireTimerHandler() notification->stopExpireTimer(); if (!pendingNotifications.isEmpty()) { - qNotifyDebug() << "expireTimerHandler - " << notification->parseNotifyMessage(); + qNotifyDebug() << "expireTimerHandler - " << notification->toString(); pendingNotifications.removeOne(notification); } } @@ -438,7 +436,7 @@ void SoundNotifyPlugin::stateChanged(Phonon::State newstate, Phonon::State oldst if (!pendingNotifications.isEmpty()) { NotificationItem* notification = pendingNotifications.takeFirst(); - qNotifyDebug() << "play audioFree - " << notification->parseNotifyMessage(); + qNotifyDebug() << "play audioFree - " << notification->toString(); playNotification(notification); } } else { diff --git a/ground/openpilotgcs/src/plugins/notify/notifyplugin.h b/ground/openpilotgcs/src/plugins/notify/notifyplugin.h index 1d9475469..0b7a31f3b 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifyplugin.h +++ b/ground/openpilotgcs/src/plugins/notify/notifyplugin.h @@ -50,65 +50,65 @@ typedef struct { class SoundNotifyPlugin : public Core::IConfigurablePlugin -{ - Q_OBJECT -public: - SoundNotifyPlugin(); - ~SoundNotifyPlugin(); +{ + Q_OBJECT +public: + SoundNotifyPlugin(); + ~SoundNotifyPlugin(); - void extensionsInitialized(); - bool initialize(const QStringList & arguments, QString * errorString); - void readConfig( QSettings* qSettings, Core::UAVConfigInfo *configInfo); - void saveConfig( QSettings* qSettings, Core::UAVConfigInfo *configInfo); - void shutdown(); + void extensionsInitialized(); + bool initialize(const QStringList & arguments, QString * errorString); + void readConfig( QSettings* qSettings, Core::UAVConfigInfo *configInfo); + void saveConfig( QSettings* qSettings, Core::UAVConfigInfo *configInfo); + void shutdown(); - QList getListNotifications() { return lstNotifications; } - NotificationItem* getCurrentNotification(){ return ¤tNotification;} + QList getListNotifications() { return lstNotifications; } + NotificationItem* getCurrentNotification(){ return ¤tNotification;} - bool getEnableSound() const { return enableSound; } - void setEnableSound(bool value) {enableSound = value; } + bool getEnableSound() const { return enableSound; } + void setEnableSound(bool value) {enableSound = value; } private: - SoundNotifyPlugin(const SoundNotifyPlugin& rhs); - SoundNotifyPlugin& operator= (const SoundNotifyPlugin& rhs); + Q_DISABLE_COPY(SoundNotifyPlugin) - bool playNotification(NotificationItem* notification); - void checkNotificationRule(NotificationItem* notification, UAVObject* object); - void readConfig_0_0_0(); + bool playNotification(NotificationItem* notification); + void checkNotificationRule(NotificationItem* notification, UAVObject* object); + void readConfig_0_0_0(); private slots: - void onTelemetryManagerAdded(QObject* obj); - void onAutopilotDisconnect(); - void connectNotifications(); - void updateNotificationList(QList list); - void resetNotification(void); - void appendNotification(UAVObject *object); - void repeatTimerHandler(void); - void expireTimerHandler(void); - void stateChanged(Phonon::State newstate, Phonon::State oldstate); + + void onTelemetryManagerAdded(QObject* obj); + void onAutopilotDisconnect(); + void connectNotifications(); + void updateNotificationList(QList list); + void resetNotification(void); + void appendNotification(UAVObject *object); + void repeatTimerHandler(void); + void expireTimerHandler(void); + void stateChanged(Phonon::State newstate, Phonon::State oldstate); private: - bool configured; // just for migration,delete later - bool enableSound; - QList< QList* > lstMediaSource; - QStringList mediaSource; - QMultiMap mapMediaObjects; - QSettings* settings; + bool configured; // just for migration,delete later + bool enableSound; + QList< QList* > lstMediaSource; + QStringList mediaSource; + QMultiMap mapMediaObjects; + QSettings* settings; - QList lstNotifiedUAVObjects; - QList lstNotifications; - QList pendingNotifications; - QList removedNotifies; + QList lstNotifiedUAVObjects; + QList lstNotifications; + QList pendingNotifications; + QList removedNotifies; - NotificationItem currentNotification; - NotificationItem* nowPlayingConfiguration; + NotificationItem currentNotification; + NotificationItem* nowPlayingConfiguration; - QString m_field; - PhononObject phonon; - NotifyPluginOptionsPage *mop; - TelemetryManager* telMngr; + QString m_field; + PhononObject phonon; + NotifyPluginOptionsPage *mop; + TelemetryManager* telMngr; }; #endif // SOUNDNOTIFYPLUGIN_H diff --git a/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.cpp b/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.cpp index 305e5e13e..fdf0f5cc9 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.cpp +++ b/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.cpp @@ -47,72 +47,61 @@ #include "notifytablemodel.h" #include "notifylogging.h" - -static const char* cStrBefore1st = "Before first"; -static const char* cStrBefore2nd = "Before second"; -static const char* cStrAfter2nd = "After second"; - static const char* cStrEqualTo = "Equal to"; static const char* cStrLargeThan = "Large than"; static const char* cStrLowerThan = "Lower than"; static const char* cStrInRange = "In range"; -//----------------------------------------------------------------------------- -NotifyPluginOptionsPage::NotifyPluginOptionsPage(/*NotificationItem *config,*/ QObject *parent) +NotifyPluginOptionsPage::NotifyPluginOptionsPage(QObject *parent) : IOptionsPage(parent) - , objManager(*ExtensionSystem::PluginManager::instance()->getObject()) - , owner(qobject_cast(parent)) - , currentCollectionPath("") + , _objManager(*ExtensionSystem::PluginManager::instance()->getObject()) + , _owner(qobject_cast(parent)) + , _currentCollectionPath("") , _valueRange(NULL) , _sayOrder(NULL) , _fieldValue(NULL) , _fieldType(-1) , _form(NULL) -{ -} + , _selectedNotification(NULL) +{} -//----------------------------------------------------------------------------- NotifyPluginOptionsPage::~NotifyPluginOptionsPage() -{ -} +{} -//creates options page widget (uses the UI file) - -//----------------------------------------------------------------------------- QWidget *NotifyPluginOptionsPage::createPage(QWidget *parent) { - options_page.reset(new Ui::NotifyPluginOptionsPage()); + _optionsPage.reset(new Ui::NotifyPluginOptionsPage()); //main widget QWidget* optionsPageWidget = new QWidget; - //if(!_fieldValue.isNull()) _fieldValue = NULL; _valueRange = NULL; - _fieldType = -1; + resetFieldType(); //save ref to form, needed for binding dynamic fields in future _form = optionsPageWidget; //main layout - options_page->setupUi(optionsPageWidget); + _optionsPage->setupUi(optionsPageWidget); - listSoundFiles.clear(); - - options_page->SoundDirectoryPathChooser->setExpectedKind(Utils::PathChooser::Directory); - options_page->SoundDirectoryPathChooser->setPromptDialogTitle(tr("Choose sound collection directory")); - - connect(options_page->SoundDirectoryPathChooser, SIGNAL(changed(const QString&)), this, SLOT(on_buttonSoundFolder_clicked(const QString&))); - connect(options_page->SoundCollectionList, SIGNAL(currentIndexChanged (int)), this, SLOT(on_soundLanguage_indexChanged(int))); + _listSoundFiles.clear(); + _optionsPage->SoundDirectoryPathChooser->setExpectedKind(Utils::PathChooser::Directory); + _optionsPage->SoundDirectoryPathChooser->setPromptDialogTitle(tr("Choose sound collection directory")); + connect(_optionsPage->SoundDirectoryPathChooser, SIGNAL(changed(const QString&)), + this, SLOT(on_buttonSoundFolder_clicked(const QString&))); + connect(_optionsPage->SoundCollectionList, SIGNAL(currentIndexChanged (int)), + this, SLOT(on_soundLanguage_indexChanged(int))); connect(this, SIGNAL(updateNotifications(QList)), - owner, SLOT(updateNotificationList(QList))); + _owner, SLOT(updateNotificationList(QList))); //connect(this, SIGNAL(resetNotification()),owner, SLOT(resetNotification())); - privListNotifications = owner->getListNotifications(); + _privListNotifications = _owner->getListNotifications(); + // [1] + _selectedNotification = _owner->getCurrentNotification(); addDynamicValueLayout(); - _selectedNotification = owner->getCurrentNotification(); // [2] updateConfigView(_selectedNotification); @@ -120,117 +109,119 @@ QWidget *NotifyPluginOptionsPage::createPage(QWidget *parent) initButtons(); initPhononPlayer(); -// _notifyRulesSelection->setCurrentIndex(_notifyRulesModel->index(0, 0, QModelIndex()), -// QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows); + _notifyRulesSelection->setCurrentIndex(_notifyRulesModel->index(0, 0, QModelIndex()), + QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows); return optionsPageWidget; } -//----------------------------------------------------------------------------- void NotifyPluginOptionsPage::apply() { - getOptionsPageValues(owner->getCurrentNotification()); - owner->setEnableSound(options_page->chkEnableSound->isChecked()); - emit updateNotifications(privListNotifications); + getOptionsPageValues(_owner->getCurrentNotification()); + _owner->setEnableSound(_optionsPage->chkEnableSound->isChecked()); + emit updateNotifications(_privListNotifications); } void NotifyPluginOptionsPage::finish() { + disconnect(_optionsPage->UAVObjectField, SIGNAL(currentIndexChanged(QString)), + this, SLOT(on_UAVField_indexChanged(QString))); - disconnect(options_page->UAVObjectField, SIGNAL(currentIndexChanged(QString)), this, SLOT(onUAVField_indexChanged(QString))); - - disconnect(notifySound.data(),SIGNAL(stateChanged(Phonon::State,Phonon::State)), - this,SLOT(changeButtonText(Phonon::State,Phonon::State))); - if (notifySound) { - notifySound->stop(); - notifySound->clear(); + disconnect(_notifySound.data(),SIGNAL(stateChanged(Phonon::State,Phonon::State)), + this,SLOT(on_changeButtonText(Phonon::State,Phonon::State))); + if (_notifySound) { + _notifySound->stop(); + _notifySound->clear(); } } -//----------------------------------------------------------------------------- void NotifyPluginOptionsPage::addDynamicValueLayout() { - NotificationItem* curr = owner->getCurrentNotification(); + NotificationItem* curr = _owner->getCurrentNotification(); Q_ASSERT(curr); - options_page->dynamicValueLayout->addWidget(new QLabel("Say order ", _form)); + _optionsPage->dynamicValueLayout->addWidget(new QLabel("Say order ", _form)); _sayOrder = new QComboBox(_form); - options_page->dynamicValueLayout->addWidget(_sayOrder); - QStringList sayOrderValues; - sayOrderValues << cStrBefore1st << cStrBefore2nd << cStrAfter2nd; - _sayOrder->addItems(sayOrderValues); + _optionsPage->dynamicValueLayout->addWidget(_sayOrder); + _sayOrder->addItems(NotificationItem::sayOrderValues); - options_page->dynamicValueLayout->addWidget(new QLabel("Value is ", _form)); + _optionsPage->dynamicValueLayout->addWidget(new QLabel("Value is ", _form)); - UAVDataObject* obj = dynamic_cast(objManager.getObject(curr->getDataObject())); + UAVDataObject* obj = dynamic_cast(_objManager.getObject(curr->getDataObject())); UAVObjectField* field = obj->getField(curr->getObjectField()); Q_ASSERT(obj); Q_ASSERT(field); _valueRange = new QComboBox(_form); - options_page->dynamicValueLayout->addWidget(_valueRange); + _optionsPage->dynamicValueLayout->addWidget(_valueRange); addDynamicField(field); } -//----------------------------------------------------------------------------- void NotifyPluginOptionsPage::resetValueRange() { - _fieldValue = new QLineEdit(_form); (static_cast(_fieldValue))->setInputMask("999.99 - 999.99;"); (static_cast(_fieldValue))->setText("0000000000"); (static_cast(_fieldValue))->setCursorPosition(0); } -//----------------------------------------------------------------------------- void NotifyPluginOptionsPage::on_rangeValue_indexChanged(QString rangeStr) { Q_ASSERT(_fieldValue); - if(rangeStr == cStrInRange) { - Q_ASSERT(_fieldValue); - options_page->dynamicValueLayout->removeWidget(_fieldValue); - resetValueRange(); - options_page->dynamicValueLayout->addWidget(_fieldValue); - - // _fieldType = -1; - // addDynamicField(field); - } + UAVObjectField* field = getObjectFieldFromPage(); + Q_ASSERT(!!field); + setDynamicValueWidget(field); + setDynamicValueField(_selectedNotification); +} + +void NotifyPluginOptionsPage::resetFieldType() +{ + _fieldType = -1; } -//----------------------------------------------------------------------------- void NotifyPluginOptionsPage::addDynamicField(UAVObjectField* objField) { - //qDebugNotify_if(!objField || !parent) << "null input params"; + //qDebugNotify_ if (!objField || !parent) << "null input params"; Q_ASSERT(objField); - if(objField->getType() == _fieldType) { - if(QComboBox* fieldValue = dynamic_cast(_fieldValue)) { + if (objField->getType() == _fieldType) { + if (QComboBox* fieldValue = dynamic_cast(_fieldValue)) { fieldValue->clear(); QStringList enumValues(objField->getOptions()); fieldValue->addItems(enumValues); } return; } - // check if dynamic fileld already settled, - // so if its exists remove it and install new field - if(_fieldValue) - options_page->dynamicValueLayout->removeWidget(_fieldValue); disconnect(_valueRange, SIGNAL(currentIndexChanged(QString)), this, SLOT(on_rangeValue_indexChanged(QString))); _valueRange->clear(); QStringList rangeValues; - if(UAVObjectField::ENUM == objField->getType()) { + if (UAVObjectField::ENUM == objField->getType()) { rangeValues << cStrEqualTo << cStrInRange; _valueRange->addItems(rangeValues); - } - else { + _valueRange->setCurrentIndex(rangeValues.indexOf(_selectedNotification->range())); + + } else { rangeValues << cStrEqualTo << cStrLargeThan << cStrLowerThan << cStrInRange; _valueRange->addItems(rangeValues); connect(_valueRange, SIGNAL(currentIndexChanged(QString)), this, SLOT(on_rangeValue_indexChanged(QString))); } + setDynamicValueWidget(objField); +} +void NotifyPluginOptionsPage::setDynamicValueWidget(UAVObjectField* objField) +{ + Q_ASSERT(_valueRange); + + // check if dynamic fileld already settled, + // so if its exists remove it and install new field + if (_fieldValue) { + _optionsPage->dynamicValueLayout->removeWidget(_fieldValue); + delete _fieldValue; + _fieldValue = NULL; + } _fieldType = objField->getType(); switch(_fieldType) { @@ -243,92 +234,90 @@ void NotifyPluginOptionsPage::addDynamicField(UAVObjectField* objField) break; default: - if(_valueRange->currentText() == cStrInRange) { + if (_valueRange->currentText() == cStrInRange) { + _fieldValue = new QLineEdit(_form); resetValueRange(); } else { _fieldValue = new QSpinBox(_form); } break; }; - options_page->dynamicValueLayout->addWidget(_fieldValue); + _optionsPage->dynamicValueLayout->addWidget(_fieldValue); } -//----------------------------------------------------------------------------- void NotifyPluginOptionsPage::initButtons() { - options_page->chkEnableSound->setChecked(owner->getEnableSound()); - connect(options_page->chkEnableSound, SIGNAL(toggled(bool)), this, SLOT(on_chkEnableSound_toggled(bool))); + _optionsPage->chkEnableSound->setChecked(_owner->getEnableSound()); + connect(_optionsPage->chkEnableSound, SIGNAL(toggled(bool)), + this, SLOT(on_checkEnableSound_toggled(bool))); - options_page->buttonModify->setEnabled(false); - options_page->buttonDelete->setEnabled(false); - options_page->buttonPlayNotification->setEnabled(false); - connect(options_page->buttonAdd, SIGNAL(pressed()), this, SLOT(on_buttonAddNotification_clicked())); - connect(options_page->buttonDelete, SIGNAL(pressed()), this, SLOT(on_buttonDeleteNotification_clicked())); - connect(options_page->buttonModify, SIGNAL(pressed()), this, SLOT(on_buttonModifyNotification_clicked())); - connect(options_page->buttonPlayNotification, SIGNAL(clicked()), this, SLOT(on_buttonTestSoundNotification_clicked())); + _optionsPage->buttonModify->setEnabled(false); + _optionsPage->buttonDelete->setEnabled(false); + _optionsPage->buttonPlayNotification->setEnabled(false); + connect(_optionsPage->buttonAdd, SIGNAL(pressed()), + this, SLOT(on_button_AddNotification_clicked())); + connect(_optionsPage->buttonDelete, SIGNAL(pressed()), + this, SLOT(on_button_DeleteNotification_clicked())); + connect(_optionsPage->buttonModify, SIGNAL(pressed()), + this, SLOT(on_button_ModifyNotification_clicked())); + connect(_optionsPage->buttonPlayNotification, SIGNAL(clicked()), + this, SLOT(on_button_TestSoundNotification_clicked())); } -//----------------------------------------------------------------------------- void NotifyPluginOptionsPage::initPhononPlayer() { - notifySound.reset(Phonon::createPlayer(Phonon::NotificationCategory)); - connect(notifySound.data(),SIGNAL(stateChanged(Phonon::State,Phonon::State)), - this,SLOT(changeButtonText(Phonon::State,Phonon::State))); - connect(notifySound.data(), SIGNAL(finished(void)), this, SLOT(onFinishedPlaying(void))); + _notifySound.reset(Phonon::createPlayer(Phonon::NotificationCategory)); + connect(_notifySound.data(),SIGNAL(stateChanged(Phonon::State,Phonon::State)), + this,SLOT(on_changeButtonText(Phonon::State,Phonon::State))); + connect(_notifySound.data(), SIGNAL(finished(void)), this, SLOT(on_FinishedPlaying(void))); } - -//----------------------------------------------------------------------------- void NotifyPluginOptionsPage::initRulesTable() { qNotifyDebug_if(_notifyRulesModel.isNull()) << "_notifyRulesModel.isNull())"; qNotifyDebug_if(!_notifyRulesSelection) << "_notifyRulesSelection.isNull())"; - //QItemSelectionModel* selection = _notifyRulesSelection.take(); - _notifyRulesModel.reset(new NotifyTableModel(privListNotifications)); + _notifyRulesModel.reset(new NotifyTableModel(_privListNotifications)); _notifyRulesSelection = new QItemSelectionModel(_notifyRulesModel.data()); connect(_notifyRulesSelection, SIGNAL(selectionChanged ( const QItemSelection &, const QItemSelection & )), - this, SLOT(on_tableNotification_changeSelection( const QItemSelection & , const QItemSelection & ))); + this, SLOT(on_table_changeSelection( const QItemSelection & , const QItemSelection & ))); connect(this, SIGNAL(entryUpdated(int)), - _notifyRulesModel.data(), SLOT(entryUpdated(int))); -// connect(this, SIGNAL(entryAdded(int)), -// _notifyRulesModel.data(), SLOT(entryAdded(int))); + _notifyRulesModel.data(), SLOT(entryUpdated(int))); - options_page->notifyRulesView->setModel(_notifyRulesModel.data()); - options_page->notifyRulesView->setSelectionModel(_notifyRulesSelection); - options_page->notifyRulesView->setItemDelegate(new NotifyItemDelegate(this)); + _optionsPage->notifyRulesView->setModel(_notifyRulesModel.data()); + _optionsPage->notifyRulesView->setSelectionModel(_notifyRulesSelection); + _optionsPage->notifyRulesView->setItemDelegate(new NotifyItemDelegate(this)); - options_page->notifyRulesView->resizeRowsToContents(); - options_page->notifyRulesView->setColumnWidth(eMESSAGE_NAME,200); - options_page->notifyRulesView->setColumnWidth(eREPEAT_VALUE,120); - options_page->notifyRulesView->setColumnWidth(eEXPIRE_TIME,100); - options_page->notifyRulesView->setColumnWidth(eENABLE_NOTIFICATION,60); - options_page->notifyRulesView->setDragEnabled(true); - options_page->notifyRulesView->setAcceptDrops(true); - options_page->notifyRulesView->setDropIndicatorShown(true); - options_page->notifyRulesView->setDragDropMode(QAbstractItemView::InternalMove); + _optionsPage->notifyRulesView->resizeRowsToContents(); + _optionsPage->notifyRulesView->setColumnWidth(eMessageName,200); + _optionsPage->notifyRulesView->setColumnWidth(eRepeatValue,120); + _optionsPage->notifyRulesView->setColumnWidth(eExpireTimer,100); + _optionsPage->notifyRulesView->setColumnWidth(eTurnOn,60); + _optionsPage->notifyRulesView->setDragEnabled(true); + _optionsPage->notifyRulesView->setAcceptDrops(true); + _optionsPage->notifyRulesView->setDropIndicatorShown(true); + _optionsPage->notifyRulesView->setDragDropMode(QAbstractItemView::InternalMove); } -//----------------------------------------------------------------------------- void NotifyPluginOptionsPage::getOptionsPageValues(NotificationItem* notification) { Q_ASSERT(notification); - notification->setSoundCollectionPath(options_page->SoundDirectoryPathChooser->path()); - notification->setCurrentLanguage(options_page->SoundCollectionList->currentText()); - notification->setDataObject(options_page->UAVObject->currentText()); - notification->setObjectField(options_page->UAVObjectField->currentText()); - notification->setSound1(options_page->Sound1->currentText()); - notification->setSound2(options_page->Sound2->currentText()); - notification->setSound3(options_page->Sound3->currentText()); + notification->setSoundCollectionPath(_optionsPage->SoundDirectoryPathChooser->path()); + notification->setCurrentLanguage(_optionsPage->SoundCollectionList->currentText()); + notification->setDataObject(_optionsPage->UAVObject->currentText()); + notification->setObjectField(_optionsPage->UAVObjectField->currentText()); + notification->setSound1(_optionsPage->Sound1->currentText()); + notification->setSound2(_optionsPage->Sound2->currentText()); + notification->setSound3(_optionsPage->Sound3->currentText()); notification->setSayOrder(_sayOrder->currentText()); notification->setRange(_valueRange->currentText()); - if(QSpinBox* spinValue = dynamic_cast(_fieldValue)) + if (QSpinBox* spinValue = dynamic_cast(_fieldValue)) notification->setSingleValue(spinValue->value()); else { - if(QComboBox* comboBoxValue = dynamic_cast(_fieldValue)) + if (QComboBox* comboBoxValue = dynamic_cast(_fieldValue)) notification->setSingleValue(comboBoxValue->currentIndex()); else { - if(QLineEdit* rangeValue = dynamic_cast(_fieldValue)) { + if (QLineEdit* rangeValue = dynamic_cast(_fieldValue)) { QString str = rangeValue->text(); QStringList range = str.split('-'); notification->setSingleValue(range.at(0).toDouble()); @@ -338,190 +327,175 @@ void NotifyPluginOptionsPage::getOptionsPageValues(NotificationItem* notificatio } } - -//----------------------------------------------------------------------------- -void NotifyPluginOptionsPage::onUAVField_indexChanged(QString field) { - _fieldType = -1; - UAVDataObject* obj = dynamic_cast( objManager.getObject(options_page->UAVObject->currentText())); +void NotifyPluginOptionsPage::on_UAVField_indexChanged(QString field) +{ + resetFieldType(); + UAVDataObject* obj = dynamic_cast( _objManager.getObject(_optionsPage->UAVObject->currentText())); addDynamicField(obj->getField(field)); } -////////////////////////////////////////////////////////////////////////////// -// Fills in the combo box when value is changed in the -// combo box -////////////////////////////////////////////////////////////////////////////// -void NotifyPluginOptionsPage::on_UAVObject_indexChanged(QString val) { - _fieldType = -1; - UAVDataObject* obj = dynamic_cast( objManager.getObject(val) ); +void NotifyPluginOptionsPage::on_UAVObject_indexChanged(QString val) +{ + resetFieldType(); + UAVDataObject* obj = dynamic_cast( _objManager.getObject(val) ); QList fieldList = obj->getFields(); - disconnect(options_page->UAVObjectField, SIGNAL(currentIndexChanged(QString)), this, SLOT(onUAVField_indexChanged(QString))); - options_page->UAVObjectField->clear(); + disconnect(_optionsPage->UAVObjectField, SIGNAL(currentIndexChanged(QString)), this, SLOT(on_UAVField_indexChanged(QString))); + _optionsPage->UAVObjectField->clear(); foreach (UAVObjectField* field, fieldList) { - options_page->UAVObjectField->addItem(field->getName()); + _optionsPage->UAVObjectField->addItem(field->getName()); } - connect(options_page->UAVObjectField, SIGNAL(currentIndexChanged(QString)), this, SLOT(onUAVField_indexChanged(QString))); + connect(_optionsPage->UAVObjectField, SIGNAL(currentIndexChanged(QString)), this, SLOT(on_UAVField_indexChanged(QString))); addDynamicField(fieldList.at(0)); } -//----------------------------------------------------------------------------- void NotifyPluginOptionsPage::on_buttonSoundFolder_clicked(const QString& path) { QDir dirPath(path); - listDirCollections = dirPath.entryList(QDir::AllDirs | QDir::NoDotAndDotDot); - options_page->SoundCollectionList->clear(); - options_page->SoundCollectionList->addItems(listDirCollections); + _listDirCollections = dirPath.entryList(QDir::AllDirs | QDir::NoDotAndDotDot); + _optionsPage->SoundCollectionList->clear(); + _optionsPage->SoundCollectionList->addItems(_listDirCollections); } -//----------------------------------------------------------------------------- void NotifyPluginOptionsPage::on_soundLanguage_indexChanged(int index) { - options_page->SoundCollectionList->setCurrentIndex(index); + _optionsPage->SoundCollectionList->setCurrentIndex(index); + _currentCollectionPath = _optionsPage->SoundDirectoryPathChooser->path() + + QDir::toNativeSeparators("/" + _optionsPage->SoundCollectionList->currentText()); - currentCollectionPath = options_page->SoundDirectoryPathChooser->path() - + QDir::toNativeSeparators("/" + options_page->SoundCollectionList->currentText()); - - QDir dirPath(currentCollectionPath); + QDir dirPath(_currentCollectionPath); QStringList filters; filters << "*.mp3" << "*.wav"; dirPath.setNameFilters(filters); - listSoundFiles = dirPath.entryList(filters); - listSoundFiles.replaceInStrings(QRegExp(".mp3|.wav"), ""); - options_page->Sound1->clear(); - options_page->Sound2->clear(); - options_page->Sound3->clear(); - options_page->Sound1->addItems(listSoundFiles); - options_page->Sound2->addItem(""); - options_page->Sound2->addItems(listSoundFiles); - options_page->Sound3->addItem(""); - options_page->Sound3->addItems(listSoundFiles); - + _listSoundFiles = dirPath.entryList(filters); + _listSoundFiles.replaceInStrings(QRegExp(".mp3|.wav"), ""); + _optionsPage->Sound1->clear(); + _optionsPage->Sound2->clear(); + _optionsPage->Sound3->clear(); + _optionsPage->Sound1->addItems(_listSoundFiles); + _optionsPage->Sound2->addItem(""); + _optionsPage->Sound2->addItems(_listSoundFiles); + _optionsPage->Sound3->addItem(""); + _optionsPage->Sound3->addItems(_listSoundFiles); } -//----------------------------------------------------------------------------- -void NotifyPluginOptionsPage::changeButtonText(Phonon::State newstate, Phonon::State oldstate) +void NotifyPluginOptionsPage::on_changeButtonText(Phonon::State newstate, Phonon::State oldstate) { //Q_ASSERT(Phonon::ErrorState != newstate); if (newstate == Phonon::PausedState || newstate == Phonon::StoppedState) { - options_page->buttonPlayNotification->setText("Play"); - options_page->buttonPlayNotification->setIcon(QPixmap(":/notify/images/play.png")); + _optionsPage->buttonPlayNotification->setText("Play"); + _optionsPage->buttonPlayNotification->setIcon(QPixmap(":/notify/images/play.png")); } else { if (newstate == Phonon::PlayingState) { - options_page->buttonPlayNotification->setText("Stop"); - options_page->buttonPlayNotification->setIcon(QPixmap(":/notify/images/stop.png")); + _optionsPage->buttonPlayNotification->setText("Stop"); + _optionsPage->buttonPlayNotification->setIcon(QPixmap(":/notify/images/stop.png")); } } } -//----------------------------------------------------------------------------- -void NotifyPluginOptionsPage::onFinishedPlaying() +void NotifyPluginOptionsPage::on_FinishedPlaying() { - notifySound->clear(); + _notifySound->clear(); } -//----------------------------------------------------------------------------- -void NotifyPluginOptionsPage::on_buttonTestSoundNotification_clicked() +void NotifyPluginOptionsPage::on_button_TestSoundNotification_clicked() { NotificationItem* notification = NULL; - - if (-1 == _notifyRulesSelection->currentIndex().row()) - return; - notifySound->clearQueue(); - notification = privListNotifications.at(_notifyRulesSelection->currentIndex().row()); - notification->parseNotifyMessage(); - QStringList sequence = notification->getMessageSequence(); - Q_ASSERT(!!sequence.size()); qNotifyDebug() << "on_buttonTestSoundNotification_clicked"; + Q_ASSERT(-1 != _notifyRulesSelection->currentIndex().row()); + _notifySound->clearQueue(); + notification = _privListNotifications.at(_notifyRulesSelection->currentIndex().row()); + QStringList sequence = notification->toSoundList(); + if (sequence.isEmpty()) { + qNotifyDebug() << "message sequense is empty!"; + return; + } foreach(QString item, sequence) { qNotifyDebug() << item; - notifySound->enqueue(Phonon::MediaSource(item)); + _notifySound->enqueue(Phonon::MediaSource(item)); } - notifySound->play(); + _notifySound->play(); } -void NotifyPluginOptionsPage::on_chkEnableSound_toggled(bool state) +void NotifyPluginOptionsPage::on_checkEnableSound_toggled(bool state) { bool state1 = 1^state; - QList listOutputs = notifySound->outputPaths(); + QList listOutputs = _notifySound->outputPaths(); Phonon::AudioOutput * audioOutput = (Phonon::AudioOutput*)listOutputs.last().sink(); audioOutput->setMuted(state1); } -//----------------------------------------------------------------------------- void NotifyPluginOptionsPage::updateConfigView(NotificationItem* notification) { Q_ASSERT(notification); - disconnect(options_page->UAVObject, SIGNAL(currentIndexChanged(QString)), + disconnect(_optionsPage->UAVObject, SIGNAL(currentIndexChanged(QString)), this, SLOT(on_UAVObject_indexChanged(QString))); - disconnect(options_page->UAVObjectField, SIGNAL(currentIndexChanged(QString)), - this, SLOT(onUAVField_indexChanged(QString))); + disconnect(_optionsPage->UAVObjectField, SIGNAL(currentIndexChanged(QString)), + this, SLOT(on_UAVField_indexChanged(QString))); QString path = notification->getSoundCollectionPath(); - if (path == "") { - //QDir dir = QDir::currentPath(); - //path = QDir::currentPath().left(QDir::currentPath().indexOf("OpenPilot",0,Qt::CaseSensitive))+"../share/sounds"; + if (path.isEmpty()) { path = Utils::PathUtils().InsertDataPath("%%DATAPATH%%sounds"); } - options_page->SoundDirectoryPathChooser->setPath(path); + _optionsPage->SoundDirectoryPathChooser->setPath(path); - if (-1 != options_page->SoundCollectionList->findText(notification->getCurrentLanguage())){ - options_page->SoundCollectionList->setCurrentIndex(options_page->SoundCollectionList->findText(notification->getCurrentLanguage())); + if (-1 != _optionsPage->SoundCollectionList->findText(notification->getCurrentLanguage())) { + _optionsPage->SoundCollectionList->setCurrentIndex(_optionsPage->SoundCollectionList->findText(notification->getCurrentLanguage())); } else { - options_page->SoundCollectionList->setCurrentIndex(options_page->SoundCollectionList->findText("default")); + _optionsPage->SoundCollectionList->setCurrentIndex(_optionsPage->SoundCollectionList->findText("default")); } - // Fills the combo boxes for the UAVObjects - QList< QList > objList = objManager.getDataObjects(); + QList< QList > objList = _objManager.getDataObjects(); foreach (QList list, objList) { foreach (UAVDataObject* obj, list) { - options_page->UAVObject->addItem(obj->getName()); + _optionsPage->UAVObject->addItem(obj->getName()); } } - if (options_page->UAVObject->findText(notification->getDataObject())!=-1){ - options_page->UAVObject->setCurrentIndex(options_page->UAVObject->findText(notification->getDataObject())); + if (-1 != _optionsPage->UAVObject->findText(notification->getDataObject())) { + _optionsPage->UAVObject->setCurrentIndex(_optionsPage->UAVObject->findText(notification->getDataObject())); } - options_page->UAVObjectField->clear(); + _optionsPage->UAVObjectField->clear(); QString uavDataObject = notification->getDataObject(); - UAVDataObject* obj = dynamic_cast(objManager.getObject(uavDataObject)); + UAVDataObject* obj = dynamic_cast(_objManager.getObject(uavDataObject)); if (obj != NULL ) { QList fieldList = obj->getFields(); foreach (UAVObjectField* field, fieldList) { - options_page->UAVObjectField->addItem(field->getName()); + _optionsPage->UAVObjectField->addItem(field->getName()); } } - if (-1 != options_page->UAVObjectField->findText(notification->getObjectField())) { - options_page->UAVObjectField->setCurrentIndex(options_page->UAVObjectField->findText(notification->getObjectField())); + if (-1 != _optionsPage->UAVObjectField->findText(notification->getObjectField())) { + _optionsPage->UAVObjectField->setCurrentIndex(_optionsPage->UAVObjectField->findText(notification->getObjectField())); } - if (-1 != options_page->Sound1->findText(notification->getSound1())) { - options_page->Sound1->setCurrentIndex(options_page->Sound1->findText(notification->getSound1())); + if (-1 != _optionsPage->Sound1->findText(notification->getSound1())) { + _optionsPage->Sound1->setCurrentIndex(_optionsPage->Sound1->findText(notification->getSound1())); } else { // show item from default location - options_page->SoundCollectionList->setCurrentIndex(options_page->SoundCollectionList->findText("default")); - options_page->Sound1->setCurrentIndex(options_page->Sound1->findText(notification->getSound1())); + _optionsPage->SoundCollectionList->setCurrentIndex(_optionsPage->SoundCollectionList->findText("default")); + _optionsPage->Sound1->setCurrentIndex(_optionsPage->Sound1->findText(notification->getSound1())); } - if (-1 != options_page->Sound2->findText(notification->getSound2())) { - options_page->Sound2->setCurrentIndex(options_page->Sound2->findText(notification->getSound2())); + if (-1 != _optionsPage->Sound2->findText(notification->getSound2())) { + _optionsPage->Sound2->setCurrentIndex(_optionsPage->Sound2->findText(notification->getSound2())); } else { // show item from default location - options_page->SoundCollectionList->setCurrentIndex(options_page->SoundCollectionList->findText("default")); - options_page->Sound2->setCurrentIndex(options_page->Sound2->findText(notification->getSound2())); + _optionsPage->SoundCollectionList->setCurrentIndex(_optionsPage->SoundCollectionList->findText("default")); + _optionsPage->Sound2->setCurrentIndex(_optionsPage->Sound2->findText(notification->getSound2())); } - if (-1 != options_page->Sound3->findText(notification->getSound3())) { - options_page->Sound3->setCurrentIndex(options_page->Sound3->findText(notification->getSound3())); + if (-1 != _optionsPage->Sound3->findText(notification->getSound3())) { + _optionsPage->Sound3->setCurrentIndex(_optionsPage->Sound3->findText(notification->getSound3())); } else { // show item from default location - options_page->SoundCollectionList->setCurrentIndex(options_page->SoundCollectionList->findText("default")); - options_page->Sound3->setCurrentIndex(options_page->Sound3->findText(notification->getSound3())); + _optionsPage->SoundCollectionList->setCurrentIndex(_optionsPage->SoundCollectionList->findText("default")); + _optionsPage->Sound3->setCurrentIndex(_optionsPage->Sound3->findText(notification->getSound3())); } if (-1 != _valueRange->findText(notification->range())) { @@ -534,120 +508,123 @@ void NotifyPluginOptionsPage::updateConfigView(NotificationItem* notification) setDynamicValueField(notification); - connect(options_page->UAVObject, SIGNAL(currentIndexChanged(QString)), + connect(_optionsPage->UAVObject, SIGNAL(currentIndexChanged(QString)), this, SLOT(on_UAVObject_indexChanged(QString))); - connect(options_page->UAVObjectField, SIGNAL(currentIndexChanged(QString)), - this, SLOT(onUAVField_indexChanged(QString))); + connect(_optionsPage->UAVObjectField, SIGNAL(currentIndexChanged(QString)), + this, SLOT(on_UAVField_indexChanged(QString))); } -//----------------------------------------------------------------------------- void NotifyPluginOptionsPage::setDynamicValueField(NotificationItem* notification) { - if(QSpinBox* spinValue = dynamic_cast(_fieldValue)) + if (QSpinBox* spinValue = dynamic_cast(_fieldValue)) spinValue->setValue(notification->singleValue()); else { - if(QComboBox* comboBoxValue = dynamic_cast(_fieldValue)) + if (QComboBox* comboBoxValue = dynamic_cast(_fieldValue)) comboBoxValue->setCurrentIndex(notification->singleValue()); else { - if(QLineEdit* rangeValue = dynamic_cast(_fieldValue)) { - resetValueRange(); - rangeValue->setText(QString("%1%2").arg(notification->singleValue()) - .arg(notification->valueRange2())); + if (QLineEdit* rangeValue = dynamic_cast(_fieldValue)) { + //resetValueRange(); + QString str = QString("%1%2").arg(notification->singleValue(), 5, 'f', 2, '0') + .arg(notification->valueRange2(), 5, 'f', 2, '0'); + rangeValue->setText(str); } else { qNotifyDebug() << "NotifyPluginOptionsPage::setDynamicValueField | unknown _fieldValue: " << _fieldValue; } - } } } -//----------------------------------------------------------------------------- -void NotifyPluginOptionsPage::on_tableNotification_changeSelection( const QItemSelection & selected, const QItemSelection & deselected ) +UAVObjectField* NotifyPluginOptionsPage::getObjectFieldFromPage() { - bool select = false; - notifySound->stop(); - if (selected.indexes().size()) { - select = true; - _selectedNotification = privListNotifications.at(selected.indexes().at(0).row()); - updateConfigView(_selectedNotification); - UAVDataObject* obj = dynamic_cast( objManager.getObject(options_page->UAVObject->currentText())); - UAVObjectField* field = obj->getField(options_page->UAVObjectField->currentText()); - addDynamicField(field); - setDynamicValueField(_selectedNotification); - } - - options_page->buttonModify->setEnabled(select); - options_page->buttonDelete->setEnabled(select); - options_page->buttonPlayNotification->setEnabled(select); + UAVDataObject* obj = dynamic_cast( _objManager.getObject(_optionsPage->UAVObject->currentText())); + return obj->getField(_optionsPage->UAVObjectField->currentText()); } -//----------------------------------------------------------------------------- -void NotifyPluginOptionsPage::on_buttonAddNotification_clicked() + +UAVObjectField* NotifyPluginOptionsPage::getObjectFieldFromSelected() +{ + UAVDataObject* obj = dynamic_cast(_objManager.getObject(_selectedNotification->getDataObject())); + return obj->getField(_selectedNotification->getObjectField()); +} + +void NotifyPluginOptionsPage::on_table_changeSelection( const QItemSelection & selected, const QItemSelection & deselected ) +{ + bool select = false; + _notifySound->stop(); + if (selected.indexes().size()) { + select = true; + _selectedNotification = _privListNotifications.at(selected.indexes().at(0).row()); + UAVObjectField* field = getObjectFieldFromSelected(); + addDynamicField(field); + updateConfigView(_selectedNotification); + } + + _optionsPage->buttonModify->setEnabled(select); + _optionsPage->buttonDelete->setEnabled(select); + _optionsPage->buttonPlayNotification->setEnabled(select); +} + +void NotifyPluginOptionsPage::on_button_AddNotification_clicked() { NotificationItem* notification = new NotificationItem; - if (options_page->SoundDirectoryPathChooser->path()=="") { - QPalette textPalette=options_page->SoundDirectoryPathChooser->palette(); - textPalette.setColor(QPalette::Normal,QPalette::Text, Qt::red); - options_page->SoundDirectoryPathChooser->setPalette(textPalette); - options_page->SoundDirectoryPathChooser->setPath("please select sound collection folder"); - return; + if (_optionsPage->SoundDirectoryPathChooser->path().isEmpty()) { + QPalette textPalette=_optionsPage->SoundDirectoryPathChooser->palette(); + textPalette.setColor(QPalette::Normal,QPalette::Text, Qt::red); + _optionsPage->SoundDirectoryPathChooser->setPalette(textPalette); + _optionsPage->SoundDirectoryPathChooser->setPath("please select sound collection folder"); + return; } - notification->setSoundCollectionPath(options_page->SoundDirectoryPathChooser->path()); - notification->setCurrentLanguage(options_page->SoundCollectionList->currentText()); - notification->setDataObject(options_page->UAVObject->currentText()); - notification->setObjectField(options_page->UAVObjectField->currentText()); + notification->setSoundCollectionPath(_optionsPage->SoundDirectoryPathChooser->path()); + notification->setCurrentLanguage(_optionsPage->SoundCollectionList->currentText()); + notification->setDataObject(_optionsPage->UAVObject->currentText()); + notification->setObjectField(_optionsPage->UAVObjectField->currentText()); notification->setRange(_valueRange->currentText()); - if(QSpinBox* spinValue = dynamic_cast(_fieldValue)) + if (QSpinBox* spinValue = dynamic_cast(_fieldValue)) notification->setSingleValue(spinValue->value()); - if (options_page->Sound1->currentText().size() > 0) - notification->setSound1(options_page->Sound1->currentText()); + if (_optionsPage->Sound1->currentText().size() > 0) + notification->setSound1(_optionsPage->Sound1->currentText()); - notification->setSound2(options_page->Sound2->currentText()); - notification->setSound3(options_page->Sound3->currentText()); + notification->setSound2(_optionsPage->Sound2->currentText()); + notification->setSound3(_optionsPage->Sound3->currentText()); - if ( ((!options_page->Sound2->currentText().size()) && (_sayOrder->currentText()=="After second")) - || ((!options_page->Sound3->currentText().size()) && (_sayOrder->currentText()=="After third")) ) { + if ( ((!_optionsPage->Sound2->currentText().size()) && (_sayOrder->currentText()=="After second")) + || ((!_optionsPage->Sound3->currentText().size()) && (_sayOrder->currentText()=="After third")) ) { return; } else { notification->setSayOrder(_sayOrder->currentText()); } _notifyRulesModel->entryAdded(notification); - _notifyRulesSelection->setCurrentIndex(_notifyRulesModel->index(privListNotifications.size()-1,0,QModelIndex()), + _notifyRulesSelection->setCurrentIndex(_notifyRulesModel->index(_privListNotifications.size()-1,0,QModelIndex()), QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows); } -//----------------------------------------------------------------------------- -void NotifyPluginOptionsPage::on_buttonDeleteNotification_clicked() +void NotifyPluginOptionsPage::on_button_DeleteNotification_clicked() { _notifyRulesModel->removeRow(_notifyRulesSelection->currentIndex().row()); if (!_notifyRulesModel->rowCount() && (_notifyRulesSelection->currentIndex().row() > 0 && _notifyRulesSelection->currentIndex().row() < _notifyRulesModel->rowCount()) ) { - options_page->buttonDelete->setEnabled(false); - options_page->buttonModify->setEnabled(false); - options_page->buttonPlayNotification->setEnabled(false); + _optionsPage->buttonDelete->setEnabled(false); + _optionsPage->buttonModify->setEnabled(false); + _optionsPage->buttonPlayNotification->setEnabled(false); } - } -//----------------------------------------------------------------------------- -void NotifyPluginOptionsPage::on_buttonModifyNotification_clicked() +void NotifyPluginOptionsPage::on_button_ModifyNotification_clicked() { NotificationItem* notification = new NotificationItem; getOptionsPageValues(notification); - notification->setRetryString(privListNotifications.at(_notifyRulesSelection->currentIndex().row())->retryString()); - notification->setLifetime(privListNotifications.at(_notifyRulesSelection->currentIndex().row())->lifetime()); - notification->setMute(privListNotifications.at(_notifyRulesSelection->currentIndex().row())->mute()); + notification->setRetryString(_privListNotifications.at(_notifyRulesSelection->currentIndex().row())->retryString()); + notification->setLifetime(_privListNotifications.at(_notifyRulesSelection->currentIndex().row())->lifetime()); + notification->setMute(_privListNotifications.at(_notifyRulesSelection->currentIndex().row())->mute()); - privListNotifications.replace(_notifyRulesSelection->currentIndex().row(),notification); + _privListNotifications.replace(_notifyRulesSelection->currentIndex().row(),notification); entryUpdated(_notifyRulesSelection->currentIndex().row()); - } - diff --git a/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.h b/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.h index f4a29ae41..3f36f3f4d 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.h +++ b/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.h @@ -57,78 +57,130 @@ using namespace Core; class NotifyPluginOptionsPage : public IOptionsPage { - Q_OBJECT + Q_OBJECT + public: - explicit NotifyPluginOptionsPage(/*NotificationItem *config, */QObject *parent = 0); - ~NotifyPluginOptionsPage(); - QString id() const { return QLatin1String("settings"); } - QString trName() const { return tr("settings"); } - QString category() const { return QLatin1String("Notify Plugin");} - QString trCategory() const { return tr("Notify Plugin");} + + explicit NotifyPluginOptionsPage(QObject *parent = 0); + ~NotifyPluginOptionsPage(); + QString id() const { return QLatin1String("settings"); } + QString trName() const { return tr("settings"); } + QString category() const { return QLatin1String("Notify Plugin");} + QString trCategory() const { return tr("Notify Plugin");} QWidget *createPage(QWidget *parent); void apply(); - void finish(); - void restoreFromSettings(); + void finish(); + void restoreFromSettings(); - void updateConfigView(NotificationItem* notification); - void getOptionsPageValues(NotificationItem* notification); + void updateConfigView(NotificationItem* notification); + void getOptionsPageValues(NotificationItem* notification); + UAVObjectField* getObjectFieldFromPage(); + UAVObjectField* getObjectFieldFromSelected(); signals: void updateNotifications(QList list); - //void resetNotification(void); void entryUpdated(int index); +private slots: + void on_button_TestSoundNotification_clicked(); + void on_button_AddNotification_clicked(); + void on_button_DeleteNotification_clicked(); + void on_button_ModifyNotification_clicked(); + + /** + * We can use continuous selection, to select simultaneously + * multiple rows to move them(using drag & drop) inside table ranges. + */ + void on_table_changeSelection( const QItemSelection & selected, const QItemSelection & deselected ); + + void on_soundLanguage_indexChanged(int index); + void on_buttonSoundFolder_clicked(const QString& path); + void on_UAVObject_indexChanged(QString val); + void on_UAVField_indexChanged(QString val); + void on_changeButtonText(Phonon::State newstate, Phonon::State oldstate); + void on_checkEnableSound_toggled(bool state); + + /** + * Important when we change to or from "In range" value + * For enums UI layout stayed the same, but for numeric values + * we need to change UI to show edit line, + * to have possibility assign range limits for value. + */ + void on_rangeValue_indexChanged(QString); + + void on_FinishedPlaying(void); + + private: Q_DISABLE_COPY(NotifyPluginOptionsPage) void resetValueRange(); + void resetFieldType(); + void setDynamicValueField(NotificationItem* notification); void addDynamicField(UAVObjectField* objField); void addDynamicValueLayout(); + void setDynamicValueWidget(UAVObjectField* objField); + void initButtons(); void initPhononPlayer(); void initRulesTable(); -private slots: - void on_buttonTestSoundNotification_clicked(); - - void on_buttonAddNotification_clicked(); - void on_buttonDeleteNotification_clicked(); - void on_buttonModifyNotification_clicked(); - void on_tableNotification_changeSelection( const QItemSelection & selected, const QItemSelection & deselected ); - void on_soundLanguage_indexChanged(int index); - void on_buttonSoundFolder_clicked(const QString& path); - void on_UAVObject_indexChanged(QString val); - void onUAVField_indexChanged(QString val); - void changeButtonText(Phonon::State newstate, Phonon::State oldstate); - void on_chkEnableSound_toggled(bool state); - void on_rangeValue_indexChanged(QString); - - void onFinishedPlaying(void); - private: - UAVObjectManager& objManager; - SoundNotifyPlugin* owner; - QStringList listDirCollections; - QStringList listSoundFiles; - QString currentCollectionPath; - Phonon::MediaObject *sound1; - Phonon::MediaObject *sound2; - QScopedPointer notifySound; - Phonon::AudioOutput *audioOutput; - QScopedPointer _notifyRulesModel; - QItemSelectionModel* _notifyRulesSelection; - QList privListNotifications; + UAVObjectManager& _objManager; + SoundNotifyPlugin* _owner; + QStringList _listDirCollections; + QStringList _listSoundFiles; + QString _currentCollectionPath; + Phonon::MediaObject* _sound1; + Phonon::MediaObject* _sound2; + QScopedPointer _notifySound; + Phonon::AudioOutput* _audioOutput; - QScopedPointer options_page; + QScopedPointer _notifyRulesModel; + QItemSelectionModel* _notifyRulesSelection; + /** + * Local copy of notification list, which owned by notify plugin. + * Notification list readed once on application loaded, during + * notify plugin startup, then on open options page. + * This copy is simple assignment, but due to implicitly sharing + * we don't have additional cost for that, copy will created + * only after modification of private notify list. + */ + QList _privListNotifications; + + QScopedPointer _optionsPage; + + //! widget to convinient selection of condition for field value (equal, lower, greater) QComboBox* _valueRange; + + //! widget to convinient selection of order in which sounds will be played QComboBox* _sayOrder; + + //! widget to represent edit widget for UAVObjectfield, + //! can be spinbox - for numerics, combobox - enums, or + //! lineedit - for range limits QWidget* _fieldValue; + + //! type of UAVObjectField - numeric or ENUM + //! this variable needs to correctly set dynamic UI elemen _fieldValue + //! NOTE: ocassionaly it should be invalidated (= -1) to reset _fieldValue int _fieldType; + + //! actualy reference to optionsPageWidget, + //! we MUST hold it beyond the scope of createPage func + //! to have possibility change dynamic parts of options page layout in future QWidget* _form; + + //! needs to correctly update UI during transitions from "In Range" to other + //! _valueRange entries and back direction as well + QString _prevRangeValue; + + //! Currently selected notification, all controls filled accroding to it. + //! On options page startup, always points to first row. NotificationItem* _selectedNotification; }; diff --git a/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.ui b/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.ui index 23d05c2a0..94560ff1a 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.ui +++ b/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.ui @@ -266,7 +266,7 @@ p, li { white-space: pre-wrap; } - QAbstractItemView::SingleSelection + QAbstractItemView::ContiguousSelection QAbstractItemView::SelectRows diff --git a/ground/openpilotgcs/src/plugins/notify/notifytablemodel.cpp b/ground/openpilotgcs/src/plugins/notify/notifytablemodel.cpp index 138af106b..b1fd1c737 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifytablemodel.cpp +++ b/ground/openpilotgcs/src/plugins/notify/notifytablemodel.cpp @@ -30,8 +30,6 @@ #include #include -static int _dragStartRow = -1; -static int _dragNumRows = -1; const char* mime_type_notify_table = "openpilot/notify_plugin_table"; NotifyTableModel::NotifyTableModel(QList& parentList, QObject* parent) @@ -47,19 +45,19 @@ bool NotifyTableModel::setData(const QModelIndex &index, const QVariant &value, int role) { if (index.isValid() && role == Qt::DisplayRole) { - if(eMESSAGE_NAME == index.column()) { + if(eMessageName == index.column()) { emit dataChanged(index, index); return true; } } if (index.isValid() && role == Qt::EditRole) { - if(eREPEAT_VALUE == index.column()) + if(eRepeatValue == index.column()) _list.at(index.row())->setRetryString(value.toString()); else { - if(eEXPIRE_TIME == index.column()) + if(eExpireTimer == index.column()) _list.at(index.row())->setLifetime(value.toInt()); else { - if(eENABLE_NOTIFICATION == index.column()) + if(eTurnOn == index.column()) _list.at(index.row())->setMute(value.toBool()); } } @@ -83,16 +81,16 @@ QVariant NotifyTableModel::data(const QModelIndex &index, int role) const { switch(index.column()) { - case eMESSAGE_NAME: - return _list.at(index.row())->parseNotifyMessage(); + case eMessageName: + return _list.at(index.row())->toString(); - case eREPEAT_VALUE: + case eRepeatValue: return _list.at(index.row())->retryString(); - case eEXPIRE_TIME: + case eExpireTimer: return _list.at(index.row())->lifetime(); - case eENABLE_NOTIFICATION: + case eTurnOn: return _list.at(index.row())->mute(); default: @@ -126,13 +124,13 @@ bool NotifyTableModel::insertRows(int position, int rows, const QModelIndex& ind { Q_UNUSED(index); - if((-1 == position) || (-1 == rows) ) + if (-1 == position || -1 == rows) return false; beginInsertRows(QModelIndex(), position, position + rows - 1); - for (int row = 0; row < rows; ++row) { - _list.insert(position, new NotificationItem()); + for (int i = 0; i < rows; ++i) { + _list.insert(position + i, new NotificationItem()); } endInsertRows(); @@ -171,6 +169,17 @@ void NotifyTableModel::entryAdded(NotificationItem* item) entryUpdated(rowCount() - 1); } +Qt::DropActions NotifyTableModel::supportedDropActions() const +{ + return Qt::MoveAction; +} + +QStringList NotifyTableModel::mimeTypes() const +{ + QStringList types; + types << mime_type_notify_table; + return types; +} bool NotifyTableModel::dropMimeData( const QMimeData * data, Qt::DropAction action, int row, int column, const QModelIndex& parent) @@ -198,48 +207,31 @@ bool NotifyTableModel::dropMimeData( const QMimeData * data, Qt::DropAction acti QByteArray encodedData = data->data(mime_type_notify_table); QDataStream stream(&encodedData, QIODevice::ReadOnly); int rows = beginRow; + // read next item from input MIME and drop into the table line by line while(!stream.atEnd()) { qint32 ptr; stream >> ptr; NotificationItem* item = reinterpret_cast(ptr); int dragged = _list.indexOf(item); + // we can drag item from top rows to bottom (DOWN_DIRECTION), + // or from bottom rows to top rows (UP_DIRECTION) + enum { UP_DIRECTION, DOWN_DIRECTION }; + int direction = (dragged < rows) ? DOWN_DIRECTION : (dragged += 1, UP_DIRECTION); + Q_ASSERT(insertRows(rows + direction, 1, QModelIndex())); if(-1 == dragged || rows >= _list.size() || dragged == rows) { qNotifyDebug() << "no such item"; + return false; } - removeRows(rows, 1, QModelIndex()); - insertRows(rows, 1, QModelIndex()); - _list.replace(dragged, item); - // _list.swap(dragged, rows); - ++rows; + _list.replace(rows + direction, item); + Q_ASSERT(removeRows(dragged, 1, QModelIndex())); + if(direction == UP_DIRECTION) + ++rows; }; QModelIndex idxTopLeft = index(beginRow, 0, QModelIndex()); QModelIndex idxBotRight = index(beginRow, columnCount(QModelIndex()), QModelIndex()); emit dataChanged(idxTopLeft, idxBotRight); - //QStringList newItems; - - //removeRows(_dragStartRow, _dragNumRows, QModelIndex()); - //insertRows(beginRow, rows, QModelIndex()); -// int rows = beginRow; -// while (!stream.atEnd()) { -// _list.at(index.row())->deserialize(stream); -// ++rows; -// } - -// while(rows) { -// int column = 0; -// foreach (const QString& text, newItems) { -// QModelIndex idx = index(beginRow, column, QModelIndex()); -// if(!column) -// setData(const_cast(idx), text, Qt::DisplayRole); -// else -// setData(const_cast(idx), text, Qt::EditRole); -// ++column; -// } -// ++beginRow; -// --rows; -// } return true; } @@ -251,35 +243,13 @@ QMimeData* NotifyTableModel::mimeData(const QModelIndexList& indexes) const QDataStream stream(&encodedData, QIODevice::WriteOnly); int rows = 0; foreach (const QModelIndex& index, indexes) { - if(!index.column()) { + if (!index.column()) { qint32 item = reinterpret_cast(_list.at(index.row())); stream << item; + ++rows; } - ++rows; } - -// int numRows = 0; -// foreach (const QModelIndex& index, indexes) { -// if (index.isValid() && index.column()) { -// _list.at(index.row())->serialize(stream); -//// if(!index.column()) { -//// numRows++; -//// QString name = data(index, Qt::DisplayRole).toString(); -//// stream << name; -//// } else { -//// QString text = data(index, Qt::EditRole).toString(); -//// stream << text; -//// } -// } -// } - mimeData->setData(mime_type_notify_table, encodedData); - - //emit dragRows(indexes.at(0).row(), rows); - dropRows(indexes.at(0).row(), rows); - //_dragStartRow = indexes.at(0).row(); - //_dragNumRows = 1/*numRows*/; - return mimeData; } diff --git a/ground/openpilotgcs/src/plugins/notify/notifytablemodel.h b/ground/openpilotgcs/src/plugins/notify/notifytablemodel.h index 3168a848f..28eb8cc68 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifytablemodel.h +++ b/ground/openpilotgcs/src/plugins/notify/notifytablemodel.h @@ -33,72 +33,58 @@ #include #include "notificationitem.h" -enum ColumnNames { eMESSAGE_NAME, eREPEAT_VALUE, eEXPIRE_TIME, eENABLE_NOTIFICATION }; +enum ColumnNames { eMessageName, eRepeatValue, eExpireTimer, eTurnOn }; class NotifyTableModel : public QAbstractTableModel { - Q_OBJECT + Q_OBJECT - enum {eColumnCount = 4 }; + enum {eColumnCount = 4 }; public: - NotifyTableModel(QList& parentList, QObject* parent = 0); - - int rowCount(const QModelIndex& parent = QModelIndex()) const - { - return _list.count(); - } - - int columnCount(const QModelIndex &/*parent*/) const - { - return eColumnCount; - } - - Qt::ItemFlags flags(const QModelIndex &index) const - { - if (!index.isValid()) - return Qt::ItemIsEnabled | Qt::ItemIsDropEnabled; - - return QAbstractItemModel::flags(index) | Qt::ItemIsEditable | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled; - } - - Qt::DropActions supportedDropActions() const + NotifyTableModel(QList& parentList, QObject* parent = 0); + int rowCount(const QModelIndex& parent = QModelIndex()) const { - return Qt::MoveAction; + return _list.count(); } - QStringList mimeTypes() const - { - QStringList types; - types << "application/vnd.text.list"; - return types; - } + int columnCount(const QModelIndex &/*parent*/) const + { + return eColumnCount; + } - bool dropMimeData( const QMimeData * data, Qt::DropAction action, int row, - int column, const QModelIndex& parent); - QMimeData* mimeData(const QModelIndexList &indexes) const; + Qt::ItemFlags flags(const QModelIndex &index) const + { + if (!index.isValid()) + return Qt::ItemIsEnabled | Qt::ItemIsDropEnabled; + + return QAbstractItemModel::flags(index) | Qt::ItemIsEditable | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled; + } + QStringList mimeTypes() const; + Qt::DropActions supportedDropActions() const; + bool dropMimeData( const QMimeData * data, Qt::DropAction action, int row, + int column, const QModelIndex& parent); + QMimeData* mimeData(const QModelIndexList &indexes) const; - bool setData(const QModelIndex &index, const QVariant &value, int role); - QVariant data(const QModelIndex &index, int role) const; - QVariant headerData(int section, Qt::Orientation orientation, int role) const; - bool insertRows(int position, int rows, const QModelIndex &index); - bool removeRows(int position, int rows, const QModelIndex &index); - - void entryAdded(NotificationItem* item); + bool setData(const QModelIndex &index, const QVariant &value, int role); + QVariant data(const QModelIndex &index, int role) const; + QVariant headerData(int section, Qt::Orientation orientation, int role) const; + bool insertRows(int position, int rows, const QModelIndex &index); + bool removeRows(int position, int rows, const QModelIndex &index); + void entryAdded(NotificationItem* item); signals: - void dragRows(int position, int count); + void dragRows(int position, int count); private slots: - void entryUpdated(int offset); - void dropRows(int position, int count) const; + void entryUpdated(int offset); + void dropRows(int position, int count) const; private: - mutable QList& _list; - QStringList _headerStrings; + mutable QList& _list; + QStringList _headerStrings; }; - #endif // NOTIFYTABLEMODEL_H From 20757c2efd40484c107d6b5d892c51721a32da80 Mon Sep 17 00:00:00 2001 From: Nickolay Date: Wed, 12 Oct 2011 08:36:05 +0300 Subject: [PATCH 009/121] +complete all features; +testing in progress; --- .../src/plugins/notify/NotificationItem.h | 11 +- .../src/plugins/notify/notificationitem.cpp | 55 +- .../src/plugins/notify/notifylogging.cpp | 2 +- .../src/plugins/notify/notifyplugin.cpp | 440 ++++++------ .../src/plugins/notify/notifyplugin.h | 22 +- .../notify/notifypluginoptionspage.cpp | 627 +++++++++--------- .../plugins/notify/notifypluginoptionspage.h | 99 ++- .../src/plugins/notify/notifytablemodel.cpp | 27 +- 8 files changed, 687 insertions(+), 596 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/notify/NotificationItem.h b/ground/openpilotgcs/src/plugins/notify/NotificationItem.h index 1898f1a55..d4929a1e5 100644 --- a/ground/openpilotgcs/src/plugins/notify/NotificationItem.h +++ b/ground/openpilotgcs/src/plugins/notify/NotificationItem.h @@ -63,8 +63,8 @@ public: QString getSayOrder() const { return _sayOrder; } void setSayOrder(QString text) { _sayOrder = text; } - double singleValue() const { return _singleValue; } - void setSingleValue(double value) { _singleValue = value; } + QVariant singleValue() const { return _singleValue; } + void setSingleValue(QVariant value) { _singleValue = value; } double valueRange2() const { return _valueRange2; } void setValueRange2(double value) { _valueRange2 = value; } @@ -131,6 +131,7 @@ public: QTimer* getTimer() const { return _timer; } void startTimer(int value); + void restartTimer(); void stopTimer(); void disposeTimer(); @@ -141,7 +142,7 @@ public: void disposeExpireTimer(); bool isNowPlaying; - bool firstStart; + bool _isPlayed; static QStringList sayOrderValues; static QStringList retryValues; @@ -184,8 +185,8 @@ private: //! order in what sounds 1-3 will be played QString _sayOrder; - //! one-side range, value maybe lower or greater - double _singleValue; + //! one-side range, value(numeric or ENUM type) maybe lower, greater or in range + QVariant _singleValue; //! both-side range, value should be inside the range //double _valueRange1; diff --git a/ground/openpilotgcs/src/plugins/notify/notificationitem.cpp b/ground/openpilotgcs/src/plugins/notify/notificationitem.cpp index 1b0e634a6..ec86aabcd 100644 --- a/ground/openpilotgcs/src/plugins/notify/notificationitem.cpp +++ b/ground/openpilotgcs/src/plugins/notify/notificationitem.cpp @@ -59,7 +59,7 @@ QStringList NotificationItem::retryValues; NotificationItem::NotificationItem(QObject *parent) : QObject(parent) , isNowPlaying(0) - , firstStart(true) + , _isPlayed(false) , _timer(NULL) , _expireTimer(NULL) , _soundCollectionPath("") @@ -77,10 +77,12 @@ NotificationItem::NotificationItem(QObject *parent) , _expireTimeout(eDefaultTimeout) , _mute(false) { + NotificationItem::sayOrderValues.clear(); NotificationItem::sayOrderValues.append(cStrBefore1st); NotificationItem::sayOrderValues.append(cStrBefore2nd); NotificationItem::sayOrderValues.append(cStrAfter2nd); + NotificationItem::retryValues.clear(); NotificationItem::retryValues.append(cStrRetryOnce); NotificationItem::retryValues.append(cStrRetryInstantly); NotificationItem::retryValues.append(cStrRetry10sec); @@ -92,7 +94,7 @@ NotificationItem::NotificationItem(QObject *parent) void NotificationItem::copyTo(NotificationItem* that) const { that->isNowPlaying = isNowPlaying; - that->firstStart = firstStart; + that->_isPlayed = _isPlayed; that->_soundCollectionPath = _soundCollectionPath; that->_currentLanguage = _currentLanguage; that->_soundCollectionPath = _soundCollectionPath; @@ -142,7 +144,8 @@ void NotificationItem::restoreState(QSettings* settings) setSound2(settings->value(QLatin1String("Sound2"), tr("")).toString()); setSound3(settings->value(QLatin1String("Sound3"), tr("")).toString()); setSayOrder(settings->value(QLatin1String("SayOrder"), tr("")).toString()); - setSingleValue(settings->value(QLatin1String("Value1"), tr("")).toDouble()); + QVariant value = settings->value(QLatin1String("Value1"), tr("")); + setSingleValue(value); setValueRange2(settings->value(QLatin1String("Value2"), tr("")).toDouble()); setRetryString(settings->value(QLatin1String("Repeat"), tr("")).toString()); setLifetime(settings->value(QLatin1String("ExpireTimeout"), tr("")).toInt()); @@ -185,16 +188,26 @@ void NotificationItem::deseriaize(QDataStream& stream) stream >> this->_mute; } -void NotificationItem::startTimer(int value) +void NotificationItem::startTimer(int msec) { if (!_timer) { _timer = new QTimer(this); - _timer->setInterval(value); + _timer->setInterval(msec); } if (!_timer->isActive()) _timer->start(); } + +void NotificationItem::restartTimer() +{ + if (!_timer) { + if (!_timer->isActive()) + _timer->start(); + } +} + + void NotificationItem::stopTimer() { if (_timer) { @@ -311,17 +324,26 @@ QStringList valueToSoundList(QString value) return digitWavs; } +QString stringFromValue(QVariant value, UAVObjectField* field) +{ + 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; - QString value; UAVObjectField* field = getUAVObjectField(); - if (UAVObjectField::ENUM == field->getType()) { - Q_ASSERT(singleValue() < field->getOptions().size()); - value = field->getOptions().at(singleValue()); - } else { - value = QString("%L1").arg(singleValue()); - } + QString value = stringFromValue(singleValue(), field); int pos = getValuePosition(getSayOrder().trimmed()); QStringList lst; @@ -353,15 +375,8 @@ 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 - - QString value; UAVObjectField* field = getUAVObjectField(); - if (UAVObjectField::ENUM == field->getType()) { - Q_ASSERT(singleValue() < field->getOptions().size()); - value = field->getOptions().at(singleValue()); - } else { - value = QString("%L1").arg(singleValue()); - } + QString value = stringFromValue(singleValue(), field); // generate queue of sound files to play _messageSequence.clear(); diff --git a/ground/openpilotgcs/src/plugins/notify/notifylogging.cpp b/ground/openpilotgcs/src/plugins/notify/notifylogging.cpp index 0a29cc6e6..3cb11d111 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifylogging.cpp +++ b/ground/openpilotgcs/src/plugins/notify/notifylogging.cpp @@ -31,7 +31,7 @@ #ifdef DEBUG_NOTIFIES_ENABLE QDebug qNotifyDebug() { - return qDebug(); + return qDebug() << "[NOTIFY_PLG]"; } #endif diff --git a/ground/openpilotgcs/src/plugins/notify/notifyplugin.cpp b/ground/openpilotgcs/src/plugins/notify/notifyplugin.cpp index 88cb23621..5ac05776a 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifyplugin.cpp +++ b/ground/openpilotgcs/src/plugins/notify/notifyplugin.cpp @@ -48,7 +48,6 @@ static const QString VERSION = "1.0.0"; SoundNotifyPlugin::SoundNotifyPlugin() { phonon.mo = NULL; - configured = false; } SoundNotifyPlugin::~SoundNotifyPlugin() @@ -72,13 +71,10 @@ bool SoundNotifyPlugin::initialize(const QStringList& args, QString *errMsg) void SoundNotifyPlugin::extensionsInitialized() { Core::ICore::instance()->readSettings(this); - if ( !configured ){ - readConfig_0_0_0(); - } ExtensionSystem::PluginManager* pm = ExtensionSystem::PluginManager::instance(); connect(pm, SIGNAL(objectAdded(QObject*)), this, SLOT(onTelemetryManagerAdded(QObject*))); - removedNotifies.clear(); + _toRemoveNotifications.clear(); connectNotifications(); } @@ -96,46 +92,19 @@ void SoundNotifyPlugin::saveConfig( QSettings* settings, UAVConfigInfo *configIn settings->endGroup(); settings->beginWriteArray("listNotifies"); - for (int i = 0; i < lstNotifications.size(); i++) { + for (int i = 0; i < _notificationList.size(); i++) { settings->setArrayIndex(i); - lstNotifications.at(i)->saveState(settings); + _notificationList.at(i)->saveState(settings); } settings->endArray(); settings->setValue(QLatin1String("EnableSound"), enableSound); } -void SoundNotifyPlugin::readConfig( QSettings* settings, UAVConfigInfo *configInfo){ - - if ( configInfo->version() == UAVConfigVersion() ){ - // Just for migration to the new format. - configured = false; - return; - } - - settings->beginReadArray("Current"); - settings->setArrayIndex(0); - currentNotification.restoreState(settings); - settings->endArray(); - - // read list of notifications from settings - int size = settings->beginReadArray("listNotifies"); - for (int i = 0; i < size; ++i) { - settings->setArrayIndex(i); - NotificationItem* notification = new NotificationItem; - notification->restoreState(settings); - lstNotifications.append(notification); - } - settings->endArray(); - setEnableSound(settings->value(QLatin1String("EnableSound"),0).toBool()); - - configured = true; -} - -void SoundNotifyPlugin::readConfig_0_0_0(){ - - settings = Core::ICore::instance()->settings(); - settings->beginGroup(QLatin1String("NotifyPlugin")); +void SoundNotifyPlugin::readConfig( QSettings* settings, UAVConfigInfo *configInfo) +{ + // Just for migration to the new format. + //Q_ASSERT(configInfo->version() == UAVConfigVersion()); settings->beginReadArray("Current"); settings->setArrayIndex(0); @@ -148,18 +117,10 @@ void SoundNotifyPlugin::readConfig_0_0_0(){ settings->setArrayIndex(i); NotificationItem* notification = new NotificationItem; notification->restoreState(settings); - lstNotifications.append(notification); + _notificationList.append(notification); } settings->endArray(); setEnableSound(settings->value(QLatin1String("EnableSound"),0).toBool()); - settings->endGroup(); - - ExtensionSystem::PluginManager* pm = ExtensionSystem::PluginManager::instance(); - connect(pm, SIGNAL(objectAdded(QObject*)), this, SLOT(onTelemetryManagerAdded(QObject*))); - removedNotifies.clear(); - connectNotifications(); - - configured = true; } void SoundNotifyPlugin::onTelemetryManagerAdded(QObject* obj) @@ -186,11 +147,11 @@ void SoundNotifyPlugin::onAutopilotDisconnect() void SoundNotifyPlugin::resetNotification(void) { //first, reject empty args and unknown fields. - foreach(NotificationItem* ntf, lstNotifications) { + foreach(NotificationItem* ntf, _notificationList) { ntf->disposeTimer(); - disconnect(ntf->getTimer(), SIGNAL(timeout()), this, SLOT(repeatTimerHandler())); + disconnect(ntf->getTimer(), SIGNAL(timeout()), this, SLOT(on_timerRepeated_Notification())); ntf->disposeExpireTimer(); - disconnect(ntf->getExpireTimer(), SIGNAL(timeout()), this, SLOT(repeatTimerHandler())); + disconnect(ntf->getExpireTimer(), SIGNAL(timeout()), this, SLOT(on_timerRepeated_Notification())); } } @@ -200,10 +161,10 @@ void SoundNotifyPlugin::resetNotification(void) */ void SoundNotifyPlugin::updateNotificationList(QList list) { - removedNotifies.clear(); + _toRemoveNotifications.clear(); resetNotification(); - lstNotifications.clear(); - lstNotifications=list; + _notificationList.clear(); + _notificationList=list; connectNotifications(); Core::ICore::instance()->saveSettings(this); @@ -213,7 +174,7 @@ void SoundNotifyPlugin::connectNotifications() { foreach(UAVDataObject* obj,lstNotifiedUAVObjects) { if (obj != NULL) - disconnect(obj,SIGNAL(objectUpdated(UAVObject*)),this,SLOT(appendNotification(UAVObject*))); + disconnect(obj,SIGNAL(objectUpdated(UAVObject*)),this,SLOT(on_arrived_Notification(UAVObject*))); } if (phonon.mo != NULL) { delete phonon.mo; @@ -226,29 +187,33 @@ void SoundNotifyPlugin::connectNotifications() UAVObjectManager *objManager = pm->getObject(); lstNotifiedUAVObjects.clear(); - pendingNotifications.clear(); - lstNotifications.append(removedNotifies); - removedNotifies.clear(); + _pendingNotifications.clear(); + _notificationList.append(_toRemoveNotifications); + _toRemoveNotifications.clear(); //first, reject empty args and unknown fields. - foreach(NotificationItem* notify, lstNotifications) { - notify->firstStart=true; + foreach(NotificationItem* notify, _notificationList) { + notify->_isPlayed = false; notify->isNowPlaying=false; if(notify->mute()) continue; + // check is all sounds presented for notification, + // if not - we must not subscribe to it at all + if(notify->toSoundList().isEmpty()) continue; UAVDataObject* obj = dynamic_cast( objManager->getObject(notify->getDataObject()) ); if (obj != NULL ) { if (!lstNotifiedUAVObjects.contains(obj)) { lstNotifiedUAVObjects.append(obj); - connect(obj, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(appendNotification(UAVObject*))); + + connect(obj, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(on_arrived_Notification(UAVObject*))); } } else { qNotifyDebug() << "Error: Object is unknown (" << notify->getDataObject() << ")."; } } - if (lstNotifications.isEmpty()) return; + if (_notificationList.isEmpty()) return; // set notification message to current event phonon.mo = Phonon::createPlayer(Phonon::NotificationCategory); phonon.mo->clearQueue(); @@ -262,138 +227,66 @@ void SoundNotifyPlugin::connectNotifications() this, SLOT(stateChanged(Phonon::State,Phonon::State))); } -void SoundNotifyPlugin::appendNotification(UAVObject *object) +void SoundNotifyPlugin::on_arrived_Notification(UAVObject *object) { - disconnect(object, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(appendNotification(UAVObject*))); - - foreach(NotificationItem* ntf, lstNotifications) { + foreach(NotificationItem* ntf, _notificationList) { if (object->getName() != ntf->getDataObject()) continue; - if (nowPlayingConfiguration == ntf) + + // skip duplicate notifications + if (_nowPlayingNotification == ntf) continue; + // skip periodical notifications + // this condition accepts: + // 1. Periodical notifications played firstly; + // NOTE: At first time it will be played, then it played only by timer, + // when conditions became false firstStart flag has been cleared and + // 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" && - ntf->retryString() != "Repeat Once" && !ntf->firstStart) + ntf->retryString() != "Repeat Once" && ntf->_isPlayed) continue; - checkNotificationRule(ntf,object); + qNotifyDebug() << QString("new notification: | %1 | %2 | val1: %3 | val2: %4") + .arg(ntf->getDataObject()) + .arg(ntf->getObjectField()) + .arg(ntf->singleValue().toString()) + .arg(ntf->valueRange2()); + + QString fieldName = ntf->getObjectField(); + UAVObjectField* field = object->getField(fieldName); + + qNotifyDebug() << QString("UAV object: %1 | value: %2") + .arg(object->getName()) + .arg(field->getValue().toString()); + + checkNotificationRule(ntf, object); } - connect(object, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(appendNotification(UAVObject*))); + connect(object, SIGNAL(objectUpdated(UAVObject*)), + this, SLOT(on_arrived_Notification(UAVObject*)), Qt::UniqueConnection); } -void SoundNotifyPlugin::checkNotificationRule(NotificationItem* notification, UAVObject* object) -{ - bool condition=false; - double threshold; - QString direction; - QString fieldName; - - threshold = notification->singleValue(); - direction = notification->range(); - fieldName = notification->getObjectField(); - UAVObjectField* field = object->getField(fieldName); - - if (field->getName().isEmpty()) - return; - - double value = field->getDouble(); - switch(direction[0].toAscii()) - { - case 'E': - condition = (value == threshold); - break; - - case 'G': - condition = (value > threshold); - break; - - case 'L': - condition = (value < threshold); - break; - - case 'R': - condition = (value > threshold) && (value < notification->valueRange2()); - break; - - } - - if (!condition) - return; - - if (!playNotification(notification)) { - if (!pendingNotifications.contains(notification)) { - notification->stopTimer(); - - qNotifyDebug() << "add to pending list - " << notification->toString(); - // if audio is busy, start expiration timer - //ms = (notification->getExpiredTimeout()[in sec])*1000 - //QxtTimer::singleShot(notification->getExpireTimeout()*1000, this, SLOT(expirationTimerHandler(NotificationItem*)), qVariantFromValue(notification)); - pendingNotifications.append(notification); - notification->startExpireTimer(); - connect(notification->getExpireTimer(), SIGNAL(timeout()), this, SLOT(expireTimerHandler())); - } - } -} - -bool SoundNotifyPlugin::playNotification(NotificationItem* notification) -{ - // Check: race condition, if phonon.mo got deleted don't go further - if (phonon.mo == NULL) - return false; - - if (notification->mute()) - return false; - - qNotifyDebug() << "Phonon State: " << phonon.mo->state(); - if ((phonon.mo->state()==Phonon::PausedState) - || (phonon.mo->state()==Phonon::StoppedState) - || phonon.firstPlay) - { - // don't fire expire timer - nowPlayingConfiguration = notification; - notification->stopExpireTimer(); - - if (notification->retryString() == "Repeat Once") { - removedNotifies.append(lstNotifications.takeAt(lstNotifications.indexOf(notification))); - } else { - if (notification->retryString() != "Repeat Instantly") { - QRegExp rxlen("(\\d+)"); - QString value; - int timer_value; - int pos = rxlen.indexIn(notification->retryString()); - if (pos > -1) { - value = rxlen.cap(1); // "189" - timer_value = (value.toInt()+8)*1000; //ms*1000 + average duration of meassage - } - - notification->startTimer(timer_value); - connect(notification->getTimer(), SIGNAL(timeout()), this, SLOT(repeatTimerHandler())); - } - } - notification->firstStart=false; - phonon.mo->clear(); - qNotifyDebug() << "play notification - " << notification->toString(); - foreach (QString item, notification->toSoundList()) { - Phonon::MediaSource *ms = new Phonon::MediaSource(item); - ms->setAutoDelete(true); - phonon.mo->enqueue(*ms); - } - phonon.mo->play(); - phonon.firstPlay = false; // On Linux, you sometimes have to nudge Phonon to play 1 time before - // the state is not "Loading" anymore. - } else { - return false; // if audio is busy - } - return true; -} - -void SoundNotifyPlugin::repeatTimerHandler() +void SoundNotifyPlugin::on_timerRepeated_Notification() { NotificationItem* notification = static_cast(sender()->parent()); + if (!notification) + return; + // skip duplicate notifications + // WARNING: generally we shoudn't ever trap here + // this means, that timer fires to early and notification overlap itself + if (_nowPlayingNotification == notification) { + qNotifyDebug() << "WARN: on_timerRepeated - notification was skipped!"; + notification->restartTimer(); + return; + } - qNotifyDebug() << "repeatTimerHandler - " << notification->toString(); + qNotifyDebug() << QString("repeatTimer: %1% | %2 | %3").arg(notification->getDataObject()) + .arg(notification->getObjectField()) + .arg(notification->toString()); ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); UAVObjectManager *objManager = pm->getObject(); @@ -402,15 +295,23 @@ void SoundNotifyPlugin::repeatTimerHandler() checkNotificationRule(notification,object); } -void SoundNotifyPlugin::expireTimerHandler() + +void SoundNotifyPlugin::on_expiredTimer_Notification() { // fire expire timer NotificationItem* notification = static_cast(sender()->parent()); + if(!notification) + return; notification->stopExpireTimer(); - if (!pendingNotifications.isEmpty()) { - qNotifyDebug() << "expireTimerHandler - " << notification->toString(); - pendingNotifications.removeOne(notification); + volatile QMutexLocker lock(&_mutex); + + if (!_pendingNotifications.isEmpty()) { + qNotifyDebug() << QString("expireTimer: %1% | %2 | %3").arg(notification->getDataObject()) + .arg(notification->getObjectField()) + .arg(notification->toString()); + + _pendingNotifications.removeOne(notification); } } @@ -418,8 +319,7 @@ void SoundNotifyPlugin::stateChanged(Phonon::State newstate, Phonon::State oldst { Q_UNUSED(oldstate) - qNotifyDebug() << "File length (ms): " << phonon.mo->totalTime(); - qNotifyDebug() << "New State: " << newstate; + //qNotifyDebug() << "File length (ms): " << phonon.mo->totalTime(); #ifndef Q_OS_WIN // This is a hack to force Linux to wait until the end of the @@ -432,11 +332,18 @@ void SoundNotifyPlugin::stateChanged(Phonon::State newstate, Phonon::State oldst if ((newstate == Phonon::PausedState) || (newstate == Phonon::StoppedState)) { - nowPlayingConfiguration=NULL; - if (!pendingNotifications.isEmpty()) + qNotifyDebug() << "New State: " << QVariant(newstate).toString(); + + volatile QMutexLocker lock(&_mutex); + // assignment to NULL needed to detect that palying is finished + // it's useful in repeat timer handler, where we can detect + // that notification has not overlap with itself + _nowPlayingNotification = NULL; + + if (!_pendingNotifications.isEmpty()) { - NotificationItem* notification = pendingNotifications.takeFirst(); - qNotifyDebug() << "play audioFree - " << notification->toString(); + NotificationItem* notification = _pendingNotifications.takeFirst(); + qNotifyDebug_if(notification) << "play audioFree - " << notification->toString(); playNotification(notification); } } else { @@ -449,4 +356,163 @@ void SoundNotifyPlugin::stateChanged(Phonon::State newstate, Phonon::State oldst } } +bool checkRange(QString fieldValue, QString enumValue, QStringList values, char direction) +{ + + bool ret = false; + switch(direction) + { + case 'E': + ret = !QString::compare(enumValue, fieldValue, Qt::CaseInsensitive) ? true : false; + break; + + default: + ret = true; + break; + }; + return ret; +} + +bool checkRange(double fieldValue, double min, double max, char direction) +{ + bool ret = false; + Q_ASSERT(min < max); + switch(direction) + { + case 'E': + ret = (fieldValue == min); + break; + + case 'G': + ret = (fieldValue > min); + break; + + case 'L': + ret = (fieldValue < min); + break; + + default: + ret = (fieldValue > min) && (fieldValue < max); + break; + }; + + return ret; +} + +void SoundNotifyPlugin::checkNotificationRule(NotificationItem* notification, UAVObject* object) +{ + bool condition=false; + + if (notification->mute()) + return; + + QString direction = notification->range(); + QString fieldName = notification->getObjectField(); + UAVObjectField* field = object->getField(fieldName); + + if (field->getName().isEmpty()) + return; + + QVariant value = field->getValue(); + if(UAVObjectField::ENUM == field->getType()) { + condition = checkRange(value.toString(), + notification->singleValue().toString(), + field->getOptions(), + direction[0].toAscii()); + } else { + condition = checkRange(value.toDouble(), + notification->singleValue().toDouble(), + notification->valueRange2(), + direction[0].toAscii()); + } + + notification->_isPlayed = condition; + // if condition has been changed, and already in false state + // we should reset _isPlayed flag and stop repeat timer + if (!notification->_isPlayed) { + notification->stopTimer(); + return; + } + + volatile QMutexLocker lock(&_mutex); + + if (!playNotification(notification)) { + if (!_pendingNotifications.contains(notification) + && (_nowPlayingNotification != notification)) { + notification->stopTimer(); + + qNotifyDebug() << "add to pending list - " << notification->toString(); + // if audio is busy, start expiration timer + //ms = (notification->getExpiredTimeout()[in sec])*1000 + //QxtTimer::singleShot(notification->getExpireTimeout()*1000, this, SLOT(expirationTimerHandler(NotificationItem*)), qVariantFromValue(notification)); + _pendingNotifications.append(notification); + notification->startExpireTimer(); + connect(notification->getExpireTimer(), SIGNAL(timeout()), + this, SLOT(on_expiredTimer_Notification()), Qt::UniqueConnection); + } + } +} + +bool SoundNotifyPlugin::playNotification(NotificationItem* notification) +{ + if(!notification) + return false; + + // Check: race condition, if phonon.mo got deleted don't go further + if (phonon.mo == NULL) + return false; + + //qNotifyDebug() << "Phonon State: " << phonon.mo->state(); + + if ((phonon.mo->state()==Phonon::PausedState) + || (phonon.mo->state()==Phonon::StoppedState) + || phonon.firstPlay) + { + _nowPlayingNotification = notification; + notification->stopExpireTimer(); + + if (notification->retryString() == "Repeat Once") { + _toRemoveNotifications.append(_notificationList.takeAt(_notificationList.indexOf(notification))); + } else { + if (notification->retryString() != "Repeat Instantly") { + QRegExp rxlen("(\\d+)"); + QString value; + int timer_value; + int pos = rxlen.indexIn(notification->retryString()); + if (pos > -1) { + value = rxlen.cap(1); // "189" + + // needs to correct repeat timer value, + // acording to message play duration, + // we don't measure duration of each message, + // simply take average duration + enum { eAverageDurationSec = 8 }; + + enum { eSecToMsec = 1000 }; + + timer_value = (value.toInt() + eAverageDurationSec) * eSecToMsec; + } + + notification->startTimer(timer_value); + connect(notification->getTimer(), SIGNAL(timeout()), + this, SLOT(on_timerRepeated_Notification()), Qt::UniqueConnection); + } + } + phonon.mo->clear(); + qNotifyDebug() << "play: " << notification->toString(); + foreach (QString item, notification->toSoundList()) { + Phonon::MediaSource *ms = new Phonon::MediaSource(item); + ms->setAutoDelete(true); + phonon.mo->enqueue(*ms); + } + phonon.mo->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; + + } + + return false; +} + Q_EXPORT_PLUGIN(SoundNotifyPlugin) diff --git a/ground/openpilotgcs/src/plugins/notify/notifyplugin.h b/ground/openpilotgcs/src/plugins/notify/notifyplugin.h index 0b7a31f3b..6a142ff03 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifyplugin.h +++ b/ground/openpilotgcs/src/plugins/notify/notifyplugin.h @@ -63,7 +63,7 @@ public: void shutdown(); - QList getListNotifications() { return lstNotifications; } + QList getListNotifications() { return _notificationList; } NotificationItem* getCurrentNotification(){ return ¤tNotification;} bool getEnableSound() const { return enableSound; } @@ -83,14 +83,12 @@ private slots: void connectNotifications(); void updateNotificationList(QList list); void resetNotification(void); - void appendNotification(UAVObject *object); - void repeatTimerHandler(void); - void expireTimerHandler(void); + void on_arrived_Notification(UAVObject *object); + void on_timerRepeated_Notification(void); + void on_expiredTimer_Notification(void); void stateChanged(Phonon::State newstate, Phonon::State oldstate); private: - - bool configured; // just for migration,delete later bool enableSound; QList< QList* > lstMediaSource; QStringList mediaSource; @@ -98,17 +96,17 @@ private: QSettings* settings; QList lstNotifiedUAVObjects; - QList lstNotifications; - QList pendingNotifications; - QList removedNotifies; + QList _notificationList; + QList _pendingNotifications; + QList _toRemoveNotifications; NotificationItem currentNotification; - NotificationItem* nowPlayingConfiguration; + NotificationItem* _nowPlayingNotification; - QString m_field; PhononObject phonon; - NotifyPluginOptionsPage *mop; + NotifyPluginOptionsPage* mop; TelemetryManager* telMngr; + QMutex _mutex; }; #endif // SOUNDNOTIFYPLUGIN_H diff --git a/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.cpp b/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.cpp index fdf0f5cc9..49b274e38 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.cpp +++ b/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.cpp @@ -57,11 +57,10 @@ NotifyPluginOptionsPage::NotifyPluginOptionsPage(QObject *parent) : IOptionsPage(parent) , _objManager(*ExtensionSystem::PluginManager::instance()->getObject()) , _owner(qobject_cast(parent)) - , _currentCollectionPath("") - , _valueRange(NULL) + , _dynamicFieldLimit(NULL) + , _dynamicFieldWidget(NULL) + , _dynamicFieldType(-1) , _sayOrder(NULL) - , _fieldValue(NULL) - , _fieldType(-1) , _form(NULL) , _selectedNotification(NULL) {} @@ -74,23 +73,21 @@ QWidget *NotifyPluginOptionsPage::createPage(QWidget *parent) _optionsPage.reset(new Ui::NotifyPluginOptionsPage()); //main widget QWidget* optionsPageWidget = new QWidget; - _fieldValue = NULL; - _valueRange = NULL; + _dynamicFieldWidget = NULL; + _dynamicFieldLimit = NULL; resetFieldType(); //save ref to form, needed for binding dynamic fields in future _form = optionsPageWidget; //main layout _optionsPage->setupUi(optionsPageWidget); - _listSoundFiles.clear(); - _optionsPage->SoundDirectoryPathChooser->setExpectedKind(Utils::PathChooser::Directory); _optionsPage->SoundDirectoryPathChooser->setPromptDialogTitle(tr("Choose sound collection directory")); connect(_optionsPage->SoundDirectoryPathChooser, SIGNAL(changed(const QString&)), - this, SLOT(on_buttonSoundFolder_clicked(const QString&))); + this, SLOT(on_clicked_buttonSoundFolder(const QString&))); connect(_optionsPage->SoundCollectionList, SIGNAL(currentIndexChanged (int)), - this, SLOT(on_soundLanguage_indexChanged(int))); + this, SLOT(on_changedIndex_soundLanguage(int))); connect(this, SIGNAL(updateNotifications(QList)), _owner, SLOT(updateNotificationList(QList))); @@ -100,8 +97,8 @@ QWidget *NotifyPluginOptionsPage::createPage(QWidget *parent) // [1] - _selectedNotification = _owner->getCurrentNotification(); - addDynamicValueLayout(); + setSelectedNotification(_owner->getCurrentNotification()); + addDynamicFieldLayout(); // [2] updateConfigView(_selectedNotification); @@ -109,7 +106,8 @@ QWidget *NotifyPluginOptionsPage::createPage(QWidget *parent) initButtons(); initPhononPlayer(); - _notifyRulesSelection->setCurrentIndex(_notifyRulesModel->index(0, 0, QModelIndex()), + int curr_row = _privListNotifications.indexOf(_selectedNotification); + _notifyRulesSelection->setCurrentIndex(_notifyRulesModel->index(curr_row, 0, QModelIndex()), QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows); return optionsPageWidget; @@ -125,151 +123,41 @@ void NotifyPluginOptionsPage::apply() void NotifyPluginOptionsPage::finish() { disconnect(_optionsPage->UAVObjectField, SIGNAL(currentIndexChanged(QString)), - this, SLOT(on_UAVField_indexChanged(QString))); + this, SLOT(on_changedIndex_UAVField(QString))); - disconnect(_notifySound.data(),SIGNAL(stateChanged(Phonon::State,Phonon::State)), - this,SLOT(on_changeButtonText(Phonon::State,Phonon::State))); - if (_notifySound) { - _notifySound->stop(); - _notifySound->clear(); + disconnect(_testSound.data(),SIGNAL(stateChanged(Phonon::State,Phonon::State)), + this,SLOT(on_changed_playButtonText(Phonon::State,Phonon::State))); + if (_testSound) { + _testSound->stop(); + _testSound->clear(); } } -void NotifyPluginOptionsPage::addDynamicValueLayout() -{ - NotificationItem* curr = _owner->getCurrentNotification(); - Q_ASSERT(curr); - _optionsPage->dynamicValueLayout->addWidget(new QLabel("Say order ", _form)); - - _sayOrder = new QComboBox(_form); - _optionsPage->dynamicValueLayout->addWidget(_sayOrder); - _sayOrder->addItems(NotificationItem::sayOrderValues); - - _optionsPage->dynamicValueLayout->addWidget(new QLabel("Value is ", _form)); - - UAVDataObject* obj = dynamic_cast(_objManager.getObject(curr->getDataObject())); - UAVObjectField* field = obj->getField(curr->getObjectField()); - Q_ASSERT(obj); - Q_ASSERT(field); - _valueRange = new QComboBox(_form); - _optionsPage->dynamicValueLayout->addWidget(_valueRange); - - addDynamicField(field); -} - -void NotifyPluginOptionsPage::resetValueRange() -{ - (static_cast(_fieldValue))->setInputMask("999.99 - 999.99;"); - (static_cast(_fieldValue))->setText("0000000000"); - (static_cast(_fieldValue))->setCursorPosition(0); -} - -void NotifyPluginOptionsPage::on_rangeValue_indexChanged(QString rangeStr) -{ - Q_ASSERT(_fieldValue); - UAVObjectField* field = getObjectFieldFromPage(); - Q_ASSERT(!!field); - setDynamicValueWidget(field); - setDynamicValueField(_selectedNotification); -} - -void NotifyPluginOptionsPage::resetFieldType() -{ - _fieldType = -1; -} - -void NotifyPluginOptionsPage::addDynamicField(UAVObjectField* objField) -{ - //qDebugNotify_ if (!objField || !parent) << "null input params"; - Q_ASSERT(objField); - if (objField->getType() == _fieldType) { - if (QComboBox* fieldValue = dynamic_cast(_fieldValue)) { - fieldValue->clear(); - QStringList enumValues(objField->getOptions()); - fieldValue->addItems(enumValues); - } - return; - } - - disconnect(_valueRange, SIGNAL(currentIndexChanged(QString)), - this, SLOT(on_rangeValue_indexChanged(QString))); - - _valueRange->clear(); - QStringList rangeValues; - if (UAVObjectField::ENUM == objField->getType()) { - rangeValues << cStrEqualTo << cStrInRange; - _valueRange->addItems(rangeValues); - _valueRange->setCurrentIndex(rangeValues.indexOf(_selectedNotification->range())); - - } else { - rangeValues << cStrEqualTo << cStrLargeThan << cStrLowerThan << cStrInRange; - _valueRange->addItems(rangeValues); - connect(_valueRange, SIGNAL(currentIndexChanged(QString)), - this, SLOT(on_rangeValue_indexChanged(QString))); - } - - setDynamicValueWidget(objField); -} - -void NotifyPluginOptionsPage::setDynamicValueWidget(UAVObjectField* objField) -{ - Q_ASSERT(_valueRange); - - // check if dynamic fileld already settled, - // so if its exists remove it and install new field - if (_fieldValue) { - _optionsPage->dynamicValueLayout->removeWidget(_fieldValue); - delete _fieldValue; - _fieldValue = NULL; - } - _fieldType = objField->getType(); - switch(_fieldType) - { - case UAVObjectField::ENUM: - { - _fieldValue = new QComboBox(_form); - QStringList enumValues(objField->getOptions()); - (dynamic_cast(_fieldValue))->addItems(enumValues); - } - break; - - default: - if (_valueRange->currentText() == cStrInRange) { - _fieldValue = new QLineEdit(_form); - resetValueRange(); - } else { - _fieldValue = new QSpinBox(_form); - } - break; - }; - _optionsPage->dynamicValueLayout->addWidget(_fieldValue); -} - void NotifyPluginOptionsPage::initButtons() { _optionsPage->chkEnableSound->setChecked(_owner->getEnableSound()); connect(_optionsPage->chkEnableSound, SIGNAL(toggled(bool)), - this, SLOT(on_checkEnableSound_toggled(bool))); + this, SLOT(on_toggled_checkEnableSound(bool))); _optionsPage->buttonModify->setEnabled(false); _optionsPage->buttonDelete->setEnabled(false); _optionsPage->buttonPlayNotification->setEnabled(false); connect(_optionsPage->buttonAdd, SIGNAL(pressed()), - this, SLOT(on_button_AddNotification_clicked())); + this, SLOT(on_clicked_buttonAddNotification())); connect(_optionsPage->buttonDelete, SIGNAL(pressed()), - this, SLOT(on_button_DeleteNotification_clicked())); + this, SLOT(on_clicked_buttonDeleteNotification())); connect(_optionsPage->buttonModify, SIGNAL(pressed()), - this, SLOT(on_button_ModifyNotification_clicked())); + this, SLOT(on_clicked_buttonModifyNotification())); connect(_optionsPage->buttonPlayNotification, SIGNAL(clicked()), - this, SLOT(on_button_TestSoundNotification_clicked())); + this, SLOT(on_clicked_buttonTestSoundNotification())); } void NotifyPluginOptionsPage::initPhononPlayer() { - _notifySound.reset(Phonon::createPlayer(Phonon::NotificationCategory)); - connect(_notifySound.data(),SIGNAL(stateChanged(Phonon::State,Phonon::State)), - this,SLOT(on_changeButtonText(Phonon::State,Phonon::State))); - connect(_notifySound.data(), SIGNAL(finished(void)), this, SLOT(on_FinishedPlaying(void))); + _testSound.reset(Phonon::createPlayer(Phonon::NotificationCategory)); + connect(_testSound.data(),SIGNAL(stateChanged(Phonon::State,Phonon::State)), + this,SLOT(on_changed_playButtonText(Phonon::State,Phonon::State))); + connect(_testSound.data(), SIGNAL(finished(void)), this, SLOT(on_FinishedPlaying(void))); } void NotifyPluginOptionsPage::initRulesTable() @@ -280,7 +168,7 @@ void NotifyPluginOptionsPage::initRulesTable() _notifyRulesSelection = new QItemSelectionModel(_notifyRulesModel.data()); connect(_notifyRulesSelection, SIGNAL(selectionChanged ( const QItemSelection &, const QItemSelection & )), - this, SLOT(on_table_changeSelection( const QItemSelection & , const QItemSelection & ))); + this, SLOT(on_changedSelection_notifyTable( const QItemSelection & , const QItemSelection & ))); connect(this, SIGNAL(entryUpdated(int)), _notifyRulesModel.data(), SLOT(entryUpdated(int))); @@ -299,6 +187,159 @@ void NotifyPluginOptionsPage::initRulesTable() _optionsPage->notifyRulesView->setDragDropMode(QAbstractItemView::InternalMove); } +UAVObjectField* NotifyPluginOptionsPage::getObjectFieldFromSelected() +{ + return (_currUAVObject) ? _currUAVObject->getField(_selectedNotification->getObjectField()) : NULL; +} + +void NotifyPluginOptionsPage::setSelectedNotification(NotificationItem* ntf) +{ + _selectedNotification = ntf; + _currUAVObject = dynamic_cast(_objManager.getObject(_selectedNotification->getDataObject())); + if(!_currUAVObject) { + qNotifyDebug() << "no such UAVObject: " << _selectedNotification->getDataObject(); + } +} + +void NotifyPluginOptionsPage::addDynamicFieldLayout() +{ + // there is no need to check (objField == NULL), + // thus it doesn't use in this field directly + + QSizePolicy labelSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + labelSizePolicy.setHorizontalStretch(0); + labelSizePolicy.setVerticalStretch(0); +// labelSizePolicy.setHeightForWidth(UAVObject->sizePolicy().hasHeightForWidth()); + + + QLabel* labelSayOrder = new QLabel("Say order ", _form); + labelSayOrder->setSizePolicy(labelSizePolicy); + + _optionsPage->dynamicValueLayout->addWidget(labelSayOrder); + _sayOrder = new QComboBox(_form); + _optionsPage->dynamicValueLayout->addWidget(_sayOrder); + _sayOrder->addItems(NotificationItem::sayOrderValues); + + QLabel* labelValueIs = new QLabel("Value is ", _form); + labelValueIs->setSizePolicy(labelSizePolicy); + _optionsPage->dynamicValueLayout->addWidget(labelValueIs); + + _dynamicFieldLimit = new QComboBox(_form); + _optionsPage->dynamicValueLayout->addWidget(_dynamicFieldLimit); + UAVObjectField* field = getObjectFieldFromSelected(); + addDynamicField(field); +} + +void NotifyPluginOptionsPage::addDynamicField(UAVObjectField* objField) +{ + if(!objField) { + qNotifyDebug() << "addDynamicField | input objField == NULL"; + return; + } + if (objField->getType() == _dynamicFieldType) { + if (QComboBox* fieldValue = dynamic_cast(_dynamicFieldWidget)) { + fieldValue->clear(); + QStringList enumValues(objField->getOptions()); + fieldValue->addItems(enumValues); + } + return; + } + + disconnect(_dynamicFieldLimit, SIGNAL(currentIndexChanged(QString)), + this, SLOT(on_changedIndex_rangeValue(QString))); + + _dynamicFieldLimit->clear(); + QStringList rangeValues; + if (UAVObjectField::ENUM == objField->getType()) { + rangeValues << cStrEqualTo << cStrInRange; + _dynamicFieldLimit->addItems(rangeValues); + _dynamicFieldLimit->setCurrentIndex(rangeValues.indexOf(_selectedNotification->range())); + + } else { + rangeValues << cStrEqualTo << cStrLargeThan << cStrLowerThan << cStrInRange; + _dynamicFieldLimit->addItems(rangeValues); + connect(_dynamicFieldLimit, SIGNAL(currentIndexChanged(QString)), + this, SLOT(on_changedIndex_rangeValue(QString))); + } + + addDynamicFieldWidget(objField); +} + +void NotifyPluginOptionsPage::addDynamicFieldWidget(UAVObjectField* objField) +{ + if(!objField) { + qNotifyDebug() << "objField == NULL!"; + return; + } + // check if dynamic fileld already settled, + // so if its exists remove it and install new field + if (_dynamicFieldWidget) { + _optionsPage->dynamicValueLayout->removeWidget(_dynamicFieldWidget); + delete _dynamicFieldWidget; + _dynamicFieldWidget = NULL; + } + + QSizePolicy sizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + sizePolicy.setHorizontalStretch(0); + sizePolicy.setVerticalStretch(0); + + _dynamicFieldType = objField->getType(); + switch(_dynamicFieldType) + { + case UAVObjectField::ENUM: + { + _dynamicFieldWidget = new QComboBox(_form); + QStringList enumValues(objField->getOptions()); + (dynamic_cast(_dynamicFieldWidget))->addItems(enumValues); + } + break; + + default: + Q_ASSERT(_dynamicFieldLimit); + if (_dynamicFieldLimit->currentText() == cStrInRange) { + _dynamicFieldWidget = new QLineEdit(_form); + + (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); + } + break; + }; + enum { eDynamicFieldWidth = 100 }; + _dynamicFieldWidget->setSizePolicy(sizePolicy); + _dynamicFieldWidget->setFixedWidth(eDynamicFieldWidth); + _optionsPage->dynamicValueLayout->addWidget(_dynamicFieldWidget); +} + +void NotifyPluginOptionsPage::setDynamicFieldValue(NotificationItem* notification) +{ + if (QDoubleSpinBox* seValue = dynamic_cast(_dynamicFieldWidget)) + seValue->setValue(notification->singleValue().toDouble()); + else { + if (QComboBox* cbValue = dynamic_cast(_dynamicFieldWidget)) { + int idx = cbValue->findText(notification->singleValue().toString()); + if(-1 != idx) + cbValue->setCurrentIndex(idx); + } else { + if (QLineEdit* rangeValue = dynamic_cast(_dynamicFieldWidget)) { + QString str = QString("%1%2").arg(notification->singleValue().toDouble(), 5, 'f', 2, '0') + .arg(notification->valueRange2(), 5, 'f', 2, '0'); + rangeValue->setText(str); + } else { + qNotifyDebug() << "NotifyPluginOptionsPage::setDynamicValueField | unknown _fieldValue: " << _dynamicFieldWidget; + } + } + } +} + +void NotifyPluginOptionsPage::resetFieldType() +{ + _dynamicFieldType = -1; +} + void NotifyPluginOptionsPage::getOptionsPageValues(NotificationItem* notification) { Q_ASSERT(notification); @@ -310,14 +351,14 @@ void NotifyPluginOptionsPage::getOptionsPageValues(NotificationItem* notificatio notification->setSound2(_optionsPage->Sound2->currentText()); notification->setSound3(_optionsPage->Sound3->currentText()); notification->setSayOrder(_sayOrder->currentText()); - notification->setRange(_valueRange->currentText()); - if (QSpinBox* spinValue = dynamic_cast(_fieldValue)) + notification->setRange(_dynamicFieldLimit->currentText()); + if (QDoubleSpinBox* spinValue = dynamic_cast(_dynamicFieldWidget)) notification->setSingleValue(spinValue->value()); else { - if (QComboBox* comboBoxValue = dynamic_cast(_fieldValue)) - notification->setSingleValue(comboBoxValue->currentIndex()); + if (QComboBox* comboBoxValue = dynamic_cast(_dynamicFieldWidget)) + notification->setSingleValue(comboBoxValue->currentText()); else { - if (QLineEdit* rangeValue = dynamic_cast(_fieldValue)) { + if (QLineEdit* rangeValue = dynamic_cast(_dynamicFieldWidget)) { QString str = rangeValue->text(); QStringList range = str.split('-'); notification->setSingleValue(range.at(0).toDouble()); @@ -327,113 +368,13 @@ void NotifyPluginOptionsPage::getOptionsPageValues(NotificationItem* notificatio } } -void NotifyPluginOptionsPage::on_UAVField_indexChanged(QString field) -{ - resetFieldType(); - UAVDataObject* obj = dynamic_cast( _objManager.getObject(_optionsPage->UAVObject->currentText())); - addDynamicField(obj->getField(field)); - -} - -void NotifyPluginOptionsPage::on_UAVObject_indexChanged(QString val) -{ - resetFieldType(); - UAVDataObject* obj = dynamic_cast( _objManager.getObject(val) ); - QList fieldList = obj->getFields(); - disconnect(_optionsPage->UAVObjectField, SIGNAL(currentIndexChanged(QString)), this, SLOT(on_UAVField_indexChanged(QString))); - _optionsPage->UAVObjectField->clear(); - foreach (UAVObjectField* field, fieldList) { - _optionsPage->UAVObjectField->addItem(field->getName()); - } - connect(_optionsPage->UAVObjectField, SIGNAL(currentIndexChanged(QString)), this, SLOT(on_UAVField_indexChanged(QString))); - addDynamicField(fieldList.at(0)); -} - -void NotifyPluginOptionsPage::on_buttonSoundFolder_clicked(const QString& path) -{ - QDir dirPath(path); - _listDirCollections = dirPath.entryList(QDir::AllDirs | QDir::NoDotAndDotDot); - _optionsPage->SoundCollectionList->clear(); - _optionsPage->SoundCollectionList->addItems(_listDirCollections); -} - -void NotifyPluginOptionsPage::on_soundLanguage_indexChanged(int index) -{ - _optionsPage->SoundCollectionList->setCurrentIndex(index); - _currentCollectionPath = _optionsPage->SoundDirectoryPathChooser->path() - + QDir::toNativeSeparators("/" + _optionsPage->SoundCollectionList->currentText()); - - QDir dirPath(_currentCollectionPath); - QStringList filters; - filters << "*.mp3" << "*.wav"; - dirPath.setNameFilters(filters); - _listSoundFiles = dirPath.entryList(filters); - _listSoundFiles.replaceInStrings(QRegExp(".mp3|.wav"), ""); - _optionsPage->Sound1->clear(); - _optionsPage->Sound2->clear(); - _optionsPage->Sound3->clear(); - _optionsPage->Sound1->addItems(_listSoundFiles); - _optionsPage->Sound2->addItem(""); - _optionsPage->Sound2->addItems(_listSoundFiles); - _optionsPage->Sound3->addItem(""); - _optionsPage->Sound3->addItems(_listSoundFiles); -} - -void NotifyPluginOptionsPage::on_changeButtonText(Phonon::State newstate, Phonon::State oldstate) -{ - //Q_ASSERT(Phonon::ErrorState != newstate); - - if (newstate == Phonon::PausedState || newstate == Phonon::StoppedState) { - _optionsPage->buttonPlayNotification->setText("Play"); - _optionsPage->buttonPlayNotification->setIcon(QPixmap(":/notify/images/play.png")); - } else { - if (newstate == Phonon::PlayingState) { - _optionsPage->buttonPlayNotification->setText("Stop"); - _optionsPage->buttonPlayNotification->setIcon(QPixmap(":/notify/images/stop.png")); - } - } -} - -void NotifyPluginOptionsPage::on_FinishedPlaying() -{ - _notifySound->clear(); -} - -void NotifyPluginOptionsPage::on_button_TestSoundNotification_clicked() -{ - NotificationItem* notification = NULL; - qNotifyDebug() << "on_buttonTestSoundNotification_clicked"; - Q_ASSERT(-1 != _notifyRulesSelection->currentIndex().row()); - _notifySound->clearQueue(); - notification = _privListNotifications.at(_notifyRulesSelection->currentIndex().row()); - QStringList sequence = notification->toSoundList(); - if (sequence.isEmpty()) { - qNotifyDebug() << "message sequense is empty!"; - return; - } - foreach(QString item, sequence) { - qNotifyDebug() << item; - _notifySound->enqueue(Phonon::MediaSource(item)); - } - _notifySound->play(); -} - -void NotifyPluginOptionsPage::on_checkEnableSound_toggled(bool state) -{ - bool state1 = 1^state; - - QList listOutputs = _notifySound->outputPaths(); - Phonon::AudioOutput * audioOutput = (Phonon::AudioOutput*)listOutputs.last().sink(); - audioOutput->setMuted(state1); -} - void NotifyPluginOptionsPage::updateConfigView(NotificationItem* notification) { Q_ASSERT(notification); disconnect(_optionsPage->UAVObject, SIGNAL(currentIndexChanged(QString)), - this, SLOT(on_UAVObject_indexChanged(QString))); + this, SLOT(on_changedIndex_UAVObject(QString))); disconnect(_optionsPage->UAVObjectField, SIGNAL(currentIndexChanged(QString)), - this, SLOT(on_UAVField_indexChanged(QString))); + this, SLOT(on_changedIndex_UAVField(QString))); QString path = notification->getSoundCollectionPath(); if (path.isEmpty()) { @@ -461,13 +402,10 @@ void NotifyPluginOptionsPage::updateConfigView(NotificationItem* notification) } _optionsPage->UAVObjectField->clear(); - QString uavDataObject = notification->getDataObject(); - UAVDataObject* obj = dynamic_cast(_objManager.getObject(uavDataObject)); - if (obj != NULL ) { - QList fieldList = obj->getFields(); - foreach (UAVObjectField* field, fieldList) { + if(_currUAVObject) { + QList fieldList = _currUAVObject->getFields(); + foreach (UAVObjectField* field, fieldList) _optionsPage->UAVObjectField->addItem(field->getName()); - } } if (-1 != _optionsPage->UAVObjectField->findText(notification->getObjectField())) { @@ -498,63 +436,105 @@ void NotifyPluginOptionsPage::updateConfigView(NotificationItem* notification) _optionsPage->Sound3->setCurrentIndex(_optionsPage->Sound3->findText(notification->getSound3())); } - if (-1 != _valueRange->findText(notification->range())) { - _valueRange->setCurrentIndex(_valueRange->findText(notification->range())); + if (-1 != _dynamicFieldLimit->findText(notification->range())) { + _dynamicFieldLimit->setCurrentIndex(_dynamicFieldLimit->findText(notification->range())); } if (-1 != _sayOrder->findText(notification->getSayOrder())) { _sayOrder->setCurrentIndex(_sayOrder->findText(notification->getSayOrder())); } - setDynamicValueField(notification); + setDynamicFieldValue(notification); connect(_optionsPage->UAVObject, SIGNAL(currentIndexChanged(QString)), - this, SLOT(on_UAVObject_indexChanged(QString))); + this, SLOT(on_changedIndex_UAVObject(QString))); connect(_optionsPage->UAVObjectField, SIGNAL(currentIndexChanged(QString)), - this, SLOT(on_UAVField_indexChanged(QString))); + this, SLOT(on_changedIndex_UAVField(QString))); } -void NotifyPluginOptionsPage::setDynamicValueField(NotificationItem* notification) +void NotifyPluginOptionsPage::on_changedIndex_rangeValue(QString rangeStr) { - if (QSpinBox* spinValue = dynamic_cast(_fieldValue)) - spinValue->setValue(notification->singleValue()); - else { - if (QComboBox* comboBoxValue = dynamic_cast(_fieldValue)) - comboBoxValue->setCurrentIndex(notification->singleValue()); - else { - if (QLineEdit* rangeValue = dynamic_cast(_fieldValue)) { - //resetValueRange(); - QString str = QString("%1%2").arg(notification->singleValue(), 5, 'f', 2, '0') - .arg(notification->valueRange2(), 5, 'f', 2, '0'); - rangeValue->setText(str); - } else { - qNotifyDebug() << "NotifyPluginOptionsPage::setDynamicValueField | unknown _fieldValue: " << _fieldValue; - } + Q_ASSERT(_dynamicFieldWidget); + UAVObjectField* field = getObjectFieldFromSelected(); + Q_ASSERT(!!field); + addDynamicFieldWidget(field); + setDynamicFieldValue(_selectedNotification); +} + +void NotifyPluginOptionsPage::on_changedIndex_UAVField(QString field) +{ + resetFieldType(); + Q_ASSERT(_currUAVObject); + addDynamicField(_currUAVObject->getField(field)); + +} + +void NotifyPluginOptionsPage::on_changedIndex_UAVObject(QString val) +{ + resetFieldType(); + _currUAVObject = dynamic_cast( _objManager.getObject(val) ); + if(!_currUAVObject) { + qNotifyDebug() << "on_UAVObject_indexChanged | no such UAVOBject"; + return; + } + QList fieldList = _currUAVObject->getFields(); + disconnect(_optionsPage->UAVObjectField, SIGNAL(currentIndexChanged(QString)), this, SLOT(on_changedIndex_UAVField(QString))); + _optionsPage->UAVObjectField->clear(); + foreach (UAVObjectField* field, fieldList) { + _optionsPage->UAVObjectField->addItem(field->getName()); + } + connect(_optionsPage->UAVObjectField, SIGNAL(currentIndexChanged(QString)), this, SLOT(on_changedIndex_UAVField(QString))); + _selectedNotification->setObjectField(fieldList.at(0)->getName()); + addDynamicField(fieldList.at(0)); +} + + +void NotifyPluginOptionsPage::on_changedIndex_soundLanguage(int index) +{ + _optionsPage->SoundCollectionList->setCurrentIndex(index); + QString collectionPath = _optionsPage->SoundDirectoryPathChooser->path() + + QDir::toNativeSeparators("/" + _optionsPage->SoundCollectionList->currentText()); + + QDir dirPath(collectionPath); + QStringList filters; + filters << "*.mp3" << "*.wav"; + dirPath.setNameFilters(filters); + QStringList listSoundFiles = dirPath.entryList(filters); + listSoundFiles.replaceInStrings(QRegExp(".mp3|.wav"), ""); + _optionsPage->Sound1->clear(); + _optionsPage->Sound2->clear(); + _optionsPage->Sound3->clear(); + _optionsPage->Sound1->addItems(listSoundFiles); + _optionsPage->Sound2->addItem(""); + _optionsPage->Sound2->addItems(listSoundFiles); + _optionsPage->Sound3->addItem(""); + _optionsPage->Sound3->addItems(listSoundFiles); +} + + +void NotifyPluginOptionsPage::on_changed_playButtonText(Phonon::State newstate, Phonon::State oldstate) +{ + //Q_ASSERT(Phonon::ErrorState != newstate); + + if (newstate == Phonon::PausedState || newstate == Phonon::StoppedState) { + _optionsPage->buttonPlayNotification->setText("Play"); + _optionsPage->buttonPlayNotification->setIcon(QPixmap(":/notify/images/play.png")); + } else { + if (newstate == Phonon::PlayingState) { + _optionsPage->buttonPlayNotification->setText("Stop"); + _optionsPage->buttonPlayNotification->setIcon(QPixmap(":/notify/images/stop.png")); } } } -UAVObjectField* NotifyPluginOptionsPage::getObjectFieldFromPage() -{ - UAVDataObject* obj = dynamic_cast( _objManager.getObject(_optionsPage->UAVObject->currentText())); - return obj->getField(_optionsPage->UAVObjectField->currentText()); -} - - -UAVObjectField* NotifyPluginOptionsPage::getObjectFieldFromSelected() -{ - UAVDataObject* obj = dynamic_cast(_objManager.getObject(_selectedNotification->getDataObject())); - return obj->getField(_selectedNotification->getObjectField()); -} - -void NotifyPluginOptionsPage::on_table_changeSelection( const QItemSelection & selected, const QItemSelection & deselected ) +void NotifyPluginOptionsPage::on_changedSelection_notifyTable(const QItemSelection & selected, const QItemSelection & deselected ) { bool select = false; - _notifySound->stop(); + _testSound->stop(); if (selected.indexes().size()) { select = true; - _selectedNotification = _privListNotifications.at(selected.indexes().at(0).row()); + setSelectedNotification(_privListNotifications.at(selected.indexes().at(0).row())); UAVObjectField* field = getObjectFieldFromSelected(); addDynamicField(field); updateConfigView(_selectedNotification); @@ -565,7 +545,34 @@ void NotifyPluginOptionsPage::on_table_changeSelection( const QItemSelection & s _optionsPage->buttonPlayNotification->setEnabled(select); } -void NotifyPluginOptionsPage::on_button_AddNotification_clicked() +void NotifyPluginOptionsPage::on_clicked_buttonSoundFolder(const QString& path) +{ + QDir dirPath(path); + QStringList listDirCollections = dirPath.entryList(QDir::AllDirs | QDir::NoDotAndDotDot); + _optionsPage->SoundCollectionList->clear(); + _optionsPage->SoundCollectionList->addItems(listDirCollections); +} + +void NotifyPluginOptionsPage::on_clicked_buttonTestSoundNotification() +{ + NotificationItem* notification = NULL; + qNotifyDebug() << "on_buttonTestSoundNotification_clicked"; + Q_ASSERT(-1 != _notifyRulesSelection->currentIndex().row()); + _testSound->clearQueue(); + notification = _privListNotifications.at(_notifyRulesSelection->currentIndex().row()); + QStringList sequence = notification->toSoundList(); + if (sequence.isEmpty()) { + qNotifyDebug() << "message sequense is empty!"; + return; + } + foreach(QString item, sequence) { + qNotifyDebug() << item; + _testSound->enqueue(Phonon::MediaSource(item)); + } + _testSound->play(); +} + +void NotifyPluginOptionsPage::on_clicked_buttonAddNotification() { NotificationItem* notification = new NotificationItem; @@ -574,27 +581,15 @@ void NotifyPluginOptionsPage::on_button_AddNotification_clicked() textPalette.setColor(QPalette::Normal,QPalette::Text, Qt::red); _optionsPage->SoundDirectoryPathChooser->setPalette(textPalette); _optionsPage->SoundDirectoryPathChooser->setPath("please select sound collection folder"); + delete notification; return; } + getOptionsPageValues(notification); - notification->setSoundCollectionPath(_optionsPage->SoundDirectoryPathChooser->path()); - notification->setCurrentLanguage(_optionsPage->SoundCollectionList->currentText()); - notification->setDataObject(_optionsPage->UAVObject->currentText()); - notification->setObjectField(_optionsPage->UAVObjectField->currentText()); - notification->setRange(_valueRange->currentText()); - - if (QSpinBox* spinValue = dynamic_cast(_fieldValue)) - notification->setSingleValue(spinValue->value()); - - if (_optionsPage->Sound1->currentText().size() > 0) - notification->setSound1(_optionsPage->Sound1->currentText()); - - notification->setSound2(_optionsPage->Sound2->currentText()); - notification->setSound3(_optionsPage->Sound3->currentText()); - - if ( ((!_optionsPage->Sound2->currentText().size()) && (_sayOrder->currentText()=="After second")) - || ((!_optionsPage->Sound3->currentText().size()) && (_sayOrder->currentText()=="After third")) ) { - return; + if ( ((!_optionsPage->Sound2->currentText().isEmpty()) && (_sayOrder->currentText()=="After second")) + || ((!_optionsPage->Sound3->currentText().isEmpty()) && (_sayOrder->currentText()=="After third")) ) { + delete notification; + return; } else { notification->setSayOrder(_sayOrder->currentText()); } @@ -604,7 +599,7 @@ void NotifyPluginOptionsPage::on_button_AddNotification_clicked() QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows); } -void NotifyPluginOptionsPage::on_button_DeleteNotification_clicked() +void NotifyPluginOptionsPage::on_clicked_buttonDeleteNotification() { _notifyRulesModel->removeRow(_notifyRulesSelection->currentIndex().row()); if (!_notifyRulesModel->rowCount() @@ -617,7 +612,7 @@ void NotifyPluginOptionsPage::on_button_DeleteNotification_clicked() } } -void NotifyPluginOptionsPage::on_button_ModifyNotification_clicked() +void NotifyPluginOptionsPage::on_clicked_buttonModifyNotification() { NotificationItem* notification = new NotificationItem; getOptionsPageValues(notification); @@ -628,3 +623,17 @@ void NotifyPluginOptionsPage::on_button_ModifyNotification_clicked() _privListNotifications.replace(_notifyRulesSelection->currentIndex().row(),notification); entryUpdated(_notifyRulesSelection->currentIndex().row()); } + +void NotifyPluginOptionsPage::on_FinishedPlaying() +{ + _testSound->clear(); +} + +void NotifyPluginOptionsPage::on_toggled_checkEnableSound(bool state) +{ + bool state1 = 1^state; + + QList listOutputs = _testSound->outputPaths(); + Phonon::AudioOutput * audioOutput = (Phonon::AudioOutput*)listOutputs.last().sink(); + audioOutput->setMuted(state1); +} diff --git a/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.h b/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.h index 3f36f3f4d..b270e72a0 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.h +++ b/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.h @@ -73,33 +73,28 @@ public: void finish(); void restoreFromSettings(); - void updateConfigView(NotificationItem* notification); - void getOptionsPageValues(NotificationItem* notification); - UAVObjectField* getObjectFieldFromPage(); - UAVObjectField* getObjectFieldFromSelected(); - signals: void updateNotifications(QList list); void entryUpdated(int index); private slots: - void on_button_TestSoundNotification_clicked(); - void on_button_AddNotification_clicked(); - void on_button_DeleteNotification_clicked(); - void on_button_ModifyNotification_clicked(); + void on_clicked_buttonTestSoundNotification(); + void on_clicked_buttonAddNotification(); + void on_clicked_buttonDeleteNotification(); + void on_clicked_buttonModifyNotification(); /** * We can use continuous selection, to select simultaneously * multiple rows to move them(using drag & drop) inside table ranges. */ - void on_table_changeSelection( const QItemSelection & selected, const QItemSelection & deselected ); + void on_changedSelection_notifyTable( const QItemSelection & selected, const QItemSelection & deselected ); - void on_soundLanguage_indexChanged(int index); - void on_buttonSoundFolder_clicked(const QString& path); - void on_UAVObject_indexChanged(QString val); - void on_UAVField_indexChanged(QString val); - void on_changeButtonText(Phonon::State newstate, Phonon::State oldstate); - void on_checkEnableSound_toggled(bool state); + void on_changedIndex_soundLanguage(int index); + void on_clicked_buttonSoundFolder(const QString& path); + void on_changedIndex_UAVObject(QString val); + void on_changedIndex_UAVField(QString val); + void on_changed_playButtonText(Phonon::State newstate, Phonon::State oldstate); + void on_toggled_checkEnableSound(bool state); /** * Important when we change to or from "In range" value @@ -107,7 +102,7 @@ private slots: * we need to change UI to show edit line, * to have possibility assign range limits for value. */ - void on_rangeValue_indexChanged(QString); + void on_changedIndex_rangeValue(QString); void on_FinishedPlaying(void); @@ -115,29 +110,31 @@ private slots: private: Q_DISABLE_COPY(NotifyPluginOptionsPage) - void resetValueRange(); - void resetFieldType(); - - void setDynamicValueField(NotificationItem* notification); - void addDynamicField(UAVObjectField* objField); - void addDynamicValueLayout(); - void setDynamicValueWidget(UAVObjectField* objField); - void initButtons(); void initPhononPlayer(); void initRulesTable(); + void setSelectedNotification(NotificationItem* ntf); + void resetValueRange(); + void resetFieldType(); + + void updateConfigView(NotificationItem* notification); + void getOptionsPageValues(NotificationItem* notification); + UAVObjectField* getObjectFieldFromPage(); + UAVObjectField* getObjectFieldFromSelected(); + + void addDynamicFieldLayout(); + void addDynamicField(UAVObjectField* objField); + void addDynamicFieldWidget(UAVObjectField* objField); + void setDynamicFieldValue(NotificationItem* notification); + private: UAVObjectManager& _objManager; SoundNotifyPlugin* _owner; - QStringList _listDirCollections; - QStringList _listSoundFiles; - QString _currentCollectionPath; - Phonon::MediaObject* _sound1; - Phonon::MediaObject* _sound2; - QScopedPointer _notifySound; - Phonon::AudioOutput* _audioOutput; + + //! Media object uses to test sound playing + QScopedPointer _testSound; QScopedPointer _notifyRulesModel; QItemSelectionModel* _notifyRulesSelection; @@ -154,34 +151,36 @@ private: QScopedPointer _optionsPage; - //! widget to convinient selection of condition for field value (equal, lower, greater) - QComboBox* _valueRange; + //! Widget to convinient selection of condition for field value (equal, lower, greater) + QComboBox* _dynamicFieldLimit; - //! widget to convinient selection of order in which sounds will be played + //! Represents edit widget for dynamic UAVObjectfield, + //! can be spinbox - for numerics, combobox - enums, or + //! lineedit - for numerics with range constraints + QWidget* _dynamicFieldWidget; + + //! Type of UAVObjectField - numeric or ENUM, + //! this variable needs to correctly set appropriate dynamic UI element (_dynamicFieldWidget) + //! NOTE: ocassionaly it should be invalidated (= -1) to reset _dynamicFieldWidget + int _dynamicFieldType; + + //! Widget to convinient selection of position of + //! between sounds[1..3] QComboBox* _sayOrder; - //! widget to represent edit widget for UAVObjectfield, - //! can be spinbox - for numerics, combobox - enums, or - //! lineedit - for range limits - QWidget* _fieldValue; - - //! type of UAVObjectField - numeric or ENUM - //! this variable needs to correctly set dynamic UI elemen _fieldValue - //! NOTE: ocassionaly it should be invalidated (= -1) to reset _fieldValue - int _fieldType; - - //! actualy reference to optionsPageWidget, + //! Actualy reference to optionsPageWidget, //! we MUST hold it beyond the scope of createPage func //! to have possibility change dynamic parts of options page layout in future QWidget* _form; - //! needs to correctly update UI during transitions from "In Range" to other - //! _valueRange entries and back direction as well - QString _prevRangeValue; - //! Currently selected notification, all controls filled accroding to it. //! On options page startup, always points to first row. NotificationItem* _selectedNotification; + + //! Retrieved from UAVObjectManager by name from _selectedNotification, + //! if UAVObjectManager doesn't have such object, this field will be NULL + UAVDataObject* _currUAVObject; + }; #endif // NOTIFYPLUGINOPTIONSPAGE_H diff --git a/ground/openpilotgcs/src/plugins/notify/notifytablemodel.cpp b/ground/openpilotgcs/src/plugins/notify/notifytablemodel.cpp index b1fd1c737..ed4eb0e56 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifytablemodel.cpp +++ b/ground/openpilotgcs/src/plugins/notify/notifytablemodel.cpp @@ -45,19 +45,19 @@ bool NotifyTableModel::setData(const QModelIndex &index, const QVariant &value, int role) { if (index.isValid() && role == Qt::DisplayRole) { - if(eMessageName == index.column()) { + if (eMessageName == index.column()) { emit dataChanged(index, index); return true; } } if (index.isValid() && role == Qt::EditRole) { - if(eRepeatValue == index.column()) + if (eRepeatValue == index.column()) _list.at(index.row())->setRetryString(value.toString()); else { - if(eExpireTimer == index.column()) + if (eExpireTimer == index.column()) _list.at(index.row())->setLifetime(value.toInt()); else { - if(eTurnOn == index.column()) + if (eTurnOn == index.column()) _list.at(index.row())->setMute(value.toBool()); } } @@ -114,7 +114,7 @@ QVariant NotifyTableModel::headerData(int section, Qt::Orientation orientation, if (orientation == Qt::Horizontal) return _headerStrings.at(section); else - if(orientation == Qt::Vertical) + if (orientation == Qt::Vertical) return QString("%1").arg(section); return QVariant(); @@ -141,7 +141,7 @@ bool NotifyTableModel::removeRows(int position, int rows, const QModelIndex& ind { Q_UNUSED(index); - if((-1 == position) || (-1 == rows) ) + if ((-1 == position) || (-1 == rows) ) return false; beginRemoveRows(QModelIndex(), position, position + rows - 1); @@ -201,7 +201,7 @@ bool NotifyTableModel::dropMimeData( const QMimeData * data, Qt::DropAction acti beginRow = rowCount(QModelIndex()); } - if(-1 == beginRow) + if (-1 == beginRow) return false; QByteArray encodedData = data->data(mime_type_notify_table); @@ -217,15 +217,18 @@ bool NotifyTableModel::dropMimeData( const QMimeData * data, Qt::DropAction acti // or from bottom rows to top rows (UP_DIRECTION) enum { UP_DIRECTION, DOWN_DIRECTION }; int direction = (dragged < rows) ? DOWN_DIRECTION : (dragged += 1, UP_DIRECTION); - Q_ASSERT(insertRows(rows + direction, 1, QModelIndex())); - if(-1 == dragged || rows >= _list.size() || dragged == rows) { + // check drop bounds + if (dragged < 0 || ((dragged + 1) >= _list.size() && direction == DOWN_DIRECTION) || dragged == rows) { qNotifyDebug() << "no such item"; - - return false; + continue; } + // addiional check in case dropping of multiple rows + if(rows + direction > _list.size()) continue; + + Q_ASSERT(insertRows(rows + direction, 1, QModelIndex())); _list.replace(rows + direction, item); Q_ASSERT(removeRows(dragged, 1, QModelIndex())); - if(direction == UP_DIRECTION) + if (direction == UP_DIRECTION) ++rows; }; From a8dbeb2c914da3958564ae284a805f77d324d4e3 Mon Sep 17 00:00:00 2001 From: zedamota Date: Fri, 11 Nov 2011 23:09:44 +0000 Subject: [PATCH 010/121] Make the GCS serial telemetry speed configurable --- .../serialconnection/serialconnection.pro | 14 +-- .../plugins/serialconnection/serialplugin.cpp | 42 +++++++- .../plugins/serialconnection/serialplugin.h | 10 +- .../serialpluginconfiguration.cpp | 79 ++++++++++++++ .../serialpluginconfiguration.h | 58 ++++++++++ .../serialconnection/serialpluginoptions.ui | 100 ++++++++++++++++++ .../serialpluginoptionspage.cpp | 71 +++++++++++++ .../serialpluginoptionspage.h | 71 +++++++++++++ 8 files changed, 434 insertions(+), 11 deletions(-) create mode 100644 ground/openpilotgcs/src/plugins/serialconnection/serialpluginconfiguration.cpp create mode 100644 ground/openpilotgcs/src/plugins/serialconnection/serialpluginconfiguration.h create mode 100644 ground/openpilotgcs/src/plugins/serialconnection/serialpluginoptions.ui create mode 100644 ground/openpilotgcs/src/plugins/serialconnection/serialpluginoptionspage.cpp create mode 100644 ground/openpilotgcs/src/plugins/serialconnection/serialpluginoptionspage.h diff --git a/ground/openpilotgcs/src/plugins/serialconnection/serialconnection.pro b/ground/openpilotgcs/src/plugins/serialconnection/serialconnection.pro index 057c1f249..1c2f0fcf8 100644 --- a/ground/openpilotgcs/src/plugins/serialconnection/serialconnection.pro +++ b/ground/openpilotgcs/src/plugins/serialconnection/serialconnection.pro @@ -3,11 +3,13 @@ TARGET = Serial include(../../openpilotgcsplugin.pri) include(serial_dependencies.pri) INCLUDEPATH += ../../libs/qextserialport/src -HEADERS += serialplugin.h -#HEADERS += serialplugin.h \ -# serial_global.h -SOURCES += serialplugin.cpp -FORMS += +HEADERS += serialplugin.h \ + serialpluginconfiguration.h \ + serialpluginoptionspage.h +SOURCES += serialplugin.cpp \ + serialpluginconfiguration.cpp \ + serialpluginoptionspage.cpp +FORMS += \ + serialpluginoptions.ui RESOURCES += -#DEFINES += SERIAL_LIBRARY OTHER_FILES += Serial.pluginspec diff --git a/ground/openpilotgcs/src/plugins/serialconnection/serialplugin.cpp b/ground/openpilotgcs/src/plugins/serialconnection/serialplugin.cpp index e62afb44a..bae5a885a 100644 --- a/ground/openpilotgcs/src/plugins/serialconnection/serialplugin.cpp +++ b/ground/openpilotgcs/src/plugins/serialconnection/serialplugin.cpp @@ -76,6 +76,11 @@ SerialConnection::SerialConnection() : enablePolling(true), m_enumerateThread(this) { serialHandle = NULL; + m_config = new SerialPluginConfiguration("Serial Telemetry", NULL, this); + m_config->restoresettings(); + + m_optionspage = new SerialPluginOptionsPage(m_config,this); + // Experimental: enable polling on all OS'es since there // were reports that autodetect does not work on XP amongst @@ -142,7 +147,7 @@ QIODevice *SerialConnection::openDevice(const QString &deviceName) { //we need to handle port settings here... PortSettings set; - set.BaudRate = BAUD57600; + set.BaudRate = stringToBaud(m_config->speed()); set.DataBits = DATA_8; set.Parity = PAR_NONE; set.StopBits = STOP_1; @@ -198,6 +203,31 @@ void SerialConnection::resumePolling() enablePolling = true; } +BaudRateType SerialConnection::stringToBaud(QString str) +{ + if(str=="1200") + return BAUD1200; + else if(str=="2400") + return BAUD1200; + else if(str== "4800") + return BAUD2400; + else if(str== "9600") + return BAUD9600; + else if(str== "19200") + return BAUD19200; + else if(str== "38400") + return BAUD38400; + else if(str== "57600") + return BAUD56000; + else if(str== "115200") + return BAUD115200; + else if(str== "230400") + return BAUD230400; + else if(str== "460800") + return BAUD460800; + else if(str== "921600") + return BAUD921600; +} SerialPlugin::SerialPlugin() { @@ -205,19 +235,23 @@ SerialPlugin::SerialPlugin() SerialPlugin::~SerialPlugin() { - + removeObject(m_connection->Optionspage()); } void SerialPlugin::extensionsInitialized() { - addAutoReleasedObject(new SerialConnection); + addAutoReleasedObject(m_connection); } bool SerialPlugin::initialize(const QStringList &arguments, QString *errorString) { Q_UNUSED(arguments); Q_UNUSED(errorString); - + m_connection = new SerialConnection(); + //must manage this registration of child object ourselves + //if we use an autorelease here it causes the GCS to crash + //as it is deleting objects as the app closes... + addObject(m_connection->Optionspage()); return true; } diff --git a/ground/openpilotgcs/src/plugins/serialconnection/serialplugin.h b/ground/openpilotgcs/src/plugins/serialconnection/serialplugin.h index 829ee6512..388117ead 100644 --- a/ground/openpilotgcs/src/plugins/serialconnection/serialplugin.h +++ b/ground/openpilotgcs/src/plugins/serialconnection/serialplugin.h @@ -33,6 +33,8 @@ #include #include "coreplugin/iconnection.h" #include +#include "serialpluginconfiguration.h" +#include "serialpluginoptionspage.h" #include class IConnection; @@ -87,12 +89,16 @@ public: virtual void resumePolling(); bool deviceOpened() {return m_deviceOpened;} + SerialPluginConfiguration * Config() const { return m_config; } + SerialPluginOptionsPage * Optionspage() const { return m_optionspage; } private: QextSerialPort* serialHandle; bool enablePolling; - + SerialPluginConfiguration *m_config; + SerialPluginOptionsPage *m_optionspage; + BaudRateType stringToBaud(QString str); protected slots: void onEnumerationChanged(); @@ -116,6 +122,8 @@ public: virtual bool initialize(const QStringList &arguments, QString *error_message); virtual void extensionsInitialized(); +private: + SerialConnection *m_connection; }; diff --git a/ground/openpilotgcs/src/plugins/serialconnection/serialpluginconfiguration.cpp b/ground/openpilotgcs/src/plugins/serialconnection/serialpluginconfiguration.cpp new file mode 100644 index 000000000..49bcf2ae8 --- /dev/null +++ b/ground/openpilotgcs/src/plugins/serialconnection/serialpluginconfiguration.cpp @@ -0,0 +1,79 @@ +/** + ****************************************************************************** + * + * @file dialpluginconfiguration.cpp + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. + * @see The GNU Public License (GPL) Version 3 + * @addtogroup GCSPlugins GCS Plugins + * @{ + * @addtogroup DialPlugin Dial Plugin + * @{ + * @brief Plots flight information rotary style dials + *****************************************************************************/ +/* + * 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 + */ + +#include "serialpluginconfiguration.h" +#include "utils/pathutils.h" +#include + +/** + * Loads a saved configuration or defaults if non exist. + * + */ +SerialPluginConfiguration::SerialPluginConfiguration(QString classId, QSettings* qSettings, QObject *parent) : + IUAVGadgetConfiguration(classId, parent), + m_speed("57600") +{ + settings = Core::ICore::instance()->settings(); +} + +/** + * Clones a configuration. + * + */ +IUAVGadgetConfiguration *SerialPluginConfiguration::clone() +{ + SerialPluginConfiguration *m = new SerialPluginConfiguration(this->classId()); + m->m_speed=m_speed; + return m; +} + +/** + * Saves a configuration. + * + */ +void SerialPluginConfiguration::saveConfig(QSettings* settings) const { + settings->setValue("speed", m_speed); +} +void SerialPluginConfiguration::restoresettings() +{ + settings->beginGroup(QLatin1String("SerialConnection")); + + QString str=(settings->value(QLatin1String("speed"), tr("")).toString()); + if(str.isEmpty()) + m_speed="57600"; + else + m_speed=str; + settings->endGroup(); + +} +void SerialPluginConfiguration::savesettings() const +{ + settings->beginGroup(QLatin1String("SerialConnection")); + settings->setValue(QLatin1String("speed"), m_speed); + settings->endGroup(); +} diff --git a/ground/openpilotgcs/src/plugins/serialconnection/serialpluginconfiguration.h b/ground/openpilotgcs/src/plugins/serialconnection/serialpluginconfiguration.h new file mode 100644 index 000000000..968595fb2 --- /dev/null +++ b/ground/openpilotgcs/src/plugins/serialconnection/serialpluginconfiguration.h @@ -0,0 +1,58 @@ +/** + ****************************************************************************** + * + * @file serialpluginconfiguration.h + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. + * @see The GNU Public License (GPL) Version 3 + * @addtogroup GCSPlugins GCS Plugins + * @{ + * @addtogroup SerialPlugin Serial Plugin + * @{ + * @brief Plots flight information rotary style Serials + *****************************************************************************/ +/* + * 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 + */ + +#ifndef SERIALPLUGINCONFIGURATION_H +#define SERIALPLUGINCONFIGURATION_H + +#include + +using namespace Core; + +/* Despite its name, this is actually a generic analog Serial + supporting up to two rotating "needle" indicators. + */ +class SerialPluginConfiguration : public IUAVGadgetConfiguration +{ +Q_OBJECT +public: + explicit SerialPluginConfiguration(QString classId, QSettings* qSettings = 0, QObject *parent = 0); + QString speed() {return m_speed;} + void saveConfig(QSettings* settings) const; + IUAVGadgetConfiguration *clone(); + void savesettings() const; + void restoresettings(); + +private: + QString m_speed; + QSettings* settings; +public slots: + void setSpeed(QString speed) { m_speed = speed; } + +}; + +#endif // SERIALPLUGINCONFIGURATION_H diff --git a/ground/openpilotgcs/src/plugins/serialconnection/serialpluginoptions.ui b/ground/openpilotgcs/src/plugins/serialconnection/serialpluginoptions.ui new file mode 100644 index 000000000..04f9faf06 --- /dev/null +++ b/ground/openpilotgcs/src/plugins/serialconnection/serialpluginoptions.ui @@ -0,0 +1,100 @@ + + + SerialPluginOptionsPage + + + + 0 + 0 + 400 + 300 + + + + Form + + + + + + Serial telemetry speed: + + + + + + + + 1200 + + + + + 2400 + + + + + 4800 + + + + + 9600 + + + + + 19200 + + + + + 38400 + + + + + 57600 + + + + + 115200 + + + + + 230400 + + + + + 460800 + + + + + 921600 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + diff --git a/ground/openpilotgcs/src/plugins/serialconnection/serialpluginoptionspage.cpp b/ground/openpilotgcs/src/plugins/serialconnection/serialpluginoptionspage.cpp new file mode 100644 index 000000000..b861a5cee --- /dev/null +++ b/ground/openpilotgcs/src/plugins/serialconnection/serialpluginoptionspage.cpp @@ -0,0 +1,71 @@ +/** + ****************************************************************************** + * + * @file dialpluginoptionspage.cpp + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. + * @see The GNU Public License (GPL) Version 3 + * @addtogroup GCSPlugins GCS Plugins + * @{ + * @addtogroup DialPlugin Dial Plugin + * @{ + * @brief Plots flight information rotary style dials + *****************************************************************************/ +/* + * 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 + */ + +#include "serialpluginoptionspage.h" +#include "serialpluginconfiguration.h" +#include "ui_serialpluginoptions.h" +#include "extensionsystem/pluginmanager.h" + +SerialPluginOptionsPage::SerialPluginOptionsPage(SerialPluginConfiguration *config, QObject *parent) : + IOptionsPage(parent), + m_config(config) +{ +} + +//creates options page widget (uses the UI file) +QWidget *SerialPluginOptionsPage::createPage(QWidget *parent) +{ + + Q_UNUSED(parent); + options_page = new Ui::SerialPluginOptionsPage(); + //main widget + QWidget *optionsPageWidget = new QWidget; + //main layout + options_page->setupUi(optionsPageWidget); + options_page->cb_speed->setCurrentIndex(options_page->cb_speed->findText(m_config->speed())); + return optionsPageWidget; +} + +/** + * Called when the user presses apply or OK. + * + * Saves the current values + * + */ +void SerialPluginOptionsPage::apply() +{ + m_config->setSpeed(options_page->cb_speed->currentText()); + m_config->savesettings(); +} + + + +void SerialPluginOptionsPage::finish() +{ + delete m_config; +} diff --git a/ground/openpilotgcs/src/plugins/serialconnection/serialpluginoptionspage.h b/ground/openpilotgcs/src/plugins/serialconnection/serialpluginoptionspage.h new file mode 100644 index 000000000..97ea604c8 --- /dev/null +++ b/ground/openpilotgcs/src/plugins/serialconnection/serialpluginoptionspage.h @@ -0,0 +1,71 @@ +/** + ****************************************************************************** + * + * @file Serialpluginoptionspage.h + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. + * @see The GNU Public License (GPL) Version 3 + * @addtogroup GCSPlugins GCS Plugins + * @{ + * @addtogroup SerialPlugin Serial Plugin + * @{ + * @brief Plots flight information rotary style Serials + *****************************************************************************/ +/* + * 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 + */ + +#ifndef SERIALpluginOPTIONSPAGE_H +#define SERIALpluginOPTIONSPAGE_H + +#include "coreplugin/dialogs/ioptionspage.h" +#include "QString" +#include +#include +#include + +namespace Core { +class IUAVpluginConfiguration; +} + +class SerialPluginConfiguration; + +namespace Ui { + class SerialPluginOptionsPage; +} + +using namespace Core; + +class SerialPluginOptionsPage : public IOptionsPage +{ +Q_OBJECT +public: + explicit SerialPluginOptionsPage(SerialPluginConfiguration *config, QObject *parent = 0); + + QString id() const { return QLatin1String("settings"); } + QString trName() const { return tr("settings"); } + QString category() const { return "Serial Telemetry"; } + QString trCategory() const { return "Serial Telemetry"; } + QWidget *createPage(QWidget *parent); + void apply(); + void finish(); + +private: + Ui::SerialPluginOptionsPage *options_page; + SerialPluginConfiguration *m_config; + + +}; + +#endif // SERIALpluginOPTIONSPAGE_H From deac94253e2fdd5fac1686e949bc4b16e0455c8e Mon Sep 17 00:00:00 2001 From: zedamota Date: Fri, 11 Nov 2011 23:42:36 +0000 Subject: [PATCH 011/121] small fix and some cleaning --- .../plugins/serialconnection/serialplugin.cpp | 3 +++ .../serialpluginconfiguration.cpp | 22 ++++++++++--------- .../serialpluginconfiguration.h | 6 ++--- .../serialpluginoptionspage.cpp | 10 ++++----- .../serialpluginoptionspage.h | 8 +++---- 5 files changed, 27 insertions(+), 22 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/serialconnection/serialplugin.cpp b/ground/openpilotgcs/src/plugins/serialconnection/serialplugin.cpp index bae5a885a..23bb8f9f9 100644 --- a/ground/openpilotgcs/src/plugins/serialconnection/serialplugin.cpp +++ b/ground/openpilotgcs/src/plugins/serialconnection/serialplugin.cpp @@ -148,6 +148,7 @@ QIODevice *SerialConnection::openDevice(const QString &deviceName) //we need to handle port settings here... PortSettings set; set.BaudRate = stringToBaud(m_config->speed()); + qDebug()<<"Serial telemetry running at "<speed(); set.DataBits = DATA_8; set.Parity = PAR_NONE; set.StopBits = STOP_1; @@ -227,6 +228,8 @@ BaudRateType SerialConnection::stringToBaud(QString str) return BAUD460800; else if(str== "921600") return BAUD921600; + else + return BAUD56000; } SerialPlugin::SerialPlugin() diff --git a/ground/openpilotgcs/src/plugins/serialconnection/serialpluginconfiguration.cpp b/ground/openpilotgcs/src/plugins/serialconnection/serialpluginconfiguration.cpp index 49bcf2ae8..789085596 100644 --- a/ground/openpilotgcs/src/plugins/serialconnection/serialpluginconfiguration.cpp +++ b/ground/openpilotgcs/src/plugins/serialconnection/serialpluginconfiguration.cpp @@ -1,14 +1,14 @@ /** ****************************************************************************** * - * @file dialpluginconfiguration.cpp + * @file serialpluginconfiguration.cpp * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. * @see The GNU Public License (GPL) Version 3 * @addtogroup GCSPlugins GCS Plugins * @{ - * @addtogroup DialPlugin Dial Plugin + * @addtogroup SerialPlugin Serial Connection Plugin * @{ - * @brief Plots flight information rotary style dials + * @brief Impliments serial connection to the flight hardware for Telemetry *****************************************************************************/ /* * This program is free software; you can redistribute it and/or modify @@ -62,13 +62,12 @@ void SerialPluginConfiguration::saveConfig(QSettings* settings) const { void SerialPluginConfiguration::restoresettings() { settings->beginGroup(QLatin1String("SerialConnection")); - - QString str=(settings->value(QLatin1String("speed"), tr("")).toString()); - if(str.isEmpty()) - m_speed="57600"; - else - m_speed=str; - settings->endGroup(); + QString str=(settings->value(QLatin1String("speed"), tr("")).toString()); + if(str.isEmpty()) + m_speed="57600"; + else + m_speed=str; + settings->endGroup(); } void SerialPluginConfiguration::savesettings() const @@ -77,3 +76,6 @@ void SerialPluginConfiguration::savesettings() const settings->setValue(QLatin1String("speed"), m_speed); settings->endGroup(); } +SerialPluginConfiguration::~SerialPluginConfiguration() +{ +} diff --git a/ground/openpilotgcs/src/plugins/serialconnection/serialpluginconfiguration.h b/ground/openpilotgcs/src/plugins/serialconnection/serialpluginconfiguration.h index 968595fb2..793ad102b 100644 --- a/ground/openpilotgcs/src/plugins/serialconnection/serialpluginconfiguration.h +++ b/ground/openpilotgcs/src/plugins/serialconnection/serialpluginconfiguration.h @@ -6,9 +6,9 @@ * @see The GNU Public License (GPL) Version 3 * @addtogroup GCSPlugins GCS Plugins * @{ - * @addtogroup SerialPlugin Serial Plugin + * @addtogroup SerialPlugin Serial Connection Plugin * @{ - * @brief Plots flight information rotary style Serials + * @brief Impliments serial connection to the flight hardware for Telemetry *****************************************************************************/ /* * This program is free software; you can redistribute it and/or modify @@ -46,7 +46,7 @@ public: IUAVGadgetConfiguration *clone(); void savesettings() const; void restoresettings(); - + virtual ~SerialPluginConfiguration(); private: QString m_speed; QSettings* settings; diff --git a/ground/openpilotgcs/src/plugins/serialconnection/serialpluginoptionspage.cpp b/ground/openpilotgcs/src/plugins/serialconnection/serialpluginoptionspage.cpp index b861a5cee..29d8b3784 100644 --- a/ground/openpilotgcs/src/plugins/serialconnection/serialpluginoptionspage.cpp +++ b/ground/openpilotgcs/src/plugins/serialconnection/serialpluginoptionspage.cpp @@ -1,16 +1,16 @@ /** ****************************************************************************** * - * @file dialpluginoptionspage.cpp + * @file serialpluginoptionspage.cpp * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. * @see The GNU Public License (GPL) Version 3 * @addtogroup GCSPlugins GCS Plugins * @{ - * @addtogroup DialPlugin Dial Plugin + * @addtogroup SerialPlugin Serial Connection Plugin * @{ - * @brief Plots flight information rotary style dials + * @brief Impliments serial connection to the flight hardware for Telemetry *****************************************************************************/ -/* + /* * 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 @@ -67,5 +67,5 @@ void SerialPluginOptionsPage::apply() void SerialPluginOptionsPage::finish() { - delete m_config; + delete options_page; } diff --git a/ground/openpilotgcs/src/plugins/serialconnection/serialpluginoptionspage.h b/ground/openpilotgcs/src/plugins/serialconnection/serialpluginoptionspage.h index 97ea604c8..6ce23b743 100644 --- a/ground/openpilotgcs/src/plugins/serialconnection/serialpluginoptionspage.h +++ b/ground/openpilotgcs/src/plugins/serialconnection/serialpluginoptionspage.h @@ -1,16 +1,16 @@ /** ****************************************************************************** * - * @file Serialpluginoptionspage.h + * @file serialpluginoptionspage.h * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. * @see The GNU Public License (GPL) Version 3 * @addtogroup GCSPlugins GCS Plugins * @{ - * @addtogroup SerialPlugin Serial Plugin + * @addtogroup SerialPlugin Serial Connection Plugin * @{ - * @brief Plots flight information rotary style Serials + * @brief Impliments serial connection to the flight hardware for Telemetry *****************************************************************************/ -/* + /* * 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 From 2e1469bb1fc9228368fbb9dc2676b8084de7f29e Mon Sep 17 00:00:00 2001 From: zedamota Date: Tue, 29 Nov 2011 21:00:10 +0000 Subject: [PATCH 012/121] Added new SMD Spektrum Adapter files from Dankers. --- .../Assembly/Spektrum Adapter SMD 3D Top.pdf | Bin 0 -> 1096545 bytes .../Spektrum Adapter SMD Assembly.pdf | Bin 0 -> 30128 bytes .../BOM/Spektrum Adapter BOM.xls | Bin 0 -> 42496 bytes .../Spektrum Adapter SMD-macro.APR_LIB | 0 .../Gerbers/Spektrum Adapter SMD.EXTREP | 18 + .../Gerbers/Spektrum Adapter SMD.GKO | 26 + .../Gerbers/Spektrum Adapter SMD.GM13 | 59 + .../Gerbers/Spektrum Adapter SMD.GM15 | 75 ++ .../Gerbers/Spektrum Adapter SMD.GM5 | 33 + .../Gerbers/Spektrum Adapter SMD.GPB | 17 + .../Gerbers/Spektrum Adapter SMD.GPT | 67 + .../Gerbers/Spektrum Adapter SMD.GTL | 486 ++++++++ .../Gerbers/Spektrum Adapter SMD.GTP | 67 + .../Gerbers/Spektrum Adapter SMD.GTS | 75 ++ .../Gerbers/Spektrum Adapter SMD.REP | 141 +++ .../Gerbers/Spektrum Adapter SMD.RUL | 5 + .../Gerbers/Spektrum Adapter SMD.apr | 19 + .../Gerbers/Status Report.Txt | 21 + .../Spektrum Adapter SMD Schematic.pdf | Bin 0 -> 132740 bytes .../Spektrum Adapter SMD.PcbDoc | Bin 0 -> 914432 bytes .../Spektrum Adapter SMD.PrjPCB | 1084 +++++++++++++++++ .../Spektrum Adapter SMD.SchDoc | Bin 0 -> 83456 bytes 22 files changed, 2193 insertions(+) create mode 100644 hardware/Production/Spektrum Adapter SMD/Assembly/Spektrum Adapter SMD 3D Top.pdf create mode 100644 hardware/Production/Spektrum Adapter SMD/Assembly/Spektrum Adapter SMD Assembly.pdf create mode 100644 hardware/Production/Spektrum Adapter SMD/BOM/Spektrum Adapter BOM.xls create mode 100644 hardware/Production/Spektrum Adapter SMD/Gerbers/Spektrum Adapter SMD-macro.APR_LIB create mode 100644 hardware/Production/Spektrum Adapter SMD/Gerbers/Spektrum Adapter SMD.EXTREP create mode 100644 hardware/Production/Spektrum Adapter SMD/Gerbers/Spektrum Adapter SMD.GKO create mode 100644 hardware/Production/Spektrum Adapter SMD/Gerbers/Spektrum Adapter SMD.GM13 create mode 100644 hardware/Production/Spektrum Adapter SMD/Gerbers/Spektrum Adapter SMD.GM15 create mode 100644 hardware/Production/Spektrum Adapter SMD/Gerbers/Spektrum Adapter SMD.GM5 create mode 100644 hardware/Production/Spektrum Adapter SMD/Gerbers/Spektrum Adapter SMD.GPB create mode 100644 hardware/Production/Spektrum Adapter SMD/Gerbers/Spektrum Adapter SMD.GPT create mode 100644 hardware/Production/Spektrum Adapter SMD/Gerbers/Spektrum Adapter SMD.GTL create mode 100644 hardware/Production/Spektrum Adapter SMD/Gerbers/Spektrum Adapter SMD.GTP create mode 100644 hardware/Production/Spektrum Adapter SMD/Gerbers/Spektrum Adapter SMD.GTS create mode 100644 hardware/Production/Spektrum Adapter SMD/Gerbers/Spektrum Adapter SMD.REP create mode 100644 hardware/Production/Spektrum Adapter SMD/Gerbers/Spektrum Adapter SMD.RUL create mode 100644 hardware/Production/Spektrum Adapter SMD/Gerbers/Spektrum Adapter SMD.apr create mode 100644 hardware/Production/Spektrum Adapter SMD/Gerbers/Status Report.Txt create mode 100644 hardware/Production/Spektrum Adapter SMD/Spektrum Adapter SMD Schematic.pdf create mode 100644 hardware/Production/Spektrum Adapter SMD/Spektrum Adapter SMD.PcbDoc create mode 100644 hardware/Production/Spektrum Adapter SMD/Spektrum Adapter SMD.PrjPCB create mode 100644 hardware/Production/Spektrum Adapter SMD/Spektrum Adapter SMD.SchDoc diff --git a/hardware/Production/Spektrum Adapter SMD/Assembly/Spektrum Adapter SMD 3D Top.pdf b/hardware/Production/Spektrum Adapter SMD/Assembly/Spektrum Adapter SMD 3D Top.pdf new file mode 100644 index 0000000000000000000000000000000000000000..dcb64a2e3875516b96a85d36f660bfd8acd8f119 GIT binary patch literal 1096545 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

SfvM(TUPpOB#0lx7tB#^f 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
!^4z9FZx?+js%dn+p$JrQiX z@!z;SENC_}K2UmnQgsnjZnavnBQ0oeliGFuji!-C?JFezXDHR5`a{q2Po@(| zR#t}5U7jDitYf|#2Apo6R4%>HOR+Awc;(6ndmG+%vpFQ>^>OTnnosfx@=L7sJw)$s zzMtV(J5Lko_7-%%SM8=aq=$OppWwXysJi`u4pqU&lc3vLQF{(r(pvc}>j=z((BV~5 z|Lzqm0zKU8u>y%MfBAD(x&=0DL{-aR_MvtgTO0p;oVT!teuoGJi^+p1_~{$DJlP@3 zaH3~NA>TedL`=Uo<Apsmno^6Jj(PJ(0VT3-5W5+WByg{dUj0D`1UwPi^+JmgoFw z>DIvGr%JV990Q>??#R^6MMcc*@GG({asj;6i+4>+BE%7I5O*XMLBT!@4k*43v*9TO z>Cg01?Y~p3*Jsu#>`q#YGqGe$OqG9hP0c0=&#bAiFiztF_%z2Gvf9W_{}s?6{)ozN z)vvov(A{i_qmE+o^Scxuvoac~&?ZYVJm)WAi%Ob!lE+&elKOH-jilT+>|06n-oAf0 zlc&sQ_9BX3KSyTverVxNvGUXPjLs#0qtR6yW%{NNXCq&Pj<)o)0B4Lo5Xo$rz8y?6 zAthI76wPAi=-GM{jQscEQ9=yMM|s5YH=41JEDi}3EUx=1nBoTXH_$ik#N?HByx$`T zY8nZ!d5Twl;A*P&v-%Sz?T!QxFxZuSxFncdme;^aa~WQes$|BOR#G3MZ)4yvb)rsMKbn>piM)U5Umdf*#G{wBhNW zk7UXza-nvt;aT|NvNroW zQW&|xRT+7%xZ@vnwvra;mR>x1M)dH-_;njTt7(^6Qq*(WU?ub`h>!Je=6gZ)L-k%b`nKh0Cd=8U+Yq8udw|jwxP4YqU$IBSJAo4sCk4~*V!{Za7pi3(jv|Hsh>_+Nw_Faq=( ziVo4K&VE4iFd2e^9U$hTRS0I=qrV;%nK7p>!`fw-;=ix*L+Ng4O(Qp9kdvSl^6#Q(T@(4zc&x=d`_arVjrjA-bPqUkn1_8P3Q}UUWLes=@B+ zuoj%f8mw-)g==m^|J9hGt1yY+?Fv@X+E(UkO-0-pX=YJ!A6d*c!ZNuaqidKugLL@o zXR=MaHI8pv>jh7Wy0t{jU|-}lSve2$vEOrzVwit*&f=DMhEMZ70`sMgxBt@He$Mo= zfA=-+ZFVbAOL+{P9x`EgXpE!rN$vCCi5}6+^1uJyd}+V=8pEcSDHp>UytA#AU_lB4OIe+^E#>2p5+ zr~4u5xYpEx@PHxMyM1I9i{|6#EZP+!G>u98k>`o^W4y1dloZF6&a7Q@23vv`|3>kt z!na$=?*p^5N+~Fj`3%;@naeSfL)5DK>HckPZ{!)opez~qYrSS-(7_Rmil++=T*IXk zQ)K~v6-X(*HRCgKaCBf){N6{O{YWD(Um;D?W3Ys-kLOLR_US?*#55OwO(D_2--4#+ zR+~ni2IDjHwM6*mM`l)QeRI@TVo;d%|JvpCP$o_M6pp{9GmoL!-9NOBUibVcptu6x zqB>~}eYWQ~ATp{T{7ORj{@GE$o*+%n2UI|C?c^jRVr`QREozh!S)+x;8X z4RkiTXWT!p87DCu*~OsFO|7ezl(;_{;Ph!$>k>Vc!AxMLw#L|d#NUjpg0)h*Q zf=YLnNHfHW*fgLKK#-LQ1Gyz_j2*Y*CRUhCO8b7s!Y+@HAb*)o@+~-)d`W~Ghp|*T?ig3Ci$B-f!2LJ69lFWn909Lw z*M@FtF{?ZbCC@f&p`cXb817Mk4w-&x%OhWsJ-s*n(3(UZ%*5{A!<&qL+WQj8IqI6$TYSA(_TmV~>j_69bFHnNYRFAkoAB*%7qT=` z%pGj--s-WGWxVIRo-9FW*;X9yPwz=c?Y}R8e2aS~`rjl_It#$zWfwFvl?!;7kV$e@ zrjjqixiL=*!COjwDqDnxW(R)7Yt+{BVj(W`VnL?}*EktI)oF;bZo}Uf#o;~g*uh(u zBEG31Nd;cqk!M&n0!$nAXPoU$#MoV3Ue#xAKk%75Ho(;WtEoFDaq?hSo}TF_n0&bI zZz%V&9$~s-f&)!<=gbu-f%v)(I}Ywb<6#| z?sVGvY-G)qAlkYie0YmfZhFQb+nVoEz{$gDujcB=<<}%%z25YUVX^hwS4EQ=|428E z-#brBCu#wDtZ1?}$;snDVsxuF7rTWl+c=ghs!1i9#%vrPDdLU~+%}HC{+!Gmtf{+V zaJrbI+c*x}(X2}UN9T00#jIInqcUxDu7Gop1PcR096`Yp`8ysG^Mb>x~KuBqr`N+0?w0 z?t=7w>OEDTz`aZ$PKMQ3-bB49Q%b4H=}!*m1yLcY@$i1s0=Kj;G+vom+X;aaPJ!|Y zAc?l^A&__ysh;>J$n&*o?4Tq9CyRl1d}Kh@%-f+Kq7gXKYV3O=WXcNHYqYf#ROngR(YpK(j|d6$^hF ziy|kIW1*;P-w4)+9c6LvX^=Jd?a>nB2;ANj0_WU_64wS5p&&;}7%W>_^B?2KNFt}8 zqpB!dv`aJU@2z*W?WoXcDc?NXFV9^mk!r+U)HF6r`t2y`{W1ZFlLRNyT`UZ`Won0( zj3wwVU4Vo^r@wp-&9GdCoj6VXVV#<8LU~u>-D*T7DiAIyb|42b-v6ML5Q$Qn)rE^QIk9fII0xK&n-HM@&6poLVVb)rV9 ze~?uui6Y%&zMymL(dl54yyjsi=^ZE{mrm5qoi}&Dr$f=uQ~=;(HZn|Xm>?n~4tD5t zPe_G0C(@vM3HC4&8jvQL0!>w_hNroS(;^KzTTp2)FmQkHNHX7`M=(ZPw8%Wnq6<~; zp?@a(VqOB8t?LghBtUj0=G&r&UqFsHVxd>r2psn^?2RgTlNMpzb1<1e1nvU)IxZ

tmFfzb&%&UF-R-C%bp208 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%0Dmi>UR5aQNA~S4Sq3id2D#Vdwxfc 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�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

Q;sW! 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

cwusRXyQ}3i+}4eA9AvM%=7=2 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%0AAtt($4pT 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 GcRH&7lQ0!@Nqv8Xx9fZ|g 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

Fa1Rc(;B2JXbjIqHhVYuH`Xm4P*jlpN22-J!#e8 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 CL=_SM literal 0 HcmV?d00001 diff --git a/hardware/Production/Spektrum Adapter SMD/BOM/Spektrum Adapter BOM.xls b/hardware/Production/Spektrum Adapter SMD/BOM/Spektrum Adapter BOM.xls new file mode 100644 index 0000000000000000000000000000000000000000..7f09125e7299315b55095b70e9c9ed01a7431f7d GIT binary patch literal 42496 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࿜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 z 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

5>{@TvZ4 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

HshY~}X8yB6@r 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≶{cfn_$w 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ອ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 z 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 z¬ph%iP%`$0hJIu60`kktrkuQ2TC$IG7_+6VE#9fX=#4x`0!RAL)K!Qbr2FXSYO zMIls{QE24%>g_S-yMSt|6F&!QdB+M-f7~fjc>r}$mLD=hJ$Ekg^YV9dj1Rm{YH?0_ zf=(=0J=)T8L+r78v$s2A_YJ~7DMW=SdRY^D-IMROzBI9cL=u3V=3B6OocQ-|NAaYGMoJbopKA{XovQNEaZsOs}Al~JEP|Lz7BJO;y9 z-PkH*Vt)o^X&UYagMx8elek{gt?6GAA)*^PHC6d6k&#rD#SSn2nDV&f&tLn<*6WhwIAIt{R+nCOR~R^*mTzv;bY=O^<3SlS$Nav-Fbia9vJR- zg_ERqE`+f&G|f@mF@NO*dKFWt+onL+y2lD1`}0dZ@f7X$9SMITh#9-rSSBC6#HPFr zM^76`V%8`>KBOA{P74Q@gDb)uWSz192qd<1Bj6pI}T#j=6X3gy@LIsk5eyyl3;rz8DX8fF;?{eb6 z@xc?6n(iXYfp3bke2J1Abn;2OyJK`*0*--Y*e)k@qo6ufj^l4Xlq*a2UZ)=a;b7{B zKLtLSH0Xq5LM0YfYgOU?7u{iq1+YcY#8K_~Il|s$GFFxZjphVm&*5`~C)hD<2<$dMFmI$^2lvN@zq?r%3Ca$63cp z4Ieo@&`@;Vs$WRA^ML_-AWIWdBO@oxGg+H#t4bq=BiFln1*u-NNxhIfg0Jv8JJE z56I-khot{XLF2=}!j4$@e-~fb6o<%?#A?aJTHJ*qO!0o+C^|Xpu8}`)WP7A%jr*RQ zSk}jJVQg<2X4N4Pten+>ixY#f1V@sp5~ba0YW#Jlse7ZgVx&XaCGEyUalKJ{)IiM- zomN~8bL^uh!Nf$L3RRRSSwGdIH8ZJGr~OKC#t<`X#;Z8KiRt|Ys~d7st)D+>Zmm+a^m zQ_Iv<<_u3FZvBhZJDrR({^moPnGD*}!PNYx#b;&2!&U^R-V6B_mmqcq}EGpct)B7=x!zMpFlo zR>=u!X86{!J{p=`^^NaA*AE-$(5G2%UTCKYT)4!|vMi&PQ|%O)L^!06BSX@DyuDHp zOBJQ63b!%*vB(vK6ta+lUGCkdd zIg$ZiXDxg_SzXBoZby8Sm$Om&ElDEhy4OIZpGobmc(a|J7FEq8u`K4@kN!C7v7ci0 zQIe}q>jJj8Hg|_xyfY(zCj^#$*wddoVWya|CUc8Q*uab|I}xv#9e?Yjnxzh68Wh8| zq2JD30jaR6Es;WP#LaF}``0_$m39!X&pa-Dqt4nt8IP}Ec_38(|a(@lGMxx&?+029L z@^8kbAeZX-Nv~d>ZJLY;B}gN z_Vqs<00*(BfC%wOLGmYN3%?e-I#$nl?H_+}s%HL3bnYm+06h@K?WIXn+FsS#i{lV;~n>5v%;oBiXt_EYh0 zaMc9EpY$)FOk2f~>#`o)s+c~Cv`5rfGX`%IR1n-5vYOme$T-K={WechBW-c#!ivA$ z_bf^pY+0FDHX10MrO9xpS1-`auxpesHlnPnorKZJ_|VLHZ)tY+dwi`hwM~-VCI0lR zu|f4s%B)D{|0!WY)?4XfC@IY}oLs~tLEeWq@wr?462mnKnGdp(oYR98zv?tW4FBLU7MY@;wu-&<)Kv}26vYn4KI#^xvN)8O zRiR&j6JNp|glY@3u?&+Zo!fI~duq~YYjsEMLJXp8uP%aLf@Bnl5_dy)KQW)sX~1`+0e-y03G=^Q@W`Eq z_dfZNsf7mYb3;MGNbW=pg>UBg5&pJtIao>_EHP8x!^XhiU>c%j@<@tl6Ou9p%3_=cCmLIE>2{}dz`!?8tvB62>iYv3O2VHCJ_yc zDEf47tch&q@t3=0m7SGi=L2M4La2HdpmD?||8mwfr${X(M{yV#4Y2v0m}olE7f z6ror;bG{*umLaV3{rW>*lge!^DST`Eib{8D5i$HhMx4e@cTGILapZnhLS+(Py;RtU zC*sz$&nx~wap5BGV`2)Qk;ndSwT625Ev3c*VM{1oV)ikQdgF9U7&Kvug;){d5CeqY z7FAXu>7$QAshbSCs+^UG3Wp_xWZwPSDl0Uh4Z?N>#rr>Lue$ri%JmR1`%Zv&zU`Kk z1YF_~M_zkfv<*vj>+|gCRT7b+#X@_ zHc}h+wkv5;u^vyf>DkzInrD9Aps(Gu|+ zmF!yO6Ns7CS}kjijk+JFsdcNxAPeiJ0NE6@*DDUtd8Tk8wgO8PHsoE&I&6?#@6%oj zvXABq#t+d+e&VCjStNB?T3|56p|yp6`3O_1CQrVyfDdX-MD*e~rQ6FVZ@GAp5^!86 zt{@kadBYPfhs*WpF!G)8SXuD1zfmllR{lxmtXa|PQTsu(`I{a}tuzx%{S#N?;y!_! zCI$uA3k`#kd|Fx4)P0~iX?JVP64+lk-i@AM_`5i{LGMsalu!15l-N0Nj%`Os1<%D1 zVVBUtoKVh9){daJePqU{uztJvjiAQizvS7>8mVG8Tek6&r`Pykj@)9;xqT3#;;*Q` zsJTrdeNI_?mw0vzOxX^5(WkqAyG1+`OpCC|z?1pazlj$F<5hDbQRy~w+p~z3ajAHs zC#VfwmGYZOdrp&v1HeAn7ZvAu1v#90+ipcnJq2dV?*gTA26KM{_@ZiO2{onZOx?3S zQRh{iMXaOz{k@u+_IcR3eN6OVQp!n-_Hb*aq$H?RN{l0tj*$3zsDNoIzpAr~g z8<(q8Ez(ZJ;8XAD&*gQCxH^a~Yj0dl9*E48Xu@yGwS zWLCb_5pPE!tMcgtZ2OAUUvqB)9Se(_M>IumnBa8P zjm67LCT9wrU_diyilf>9ZOc&wOHc!{hwA^ZTySxQQ9qMP|G??e_u^}&+%U_gNwHMI zMXRD;7<$FrOS)u68i{#`+%>4$PiRJ#Bo6HT-IVvGN6>^Wd9goIsvI4~ zauI4;g{OMNAtL#aXqzzV#0Kc`YbJRlcDeqnXrxlP`mE^sSGl}AaAugbkVjUC%fJND z)INfkGGf?APbCg66C7EhEpUVo&{gZXn3iY^$XGz1w6;nN9G2)-?*c}1Yp`o=9Us1p zz{G^CR=e5)|GwDCEQ6cD`n*Y1eG{bV)K8dE!{J@d3M`aEF(e#^qcG3&y_#oY$ss%2 z7^S|T<*1TB7IH}oSQC+UcXF&2$A`77rDG%Hy=_$-SE7r#6vHw|aK1saR!wix`kl@f zD-iaDqm(IyYRnW8Gqlbgn1#VV=d{S8E==mm(*&QQYb_c}1NJo}aN;#XmFMU%Ev_D- z6$G2fh*~?lm~fN>^NnEW^6bOtxp+(*il=AgCdim}H0-ULyIM*mBcL<*f)gEvh9INw z-`Sh5U@2cA*oW~jy<=?T8W{>A%Id^f^otH1NmMb$h25T_7xxV0St%sku|+q4pl1?A zlxe?%-5@NR?tnkV9E_a%?bBe|wAj+#s*k#FM&8AFk81WOIo15S+P*~ZuEy6zJ=-VF_;+$fhCcVdKXbm% z%-_F>Ig*7nei^^S;sDpgS`7SA@h1R^{_a{GxnMvLlQ@A%zO^|$v5WmMr6gBA>Q^FfX%=-|7>wTjyXTlA?0 z;s%%nctx)#1All<4N+wYgHZv=7YicUMb*y`JO)Yc`*Z2Ez4PLzHl4Wuj}&?(%+WZ) z=yvv^dYHY$tcY=^#n{tN*^lQpg?-#?m~nz7b$M}&5fC1q%_3ncS1O+Wpm1Y=3@7ql z>r%eW86Sgp$PU+tqh!07*3pF$*AQgw4pY--e`N%>5do;QE%@tMm_L9Y0tHNe~nJ%nCuZ{DkLx<`0%66nyY3_w|L!-<5q+_)#;cbM*@Tw{tw>m|& z;e17CruvcnECy#`fDC@vAeU*>`f5a$BS2zmw{qxCt#c13gyTl%OOLrdi0{6&(5|^3`%YAs9sxqJwVczS1EY5thSzqus#cYm`}g zeiz%C93=n+Dq3@WqN77#WLl^n_ScUEA2I~~Cm^u9!^$nseh+ya8W3h~-giI!TGHuC z<=pjV`KU97tiKmSSx5PAF7~L-X5O(gTgh;{RVF|0*&bFwPq_m@PX2Ssg-u zI093EW3IP!k|f!eD7;^rz;m336SqF`(}`cH1wED7ugEWZ!*n-$11vW3tN$zJtx;_mmi#ZY{Tr`iQKh1QTWnEf)ZqW1&Q2Bo zT*Q@E&2hW@=M7NoSG!c!1oVSINwcVKt)f{2_maP~*@Ze{QAN`Xo>xnEORL+%+h3=; zg_hQ*v$MOawaxwZ1JxrZVU}Ds!Tv+D(+>S?pFVJ-^XvBTuwfm&hPJ1sI@vYmV0jjQ z#85jnTr=YkG+LU6Z87-uT@x@YIi$6@5Cs_VZ}HV%hiONc{FuTPJqp5s@}K z3(oTnbrUMbw|bg)oBi9BR;RnOtF^mx$Mg2MvW5oY<6hTx`dr$13pi{0!sGqn>~Jx| zl8btZ(X-=9S48{uef|7+`;O;*((zGqxxv!-*tJgYecKux+T^p#n4B8=K^^U+fqKSN zJ$JgEFUQ!QXB^l&8SL%?-TchE__=ARncDv)lw4iC-j6~8F-zg?`QcHh zQ17di0;EX+{4&OxGNxOpOMVn^(WCo(1Kvd0k~fc_?V${Rrf35l_nm9msvj)w39Js@ zfLE0Sg1zK3c((SV4}4lINroaFvR@gMBBztpiSmcK&6G6=QH3QqXg}~;(VUS9M*mDS zCUSr}Q*AvmTK0y966u3Hno}{I4jE^SPMy$MGvBwMK1il}OI@kNNdc-`0E;Im(kaBR zeP9IoUIYG4n|ZVuz@yTHp96odtL>I81(^a>X$jG~rD#y)E;fM(X!6O@tIHE*-pwlh zjrg%KW@TSuVkn=I@sk0Z>Q}G;(sRxkhl5r;E`*$acIG+?qVtMPI!K+`oaCT`w~&S) zEFko%2qotjNzx!;<$C&42hAj9BHoT`4rXOrP>^mgS-=FkxnsX=*zRuQxD^jMDcduu zsi^dBV;_rf&}pZwK>WGgl?PDmyy9}@dS-F#4ci;O8-(^~y*|%Xkbmbm{V~2O$Q=v( zv3bu$;4uHlBS&w9IWo;eTRaHT$^y2tnEH5j?PS6x|WtZq0?hBv(D zOznDqm{U{zeZO}Ej`dr2FKqsDhY>*H`#ui+1}Afi`g?y=m6leQyX2egb5hlHn51ib zyr$&zp(*A3{cba~$Jgt9T=v>_`|Dwz*T?gH{(I}|{&M=;Ef$&*y>VsQEwko#cgebu zrR*1<7EJ8o+6Q)8>p5G&-Kn zUQ`Ki7_LjE=4%T?t6_)J?1YMP8QeqVrq!|0XkY`Q_w1SbA=7}jtv8GItt|#iy!^J9 zNXpOEV9MG-`mQm=Y|Hq_;?jJlWo>A$B$d0!GKGI!YvY({TZ~b@Hl%K9s@O$y*Zih7 z#m9MmW}V!U=7GIV*92R2;oQ(CS5I?}@?<^v-r8pxi$}?)c6n$Uu@-D*w1i=Z zzne@Ig7zUk8X-O$jNSqiS5UPcb`&w^iXnTgZ}xeufb_0Ktx7j5?e=B!%z7B9Ob#4U zWmHJj85862we$KC;N|&jxW!7So~me^buIsZv)X?^FifSL2d+`>KZL61AJR)Cv26$+ zdE%5h=dZyi6H2L^hrcY=8tUUDA$7{;j9oI2RDP4JeEtZxHFru^1oG&ViKJN0@1}BH z7kJ~86GZ7977+VRB2|_;d!i?i1*ga%$2dYsU-V9)a*M}Fp#o?Rr$h3^?(bYn_yKW3)Ks^hFAow1J{QXyi~0BkLn)m&aJHmmRVZkEARinPRp0k%AfX7 z*WGs<7~D_qbjt86_!e_X^Xpw7n$J*lWR%E5w#N#Uw*~BVXO!#?skSEG$8e6sSQ|`K zVb~nwBX8|OUA*hmnht9R;kY6?YzU9oqZ9tm%H4z|&A>afQ`$a$wr=Y38C%<~%qXl( zYR9Xq_mVHKw~8vlw>F8~(1$LeeUsyzHns6o55)9V1{@FXmp zSt?yZRyJD&F)J5N8jm1l3o<3jv~p$Z&m#;Xy7+Qs|G9Es|L5wi`G)&xWL*X<5?>tM zm1ESgEHSW_=ZS-zE$iU5cMDO5-2L}MOx#hX&NW0y5*Pk*RX?TvEg)^Oe&tiUGF#EX zYwH)re@4S`TZT2fA@kzd@E0SyP6@{f`O+_V9pNkhM>Cjwtj91Pc+LsO#655TV5F`* zkqe*Q0boX~*cePt4^(_S7jAv+pd;%O+TaK}|EokjHdZ@34&>S2Z~>J;F$@waJ5I8# z*(qhXVE{Q_v<+|8?& z)SD0OJUEdT>wJmeEd0WT1DLQc>-=!^xjp$YuCsiDo%!USMSG9yIXuX!q(w8*;TM%* z9E0@P94}xE%2?4~f6nLg{~YC+k?Nfc>($`)-Wt{}%Y=L2vx)sFefAgUFG6|jMafc# z@X+g*`X$W$+q)<+A1_TxK|(%O^77?Wk?9;S!R(fU^32~Hz9unWWfG_zb>Wx%!v2y~ zO+r3incI%Cot6A8U%Del1h@{lFt?mx->;(5XJ)hmb(tl#8wtuY`*JuR1xi)1a=8BI z6-DP83FSk34kVrM0yHO*Ak5qn;@v-NXZB;LI-v#0Nxy~R6WA*k0kc3P#xP}LRF-Xw4^D-yXltn^*ktx+X1$5``R281(~j=u^VRB#OOEDoiO8Iv z)E(rh7vB{I-xR$mw0_T?q(@@}IGSc)*dT* z>%2V@3M+b2aM7H}qvrfKhYadmMQ&mORUwMzvl3w!6bHLP=s(0jr8vvbNgWf{Dd9JA zK4dRgC`#~DhH}iHa3DAWV}DC0W(DAS&TEhvGT^HAxY=HtXRK)gSO0EMaxpSp_sA(T znzFn4Xg*BVg__c#F*hbX#!W+L>d+TA1Ji4gZi~qf7dj0V9SfTCj5xr`{}Ny&HUqO7 z#5Wx+K+AY-DqgYCQ1lutVh&OCs`Re(&&&XPj9L>%724uTero(IH<6gJkB}=S5G{X= z->^8<^bik!u7u4DEQNiAf8fy^x3M-S#yvMs1tArF+==dRayf~0I*CW=`{}8a=o-@8Ov5Bl>F8SX_V6aPX#~u0I7F+pLRLS{Jh-USv^Y zUMN}nsp#NUZcRr&jBdW_TePH5e3N#h@T~hXtE|@Ym-wwk}^0qY}RBtvR*$02gf2s#{k-Kb!W=!UR)KIV~>0=yoHL;lY z>KLO43dl|mQk4506yT6ay@b?4&`c!kZ>G+Qx;s!5PPeIf$A}y7RcO9fosmN*j4Wb| z5B=j2aynsr6x!g$=QT%-8SNJAdwuj%5oe)(8hr3@ddY5qW{1X>Y6o2C5W z#B3q|cLKV4_veAjwY~EgvOwt`*HqEUl7~cZ)Np${8A8%kUe$3F-_74IUs?J zdQ!kawXiafInc5*y@H<2ywOwq-}7fN^q;|kjPpS4$Wx^MS+NmmN0zgLr&Wtt(xu<+ zQG*+z>Im0YQ_!c?{^&AV%p?Xx;duU;3?~F~l*rM^F`dQwbC=@(xZvyaa_<3cQ=Ep;*DXLVwBRS~w ziN2$*Al!dxyvF1<59M>GjJrqt9+vJCgw#W$hGKNz&i`!=#?GRF%`I_4J{r8`*?40O zgOy0kN#BI#40Pljx%cm}PZc0SmP4WmeLQRwycpQ=24LT#QasIH<#4^!YDp$--G4(( zGt|03Wz8oWYeOJKM4O_);!QMd_aC;srhvWpEurd}8dE11n-l)z=P21mc2x7qT?NQ*0z9cLUhuZLT05!0;H4H`4m=x!*2&dp6V=p#K{p2B2I(G4jcb$a+A zs!J%1p_t08*YtjFONx3zO{e#egmh9k8G#Sbf>)EG@p_=Wki=52K{5y%p;vDu0d~$% zbB_LwVz+D5LLhWI6C0E+&3DBgM{!Q_w4gc5i{!rqd^wY8dYpsjD)RCVQv8?$!=JLI zKFf!>Gx*V50RL0>od4-3tj^9 ztGrJBk|P@=Z>^u%T;AW}e&v;E(P=!2g80Oj5pSPIcui^1Q5(-(vu3 zBndMzvqid^8oNmt66XXLK4islbe1XOhY2>7uw&t!A%^3&29ENZr zOfUo7*B0gv@-ERgG6b_JAlae=4Oi*qSH4<`uHkNBTuB5Qo||U&q>HaU&k2;jdVfV# zmIFQK)fU3fAkc!JS6WKXn*}0?rR|)kn3yBL#r2i)xHcG}5KS3YLuA{hzypK{)71YYiFq72adIi~MK?bc@OmX^vTRL+jU} z+DK5K{rNZpWtQMg$lm-U&nQqs3#5Mo9PmL+_z=amSOe1~S2(XQsM z<;%bl8hpCy$-HnKeq!pu2Hq|qgMAQaN;T66gKHlL8s*i9z_Cw$utOX^os~@$`AO+; zaIa&mk;KOoqU?6M%fT?P|GxLZ(E1~V@Kb&yo-D$aZ2JvJhWWS@O1`~b&aNFeq?o$! z*BofcFFmseruGDJxw=Rv(!_RZ5_CENeRSB~Pq2~6lod;B0eq+hX&XwT^R>aK9Zdff;W zlCwpdKgq(JqELQBkhx5r^UVgt#ODX(pZe+Z4~rq{X%KmqgUmy5h(tgY7lBBF;Svjj zrO)xF0<4IDB7{z7;BqNWFes_`;^DTC0bWo$MZudPIp}RsS46+V?$yp@H)tZ1@tcf*EaVs5F` zyn3qTXrn`!6?Icc)wzQD$wH5#J-qy9ai!Sl30Zl>f=BG;TU?AyemOj41@k|ZMnPp( z=?NJc9=`T350Poo^L6iXVTD93F^zu21M8e}8Bv$*{FRb+OZk#$ zgX;!>mDhq$?1)gT8ZtK#GPi;BLzvV<81pPK!z}UA|E0(;v&LxFAG3UKA@H5C<_r{( zQ+t_lJ4-6BGZ`8Y3IW?arQ{EgU_(NyBj7au!&PLVH54axlKLkP)paeZC&y~kUnJ*< z@dQB{!(>MhcPzgocnO=tb7vA1`rDR2lSns!9-dBr0y+#>tWPKhwsB?82)$6SH$qr9 z97GK5v_P>uL?;k>goHF~>NjxXK@q`wcm~liN7ZJ9iDd%+LWVic??)eogAvODM1lKw zPR<51K`zq9Bs;JIHvB>hk$B$z54I}%lO_w0`4O=dfc&lT($nLJwT)J+mc>lnI~xWo zw#Qn+B9|G^*dOd?#FW#CJ)ZI9iEJGdplnlh@5(gc=5ZQ7M``$d_~_0}b~biyFVR#~ zNLiD(U57X8B-Wv+6FaY!8o?09oh?Azu2`!2?0pN*ItiYNw1w~CrWijR=+IWZm)Fn7vb zdPn>FywX$}sByfC9Y&0up0CK}N9bN@HPSJ!CDXDMAfAt8L8G>zYQtVz`U}Giiq;F% z7!GIQb%$FcViac(zBeI#t(Z|BtSOmV;@=Pq)>OPwp0tRI6&1u-B;PISQ3^?*ZB$yd zsis7F4H~(}?Lt$Y;5sCNZ?4-*(21_}QZ8YY>kJiXA9B3A9$yfk5s4ODx7Jc>$t5a7 zM^oL)F#q5T+WdgRhVI84A}eNYD6dMl((>Tq zCHe)HRGWWA@nsaf%5@}1tN8^h#?Gqdaj$i?y=mWAB@OvsV!be?rHs^w$bRUUR=yhD z-u?*=4p!;JbCy35+%z7Nm9W@PPtYX-{X}eZ?(BI9&iM*CUoigsW2JF#R5CH0V5w?lya?`M!F>6P7mTUSft@-`&OlyUwT9h)=M;pTT@N8K68>Ag=3Jt>O6gv*IP zaRbgK2~UU5#fQ7AZ=_R+fOo~iw}ji5mFc>`mW&KV)Of?E7D%Q{?DtY(!1K2z4i@Z7@6P$!v1%`;n zIS?$tglA4>z-i3aNK8*vVWK1z>L6403NB-s%5VJ@Zx|}l0xs>wZ6@KE7cjx6+2npy z8g5~nXfU$OSeEW>!gO1>PlFd}58PE8QAmC=k*nIp57Oj<7F)h5%0#(gyj^JVl*UNn zNZ~bjGDVsWOI~sDp zUza0&t-d^AC$YMJ`Cd-^0{74IN zngZF$71G|U6Z{sk@n$_&zo7bWke<8-{~MaKK$Ka0Ho0aT-ILu9er8Z0iyddW1Hb|f zrQ1mU1@9fr`C>v$moaEz$1{1%u&3~dkB0FfSdV?1M>%Wby<51haH*-3c(*mkWSK9W zXw@qTO_&~Sin(e65XSBf{qHewsvKy}G-L>;YT!m~MZCDlu<}Z*6lK^Xbz0}bXLR2I z!moIqXwGuM{&q09N4`cYY4{~YjuU6eQ}KxT^p3@Bz7mqhslzQ!zn4pdV-DkKvJAJb zd0!9?)TRdF4Bh1fo7plBA#*a4|GsX)u8x^6?Z3mW?sYO5-CNe1s<0SEHdFu@4C?>3 zwYLO@SlL(8+uh3p+6+4%>j<)tG*#ReiyA2psiU5kWai$U;*yjjxIdFigO^szrg>T3 zU9(aR$`^V4PDg3T!c9~oQzF}KFwGzcgN{Dwt`Nzd%N&Ic;rYd+CT*#JdLBs@Ovd1y z*e*r9w5qU|?@TFJUU**Fc6WlSMI)-e-bi0I&ICn9dZn;kSU);P7yewB$eTh9RpGUr zKX#5sL6zflcbp*nqjI^W^sXIzY=u1QqfJkKg8qs645%L@_&yPifLeXSHx?Ytd6HyU z{E-}&Ppy{Xjg8C;CRuhvL@Z`GNG$}(nks3;2Qt1Q*I%7TpcKx3ah<(0EceI3PB47(#ds^-N_W-5!F)yptnUZFOMv zxU@g`EEncE(-vC3UtZ32eLr7za{!^*uJ8BI@2|u0N4lt_NK@bTT<7oA%NC|78{03p z+kwMP#OK4woXrk=n{KjUdakzDuhqm7+wZ5R5_mw~oM_QtV6_r~^hV zG~>HAH=@5ZJNWmIqsIq-jK;LZIn}+SlN%*<)bjx2U*B#AnsVJ7A7a;ma$SO+eEIex zO}Rmlf4#SO=rRhm%T=ABe3?3@6b0R>Q$1Tq?NH)-z46skxq<5=&>Bx{{xnk;_%^r%VRX)zSW}o%~T)uVs|n zHobM@Tl6*>vUSUNY-uuOW+G#-)ElWp5ER-1tzhQ3DBiiLb)++pMikj$12-{z#BkC+ z$=|R?F!A`v52om97Z)g_^N9sbeI?5@ulscvvwQ#^%d@ww5^qP-dTS! z7B-P-H>y+Ze zqZ{ab7rO#I1KkemGg_>U8wV-fW)`+o`Y^C;1AS@-qqYGg<1jCm?b4o689_!NJ9H@K zmFSh$x)ve2SHer#{lY|aWfp6OAnL%-i_5}60LmG+`mt;)CzLMhQ@i4L_|9@2UnMy{6;mo5Kc9S*otw zv(0vnyc8XiP|2ixL|($@kvI0Ah6GmlLOv!BkO@J^TA12e?nX|&4-J74FydL}y<~YV z+h{W{B%jGgkR)#;E!UA`MtR^f!kFU(8{{EpnXH_kbt`4ccl%guxb!$J- zW1;O5^SQ)7)21Jz>KkEZ8m9ay36~*i_!uewXl6BCF?n?`3^*w>pQJr4_+)kylwWpN zSjuSoTkUYB_)X-8L>6@AvKY^{+u*!}^qN zS$A7!?e16MAuy=nqvdmdgr5zuPe1cd9b#Nq*?XGnLh-0Ble`@C10Z}2<(K6QxAPa6 z3T@@-lP^2fUpoz`-^;!%e(Q2~w0VvBzP$aNTwFGBNPJ(zT6^$qfIL+P`v3lM%N*=d zufY>dAbru{`veEZB51&(>|?zz0>AG~N=*}zEaYRbbSFYm{*+72uI5*Eg@40EicD#bfQY^MyJR@L<>U2T*i^gHOJTO z{`MW-*7xh->9a$%=ku~++w0@u=vcMJ7mnxiXmR`V%J%yR_4^)s+E>@s?fI>QwZ`W? zBla8N`|vn+yZ!8BaX81v?eSChYrE&;zUM2}_x<_$CTP3T_2)4b{8yE1PUrVD{fDXQ z^7l~S=kWJe?DF^B_s6;Kc4$BL$GY$PvhQmspw0I?FP!bo?RO$N^mg0j?7MRf-PqIn zK!?xAm#nRi2hH~5+jP#>_rurxdQXb1&-<{e7iP8R{Z(kJZTE4{$L03N&D*@?*Es9f z;`ig(B)qTJ{p;}aweJvim*@A@q^-}e?>pJY)gr5s;v#;qZ_vZp^~<-N?#}y`uiN|4 zW(g~=*ANKY^B4K+HY?%$wT}05=yfvZ-UnQH-7QVdlIGmwxO=DU!S}O|CwY1-!sqR4 znyuUCz;=(%GxzpQ=<;^Y>2PUq&LpdH{=W9%TNQ-re$m0?#*@k7jmbhx!{QQu_xF8h z53kOYZuWtL6rbbOiwW1BSLQ|RzMHMu$Qn%{e4@E!;k?Rw3Zs>u4U`wdMXG`UYnVQK zkV?CLEp)f<=Pq(i((*OW_s7>|hiquZOU-uswSXNndWr!gdkPjZ*_O8|RnE{SK5fs? zVfWFIrVJq%)t~zH=K$J!)rTg}0gpCJBKHY_fsIGcb=Co?pncrFTF+8!;+I<)Gs1Bh zv+f=mEg#u&43d%UH%~yI-PskRS@vd^ZPwpsRE6yd6n&%?wOAv&8CAkrk4r8>c_DvDn7DZ8!*ty$B z?EtSnF6~czY+o;nx+AREaReHJhQ#z)-K!nBj7&-L^QFt(Fz@eY+n0{7+sN3r;>CI$ zla;eN7kHTg@Z(2@Ks&B3dpw@hrSYFs^aA7}CxY2NFgq^6xZnW*ZXk$&HSw1fGSgxv zZbkqf`sil@_aR(_!?vA#@uwcg8pF{}Yc(;ih|EJ*NfH*Fy-S{J8tXSDM&Uy$_9r+Tc-tK9gY zo9dxQj=)91EV%;9T>@Jo5%}1dG7*b`Wy*7t$q?a7*f_7Q(#qba$p~VP*6|(kqA8ro zpQp6>);;@gYVUE)1A{e7Sp`xJj!BCi_gl}~Nj1~*L#Lxe<#Z;ixIuVH*Jp65%|`O*=>&;19uJ0r+BzE($KVyXUanv3NT3BuEP<3m;D>OFa~SSigN1Cm6tIqWK1j9zZPLhg*8)ZWxQ~@ladXQI9`=u zEw?jR9z9NX{TslmB(LA?t7Cnu)~mW7SYiLP$F479CwIDpsNhmKm!C`4ja*!p7d%7y zc;W}DuD3he*dU4DvY%pPwc0iqKPz8K;Tw?mtoMdk%6&*rvI6pOkl|%4_H2T;>pY8O z@Ickg$6B{uS$$V8!!CM2RMgDDfOk4`)@WBadtVk4J5iPVgY}{PU}c?Gr1V*kU=v22 z9f!X;6dQe3C8~O+Yn!RS;GYXezo08z;JR){BlHoNoh=HPP{Zoq&+*b6LguGTgm^c0 zI*(g_ZN@o#`|l&?JdrZvxaYk8sRtGC_TA~i$8e(}>Rds<;^Eq0W!eyoTn}E}(`Jpa zc$$&fW^lMtk6E}B2o&H=bJ#i_cSU;F(EcMQ>-uN)s4@~7O|WF+6K~9`mi^P=VX;QZ z)nq#}*{>KrYxsD8?vp)?d!n59&@e^CE-}0K3>VOqXs@Z zddQ{1f0UG)eOlQz!1AoYZ84Vb<5}cQ!Y^J^-&!!-T#@ka<*f%4UwGk|y$hw0MIvW- zWuyOAUmGU*AY9xlyQT2AQWrrke}i_H+RV^J$6hc886L<>bSCQI~`)&HHC)<&8+_D`!pt4a?ni!FKOikc|y zwBF%bIG~(&$rDaI-eMVFPS@Jzd8q_1+*V3{$)xRKHVvP7R*H@8lB2K!a?Z z6}rZh5Bucp&ILOAyYMpElV>%|G|yjaLG(yi-+<@^c_2}p5)a(s?HOmYZuyN$2Fcv1 z<@o{d^U9h6GT5wZ>>9^S-7$v;SsQg+9PcI!i&=dSZW6+d^OUvdGz<3YCf;jjyRAp( z^dUm6Zv|_N(OIPm9W%sR@|<>9q0a7@pffeqNBsE^qU^Qi*$hIwYt5R9HD|zXG%oC^ zJm=)XOnO1{bdvDk^DGB1#PaDmD0AXzKk*xn3POOf<%5d=gdlp2m3NfuY6SQ``jI8i{;JQdp)@Rd@KSA7rE7 zgIA6>+$;&DhdmC>$kWyU#I1*^n9MITsgA<=^GOFT(%-+OM@u-t*|RC~?h%~u4hNIn zQboskP8HJ$b*>ZrD7K&cozheCbmf};lrV;0#?a!Rk}-5o488Ob_7(R@3lA?n^%-Jr z|1?7Wl#HUyl<6lJDyczUFrXzLd}JF^ZB}!v?Y$L<9fk(s%kGwubJC(LNx?F57SPCV zzbmm4-ORm`lS-i0dz`Q_DL6e%;?3BiB_3xY zUG%s+jOdrU5KL^b+#_JAsz972R}BH7AP`f!Em^+a`r7@B<@Ne{`5JBke0_$p4yU{p zEA?peAX6}(Cz)9kOKb${T0>?pCVCM`(t{m-Wn1DavC7We=yRv7Fg@^}+Ze>|M>SoJ zo31K)BQPG!W-Dlyp0B*s;Q4_BO1aPU>T^?;a-q;O+Y*`JXjZysWLwp-IMm$T^};Q- zsP^(rex@5ohK+Vnje;N&FAXuMK$oOp{q|gky|q$*nkxzy#H8*RlDc=WdxxZ8jFZ#M z8=-kz(!d-=gNy_X7X-Ec5ab*QGMHr{eZ*($g=&(He0M>rGyaKaZI6gc^Ke!bm8tln z7927$m}*-UzP&d96Q;;jX1v!Nu?>eQa#Kdc5pxZ<%4+HqgJxySWK>C!TiaH4+22va z1x17tGS(sh)!F?^j%F|KX)h1XZg;qCvMakPkOpD#DuGL4!~o?07YCu-7<$16dLe$h zJVOd>d^D+gpQbhxH~sH}RhRz4PY-_GaxmQDoDP-+XzP|xn%cgZ{htFsY#0mL>bm9I z#ex?E*v>W`Gx_KqD9UCaUAeTRbAj2j1kX|@y5hIVCbMqIlCdZky`oy9TzUgjp?^$;+?m?B^lP zBCRh(edeLfBGm2l$*^LAibj9Zgk&MUBbed@u~oF1?x6=Gv+#N#Uv%oyOV%NfgoqBePju>ywjDE@ms(OZBkd`~2l4Uj} zv&52IS$^WIY-rB**oeyM#QF~tJ(s}5d8m91@!ZIbn1M_gEpfVI&Y02auQJ^>rW?t^ z8Ic%Q4%};|b;`P`ZI?M;^G3xWGIA&jS_vz}kMH-7Dk12DfV5A=XGY_6FkXAC__nM{>lUWDvit zyj_#xTwH2`uMo>PNCIDfGPvOJOFt+T<+I;+Y)+hsD>+c6(T~g!o;bQ7!8Ce{S-a8W zjZc#9oCH@|dD1GNTbXP z3&|kHB_BapqD%wlGin9hOf;GwQw!MQ&IvyZ8SU&(D6)zT;uK_4fxi?jT=KBH#cxLp z3~y!LQf(W9*u2>$LxnpQmSjixIxa{nxUk6+veGVc!P0x5oM^?@#au?%W29I8;I3pD z#iFyP$u)=o*{N(b=%43f3sE6qDf zv^d<*EF2Z$UCl{6Ag5GfX-{Uebjezb`ydETAGDX%NtVHVZiK!tg7hKteQV{fTT~RhDSx&Q~~~EEobRd zj>#$x`5LQaaI;0?02>;1BfMd;ynC~RCu)dymS(*WZ(B_&EjvP0vEI+;U7;t*WG{cPUh1znc}aY0oRm1yj8Q_bY<^&?7@FS8 zDYx{Nc#m3fyX~?qtYTC{mPtR-(#dFCV%Z1h^G`f=uO(zn66s)J9j)BC_nUALdRqFd ze6~(`0=c@YlM5q#YbkDN9jqG`3+;YD6uL^aviQtyTaqlDt|v$#MZC;gfO{5*IFkf4 z6(DdyLZbn@3k{t;dq4wa$b`mNA3j|{ElLqN^|FQ=3&+`LA|M6=S~NH z_I8u3OdUK<4~RGCama$C)th|EvuaQa@I$I zzMS}Jy+WdK=ZZ0zuOfqF+Dlx zzeXhTaK@uazy{%o=A1JPF~-D*SCm z=9x+w`0cpl#Y@~DcOZsIB)lY$1|t}+j5R=2P?c+=mYa>c<>Qs8t1-R(4Gb$;GrK*&bE`;$h z$%krN@@j+mX&%vx{J}6!%MKQdj&0F#n=2xIwXtCPJ|6{o4^KI2|j!V0EtU?A&{PQq9Dh#E-R>?`R+u5 zZr#u<LL9{=G*;+AxqT~70{JByL-G_0O zb}H~LxoLM)-$=WhuE2~_keJj#sBxvm#6i{(=vyonQOXTVP{3?%oXjjSOBqy@6Q0;< z(xyqA4B=%R2%9`r?IbHia+8ejV+jX-8C0)M5_@z?D@jw3k_DEIY@8m6^al6CWRRso zOLb^kz3$LDx^fZ?XPO+kcuaS@}F;vYiisZT29!@xQaf z(vlW@n^*wzC}6{`UWBq?jYGV7fIOwx*W>ydgl9j%Q3IZZCfj66`nCK6mB_2kbiX(ZLlH+=xo zvfK}lPb(Onl_g$gr1`V#K}Frp=@i`QLCsasw?}#AMKsha>OV}S6pwxw;Q5kvPc{&QNORb)L2~{=>@|{BJ|sNhQ_)mY>)3jl`^D}N4^kW(d@2KFEgqA7 zJvtY5;|98XPILQXebcium-|k@!|KA@21)B-(^m?N8t8>2Kj1YX#CRqja!pTJ7RHC4 z+Kn(WCiGbCrmNvdYmuM*Z6ah(LAe@R3I1Rk-5xbI{UuF0f&C95i%+5b5Cm+*}JKpXzwqaG|ml%yS?B4IEDn+~O9*q|4-dDbAnI=u&9y-+`$;3}6|8i9hZU{3u z1SMBS4zH&vnI8UiTl-fYPFwrN#_}@BtH+#>^=T$mX)7}9L_P^JB+ZLhjv*=2Txbbi zcOywvTii7S!m5FowrD~QV!XMH@^q5WGL@csV%_|>fnqt$ODo9+*7cB3Iq{7AFiU`_ zGHF?^0MTf3RxJ1{`6THUq_zKzT+5;D2$uOOzMmIdHs4lSWieRUraa~`%p|$>F4~cLt6v65oyT;w9u1D z3i#Xl%=Z=?DswQLVw-hze%WRbPM_|iNQ%C)1Me`eYD76p*Sf}HDJrnMT``ZkMmJA- zAaJV)yKzw08que0H^nnQZUaM_^=@9MxK&b!Jb+3%wX{Tr!7d&pVUcP}q5uKj<$O~nweQt@ijh4p(2ye!!Y=bcC`g66lS>Hb;G0+CuQA2!K59qC%v_Dl|Q@ei_SMiMMmT7y=qG ze($<4l}0ZoPlcybd>G_djf48z-y?0gX#!%kfpAc#OJNp2P2d)3spe_EIp(F z=tC*W`p`VM&z32*YA^wdhBbhoL-iK=81zM435h8rLo64Frcsc_ny&_iI0k@+qR2(! zoOEPtX{LsI`aJ2(eE}scdQEOgerbt@dyfbf7)vbMQKhERdgKrws|t=6_M8!{0g$gx z9|}~)r%Y%J1yzpGR1t?NE#8b4+}|wC?m&fWol6NPu!FXbSB0WmYeUdf11zJ#N~ zao&&)^Maxk)<%p-{c~)Bg0L1vRrmyirw5&wO;W^6A1uEOypjDog_WY1lt;>1Eb31$ zx}GQGRayQ=EB2|b+^CF^(Z|OFXFm0;_yMQtP z9^1c7Om(n^nU>}X5sXzG0+- zXiZC*#_V$cj19k;)&K92Pl; zrACr*L6Xqc4F{H`c1xdES}Kcy7MdJbW5VRFronM5(F)p1p(32)O>!JlLnv}KEzv`<7!1GX#r(={TqTWCiu@;XgNf)SWPB_V` zpi6&R^SVa>4SsV)oCp?phR|bHb@2VRq6hjvM9de;fG?Vo97q&R$tElIXr;DE^t4Hw zXeZFC?7L$`Jf0?EPj*W^mcR%)(!6@5xqy0MbAhdTLWa5L=t%cXz8M^bzyV?H6j&w4FzG<-kMbzxI~u^gCCpOLX&~z5d(@r%5Hsad}pT z2E3?SsvP5?^Nl9LR*dZxc)1ScLusNUn9Sf(>(g~c^AQlF8CEr7i&2wd+FqVNB@f0_`|mBr}{#)sseZ!xGS z+{z0Yd7kZ%w4v>qdV0c{k6Qe=xWcbC&RdO=6(?UhdMSql(Gm93>ZcAGBAdVHGrVqC zsMqC`%1B&`Ts^H_!_aR<<~@~FZ`LHimb+t~#kPrP`(EDZD!plx0EWbTKoLUxUC3OV z+Ce_)!(!7j7bySH9L0R;xhx*je{Zod24#(3D`_DN0$Gt0ugiwCv}!Nd!98$z8`7w2 zamniTXK{zyi>MhMI!q(xz3^@eI`cG~PBq}JhGvg4gb4cIF40ODI3bg8Jy zn%#xcEmd;^sJmSKX}%~}>1Fv^vT)eNNKp;caJwk$D2Hs(eq+*X+IF=*Jy63Pfk2F) z6Yhx^YcC$vTPd827x5=*&&o0+&UjypY}Eo=Y2v6k1Bs|0D$NM-CW@`XBDcFp>i#W& zm7B>$*CLhUQzKjt(&d>!1FPfrCC}gG^VA>Kveo^0b2rTI$7#85kIRB{`71~3N!~G| zR_w=HOU>u=;fK6E-;FWfH@V<0jDzS!Sl`d{?Q`SkYU_^bi)<4Vb&CHxwEV;~oum2Y z_k5qeb&oj{ye!Mp1|9XDi z$haf;fO*?{kc7GXdR(|&S>p{_dcQ1b`SyGK<%_{SkkOyy;Ogsn_mQL5owV`Tj|Vt9 z@;P#`USuTUe_F7|0_`S8r?p*`aRS}g;P3h@;UEGc-p%20fjNEM;H+(MniKJV%*DNn z+Vgk5oD|B}tMOe072O#)*>n6^7Y`$Gm<7%?>3kl=)ri7)KfOKWeBN)+tpMJBytsd? z5dkywK7d>L*}6zm4Ej88$Q@ug`rq$Ki{IeqI{AC|$MD_HwVkw!arhUEkLS-RBBo!Y zf$ZT5DV*J(OH)Lj&t9FoQ9(N(m$hH6UYxEm-fM6CcZXl^Z%=-{Pr^s>u6~OsY|w`YcjjwjXN!E@dv7 zc@9rM$i%Q>@|n;4-G;pzba4P!?gD@M*61pO+Dj=^ewkxppPW*X`e% ziWofX-r4GGGfWmk=01vs^pjMks)lkpGA5t4~xC6&*7s8js43c!#M98GHiX|h9L+Uq9h;Rew`MgtuLgQW5 zmSF}$wQGDgIlU5WDY@G8dvh!j_wddh7(?NO$s9U*Ji2<&T&)r}`n+r0Hh+(qp|fxr z$O8_%GvDOYJS?o6$z&=i`bW`-&C&fWqt-^Hu&LljdUr+>5e|oQzU~iKeWleCjl9I( zX&<$v)ZS!g6J-s$=w}#fx5$S*Yd%8Vey-Y|)Qvu{ywM-DpL3AAUe#@p-+2Xnh}osB z$zB&S_F4XXy8ywlNaXKo-dcnb)n*cQ8isniPzYK*9tT+ie~W2m%;#+0q9(}BqI|@& zZBt|!RDaaw>$3lhe9YK47k|{Y@0bx-=O=uhO-zUJRvPJj%GvZgHX#-O@viP}_3C7t z;=Q6n^m)h@#-zv5aBcUJtZKrTZ>~Tvn*(~;Ch~T&&9i<6v(EA8O=}4+B%M^0W@lEF zi=X19Uw<}Jq`t8%kVWizsUmMqmU=q9LF9r zDE1r^oR9*(X+0#jqJ-HkiD#U06|ZCFE1h7 zYVj3aAS=5xJkEWz!IouN?-ny@e;po!K7L5JO-Q~QPo6UU<3awnX!aETfb2J_?RZJ^ zE3uM`8efr}`d1r6bzy=%z8$yeT;bq>J2JuOiTl*A5p1tTw5vpuM^)neSt5Sk=5xbZ z$K@hf+p43BWI-^A`eXDGow55u@goketI5T~qgkKficDR29?XH$*m`YbGtQdoO3#tH z!U-VZ+B93j_(p{sJtslD)I?s$xl_4s62vDD^tgYrQzXM1hE#ILv|*2>s}s)j;33T` z{xgXkyFnF6O5dg~r64pubY>K+Nvp;)gvq?s7~f@mb;j(UB~WQV!j`{zhatu2^uGcda-nwI@` zFocQ0mHu@IzDRCMjvwq`H`gL+2$ANaXl&hv>n2y=%;hta3`+K<^dYBvlT7g+Bqkkw zRd5kP2cNRW9K+c^2C`Y!4ROAR0E4_QN3k~-Lk2bY^IM`dr0srCsqo>`G>^`hSE(A8 z4wOXj{07SrZ-l{{YL>l+MI`OCuAb>fZCPg|a#K4?p}kVwwCcJi(<+RqiM84e8e{?X zk#v4MTZp7uU2`>9>=F#1&&OGya&(!%C}&UgAUpqdVkcGWBp?1YNr4@CCC)mUf#z-8 ztHyKVZD>i^uo{RASY}}aH{IOc2&W84fSLBN;`otQ z;w%!m2EcFC>yM@0$L`&02)hy}_@-FkLB(m~Ecg9-*_(2J!px}NDgU~?{3wYFtJ}N!e6-g)!Kdkr zLdh0DIgUF>)%1)1lz1gOjmzcl_(bv2{zF;B#WO+qqO2s)*Eb!UkOw;s3%Kd-r}KU~ zawGEdz57_>@9??ncLS?i;@`h`_WYXoO5}4+R%WO)5;lTgZ4epFn7^+)wYIIaNi?r0 zXMiKC)jRTox1r-my`xTp?O`7`vPS8K=2vpzsjF)G%#V9AE)0QVVE zK<;3GI9~thtMuVv5Y8S?6@=p`JOtZZ8FJb+Z`7`xQ@F^F%A8x+&|kv`O_KXD!=u!l z#6t0&52Ml0&Yc&J0jF2NL%_4uK+v>r@jc*++dpeFoO3%Md)TF$940(-m}fIyl^QA~ zL)$3vYnAYyw(6*sWjhmYAaw~O9N7ZbT&AOEZ8n~LdHJ5tk(E>B?m}H;gE1!J_T>?l zp?CT2o-*cx%HW5}Ah!QseNK<=#kxr6vtt@rWCif9qZJr(l| z=r%{cRu26vHE|66Evb=C6KTtbYz49ru6S@Lns_Sl@@pWD0J&%Ov^6P;|!Kdk> z5l%3F4f;WNd9AV<>`r=ol38PeA*Zy_o{8-%>a_PMVTwl{m7cU;X^W=o3~_0WxU?Q6 zzVNbGsJsu9GXK~2yjww`~ed)|}EM#vfL;#S_7CgSI_a}tYd7(~H6F;m{n zx~F?xYJozHnQMp6Z-qhUhRiCLI-P9-9LA;b8!5)j6c%=Awa@4ciE8~HLfB@Kyy^U4 z1nC(RwmFg6kb41|v$2Q5Z?orIX%x2D))%09uh;7ZfA7K}_TVQMT%(Riu!n5TCX!(a z%%2YM0Gfy9<;Nv>Rs#`^=5_dSDvWYCP9puvW&*|Qu!YH$&tzrGtiKjdee=G4BM|YE zPPcAd-%uiqio)De2*?mJPa+c4NQ!^s>fM)vm)*P2aB%wD!C*KkhkO3-Cht{62Tbb( z8Lxis&t=x1yr)MNvEymp39u(09ZcxW$oTz&^u$HsGdk)RIk-Je@T_rjm$FX>^vlbs-Ub{=1d+B153Ev~V#?=lLdK&~Iq-A~ zLysXv2SIMs#^Tp*PruYEBmmQ@np!s07gTI5=^g=cvk3tL_`3*K>MY6AVh479-9ftV z!Jt$HnwuhL1c`pkxmS=OT?dgp*(m7Wjx248moQz1XNo=#LU=098lcWXDjs}bf6OV0 z-0cX?bvsc4QtDB@%=_<&EL~uDKz`etb<@8qg{kfjZ?o=Rf1ey&O~|jwa#$AxteZ%F z_aOEws#th2mk?wUI8bk%IL>h7b;-kFvYDD7)0>^8D&JkuC_yjilqJD~2QjVzzbY(D z1f~fM$goFMmD;#}<$;~-f{%(R8u#5Iknq7roAY@cIn2MqTe=y49~-yQeJ35?31ptL z_$i96j!T9e2oj@1=8;lZ6TX}(YYN;t4SWIWy!T!>rNYlhF(sp-Ni0L-x6xd~=Pytm zR|>_Nxx-9;79)Sm0W-vmv={_#`WGc>C-?4c?r&xUr8LP3!KG- zvQzpQ1ry|~92oAsvE~=?j5hVLlWC-`lu-NY$MLgp0%a8C#3w-`yYXg8U6y}JAT}9y zz%fhv>^fXQuwTAFqHFimCzg=VD~0jXT_b^v@ENoZ59|L`M~Fo3Ln1G4w&FpyMEzCW zCkP*I*o$xfa-(i%O`|lE7v^e2H8wbnY?<(@IvGD82>DzN&F{iku|?Il_q^KXT)iu3 z@XS)89)=JYPjf><*YWkN5z5V#a^3-2b+u!Lw%9;4OX}e+>+q@>#HkWDG)uV_#;Zpg z9&&BDL%&IcRv%7?K@gny;+KF4)1Ha0rL$=r5$7lDM~qc7Z%to6LU_Iq%HYw#cTRqV zX{W9~>WiTtWWOH*}7iMHttX5TmKq z;HbuAFyeHBG#lIoma^Djt3z#RmF1^r1ABXq=FcIk_j0R|O*D_&%oj zRw6>)1PB4iws?o?5k_vKtQY3K`U|QLK;s{^zthGlW%zKIkJJPo zUOh8*w(o?;ENa3KnS7hr1E|krLOF2*Aj|DSI}_jJCCL$M9Le;*eb)#l8uiLQh%m<{ zJ;UaUMg@Va^J+(>XMrvzvu@jUXM!c4LIA~bv~lIe2t2}l>(m0UP!StVLRZvX3LqZZ zsDVSes@H;bC?3ehl4+SB{fe^zk$~YmA}v0izTGy4FiwgAWp|;=>Y5qg3bOKjMD&P# z-Z0#kKUd2}?<%bg4xIGBoe|*%zZb>8Le)!8CiL6ug&Zw?4KCVyX1DqXXJ5owUIjEQ zC+_>io1yjeZi+aXL1;&wQFzqN{L4KBmc;09c+kel4>!kl1n+*`3?iBrrg9Aq{p$ZJ zc?mlnd`f#xwCQLO>39s`kmHWAsCVws>30fKMS*XZh-15*5oTn*(X)N-`SV)p;K3JG z`d3;$9gRGuI8jVlQaP}YruTn9Vn(lhtJS=p#7A+WocNz4pHK9x5#{r>Vjtz_FC~ex zIyvLI6*VhdCcRoNdAawLKUg~>dX%Qky7<2o&oe7^| z3i`yJ(uF5R#BUl_(4Guvw4B00gT#?fw4^nE#vZ%t#E%%652e_ip;zDo&29J~3ab`L zR&tX%41&H7Fw;_wdgs_2gCNi{sATYpx;nH!l+}GUXs#{y4|OpzFzhQv$(XRVVkXN^ zil>}-*R>WX2_S~aBm`7z$W&B&vxjM18Wr4kZ3>HzBEv}=*R=)>o;E}$zyA67B%z}C zqYHe*c_Uy~lj>q37_Pfkx;1UwVm2!lQG0uShvlHquM2WH_0LLV^WxywPsmBk;UgRn4gvhHEgAGB=QJG}716 zuf{N?Xco6A3!v3=#ufwzSK{^iN1j&tpaZFqlLg(Ah>PbG*X?A!Xw)9mBhbG!>O}T? z$lZbRL|J)XbsyU-p~uq~C>>c{Yuh7yBesWqzGvJkQhgMh3waZXRU5P_g5mEKicFRP zE%*b=i3g*oUrY!}s)IhdO z=*<$1QwaLGf8_brsg*t#`#LILwUxPT%(vT}>T*0(XLv5jcAhK>egrh(V<06B@U`m(^p^XebSn(afcAJ3qk1MI0a|j97Z-5S~5><7Z?PSvg zCMC!0GtmtWgHlz(3Po5^sNoqc8 z9xOe#9Iot!URL6jCi`3uWk46xel0C1RK*Ug9m-BEwKa0hc5nz5Xy%LH0H+K|Fb(P< z6kR0mrsTP24gamVTdx@rPMbJvo{&QB_<1XYVBHqN(f@JB cm!-9kSif4<~7xA-^ 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 KOPK$f!~X!y!E?R< literal 0 HcmV?d00001 diff --git a/hardware/Production/Spektrum Adapter SMD/Spektrum Adapter SMD.PrjPCB b/hardware/Production/Spektrum Adapter SMD/Spektrum Adapter SMD.PrjPCB new file mode 100644 index 000000000..4cc1642b8 --- /dev/null +++ b/hardware/Production/Spektrum Adapter SMD/Spektrum Adapter SMD.PrjPCB @@ -0,0 +1,1084 @@ +[Design] +Version=1.0 +HierarchyMode=0 +ChannelRoomNamingStyle=0 +OutputPath=Project Outputs for Spektrum Adapter SMD +LogFolderPath= +ReleasesFolder= +ReleaseVaultGUID= +ReleaseVaultName= +ChannelDesignatorFormatString=$Component_$RoomName +ChannelRoomLevelSeperator=_ +OpenOutputs=1 +ArchiveProject=0 +TimestampOutput=0 +SeparateFolders=0 +TemplateLocationPath= +PinSwapBy_Netlabel=1 +PinSwapBy_Pin=1 +AllowPortNetNames=0 +AllowSheetEntryNetNames=1 +AppendSheetNumberToLocalNets=0 +NetlistSinglePinNets=0 +DefaultConfiguration= +UserID=0xFFFFFFFF +DefaultPcbProtel=1 +DefaultPcbPcad=0 +ReorderDocumentsOnCompile=1 +NameNetsHierarchically=0 +PowerPortNamesTakePriority=0 +PushECOToAnnotationFile=1 +DItemRevisionGUID= +ReportSuppressedErrorsInMessages=0 + +[Document1] +DocumentPath=..\Altium\OpenPilot.SchLib +AnnotationEnabled=1 +AnnotateStartValue=1 +AnnotationIndexControlEnabled=0 +AnnotateSuffix= +AnnotateScope=All +AnnotateOrder=-1 +DoLibraryUpdate=1 +DoDatabaseUpdate=1 +ClassGenCCAutoEnabled=1 +ClassGenCCAutoRoomEnabled=1 +ClassGenNCAutoScope=None +DItemRevisionGUID= +GenerateClassCluster=0 + +[Document2] +DocumentPath=..\Altium\OpenPilot.PcbLib +AnnotationEnabled=1 +AnnotateStartValue=1 +AnnotationIndexControlEnabled=0 +AnnotateSuffix= +AnnotateScope=All +AnnotateOrder=-1 +DoLibraryUpdate=1 +DoDatabaseUpdate=1 +ClassGenCCAutoEnabled=1 +ClassGenCCAutoRoomEnabled=1 +ClassGenNCAutoScope=None +DItemRevisionGUID= +GenerateClassCluster=0 + +[Document3] +DocumentPath=Spektrum Adapter SMD.SchDoc +AnnotationEnabled=1 +AnnotateStartValue=1 +AnnotationIndexControlEnabled=0 +AnnotateSuffix= +AnnotateScope=All +AnnotateOrder=-1 +DoLibraryUpdate=1 +DoDatabaseUpdate=1 +ClassGenCCAutoEnabled=1 +ClassGenCCAutoRoomEnabled=0 +ClassGenNCAutoScope=None +DItemRevisionGUID= +GenerateClassCluster=0 + +[Document4] +DocumentPath=Spektrum Adapter SMD.PcbDoc +AnnotationEnabled=1 +AnnotateStartValue=1 +AnnotationIndexControlEnabled=0 +AnnotateSuffix= +AnnotateScope=All +AnnotateOrder=-1 +DoLibraryUpdate=1 +DoDatabaseUpdate=1 +ClassGenCCAutoEnabled=1 +ClassGenCCAutoRoomEnabled=1 +ClassGenNCAutoScope=None +DItemRevisionGUID= +GenerateClassCluster=0 + +[GeneratedDocument1] +DocumentPath=Project Outputs for Spektrum Adapter SMD\Spektrum Adapter SMD.EXTREP +DItemRevisionGUID= + +[GeneratedDocument2] +DocumentPath=Project Outputs for Spektrum Adapter SMD\Spektrum Adapter SMD.GKO +DItemRevisionGUID= + +[GeneratedDocument3] +DocumentPath=Project Outputs for Spektrum Adapter SMD\Spektrum Adapter SMD.GM5 +DItemRevisionGUID= + +[GeneratedDocument4] +DocumentPath=Project Outputs for Spektrum Adapter SMD\Spektrum Adapter SMD.GM13 +DItemRevisionGUID= + +[GeneratedDocument5] +DocumentPath=Project Outputs for Spektrum Adapter SMD\Spektrum Adapter SMD.GM15 +DItemRevisionGUID= + +[GeneratedDocument6] +DocumentPath=Project Outputs for Spektrum Adapter SMD\Spektrum Adapter SMD.GPB +DItemRevisionGUID= + +[GeneratedDocument7] +DocumentPath=Project Outputs for Spektrum Adapter SMD\Spektrum Adapter SMD.GPT +DItemRevisionGUID= + +[GeneratedDocument8] +DocumentPath=Project Outputs for Spektrum Adapter SMD\Spektrum Adapter SMD.GTL +DItemRevisionGUID= + +[GeneratedDocument9] +DocumentPath=Project Outputs for Spektrum Adapter SMD\Spektrum Adapter SMD.GTP +DItemRevisionGUID= + +[GeneratedDocument10] +DocumentPath=Project Outputs for Spektrum Adapter SMD\Spektrum Adapter SMD.GTS +DItemRevisionGUID= + +[GeneratedDocument11] +DocumentPath=Project Outputs for Spektrum Adapter SMD\Spektrum Adapter SMD.REP +DItemRevisionGUID= + +[GeneratedDocument12] +DocumentPath=Project Outputs for Spektrum Adapter SMD\Spektrum Adapter SMD.RUL +DItemRevisionGUID= + +[PCBConfiguration1] +ReleaseItemId= +CurrentRevision= +Name=Default Configuration +Variant=[No Variations] +GenerateBOM=0 + +[Generic_SmartPDF] +AutoOpenFile=-1 +AutoOpenOutJob=-1 + +[Generic_SmartPDFSettings] +ProjectMode=0 +ZoomPrecision=50 +AddNetsInformation=0 +AddNetPins=-1 +AddNetNetLabels=-1 +AddNetPorts=-1 +ExportBOM=0 +TemplateFilename=..\Altium\BOM OpenPilot.xlt +TemplateStoreRelative=-1 +PCB_PrintColor=0 +SCH_PrintColor=0 +SCH_ShowNoErc=-1 +SCH_ShowParameter=-1 +SCH_ShowProbes=-1 +SCH_ShowBlankets=-1 +OutputFileName=Spektrum Adapter SMD.SchDoc=C:\Users\David\Documents\SVN\OP-WIP\trunk\hardware\production\Spektrum Adapter SMD\Spektrum Adapter SMD Schematic.pdf +SCH_ExpandLogicalToPhysical=-1 +SCH_VariantName=[No Variations] +SCH_ExpandComponentDesignators=-1 +SCH_ExpandNetlabels=0 +SCH_ExpandPorts=0 +SCH_ExpandSheetNumber=0 +SCH_ExpandDocumentNumber=0 +SCH_HasExpandLogicalToPhysicalSheets=-1 +SaveSettingsToOutJob=0 +SCH_NoERCSymbolsToShow="Thin Cross","Thick Cross","Small Cross",Checkbox,Triangle +SCH_ShowNote=-1 +SCH_ShowNoteCollapsed=-1 + +[OutputGroup1] +Name=Netlist Outputs +Description= +TargetPrinter=Brother HL-2170W +PrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintWhat=1 +OutputType1=CadnetixNetlist +OutputName1=Cadnetix Netlist +OutputDocumentPath1= +OutputVariantName1= +OutputDefault1=0 +OutputType2=CalayNetlist +OutputName2=Calay Netlist +OutputDocumentPath2= +OutputVariantName2= +OutputDefault2=0 +OutputType3=EDIF +OutputName3=EDIF for PCB +OutputDocumentPath3= +OutputVariantName3= +OutputDefault3=0 +OutputType4=EESofNetlist +OutputName4=EESof Netlist +OutputDocumentPath4= +OutputVariantName4= +OutputDefault4=0 +OutputType5=IntergraphNetlist +OutputName5=Intergraph Netlist +OutputDocumentPath5= +OutputVariantName5= +OutputDefault5=0 +OutputType6=MentorBoardStationNetlist +OutputName6=Mentor BoardStation Netlist +OutputDocumentPath6= +OutputVariantName6= +OutputDefault6=0 +OutputType7=MultiWire +OutputName7=MultiWire +OutputDocumentPath7= +OutputVariantName7= +OutputDefault7=0 +OutputType8=OrCadPCB2Netlist +OutputName8=Orcad/PCB2 Netlist +OutputDocumentPath8= +OutputVariantName8= +OutputDefault8=0 +OutputType9=PADSNetlist +OutputName9=PADS ASCII Netlist +OutputDocumentPath9= +OutputVariantName9= +OutputDefault9=0 +OutputType10=Pcad +OutputName10=Pcad for PCB +OutputDocumentPath10= +OutputVariantName10= +OutputDefault10=0 +OutputType11=PCADNetlist +OutputName11=PCAD Netlist +OutputDocumentPath11= +OutputVariantName11= +OutputDefault11=0 +OutputType12=PCADnltNetlist +OutputName12=PCADnlt Netlist +OutputDocumentPath12= +OutputVariantName12= +OutputDefault12=0 +OutputType13=Protel2Netlist +OutputName13=Protel2 Netlist +OutputDocumentPath13= +OutputVariantName13= +OutputDefault13=0 +OutputType14=ProtelNetlist +OutputName14=Protel +OutputDocumentPath14= +OutputVariantName14= +OutputDefault14=0 +OutputType15=RacalNetlist +OutputName15=Racal Netlist +OutputDocumentPath15= +OutputVariantName15= +OutputDefault15=0 +OutputType16=RINFNetlist +OutputName16=RINF Netlist +OutputDocumentPath16= +OutputVariantName16= +OutputDefault16=0 +OutputType17=SciCardsNetlist +OutputName17=SciCards Netlist +OutputDocumentPath17= +OutputVariantName17= +OutputDefault17=0 +OutputType18=SIMetrixNetlist +OutputName18=SIMetrix +OutputDocumentPath18= +OutputVariantName18= +OutputDefault18=0 +OutputType19=SIMPLISNetlist +OutputName19=SIMPLIS +OutputDocumentPath19= +OutputVariantName19= +OutputDefault19=0 +OutputType20=TangoNetlist +OutputName20=Tango Netlist +OutputDocumentPath20= +OutputVariantName20= +OutputDefault20=0 +OutputType21=TelesisNetlist +OutputName21=Telesis Netlist +OutputDocumentPath21= +OutputVariantName21= +OutputDefault21=0 +OutputType22=Verilog +OutputName22=Verilog File +OutputDocumentPath22= +OutputVariantName22= +OutputDefault22=0 +OutputType23=VHDL +OutputName23=VHDL File +OutputDocumentPath23= +OutputVariantName23= +OutputDefault23=0 +OutputType24=WireListNetlist +OutputName24=WireList Netlist +OutputDocumentPath24= +OutputVariantName24= +OutputDefault24=0 +OutputType25=XSpiceNetlist +OutputName25=XSpice Netlist +OutputDocumentPath25= +OutputVariantName25= +OutputDefault25=0 + +[OutputGroup2] +Name=Simulator Outputs +Description= +TargetPrinter=Brother HL-2170W +PrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintWhat=1 +OutputType1=AdvSimNetlist +OutputName1=Mixed Sim +OutputDocumentPath1= +OutputVariantName1= +OutputDefault1=0 +OutputType2=SIMetrix_Sim +OutputName2=SIMetrix +OutputDocumentPath2= +OutputVariantName2= +OutputDefault2=0 +OutputType3=SIMPLIS_Sim +OutputName3=SIMPLIS +OutputDocumentPath3= +OutputVariantName3= +OutputDefault3=0 + +[OutputGroup3] +Name=Documentation Outputs +Description= +TargetPrinter=Brother HL-2170W +PrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintWhat=1 +OutputType1=Composite +OutputName1=Composite Drawing +OutputDocumentPath1= +OutputVariantName1= +OutputDefault1=0 +PageOptions1=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType2=Logic Analyser Print +OutputName2=Logic Analyser Prints +OutputDocumentPath2= +OutputVariantName2= +OutputDefault2=0 +PageOptions2=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType3=OpenBus Print +OutputName3=OpenBus Prints +OutputDocumentPath3= +OutputVariantName3= +OutputDefault3=0 +PageOptions3=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType4=PCB 3D Print +OutputName4=PCB 3D Prints +OutputDocumentPath4= +OutputVariantName4=[No Variations] +OutputDefault4=0 +PageOptions4=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType5=PCB Print +OutputName5=PCB Prints +OutputDocumentPath5= +OutputVariantName5= +OutputDefault5=0 +PageOptions5=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType6=Schematic Print +OutputName6=Schematic Prints +OutputDocumentPath6= +OutputVariantName6= +OutputDefault6=0 +PageOptions6=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType7=SimView Print +OutputName7=SimView Prints +OutputDocumentPath7= +OutputVariantName7= +OutputDefault7=0 +PageOptions7=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType8=Wave Print +OutputName8=Wave Prints +OutputDocumentPath8= +OutputVariantName8= +OutputDefault8=0 +PageOptions8=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType9=WaveSim Print +OutputName9=WaveSim Prints +OutputDocumentPath9= +OutputVariantName9= +OutputDefault9=0 +PageOptions9=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType10=Assembler Source Print +OutputName10=Assembler Source Prints +OutputDocumentPath10= +OutputVariantName10= +OutputDefault10=0 +PageOptions10=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType11=C Source Print +OutputName11=C Source Prints +OutputDocumentPath11= +OutputVariantName11= +OutputDefault11=0 +PageOptions11=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType12=C/C++ Header Print +OutputName12=C/C++ Header Prints +OutputDocumentPath12= +OutputVariantName12= +OutputDefault12=0 +PageOptions12=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType13=C++ Source Print +OutputName13=C++ Source Prints +OutputDocumentPath13= +OutputVariantName13= +OutputDefault13=0 +PageOptions13=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType14=PCB 3D Video +OutputName14=PCB 3D Video +OutputDocumentPath14= +OutputVariantName14=[No Variations] +OutputDefault14=0 +PageOptions14=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType15=Report Print +OutputName15=Report Prints +OutputDocumentPath15= +OutputVariantName15= +OutputDefault15=0 +PageOptions15=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType16=Software Platform Print +OutputName16=Software Platform Prints +OutputDocumentPath16= +OutputVariantName16= +OutputDefault16=0 +PageOptions16=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType17=VHDL Print +OutputName17=VHDL Prints +OutputDocumentPath17= +OutputVariantName17= +OutputDefault17=0 +PageOptions17=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 + +[OutputGroup4] +Name=Assembly Outputs +Description= +TargetPrinter=Brother HL-2170W +PrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintWhat=1 +OutputType1=Assembly +OutputName1=Assembly Drawings +OutputDocumentPath1= +OutputVariantName1=[No Variations] +OutputDefault1=0 +PageOptions1=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType2=Pick Place +OutputName2=Generates pick and place files +OutputDocumentPath2= +OutputVariantName2=[No Variations] +OutputDefault2=0 +OutputType3=Test Points For Assembly +OutputName3=Test Point Report +OutputDocumentPath3= +OutputVariantName3=[No Variations] +OutputDefault3=0 + +[OutputGroup5] +Name=Fabrication Outputs +Description= +TargetPrinter=Brother HL-2170W +PrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintWhat=1 +OutputType1=ODB +OutputName1=ODB++ Files +OutputDocumentPath1= +OutputVariantName1=[No Variations] +OutputDefault1=0 +OutputType2=NC Drill +OutputName2=NC Drill Files +OutputDocumentPath2= +OutputVariantName2= +OutputDefault2=0 +Configuration2_Name1=OutputConfigurationParameter1 +Configuration2_Item1=BoardEdgeRoutToolDia=2000000|GenerateBoardEdgeRout=False|GenerateDrilledSlotsG85=False|GenerateSeparatePlatedNonPlatedFiles=False|NumberOfDecimals=5|NumberOfUnits=2|OptimizeChangeLocationCommands=True|OriginPosition=Relative|Record=DrillView|Units=Imperial|ZeroesMode=SuppressTrailingZeroes +OutputType3=Test Points +OutputName3=Test Point Report +OutputDocumentPath3= +OutputVariantName3= +OutputDefault3=0 +OutputType4=Plane +OutputName4=Power-Plane Prints +OutputDocumentPath4= +OutputVariantName4= +OutputDefault4=0 +PageOptions4=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType5=Mask +OutputName5=Solder/Paste Mask Prints +OutputDocumentPath5= +OutputVariantName5= +OutputDefault5=0 +PageOptions5=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType6=Drill +OutputName6=Drill Drawing/Guides +OutputDocumentPath6= +OutputVariantName6= +OutputDefault6=0 +PageOptions6=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType7=CompositeDrill +OutputName7=Composite Drill Drawing +OutputDocumentPath7= +OutputVariantName7= +OutputDefault7=0 +PageOptions7=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType8=Final +OutputName8=Final Artwork Prints +OutputDocumentPath8= +OutputVariantName8=[No Variations] +OutputDefault8=0 +PageOptions8=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType9=Gerber +OutputName9=Gerber Files +OutputDocumentPath9= +OutputVariantName9=[No Variations] +OutputDefault9=0 +Configuration9_Name1=OutputConfigurationParameter1 +Configuration9_Item1=AddToAllPlots.Set=SerializeLayerHash.Version~2,ClassName~TLayerToBoolean|CentrePlots=False|DrillDrawingSymbol=GraphicsSymbol|DrillDrawingSymbolSize=500000|EmbeddedApertures=True|FilmBorderSize=10000000|FilmXSize=200000000|FilmYSize=160000000|FlashAllFills=False|FlashPadShapes=True|G54OnApertureChange=False|GenerateDRCRulesFile=True|GenerateReliefShapes=True|GerberUnit=Imperial|IncludeUnconnectedMidLayerPads=False|LeadingAndTrailingZeroesMode=SuppressLeadingZeroes|MaxApertureSize=2500000|MinusApertureTolerance=50|Mirror.Set=SerializeLayerHash.Version~2,ClassName~TLayerToBoolean|MirrorDrillDrawingPlots=False|MirrorDrillGuidePlots=False|NumberOfDecimals=5|OptimizeChangeLocationCommands=True|OriginPosition=Relative|Panelize=False|Plot.Set=SerializeLayerHash.Version~2,ClassName~TLayerToBoolean,16973832~1,16973834~1,16777217~1,16908293~1,16908301~1,16908303~1,16973837~1,16973848~1,16973849~1|PlotPositivePlaneLayers=False|PlotUsedDrillDrawingLayerPairs=True|PlotUsedDrillGuideLayerPairs=True|PlusApertureTolerance=50|Record=GerberView|SoftwareArcs=False|Sorted=False + +[OutputGroup6] +Name=Report Outputs +Description= +TargetPrinter=Brother HL-2170W +PrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintWhat=1 +OutputType1=Script +OutputName1=Script Output +OutputDocumentPath1= +OutputVariantName1=[No Variations] +OutputDefault1=0 +OutputType2=ReportHierarchy +OutputName2=Report Project Hierarchy +OutputDocumentPath2= +OutputVariantName2=[No Variations] +OutputDefault2=0 +OutputType3=SinglePinNetReporter +OutputName3=Report Single Pin Nets +OutputDocumentPath3= +OutputVariantName3=[No Variations] +OutputDefault3=0 +OutputType4=SimpleBOM +OutputName4=Simple BOM +OutputDocumentPath4= +OutputVariantName4=[No Variations] +OutputDefault4=0 +OutputType5=ComponentCrossReference +OutputName5=Component Cross Reference Report +OutputDocumentPath5= +OutputVariantName5=[No Variations] +OutputDefault5=0 +OutputType6=BOM_PartType +OutputName6=Bill of Materials +OutputDocumentPath6= +OutputVariantName6=[No Variations] +OutputDefault6=0 +PageOptions6=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +Configuration6_Name1=Filter +Configuration6_Item1=545046300E5446696C74657257726170706572000D46696C7465722E416374697665090F46696C7465722E43726974657269610A04000000000000000000 +Configuration6_Name2=General +Configuration6_Item2=OpenExported=True|AddToProject=False|ForceFit=False|NotFitted=False|Database=False|IncludePCBData=False|ShowExportOptions=True|TemplateFilename=..\Altium\BOM OpenPilot.xlt|BatchMode=5|FormWidth=1226|FormHeight=598|SupplierProdQty=25|SupplierAutoQty=True|SupplierUseCachedPricing=False|SupplierCurrency= +Configuration6_Name3=GroupOrder +Configuration6_Item3=Comment=True|Footprint=True +Configuration6_Name4=OutputConfigurationParameter1 +Configuration6_Item4=Record=BOMPrintView|ShowNoERC=True|ShowParamSet=True|ShowProbe=True|ShowBlanket=True|ExpandDesignator=True|ExpandNetLabel=False|ExpandPort=False|ExpandSheetNum=False|ExpandDocNum=False +Configuration6_Name5=SortOrder +Configuration6_Item5=Designator=Up|Comment=Up|Footprint=Up +Configuration6_Name6=VisibleOrder +Configuration6_Item6=Comment=100|Description=100|Designator=100|Value=100|Footprint=100|LibRef=100|Quantity=100|Supplier 1=100|Supplier Part Number 1=100|Supplier Stock 1=100|Supplier Unit Price 1=100|Supplier Order Qty 1=100|Supplier Subtotal 1=100|Manufacturer 1=100|Manufacturer Part Number 1=100 + +[OutputGroup7] +Name=Other Outputs +Description= +TargetPrinter=Brother HL-2170W +PrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintWhat=1 +OutputType1=Text Print +OutputName1=Text Print +OutputDocumentPath1= +OutputVariantName1= +OutputDefault1=0 +PageOptions1=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType2=Text Print +OutputName2=Text Print +OutputDocumentPath2= +OutputVariantName2= +OutputDefault2=0 +PageOptions2=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType3=Text Print +OutputName3=Text Print +OutputDocumentPath3= +OutputVariantName3= +OutputDefault3=0 +PageOptions3=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType4=Text Print +OutputName4=Text Print +OutputDocumentPath4= +OutputVariantName4= +OutputDefault4=0 +PageOptions4=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType5=Text Print +OutputName5=Text Print +OutputDocumentPath5= +OutputVariantName5= +OutputDefault5=0 +PageOptions5=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType6=Text Print +OutputName6=Text Print +OutputDocumentPath6= +OutputVariantName6= +OutputDefault6=0 +PageOptions6=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType7=Text Print +OutputName7=Text Print +OutputDocumentPath7= +OutputVariantName7= +OutputDefault7=0 +PageOptions7=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType8=Text Print +OutputName8=Text Print +OutputDocumentPath8= +OutputVariantName8= +OutputDefault8=0 +PageOptions8=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType9=Text Print +OutputName9=Text Print +OutputDocumentPath9= +OutputVariantName9= +OutputDefault9=0 +PageOptions9=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType10=Text Print +OutputName10=Text Print +OutputDocumentPath10= +OutputVariantName10= +OutputDefault10=0 +PageOptions10=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType11=Text Print +OutputName11=Text Print +OutputDocumentPath11= +OutputVariantName11= +OutputDefault11=0 +PageOptions11=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType12=Text Print +OutputName12=Text Print +OutputDocumentPath12= +OutputVariantName12= +OutputDefault12=0 +PageOptions12=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType13=Text Print +OutputName13=Text Print +OutputDocumentPath13= +OutputVariantName13= +OutputDefault13=0 +PageOptions13=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType14=Text Print +OutputName14=Text Print +OutputDocumentPath14= +OutputVariantName14= +OutputDefault14=0 +PageOptions14=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType15=Text Print +OutputName15=Text Print +OutputDocumentPath15= +OutputVariantName15= +OutputDefault15=0 +PageOptions15=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType16=Text Print +OutputName16=Text Print +OutputDocumentPath16= +OutputVariantName16= +OutputDefault16=0 +PageOptions16=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType17=Text Print +OutputName17=Text Print +OutputDocumentPath17= +OutputVariantName17= +OutputDefault17=0 +PageOptions17=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType18=Text Print +OutputName18=Text Print +OutputDocumentPath18= +OutputVariantName18= +OutputDefault18=0 +PageOptions18=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType19=Text Print +OutputName19=Text Print +OutputDocumentPath19= +OutputVariantName19= +OutputDefault19=0 +PageOptions19=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType20=Text Print +OutputName20=Text Print +OutputDocumentPath20= +OutputVariantName20= +OutputDefault20=0 +PageOptions20=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType21=Text Print +OutputName21=Text Print +OutputDocumentPath21= +OutputVariantName21= +OutputDefault21=0 +PageOptions21=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType22=Text Print +OutputName22=Text Print +OutputDocumentPath22= +OutputVariantName22= +OutputDefault22=0 +PageOptions22=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType23=Text Print +OutputName23=Text Print +OutputDocumentPath23= +OutputVariantName23= +OutputDefault23=0 +PageOptions23=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType24=Text Print +OutputName24=Text Print +OutputDocumentPath24= +OutputVariantName24= +OutputDefault24=0 +PageOptions24=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType25=Text Print +OutputName25=Text Print +OutputDocumentPath25= +OutputVariantName25= +OutputDefault25=0 +PageOptions25=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType26=Text Print +OutputName26=Text Print +OutputDocumentPath26= +OutputVariantName26= +OutputDefault26=0 +PageOptions26=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType27=Text Print +OutputName27=Text Print +OutputDocumentPath27= +OutputVariantName27= +OutputDefault27=0 +PageOptions27=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType28=Text Print +OutputName28=Text Print +OutputDocumentPath28= +OutputVariantName28= +OutputDefault28=0 +PageOptions28=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType29=Text Print +OutputName29=Text Print +OutputDocumentPath29= +OutputVariantName29= +OutputDefault29=0 +PageOptions29=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 + +[OutputGroup8] +Name=Validation Outputs +Description= +TargetPrinter=Brother HL-2170W +PrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintWhat=1 +OutputType1=Electrical Rules Check +OutputName1=Electrical Rules Check +OutputDocumentPath1= +OutputVariantName1= +OutputDefault1=0 +PageOptions1=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType2=Design Rules Check +OutputName2=Design Rules Check +OutputDocumentPath2= +OutputVariantName2= +OutputDefault2=0 +PageOptions2=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType3=Differences Report +OutputName3=Differences Report +OutputDocumentPath3= +OutputVariantName3= +OutputDefault3=0 +PageOptions3=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 +OutputType4=Footprint Comparison Report +OutputName4=Footprint Comparison Report +OutputDocumentPath4= +OutputVariantName4= +OutputDefault4=0 + +[OutputGroup9] +Name=Export Outputs +Description= +TargetPrinter=Brother HL-2170W +PrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintWhat=1 +OutputType1=ExportSTEP +OutputName1=Export STEP +OutputDocumentPath1= +OutputVariantName1= +OutputDefault1=0 + +[Modification Levels] +Type1=1 +Type2=1 +Type3=1 +Type4=1 +Type5=1 +Type6=1 +Type7=1 +Type8=1 +Type9=1 +Type10=1 +Type11=1 +Type12=1 +Type13=1 +Type14=1 +Type15=1 +Type16=1 +Type17=1 +Type18=1 +Type19=1 +Type20=1 +Type21=1 +Type22=1 +Type23=1 +Type24=1 +Type25=1 +Type26=1 +Type27=1 +Type28=1 +Type29=1 +Type30=1 +Type31=1 +Type32=1 +Type33=1 +Type34=1 +Type35=1 +Type36=1 +Type37=1 +Type38=1 +Type39=1 +Type40=1 +Type41=1 +Type42=1 +Type43=1 +Type44=1 +Type45=1 +Type46=1 +Type47=1 +Type48=1 +Type49=1 +Type50=1 +Type51=1 +Type52=1 +Type53=1 +Type54=1 +Type55=1 +Type56=1 +Type57=1 +Type58=1 +Type59=1 +Type60=1 +Type61=1 +Type62=1 +Type63=1 +Type64=1 +Type65=1 +Type66=1 +Type67=1 +Type68=1 +Type69=1 +Type70=1 +Type71=1 +Type72=1 +Type73=1 +Type74=1 + +[Difference Levels] +Type1=1 +Type2=1 +Type3=1 +Type4=1 +Type5=1 +Type6=1 +Type7=1 +Type8=1 +Type9=1 +Type10=1 +Type11=1 +Type12=1 +Type13=1 +Type14=1 +Type15=1 +Type16=1 +Type17=1 +Type18=1 +Type19=1 +Type20=1 +Type21=1 +Type22=1 +Type23=1 +Type24=1 +Type25=1 +Type26=1 +Type27=1 +Type28=1 +Type29=1 +Type30=1 +Type31=1 +Type32=1 +Type33=1 +Type34=1 +Type35=1 +Type36=1 +Type37=1 +Type38=1 +Type39=1 +Type40=1 + +[Electrical Rules Check] +Type1=1 +Type2=1 +Type3=2 +Type4=1 +Type5=2 +Type6=2 +Type7=1 +Type8=1 +Type9=1 +Type10=1 +Type11=2 +Type12=2 +Type13=2 +Type14=1 +Type15=1 +Type16=1 +Type17=1 +Type18=1 +Type19=1 +Type20=1 +Type21=1 +Type22=1 +Type23=1 +Type24=1 +Type25=2 +Type26=2 +Type27=2 +Type28=1 +Type29=1 +Type30=1 +Type31=1 +Type32=2 +Type33=2 +Type34=2 +Type35=1 +Type36=2 +Type37=1 +Type38=2 +Type39=2 +Type40=2 +Type41=0 +Type42=2 +Type43=1 +Type44=1 +Type45=2 +Type46=1 +Type47=2 +Type48=2 +Type49=1 +Type50=2 +Type51=1 +Type52=1 +Type53=1 +Type54=1 +Type55=1 +Type56=2 +Type57=1 +Type58=1 +Type59=0 +Type60=1 +Type61=2 +Type62=2 +Type63=1 +Type64=0 +Type65=2 +Type66=3 +Type67=2 +Type68=2 +Type69=1 +Type70=2 +Type71=2 +Type72=2 +Type73=2 +Type74=1 +Type75=2 +Type76=1 +Type77=1 +Type78=1 +Type79=1 +Type80=2 +Type81=3 +Type82=3 +Type83=3 +Type84=3 +Type85=3 +Type86=2 +Type87=2 +Type88=2 +Type89=1 +Type90=1 +Type91=3 +Type92=3 +Type93=2 +Type94=2 +Type95=2 +Type96=2 +Type97=2 +Type98=0 +Type99=1 +Type100=2 + +[ERC Connection Matrix] +L1=NNNNNNNNNNNWNNNWW +L2=NNWNNNNWWWNWNWNWN +L3=NWEENEEEENEWNEEWN +L4=NNENNNWEENNWNENWN +L5=NNNNNNNNNNNNNNNNN +L6=NNENNNNEENNWNENWN +L7=NNEWNNWEENNWNENWN +L8=NWEENEENEEENNEENN +L9=NWEENEEEENEWNEEWW +L10=NWNNNNNENNEWNNEWN +L11=NNENNNNEEENWNENWN +L12=WWWWNWWNWWWNWWWNN +L13=NNNNNNNNNNNWNNNWW +L14=NWEENEEEENEWNEEWW +L15=NNENNNNEEENWNENWW +L16=WWWWNWWNWWWNWWWNW +L17=WNNNNNNNWNNNWWWWN + +[Annotate] +SortOrder=3 +MatchParameter1=Comment +MatchStrictly1=1 +MatchParameter2=Library Reference +MatchStrictly2=1 +PhysicalNamingFormat=$Component_$RoomName +GlobalIndexSortOrder=3 + +[PrjClassGen] +CompClassManualEnabled=0 +CompClassManualRoomEnabled=0 +NetClassAutoBusEnabled=1 +NetClassAutoCompEnabled=0 +NetClassAutoNamedHarnessEnabled=0 +NetClassManualEnabled=1 + +[LibraryUpdateOptions] +SelectedOnly=0 +PartTypes=0 +FullReplace=1 +UpdateDesignatorLock=1 +UpdatePartIDLock=1 +PreserveParameterLocations=1 +DoGraphics=1 +DoParameters=1 +DoModels=1 +AddParameters=0 +RemoveParameters=0 +AddModels=1 +RemoveModels=1 +UpdateCurrentModels=1 + +[DatabaseUpdateOptions] +SelectedOnly=0 +PartTypes=0 + +[Comparison Options] +ComparisonOptions0=Kind=Net|MinPercent=75|MinMatch=3|ShowMatch=-1|Confirm=-1|UseName=-1|InclAllRules=0 +ComparisonOptions1=Kind=Net Class|MinPercent=75|MinMatch=3|ShowMatch=-1|Confirm=-1|UseName=-1|InclAllRules=0 +ComparisonOptions2=Kind=Component Class|MinPercent=75|MinMatch=3|ShowMatch=-1|Confirm=-1|UseName=-1|InclAllRules=0 +ComparisonOptions3=Kind=Rule|MinPercent=75|MinMatch=3|ShowMatch=-1|Confirm=-1|UseName=-1|InclAllRules=0 +ComparisonOptions4=Kind=Differential Pair|MinPercent=50|MinMatch=1|ShowMatch=0|Confirm=0|UseName=0|InclAllRules=0 +ComparisonOptions5=Kind=Structure Class|MinPercent=75|MinMatch=3|ShowMatch=-1|Confirm=-1|UseName=-1|InclAllRules=0 + +[SmartPDF] +PageOptions=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-4|MediaType=1|DitherType=10|PaperKind=A4|PrintScaleMode=1 + diff --git a/hardware/Production/Spektrum Adapter SMD/Spektrum Adapter SMD.SchDoc b/hardware/Production/Spektrum Adapter SMD/Spektrum Adapter SMD.SchDoc new file mode 100644 index 0000000000000000000000000000000000000000..82c763feecfd9bb6392b3203068b026e038cef99 GIT binary patch literal 83456 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 ZkBmNef*sskA4v#5{lE9!{cpJ9{|BDGmofkV literal 0 HcmV?d00001 From 78e25b1b8c4109d393f51c9dce6568ef9ff136be Mon Sep 17 00:00:00 2001 From: zedamota Date: Sat, 3 Dec 2011 02:36:47 +0000 Subject: [PATCH 013/121] Fixed conditions Added support for negative values Added support to "play once per update" Added "never" rule for value sound Several other bugfixes --- .../src/plugins/notify/NotificationItem.h | 16 +++-- .../src/plugins/notify/notificationitem.cpp | 31 ++++++--- .../src/plugins/notify/notifyplugin.cpp | 42 ++++++++---- .../notify/notifypluginoptionspage.cpp | 64 +++++++++++++------ .../plugins/notify/notifypluginoptionspage.h | 2 +- 5 files changed, 106 insertions(+), 49 deletions(-) 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 From b45044b8c35a9bd286dabe9e3425c903b44068de Mon Sep 17 00:00:00 2001 From: zedamota Date: Tue, 6 Dec 2011 09:59:28 +0000 Subject: [PATCH 014/121] Changed conditions base on strings to enums. --- .../src/plugins/notify/NotificationItem.h | 17 ++-- .../src/plugins/notify/notificationitem.cpp | 52 +++++-------- .../src/plugins/notify/notifyplugin.cpp | 26 +++---- .../notify/notifypluginoptionspage.cpp | 78 +++++++------------ .../plugins/notify/notifypluginoptionspage.h | 3 +- .../src/plugins/notify/notifytablemodel.cpp | 4 +- 6 files changed, 74 insertions(+), 106 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/notify/NotificationItem.h b/ground/openpilotgcs/src/plugins/notify/NotificationItem.h index e64609a53..1475fd64f 100644 --- a/ground/openpilotgcs/src/plugins/notify/NotificationItem.h +++ b/ground/openpilotgcs/src/plugins/notify/NotificationItem.h @@ -49,7 +49,10 @@ class NotificationItem : public QObject public: enum { eDefaultTimeout = 15 }; // in sec - enum {equal,bigger,smaller,inrange}; + enum {never,beforeFirst,beforeSecond,afterSecond}; + enum {repeatOncePerUpdate,repeatOnce,repeatInstantly,repeat10seconds, + repeat30seconds,repeat1minute}; + explicit NotificationItem(QObject *parent = 0); void copyTo(NotificationItem*) const; @@ -64,8 +67,8 @@ public: int getCondition() const { return _condition; } void setCondition(int value) { _condition = value; } - QString getSayOrder() const { return _sayOrder; } - void setSayOrder(QString text) { _sayOrder = text; } + int getSayOrder() const { return _sayOrder; } + void setSayOrder(int text) { _sayOrder = text; } QVariant singleValue() const { return _singleValue; } void setSingleValue(QVariant value) { _singleValue = value; } @@ -88,8 +91,8 @@ public: QStringList getMessageSequence() const { return _messageSequence; } void setMessageSequence(QStringList sequence) { _messageSequence = sequence; } - QString retryString() const { return _repeatString; } - void setRetryString(QString value) { _repeatString = value; } + int retryValue() const { return _repeatValue; } + void setRetryValue(int value) { _repeatValue = value; } int lifetime() const { return _expireTimeout; } void setLifetime(int value) { _expireTimeout = value; } @@ -189,7 +192,7 @@ private: QString _sound3; //! order in what sounds 1-3 will be played - QString _sayOrder; + int _sayOrder; //! one-side range, value(numeric or ENUM type) maybe lower, greater or in range QVariant _singleValue; @@ -199,7 +202,7 @@ private: double _valueRange2; //! how often or what periodicaly notification should be played - QString _repeatString; + int _repeatValue; //! time after event occured till notification became invalid //! and will be removed from list diff --git a/ground/openpilotgcs/src/plugins/notify/notificationitem.cpp b/ground/openpilotgcs/src/plugins/notify/notificationitem.cpp index 68674bc90..0506840ec 100644 --- a/ground/openpilotgcs/src/plugins/notify/notificationitem.cpp +++ b/ground/openpilotgcs/src/plugins/notify/notificationitem.cpp @@ -40,18 +40,7 @@ #include "notifylogging.h" -static const QString cStrNever("Never"); -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"); -static const QString cStrRetry1min("Repeat 1 minute"); QStringList NotificationItem::sayOrderValues; @@ -73,26 +62,27 @@ NotificationItem::NotificationItem(QObject *parent) , _sound1("") , _sound2("") , _sound3("") - , _sayOrder(cStrNever) + , _sayOrder(never) , _singleValue(0) , _valueRange2(0) - , _repeatString(cStrRetryInstantly) + , _repeatValue(repeatInstantly) , _expireTimeout(eDefaultTimeout) , _mute(false) { + NotificationItem::sayOrderValues.clear(); - NotificationItem::sayOrderValues.append(cStrNever); - NotificationItem::sayOrderValues.append(cStrBefore1st); - NotificationItem::sayOrderValues.append(cStrBefore2nd); - NotificationItem::sayOrderValues.append(cStrAfter2nd); + 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.append(cStrRetryOnce); - NotificationItem::retryValues.append(cStrRetryOncePUpdate); - NotificationItem::retryValues.append(cStrRetryInstantly); - NotificationItem::retryValues.append(cStrRetry10sec); - NotificationItem::retryValues.append(cStrRetry30sec); - NotificationItem::retryValues.append(cStrRetry1min); + 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"))); } @@ -112,7 +102,7 @@ void NotificationItem::copyTo(NotificationItem* that) const that->_sayOrder = _sayOrder; that->_singleValue = _singleValue; that->_valueRange2 = _valueRange2; - that->_repeatString = _repeatString; + that->_repeatValue = _repeatValue; that->_expireTimeout = _expireTimeout; that->_mute = _mute; @@ -132,7 +122,7 @@ void NotificationItem::saveState(QSettings* settings) const settings->setValue(QLatin1String("Sound2"), getSound2()); settings->setValue(QLatin1String("Sound3"), getSound3()); settings->setValue(QLatin1String("SayOrder"), getSayOrder()); - settings->setValue(QLatin1String("Repeat"), retryString()); + settings->setValue(QLatin1String("Repeat"), retryValue()); settings->setValue(QLatin1String("ExpireTimeout"), lifetime()); settings->setValue(QLatin1String("Mute"), mute()); } @@ -148,11 +138,11 @@ void NotificationItem::restoreState(QSettings* settings) 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("")).toString()); + setSayOrder(settings->value(QLatin1String("SayOrder"), tr("")).toInt()); QVariant value = settings->value(QLatin1String("Value1"), tr("")); setSingleValue(value); setValueRange2(settings->value(QLatin1String("Value2"), tr("")).toDouble()); - setRetryString(settings->value(QLatin1String("Repeat"), tr("")).toString()); + setRetryValue(settings->value(QLatin1String("Repeat"), tr("")).toInt()); setLifetime(settings->value(QLatin1String("ExpireTimeout"), tr("")).toInt()); setMute(settings->value(QLatin1String("Mute"), tr("")).toInt()); } @@ -171,7 +161,7 @@ void NotificationItem::serialize(QDataStream& stream) stream << this->_sayOrder; stream << this->_singleValue; stream << this->_valueRange2; - stream << this->_repeatString; + stream << this->_repeatValue; stream << this->_expireTimeout; stream << this->_mute; } @@ -189,7 +179,7 @@ void NotificationItem::deserialize(QDataStream& stream) stream >> this->_sayOrder; stream >> this->_singleValue; stream >> this->_valueRange2; - stream >> this->_repeatString; + stream >> this->_repeatValue; stream >> this->_expireTimeout; stream >> this->_mute; } @@ -356,7 +346,7 @@ QString NotificationItem::toString() UAVObjectField* field = getUAVObjectField(); QString value = stringFromValue(singleValue(), field); - int pos = getValuePosition(getSayOrder().trimmed()); + int pos = getSayOrder()-1; QStringList lst; lst.append(getSoundCaption(getSound1())); lst.append(getSoundCaption(getSound2())); @@ -391,7 +381,7 @@ QStringList& NotificationItem::toSoundList() // generate queue of sound files to play _messageSequence.clear(); - int pos = getValuePosition(getSayOrder().trimmed()); + int pos = getSayOrder()-1; QStringList lst; if(!getSound1().isEmpty()) lst.append(getSound1()); diff --git a/ground/openpilotgcs/src/plugins/notify/notifyplugin.cpp b/ground/openpilotgcs/src/plugins/notify/notifyplugin.cpp index 601bd157d..9acb4b6f3 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifyplugin.cpp +++ b/ground/openpilotgcs/src/plugins/notify/notifyplugin.cpp @@ -246,8 +246,8 @@ 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" && ntf->retryString() != "Repeat Once per update" && - ntf->retryString() != "Repeat Once" && ntf->_isPlayed) + if (ntf->retryValue() != NotificationItem::repeatInstantly && ntf->retryValue() != NotificationItem::repeatOncePerUpdate && + ntf->retryValue() != NotificationItem::repeatOnce && ntf->_isPlayed) continue; qNotifyDebug() << QString("new notification: | %1 | %2 | val1: %3 | val2: %4") @@ -363,7 +363,7 @@ bool checkRange(QString fieldValue, QString enumValue, QStringList values, int d bool ret = false; switch(direction) { - case NotificationItem::equal: + case NotifyPluginOptionsPage::equal: ret = !QString::compare(enumValue, fieldValue, Qt::CaseInsensitive) ? true : false; break; @@ -377,18 +377,18 @@ bool checkRange(QString fieldValue, QString enumValue, QStringList values, int d bool checkRange(double fieldValue, double min, double max, int direction) { bool ret = false; - Q_ASSERT(min < max); + //Q_ASSERT(min < max); switch(direction) { - case NotificationItem::equal: + case NotifyPluginOptionsPage::equal: ret = (fieldValue == min); break; - case NotificationItem::bigger: + case NotifyPluginOptionsPage::bigger: ret = (fieldValue > min); break; - case NotificationItem::smaller: + case NotifyPluginOptionsPage::smaller: ret = (fieldValue < min); break; @@ -445,7 +445,7 @@ void SoundNotifyPlugin::checkNotificationRule(NotificationItem* notification, UA notification->setCurrentUpdatePlayed(false); return; } - if(notification->retryString() == "Repeat Once per update" && notification->getCurrentUpdatePlayed()) + if(notification->retryValue() == NotificationItem::repeatOncePerUpdate && notification->getCurrentUpdatePlayed()) return; volatile QMutexLocker lock(&_mutex); @@ -484,17 +484,17 @@ bool SoundNotifyPlugin::playNotification(NotificationItem* notification) _nowPlayingNotification = notification; notification->stopExpireTimer(); - if (notification->retryString() == "Repeat Once") { + if (notification->retryValue() == NotificationItem::repeatOnce) { _toRemoveNotifications.append(_notificationList.takeAt(_notificationList.indexOf(notification))); } - else if(notification->retryString() == "Repeat Once per update") + else if(notification->retryValue() == NotificationItem::repeatOncePerUpdate) notification->setCurrentUpdatePlayed(true); else { - if (notification->retryString() != "Repeat Instantly") { + if (notification->retryValue() != NotificationItem::repeatInstantly) { QRegExp rxlen("(\\d+)"); QString value; - int timer_value; - int pos = rxlen.indexIn(notification->retryString()); + int timer_value=0; + int pos = rxlen.indexIn(NotificationItem::retryValues.at(notification->retryValue())); if (pos > -1) { value = rxlen.cap(1); // "189" diff --git a/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.cpp b/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.cpp index 5eaf13efa..b7cc977c6 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.cpp +++ b/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.cpp @@ -47,11 +47,7 @@ #include "notifytablemodel.h" #include "notifylogging.h" -static const char* cStrEqualTo = "Equal to"; -static const char* cStrLargeThan = "Large than"; -static const char* cStrLowerThan = "Lower than"; -static const char* cStrInRange = "In range"; - +QStringList NotifyPluginOptionsPage::conditionValues; NotifyPluginOptionsPage::NotifyPluginOptionsPage(QObject *parent) : IOptionsPage(parent) @@ -63,7 +59,13 @@ NotifyPluginOptionsPage::NotifyPluginOptionsPage(QObject *parent) , _sayOrder(NULL) , _form(NULL) , _selectedNotification(NULL) -{} +{ + NotifyPluginOptionsPage::conditionValues.insert(equal,tr("Equal to")); + NotifyPluginOptionsPage::conditionValues.insert(bigger,tr("Large than")); + NotifyPluginOptionsPage::conditionValues.insert(smaller,tr("Lower than")); + NotifyPluginOptionsPage::conditionValues.insert(inrange,tr("In range")); + +} NotifyPluginOptionsPage::~NotifyPluginOptionsPage() {} @@ -246,41 +248,19 @@ void NotifyPluginOptionsPage::addDynamicField(UAVObjectField* objField) } disconnect(_dynamicFieldCondition, SIGNAL(currentIndexChanged(QString)), - this, SLOT(on_changedIndex_rangeValue(QString))); + this, SLOT(on_changedIndex_rangeValue(QString))); _dynamicFieldCondition->clear(); - QStringList rangeValues; - QList rangeCode; + _dynamicFieldCondition->addItems(NotifyPluginOptionsPage::conditionValues); if (UAVObjectField::ENUM == objField->getType()) { - rangeValues << cStrEqualTo << cStrInRange; - rangeCode<addItem(value,rangeCode[x]); - if(_selectedNotification->getCondition()==rangeCode[x]) - selected=x; - ++x; - } - qNotifyDebug()<<"setcurrentindex"<setCurrentIndex(selected); - - } else { - rangeValues << cStrEqualTo << cStrLargeThan << cStrLowerThan << cStrInRange; - 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))); + _dynamicFieldCondition->removeItem(smaller); + _dynamicFieldCondition->removeItem(bigger); } + _dynamicFieldCondition->setCurrentIndex(_dynamicFieldCondition->findText(NotifyPluginOptionsPage::conditionValues.at(_selectedNotification->getCondition()))); + + connect(_dynamicFieldCondition, SIGNAL(currentIndexChanged(QString)), + this, SLOT(on_changedIndex_rangeValue(QString))); + addDynamicFieldWidget(objField); } @@ -315,7 +295,7 @@ void NotifyPluginOptionsPage::addDynamicFieldWidget(UAVObjectField* objField) default: Q_ASSERT(_dynamicFieldCondition); - if (_dynamicFieldCondition->currentText() == cStrInRange) { + if (NotifyPluginOptionsPage::conditionValues.indexOf(_dynamicFieldCondition->currentText()) == NotifyPluginOptionsPage::inrange) { _dynamicFieldWidget = new QLineEdit(_form); (static_cast(_dynamicFieldWidget))->setInputMask("#999.99 : #999.99;"); @@ -369,9 +349,8 @@ void NotifyPluginOptionsPage::getOptionsPageValues(NotificationItem* notificatio notification->setSound1(_optionsPage->Sound1->currentText()); notification->setSound2(_optionsPage->Sound2->currentText()); notification->setSound3(_optionsPage->Sound3->currentText()); - notification->setSayOrder(_sayOrder->currentText()); - notification->setCondition(_dynamicFieldCondition->itemData(_dynamicFieldCondition->currentIndex()).toInt()); - qNotifyDebug()<<"getOptionsPageValues SETRANGE"<<_dynamicFieldCondition->currentIndex()<<_dynamicFieldCondition->itemData(_dynamicFieldCondition->currentIndex()).toInt(); + notification->setSayOrder(_sayOrder->currentIndex()); + notification->setCondition(NotifyPluginOptionsPage::conditionValues.indexOf(_dynamicFieldCondition->currentText())); if (QDoubleSpinBox* spinValue = dynamic_cast(_dynamicFieldWidget)) notification->setSingleValue(spinValue->value()); else { @@ -455,15 +434,10 @@ void NotifyPluginOptionsPage::updateConfigView(NotificationItem* notification) _optionsPage->SoundCollectionList->setCurrentIndex(_optionsPage->SoundCollectionList->findText("default")); _optionsPage->Sound3->setCurrentIndex(_optionsPage->Sound3->findText(notification->getSound3())); } - 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())); - } + + _dynamicFieldCondition->setCurrentIndex(_dynamicFieldCondition->findText(NotifyPluginOptionsPage::conditionValues.at(notification->getCondition()))); + + _sayOrder->setCurrentIndex(notification->getSayOrder()); setDynamicFieldValue(notification); @@ -613,7 +587,7 @@ void NotifyPluginOptionsPage::on_clicked_buttonAddNotification() delete notification; return; } else { - notification->setSayOrder(_sayOrder->currentText()); + notification->setSayOrder(_sayOrder->currentIndex()); } _notifyRulesModel->entryAdded(notification); @@ -638,7 +612,7 @@ void NotifyPluginOptionsPage::on_clicked_buttonModifyNotification() { NotificationItem* notification = new NotificationItem; getOptionsPageValues(notification); - notification->setRetryString(_privListNotifications.at(_notifyRulesSelection->currentIndex().row())->retryString()); + notification->setRetryValue(_privListNotifications.at(_notifyRulesSelection->currentIndex().row())->retryValue()); notification->setLifetime(_privListNotifications.at(_notifyRulesSelection->currentIndex().row())->lifetime()); notification->setMute(_privListNotifications.at(_notifyRulesSelection->currentIndex().row())->mute()); diff --git a/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.h b/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.h index 317515aaf..fb3c2885d 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.h +++ b/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.h @@ -60,7 +60,7 @@ class NotifyPluginOptionsPage : public IOptionsPage Q_OBJECT public: - + enum {equal,bigger,smaller,inrange}; explicit NotifyPluginOptionsPage(QObject *parent = 0); ~NotifyPluginOptionsPage(); QString id() const { return QLatin1String("settings"); } @@ -72,6 +72,7 @@ public: void apply(); void finish(); void restoreFromSettings(); + static QStringList conditionValues; signals: void updateNotifications(QList list); diff --git a/ground/openpilotgcs/src/plugins/notify/notifytablemodel.cpp b/ground/openpilotgcs/src/plugins/notify/notifytablemodel.cpp index ed4eb0e56..d4913ed97 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifytablemodel.cpp +++ b/ground/openpilotgcs/src/plugins/notify/notifytablemodel.cpp @@ -52,7 +52,7 @@ bool NotifyTableModel::setData(const QModelIndex &index, } if (index.isValid() && role == Qt::EditRole) { if (eRepeatValue == index.column()) - _list.at(index.row())->setRetryString(value.toString()); + _list.at(index.row())->setRetryValue(NotificationItem::retryValues.indexOf(value.toString())); else { if (eExpireTimer == index.column()) _list.at(index.row())->setLifetime(value.toInt()); @@ -85,7 +85,7 @@ QVariant NotifyTableModel::data(const QModelIndex &index, int role) const return _list.at(index.row())->toString(); case eRepeatValue: - return _list.at(index.row())->retryString(); + return (NotificationItem::retryValues.at(_list.at(index.row())->retryValue())); case eExpireTimer: return _list.at(index.row())->lifetime(); From f18c980c4ef5b44bb7a44ff6c41aef1600491201 Mon Sep 17 00:00:00 2001 From: zedamota Date: Tue, 6 Dec 2011 13:13:20 +0000 Subject: [PATCH 015/121] Small bug fix. Added minus.wav witch is a copy of magic.was. "minus" file needed. --- .../openpilotgcs/sounds/default/minus.wav | Bin 0 -> 61834 bytes .../src/plugins/notify/notificationitem.cpp | 22 +++++++++++------- 2 files changed, 14 insertions(+), 8 deletions(-) create mode 100644 ground/openpilotgcs/share/openpilotgcs/sounds/default/minus.wav diff --git a/ground/openpilotgcs/share/openpilotgcs/sounds/default/minus.wav b/ground/openpilotgcs/share/openpilotgcs/sounds/default/minus.wav new file mode 100644 index 0000000000000000000000000000000000000000..15bd23b5e977aa266a16650ddea41265a0aa0102 GIT binary patch literal 61834 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 z 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 ANdN!< literal 0 HcmV?d00001 diff --git a/ground/openpilotgcs/src/plugins/notify/notificationitem.cpp b/ground/openpilotgcs/src/plugins/notify/notificationitem.cpp index 0506840ec..264ffed09 100644 --- a/ground/openpilotgcs/src/plugins/notify/notificationitem.cpp +++ b/ground/openpilotgcs/src/plugins/notify/notificationitem.cpp @@ -271,14 +271,16 @@ QString NotificationItem::checkSoundExists(QString fileName) QStringList valueToSoundList(QString value) { - + qNotifyDebug()<<"notificationItem valueToSoundList input param"< Date: Sun, 18 Dec 2011 17:58:42 -0700 Subject: [PATCH 016/121] Initial version of the integrated Linux-Deb package system implementation. Uses the standard OP package system front end then connects into the Debian Package manager for package building. Should work on both i386 and amd64 systems. Auto determins and runtime which system it is building on and produces an appropriate package for the platform in the build dir. --- package/Makefile.linux | 69 ++++- package/linux/45-openpilot-permissions.rules | 13 + package/linux/deb_amd64/control | 15 + package/linux/deb_common/changelog | 5 + package/linux/deb_common/compat | 1 + package/linux/deb_common/copyright | 37 +++ package/linux/deb_common/docs | 0 package/linux/deb_common/init.d.ex | 154 +++++++++ package/linux/deb_common/manpage.1.ex | 59 ++++ package/linux/deb_common/manpage.sgml.ex | 154 +++++++++ package/linux/deb_common/manpage.xml.ex | 291 ++++++++++++++++++ package/linux/deb_common/menu.ex | 2 + package/linux/deb_common/openpilot.cron.d.ex | 4 + .../linux/deb_common/openpilot.debhelper.log | 15 + package/linux/deb_common/openpilot.default.ex | 10 + package/linux/deb_common/openpilot.dirs | 7 + .../linux/deb_common/openpilot.doc-base.EX | 20 ++ package/linux/deb_common/openpilot.substvars | 2 + package/linux/deb_common/postinst | 40 +++ package/linux/deb_common/postinst.ex | 39 +++ package/linux/deb_common/postrm.ex | 37 +++ package/linux/deb_common/preinst.ex | 35 +++ package/linux/deb_common/prerm.ex | 38 +++ package/linux/deb_common/rules | 81 +++++ package/linux/deb_common/watch.ex | 23 ++ package/linux/deb_i386/control | 15 + package/linux/openpilot.desktop | 12 + package/linux/openpilot.png | Bin 0 -> 2713 bytes package/linux/rc_applications.directory | 5 + package/linux/rc_applications.menu | 12 + package/linux/rc_applications.png | Bin 0 -> 644 bytes 31 files changed, 1193 insertions(+), 2 deletions(-) create mode 100644 package/linux/45-openpilot-permissions.rules create mode 100644 package/linux/deb_amd64/control create mode 100644 package/linux/deb_common/changelog create mode 100644 package/linux/deb_common/compat create mode 100644 package/linux/deb_common/copyright create mode 100644 package/linux/deb_common/docs create mode 100644 package/linux/deb_common/init.d.ex create mode 100644 package/linux/deb_common/manpage.1.ex create mode 100644 package/linux/deb_common/manpage.sgml.ex create mode 100644 package/linux/deb_common/manpage.xml.ex create mode 100644 package/linux/deb_common/menu.ex create mode 100644 package/linux/deb_common/openpilot.cron.d.ex create mode 100644 package/linux/deb_common/openpilot.debhelper.log create mode 100644 package/linux/deb_common/openpilot.default.ex create mode 100644 package/linux/deb_common/openpilot.dirs create mode 100644 package/linux/deb_common/openpilot.doc-base.EX create mode 100644 package/linux/deb_common/openpilot.substvars create mode 100644 package/linux/deb_common/postinst create mode 100644 package/linux/deb_common/postinst.ex create mode 100644 package/linux/deb_common/postrm.ex create mode 100644 package/linux/deb_common/preinst.ex create mode 100644 package/linux/deb_common/prerm.ex create mode 100755 package/linux/deb_common/rules create mode 100644 package/linux/deb_common/watch.ex create mode 100644 package/linux/deb_i386/control create mode 100644 package/linux/openpilot.desktop create mode 100755 package/linux/openpilot.png create mode 100644 package/linux/rc_applications.directory create mode 100644 package/linux/rc_applications.menu create mode 100755 package/linux/rc_applications.png diff --git a/package/Makefile.linux b/package/Makefile.linux index c966ff6f2..7bb0afc99 100644 --- a/package/Makefile.linux +++ b/package/Makefile.linux @@ -2,9 +2,74 @@ # Linux-specific packaging # +define CP_DEB_FILES_TEMPLATE +.PHONY: $(1) +$(2)/$(1): $(3)/$(1) + $(V1)cp -a $$< $$@ +endef + +# Update this number for every formal release. The Deb packaging system relies on this to know to update a +# package or not. Otherwise, the user has to uninstall first. +VERNUM := 0.1.0 +VERSION_FULL := $(VERNUM)-$(PACKAGE_LBL) + +FLIGHT_FW := coptercontrol revolution + +DEB_BUILD_DIR := $(ROOT_DIR)/debian + +SED_DATE_STRG = $(shell date -R) +SED_SCRIPT = s//$(VERSION_FULL)/;s//$(SED_DATE_STRG)/ + +DEB_CFG_CMN := $(ROOT_DIR)/package/linux/deb_common +DEB_CFG_CMN_FILES := $(shell ls $(DEB_CFG_CMN)) +DEB_CFG_I386_DIR := $(ROOT_DIR)/package/linux/deb_i386 +DEB_CFG_I386_FILES := $(shell ls $(DEB_CFG_I386_DIR)) +DEB_CFG_AMD64_DIR := $(ROOT_DIR)/package/linux/deb_amd64 +DEB_CFG_AMD64_FILES := $(shell ls $(DEB_CFG_AMD64_DIR)) +DEB_PLATFORM := amd64 +DEB_MACHINE_DIR := $(DEB_CFG_AMD64_DIR) +DEB_MACHINE_FILES := $(DEB_CFG_AMD64_FILES) +MACHINE_TYPE := $(shell uname -m) +ifneq ($(MACHINE_TYPE), x86_64) + DEB_PLATFORM := i386 + DEB_MACHINE_DIR := $(DEB_CFG_I386_DIR) + DEB_MACHINE_FILES := $(DEB_CFG_I386_FILES) +endif +ALL_DEB_FILES = $(foreach f, $(DEB_CFG_CMN_FILES), $(DEB_BUILD_DIR)/$(f)) +ALL_DEB_FILES += $(foreach f, $(DEB_MACHINE_FILES), $(DEB_BUILD_DIR)/$(f)) + +DEB_PACKAGE_NAME := openpilot_$(VERSION_FULL)_$(DEB_PLATFORM) + +linux_deb_package: gcs deb_build package_flight + @echo $@ starting + cd .. && dpkg-buildpackage -b + $(V1)mv $(ROOT_DIR)/../$(DEB_PACKAGE_NAME).deb $(BUILD_DIR) + $(V1)mv $(ROOT_DIR)/../$(DEB_PACKAGE_NAME).changes $(BUILD_DIR) + $(V1)rm -rf $(DEB_BUILD_DIR) + +deb_build: | $(DEB_BUILD_DIR) $(ALL_DEB_FILES) + @echo $@ starting + $(V1)$(shell echo $(PACKAGE_DIR) > $(BUILD_DIR)/package_dir) + $(V1)sed -i -e "$(SED_SCRIPT)" $(DEB_BUILD_DIR)/changelog + +$(DEB_BUILD_DIR): + @echo $@ starting + $(V1)mkdir -p $(DEB_BUILD_DIR) + +$(foreach cpfile, $(DEB_CFG_CMN_FILES), $(eval $(call CP_DEB_FILES_TEMPLATE,$(cpfile),$(DEB_BUILD_DIR),$(DEB_CFG_CMN)))) + +$(foreach cpfile, $(DEB_MACHINE_FILES), $(eval $(call CP_DEB_FILES_TEMPLATE,$(cpfile),$(DEB_BUILD_DIR),$(DEB_MACHINE_DIR)))) + gcs: uavobjects + @echo "Linux Package Make of GCS." $(V1) $(MAKE) -C $(ROOT_DIR) GCS_BUILD_CONF=release $@ -ground_package: | gcs +identify: + @echo "" + @echo "We are in the Linux Package Make system." + @echo "" + $(V1)rm -rf $(DEB_BUILD_DIR) -.PHONY: gcs ground_package +ground_package: | identify linux_deb_package + +.PHONY: identify gcs ground_package linux_deb_package deb_build $(DEB_BUILD_DIR) diff --git a/package/linux/45-openpilot-permissions.rules b/package/linux/45-openpilot-permissions.rules new file mode 100644 index 000000000..d04d31b7f --- /dev/null +++ b/package/linux/45-openpilot-permissions.rules @@ -0,0 +1,13 @@ + # OpenPilot openpilot flight control board + SUBSYSTEM=="usb", ATTRS{idVendor}=="20a0", ATTRS{idProduct}=="4117", MODE="0664", GROUP="plugdev" + SUBSYSTEM=="usb", ATTRS{idVendor}=="20a0", ATTRS{idProduct}=="415a", MODE="0664", GROUP="plugdev" + # OpenPilot coptercontrol flight control board + SUBSYSTEM=="usb", ATTRS{idVendor}=="20a0", ATTRS{idProduct}=="415b", MODE="0664", GROUP="plugdev" + # OpenPilot Pipx radio modem board + SUBSYSTEM=="usb", ATTRS{idVendor}=="20a0", ATTRS{idProduct}=="415c", MODE="0664", GROUP="plugdev" + # unprogrammed openpilot flight control board + SUBSYSTEM=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="5750", MODE="0664", GROUP="plugdev" + # FTDI FT2232C Dual USB-UART/FIFO IC + SUBSYSTEM=="usb", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6010", MODE="0664", GROUP="plugdev" + # Olimex Ltd. OpenOCD JTAG TINY + SUBSYSTEM=="usb", ATTRS{idVendor}=="15ba", ATTRS{idProduct}=="0004", MODE="0664", GROUP="plugdev" diff --git a/package/linux/deb_amd64/control b/package/linux/deb_amd64/control new file mode 100644 index 000000000..eab1547b1 --- /dev/null +++ b/package/linux/deb_amd64/control @@ -0,0 +1,15 @@ +Source: openpilot +Section: unknown +Priority: extra +Maintainer: naiiawah +Build-Depends: debhelper (>= 7.0.50~) +Standards-Version: 3.8.4 +Homepage: http://www.openpilot.org +#Vcs-Git: git://git.debian.org/collab-maint/openpilot.git +#Vcs-Browser: http://git.debian.org/?p=collab-maint/openpilot.git;a=summary + +Package: openpilot +Architecture: amd64 +Depends: ${shlibs:Depends}, ${misc:Depends} +Description: OpenPilot GCS & FW + OpenPilot GCS and Firmware for CopterControl (CC) board. diff --git a/package/linux/deb_common/changelog b/package/linux/deb_common/changelog new file mode 100644 index 000000000..c6f9e1519 --- /dev/null +++ b/package/linux/deb_common/changelog @@ -0,0 +1,5 @@ +openpilot () unstable; urgency=low + + * Initial release (testing - unstable) + + -- naiiawah diff --git a/package/linux/deb_common/compat b/package/linux/deb_common/compat new file mode 100644 index 000000000..7f8f011eb --- /dev/null +++ b/package/linux/deb_common/compat @@ -0,0 +1 @@ +7 diff --git a/package/linux/deb_common/copyright b/package/linux/deb_common/copyright new file mode 100644 index 000000000..561d0b327 --- /dev/null +++ b/package/linux/deb_common/copyright @@ -0,0 +1,37 @@ +This work was packaged for Debian by: + + naiiawah on Thu, 27 Oct 2011 01:35:37 -0600 + +It was downloaded from: + + + +Upstream Author(s): + + + + +Copyright: + + + + +License: + + + +The Debian packaging is: + + Copyright (C) 2011 naiiawah + +# Please chose a license for your packaging work. If the program you package +# uses a mainstream license, using the same license is the safest choice. +# Please avoid to pick license terms that are more restrictive than the +# packaged work, as it may make Debian's contributions unacceptable upstream. +# If you just want it to be GPL version 3, leave the following lines in. + +and is licensed under the GPL version 3, +see "/usr/share/common-licenses/GPL-3". + +# Please also look if there are files or directories which have a +# different copyright/license attached and list them here. diff --git a/package/linux/deb_common/docs b/package/linux/deb_common/docs new file mode 100644 index 000000000..e69de29bb diff --git a/package/linux/deb_common/init.d.ex b/package/linux/deb_common/init.d.ex new file mode 100644 index 000000000..fb3e26243 --- /dev/null +++ b/package/linux/deb_common/init.d.ex @@ -0,0 +1,154 @@ +#!/bin/sh +### BEGIN INIT INFO +# Provides: openpilot +# Required-Start: $network $local_fs +# Required-Stop: +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: +# Description: +# <...> +# <...> +### END INIT INFO + +# Author: naiiawah + +# PATH should only include /usr/* if it runs after the mountnfs.sh script +PATH=/sbin:/usr/sbin:/bin:/usr/bin +DESC=openpilot # Introduce a short description here +NAME=openpilot # Introduce the short server's name here +DAEMON=/usr/sbin/openpilot # Introduce the server's location here +DAEMON_ARGS="" # Arguments to run the daemon with +PIDFILE=/var/run/$NAME.pid +SCRIPTNAME=/etc/init.d/$NAME + +# Exit if the package is not installed +[ -x $DAEMON ] || exit 0 + +# Read configuration variable file if it is present +[ -r /etc/default/$NAME ] && . /etc/default/$NAME + +# Load the VERBOSE setting and other rcS variables +. /lib/init/vars.sh + +# Define LSB log_* functions. +# Depend on lsb-base (>= 3.0-6) to ensure that this file is present. +. /lib/lsb/init-functions + +# +# Function that starts the daemon/service +# +do_start() +{ + # Return + # 0 if daemon has been started + # 1 if daemon was already running + # 2 if daemon could not be started + start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \ + || return 1 + start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \ + $DAEMON_ARGS \ + || return 2 + # Add code here, if necessary, that waits for the process to be ready + # to handle requests from services started subsequently which depend + # on this one. As a last resort, sleep for some time. +} + +# +# Function that stops the daemon/service +# +do_stop() +{ + # Return + # 0 if daemon has been stopped + # 1 if daemon was already stopped + # 2 if daemon could not be stopped + # other if a failure occurred + start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME + RETVAL="$?" + [ "$RETVAL" = 2 ] && return 2 + # Wait for children to finish too if this is a daemon that forks + # and if the daemon is only ever run from this initscript. + # If the above conditions are not satisfied then add some other code + # that waits for the process to drop all resources that could be + # needed by services started subsequently. A last resort is to + # sleep for some time. + start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON + [ "$?" = 2 ] && return 2 + # Many daemons don't delete their pidfiles when they exit. + rm -f $PIDFILE + return "$RETVAL" +} + +# +# Function that sends a SIGHUP to the daemon/service +# +do_reload() { + # + # If the daemon can reload its configuration without + # restarting (for example, when it is sent a SIGHUP), + # then implement that here. + # + start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME + return 0 +} + +case "$1" in + start) + [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC " "$NAME" + do_start + case "$?" in + 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; + 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; + esac + ;; + stop) + [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME" + do_stop + case "$?" in + 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; + 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; + esac + ;; + status) + status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $? + ;; + #reload|force-reload) + # + # If do_reload() is not implemented then leave this commented out + # and leave 'force-reload' as an alias for 'restart'. + # + #log_daemon_msg "Reloading $DESC" "$NAME" + #do_reload + #log_end_msg $? + #;; + restart|force-reload) + # + # If the "reload" option is implemented then remove the + # 'force-reload' alias + # + log_daemon_msg "Restarting $DESC" "$NAME" + do_stop + case "$?" in + 0|1) + do_start + case "$?" in + 0) log_end_msg 0 ;; + 1) log_end_msg 1 ;; # Old process is still running + *) log_end_msg 1 ;; # Failed to start + esac + ;; + *) + # Failed to stop + log_end_msg 1 + ;; + esac + ;; + *) + #echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2 + echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2 + exit 3 + ;; +esac + +: diff --git a/package/linux/deb_common/manpage.1.ex b/package/linux/deb_common/manpage.1.ex new file mode 100644 index 000000000..1d0199483 --- /dev/null +++ b/package/linux/deb_common/manpage.1.ex @@ -0,0 +1,59 @@ +.\" Hey, EMACS: -*- nroff -*- +.\" First parameter, NAME, should be all caps +.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection +.\" other parameters are allowed: see man(7), man(1) +.TH OPENPILOT SECTION "October 27, 2011" +.\" Please adjust this date whenever revising the manpage. +.\" +.\" Some roff macros, for reference: +.\" .nh disable hyphenation +.\" .hy enable hyphenation +.\" .ad l left justify +.\" .ad b justify to both left and right margins +.\" .nf disable filling +.\" .fi enable filling +.\" .br insert line break +.\" .sp insert n+1 empty lines +.\" for manpage-specific macros, see man(7) +.SH NAME +openpilot \- program to do something +.SH SYNOPSIS +.B openpilot +.RI [ options ] " files" ... +.br +.B bar +.RI [ options ] " files" ... +.SH DESCRIPTION +This manual page documents briefly the +.B openpilot +and +.B bar +commands. +.PP +.\" TeX users may be more comfortable with the \fB\fP and +.\" \fI\fP escape sequences to invode bold face and italics, +.\" respectively. +\fBopenpilot\fP is a program that... +.SH OPTIONS +These programs follow the usual GNU command line syntax, with long +options starting with two dashes (`-'). +A summary of options is included below. +For a complete description, see the Info files. +.TP +.B \-h, \-\-help +Show summary of options. +.TP +.B \-v, \-\-version +Show version of program. +.SH SEE ALSO +.BR bar (1), +.BR baz (1). +.br +The programs are documented fully by +.IR "The Rise and Fall of a Fooish Bar" , +available via the Info system. +.SH AUTHOR +openpilot was written by . +.PP +This manual page was written by naiiawah , +for the Debian project (and may be used by others). diff --git a/package/linux/deb_common/manpage.sgml.ex b/package/linux/deb_common/manpage.sgml.ex new file mode 100644 index 000000000..76b474e3e --- /dev/null +++ b/package/linux/deb_common/manpage.sgml.ex @@ -0,0 +1,154 @@ + manpage.1'. You may view + the manual page with: `docbook-to-man manpage.sgml | nroff -man | + less'. A typical entry in a Makefile or Makefile.am is: + +manpage.1: manpage.sgml + docbook-to-man $< > $@ + + + The docbook-to-man binary is found in the docbook-to-man package. + Please remember that if you create the nroff version in one of the + debian/rules file targets (such as build), you will need to include + docbook-to-man in your Build-Depends control field. + + --> + + + FIRSTNAME"> + SURNAME"> + + October 27, 2011"> + + SECTION"> + naiiawah@none"> + + OPENPILOT"> + + + Debian"> + GNU"> + GPL"> +]> + + + +

+ &dhemail; +
+ + &dhfirstname; + &dhsurname; + + + 2003 + &dhusername; + + &dhdate; + + + &dhucpackage; + + &dhsection; + + + &dhpackage; + + program to do something + + + + &dhpackage; + + + + + + + + DESCRIPTION + + This manual page documents briefly the + &dhpackage; and bar + commands. + + This manual page was written for the &debian; distribution + because the original program does not have a manual page. + Instead, it has documentation in the &gnu; + Info format; see below. + + &dhpackage; is a program that... + + + + OPTIONS + + These programs follow the usual &gnu; command line syntax, + with long options starting with two dashes (`-'). A summary of + options is included below. For a complete description, see the + Info files. + + + + + + + + Show summary of options. + + + + + + + + Show version of program. + + + + + + SEE ALSO + + bar (1), baz (1). + + The programs are documented fully by The Rise and + Fall of a Fooish Bar available via the + Info system. + + + AUTHOR + + This manual page was written by &dhusername; &dhemail; for + the &debian; system (and may be used by others). Permission is + granted to copy, distribute and/or modify this document under + the terms of the &gnu; General Public License, Version 2 any + later version published by the Free Software Foundation. + + + On Debian systems, the complete text of the GNU General Public + License can be found in /usr/share/common-licenses/GPL. + + + + + + diff --git a/package/linux/deb_common/manpage.xml.ex b/package/linux/deb_common/manpage.xml.ex new file mode 100644 index 000000000..b8c0d8411 --- /dev/null +++ b/package/linux/deb_common/manpage.xml.ex @@ -0,0 +1,291 @@ + +.
will be generated. You may view the +manual page with: nroff -man .
| less'. A typical entry +in a Makefile or Makefile.am is: + +DB2MAN = /usr/share/sgml/docbook/stylesheet/xsl/docbook-xsl/manpages/docbook.xsl +XP = xsltproc -''-nonet -''-param man.charmap.use.subset "0" + +manpage.1: manpage.xml + $(XP) $(DB2MAN) $< + +The xsltproc binary is found in the xsltproc package. The XSL files are in +docbook-xsl. A description of the parameters you can use can be found in the +docbook-xsl-doc-* packages. Please remember that if you create the nroff +version in one of the debian/rules file targets (such as build), you will need +to include xsltproc and docbook-xsl in your Build-Depends control field. +Alternatively use the xmlto command/package. That will also automatically +pull in xsltproc and docbook-xsl. + +Notes for using docbook2x: docbook2x-man does not automatically create the +AUTHOR(S) and COPYRIGHT sections. In this case, please add them manually as + ... . + +To disable the automatic creation of the AUTHOR(S) and COPYRIGHT sections +read /usr/share/doc/docbook-xsl/doc/manpages/authors.html. This file can be +found in the docbook-xsl-doc-html package. + +Validation can be done using: `xmllint -''-noout -''-valid manpage.xml` + +General documentation about man-pages and man-page-formatting: +man(1), man(7), http://www.tldp.org/HOWTO/Man-Page/ + +--> + + + + + + + + + + + + + +]> + + + + &dhtitle; + &dhpackage; + + + &dhfirstname; + &dhsurname; + Wrote this manpage for the Debian system. +
+ &dhemail; +
+
+
+ + 2007 + &dhusername; + + + This manual page was written for the Debian system + (and may be used by others). + Permission is granted to copy, distribute and/or modify this + document under the terms of the GNU General Public License, + Version 2 or (at your option) any later version published by + the Free Software Foundation. + On Debian systems, the complete text of the GNU General Public + License can be found in + /usr/share/common-licenses/GPL. + +
+ + &dhucpackage; + &dhsection; + + + &dhpackage; + program to do something + + + + &dhpackage; + + + + + + + + + this + + + + + + + + this + that + + + + + &dhpackage; + + + + + + + + + + + + + + + + + + + DESCRIPTION + This manual page documents briefly the + &dhpackage; and bar + commands. + This manual page was written for the Debian distribution + because the original program does not have a manual page. + Instead, it has documentation in the GNU + info + 1 + format; see below. + &dhpackage; is a program that... + + + OPTIONS + The program follows the usual GNU command line syntax, + with long options starting with two dashes (`-'). A summary of + options is included below. For a complete description, see the + + info + 1 + files. + + + + + + + Does this and that. + + + + + + + Show summary of options. + + + + + + + Show version of program. + + + + + + FILES + + + /etc/foo.conf + + The system-wide configuration file to control the + behaviour of &dhpackage;. See + + foo.conf + 5 + for further details. + + + + ${HOME}/.foo.conf + + The per-user configuration file to control the + behaviour of &dhpackage;. See + + foo.conf + 5 + for further details. + + + + + + ENVIONMENT + + + FOO_CONF + + If used, the defined file is used as configuration + file (see also ). + + + + + + DIAGNOSTICS + The following diagnostics may be issued + on stderr: + + + Bad configuration file. Exiting. + + The configuration file seems to contain a broken configuration + line. Use the option, to get more info. + + + + + &dhpackage; provides some return codes, that can + be used in scripts: + + Code + Diagnostic + + 0 + Program exited successfully. + + + 1 + The configuration file seems to be broken. + + + + + + BUGS + The program is currently limited to only work + with the foobar library. + The upstreams BTS can be found + at . + + + SEE ALSO + + + bar + 1 + , + baz + 1 + , + foo.conf + 5 + + The programs are documented fully by The Rise and + Fall of a Fooish Bar available via the + info + 1 + system. + +
+ diff --git a/package/linux/deb_common/menu.ex b/package/linux/deb_common/menu.ex new file mode 100644 index 000000000..c5a80a7bc --- /dev/null +++ b/package/linux/deb_common/menu.ex @@ -0,0 +1,2 @@ +?package(openpilot):needs="X11|text|vc|wm" section="Applications/see-menu-manual"\ + title="openpilot" command="/usr/bin/openpilot" diff --git a/package/linux/deb_common/openpilot.cron.d.ex b/package/linux/deb_common/openpilot.cron.d.ex new file mode 100644 index 000000000..bc3507489 --- /dev/null +++ b/package/linux/deb_common/openpilot.cron.d.ex @@ -0,0 +1,4 @@ +# +# Regular cron jobs for the openpilot package +# +0 4 * * * root [ -x /usr/bin/openpilot_maintenance ] && /usr/bin/openpilot_maintenance diff --git a/package/linux/deb_common/openpilot.debhelper.log b/package/linux/deb_common/openpilot.debhelper.log new file mode 100644 index 000000000..34de80b19 --- /dev/null +++ b/package/linux/deb_common/openpilot.debhelper.log @@ -0,0 +1,15 @@ +dh_prep +dh_installdirs +dh_installchangelogs +dh_installdocs +dh_installexamples +dh_installman +dh_link +dh_strip +dh_compress +dh_fixperms +dh_installdeb +dh_shlibdeps +dh_gencontrol +dh_md5sums +dh_builddeb diff --git a/package/linux/deb_common/openpilot.default.ex b/package/linux/deb_common/openpilot.default.ex new file mode 100644 index 000000000..0b172a1fc --- /dev/null +++ b/package/linux/deb_common/openpilot.default.ex @@ -0,0 +1,10 @@ +# Defaults for openpilot initscript +# sourced by /etc/init.d/openpilot +# installed at /etc/default/openpilot by the maintainer scripts + +# +# This is a POSIX shell fragment +# + +# Additional options that are passed to the Daemon. +DAEMON_OPTS="" diff --git a/package/linux/deb_common/openpilot.dirs b/package/linux/deb_common/openpilot.dirs new file mode 100644 index 000000000..2fa7142b6 --- /dev/null +++ b/package/linux/deb_common/openpilot.dirs @@ -0,0 +1,7 @@ +etc/udev/rules.d +etc/xdg/menus/applications-merged +usr/share/applications +usr/share/pixmaps +usr/share/desktop-directories +usr/local/OpenPilot/firmware +usr/bin diff --git a/package/linux/deb_common/openpilot.doc-base.EX b/package/linux/deb_common/openpilot.doc-base.EX new file mode 100644 index 000000000..9e24da0dc --- /dev/null +++ b/package/linux/deb_common/openpilot.doc-base.EX @@ -0,0 +1,20 @@ +Document: openpilot +Title: Debian openpilot Manual +Author: +Abstract: This manual describes what openpilot is + and how it can be used to + manage online manuals on Debian systems. +Section: unknown + +Format: debiandoc-sgml +Files: /usr/share/doc/openpilot/openpilot.sgml.gz + +Format: postscript +Files: /usr/share/doc/openpilot/openpilot.ps.gz + +Format: text +Files: /usr/share/doc/openpilot/openpilot.text.gz + +Format: HTML +Index: /usr/share/doc/openpilot/html/index.html +Files: /usr/share/doc/openpilot/html/*.html diff --git a/package/linux/deb_common/openpilot.substvars b/package/linux/deb_common/openpilot.substvars new file mode 100644 index 000000000..39006599c --- /dev/null +++ b/package/linux/deb_common/openpilot.substvars @@ -0,0 +1,2 @@ +shlibs:Depends=libc6 (>= 2.3.6-6~), libc6 (>= 2.4), libgcc1 (>= 1:4.1.1), libgl1-mesa-glx | libgl1, libglu1-mesa | libglu1, libphonon4 (>= 4:4.3.0), libqt4-network (>= 4:4.6.1), libqt4-opengl (>= 4:4.6.1), libqt4-script (>= 4:4.5.3), libqt4-sql (>= 4:4.5.3), libqt4-svg (>= 4:4.5.3), libqt4-test (>= 4:4.5.3), libqt4-xml (>= 4:4.5.3), libqtcore4 (>= 4:4.7.0~beta1), libqtgui4 (>= 4:4.6.2), libsdl1.2debian (>= 1.2.10-1), libstdc++6 (>= 4.1.1), libudev0 (>= 147), libusb-0.1-4 (>= 2:0.1.12), phonon +misc:Depends= diff --git a/package/linux/deb_common/postinst b/package/linux/deb_common/postinst new file mode 100644 index 000000000..df8022075 --- /dev/null +++ b/package/linux/deb_common/postinst @@ -0,0 +1,40 @@ +#!/bin/sh +# postinst script for openpilot +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# * `configure' +# * `abort-upgrade' +# * `abort-remove' `in-favour' +# +# * `abort-remove' +# * `abort-deconfigure' `in-favour' +# `removing' +# +# for details, see http://www.debian.org/doc/debian-policy/ or +# the debian-policy package + + +case "$1" in + configure) + sudo udevadm control --reload-rules >&2 + ;; + + abort-upgrade|abort-remove|abort-deconfigure) + ;; + + *) + echo "postinst called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 diff --git a/package/linux/deb_common/postinst.ex b/package/linux/deb_common/postinst.ex new file mode 100644 index 000000000..e8295471c --- /dev/null +++ b/package/linux/deb_common/postinst.ex @@ -0,0 +1,39 @@ +#!/bin/sh +# postinst script for openpilot +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# * `configure' +# * `abort-upgrade' +# * `abort-remove' `in-favour' +# +# * `abort-remove' +# * `abort-deconfigure' `in-favour' +# `removing' +# +# for details, see http://www.debian.org/doc/debian-policy/ or +# the debian-policy package + + +case "$1" in + configure) + ;; + + abort-upgrade|abort-remove|abort-deconfigure) + ;; + + *) + echo "postinst called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 diff --git a/package/linux/deb_common/postrm.ex b/package/linux/deb_common/postrm.ex new file mode 100644 index 000000000..7494eff83 --- /dev/null +++ b/package/linux/deb_common/postrm.ex @@ -0,0 +1,37 @@ +#!/bin/sh +# postrm script for openpilot +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# * `remove' +# * `purge' +# * `upgrade' +# * `failed-upgrade' +# * `abort-install' +# * `abort-install' +# * `abort-upgrade' +# * `disappear' +# +# for details, see http://www.debian.org/doc/debian-policy/ or +# the debian-policy package + + +case "$1" in + purge|remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear) + ;; + + *) + echo "postrm called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 diff --git a/package/linux/deb_common/preinst.ex b/package/linux/deb_common/preinst.ex new file mode 100644 index 000000000..32ac40cc3 --- /dev/null +++ b/package/linux/deb_common/preinst.ex @@ -0,0 +1,35 @@ +#!/bin/sh +# preinst script for openpilot +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# * `install' +# * `install' +# * `upgrade' +# * `abort-upgrade' +# for details, see http://www.debian.org/doc/debian-policy/ or +# the debian-policy package + + +case "$1" in + install|upgrade) + ;; + + abort-upgrade) + ;; + + *) + echo "preinst called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 diff --git a/package/linux/deb_common/prerm.ex b/package/linux/deb_common/prerm.ex new file mode 100644 index 000000000..a46c87175 --- /dev/null +++ b/package/linux/deb_common/prerm.ex @@ -0,0 +1,38 @@ +#!/bin/sh +# prerm script for openpilot +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# * `remove' +# * `upgrade' +# * `failed-upgrade' +# * `remove' `in-favour' +# * `deconfigure' `in-favour' +# `removing' +# +# for details, see http://www.debian.org/doc/debian-policy/ or +# the debian-policy package + + +case "$1" in + remove|upgrade|deconfigure) + ;; + + failed-upgrade) + ;; + + *) + echo "prerm called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 diff --git a/package/linux/deb_common/rules b/package/linux/deb_common/rules new file mode 100755 index 000000000..124d28ce2 --- /dev/null +++ b/package/linux/deb_common/rules @@ -0,0 +1,81 @@ +#!/usr/bin/make -f +# -*- makefile -*- +# Sample debian/rules that uses debhelper. +# +# This file was originally written by Joey Hess and Craig Small. +# As a special exception, when this file is copied by dh-make into a +# dh-make output file, you may use that output file without restriction. +# This special exception was added by Craig Small in version 0.37 of dh-make. +# +# Modified to make a template file for a multi-binary package with separated +# build-arch and build-indep targets by Bill Allombert 2001 + +# Uncomment this to turn on verbose mode. +# export DH_VERBOSE=1 + +# This has to be exported to make some magic below work. +export DH_OPTIONS=-v + +#%: +# dh $@ + +PACKAGE_DIR := $(shell cat build/package_dir) + +clean: + dh_testdir + dh_testroot + dh_clean + +install: + dh_testdir + dh_testroot + dh_prep + dh_installdirs + # Add here commands to install the package into debian/ + cp -arp build/ground/openpilotgcs/bin debian/openpilot/usr/local/OpenPilot + cp -arp build/ground/openpilotgcs/lib debian/openpilot/usr/local/OpenPilot + cp -arp build/ground/openpilotgcs/share debian/openpilot/usr/local/OpenPilot + cp -arp build/ground/openpilotgcs/.obj debian/openpilot/usr/local/OpenPilot + cp -arp build/ground/openpilotgcs/gcsversioninfo.h debian/openpilot/usr/local/OpenPilot + cp -arp package/linux/openpilot.desktop debian/openpilot/usr/share/applications + cp -arp package/linux/openpilot.png debian/openpilot/usr/share/pixmaps + cp -arp package/linux/rc_applications.png debian/openpilot/usr/share/pixmaps + cp -arp package/linux/rc_applications.menu debian/openpilot/etc/xdg/menus/applications-merged + cp -arp package/linux/rc_applications.directory debian/openpilot/usr/share/desktop-directories + cp -arp package/linux/45-openpilot-permissions.rules debian/openpilot/etc/udev/rules.d + cp -ar $(PACKAGE_DIR)/* debian/openpilot/usr/local/OpenPilot/firmware/ + ln -s /usr/local/OpenPilot/bin/openpilotgcs.bin `pwd`/debian/openpilot/usr/bin/openpilot-gcs + rm -rf debian/openpilot/usr/local/OpenPilot/share/openpilotgcs/sounds/sounds + rm -rf debian/openpilot/usr/local/OpenPilot/share/openpilotgcs/pfd/pfd + rm -rf debian/openpilot/usr/local/OpenPilot/share/openpilotgcs/models/models + rm -rf debian/openpilot/usr/local/OpenPilot/share/openpilotgcs/mapicons/mapicons + rm -rf debian/openpilot/usr/local/OpenPilot/share/openpilotgcs/dials/dials + rm -rf debian/openpilot/usr/local/OpenPilot/share/openpilotgcs/diagrams/diagrams + + +# Build architecture-independent files here. +binary-indep: install + +# We have nothing to build by default. Got taken care of by OPs build system +# Build architecture-dependent files here. +binary-arch: install + dh_testdir + dh_testroot + dh_installchangelogs + dh_installdocs + dh_installexamples + dh_installman + dh_link + dh_strip + dh_compress + dh_fixperms + dh_installdeb + dh_shlibdeps -l/usr/local/OpenPilot/lib/openpilotgcs --dpkg-shlibdeps-params="--ignore-missing-info -v" + dh_gencontrol + dh_md5sums + dh_builddeb + +binary: binary-indep binary-arch + +.PHONY: clean binary-indep binary-arch binary install + diff --git a/package/linux/deb_common/watch.ex b/package/linux/deb_common/watch.ex new file mode 100644 index 000000000..7e9872e99 --- /dev/null +++ b/package/linux/deb_common/watch.ex @@ -0,0 +1,23 @@ +# Example watch control file for uscan +# Rename this file to "watch" and then you can run the "uscan" command +# to check for upstream updates and more. +# See uscan(1) for format + +# Compulsory line, this is a version 3 file +version=3 + +# Uncomment to examine a Webpage +# +#http://www.example.com/downloads.php openpilot-(.*)\.tar\.gz + +# Uncomment to examine a Webserver directory +#http://www.example.com/pub/openpilot-(.*)\.tar\.gz + +# Uncommment to examine a FTP server +#ftp://ftp.example.com/pub/openpilot-(.*)\.tar\.gz debian uupdate + +# Uncomment to find new files on sourceforge, for devscripts >= 2.9 +# http://sf.net/openpilot/openpilot-(.*)\.tar\.gz + +# Uncomment to find new files on GooglePages +# http://example.googlepages.com/foo.html openpilot-(.*)\.tar\.gz diff --git a/package/linux/deb_i386/control b/package/linux/deb_i386/control new file mode 100644 index 000000000..7c274850c --- /dev/null +++ b/package/linux/deb_i386/control @@ -0,0 +1,15 @@ +Source: openpilot +Section: unknown +Priority: extra +Maintainer: naiiawah +Build-Depends: debhelper (>= 7.0.50~) +Standards-Version: 3.8.4 +Homepage: http://www.openpilot.org +#Vcs-Git: git://git.debian.org/collab-maint/openpilot.git +#Vcs-Browser: http://git.debian.org/?p=collab-maint/openpilot.git;a=summary + +Package: openpilot +Architecture: i386 +Depends: ${shlibs:Depends}, ${misc:Depends} +Description: OpenPilot GCS & FW + OpenPilot GCS and Firmware for CopterControl (CC) board. diff --git a/package/linux/openpilot.desktop b/package/linux/openpilot.desktop new file mode 100644 index 000000000..fc3099641 --- /dev/null +++ b/package/linux/openpilot.desktop @@ -0,0 +1,12 @@ +[Desktop Entry] +Version=0.1.0 +Encoding=UTF-8 +Name=OpenPilot GCS +Exec=openpilot-gcs +TryExec=openpilot-gcs +Comment=Configure, Tune, Diagnose, Track, & Upgrade FW for OpenPilot solutions +Terminal=false +Categories=RCApplications;Qt;Other; +Icon=openpilot +Type=Application +MimeType=application/openpilot.snapshot; diff --git a/package/linux/openpilot.png b/package/linux/openpilot.png new file mode 100755 index 0000000000000000000000000000000000000000..e9c4ee868ef977ebf1de2f856f60ecf73a94b18f GIT binary patch literal 2713 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 Te%FVV00000NkvXXu0mjf$ + + Applications + + RCApplications + rc_applications.directory + + RCApplications + + + diff --git a/package/linux/rc_applications.png b/package/linux/rc_applications.png new file mode 100755 index 0000000000000000000000000000000000000000..b5e10befaf72c11100090a88596cd302ca74f8b9 GIT binary patch literal 644 zcmV-~0(1M zut8kau0=#H+z5>!NJK3ST!fpcsgP(9II}bbQIHv3xF{?t7mB}cdRN|iI`jUe{cogig zK6xrY$q-z`Er6RE+iZh44wJ% zjE?Fq7y{>VF<;9Ds}>=mo5~m9MlFU2Yrm-Ns4Bn^Bjg_O4AA+;Y0DhtaFZ7!N%Q3N zgB7pbfa~v-?5M zzR~)B+ z*YK^o8`#F5*(r%|SZo3y{|PR`u78KeV9n9#-#?{mDyFC4468N4(;-2lU=Tb&V9{D? exW*2g?!XCe>w{%O1OwLq0000UD+ literal 0 HcmV?d00001 From 0b00e748a93c9e0acda9d92067997cc8371584e1 Mon Sep 17 00:00:00 2001 From: James Cotton Date: Mon, 22 Aug 2011 11:17:51 -0500 Subject: [PATCH 017/121] OP-565: Added the ability to do a trim flight to compute the accels for level flight --- flight/Modules/Attitude/attitude.c | 162 ++++++++++++------ .../uavobjectdefinition/attitudesettings.xml | 1 + 2 files changed, 106 insertions(+), 57 deletions(-) diff --git a/flight/Modules/Attitude/attitude.c b/flight/Modules/Attitude/attitude.c index b7b535f18..fdfa4681c 100644 --- a/flight/Modules/Attitude/attitude.c +++ b/flight/Modules/Attitude/attitude.c @@ -54,6 +54,7 @@ #include "attitudeactual.h" #include "attitudesettings.h" #include "flightstatus.h" +#include "manualcontrolcommand.h" #include "CoordinateConversions.h" #include "pios_flash_w25x.h" @@ -91,18 +92,28 @@ static int8_t rotate = 0; static bool zero_during_arming = false; static bool bias_correct_gyro = true; +// For running trim flights +static volatile bool trim_requested = false; +static volatile int32_t trim_accels[3]; +static volatile int32_t trim_samples; +int32_t const MAX_TRIM_FLIGHT_SAMPLES = 65535; + +#define GRAV 9.81f +#define ACCEL_SCALE (GRAV * 0.004f) +/* 0.004f is gravity / LSB */ + /** * Initialise the module, called on startup * \returns 0 on success or -1 if initialisation failed */ int32_t AttitudeStart(void) { - + // Start main task xTaskCreate(AttitudeTask, (signed char *)"Attitude", STACK_SIZE_BYTES/4, NULL, TASK_PRIORITY, &taskHandle); TaskMonitorAdd(TASKINFO_RUNNING_ATTITUDE, taskHandle); PIOS_WDG_RegisterFlag(PIOS_WDG_ATTITUDE); - + return 0; } @@ -115,7 +126,7 @@ int32_t AttitudeInitialize(void) AttitudeActualInitialize(); AttitudeRawInitialize(); AttitudeSettingsInitialize(); - + // Initialize quaternion AttitudeActualData attitude; AttitudeActualGet(&attitude); @@ -124,12 +135,12 @@ int32_t AttitudeInitialize(void) attitude.q3 = 0; attitude.q4 = 0; AttitudeActualSet(&attitude); - + // Cannot trust the values to init right above if BL runs gyro_correct_int[0] = 0; gyro_correct_int[1] = 0; gyro_correct_int[2] = 0; - + q[0] = 1; q[1] = 0; q[2] = 0; @@ -137,17 +148,19 @@ int32_t AttitudeInitialize(void) for(uint8_t i = 0; i < 3; i++) for(uint8_t j = 0; j < 3; j++) R[i][j] = 0; - + + trim_requested = false; + // Create queue for passing gyro data, allow 2 back samples in case gyro_queue = xQueueCreate(1, sizeof(float) * 4); if(gyro_queue == NULL) return -1; - - + + PIOS_ADC_SetQueue(gyro_queue); - + AttitudeSettingsConnectCallback(&settingsUpdatedCb); - + return 0; } @@ -160,9 +173,9 @@ static void AttitudeTask(void *parameters) { uint8_t init = 0; AlarmsClear(SYSTEMALARMS_ALARM_ATTITUDE); - + PIOS_ADC_Config((PIOS_ADC_RATE / 1000.0f) * UPDATE_RATE); - + // Keep flash CS pin high while talking accel PIOS_FLASH_DISABLE; PIOS_ADXL345_Init(); @@ -175,13 +188,13 @@ static void AttitudeTask(void *parameters) // Force settings update to make sure rotation loaded settingsUpdatedCb(AttitudeSettingsHandle()); - + // Main task loop while (1) { - + FlightStatusData flightStatus; FlightStatusGet(&flightStatus); - + if((xTaskGetTickCount() < 7000) && (xTaskGetTickCount() > 1000)) { // For first 7 seconds use accels to get gyro bias accelKp = 1; @@ -201,9 +214,9 @@ static void AttitudeTask(void *parameters) AttitudeSettingsYawBiasRateGet(&yawBiasRate); init = 1; } - + PIOS_WDG_UpdateFlag(PIOS_WDG_ATTITUDE); - + AttitudeRawData attitudeRaw; AttitudeRawGet(&attitudeRaw); if(updateSensors(&attitudeRaw) != 0) @@ -214,7 +227,7 @@ static void AttitudeTask(void *parameters) AttitudeRawSet(&attitudeRaw); AlarmsClear(SYSTEMALARMS_ALARM_ATTITUDE); } - + } } @@ -227,22 +240,22 @@ static int8_t updateSensors(AttitudeRawData * attitudeRaw) { struct pios_adxl345_data accel_data; float gyro[4]; - + // Only wait the time for two nominal updates before setting an alarm if(xQueueReceive(gyro_queue, (void * const) gyro, UPDATE_RATE * 2) == errQUEUE_EMPTY) { AlarmsSet(SYSTEMALARMS_ALARM_ATTITUDE, SYSTEMALARMS_ALARM_ERROR); return -1; } - + // No accel data available if(PIOS_ADXL345_FifoElements() == 0) return -1; - + // First sample is temperature attitudeRaw->gyros[ATTITUDERAW_GYROS_X] = -(gyro[1] - GYRO_NEUTRAL) * gyroGain; attitudeRaw->gyros[ATTITUDERAW_GYROS_Y] = (gyro[2] - GYRO_NEUTRAL) * gyroGain; attitudeRaw->gyros[ATTITUDERAW_GYROS_Z] = -(gyro[3] - GYRO_NEUTRAL) * gyroGain; - + int32_t x = 0; int32_t y = 0; int32_t z = 0; @@ -257,9 +270,9 @@ static int8_t updateSensors(AttitudeRawData * attitudeRaw) } while ( (i < 32) && (samples_remaining > 0) ); attitudeRaw->gyrotemp[0] = samples_remaining; attitudeRaw->gyrotemp[1] = i; - + float accel[3] = {(float) x / i, (float) y / i, (float) z / i}; - + if(rotate) { // TODO: rotate sensors too so stabilization is well behaved float vec_out[3]; @@ -276,19 +289,37 @@ static int8_t updateSensors(AttitudeRawData * attitudeRaw) attitudeRaw->accels[1] = accel[1]; attitudeRaw->accels[2] = accel[2]; } - + + if (trim_requested) { + if (trim_samples >= MAX_TRIM_FLIGHT_SAMPLES) { + trim_requested = false; + } else { + uint8_t armed; + float throttle; + FlightStatusArmedGet(&armed); + ManualControlCommandThrottleGet(&throttle); // Until flight status indicates airborne + if ((armed == FLIGHTSTATUS_ARMED_ARMED) && (throttle > 0)) { + trim_samples++; + // Store the digitally scaled version since that is what we use for bias + trim_accels[0] += attitudeRaw->accels[ATTITUDERAW_ACCELS_X]; + trim_accels[1] += attitudeRaw->accels[ATTITUDERAW_ACCELS_Y]; + trim_accels[2] += attitudeRaw->accels[ATTITUDERAW_ACCELS_Z]; + } + } + } + // Scale accels and correct bias - attitudeRaw->accels[ATTITUDERAW_ACCELS_X] = (attitudeRaw->accels[ATTITUDERAW_ACCELS_X] - accelbias[0]) * 0.004f * 9.81f; - attitudeRaw->accels[ATTITUDERAW_ACCELS_Y] = (attitudeRaw->accels[ATTITUDERAW_ACCELS_Y] - accelbias[1]) * 0.004f * 9.81f; - attitudeRaw->accels[ATTITUDERAW_ACCELS_Z] = (attitudeRaw->accels[ATTITUDERAW_ACCELS_Z] - accelbias[2]) * 0.004f * 9.81f; - + attitudeRaw->accels[ATTITUDERAW_ACCELS_X] = (attitudeRaw->accels[ATTITUDERAW_ACCELS_X] - accelbias[0]) * ACCEL_SCALE; + attitudeRaw->accels[ATTITUDERAW_ACCELS_Y] = (attitudeRaw->accels[ATTITUDERAW_ACCELS_Y] - accelbias[1]) * ACCEL_SCALE; + attitudeRaw->accels[ATTITUDERAW_ACCELS_Z] = (attitudeRaw->accels[ATTITUDERAW_ACCELS_Z] - accelbias[2]) * ACCEL_SCALE; + if(bias_correct_gyro) { // Applying integral component here so it can be seen on the gyros and correct bias attitudeRaw->gyros[ATTITUDERAW_GYROS_X] += gyro_correct_int[0]; attitudeRaw->gyros[ATTITUDERAW_GYROS_Y] += gyro_correct_int[1]; attitudeRaw->gyros[ATTITUDERAW_GYROS_Z] += gyro_correct_int[2]; } - + // Because most crafts wont get enough information from gravity to zero yaw gyro, we try // and make it average zero (weakly) gyro_correct_int[2] += - attitudeRaw->gyros[ATTITUDERAW_GYROS_Z] * yawBiasRate; @@ -301,45 +332,45 @@ static void updateAttitude(AttitudeRawData * attitudeRaw) float dT; portTickType thisSysTime = xTaskGetTickCount(); static portTickType lastSysTime = 0; - + dT = (thisSysTime == lastSysTime) ? 0.001 : (portMAX_DELAY & (thisSysTime - lastSysTime)) / portTICK_RATE_MS / 1000.0f; lastSysTime = thisSysTime; - + // Bad practice to assume structure order, but saves memory float gyro[3]; gyro[0] = attitudeRaw->gyros[0]; gyro[1] = attitudeRaw->gyros[1]; gyro[2] = attitudeRaw->gyros[2]; - + { float * accels = attitudeRaw->accels; float grot[3]; float accel_err[3]; - + // Rotate gravity to body frame and cross with accels grot[0] = -(2 * (q[1] * q[3] - q[0] * q[2])); grot[1] = -(2 * (q[2] * q[3] + q[0] * q[1])); grot[2] = -(q[0] * q[0] - q[1]*q[1] - q[2]*q[2] + q[3]*q[3]); CrossProduct((const float *) accels, (const float *) grot, accel_err); - + // Account for accel magnitude float accel_mag = sqrt(accels[0]*accels[0] + accels[1]*accels[1] + accels[2]*accels[2]); accel_err[0] /= accel_mag; accel_err[1] /= accel_mag; accel_err[2] /= accel_mag; - + // Accumulate integral of error. Scale here so that units are (deg/s) but Ki has units of s gyro_correct_int[0] += accel_err[0] * accelKi; gyro_correct_int[1] += accel_err[1] * accelKi; - - //gyro_correct_int[2] += accel_err[2] * settings.AccelKI * dT; - + + //gyro_correct_int[2] += accel_err[2] * accelKi; + // Correct rates based on error, integral component dealt with in updateSensors gyro[0] += accel_err[0] * accelKp / dT; gyro[1] += accel_err[1] * accelKp / dT; gyro[2] += accel_err[2] * accelKp / dT; } - + { // scoping variables to save memory // Work out time derivative from INSAlgo writeup // Also accounts for the fact that gyros are in deg/s @@ -348,7 +379,7 @@ static void updateAttitude(AttitudeRawData * attitudeRaw) qdot[1] = (q[0] * gyro[0] - q[3] * gyro[1] + q[2] * gyro[2]) * dT * M_PI / 180 / 2; qdot[2] = (q[3] * gyro[0] + q[0] * gyro[1] - q[1] * gyro[2]) * dT * M_PI / 180 / 2; qdot[3] = (-q[2] * gyro[0] + q[1] * gyro[1] + q[0] * gyro[2]) * dT * M_PI / 180 / 2; - + // Take a time step q[0] = q[0] + qdot[0]; q[1] = q[1] + qdot[1]; @@ -362,14 +393,14 @@ static void updateAttitude(AttitudeRawData * attitudeRaw) q[3] = -q[3]; } } - + // Renomalize float qmag = sqrt(q[0]*q[0] + q[1]*q[1] + q[2]*q[2] + q[3]*q[3]); q[0] = q[0] / qmag; q[1] = q[1] / qmag; q[2] = q[2] / qmag; q[3] = q[3] / qmag; - + // If quaternion has become inappropriately short or is nan reinit. // THIS SHOULD NEVER ACTUALLY HAPPEN if((fabs(qmag) < 1e-3) || (qmag != qmag)) { @@ -378,44 +409,44 @@ static void updateAttitude(AttitudeRawData * attitudeRaw) q[2] = 0; q[3] = 0; } - + AttitudeActualData attitudeActual; AttitudeActualGet(&attitudeActual); - + quat_copy(q, &attitudeActual.q1); - + // Convert into eueler degrees (makes assumptions about RPY order) Quaternion2RPY(&attitudeActual.q1,&attitudeActual.Roll); - + AttitudeActualSet(&attitudeActual); } static void settingsUpdatedCb(UAVObjEvent * objEv) { AttitudeSettingsData attitudeSettings; AttitudeSettingsGet(&attitudeSettings); - - + + accelKp = attitudeSettings.AccelKp; accelKi = attitudeSettings.AccelKi; yawBiasRate = attitudeSettings.YawBiasRate; gyroGain = attitudeSettings.GyroGain; - + zero_during_arming = attitudeSettings.ZeroDuringArming == ATTITUDESETTINGS_ZERODURINGARMING_TRUE; bias_correct_gyro = attitudeSettings.BiasCorrectGyro == ATTITUDESETTINGS_BIASCORRECTGYRO_TRUE; - + accelbias[0] = attitudeSettings.AccelBias[ATTITUDESETTINGS_ACCELBIAS_X]; accelbias[1] = attitudeSettings.AccelBias[ATTITUDESETTINGS_ACCELBIAS_Y]; accelbias[2] = attitudeSettings.AccelBias[ATTITUDESETTINGS_ACCELBIAS_Z]; - + gyro_correct_int[0] = attitudeSettings.GyroBias[ATTITUDESETTINGS_GYROBIAS_X] / 100.0f; gyro_correct_int[1] = attitudeSettings.GyroBias[ATTITUDESETTINGS_GYROBIAS_Y] / 100.0f; gyro_correct_int[2] = attitudeSettings.GyroBias[ATTITUDESETTINGS_GYROBIAS_Z] / 100.0f; - + // Indicates not to expend cycles on rotation if(attitudeSettings.BoardRotation[0] == 0 && attitudeSettings.BoardRotation[1] == 0 && attitudeSettings.BoardRotation[2] == 0) { rotate = 0; - + // Shouldn't be used but to be safe float rotationQuat[4] = {1,0,0,0}; Quaternion2R(rotationQuat, R); @@ -428,8 +459,25 @@ static void settingsUpdatedCb(UAVObjEvent * objEv) { Quaternion2R(rotationQuat, R); rotate = 1; } + + if (attitudeSettings.TrimFlight == ATTITUDESETTINGS_TRIMFLIGHT_START) { + trim_accels[0] = 0; + trim_accels[1] = 0; + trim_accels[2] = 0; + trim_samples = 0; + trim_requested = true; + } else if (attitudeSettings.TrimFlight == ATTITUDESETTINGS_TRIMFLIGHT_LOAD) { + trim_requested = false; + attitudeSettings.AccelBias[ATTITUDESETTINGS_ACCELBIAS_X] = trim_accels[0] / trim_samples; + attitudeSettings.AccelBias[ATTITUDESETTINGS_ACCELBIAS_Y] = trim_accels[1] / trim_samples; + // Z should average -grav + attitudeSettings.AccelBias[ATTITUDESETTINGS_ACCELBIAS_Z] = trim_accels[2] / trim_samples + GRAV / ACCEL_SCALE; + attitudeSettings.TrimFlight = ATTITUDESETTINGS_TRIMFLIGHT_NORMAL; + AttitudeSettingsSet(&attitudeSettings); + } else + trim_requested = false; } /** - * @} - * @} - */ + * @} + * @} + */ diff --git a/shared/uavobjectdefinition/attitudesettings.xml b/shared/uavobjectdefinition/attitudesettings.xml index 677493d68..e60c2454b 100644 --- a/shared/uavobjectdefinition/attitudesettings.xml +++ b/shared/uavobjectdefinition/attitudesettings.xml @@ -10,6 +10,7 @@ + From ed868054587cbca13a67afe31ce1a5b57a05e86a Mon Sep 17 00:00:00 2001 From: naiiawah Date: Wed, 21 Dec 2011 22:18:08 -0700 Subject: [PATCH 018/121] Updates to fix review issues: -jX build issues fixes, updated URLs in /control --- package/Makefile.linux | 9 +++++---- package/linux/deb_amd64/control | 4 ++-- package/linux/deb_i386/control | 4 ++-- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/package/Makefile.linux b/package/Makefile.linux index 7bb0afc99..fba2ef3ff 100644 --- a/package/Makefile.linux +++ b/package/Makefile.linux @@ -3,7 +3,7 @@ # define CP_DEB_FILES_TEMPLATE -.PHONY: $(1) +.PHONY: $(2)/$(1) $(2)/$(1): $(3)/$(1) $(V1)cp -a $$< $$@ endef @@ -40,18 +40,20 @@ ALL_DEB_FILES += $(foreach f, $(DEB_MACHINE_FILES), $(DEB_BUILD_DIR)/$(f)) DEB_PACKAGE_NAME := openpilot_$(VERSION_FULL)_$(DEB_PLATFORM) -linux_deb_package: gcs deb_build package_flight +linux_deb_package: deb_build gcs @echo $@ starting cd .. && dpkg-buildpackage -b $(V1)mv $(ROOT_DIR)/../$(DEB_PACKAGE_NAME).deb $(BUILD_DIR) $(V1)mv $(ROOT_DIR)/../$(DEB_PACKAGE_NAME).changes $(BUILD_DIR) $(V1)rm -rf $(DEB_BUILD_DIR) -deb_build: | $(DEB_BUILD_DIR) $(ALL_DEB_FILES) +deb_build: | $(DEB_BUILD_DIR) $(ALL_DEB_FILES) $(BUILD_DIR)/build @echo $@ starting $(V1)$(shell echo $(PACKAGE_DIR) > $(BUILD_DIR)/package_dir) $(V1)sed -i -e "$(SED_SCRIPT)" $(DEB_BUILD_DIR)/changelog +$(BUILD_DIR)/build: package_flight + $(DEB_BUILD_DIR): @echo $@ starting $(V1)mkdir -p $(DEB_BUILD_DIR) @@ -68,7 +70,6 @@ identify: @echo "" @echo "We are in the Linux Package Make system." @echo "" - $(V1)rm -rf $(DEB_BUILD_DIR) ground_package: | identify linux_deb_package diff --git a/package/linux/deb_amd64/control b/package/linux/deb_amd64/control index eab1547b1..c2408ee21 100644 --- a/package/linux/deb_amd64/control +++ b/package/linux/deb_amd64/control @@ -5,8 +5,8 @@ Maintainer: naiiawah Build-Depends: debhelper (>= 7.0.50~) Standards-Version: 3.8.4 Homepage: http://www.openpilot.org -#Vcs-Git: git://git.debian.org/collab-maint/openpilot.git -#Vcs-Browser: http://git.debian.org/?p=collab-maint/openpilot.git;a=summary +Vcs-Git: git://git.openpilot.org/OpenPilot.git +Vcs-Browser: http://git.openpilot.org/changelog/OpenPilot Package: openpilot Architecture: amd64 diff --git a/package/linux/deb_i386/control b/package/linux/deb_i386/control index 7c274850c..e93d4f559 100644 --- a/package/linux/deb_i386/control +++ b/package/linux/deb_i386/control @@ -5,8 +5,8 @@ Maintainer: naiiawah Build-Depends: debhelper (>= 7.0.50~) Standards-Version: 3.8.4 Homepage: http://www.openpilot.org -#Vcs-Git: git://git.debian.org/collab-maint/openpilot.git -#Vcs-Browser: http://git.debian.org/?p=collab-maint/openpilot.git;a=summary +Vcs-Git: git://git.openpilot.org/OpenPilot.git +Vcs-Browser: http://git.openpilot.org/changelog/OpenPilot Package: openpilot Architecture: i386 From 15061dccab30083f3403236fee0986c05b2967d2 Mon Sep 17 00:00:00 2001 From: naiiawah Date: Wed, 21 Dec 2011 22:38:40 -0700 Subject: [PATCH 019/121] Updates based on review feedback. Fixed (unlikely) case of empty PACKAGE_DIR var to prevent splatered copying. --- package/linux/deb_common/rules | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/package/linux/deb_common/rules b/package/linux/deb_common/rules index 124d28ce2..0c69e582c 100755 --- a/package/linux/deb_common/rules +++ b/package/linux/deb_common/rules @@ -19,7 +19,7 @@ export DH_OPTIONS=-v #%: # dh $@ -PACKAGE_DIR := $(shell cat build/package_dir) +PACKAGE_DIR = $(shell cat build/package_dir) clean: dh_testdir @@ -43,7 +43,9 @@ install: cp -arp package/linux/rc_applications.menu debian/openpilot/etc/xdg/menus/applications-merged cp -arp package/linux/rc_applications.directory debian/openpilot/usr/share/desktop-directories cp -arp package/linux/45-openpilot-permissions.rules debian/openpilot/etc/udev/rules.d +ifdef $(PACKAGE_DIR) cp -ar $(PACKAGE_DIR)/* debian/openpilot/usr/local/OpenPilot/firmware/ +endif ln -s /usr/local/OpenPilot/bin/openpilotgcs.bin `pwd`/debian/openpilot/usr/bin/openpilot-gcs rm -rf debian/openpilot/usr/local/OpenPilot/share/openpilotgcs/sounds/sounds rm -rf debian/openpilot/usr/local/OpenPilot/share/openpilotgcs/pfd/pfd From e7a5c14fe28ba07d36cfc846381f89eec85bfe1b Mon Sep 17 00:00:00 2001 From: naiiawah Date: Sat, 24 Dec 2011 14:30:02 -0700 Subject: [PATCH 020/121] Improved the handling of the UDev rules installation. Uses dh_installudev now instead of just manually copying files. Should survive any changes to where UDev puts rules better if there is a channge in their scheme of locations. Suggested change by Stac after finding the dh_installudev tool. Good find! --- package/linux/deb_common/openpilot.dirs | 1 - package/linux/deb_common/openpilot.udev | 13 +++++++++++++ package/linux/deb_common/rules | 2 +- 3 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 package/linux/deb_common/openpilot.udev diff --git a/package/linux/deb_common/openpilot.dirs b/package/linux/deb_common/openpilot.dirs index 2fa7142b6..08bf6a7e1 100644 --- a/package/linux/deb_common/openpilot.dirs +++ b/package/linux/deb_common/openpilot.dirs @@ -1,4 +1,3 @@ -etc/udev/rules.d etc/xdg/menus/applications-merged usr/share/applications usr/share/pixmaps diff --git a/package/linux/deb_common/openpilot.udev b/package/linux/deb_common/openpilot.udev new file mode 100644 index 000000000..d04d31b7f --- /dev/null +++ b/package/linux/deb_common/openpilot.udev @@ -0,0 +1,13 @@ + # OpenPilot openpilot flight control board + SUBSYSTEM=="usb", ATTRS{idVendor}=="20a0", ATTRS{idProduct}=="4117", MODE="0664", GROUP="plugdev" + SUBSYSTEM=="usb", ATTRS{idVendor}=="20a0", ATTRS{idProduct}=="415a", MODE="0664", GROUP="plugdev" + # OpenPilot coptercontrol flight control board + SUBSYSTEM=="usb", ATTRS{idVendor}=="20a0", ATTRS{idProduct}=="415b", MODE="0664", GROUP="plugdev" + # OpenPilot Pipx radio modem board + SUBSYSTEM=="usb", ATTRS{idVendor}=="20a0", ATTRS{idProduct}=="415c", MODE="0664", GROUP="plugdev" + # unprogrammed openpilot flight control board + SUBSYSTEM=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="5750", MODE="0664", GROUP="plugdev" + # FTDI FT2232C Dual USB-UART/FIFO IC + SUBSYSTEM=="usb", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6010", MODE="0664", GROUP="plugdev" + # Olimex Ltd. OpenOCD JTAG TINY + SUBSYSTEM=="usb", ATTRS{idVendor}=="15ba", ATTRS{idProduct}=="0004", MODE="0664", GROUP="plugdev" diff --git a/package/linux/deb_common/rules b/package/linux/deb_common/rules index 0c69e582c..c39116217 100755 --- a/package/linux/deb_common/rules +++ b/package/linux/deb_common/rules @@ -31,6 +31,7 @@ install: dh_testroot dh_prep dh_installdirs + dh_installudev --priority=45 # Add here commands to install the package into debian/ cp -arp build/ground/openpilotgcs/bin debian/openpilot/usr/local/OpenPilot cp -arp build/ground/openpilotgcs/lib debian/openpilot/usr/local/OpenPilot @@ -42,7 +43,6 @@ install: cp -arp package/linux/rc_applications.png debian/openpilot/usr/share/pixmaps cp -arp package/linux/rc_applications.menu debian/openpilot/etc/xdg/menus/applications-merged cp -arp package/linux/rc_applications.directory debian/openpilot/usr/share/desktop-directories - cp -arp package/linux/45-openpilot-permissions.rules debian/openpilot/etc/udev/rules.d ifdef $(PACKAGE_DIR) cp -ar $(PACKAGE_DIR)/* debian/openpilot/usr/local/OpenPilot/firmware/ endif From 5da31269a63b7392ac01a685a38a6f597fc65f78 Mon Sep 17 00:00:00 2001 From: naiiawah Date: Sat, 24 Dec 2011 20:38:04 -0700 Subject: [PATCH 021/121] Changed the top level menu to OpenPilot. --- package/linux/deb_common/rules | 6 +++--- package/linux/openpilot.desktop | 2 +- ...lications.directory => openpilot_menu.directory} | 4 ++-- .../{rc_applications.menu => openpilot_menu.menu} | 8 ++++---- .../{rc_applications.png => openpilot_menu.png} | Bin 5 files changed, 10 insertions(+), 10 deletions(-) rename package/linux/{rc_applications.directory => openpilot_menu.directory} (50%) rename package/linux/{rc_applications.menu => openpilot_menu.menu} (54%) rename package/linux/{rc_applications.png => openpilot_menu.png} (100%) diff --git a/package/linux/deb_common/rules b/package/linux/deb_common/rules index c39116217..c4a7d9bd9 100755 --- a/package/linux/deb_common/rules +++ b/package/linux/deb_common/rules @@ -40,9 +40,9 @@ install: cp -arp build/ground/openpilotgcs/gcsversioninfo.h debian/openpilot/usr/local/OpenPilot cp -arp package/linux/openpilot.desktop debian/openpilot/usr/share/applications cp -arp package/linux/openpilot.png debian/openpilot/usr/share/pixmaps - cp -arp package/linux/rc_applications.png debian/openpilot/usr/share/pixmaps - cp -arp package/linux/rc_applications.menu debian/openpilot/etc/xdg/menus/applications-merged - cp -arp package/linux/rc_applications.directory debian/openpilot/usr/share/desktop-directories + cp -arp package/linux/openpilot_menu.png debian/openpilot/usr/share/pixmaps + cp -arp package/linux/openpilot_menu.menu debian/openpilot/etc/xdg/menus/applications-merged + cp -arp package/linux/openpilot_menu.directory debian/openpilot/usr/share/desktop-directories ifdef $(PACKAGE_DIR) cp -ar $(PACKAGE_DIR)/* debian/openpilot/usr/local/OpenPilot/firmware/ endif diff --git a/package/linux/openpilot.desktop b/package/linux/openpilot.desktop index fc3099641..5ce67af5d 100644 --- a/package/linux/openpilot.desktop +++ b/package/linux/openpilot.desktop @@ -6,7 +6,7 @@ Exec=openpilot-gcs TryExec=openpilot-gcs Comment=Configure, Tune, Diagnose, Track, & Upgrade FW for OpenPilot solutions Terminal=false -Categories=RCApplications;Qt;Other; +Categories=OpenPilotMenu;Qt;Other; Icon=openpilot Type=Application MimeType=application/openpilot.snapshot; diff --git a/package/linux/rc_applications.directory b/package/linux/openpilot_menu.directory similarity index 50% rename from package/linux/rc_applications.directory rename to package/linux/openpilot_menu.directory index f375c7f13..7175a8915 100644 --- a/package/linux/rc_applications.directory +++ b/package/linux/openpilot_menu.directory @@ -1,5 +1,5 @@ [Desktop Entry] Type=Directory Encoding=UTF-8 -Name=RCApplications -Icon=rc_applications.png +Name=OpenPilot +Icon=openpilot_menu.png diff --git a/package/linux/rc_applications.menu b/package/linux/openpilot_menu.menu similarity index 54% rename from package/linux/rc_applications.menu rename to package/linux/openpilot_menu.menu index 185678f94..9e35577ec 100644 --- a/package/linux/rc_applications.menu +++ b/package/linux/openpilot_menu.menu @@ -3,10 +3,10 @@ Applications - RCApplications - rc_applications.directory + OpenPilot + openpilot_menu.directory - RCApplications + OpenPilotMenu - + diff --git a/package/linux/rc_applications.png b/package/linux/openpilot_menu.png similarity index 100% rename from package/linux/rc_applications.png rename to package/linux/openpilot_menu.png From 7892f9699d223294a4ee7d32db4f38289f251762 Mon Sep 17 00:00:00 2001 From: dankers Date: Thu, 29 Dec 2011 22:25:17 +1100 Subject: [PATCH 022/121] Add minus for notify as requested --- .../openpilotgcs/sounds/Complete sound set.txt | 3 ++- .../share/openpilotgcs/sounds/default/minus.wav | Bin 0 -> 67342 bytes 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 ground/openpilotgcs/share/openpilotgcs/sounds/default/minus.wav diff --git a/ground/openpilotgcs/share/openpilotgcs/sounds/Complete sound set.txt b/ground/openpilotgcs/share/openpilotgcs/sounds/Complete sound set.txt index e539e6d24..4361d3e8b 100644 --- a/ground/openpilotgcs/share/openpilotgcs/sounds/Complete sound set.txt +++ b/ground/openpilotgcs/share/openpilotgcs/sounds/Complete sound set.txt @@ -65,7 +65,8 @@ magic manual flight maxium meters -minimum +minimum +minus mode moved MPH diff --git a/ground/openpilotgcs/share/openpilotgcs/sounds/default/minus.wav b/ground/openpilotgcs/share/openpilotgcs/sounds/default/minus.wav new file mode 100644 index 0000000000000000000000000000000000000000..385c1e55eaaedc3600fc9d74b9717ad5873619b0 GIT binary patch literal 67342 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ʭHn@o@_+hGLhFA;z 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 Date: Fri, 30 Dec 2011 17:47:22 -0700 Subject: [PATCH 023/121] Updated Vid/Pids for Revo, CC3D and some minor comment cleanup in the UDev rules file. --- package/linux/deb_common/openpilot.udev | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/package/linux/deb_common/openpilot.udev b/package/linux/deb_common/openpilot.udev index d04d31b7f..3d84dd426 100644 --- a/package/linux/deb_common/openpilot.udev +++ b/package/linux/deb_common/openpilot.udev @@ -1,10 +1,15 @@ - # OpenPilot openpilot flight control board + # OpenPilot Flight Control board SUBSYSTEM=="usb", ATTRS{idVendor}=="20a0", ATTRS{idProduct}=="4117", MODE="0664", GROUP="plugdev" + # OpenPilot OP board SUBSYSTEM=="usb", ATTRS{idVendor}=="20a0", ATTRS{idProduct}=="415a", MODE="0664", GROUP="plugdev" - # OpenPilot coptercontrol flight control board + # OpenPilot CopterControl flight control board SUBSYSTEM=="usb", ATTRS{idVendor}=="20a0", ATTRS{idProduct}=="415b", MODE="0664", GROUP="plugdev" # OpenPilot Pipx radio modem board SUBSYSTEM=="usb", ATTRS{idVendor}=="20a0", ATTRS{idProduct}=="415c", MODE="0664", GROUP="plugdev" + # OpenPilot CopterControl3D flight control board + SUBSYSTEM=="usb", ATTRS{idVendor}=="20a0", ATTRS{idProduct}=="415d", MODE="0664", GROUP="plugdev" + # OpenPilot Revolution flight control board + SUBSYSTEM=="usb", ATTRS{idVendor}=="20a0", ATTRS{idProduct}=="415e", MODE="0664", GROUP="plugdev" # unprogrammed openpilot flight control board SUBSYSTEM=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="5750", MODE="0664", GROUP="plugdev" # FTDI FT2232C Dual USB-UART/FIFO IC From 458d3467ab3c50550212319c927580e990660c8f Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Wed, 7 Sep 2011 18:50:21 -0400 Subject: [PATCH 024/121] gcs: properly label ttyACM devices in gcs pull-down selector --- .../src/libs/qextserialport/src/qextserialenumerator_unix.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ground/openpilotgcs/src/libs/qextserialport/src/qextserialenumerator_unix.cpp b/ground/openpilotgcs/src/libs/qextserialport/src/qextserialenumerator_unix.cpp index f43a75b68..fd5af0d25 100644 --- a/ground/openpilotgcs/src/libs/qextserialport/src/qextserialenumerator_unix.cpp +++ b/ground/openpilotgcs/src/libs/qextserialport/src/qextserialenumerator_unix.cpp @@ -60,6 +60,9 @@ QList QextSerialEnumerator::getPorts() else if (str.contains("rfcomm")) { inf.friendName = "Bluetooth-serial adapter "+str.remove(0, 6); } + else if (str.contains("ttyACM")) { + inf.friendName = "USB VCP adapter "+str.remove(0, 6); + } inf.enumName = "/dev"; // is there a more helpful name for this? infoList.append(inf); } From c0259dc616d37194a38b3e3da17573ae321879ea Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Wed, 7 Sep 2011 21:39:56 -0400 Subject: [PATCH 025/121] usb cdc: USB composite device with HID + VCP --- flight/Bootloaders/CopterControl/Makefile | 1 + .../CopterControl/inc/pios_config.h | 1 + flight/Bootloaders/CopterControl/main.c | 4 +- flight/Bootloaders/CopterControl/op_dfu.c | 8 +- flight/Bootloaders/CopterControl/pios_board.c | 26 +- flight/Bootloaders/OpenPilot/Makefile | 1 + .../Bootloaders/OpenPilot/inc/pios_config.h | 1 + flight/Bootloaders/OpenPilot/main.c | 4 +- flight/Bootloaders/OpenPilot/op_dfu.c | 8 +- flight/Bootloaders/OpenPilot/pios_board.c | 27 +- flight/Bootloaders/PipXtreme/Makefile | 1 + .../Bootloaders/PipXtreme/inc/pios_config.h | 1 + flight/Bootloaders/PipXtreme/main.c | 4 +- flight/Bootloaders/PipXtreme/op_dfu.c | 10 +- flight/Bootloaders/PipXtreme/pios_board.c | 28 +- flight/CopterControl/Makefile | 3 +- flight/CopterControl/System/inc/pios_config.h | 2 + flight/CopterControl/System/inc/pios_usb.h | 2 +- .../System/inc/pios_usb_hid_desc.h | 2 +- flight/CopterControl/System/pios_board.c | 49 +- .../CopterControl/System/pios_usb_hid_desc.c | 138 ++++- flight/Modules/Telemetry/telemetry.c | 4 +- flight/OpenPilot/Makefile | 1 + flight/OpenPilot/System/inc/pios_config.h | 1 + flight/OpenPilot/System/pios_board.c | 27 +- flight/PiOS/Boards/STM32103CB_CC_Rev1.h | 10 +- .../PiOS/Boards/STM32103CB_PIPXTREME_Rev1.h | 7 +- flight/PiOS/Boards/STM3210E_OP.h | 10 +- flight/PiOS/STM32F10x/pios_usb_com.c | 584 ++++++++++++++++++ flight/PiOS/STM32F10x/pios_usb_hid.c | 308 ++------- flight/PiOS/STM32F10x/pios_usb_hid_desc.c | 4 +- flight/PiOS/STM32F10x/pios_usb_hid_istr.c | 4 +- flight/PiOS/STM32F10x/pios_usb_hid_prop.c | 139 ++++- flight/PiOS/inc/pios_com_priv.h | 4 +- flight/PiOS/inc/pios_usb_com_priv.h | 66 ++ flight/PiOS/inc/pios_usb_hid.h | 8 +- flight/PiOS/inc/pios_usb_hid_priv.h | 4 +- flight/PiOS/inc/pios_usb_hid_prop.h | 6 + flight/PiOS/inc/usb_conf.h | 24 +- flight/PipXtreme/Makefile | 1 + flight/PipXtreme/api_config.c | 2 +- flight/PipXtreme/inc/pios_config.h | 1 + flight/PipXtreme/inc/usb_conf.h | 22 +- flight/PipXtreme/pios_board.c | 27 +- flight/PipXtreme/pios_usb_hid_desc.c | 4 +- flight/PipXtreme/transparent_comms.c | 2 +- 46 files changed, 1180 insertions(+), 411 deletions(-) create mode 100644 flight/PiOS/STM32F10x/pios_usb_com.c create mode 100644 flight/PiOS/inc/pios_usb_com_priv.h diff --git a/flight/Bootloaders/CopterControl/Makefile b/flight/Bootloaders/CopterControl/Makefile index e630f9839..010eadd7a 100644 --- a/flight/Bootloaders/CopterControl/Makefile +++ b/flight/Bootloaders/CopterControl/Makefile @@ -111,6 +111,7 @@ SRC += $(PIOSSTM32F10X)/pios_usb_hid_desc.c SRC += $(PIOSSTM32F10X)/pios_usb_hid_istr.c SRC += $(PIOSSTM32F10X)/pios_usb_hid_prop.c SRC += $(PIOSSTM32F10X)/pios_usb_hid_pwr.c +SRC += $(PIOSSTM32F10X)/pios_usb_com.c ## PIOS Hardware (Common) SRC += $(PIOSCOMMON)/pios_board_info.c diff --git a/flight/Bootloaders/CopterControl/inc/pios_config.h b/flight/Bootloaders/CopterControl/inc/pios_config.h index faa0cff54..5c25f2aa5 100644 --- a/flight/Bootloaders/CopterControl/inc/pios_config.h +++ b/flight/Bootloaders/CopterControl/inc/pios_config.h @@ -39,6 +39,7 @@ #define PIOS_INCLUDE_LED #define PIOS_INCLUDE_SYS #define PIOS_INCLUDE_USB_HID +#define PIOS_INCLUDE_USB_COM #define PIOS_INCLUDE_COM #define PIOS_INCLUDE_GPIO #define PIOS_NO_GPS diff --git a/flight/Bootloaders/CopterControl/main.c b/flight/Bootloaders/CopterControl/main.c index aa375a49c..e60696115 100644 --- a/flight/Bootloaders/CopterControl/main.c +++ b/flight/Bootloaders/CopterControl/main.c @@ -198,8 +198,8 @@ uint32_t LedPWM(uint32_t pwm_period, uint32_t pwm_sweep_steps, uint32_t count) { } uint8_t processRX() { - while (PIOS_COM_ReceiveBufferUsed(PIOS_COM_TELEM_USB) >= 63) { - if (PIOS_COM_ReceiveBuffer(PIOS_COM_TELEM_USB, mReceive_Buffer, 63, 0) == 63) { + while (PIOS_COM_ReceiveBufferUsed(PIOS_COM_TELEM_USB_HID) >= 63) { + if (PIOS_COM_ReceiveBuffer(PIOS_COM_TELEM_USB_HID, mReceive_Buffer, 63, 0) == 63) { processComand(mReceive_Buffer); } } diff --git a/flight/Bootloaders/CopterControl/op_dfu.c b/flight/Bootloaders/CopterControl/op_dfu.c index b45e1e798..dc2b1836d 100644 --- a/flight/Bootloaders/CopterControl/op_dfu.c +++ b/flight/Bootloaders/CopterControl/op_dfu.c @@ -113,7 +113,7 @@ void processComand(uint8_t *xReceive_Buffer) { #ifdef DEBUG_SSP char str[63]= {0}; sprintf(str,"Received COMMAND:%d|",Command); - PIOS_COM_SendString(PIOS_COM_TELEM_USB,str); + PIOS_COM_SendString(PIOS_COM_TELEM_USB_HID,str); #endif EchoReqFlag = (Command >> 7); EchoAnsFlag = (Command >> 6) & 0x01; @@ -324,11 +324,11 @@ void processComand(uint8_t *xReceive_Buffer) { case Download_Req: #ifdef DEBUG_SSP sprintf(str,"COMMAND:DOWNLOAD_REQ 1 Status=%d|",DeviceState); - PIOS_COM_SendString(PIOS_COM_TELEM_USB,str); + PIOS_COM_SendString(PIOS_COM_TELEM_USB_HID,str); #endif if (DeviceState == DFUidle) { #ifdef DEBUG_SSP - PIOS_COM_SendString(PIOS_COM_TELEM_USB,"COMMAND:DOWNLOAD_REQ 1|"); + PIOS_COM_SendString(PIOS_COM_TELEM_USB_HID,"COMMAND:DOWNLOAD_REQ 1|"); #endif downType = Data0; downPacketTotal = Count; @@ -442,7 +442,7 @@ uint32_t CalcFirmCRC() { } void sendData(uint8_t * buf, uint16_t size) { - PIOS_COM_SendBuffer(PIOS_COM_TELEM_USB, buf, size); + PIOS_COM_SendBuffer(PIOS_COM_TELEM_USB_HID, buf, size); if (DeviceState == downloading) PIOS_DELAY_WaitmS(20);//this is an hack, we should check wtf is wrong with hid } diff --git a/flight/Bootloaders/CopterControl/pios_board.c b/flight/Bootloaders/CopterControl/pios_board.c index 28a280f4b..118143679 100644 --- a/flight/Bootloaders/CopterControl/pios_board.c +++ b/flight/Bootloaders/CopterControl/pios_board.c @@ -44,7 +44,7 @@ static uint8_t pios_com_telem_usb_tx_buffer[PIOS_COM_TELEM_USB_TX_BUF_LEN]; #if defined(PIOS_INCLUDE_USB_HID) #include "pios_usb_hid_priv.h" -static const struct pios_usb_hid_cfg pios_usb_hid_main_cfg = { +static const struct pios_usb_cfg pios_usb_main_cfg = { .irq = { .init = { .NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn, @@ -56,9 +56,19 @@ static const struct pios_usb_hid_cfg pios_usb_hid_main_cfg = { }; #endif /* PIOS_INCLUDE_USB_HID */ -extern const struct pios_com_driver pios_usb_com_driver; +#if defined(PIOS_INCLUDE_USB_COM) +#include -uint32_t pios_com_telem_usb_id; +const struct pios_usb_com_cfg pios_usb_com_hid_cfg = { + .type = PIOS_USB_COM_HID, + .data_if = 0, + .data_rx_ep = 1, + .data_tx_ep = 1, +}; + +#endif /* PIOS_INCLUDE_USB_COM */ + +uint32_t pios_com_telem_usb_hid_id; /** * PIOS_Board_Init() @@ -84,12 +94,16 @@ void PIOS_Board_Init(void) { PIOS_GPIO_Init(); #if defined(PIOS_INCLUDE_USB_HID) - uint32_t pios_usb_hid_id; - if (PIOS_USB_HID_Init(&pios_usb_hid_id, &pios_usb_hid_main_cfg)) { + uint32_t pios_usb_id; + if (PIOS_USB_Init(&pios_usb_id, &pios_usb_main_cfg)) { PIOS_Assert(0); } #if defined(PIOS_INCLUDE_COM) - if (PIOS_COM_Init(&pios_com_telem_usb_id, &pios_usb_com_driver, pios_usb_hid_id, + uint32_t pios_usb_com_id; + if (PIOS_USB_COM_Init(&pios_usb_com_id, &pios_usb_com_hid_cfg, pios_usb_id)) { + PIOS_Assert(0); + } + if (PIOS_COM_Init(&pios_com_telem_usb_hid_id, &pios_usb_hid_com_driver, pios_usb_com_id, pios_com_telem_usb_rx_buffer, sizeof(pios_com_telem_usb_rx_buffer), pios_com_telem_usb_tx_buffer, sizeof(pios_com_telem_usb_tx_buffer))) { PIOS_Assert(0); diff --git a/flight/Bootloaders/OpenPilot/Makefile b/flight/Bootloaders/OpenPilot/Makefile index 75891289f..d673f4353 100644 --- a/flight/Bootloaders/OpenPilot/Makefile +++ b/flight/Bootloaders/OpenPilot/Makefile @@ -114,6 +114,7 @@ SRC += $(PIOSSTM32F10X)/pios_usb_hid_desc.c SRC += $(PIOSSTM32F10X)/pios_usb_hid_istr.c SRC += $(PIOSSTM32F10X)/pios_usb_hid_prop.c SRC += $(PIOSSTM32F10X)/pios_usb_hid_pwr.c +SRC += $(PIOSSTM32F10X)/pios_usb_com.c ## PIOS Hardware (Common) SRC += $(PIOSCOMMON)/pios_board_info.c diff --git a/flight/Bootloaders/OpenPilot/inc/pios_config.h b/flight/Bootloaders/OpenPilot/inc/pios_config.h index c4ace5f90..3268ca3ca 100644 --- a/flight/Bootloaders/OpenPilot/inc/pios_config.h +++ b/flight/Bootloaders/OpenPilot/inc/pios_config.h @@ -40,6 +40,7 @@ #define PIOS_INCLUDE_SYS #define PIOS_INCLUDE_USART #define PIOS_INCLUDE_USB_HID +#define PIOS_INCLUDE_USB_COM #define PIOS_INCLUDE_OPAHRS #define PIOS_INCLUDE_COM #define PIOS_INCLUDE_GPIO diff --git a/flight/Bootloaders/OpenPilot/main.c b/flight/Bootloaders/OpenPilot/main.c index 8e15952ea..25f38fdb9 100644 --- a/flight/Bootloaders/OpenPilot/main.c +++ b/flight/Bootloaders/OpenPilot/main.c @@ -249,8 +249,8 @@ uint32_t LedPWM(uint32_t pwm_period, uint32_t pwm_sweep_steps, uint32_t count) { uint8_t processRX() { if (ProgPort == Usb) { - while (PIOS_COM_ReceiveBufferUsed(PIOS_COM_TELEM_USB) >= 63) { - if (PIOS_COM_ReceiveBuffer(PIOS_COM_TELEM_USB, mReceive_Buffer, 63, 0) == 63) { + while (PIOS_COM_ReceiveBufferUsed(PIOS_COM_TELEM_USB_HID) >= 63) { + if (PIOS_COM_ReceiveBuffer(PIOS_COM_TELEM_USB_HID, mReceive_Buffer, 63, 0) == 63) { processComand(mReceive_Buffer); } } diff --git a/flight/Bootloaders/OpenPilot/op_dfu.c b/flight/Bootloaders/OpenPilot/op_dfu.c index bc62fff6c..102dca079 100644 --- a/flight/Bootloaders/OpenPilot/op_dfu.c +++ b/flight/Bootloaders/OpenPilot/op_dfu.c @@ -121,7 +121,7 @@ void processComand(uint8_t *xReceive_Buffer) { #ifdef DEBUG_SSP char str[63]= {0}; sprintf(str,"Received COMMAND:%d|",Command); - PIOS_COM_SendString(PIOS_COM_TELEM_USB,str); + PIOS_COM_SendString(PIOS_COM_TELEM_USB_HID,str); #endif EchoReqFlag = (Command >> 7); EchoAnsFlag = (Command >> 6) & 0x01; @@ -389,11 +389,11 @@ void processComand(uint8_t *xReceive_Buffer) { case Download_Req: #ifdef DEBUG_SSP sprintf(str,"COMMAND:DOWNLOAD_REQ 1 Status=%d|",DeviceState); - PIOS_COM_SendString(PIOS_COM_TELEM_USB,str); + PIOS_COM_SendString(PIOS_COM_TELEM_USB_HID,str); #endif if (DeviceState == DFUidle) { #ifdef DEBUG_SSP - PIOS_COM_SendString(PIOS_COM_TELEM_USB,"COMMAND:DOWNLOAD_REQ 1|"); + PIOS_COM_SendString(PIOS_COM_TELEM_USB_HID,"COMMAND:DOWNLOAD_REQ 1|"); #endif downType = Data0; downPacketTotal = Count; @@ -551,7 +551,7 @@ uint32_t CalcFirmCRC() { void sendData(uint8_t * buf, uint16_t size) { if (ProgPort == Usb) { - PIOS_COM_SendBuffer(PIOS_COM_TELEM_USB, buf, size); + PIOS_COM_SendBuffer(PIOS_COM_TELEM_USB_HID, buf, size); if (DeviceState == downloading) PIOS_DELAY_WaitmS(10); diff --git a/flight/Bootloaders/OpenPilot/pios_board.c b/flight/Bootloaders/OpenPilot/pios_board.c index 5defbb626..0da0f1a4a 100644 --- a/flight/Bootloaders/OpenPilot/pios_board.c +++ b/flight/Bootloaders/OpenPilot/pios_board.c @@ -201,7 +201,7 @@ static uint8_t pios_com_telem_rf_tx_buffer[PIOS_COM_TELEM_RF_TX_BUF_LEN]; #if defined(PIOS_INCLUDE_USB_HID) #include "pios_usb_hid_priv.h" -static const struct pios_usb_hid_cfg pios_usb_hid_main_cfg = { +static const struct pios_usb_cfg pios_usb_main_cfg = { .irq = { .init = { .NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn, @@ -213,10 +213,21 @@ static const struct pios_usb_hid_cfg pios_usb_hid_main_cfg = { }; #endif /* PIOS_INCLUDE_USB_HID */ -extern const struct pios_com_driver pios_usb_com_driver; +#if defined(PIOS_INCLUDE_USB_COM) +#include + +const struct pios_usb_com_cfg pios_usb_com_hid_cfg = { + .type = PIOS_USB_COM_HID, + .data_if = 0, + .data_rx_ep = 1, + .data_tx_ep = 1, +}; + +#endif /* PIOS_INCLUDE_USB_COM */ uint32_t pios_com_telem_rf_id; -uint32_t pios_com_telem_usb_id; +uint32_t pios_com_telem_usb_hid_id; +uint32_t pios_com_telem_usb_cdc_id; #include "pios_opahrs.h" @@ -257,10 +268,14 @@ void PIOS_Board_Init(void) { PIOS_GPIO_Init(); #if defined(PIOS_INCLUDE_USB_HID) - uint32_t pios_usb_hid_id; - PIOS_USB_HID_Init(&pios_usb_hid_id, &pios_usb_hid_main_cfg); + uint32_t pios_usb_id; + PIOS_USB_Init(&pios_usb_id, &pios_usb_main_cfg); #if defined(PIOS_INCLUDE_COM) - if (PIOS_COM_Init(&pios_com_telem_usb_id, &pios_usb_com_driver, pios_usb_hid_id, + uint32_t pios_usb_com_id; + if (PIOS_USB_COM_Init(&pios_usb_com_id, &pios_usb_com_hid_cfg, pios_usb_id)) { + PIOS_Assert(0); + } + if (PIOS_COM_Init(&pios_com_telem_usb_hid_id, &pios_usb_hid_com_driver, pios_usb_com_id, pios_com_telem_usb_rx_buffer, sizeof(pios_com_telem_usb_rx_buffer), pios_com_telem_usb_tx_buffer, sizeof(pios_com_telem_usb_tx_buffer))) { PIOS_Assert(0); diff --git a/flight/Bootloaders/PipXtreme/Makefile b/flight/Bootloaders/PipXtreme/Makefile index 7aadcf1c9..aad33dd73 100644 --- a/flight/Bootloaders/PipXtreme/Makefile +++ b/flight/Bootloaders/PipXtreme/Makefile @@ -110,6 +110,7 @@ SRC += $(PIOSSTM32F10X)/pios_usb_hid_desc.c SRC += $(PIOSSTM32F10X)/pios_usb_hid_istr.c SRC += $(PIOSSTM32F10X)/pios_usb_hid_prop.c SRC += $(PIOSSTM32F10X)/pios_usb_hid_pwr.c +SRC += $(PIOSSTM32F10X)/pios_usb_com.c ## PIOS Hardware (Common) SRC += $(PIOSCOMMON)/pios_board_info.c diff --git a/flight/Bootloaders/PipXtreme/inc/pios_config.h b/flight/Bootloaders/PipXtreme/inc/pios_config.h index 799847992..28ab42143 100644 --- a/flight/Bootloaders/PipXtreme/inc/pios_config.h +++ b/flight/Bootloaders/PipXtreme/inc/pios_config.h @@ -38,6 +38,7 @@ #define PIOS_INCLUDE_LED #define PIOS_INCLUDE_SYS #define PIOS_INCLUDE_USB_HID +#define PIOS_INCLUDE_USB_COM #define PIOS_INCLUDE_COM #define PIOS_INCLUDE_GPIO //#define DEBUG_SSP diff --git a/flight/Bootloaders/PipXtreme/main.c b/flight/Bootloaders/PipXtreme/main.c index 3f1c4bd54..4161657c8 100644 --- a/flight/Bootloaders/PipXtreme/main.c +++ b/flight/Bootloaders/PipXtreme/main.c @@ -204,8 +204,8 @@ uint32_t LedPWM(uint32_t pwm_period, uint32_t pwm_sweep_steps, uint32_t count) { } uint8_t processRX() { - while (PIOS_COM_ReceiveBufferUsed(PIOS_COM_TELEM_USB) >= 63) { - if (PIOS_COM_ReceiveBuffer(PIOS_COM_TELEM_USB, mReceive_Buffer, 63, 0) == 63) { + while (PIOS_COM_ReceiveBufferUsed(PIOS_COM_TELEM_USB_HID) >= 63) { + if (PIOS_COM_ReceiveBuffer(PIOS_COM_TELEM_USB_HID, mReceive_Buffer, 63, 0) == 63) { processComand(mReceive_Buffer); } } diff --git a/flight/Bootloaders/PipXtreme/op_dfu.c b/flight/Bootloaders/PipXtreme/op_dfu.c index 770ce8237..c5c465ab3 100644 --- a/flight/Bootloaders/PipXtreme/op_dfu.c +++ b/flight/Bootloaders/PipXtreme/op_dfu.c @@ -141,7 +141,7 @@ void processComand(uint8_t *xReceive_Buffer) { #ifdef DEBUG_SSP char str[63]= {0}; sprintf(str,"Received COMMAND:%d|",Command); - PIOS_COM_SendString(PIOS_COM_TELEM_USB,str); + PIOS_COM_SendString(PIOS_COM_TELEM_USB_HID,str); #endif EchoReqFlag = (Command >> 7); EchoAnsFlag = (Command >> 6) & 0x01; @@ -322,7 +322,7 @@ void processComand(uint8_t *xReceive_Buffer) { Buffer[15] = devicesTable[Data0 - 1].devID; } sendData(Buffer + 1, 63); - //PIOS_COM_SendBuffer(PIOS_COM_TELEM_USB, Buffer + 1, 63);//FIX+1 + //PIOS_COM_SendBuffer(PIOS_COM_TELEM_USB_HID, Buffer + 1, 63);//FIX+1 break; case JumpFW: FLASH_Lock(); @@ -356,11 +356,11 @@ void processComand(uint8_t *xReceive_Buffer) { case Download_Req: #ifdef DEBUG_SSP sprintf(str,"COMMAND:DOWNLOAD_REQ 1 Status=%d|",DeviceState); - PIOS_COM_SendString(PIOS_COM_TELEM_USB,str); + PIOS_COM_SendString(PIOS_COM_TELEM_USB_HID,str); #endif if (DeviceState == DFUidle) { #ifdef DEBUG_SSP - PIOS_COM_SendString(PIOS_COM_TELEM_USB,"COMMAND:DOWNLOAD_REQ 1|"); + PIOS_COM_SendString(PIOS_COM_TELEM_USB_HID,"COMMAND:DOWNLOAD_REQ 1|"); #endif downType = Data0; downPacketTotal = Count; @@ -474,7 +474,7 @@ uint32_t CalcFirmCRC() { } void sendData(uint8_t * buf, uint16_t size) { - PIOS_COM_SendBuffer(PIOS_COM_TELEM_USB, buf, size); + PIOS_COM_SendBuffer(PIOS_COM_TELEM_USB_HID, buf, size); if (DeviceState == downloading) PIOS_DELAY_WaitmS(10); } diff --git a/flight/Bootloaders/PipXtreme/pios_board.c b/flight/Bootloaders/PipXtreme/pios_board.c index 83f0f407a..118143679 100644 --- a/flight/Bootloaders/PipXtreme/pios_board.c +++ b/flight/Bootloaders/PipXtreme/pios_board.c @@ -44,7 +44,7 @@ static uint8_t pios_com_telem_usb_tx_buffer[PIOS_COM_TELEM_USB_TX_BUF_LEN]; #if defined(PIOS_INCLUDE_USB_HID) #include "pios_usb_hid_priv.h" -static const struct pios_usb_hid_cfg pios_usb_hid_main_cfg = { +static const struct pios_usb_cfg pios_usb_main_cfg = { .irq = { .init = { .NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn, @@ -56,9 +56,19 @@ static const struct pios_usb_hid_cfg pios_usb_hid_main_cfg = { }; #endif /* PIOS_INCLUDE_USB_HID */ -extern const struct pios_com_driver pios_usb_com_driver; +#if defined(PIOS_INCLUDE_USB_COM) +#include -uint32_t pios_com_telem_usb_id; +const struct pios_usb_com_cfg pios_usb_com_hid_cfg = { + .type = PIOS_USB_COM_HID, + .data_if = 0, + .data_rx_ep = 1, + .data_tx_ep = 1, +}; + +#endif /* PIOS_INCLUDE_USB_COM */ + +uint32_t pios_com_telem_usb_hid_id; /** * PIOS_Board_Init() @@ -84,10 +94,16 @@ void PIOS_Board_Init(void) { PIOS_GPIO_Init(); #if defined(PIOS_INCLUDE_USB_HID) - uint32_t pios_usb_hid_id; - PIOS_USB_HID_Init(&pios_usb_hid_id, &pios_usb_hid_main_cfg); + uint32_t pios_usb_id; + if (PIOS_USB_Init(&pios_usb_id, &pios_usb_main_cfg)) { + PIOS_Assert(0); + } #if defined(PIOS_INCLUDE_COM) - if (PIOS_COM_Init(&pios_com_telem_usb_id, &pios_usb_com_driver, pios_usb_hid_id, + uint32_t pios_usb_com_id; + if (PIOS_USB_COM_Init(&pios_usb_com_id, &pios_usb_com_hid_cfg, pios_usb_id)) { + PIOS_Assert(0); + } + if (PIOS_COM_Init(&pios_com_telem_usb_hid_id, &pios_usb_hid_com_driver, pios_usb_com_id, pios_com_telem_usb_rx_buffer, sizeof(pios_com_telem_usb_rx_buffer), pios_com_telem_usb_tx_buffer, sizeof(pios_com_telem_usb_tx_buffer))) { PIOS_Assert(0); diff --git a/flight/CopterControl/Makefile b/flight/CopterControl/Makefile index a357af633..22778ba61 100644 --- a/flight/CopterControl/Makefile +++ b/flight/CopterControl/Makefile @@ -203,11 +203,12 @@ SRC += $(PIOSSTM32F10X)/pios_wdg.c SRC += $(PIOSSTM32F10X)/pios_tim.c -# PIOS USB related files (seperated to make code maintenance more easy) +# PIOS USB related files (separated to make code maintenance more easy) SRC += $(PIOSSTM32F10X)/pios_usb_hid.c SRC += $(PIOSSTM32F10X)/pios_usb_hid_istr.c SRC += $(PIOSSTM32F10X)/pios_usb_hid_prop.c SRC += $(PIOSSTM32F10X)/pios_usb_hid_pwr.c +SRC += $(PIOSSTM32F10X)/pios_usb_com.c ## PIOS Hardware (Common) SRC += $(PIOSCOMMON)/pios_crc.c diff --git a/flight/CopterControl/System/inc/pios_config.h b/flight/CopterControl/System/inc/pios_config.h index 8e29e0b73..4e5827149 100644 --- a/flight/CopterControl/System/inc/pios_config.h +++ b/flight/CopterControl/System/inc/pios_config.h @@ -62,6 +62,8 @@ #define PIOS_INCLUDE_SYS #define PIOS_INCLUDE_USART #define PIOS_INCLUDE_USB_HID +#define PIOS_INCLUDE_USB_COM +#define PIOS_INCLUDE_USB_COM_CDC #define PIOS_INCLUDE_COM #define PIOS_INCLUDE_SETTINGS #define PIOS_INCLUDE_FREERTOS diff --git a/flight/CopterControl/System/inc/pios_usb.h b/flight/CopterControl/System/inc/pios_usb.h index 6af496a71..3e20a7b03 100644 --- a/flight/CopterControl/System/inc/pios_usb.h +++ b/flight/CopterControl/System/inc/pios_usb.h @@ -55,7 +55,7 @@ #endif /* Internal defines which are used by PIOS USB HID (don't touch) */ -#define PIOS_USB_EP_NUM 2 +#define PIOS_USB_EP_NUM 5 /* Buffer table base address */ #define PIOS_USB_BTABLE_ADDRESS 0x000 diff --git a/flight/CopterControl/System/inc/pios_usb_hid_desc.h b/flight/CopterControl/System/inc/pios_usb_hid_desc.h index ae72ebfb8..d6bc3720f 100644 --- a/flight/CopterControl/System/inc/pios_usb_hid_desc.h +++ b/flight/CopterControl/System/inc/pios_usb_hid_desc.h @@ -33,7 +33,7 @@ #define PIOS_HID_OFF_HID_DESC 0x12 #define PIOS_HID_SIZ_DEVICE_DESC 18 -#define PIOS_HID_SIZ_CONFIG_DESC 41 +#define PIOS_HID_SIZ_CONFIG_DESC 107 #define PIOS_HID_SIZ_REPORT_DESC 36 #define PIOS_HID_SIZ_STRING_LANGID 4 #define PIOS_HID_SIZ_STRING_VENDOR 28 diff --git a/flight/CopterControl/System/pios_board.c b/flight/CopterControl/System/pios_board.c index d89342787..76cf473c1 100644 --- a/flight/CopterControl/System/pios_board.c +++ b/flight/CopterControl/System/pios_board.c @@ -1067,7 +1067,7 @@ uint32_t pios_rcvr_group_map[MANUALCONTROLSETTINGS_CHANNELGROUPS_NONE]; #if defined(PIOS_INCLUDE_USB_HID) #include "pios_usb_hid_priv.h" -static const struct pios_usb_hid_cfg pios_usb_hid_main_cfg = { +static const struct pios_usb_cfg pios_usb_main_cfg = { .irq = { .init = { .NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn, @@ -1079,10 +1079,30 @@ static const struct pios_usb_hid_cfg pios_usb_hid_main_cfg = { }; #endif /* PIOS_INCLUDE_USB_HID */ -extern const struct pios_com_driver pios_usb_com_driver; +#if defined(PIOS_INCLUDE_USB_COM) +#include + +const struct pios_usb_com_cfg pios_usb_com_hid_cfg = { + .type = PIOS_USB_COM_HID, + .data_if = 0, + .data_rx_ep = 1, + .data_tx_ep = 1, +}; + +const struct pios_usb_com_cfg pios_usb_com_cdc_cfg = { + .type = PIOS_USB_COM_CDC, + .ctrl_if = 1, + .ctrl_tx_ep = 2, + + .data_if = 2, + .data_rx_ep = 3, + .data_tx_ep = 3, +}; +#endif /* PIOS_INCLUDE_USB_COM */ uint32_t pios_com_telem_rf_id; -uint32_t pios_com_telem_usb_id; +uint32_t pios_com_telem_usb_hid_id; +uint32_t pios_com_telem_usb_cdc_id; uint32_t pios_com_gps_id; /** @@ -1414,18 +1434,35 @@ void PIOS_Board_Init(void) { PIOS_GPIO_Init(); #if defined(PIOS_INCLUDE_USB_HID) - uint32_t pios_usb_hid_id; - PIOS_USB_HID_Init(&pios_usb_hid_id, &pios_usb_hid_main_cfg); + uint32_t pios_usb_id; + PIOS_USB_Init(&pios_usb_id, &pios_usb_main_cfg); #if defined(PIOS_INCLUDE_COM) + uint32_t pios_usb_com_id; + if (PIOS_USB_COM_Init(&pios_usb_com_id, &pios_usb_com_hid_cfg, pios_usb_id)) { + PIOS_Assert(0); + } uint8_t * rx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_TELEM_USB_RX_BUF_LEN); uint8_t * tx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_TELEM_USB_TX_BUF_LEN); PIOS_Assert(rx_buffer); PIOS_Assert(tx_buffer); - if (PIOS_COM_Init(&pios_com_telem_usb_id, &pios_usb_com_driver, pios_usb_hid_id, + if (PIOS_COM_Init(&pios_com_telem_usb_hid_id, &pios_usb_hid_com_driver, pios_usb_com_id, rx_buffer, PIOS_COM_TELEM_USB_RX_BUF_LEN, tx_buffer, PIOS_COM_TELEM_USB_TX_BUF_LEN)) { PIOS_Assert(0); } + + if (PIOS_USB_COM_Init(&pios_usb_com_id, &pios_usb_com_cdc_cfg, pios_usb_id)) { + PIOS_Assert(0); + } + uint8_t * rx_buffer2 = (uint8_t *) pvPortMalloc(PIOS_COM_TELEM_USB_RX_BUF_LEN); + uint8_t * tx_buffer2 = (uint8_t *) pvPortMalloc(PIOS_COM_TELEM_USB_TX_BUF_LEN); + PIOS_Assert(rx_buffer2); + PIOS_Assert(tx_buffer2); + if (PIOS_COM_Init(&pios_com_telem_usb_cdc_id, &pios_usb_cdc_com_driver, pios_usb_com_id, + rx_buffer2, PIOS_COM_TELEM_USB_RX_BUF_LEN, + tx_buffer2, PIOS_COM_TELEM_USB_TX_BUF_LEN)) { + PIOS_Assert(0); + } #endif /* PIOS_INCLUDE_COM */ #endif /* PIOS_INCLUDE_USB_HID */ diff --git a/flight/CopterControl/System/pios_usb_hid_desc.c b/flight/CopterControl/System/pios_usb_hid_desc.c index 6296b0593..2ca8f8246 100644 --- a/flight/CopterControl/System/pios_usb_hid_desc.c +++ b/flight/CopterControl/System/pios_usb_hid_desc.c @@ -27,9 +27,9 @@ const uint8_t PIOS_HID_DeviceDescriptor[PIOS_HID_SIZ_DEVICE_DESC] = USB_DEVICE_DESCRIPTOR_TYPE, // bDescriptorType 0x00, // bcdUSB 0x02, - 0x00, // bDeviceClass - 0x00, // bDeviceSubClass - 0x00, // bDeviceProtocol + 0xEF, // bDeviceClass (Misc) + 0x02, // bDeviceSubClass (common) + 0x01, // bDeviceProtocol (IAD) 0x40, // bMaxPacketSize40 (uint8_t)((PIOS_USB_VENDOR_ID) & 0xff), // idVendor (uint8_t)((PIOS_USB_VENDOR_ID) >> 8), @@ -51,17 +51,27 @@ const uint8_t PIOS_HID_ConfigDescriptor[PIOS_HID_SIZ_CONFIG_DESC] = { 0x09, // bLength: Configuation Descriptor size USB_CONFIGURATION_DESCRIPTOR_TYPE, // bDescriptorType: Configuration - PIOS_HID_SIZ_CONFIG_DESC, - // wTotalLength: Bytes returned + PIOS_HID_SIZ_CONFIG_DESC, // wTotalLength: Bytes returned 0x00, - 0x01, // bNumInterfaces: 1 interface + 0x03, // bNumInterfaces: 3 interfaces 0x01, // bConfigurationValue: Configuration value 0x00, // iConfiguration: Index of string descriptor describing the configuration 0xC0, // bmAttributes: Bus powered 0x7D, // MaxPower 250 mA - needed to power the RF transmitter + // *************** Interface Association Descriptor ***************** + // 9 + 0x08, /* bLength */ + 0x0B, /* bDescriptorType (IAD) */ + 0x01, /* bFirstInterface */ + 0x02, /* bInterfaceCount */ + 0x02, /* bFunctionClass (Communication Class) */ + 0x02, /* bFunctionSubClass (Abstract Control Model) */ + 0x00, /* bFunctionProtocol (V.25ter, Common AT commands) */ + 0x00, /* iInterface */ + // ************** Descriptor of Custom HID interface **************** - // 09 + // 17 0x09, // bLength: Interface Descriptor size USB_INTERFACE_DESCRIPTOR_TYPE, // bDescriptorType: Interface descriptor type 0x00, // bInterfaceNumber: Number of Interface @@ -73,19 +83,19 @@ const uint8_t PIOS_HID_ConfigDescriptor[PIOS_HID_SIZ_CONFIG_DESC] = 0, // iInterface: Index of string descriptor // ******************** Descriptor of Custom HID HID ******************** - // 18 + // 26 0x09, // bLength: HID Descriptor size HID_DESCRIPTOR_TYPE, // bDescriptorType: HID 0x10, // bcdHID: HID Class Spec release number 0x01, 0x00, // bCountryCode: Hardware target country - 0x01, // bNumDescriptors: Number of HID class descriptors to follow + 0x02, // bNumDescriptors: Number of HID class descriptors to follow 0x22, // bDescriptorType PIOS_HID_SIZ_REPORT_DESC, // wItemLength: Total length of Report descriptor 0x00, // ******************** Descriptor of Custom HID endpoints ****************** - // 27 + // 35 0x07, // bLength: Endpoint Descriptor size USB_ENDPOINT_DESCRIPTOR_TYPE, // bDescriptorType: @@ -94,18 +104,102 @@ const uint8_t PIOS_HID_ConfigDescriptor[PIOS_HID_SIZ_CONFIG_DESC] = 0x40, // wMaxPacketSize: 2 Bytes max 0x00, 0x04, // bInterval: Polling Interval in ms - // 34 - + + // 42 0x07, // bLength: Endpoint Descriptor size - USB_ENDPOINT_DESCRIPTOR_TYPE, // bDescriptorType: - // Endpoint descriptor type - 0x01, // bEndpointAddress: - // Endpoint Address (OUT) + USB_ENDPOINT_DESCRIPTOR_TYPE, // bDescriptorType: (Endpoint descriptor type) + 0x01, // bEndpointAddress: Endpoint Address (OUT) 0x03, // bmAttributes: Interrupt endpoint 0x40, // wMaxPacketSize: 2 Bytes max 0x00, 0x04, // bInterval: Polling Interval in ms - // 41 + + // ************** Descriptor of CDC Control interface **************** + // 49 + 0x09, /* bLength */ + USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ + 0x01, /* bInterfaceNumber */ + 0x00, /* bAlternateSetting */ + 0x01, /* bNumEndpoints */ + 0x02, /* bInterfaceClass (Communication Class) */ + 0x02, /* bInterfaceSubClass (Abstract Control Model) */ + 0x01, /* bFunctionProtocol (V.25ter, Common AT commands) */ + 0x00, /* iInterface */ + + // ************** Header Functional Descriptor **************** + // 58 + 0x05, /* bLength */ + 0x24, /* bDescriptorType (Class Specific Interface) */ + 0x00, /* bDescriptorSubtype (CDC Header Functional) */ + 0x10, /* bcdCDC (CDC spec release number, 1.10 */ + 0x01, + + // ************** Call Management Functional Descriptor **************** + // 63 + 0x05, /* bLength */ + 0x24, /* bDescriptorType (Class Specific Interface) */ + 0x01, /* bDescriptorSubtype (CDC Call Management) */ + 0x00, /* bmCapabilities (No call handling) */ + 0x02, /* bDataInterface (Interface number of Data Class Interface) */ + + // ************** Abstract Control Management Functional Descriptor **************** + // 68 + 0x04, /* bLength */ + 0x24, /* bDescriptorType (Class Specific Interface) */ + 0x02, /* bDescriptorSubtype (CDC Abstract Control Management) */ + 0x00, /* bmCapabilities */ + + // ************** Union Functional Descriptor **************** + // 72 + 0x05, /* bLength */ + 0x24, /* bDescriptorType (Class Specific Interface) */ + 0x06, /* bDescriptorSubtype (CDC Union) */ + 0x01, /* bMasterInterface (Interface number of master interface in the union) */ + 0x02, /* bSlaveInterface (Interface number of slave interface in the union) */ + + // ************** Endpoint2 Functional Descriptor **************** + // 77 + 0x07, /* bLength */ + USB_ENDPOINT_DESCRIPTOR_TYPE, // bDescriptorType (Endpoint) + 0x82, /* bEndpointAddress*/ + 0x03, /* bmAttributes (Interrupt Endpoint) */ + 0x40, /* wMaxPacketSize (bytes) */ + 0x00, + 0x04, /* bInterval (ms) */ + + // ************** Descriptor of CDC Data interface **************** + // 84 + 0x09, /* bLength */ + USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ + 0x02, /* bInterfaceNumber */ + 0x00, /* bAlternateSetting */ + 0x02, /* bNumEndpoints */ + 0x0A, /* bInterfaceClass (Data Interface Class) */ + 0x00, /* bInterfaceSubClass */ + 0x00, /* bFunctionProtocol (No class specific protocol) */ + 0x00, /* iInterface */ + + // ************** Endpoint3 Functional Descriptor **************** + // 93 + 0x07, /* bLength */ + USB_ENDPOINT_DESCRIPTOR_TYPE, // bDescriptorType (Endpoint) + 0x83, /* bEndpointAddress*/ + 0x02, /* bmAttributes (Bulk) */ + 0x40, /* wMaxPacketSize (bytes) */ + 0x00, + 0x00, /* bInterval (ms) */ + + // ************** Endpoint3 Functional Descriptor **************** + // 100 + 0x07, /* bLength */ + USB_ENDPOINT_DESCRIPTOR_TYPE, // bDescriptorType (Endpoint) + 0x03, /* bEndpointAddress*/ + 0x02, /* bmAttributes (Bulk) */ + 0x40, /* wMaxPacketSize (bytes) */ + 0x00, + 0x00 /* bInterval (ms) */ + + // 107 }; // ************************************************* @@ -115,7 +209,7 @@ const uint8_t PIOS_HID_ConfigDescriptor[PIOS_HID_SIZ_CONFIG_DESC] = 0x06, 0x9c, 0xff, // USAGE_PAGE (Vendor Page: 0xFF00) 0x09, 0x01, // USAGE (Demo Kit) 0xa1, 0x01, // COLLECTION (Application) - // 6 + // 7 // Data 1 0x85, 0x01, // REPORT_ID (1) @@ -123,9 +217,9 @@ const uint8_t PIOS_HID_ConfigDescriptor[PIOS_HID_SIZ_CONFIG_DESC] = 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x25, 0xff, // LOGICAL_MAXIMUM (255) 0x75, 0x08, // REPORT_SIZE (8) - 0x95, PIOS_USB_HID_DATA_LENGTH+1, // REPORT_COUNT (1) + 0x95, PIOS_USB_COM_DATA_LENGTH+1, // REPORT_COUNT (1) 0x81, 0x83, // INPUT (Const,Var,Array) - // 20 + // 21 // Data 1 0x85, 0x02, // REPORT_ID (2) @@ -133,9 +227,9 @@ const uint8_t PIOS_HID_ConfigDescriptor[PIOS_HID_SIZ_CONFIG_DESC] = 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x25, 0xff, // LOGICAL_MAXIMUM (255) 0x75, 0x08, // REPORT_SIZE (8) - 0x95, PIOS_USB_HID_DATA_LENGTH+1, // REPORT_COUNT (1) + 0x95, PIOS_USB_COM_DATA_LENGTH+1, // REPORT_COUNT (1) 0x91, 0x82, // OUTPUT (Data,Var,Abs,Vol) - // 34 + // 35 0xc0 // END_COLLECTION }; diff --git a/flight/Modules/Telemetry/telemetry.c b/flight/Modules/Telemetry/telemetry.c index e0f8b2d5f..3e935d089 100644 --- a/flight/Modules/Telemetry/telemetry.c +++ b/flight/Modules/Telemetry/telemetry.c @@ -311,7 +311,7 @@ static void telemetryRxTask(void *parameters) #if defined(PIOS_INCLUDE_USB_HID) // Determine input port (USB takes priority over telemetry port) if (PIOS_USB_HID_CheckAvailable(0)) { - inputPort = PIOS_COM_TELEM_USB; + inputPort = PIOS_COM_TELEM_USB_HID; } else #endif /* PIOS_INCLUDE_USB_HID */ { @@ -348,7 +348,7 @@ static int32_t transmitData(uint8_t * data, int32_t length) // Determine input port (USB takes priority over telemetry port) #if defined(PIOS_INCLUDE_USB_HID) if (PIOS_USB_HID_CheckAvailable(0)) { - outputPort = PIOS_COM_TELEM_USB; + outputPort = PIOS_COM_TELEM_USB_HID; } else #endif /* PIOS_INCLUDE_USB_HID */ { diff --git a/flight/OpenPilot/Makefile b/flight/OpenPilot/Makefile index ddb298157..0fe336af9 100644 --- a/flight/OpenPilot/Makefile +++ b/flight/OpenPilot/Makefile @@ -186,6 +186,7 @@ SRC += $(PIOSSTM32F10X)/pios_usb_hid_desc.c SRC += $(PIOSSTM32F10X)/pios_usb_hid_istr.c SRC += $(PIOSSTM32F10X)/pios_usb_hid_prop.c SRC += $(PIOSSTM32F10X)/pios_usb_hid_pwr.c +SRC += $(PIOSSTM32F10X)/pios_usb_com.c ## PIOS Hardware (Common) SRC += $(PIOSCOMMON)/pios_crc.c diff --git a/flight/OpenPilot/System/inc/pios_config.h b/flight/OpenPilot/System/inc/pios_config.h index 81699215b..491bc4be9 100644 --- a/flight/OpenPilot/System/inc/pios_config.h +++ b/flight/OpenPilot/System/inc/pios_config.h @@ -56,6 +56,7 @@ #define PIOS_INCLUDE_SYS #define PIOS_INCLUDE_USART #define PIOS_INCLUDE_USB_HID +#define PIOS_INCLUDE_USB_COM #define PIOS_INCLUDE_BMP085 //#define PIOS_INCLUDE_HCSR04 #define PIOS_INCLUDE_OPAHRS diff --git a/flight/OpenPilot/System/pios_board.c b/flight/OpenPilot/System/pios_board.c index 03a75a30c..f5cbfac43 100644 --- a/flight/OpenPilot/System/pios_board.c +++ b/flight/OpenPilot/System/pios_board.c @@ -1044,7 +1044,7 @@ uint32_t pios_rcvr_group_map[MANUALCONTROLSETTINGS_CHANNELGROUPS_NONE]; #if defined(PIOS_INCLUDE_USB_HID) #include "pios_usb_hid_priv.h" -static const struct pios_usb_hid_cfg pios_usb_hid_main_cfg = { +static const struct pios_usb_cfg pios_usb_main_cfg = { .irq = { .init = { .NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn, @@ -1056,10 +1056,21 @@ static const struct pios_usb_hid_cfg pios_usb_hid_main_cfg = { }; #endif /* PIOS_INCLUDE_USB_HID */ -extern const struct pios_com_driver pios_usb_com_driver; +#if defined(PIOS_INCLUDE_USB_COM) +#include + +const struct pios_usb_com_cfg pios_usb_com_hid_cfg = { + .type = PIOS_USB_COM_HID, + .data_if = 0, + .data_rx_ep = 1, + .data_tx_ep = 1, +}; + +#endif /* PIOS_INCLUDE_USB_COM */ uint32_t pios_com_telem_rf_id; -uint32_t pios_com_telem_usb_id; +uint32_t pios_com_telem_usb_hid_id; +uint32_t pios_com_telem_usb_cdc_id; uint32_t pios_com_gps_id; uint32_t pios_com_aux_id; uint32_t pios_com_dsm_id; @@ -1277,14 +1288,18 @@ void PIOS_Board_Init(void) { } #if defined(PIOS_INCLUDE_USB_HID) - uint32_t pios_usb_hid_id; - PIOS_USB_HID_Init(&pios_usb_hid_id, &pios_usb_hid_main_cfg); + uint32_t pios_usb_id; + PIOS_USB_Init(&pios_usb_id, &pios_usb_main_cfg); #if defined(PIOS_INCLUDE_COM) + uint32_t pios_usb_com_id; + if (PIOS_USB_COM_Init(&pios_usb_com_id, &pios_usb_com_hid_cfg, pios_usb_id)) { + PIOS_Assert(0); + } uint8_t * rx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_TELEM_USB_RX_BUF_LEN); uint8_t * tx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_TELEM_USB_TX_BUF_LEN); PIOS_Assert(rx_buffer); PIOS_Assert(tx_buffer); - if (PIOS_COM_Init(&pios_com_telem_usb_id, &pios_usb_com_driver, pios_usb_hid_id, + if (PIOS_COM_Init(&pios_com_telem_usb_hid_id, &pios_usb_hid_com_driver, pios_usb_com_id, rx_buffer, PIOS_COM_TELEM_USB_RX_BUF_LEN, tx_buffer, PIOS_COM_TELEM_USB_TX_BUF_LEN)) { PIOS_Assert(0); diff --git a/flight/PiOS/Boards/STM32103CB_CC_Rev1.h b/flight/PiOS/Boards/STM32103CB_CC_Rev1.h index 1a8a17c89..f585fbee4 100644 --- a/flight/PiOS/Boards/STM32103CB_CC_Rev1.h +++ b/flight/PiOS/Boards/STM32103CB_CC_Rev1.h @@ -141,8 +141,11 @@ extern uint32_t pios_com_gps_id; #define PIOS_COM_GPS (pios_com_gps_id) #endif /* PIOS_INCLUDE_GPS */ -extern uint32_t pios_com_telem_usb_id; -#define PIOS_COM_TELEM_USB (pios_com_telem_usb_id) +extern uint32_t pios_com_telem_usb_hid_id; +#define PIOS_COM_TELEM_USB_HID (pios_com_telem_usb_hid_id) + +extern uint32_t pios_com_telem_usb_cdc_id; +#define PIOS_COM_TELEM_USB_CDC (pios_com_telem_usb_cdc_id) //------------------------- // ADC @@ -266,8 +269,9 @@ extern uint32_t pios_com_telem_usb_id; // USB //------------------------- #define PIOS_USB_ENABLED 1 -#define PIOS_USB_HID_MAX_DEVS 1 #define PIOS_USB_DETECT_GPIO_PORT GPIOC +#define PIOS_USB_MAX_DEVS 1 +#define PIOS_USB_COM_MAX_DEVS 1 #define PIOS_USB_DETECT_GPIO_PIN GPIO_Pin_15 #define PIOS_USB_DETECT_EXTI_LINE EXTI_Line15 #define PIOS_IRQ_USB_PRIORITY PIOS_IRQ_PRIO_MID diff --git a/flight/PiOS/Boards/STM32103CB_PIPXTREME_Rev1.h b/flight/PiOS/Boards/STM32103CB_PIPXTREME_Rev1.h index 7027a42bd..4fcf034da 100644 --- a/flight/PiOS/Boards/STM32103CB_PIPXTREME_Rev1.h +++ b/flight/PiOS/Boards/STM32103CB_PIPXTREME_Rev1.h @@ -156,8 +156,8 @@ extern uint32_t pios_com_serial_id; //#define PIOS_COM_DEBUG PIOS_COM_SERIAL // uncomment this to send debug info out the serial port #if defined(PIOS_INCLUDE_USB_HID) -extern uint32_t pios_com_telem_usb_id; -#define PIOS_COM_TELEM_USB (pios_com_telem_usb_id) +extern uint32_t pios_com_telem_usb_hid_id; +#define PIOS_COM_TELEM_USB_HID (pios_com_telem_usb_hid_id) #endif #if defined(PIOS_COM_DEBUG) @@ -393,12 +393,13 @@ extern uint32_t pios_com_telem_usb_id; #if defined(PIOS_INCLUDE_USB_HID) #define PIOS_USB_ENABLED 1 - #define PIOS_USB_HID_MAX_DEVS 1 + #define PIOS_USB_MAX_DEVS 1 #define PIOS_USB_DETECT_GPIO_PORT GPIO_IN_2_PORT #define PIOS_USB_DETECT_GPIO_PIN GPIO_IN_2_PIN #define PIOS_USB_DETECT_EXTI_LINE EXTI_Line4 #define PIOS_IRQ_USB_PRIORITY 8 #endif +#define PIOS_USB_COM_MAX_DEVS 1 // ***************************************************************** // RFM22 diff --git a/flight/PiOS/Boards/STM3210E_OP.h b/flight/PiOS/Boards/STM3210E_OP.h index c82bb8fe8..72732c0d0 100644 --- a/flight/PiOS/Boards/STM3210E_OP.h +++ b/flight/PiOS/Boards/STM3210E_OP.h @@ -152,8 +152,11 @@ extern uint32_t pios_com_telem_rf_id; extern uint32_t pios_com_gps_id; #define PIOS_COM_GPS (pios_com_gps_id) -extern uint32_t pios_com_telem_usb_id; -#define PIOS_COM_TELEM_USB (pios_com_telem_usb_id) +extern uint32_t pios_com_telem_usb_hid_id; +#define PIOS_COM_TELEM_USB_HID (pios_com_telem_usb_hid_id) + +extern uint32_t pios_com_telem_usb_cdc_id; +#define PIOS_COM_TELEM_USB_CDC (pios_com_telem_usb_cdc_id) #ifdef PIOS_ENABLE_AUX_UART extern uint32_t pios_com_aux_id; @@ -309,8 +312,9 @@ extern uint32_t pios_com_aux_id; // USB //------------------------- #define PIOS_USB_ENABLED 1 -#define PIOS_USB_HID_MAX_DEVS 1 #define PIOS_USB_DETECT_GPIO_PORT GPIOC +#define PIOS_USB_MAX_DEVS 1 +#define PIOS_USB_COM_MAX_DEVS 1 #define PIOS_USB_DETECT_GPIO_PIN GPIO_Pin_4 #define PIOS_USB_DETECT_EXTI_LINE EXTI_Line4 #define PIOS_IRQ_USB_PRIORITY PIOS_IRQ_PRIO_MID diff --git a/flight/PiOS/STM32F10x/pios_usb_com.c b/flight/PiOS/STM32F10x/pios_usb_com.c new file mode 100644 index 000000000..8bdcbed6a --- /dev/null +++ b/flight/PiOS/STM32F10x/pios_usb_com.c @@ -0,0 +1,584 @@ +/** + ****************************************************************************** + * @addtogroup PIOS PIOS Core hardware abstraction layer + * @{ + * @addtogroup PIOS_USB_COM USB COM Functions + * @brief PIOS USB COM implementation + * @notes This implements both a simple HID device and a CDC Serial Port + * @{ + * + * @file pios_usb_com.c + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. + * @brief USB COM functions (STM32 dependent code) + * @see The GNU Public License (GPL) Version 3 + * + *****************************************************************************/ +/* + * 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 + */ + +/* Project Includes */ +#include "pios.h" + +#if defined(PIOS_INCLUDE_USB_COM) + +#include "pios_usb.h" +#include "usb_lib.h" +#include "pios_usb_com_priv.h" + +static void PIOS_USB_COM_RegisterTxCallback(uint32_t usbcom_id, pios_com_callback tx_out_cb, uint32_t context); +static void PIOS_USB_COM_RegisterRxCallback(uint32_t usbcom_id, pios_com_callback rx_in_cb, uint32_t context); + +static void PIOS_USB_COM_HID_TxStart(uint32_t usbcom_id, uint16_t tx_bytes_avail); +static void PIOS_USB_COM_HID_RxStart(uint32_t usbcom_id, uint16_t rx_bytes_avail); + +const struct pios_com_driver pios_usb_hid_com_driver = { + .tx_start = PIOS_USB_COM_HID_TxStart, + .rx_start = PIOS_USB_COM_HID_RxStart, + .bind_tx_cb = PIOS_USB_COM_RegisterTxCallback, + .bind_rx_cb = PIOS_USB_COM_RegisterRxCallback, +}; + +#if defined(PIOS_INCLUDE_USB_COM_CDC) + +static void PIOS_USB_COM_CDC_TxStart(uint32_t usbcom_id, uint16_t tx_bytes_avail); +static void PIOS_USB_COM_CDC_RxStart(uint32_t usbcom_id, uint16_t rx_bytes_avail); + +const struct pios_com_driver pios_usb_cdc_com_driver = { + .tx_start = PIOS_USB_COM_CDC_TxStart, + .rx_start = PIOS_USB_COM_CDC_RxStart, + .bind_tx_cb = PIOS_USB_COM_RegisterTxCallback, + .bind_rx_cb = PIOS_USB_COM_RegisterRxCallback, +}; +#endif /* PIOS_INCLUDE_USB_COM_CDC */ + +enum pios_usb_com_dev_magic { + PIOS_USB_COM_DEV_MAGIC = 0xAABBCCDD, +}; + +struct pios_usb_com_dev { + enum pios_usb_com_dev_magic magic; + const struct pios_usb_com_cfg * cfg; + + uint32_t lower_id; + + pios_com_callback rx_in_cb; + uint32_t rx_in_context; + pios_com_callback tx_out_cb; + uint32_t tx_out_context; + + uint8_t rx_packet_buffer[PIOS_USB_COM_DATA_LENGTH + 2]; + uint8_t tx_packet_buffer[PIOS_USB_COM_DATA_LENGTH + 2]; +}; + +static bool PIOS_USB_COM_validate(struct pios_usb_com_dev * usb_com_dev) +{ + return (usb_com_dev->magic == PIOS_USB_COM_DEV_MAGIC); +} + +#if defined(PIOS_INCLUDE_FREERTOS) +static struct pios_usb_com_dev * PIOS_USB_COM_alloc(void) +{ + struct pios_usb_com_dev * usb_com_dev; + + usb_com_dev = (struct pios_usb_com_dev *)pvPortMalloc(sizeof(*usb_com_dev)); + if (!usb_com_dev) return(NULL); + + usb_com_dev->magic = PIOS_USB_COM_DEV_MAGIC; + return(usb_com_dev); +} +#else +static struct pios_usb_com_dev pios_usb_com_devs[PIOS_USB_COM_MAX_DEVS]; +static uint8_t pios_usb_com_num_devs; +static struct pios_usb_com_dev * PIOS_USB_COM_alloc(void) +{ + struct pios_usb_com_dev * usb_com_dev; + + if (pios_usb_com_num_devs >= PIOS_USB_COM_MAX_DEVS) { + return (NULL); + } + + usb_com_dev = &pios_usb_com_devs[pios_usb_com_num_devs++]; + usb_com_dev->magic = PIOS_USB_COM_DEV_MAGIC; + + return (usb_com_dev); +} +#endif + +static void PIOS_USB_COM_HID_EP_IN_Callback(void); +static void PIOS_USB_COM_HID_EP_OUT_Callback(void); + +static uint32_t pios_usb_com_hid_id; + +#if defined(PIOS_INCLUDE_USB_COM_CDC) + +static void PIOS_USB_COM_CDC_DATA_EP_IN_Callback(void); +static void PIOS_USB_COM_CDC_DATA_EP_OUT_Callback(void); +static void PIOS_USB_COM_CDC_CTRL_EP_IN_Callback(void); + +static uint32_t pios_usb_com_cdc_id; + +#endif /* PIOS_INCLUDE_USB_COM_CDC */ + +int32_t PIOS_USB_COM_Init(uint32_t * usbcom_id, const struct pios_usb_com_cfg * cfg, uint32_t lower_id) +{ + PIOS_Assert(usbcom_id); + PIOS_Assert(cfg); + + struct pios_usb_com_dev * usb_com_dev; + + usb_com_dev = (struct pios_usb_com_dev *) PIOS_USB_COM_alloc(); + if (!usb_com_dev) goto out_fail; + + /* Bind the configuration to the device instance */ + usb_com_dev->cfg = cfg; + usb_com_dev->lower_id = lower_id; + + switch (cfg->type) { +#if defined(PIOS_INCLUDE_USB_COM_CDC) + case PIOS_USB_COM_CDC: + pios_usb_com_cdc_id = (uint32_t) usb_com_dev; + pEpInt_OUT[cfg->ctrl_tx_ep - 1] = PIOS_USB_COM_CDC_CTRL_EP_IN_Callback; + pEpInt_IN[cfg->data_tx_ep - 1] = PIOS_USB_COM_CDC_DATA_EP_IN_Callback; + pEpInt_OUT[cfg->data_rx_ep - 1] = PIOS_USB_COM_CDC_DATA_EP_OUT_Callback; + break; +#endif /* PIOS_INCLUDE_USB_COM_CDC */ + case PIOS_USB_COM_HID: + pios_usb_com_hid_id = (uint32_t) usb_com_dev; + pEpInt_IN[cfg->data_tx_ep - 1] = PIOS_USB_COM_HID_EP_IN_Callback; + pEpInt_OUT[cfg->data_rx_ep - 1] = PIOS_USB_COM_HID_EP_OUT_Callback; + break; + default: + PIOS_Assert(0); + } + + *usbcom_id = (uint32_t) usb_com_dev; + + return 0; + +out_fail: + return -1; +} + + +static void PIOS_USB_COM_RegisterRxCallback(uint32_t usbcom_id, pios_com_callback rx_in_cb, uint32_t context) +{ + struct pios_usb_com_dev * usb_com_dev = (struct pios_usb_com_dev *)usbcom_id; + + bool valid = PIOS_USB_COM_validate(usb_com_dev); + PIOS_Assert(valid); + + /* + * Order is important in these assignments since ISR uses _cb + * field to determine if it's ok to dereference _cb and _context + */ + usb_com_dev->rx_in_context = context; + usb_com_dev->rx_in_cb = rx_in_cb; +} + +static void PIOS_USB_COM_RegisterTxCallback(uint32_t usbcom_id, pios_com_callback tx_out_cb, uint32_t context) +{ + struct pios_usb_com_dev * usb_com_dev = (struct pios_usb_com_dev *)usbcom_id; + + bool valid = PIOS_USB_COM_validate(usb_com_dev); + PIOS_Assert(valid); + + /* + * Order is important in these assignments since ISR uses _cb + * field to determine if it's ok to dereference _cb and _context + */ + usb_com_dev->tx_out_context = context; + usb_com_dev->tx_out_cb = tx_out_cb; +} + +static void PIOS_USB_COM_HID_SendReport(struct pios_usb_com_dev * usb_com_dev) +{ + uint16_t bytes_to_tx; + + if (!usb_com_dev->tx_out_cb) { + return; + } + + bool need_yield = false; +#ifdef USB_HID + bytes_to_tx = (usb_com_dev->tx_out_cb)(usb_com_dev->tx_out_context, + &usb_com_dev->tx_packet_buffer[1], + sizeof(usb_com_dev->tx_packet_buffer)-1, + NULL, + &need_yield); +#else + bytes_to_tx = (usb_com_dev->tx_out_cb)(usb_com_dev->tx_out_context, + &usb_com_dev->tx_packet_buffer[2], + sizeof(usb_com_dev->tx_packet_buffer)-2, + NULL, + &need_yield); +#endif + if (bytes_to_tx == 0) { + return; + } + + /* Always set type as report ID */ + usb_com_dev->tx_packet_buffer[0] = 1; + +#ifdef USB_HID + UserToPMABufferCopy(usb_com_dev->tx_packet_buffer, + GetEPTxAddr(usb_com_dev->cfg->data_tx_ep), + bytes_to_tx + 1); +#else + usb_com_dev->tx_packet_buffer[1] = bytes_to_tx; + UserToPMABufferCopy(usb_com_dev->tx_packet_buffer, + GetEPTxAddr(usb_com_dev->cfg->data_tx_ep), + bytes_to_tx + 2); +#endif + /* Is this correct? Why do we always send the whole buffer? */ + SetEPTxCount(usb_com_dev->cfg->data_tx_ep, sizeof(usb_com_dev->tx_packet_buffer)); + SetEPTxValid(usb_com_dev->cfg->data_tx_ep); + +#if defined(PIOS_INCLUDE_FREERTOS) + if (need_yield) { + vPortYieldFromISR(); + } +#endif /* PIOS_INCLUDE_FREERTOS */ +} + +static void PIOS_USB_COM_HID_RxStart(uint32_t usbcom_id, uint16_t rx_bytes_avail) { + struct pios_usb_com_dev * usb_com_dev = (struct pios_usb_com_dev *)usbcom_id; + + bool valid = PIOS_USB_COM_validate(usb_com_dev); + PIOS_Assert(valid); + + if (!PIOS_USB_HID_CheckAvailable(usb_com_dev->lower_id)) { + return; + } + + // If endpoint was stalled and there is now space make it valid + PIOS_IRQ_Disable(); + if ((GetEPRxStatus(usb_com_dev->cfg->data_rx_ep) != EP_RX_VALID) && + (rx_bytes_avail > PIOS_USB_COM_DATA_LENGTH)) { + SetEPRxStatus(usb_com_dev->cfg->data_rx_ep, EP_RX_VALID); + } + PIOS_IRQ_Enable(); +} + +static void PIOS_USB_COM_HID_TxStart(uint32_t usbcom_id, uint16_t tx_bytes_avail) +{ + struct pios_usb_com_dev * usb_com_dev = (struct pios_usb_com_dev *)usbcom_id; + + bool valid = PIOS_USB_COM_validate(usb_com_dev); + PIOS_Assert(valid); + + if (!PIOS_USB_HID_CheckAvailable(usb_com_dev->lower_id)) { + return; + } + + if (GetEPTxStatus(usb_com_dev->cfg->data_tx_ep) == EP_TX_VALID) { + /* Endpoint is already transmitting */ + return; + } + + PIOS_USB_COM_HID_SendReport(usb_com_dev); +} + +/** + * @brief Callback used to indicate a transmission from device INto host completed + * Checks if any data remains, pads it into HID packet and sends. + */ +static void PIOS_USB_COM_HID_EP_IN_Callback(void) +{ + struct pios_usb_com_dev * usb_com_dev = (struct pios_usb_com_dev *)pios_usb_com_hid_id; + + bool valid = PIOS_USB_COM_validate(usb_com_dev); + PIOS_Assert(valid); + + if (!PIOS_USB_HID_CheckAvailable(usb_com_dev->lower_id)) { + return; + } + + PIOS_USB_COM_HID_SendReport(usb_com_dev); +} + +/** + * EP1 OUT Callback Routine + */ +static void PIOS_USB_COM_HID_EP_OUT_Callback(void) +{ + struct pios_usb_com_dev * usb_com_dev = (struct pios_usb_com_dev *)pios_usb_com_hid_id; + + bool valid = PIOS_USB_COM_validate(usb_com_dev); + PIOS_Assert(valid); + + uint32_t DataLength = 0; + + /* Read received data (63 bytes) */ + /* Get the number of received data on the selected Endpoint */ + DataLength = GetEPRxCount(usb_com_dev->cfg->data_rx_ep); + if (DataLength > sizeof(usb_com_dev->rx_packet_buffer)) { + DataLength = sizeof(usb_com_dev->rx_packet_buffer); + } + + /* Use the memory interface function to read from the selected endpoint */ + PMAToUserBufferCopy((uint8_t *) usb_com_dev->rx_packet_buffer, + GetEPRxAddr(usb_com_dev->cfg->data_rx_ep), + DataLength); + + if (!usb_com_dev->rx_in_cb) { + /* No Rx call back registered, disable the receiver */ + SetEPRxStatus(usb_com_dev->cfg->data_rx_ep, EP_RX_NAK); + return; + } + + /* The first byte is report ID (not checked), the second byte is the valid data length */ + uint16_t headroom; + bool need_yield = false; +#ifdef USB_HID + (usb_com_dev->rx_in_cb)(usb_com_dev->rx_in_context, + &usb_com_dev->rx_packet_buffer[1], + sizeof(usb_com_dev->rx_packet_buffer)-1, + &headroom, + &need_yield); +#else + (usb_com_dev->rx_in_cb)(usb_com_dev->rx_in_context, + &usb_com_dev->rx_packet_buffer[2], + usb_com_dev->rx_packet_buffer[1], + &headroom, + &need_yield); +#endif + if (headroom > PIOS_USB_COM_DATA_LENGTH) { + /* We have room for a maximum length message */ + SetEPRxStatus(usb_com_dev->cfg->data_rx_ep, EP_RX_VALID); + } else { + /* Not enough room left for a message, apply backpressure */ + SetEPRxStatus(usb_com_dev->cfg->data_rx_ep, EP_RX_NAK); + } + +#if defined(PIOS_INCLUDE_FREERTOS) + if (need_yield) { + vPortYieldFromISR(); + } +#endif /* PIOS_INCLUDE_FREERTOS */ +} + +#if defined(PIOS_INCLUDE_USB_COM_CDC) + +static void PIOS_USB_COM_CDC_RxStart(uint32_t usbcom_id, uint16_t rx_bytes_avail) { + struct pios_usb_com_dev * usb_com_dev = (struct pios_usb_com_dev *)usbcom_id; + + bool valid = PIOS_USB_COM_validate(usb_com_dev); + PIOS_Assert(valid); + + if (!PIOS_USB_HID_CheckAvailable(usb_com_dev->lower_id)) { + return; + } + + // If endpoint was stalled and there is now space make it valid + PIOS_IRQ_Disable(); + if ((GetEPRxStatus(usb_com_dev->cfg->data_rx_ep) != EP_RX_VALID) && + (rx_bytes_avail > sizeof(usb_com_dev->rx_packet_buffer))) { + SetEPRxStatus(usb_com_dev->cfg->data_rx_ep, EP_RX_VALID); + } + PIOS_IRQ_Enable(); +} + +static void PIOS_USB_COM_CDC_SendData(struct pios_usb_com_dev * usb_com_dev) +{ + uint16_t bytes_to_tx; + + if (!usb_com_dev->tx_out_cb) { + return; + } + + bool need_yield = false; + bytes_to_tx = (usb_com_dev->tx_out_cb)(usb_com_dev->tx_out_context, + usb_com_dev->tx_packet_buffer, + sizeof(usb_com_dev->tx_packet_buffer), + NULL, + &need_yield); + if (bytes_to_tx == 0) { + return; + } + + UserToPMABufferCopy(usb_com_dev->tx_packet_buffer, + GetEPTxAddr(usb_com_dev->cfg->data_tx_ep), + bytes_to_tx); + SetEPTxCount(usb_com_dev->cfg->data_tx_ep, bytes_to_tx); + SetEPTxValid(usb_com_dev->cfg->data_tx_ep); + +#if defined(PIOS_INCLUDE_FREERTOS) + if (need_yield) { + vPortYieldFromISR(); + } +#endif /* PIOS_INCLUDE_FREERTOS */ +} + +static void PIOS_USB_COM_CDC_TxStart(uint32_t usbcom_id, uint16_t tx_bytes_avail) +{ + struct pios_usb_com_dev * usb_com_dev = (struct pios_usb_com_dev *)usbcom_id; + + bool valid = PIOS_USB_COM_validate(usb_com_dev); + PIOS_Assert(valid); + + if (!PIOS_USB_HID_CheckAvailable(usb_com_dev->lower_id)) { + return; + } + + if (GetEPTxStatus(usb_com_dev->cfg->data_tx_ep) == EP_TX_VALID) { + /* Endpoint is already transmitting */ + return; + } + + PIOS_USB_COM_CDC_SendData(usb_com_dev); +} + +static void PIOS_USB_COM_CDC_DATA_EP_IN_Callback(void) +{ + struct pios_usb_com_dev * usb_com_dev = (struct pios_usb_com_dev *)pios_usb_com_cdc_id; + + bool valid = PIOS_USB_COM_validate(usb_com_dev); + PIOS_Assert(valid); + + PIOS_USB_COM_CDC_SendData(usb_com_dev); +} + +static void PIOS_USB_COM_CDC_DATA_EP_OUT_Callback(void) +{ + struct pios_usb_com_dev * usb_com_dev = (struct pios_usb_com_dev *)pios_usb_com_cdc_id; + + bool valid = PIOS_USB_COM_validate(usb_com_dev); + PIOS_Assert(valid); + + uint32_t DataLength = 0; + + /* Get the number of received data on the selected Endpoint */ + DataLength = GetEPRxCount(usb_com_dev->cfg->data_rx_ep); + if (DataLength > sizeof(usb_com_dev->rx_packet_buffer)) { + DataLength = sizeof(usb_com_dev->rx_packet_buffer); + } + + /* Use the memory interface function to read from the selected endpoint */ + PMAToUserBufferCopy((uint8_t *) usb_com_dev->rx_packet_buffer, + GetEPRxAddr(usb_com_dev->cfg->data_rx_ep), + DataLength); + + if (!usb_com_dev->rx_in_cb) { + /* No Rx call back registered, disable the receiver */ + SetEPRxStatus(usb_com_dev->cfg->data_rx_ep, EP_RX_NAK); + return; + } + + uint16_t headroom; + bool need_yield = false; + (usb_com_dev->rx_in_cb)(usb_com_dev->rx_in_context, + usb_com_dev->rx_packet_buffer, + sizeof(usb_com_dev->rx_packet_buffer), + &headroom, + &need_yield); + + if (headroom > sizeof(usb_com_dev->rx_packet_buffer)) { + /* We have room for a maximum length message */ + SetEPRxStatus(usb_com_dev->cfg->data_rx_ep, EP_RX_VALID); + } else { + /* Not enough room left for a message, apply backpressure */ + SetEPRxStatus(usb_com_dev->cfg->data_rx_ep, EP_RX_STALL); + } + +#if defined(PIOS_INCLUDE_FREERTOS) + if (need_yield) { + vPortYieldFromISR(); + } +#endif /* PIOS_INCLUDE_FREERTOS */ +} + +RESULT PIOS_CDC_SetControlLineState(void) +{ + struct pios_usb_com_dev * usb_com_dev = (struct pios_usb_com_dev *)pios_usb_com_cdc_id; + + bool valid = PIOS_USB_COM_validate(usb_com_dev); + PIOS_Assert(valid); + + static uint16_t control_line_state; + + uint8_t wValue0 = pInformation->USBwValue0; + uint8_t wValue1 = pInformation->USBwValue1; + + control_line_state = wValue1 << 8 | wValue0; + + return USB_SUCCESS; +} + +RESULT PIOS_CDC_SetLineCoding(void) +{ + struct pios_usb_com_dev * usb_com_dev = (struct pios_usb_com_dev *)pios_usb_com_cdc_id; + + bool valid = PIOS_USB_COM_validate(usb_com_dev); + PIOS_Assert(valid); + + return USB_SUCCESS; +} + +uint8_t *PIOS_CDC_GetLineCoding(uint16_t Length) +{ + struct pios_usb_com_dev * usb_com_dev = (struct pios_usb_com_dev *)pios_usb_com_cdc_id; + + bool valid = PIOS_USB_COM_validate(usb_com_dev); + PIOS_Assert(valid); + + return NULL; +} + +static uint8_t serial_state[] = { + 0xA1, /* bmRequestType */ + 0x20, /* bNotification (Serial State) */ + 0x00, /* wValue */ + 0x00, + 0x01, /* wIndex (Interface #, LSB first) */ + 0x00, + 0x02, /* wLength (Data length) */ + 0x00, + + 0x00, /* USART State Bitmap (LSB first) */ + 0x00, +}; + +static void PIOS_USB_COM_CDC_CTRL_EP_IN_Callback(void) +{ + struct pios_usb_com_dev * usb_com_dev = (struct pios_usb_com_dev *)pios_usb_com_cdc_id; + + bool valid = PIOS_USB_COM_validate(usb_com_dev); + PIOS_Assert(valid); + + /* Give back UART State Bitmap */ + /* UART State Bitmap + * 15-7: reserved + * 6: bOverRun overrun error + * 5: bParity parity error + * 4: bFraming framing error + * 3: bRingSignal RI + * 2: bBreak break reception + * 1: bTxCarrier DSR + * 0: bRxCarrier DCD + */ + serial_state[8] = 0x03; + serial_state[9] = 0x00; + + UserToPMABufferCopy(serial_state, + GetEPTxAddr(usb_com_dev->cfg->data_tx_ep), + sizeof(serial_state)); + SetEPTxCount(usb_com_dev->cfg->data_tx_ep, PIOS_USB_COM_DATA_LENGTH + 2); + SetEPTxValid(usb_com_dev->cfg->data_tx_ep); +} + +#endif /* PIOS_INCLUDE_USB_COM_CDC */ + +#endif /* PIOS_INCLUDE_USB_COM */ diff --git a/flight/PiOS/STM32F10x/pios_usb_hid.c b/flight/PiOS/STM32F10x/pios_usb_hid.c index 8644dd517..99d709a99 100644 --- a/flight/PiOS/STM32F10x/pios_usb_hid.c +++ b/flight/PiOS/STM32F10x/pios_usb_hid.c @@ -41,90 +41,73 @@ #if defined(PIOS_INCLUDE_USB_HID) -static void PIOS_USB_HID_TxStart(uint32_t usbcom_id, uint16_t tx_bytes_avail); -static void PIOS_USB_HID_RxStart(uint32_t usbcom_id, uint16_t rx_bytes_avail); -static void PIOS_USB_HID_RegisterTxCallback(uint32_t usbcom_id, pios_com_callback tx_out_cb, uint32_t context); -static void PIOS_USB_HID_RegisterRxCallback(uint32_t usbcom_id, pios_com_callback rx_in_cb, uint32_t context); +/* Rx/Tx status */ +static uint8_t transfer_possible = 0; -const struct pios_com_driver pios_usb_com_driver = { - .tx_start = PIOS_USB_HID_TxStart, - .rx_start = PIOS_USB_HID_RxStart, - .bind_tx_cb = PIOS_USB_HID_RegisterTxCallback, - .bind_rx_cb = PIOS_USB_HID_RegisterRxCallback, +enum pios_usb_dev_magic { + PIOS_USB_DEV_MAGIC = 0x17365904, }; -enum pios_usb_hid_dev_magic { - PIOS_USB_HID_DEV_MAGIC = 0xAABBCCDD, +struct pios_usb_dev { + enum pios_usb_dev_magic magic; + const struct pios_usb_cfg * cfg; }; -struct pios_usb_hid_dev { - enum pios_usb_hid_dev_magic magic; - const struct pios_usb_hid_cfg * cfg; - - pios_com_callback rx_in_cb; - uint32_t rx_in_context; - pios_com_callback tx_out_cb; - uint32_t tx_out_context; - - uint8_t rx_packet_buffer[PIOS_USB_HID_DATA_LENGTH + 2]; - uint8_t tx_packet_buffer[PIOS_USB_HID_DATA_LENGTH + 2]; -}; - -static bool PIOS_USB_HID_validate(struct pios_usb_hid_dev * usb_hid_dev) +#if 0 +static bool PIOS_USB_validate(struct pios_usb_dev * usb_dev) { - return (usb_hid_dev->magic == PIOS_USB_HID_DEV_MAGIC); -} - -#if defined(PIOS_INCLUDE_FREERTOS) -static struct pios_usb_hid_dev * PIOS_USB_HID_alloc(void) -{ - struct pios_usb_hid_dev * usb_hid_dev; - - usb_hid_dev = (struct pios_usb_hid_dev *)pvPortMalloc(sizeof(*usb_hid_dev)); - if (!usb_hid_dev) return(NULL); - - usb_hid_dev->magic = PIOS_USB_HID_DEV_MAGIC; - return(usb_hid_dev); -} -#else -static struct pios_usb_hid_dev pios_usb_hid_devs[PIOS_USB_HID_MAX_DEVS]; -static uint8_t pios_usb_hid_num_devs; -static struct pios_usb_hid_dev * PIOS_USB_HID_alloc(void) -{ - struct pios_usb_hid_dev * usb_hid_dev; - - if (pios_usb_hid_num_devs >= PIOS_USB_HID_MAX_DEVS) { - return (NULL); - } - - usb_hid_dev = &pios_usb_hid_devs[pios_usb_hid_num_devs++]; - usb_hid_dev->magic = PIOS_USB_HID_DEV_MAGIC; - - return (usb_hid_dev); + return (usb_dev->magic == PIOS_USB_DEV_MAGIC); +} +#endif + +#if defined(PIOS_INCLUDE_FREERTOS) +static struct pios_usb_dev * PIOS_USB_alloc(void) +{ + struct pios_usb_dev * usb_dev; + + usb_dev = (struct pios_usb_dev *)pvPortMalloc(sizeof(*usb_dev)); + if (!usb_dev) return(NULL); + + usb_dev->magic = PIOS_USB_DEV_MAGIC; + return(usb_dev); +} +#else +static struct pios_usb_dev pios_usb_devs[PIOS_USB_MAX_DEVS]; +static uint8_t pios_usb_num_devs; +static struct pios_usb_dev * PIOS_USB_alloc(void) +{ + struct pios_usb_dev * usb_dev; + + if (pios_usb_num_devs >= PIOS_USB_MAX_DEVS) { + return (NULL); + } + + usb_dev = &pios_usb_devs[pios_usb_num_devs++]; + usb_dev->magic = PIOS_USB_DEV_MAGIC; + + return (usb_dev); } #endif -/* Rx/Tx status */ -static uint8_t transfer_possible = 0; /** * Initialises USB COM layer * \return < 0 if initialisation failed * \note Applications shouldn't call this function directly, instead please use \ref PIOS_COM layer functions */ -static uint32_t pios_usb_hid_id; -int32_t PIOS_USB_HID_Init(uint32_t * usb_hid_id, const struct pios_usb_hid_cfg * cfg) +static uint32_t pios_usb_com_id; +int32_t PIOS_USB_Init(uint32_t * usb_id, const struct pios_usb_cfg * cfg) { - PIOS_Assert(usb_hid_id); + PIOS_Assert(usb_id); PIOS_Assert(cfg); - struct pios_usb_hid_dev * usb_hid_dev; + struct pios_usb_dev * usb_dev; - usb_hid_dev = (struct pios_usb_hid_dev *) PIOS_USB_HID_alloc(); - if (!usb_hid_dev) goto out_fail; + usb_dev = (struct pios_usb_dev *) PIOS_USB_alloc(); + if (!usb_dev) goto out_fail; /* Bind the configuration to the device instance */ - usb_hid_dev->cfg = cfg; + usb_dev->cfg = cfg; PIOS_USB_HID_Reenumerate(); @@ -132,10 +115,10 @@ int32_t PIOS_USB_HID_Init(uint32_t * usb_hid_id, const struct pios_usb_hid_cfg * * This is a horrible hack to make this available to * the interrupt callbacks. This should go away ASAP. */ - pios_usb_hid_id = (uint32_t) usb_hid_dev; + pios_usb_com_id = (uint32_t) usb_dev; /* Enable the USB Interrupts */ - NVIC_Init(&usb_hid_dev->cfg->irq.init); + NVIC_Init(&usb_dev->cfg->irq.init); /* Select USBCLK source */ RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_1Div5); @@ -152,7 +135,7 @@ int32_t PIOS_USB_HID_Init(uint32_t * usb_hid_id, const struct pios_usb_hid_cfg * USB_Init(); USB_SIL_Init(); - *usb_hid_id = (uint32_t) usb_hid_dev; + *usb_id = (uint32_t) usb_dev; return 0; /* No error */ @@ -231,202 +214,11 @@ int32_t PIOS_USB_HID_Reenumerate() * \return 0: interface not available * \note Applications shouldn't call this function directly, instead please use \ref PIOS_COM layer functions */ -int32_t PIOS_USB_HID_CheckAvailable(uint8_t id) +bool PIOS_USB_HID_CheckAvailable(uint8_t id) { return (PIOS_USB_DETECT_GPIO_PORT->IDR & PIOS_USB_DETECT_GPIO_PIN) != 0 && transfer_possible ? 1 : 0; } -static void PIOS_USB_HID_SendReport(struct pios_usb_hid_dev * usb_hid_dev) -{ - uint16_t bytes_to_tx; - - if (!usb_hid_dev->tx_out_cb) { - return; - } - - bool need_yield = false; -#ifdef USB_HID - bytes_to_tx = (usb_hid_dev->tx_out_cb)(usb_hid_dev->tx_out_context, - &usb_hid_dev->tx_packet_buffer[1], - sizeof(usb_hid_dev->tx_packet_buffer)-1, - NULL, - &need_yield); -#else - bytes_to_tx = (usb_hid_dev->tx_out_cb)(usb_hid_dev->tx_out_context, - &usb_hid_dev->tx_packet_buffer[2], - sizeof(usb_hid_dev->tx_packet_buffer)-2, - NULL, - &need_yield); -#endif - if (bytes_to_tx == 0) { - return; - } - - /* Always set type as report ID */ - usb_hid_dev->tx_packet_buffer[0] = 1; - -#ifdef USB_HID - UserToPMABufferCopy(usb_hid_dev->tx_packet_buffer, GetEPTxAddr(EP1_IN & 0x7F), bytes_to_tx + 1); -#else - usb_hid_dev->tx_packet_buffer[1] = bytes_to_tx; - UserToPMABufferCopy(usb_hid_dev->tx_packet_buffer, GetEPTxAddr(EP1_IN & 0x7F), bytes_to_tx + 2); -#endif - /* Is this correct? Why do we always send the whole buffer? */ - SetEPTxCount((EP1_IN & 0x7F), sizeof(usb_hid_dev->tx_packet_buffer)); - SetEPTxValid(ENDP1); - -#if defined(PIOS_INCLUDE_FREERTOS) - if (need_yield) { - vPortYieldFromISR(); - } -#endif /* PIOS_INCLUDE_FREERTOS */ -} - -static void PIOS_USB_HID_RxStart(uint32_t usbcom_id, uint16_t rx_bytes_avail) { - struct pios_usb_hid_dev * usb_hid_dev = (struct pios_usb_hid_dev *)usbcom_id; - - bool valid = PIOS_USB_HID_validate(usb_hid_dev); - PIOS_Assert(valid); - - if (!transfer_possible) { - return; - } - - // If endpoint was stalled and there is now space make it valid - PIOS_IRQ_Disable(); - if ((GetEPRxStatus(ENDP1) != EP_RX_VALID) && - (rx_bytes_avail > PIOS_USB_HID_DATA_LENGTH)) { - SetEPRxStatus(ENDP1, EP_RX_VALID); - } - PIOS_IRQ_Enable(); -} - -static void PIOS_USB_HID_TxStart(uint32_t usbcom_id, uint16_t tx_bytes_avail) -{ - struct pios_usb_hid_dev * usb_hid_dev = (struct pios_usb_hid_dev *)usbcom_id; - - bool valid = PIOS_USB_HID_validate(usb_hid_dev); - PIOS_Assert(valid); - - if (!transfer_possible) { - return; - } - - if (GetEPTxStatus(ENDP1) == EP_TX_VALID) { - /* Endpoint is already transmitting */ - return; - } - - PIOS_USB_HID_SendReport(usb_hid_dev); -} - -static void PIOS_USB_HID_RegisterRxCallback(uint32_t usbcom_id, pios_com_callback rx_in_cb, uint32_t context) -{ - struct pios_usb_hid_dev * usb_hid_dev = (struct pios_usb_hid_dev *)usbcom_id; - - bool valid = PIOS_USB_HID_validate(usb_hid_dev); - PIOS_Assert(valid); - - /* - * Order is important in these assignments since ISR uses _cb - * field to determine if it's ok to dereference _cb and _context - */ - usb_hid_dev->rx_in_context = context; - usb_hid_dev->rx_in_cb = rx_in_cb; -} - -static void PIOS_USB_HID_RegisterTxCallback(uint32_t usbcom_id, pios_com_callback tx_out_cb, uint32_t context) -{ - struct pios_usb_hid_dev * usb_hid_dev = (struct pios_usb_hid_dev *)usbcom_id; - - bool valid = PIOS_USB_HID_validate(usb_hid_dev); - PIOS_Assert(valid); - - /* - * Order is important in these assignments since ISR uses _cb - * field to determine if it's ok to dereference _cb and _context - */ - usb_hid_dev->tx_out_context = context; - usb_hid_dev->tx_out_cb = tx_out_cb; -} - -/** - * @brief Callback used to indicate a transmission from device INto host completed - * Checks if any data remains, pads it into HID packet and sends. - */ -void PIOS_USB_HID_EP1_IN_Callback(void) -{ - struct pios_usb_hid_dev * usb_hid_dev = (struct pios_usb_hid_dev *)pios_usb_hid_id; - - bool valid = PIOS_USB_HID_validate(usb_hid_dev); - PIOS_Assert(valid); - - if (!transfer_possible) { - return; - } - - PIOS_USB_HID_SendReport(usb_hid_dev); -} - -/** - * EP1 OUT Callback Routine - */ -void PIOS_USB_HID_EP1_OUT_Callback(void) -{ - struct pios_usb_hid_dev * usb_hid_dev = (struct pios_usb_hid_dev *)pios_usb_hid_id; - - bool valid = PIOS_USB_HID_validate(usb_hid_dev); - PIOS_Assert(valid); - - uint32_t DataLength = 0; - - /* Read received data (63 bytes) */ - /* Get the number of received data on the selected Endpoint */ - DataLength = GetEPRxCount(ENDP1 & 0x7F); - if (DataLength > sizeof(usb_hid_dev->rx_packet_buffer)) { - DataLength = sizeof(usb_hid_dev->rx_packet_buffer); - } - - /* Use the memory interface function to write to the selected endpoint */ - PMAToUserBufferCopy((uint8_t *) usb_hid_dev->rx_packet_buffer, GetEPRxAddr(ENDP1 & 0x7F), DataLength); - - if (!usb_hid_dev->rx_in_cb) { - /* No Rx call back registered, disable the receiver */ - SetEPRxStatus(ENDP1, EP_RX_NAK); - return; - } - - /* The first byte is report ID (not checked), the second byte is the valid data length */ - uint16_t headroom; - bool need_yield = false; -#ifdef USB_HID - (usb_hid_dev->rx_in_cb)(usb_hid_dev->rx_in_context, - &usb_hid_dev->rx_packet_buffer[1], - sizeof(usb_hid_dev->rx_packet_buffer)-1, - &headroom, - &need_yield); -#else - (usb_hid_dev->rx_in_cb)(usb_hid_dev->rx_in_context, - &usb_hid_dev->rx_packet_buffer[2], - usb_hid_dev->rx_packet_buffer[1], - &headroom, - &need_yield); -#endif - if (headroom > PIOS_USB_HID_DATA_LENGTH) { - /* We have room for a maximum length message */ - SetEPRxStatus(ENDP1, EP_RX_VALID); - } else { - /* Not enough room left for a message, apply backpressure */ - SetEPRxStatus(ENDP1, EP_RX_NAK); - } - -#if defined(PIOS_INCLUDE_FREERTOS) - if (need_yield) { - vPortYieldFromISR(); - } -#endif /* PIOS_INCLUDE_FREERTOS */ -} - #endif /** diff --git a/flight/PiOS/STM32F10x/pios_usb_hid_desc.c b/flight/PiOS/STM32F10x/pios_usb_hid_desc.c index 8866e9e10..98f76f9e5 100644 --- a/flight/PiOS/STM32F10x/pios_usb_hid_desc.c +++ b/flight/PiOS/STM32F10x/pios_usb_hid_desc.c @@ -128,7 +128,7 @@ const uint8_t PIOS_HID_ReportDescriptor[PIOS_HID_SIZ_REPORT_DESC] = { 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ 0x25, 0xff, /* LOGICAL_MAXIMUM (255) */ 0x75, 0x08, /* REPORT_SIZE (8) */ - 0x95, PIOS_USB_HID_DATA_LENGTH + 1, /* REPORT_COUNT (1) */ + 0x95, PIOS_USB_COM_DATA_LENGTH + 1, /* REPORT_COUNT (1) */ 0x81, 0x83, /* INPUT (Const,Var,Array) */ /* 20 */ @@ -138,7 +138,7 @@ const uint8_t PIOS_HID_ReportDescriptor[PIOS_HID_SIZ_REPORT_DESC] = { 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ 0x25, 0xff, /* LOGICAL_MAXIMUM (255) */ 0x75, 0x08, /* REPORT_SIZE (8) */ - 0x95, PIOS_USB_HID_DATA_LENGTH + 1, /* REPORT_COUNT (1) */ + 0x95, PIOS_USB_COM_DATA_LENGTH + 1, /* REPORT_COUNT (1) */ 0x91, 0x82, /* OUTPUT (Data,Var,Abs,Vol) */ /* 34 */ diff --git a/flight/PiOS/STM32F10x/pios_usb_hid_istr.c b/flight/PiOS/STM32F10x/pios_usb_hid_istr.c index 1841705de..89204d07f 100644 --- a/flight/PiOS/STM32F10x/pios_usb_hid_istr.c +++ b/flight/PiOS/STM32F10x/pios_usb_hid_istr.c @@ -32,10 +32,10 @@ __IO uint8_t bIntPackSOF = 0; /* SOFs received between 2 consecutive packets */ /* Private functions ---------------------------------------------------------*/ /* function pointers to non-control endpoints service routines */ void (*pEpInt_IN[7]) (void) = { -PIOS_USB_HID_EP1_IN_Callback, EP2_IN_Callback, EP3_IN_Callback, EP4_IN_Callback, EP5_IN_Callback, EP6_IN_Callback, EP7_IN_Callback,}; +EP1_IN_Callback, EP2_IN_Callback, EP3_IN_Callback, EP4_IN_Callback, EP5_IN_Callback, EP6_IN_Callback, EP7_IN_Callback,}; void (*pEpInt_OUT[7]) (void) = { -PIOS_USB_HID_EP1_OUT_Callback, EP2_OUT_Callback, EP3_OUT_Callback, EP4_OUT_Callback, EP5_OUT_Callback, EP6_OUT_Callback, EP7_OUT_Callback,}; +EP1_OUT_Callback, EP2_OUT_Callback, EP3_OUT_Callback, EP4_OUT_Callback, EP5_OUT_Callback, EP6_OUT_Callback, EP7_OUT_Callback,}; #ifndef STM32F10X_CL diff --git a/flight/PiOS/STM32F10x/pios_usb_hid_prop.c b/flight/PiOS/STM32F10x/pios_usb_hid_prop.c index 9937053d0..916cfff8e 100644 --- a/flight/PiOS/STM32F10x/pios_usb_hid_prop.c +++ b/flight/PiOS/STM32F10x/pios_usb_hid_prop.c @@ -22,6 +22,7 @@ #include "pios_usb_hid_desc.h" #include "pios_usb_hid_pwr.h" #include "pios_usb_hid.h" +#include "pios_usb_com_priv.h" /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ @@ -151,24 +152,47 @@ void PIOS_HID_Reset(void) #else SetBTABLE(BTABLE_ADDRESS); - /* Initialize Endpoint 0 */ + /* Initialize Endpoint 0 (Control) */ SetEPType(ENDP0, EP_CONTROL); - SetEPTxStatus(ENDP0, EP_TX_STALL); - SetEPRxAddr(ENDP0, ENDP0_RXADDR); SetEPTxAddr(ENDP0, ENDP0_TXADDR); + SetEPTxStatus(ENDP0, EP_TX_STALL); Clear_Status_Out(ENDP0); + + SetEPRxAddr(ENDP0, ENDP0_RXADDR); SetEPRxCount(ENDP0, Device_Property.MaxPacketSize); SetEPRxValid(ENDP0); - /* Initialize Endpoint 1 */ + /* Initialize Endpoint 1 (HID) */ SetEPType(ENDP1, EP_INTERRUPT); SetEPTxAddr(ENDP1, ENDP1_TXADDR); - SetEPRxAddr(ENDP1, ENDP1_RXADDR); - SetEPTxCount(ENDP1, PIOS_USB_HID_DATA_LENGTH + 2); /* add two for indicating report id and valid data length */ - SetEPRxCount(ENDP1, PIOS_USB_HID_DATA_LENGTH + 2); - SetEPRxStatus(ENDP1, EP_RX_VALID); + SetEPTxCount(ENDP1, PIOS_USB_COM_DATA_LENGTH + 2); SetEPTxStatus(ENDP1, EP_TX_NAK); + SetEPRxAddr(ENDP1, ENDP1_RXADDR); + SetEPRxCount(ENDP1, PIOS_USB_COM_DATA_LENGTH + 2); + SetEPRxStatus(ENDP1, EP_RX_VALID); + +#if defined(PIOS_INCLUDE_USB_COM_CDC) + /* Initialize Endpoint 2 (CDC Call Control) */ + SetEPType(ENDP2, EP_INTERRUPT); + SetEPTxAddr(ENDP2, ENDP2_TXADDR); + SetEPTxStatus(ENDP2, EP_TX_NAK); + + SetEPRxAddr(ENDP2, ENDP2_RXADDR); + SetEPRxCount(ENDP2, PIOS_USB_COM_DATA_LENGTH + 2); + SetEPRxStatus(ENDP2, EP_RX_DIS); + + /* Initialize Endpoint 3 (CDC Data) */ + SetEPType(ENDP3, EP_BULK); + SetEPTxAddr(ENDP3, ENDP3_TXADDR); + SetEPTxStatus(ENDP3, EP_TX_NAK); + + SetEPRxAddr(ENDP3, ENDP3_RXADDR); + SetEPRxCount(ENDP3, PIOS_USB_COM_DATA_LENGTH + 2); + SetEPRxStatus(ENDP3, EP_RX_VALID); + +#endif /* PIOS_INCLUDE_USB_COM_CDC */ + /* Set this device to response on default address */ SetDeviceAddress(0); #endif /* STM32F10X_CL */ @@ -178,8 +202,7 @@ void PIOS_HID_Reset(void) /******************************************************************************* * Function Name : PIOS_HID_SetConfiguration. -* Description : Udpade the device state to configured and command the ADC -* conversion. +* Description : Update the device state to configured * Input : None. * Output : None. * Return : None. @@ -197,7 +220,7 @@ void PIOS_HID_SetConfiguration(void) /******************************************************************************* * Function Name : PIOS_HID_SetConfiguration. -* Description : Udpade the device state to addressed. +* Description : Update the device state to addressed. * Input : None. * Output : None. * Return : None. @@ -242,23 +265,54 @@ RESULT PIOS_HID_Data_Setup(uint8_t RequestNo) CopyRoutine = NULL; - if ((RequestNo == GET_DESCRIPTOR) - && (Type_Recipient == (STANDARD_REQUEST | INTERFACE_RECIPIENT)) - && (pInformation->USBwIndex0 == 0)) { - - if (pInformation->USBwValue1 == REPORT_DESCRIPTOR) { - CopyRoutine = PIOS_HID_GetReportDescriptor; - } else if (pInformation->USBwValue1 == HID_DESCRIPTOR_TYPE) { - CopyRoutine = PIOS_HID_GetHIDDescriptor; + switch (Type_Recipient) { + case (STANDARD_REQUEST | INTERFACE_RECIPIENT): + switch (pInformation->USBwIndex0) { + case 0: /* HID Interface */ + switch (RequestNo) { + case GET_DESCRIPTOR: + switch (pInformation->USBwValue1) { + case REPORT_DESCRIPTOR: + CopyRoutine = PIOS_HID_GetReportDescriptor; + break; + case HID_DESCRIPTOR_TYPE: + CopyRoutine = PIOS_HID_GetHIDDescriptor; + break; + } + } } + break; - } + case (CLASS_REQUEST | INTERFACE_RECIPIENT): + switch (pInformation->USBwIndex0) { + case 0: /* HID Interface */ + switch (RequestNo) { + case GET_PROTOCOL: + CopyRoutine = PIOS_HID_GetProtocolValue; + break; + } - /* End of GET_DESCRIPTOR */ - /*** GET_PROTOCOL ***/ - else if ((Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT)) - && RequestNo == GET_PROTOCOL) { - CopyRoutine = PIOS_HID_GetProtocolValue; + break; +#if defined(PIOS_INCLUDE_USB_COM_CDC) + case 1: /* CDC Call Control Interface */ + switch (RequestNo) { + case GET_LINE_CODING: + CopyRoutine = PIOS_CDC_GetLineCoding; + break; + } + + break; + + case 2: /* CDC Data Interface */ + switch (RequestNo) { + case 0: + break; + } + + break; +#endif /* PIOS_INCLUDE_USB_COM_CDC */ + } + break; } if (CopyRoutine == NULL) { @@ -280,14 +334,37 @@ RESULT PIOS_HID_Data_Setup(uint8_t RequestNo) *******************************************************************************/ RESULT PIOS_HID_NoData_Setup(uint8_t RequestNo) { - if ((Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT)) - && (RequestNo == SET_PROTOCOL)) { - return PIOS_HID_SetProtocol(); + switch (Type_Recipient) { + case (CLASS_REQUEST | INTERFACE_RECIPIENT): + switch (pInformation->USBwIndex0) { + case 0: /* HID */ + switch (RequestNo) { + case SET_PROTOCOL: + return PIOS_HID_SetProtocol(); + break; + } + + break; + +#if defined(PIOS_INCLUDE_USB_COM_CDC) + case 1: /* CDC Call Control Interface */ + switch (RequestNo) { + case SET_LINE_CODING: + return PIOS_CDC_SetLineCoding(); + break; + case SET_CONTROL_LINE_STATE: + return PIOS_CDC_SetControlLineState(); + break; + } + + break; +#endif /* PIOS_INCLUDE_USB_COM_CDC */ + } + + break; } - else { - return USB_UNSUPPORT; - } + return USB_UNSUPPORT; } /******************************************************************************* diff --git a/flight/PiOS/inc/pios_com_priv.h b/flight/PiOS/inc/pios_com_priv.h index 54af82bcb..85f2af9e1 100644 --- a/flight/PiOS/inc/pios_com_priv.h +++ b/flight/PiOS/inc/pios_com_priv.h @@ -32,9 +32,7 @@ #ifndef PIOS_COM_PRIV_H #define PIOS_COM_PRIV_H -#include - -extern int32_t PIOS_COM_ReceiveHandler(uint32_t com_id); +//#include #endif /* PIOS_COM_PRIV_H */ diff --git a/flight/PiOS/inc/pios_usb_com_priv.h b/flight/PiOS/inc/pios_usb_com_priv.h new file mode 100644 index 000000000..525f71d13 --- /dev/null +++ b/flight/PiOS/inc/pios_usb_com_priv.h @@ -0,0 +1,66 @@ +/** + ****************************************************************************** + * @addtogroup PIOS PIOS Core hardware abstraction layer + * @{ + * @addtogroup PIOS_USB_COM USB COM layer functions + * @brief Hardware communication layer + * @{ + * + * @file pios_usb_com_priv.h + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. + * @brief USB COM private definitions. + * @see The GNU Public License (GPL) Version 3 + * + *****************************************************************************/ +/* + * 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 + */ + +#ifndef PIOS_USB_COM_PRIV_H +#define PIOS_USB_COM_PRIV_H + +#include "usb_core.h" /* RESULT */ + +enum pios_usb_com_type { + PIOS_USB_COM_CDC, + PIOS_USB_COM_HID, +}; + +struct pios_usb_com_cfg { + enum pios_usb_com_type type; + + uint8_t ctrl_if; + uint8_t ctrl_tx_ep; + + uint8_t data_if; + uint8_t data_rx_ep; + uint8_t data_tx_ep; +}; + +extern const struct pios_com_driver pios_usb_hid_com_driver; +extern const struct pios_com_driver pios_usb_cdc_com_driver; + +extern int32_t PIOS_USB_COM_Init(uint32_t * usbcom_id, const struct pios_usb_com_cfg * cfg, uint32_t lower_id); + +extern uint8_t *PIOS_CDC_GetLineCoding(uint16_t Length); +extern RESULT PIOS_CDC_SetControlLineState(void); +extern RESULT PIOS_CDC_SetLineCoding(void); + +#endif /* PIOS_USB_COM_PRIV_H */ + +/** + * @} + * @} + */ diff --git a/flight/PiOS/inc/pios_usb_hid.h b/flight/PiOS/inc/pios_usb_hid.h index 67067ba72..10e3d6277 100644 --- a/flight/PiOS/inc/pios_usb_hid.h +++ b/flight/PiOS/inc/pios_usb_hid.h @@ -32,23 +32,21 @@ #define PIOS_USB_HID_H /* Global Definitions */ -#define PIOS_USB_HID_SIZ_REPORT_DESC 32 +#define PIOS_USB_HID_SIZ_REPORT_DESC 36 #define PIOS_USB_HID_REPORT_DESCRIPTOR 0x22 #define PIOS_USB_HID_HID_DESCRIPTOR_TYPE 0x21 #define PIOS_USB_HID_OFF_HID_DESC 0x12 #define PIOS_USB_HID_SIZ_HID_DESC 0x09 -#define PIOS_USB_HID_DATA_LENGTH 62 +#define PIOS_USB_COM_DATA_LENGTH 62 /* Global functions */ extern int32_t PIOS_USB_HID_Reenumerate(); extern int32_t PIOS_USB_HID_ChangeConnectionState(uint32_t Connected); -extern int32_t PIOS_USB_HID_CheckAvailable(uint8_t id); +extern bool PIOS_USB_HID_CheckAvailable(uint8_t id); extern int32_t PIOS_USB_HID_CB_Data_Setup(uint8_t RequestNo); extern int32_t PIOS_USB_HID_CB_NoData_Setup(uint8_t RequestNo); -extern void PIOS_USB_HID_EP1_IN_Callback(void); -extern void PIOS_USB_HID_EP1_OUT_Callback(void); #endif /* PIOS_USB_HID_H */ diff --git a/flight/PiOS/inc/pios_usb_hid_priv.h b/flight/PiOS/inc/pios_usb_hid_priv.h index 5a8652762..7e2be04ec 100644 --- a/flight/PiOS/inc/pios_usb_hid_priv.h +++ b/flight/PiOS/inc/pios_usb_hid_priv.h @@ -34,11 +34,11 @@ #include #include -struct pios_usb_hid_cfg { +struct pios_usb_cfg { struct stm32_irq irq; }; -extern int32_t PIOS_USB_HID_Init(uint32_t * usb_hid_id, const struct pios_usb_hid_cfg * cfg); +extern int32_t PIOS_USB_Init(uint32_t * usb_id, const struct pios_usb_cfg * cfg); #endif /* PIOS_USB_HID_PRIV_H */ diff --git a/flight/PiOS/inc/pios_usb_hid_prop.h b/flight/PiOS/inc/pios_usb_hid_prop.h index e721fc93e..57e5c9fda 100644 --- a/flight/PiOS/inc/pios_usb_hid_prop.h +++ b/flight/PiOS/inc/pios_usb_hid_prop.h @@ -29,6 +29,12 @@ typedef enum _HID_REQUESTS { SET_PROTOCOL } HID_REQUESTS; +typedef enum CDC_REQUESTS { + SET_LINE_CODING = 0x20, + GET_LINE_CODING = 0x21, + SET_CONTROL_LINE_STATE = 0x23, +} CDC_REQUESTS; + /* Exported constants --------------------------------------------------------*/ /* Exported macro ------------------------------------------------------------*/ /* Exported functions ------------------------------------------------------- */ diff --git a/flight/PiOS/inc/usb_conf.h b/flight/PiOS/inc/usb_conf.h index eb2198a0b..ad0c33c29 100644 --- a/flight/PiOS/inc/usb_conf.h +++ b/flight/PiOS/inc/usb_conf.h @@ -27,7 +27,7 @@ /* EP_NUM */ /* defines how many endpoints are used by the device */ /*-------------------------------------------------------------*/ -#define EP_NUM (2) +#define EP_NUM (4) #ifndef STM32F10X_CL /*-------------------------------------------------------------*/ @@ -39,13 +39,23 @@ /* EP0 */ /* rx/tx buffer base address */ -#define ENDP0_RXADDR (0x18) -#define ENDP0_TXADDR (0x58) +#define ENDP0_RXADDR (0x20) +#define ENDP0_TXADDR (0x40) /* EP1 */ -/* tx buffer base address */ -#define ENDP1_TXADDR (0x100) -#define ENDP1_RXADDR (0x124) +/* rx/tx buffer base address */ +#define ENDP1_TXADDR (0x60) +#define ENDP1_RXADDR (0x80) + +/* EP2 */ +/* rx/tx buffer base address */ +#define ENDP2_TXADDR (0x100) +#define ENDP2_RXADDR (0x140) + +/* EP3 */ +/* rx/tx buffer base address */ +#define ENDP3_TXADDR (0x180) +#define ENDP3_RXADDR (0x1C0) /*-------------------------------------------------------------*/ /* ------------------- ISTR events -------------------------*/ @@ -171,7 +181,7 @@ #define EP6_IN_Callback NOP_Process #define EP7_IN_Callback NOP_Process -//#define EP1_OUT_Callback NOP_Process +#define EP1_OUT_Callback NOP_Process #define EP2_OUT_Callback NOP_Process #define EP3_OUT_Callback NOP_Process #define EP4_OUT_Callback NOP_Process diff --git a/flight/PipXtreme/Makefile b/flight/PipXtreme/Makefile index 8a939d411..ebb7254be 100644 --- a/flight/PipXtreme/Makefile +++ b/flight/PipXtreme/Makefile @@ -121,6 +121,7 @@ ifeq ($(USE_USB), YES) SRC += $(PIOSSTM32F10X)/pios_usb_hid_istr.c SRC += $(PIOSSTM32F10X)/pios_usb_hid_prop.c SRC += $(PIOSSTM32F10X)/pios_usb_hid_pwr.c + SRC += $(PIOSSTM32F10X)/pios_usb_com.c endif ## PIOS Hardware (Common) diff --git a/flight/PipXtreme/api_config.c b/flight/PipXtreme/api_config.c index 2cecfc65e..5f476e330 100644 --- a/flight/PipXtreme/api_config.c +++ b/flight/PipXtreme/api_config.c @@ -777,7 +777,7 @@ void apiconfig_process(void) if (PIOS_USB_HID_CheckAvailable(0)) { // USB comms is up, use the USB comm-port instead of the USART comm-port apiconfig_usb_comms = true; - apiconfig_comm_port = PIOS_COM_TELEM_USB; + apiconfig_comm_port = PIOS_COM_TELEM_USB_HID; } #endif diff --git a/flight/PipXtreme/inc/pios_config.h b/flight/PipXtreme/inc/pios_config.h index 7fac02079..ca0f6c0c9 100644 --- a/flight/PipXtreme/inc/pios_config.h +++ b/flight/PipXtreme/inc/pios_config.h @@ -40,5 +40,6 @@ #define PIOS_INCLUDE_GPIO #define PIOS_INCLUDE_EXTI #define PIOS_INCLUDE_USB_HID +#define PIOS_INCLUDE_USB_COM #endif /* PIOS_CONFIG_H */ diff --git a/flight/PipXtreme/inc/usb_conf.h b/flight/PipXtreme/inc/usb_conf.h index 913060c7f..1c56117e5 100644 --- a/flight/PipXtreme/inc/usb_conf.h +++ b/flight/PipXtreme/inc/usb_conf.h @@ -39,13 +39,23 @@ /* EP0 */ /* rx/tx buffer base address */ -#define ENDP0_RXADDR (0x18) -#define ENDP0_TXADDR (0x58) +#define ENDP0_RXADDR (0x20) +#define ENDP0_TXADDR (0x40) /* EP1 */ -/* tx buffer base address */ -#define ENDP1_TXADDR (0x100) -#define ENDP1_RXADDR (0x124) +/* rx/tx buffer base address */ +#define ENDP1_TXADDR (0x60) +#define ENDP1_RXADDR (0x80) + +/* EP2 */ +/* rx/tx buffer base address */ +#define ENDP2_TXADDR (0x100) +#define ENDP2_RXADDR (0x140) + +/* EP3 */ +/* rx/tx buffer base address */ +#define ENDP3_TXADDR (0x180) +#define ENDP3_RXADDR (0x1C0) /*-------------------------------------------------------------*/ /* ------------------- ISTR events -------------------------*/ @@ -172,7 +182,7 @@ #define EP6_IN_Callback NOP_Process #define EP7_IN_Callback NOP_Process -//#define EP1_OUT_Callback NOP_Process +#define EP1_OUT_Callback NOP_Process #define EP2_OUT_Callback NOP_Process #define EP3_OUT_Callback NOP_Process #define EP4_OUT_Callback NOP_Process diff --git a/flight/PipXtreme/pios_board.c b/flight/PipXtreme/pios_board.c index 0a69808ad..5f0b49964 100644 --- a/flight/PipXtreme/pios_board.c +++ b/flight/PipXtreme/pios_board.c @@ -314,7 +314,7 @@ static uint8_t pios_com_serial_tx_buffer[PIOS_COM_SERIAL_TX_BUF_LEN]; #if defined(PIOS_INCLUDE_USB_HID) #include "pios_usb_hid_priv.h" -static const struct pios_usb_hid_cfg pios_usb_hid_main_cfg = { +static const struct pios_usb_cfg pios_usb_main_cfg = { .irq = { .init = { .NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn, @@ -326,10 +326,21 @@ static const struct pios_usb_hid_cfg pios_usb_hid_main_cfg = { }; #endif /* PIOS_INCLUDE_USB_HID */ -extern const struct pios_com_driver pios_usb_com_driver; +#if defined(PIOS_INCLUDE_USB_COM) +#include + +const struct pios_usb_com_cfg pios_usb_com_hid_cfg = { + .type = PIOS_USB_COM_HID, + .data_if = 0, + .data_rx_ep = 1, + .data_tx_ep = 1, +}; + +#endif /* PIOS_INCLUDE_USB_COM */ uint32_t pios_com_serial_id; -uint32_t pios_com_telem_usb_id; +uint32_t pios_com_telem_usb_hid_id; +uint32_t pios_com_telem_usb_cdc_id; /** * PIOS_Board_Init() @@ -360,10 +371,14 @@ void PIOS_Board_Init(void) { } #if defined(PIOS_INCLUDE_USB_HID) - uint32_t pios_usb_hid_id; - PIOS_USB_HID_Init(&pios_usb_hid_id, &pios_usb_hid_main_cfg); + uint32_t pios_usb_id; + PIOS_USB_Init(&pios_usb_id, &pios_usb_main_cfg); #if defined(PIOS_INCLUDE_COM) - if (PIOS_COM_Init(&pios_com_telem_usb_id, &pios_usb_com_driver, pios_usb_hid_id, + uint32_t pios_usb_com_id; + if (PIOS_USB_COM_Init(&pios_usb_com_id, &pios_usb_com_hid_cfg, pios_usb_id)) { + PIOS_Assert(0); + } + if (PIOS_COM_Init(&pios_com_telem_usb_hid_id, &pios_usb_hid_com_driver, pios_usb_com_id, pios_com_telem_usb_rx_buffer, sizeof(pios_com_telem_usb_rx_buffer), pios_com_telem_usb_tx_buffer, sizeof(pios_com_telem_usb_tx_buffer))) { PIOS_Assert(0); diff --git a/flight/PipXtreme/pios_usb_hid_desc.c b/flight/PipXtreme/pios_usb_hid_desc.c index 157e85831..c15a80551 100644 --- a/flight/PipXtreme/pios_usb_hid_desc.c +++ b/flight/PipXtreme/pios_usb_hid_desc.c @@ -123,7 +123,7 @@ const uint8_t PIOS_HID_ConfigDescriptor[PIOS_HID_SIZ_CONFIG_DESC] = 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x25, 0xff, // LOGICAL_MAXIMUM (255) 0x75, 0x08, // REPORT_SIZE (8) - 0x95, PIOS_USB_HID_DATA_LENGTH+1, // REPORT_COUNT (1) + 0x95, PIOS_USB_COM_DATA_LENGTH+1, // REPORT_COUNT (1) 0x81, 0x83, // INPUT (Const,Var,Array) // 20 @@ -133,7 +133,7 @@ const uint8_t PIOS_HID_ConfigDescriptor[PIOS_HID_SIZ_CONFIG_DESC] = 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x25, 0xff, // LOGICAL_MAXIMUM (255) 0x75, 0x08, // REPORT_SIZE (8) - 0x95, PIOS_USB_HID_DATA_LENGTH+1, // REPORT_COUNT (1) + 0x95, PIOS_USB_COM_DATA_LENGTH+1, // REPORT_COUNT (1) 0x91, 0x82, // OUTPUT (Data,Var,Abs,Vol) // 34 diff --git a/flight/PipXtreme/transparent_comms.c b/flight/PipXtreme/transparent_comms.c index b30f5f581..aebbc20a7 100644 --- a/flight/PipXtreme/transparent_comms.c +++ b/flight/PipXtreme/transparent_comms.c @@ -74,7 +74,7 @@ void trans_process(void) if (PIOS_USB_HID_CheckAvailable(0)) { // USB comms is up, use the USB comm-port instead of the USART comm-port usb_comms = true; - comm_port = PIOS_COM_TELEM_USB; + comm_port = PIOS_COM_TELEM_USB_HID; } #endif From 59cb489e0114f3f261d7d98a012361c22c5875df Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Fri, 9 Sep 2011 23:26:19 -0400 Subject: [PATCH 026/121] usb: clean up pios hooks into stm32 usb_core Reduced scope of many variables since they were being exposed unnecessarily. Renamed pios_usb_hid_prop code to pios_usbhook to reflect the fact that it implements all of the callout functions that are hooked into the stm32 usb library. --- flight/Bootloaders/CopterControl/Makefile | 2 +- flight/Bootloaders/OpenPilot/Makefile | 2 +- flight/Bootloaders/PipXtreme/Makefile | 2 +- flight/CopterControl/Makefile | 2 +- flight/OpenPilot/Makefile | 2 +- .../STM32_USB-FS-Device_Driver/inc/usb_core.h | 8 +- .../{pios_usb_hid_prop.c => pios_usbhook.c} | 154 ++++++++++-------- .../{pios_usb_hid_prop.h => pios_usbhook.h} | 36 +--- flight/PipXtreme/Makefile | 2 +- 9 files changed, 100 insertions(+), 110 deletions(-) rename flight/PiOS/STM32F10x/{pios_usb_hid_prop.c => pios_usbhook.c} (74%) rename flight/PiOS/inc/{pios_usb_hid_prop.h => pios_usbhook.h} (57%) diff --git a/flight/Bootloaders/CopterControl/Makefile b/flight/Bootloaders/CopterControl/Makefile index 010eadd7a..07c13b190 100644 --- a/flight/Bootloaders/CopterControl/Makefile +++ b/flight/Bootloaders/CopterControl/Makefile @@ -106,10 +106,10 @@ SRC += $(PIOSSTM32F10X)/pios_gpio.c # PIOS USB related files (seperated to make code maintenance more easy) +SRC += $(PIOSSTM32F10X)/pios_usbhook.c SRC += $(PIOSSTM32F10X)/pios_usb_hid.c SRC += $(PIOSSTM32F10X)/pios_usb_hid_desc.c SRC += $(PIOSSTM32F10X)/pios_usb_hid_istr.c -SRC += $(PIOSSTM32F10X)/pios_usb_hid_prop.c SRC += $(PIOSSTM32F10X)/pios_usb_hid_pwr.c SRC += $(PIOSSTM32F10X)/pios_usb_com.c diff --git a/flight/Bootloaders/OpenPilot/Makefile b/flight/Bootloaders/OpenPilot/Makefile index d673f4353..c172387f7 100644 --- a/flight/Bootloaders/OpenPilot/Makefile +++ b/flight/Bootloaders/OpenPilot/Makefile @@ -109,10 +109,10 @@ SRC += $(PIOSSTM32F10X)/pios_debug.c SRC += $(PIOSSTM32F10X)/pios_gpio.c # PIOS USB related files (seperated to make code maintenance more easy) +SRC += $(PIOSSTM32F10X)/pios_usbhook.c SRC += $(PIOSSTM32F10X)/pios_usb_hid.c SRC += $(PIOSSTM32F10X)/pios_usb_hid_desc.c SRC += $(PIOSSTM32F10X)/pios_usb_hid_istr.c -SRC += $(PIOSSTM32F10X)/pios_usb_hid_prop.c SRC += $(PIOSSTM32F10X)/pios_usb_hid_pwr.c SRC += $(PIOSSTM32F10X)/pios_usb_com.c diff --git a/flight/Bootloaders/PipXtreme/Makefile b/flight/Bootloaders/PipXtreme/Makefile index aad33dd73..36b4b1568 100644 --- a/flight/Bootloaders/PipXtreme/Makefile +++ b/flight/Bootloaders/PipXtreme/Makefile @@ -105,10 +105,10 @@ SRC += $(PIOSSTM32F10X)/pios_debug.c SRC += $(PIOSSTM32F10X)/pios_gpio.c # PIOS USB related files (seperated to make code maintenance more easy) +SRC += $(PIOSSTM32F10X)/pios_usbhook.c SRC += $(PIOSSTM32F10X)/pios_usb_hid.c SRC += $(PIOSSTM32F10X)/pios_usb_hid_desc.c SRC += $(PIOSSTM32F10X)/pios_usb_hid_istr.c -SRC += $(PIOSSTM32F10X)/pios_usb_hid_prop.c SRC += $(PIOSSTM32F10X)/pios_usb_hid_pwr.c SRC += $(PIOSSTM32F10X)/pios_usb_com.c diff --git a/flight/CopterControl/Makefile b/flight/CopterControl/Makefile index 22778ba61..f0eb31cb9 100644 --- a/flight/CopterControl/Makefile +++ b/flight/CopterControl/Makefile @@ -204,9 +204,9 @@ SRC += $(PIOSSTM32F10X)/pios_tim.c # PIOS USB related files (separated to make code maintenance more easy) +SRC += $(PIOSSTM32F10X)/pios_usbhook.c SRC += $(PIOSSTM32F10X)/pios_usb_hid.c SRC += $(PIOSSTM32F10X)/pios_usb_hid_istr.c -SRC += $(PIOSSTM32F10X)/pios_usb_hid_prop.c SRC += $(PIOSSTM32F10X)/pios_usb_hid_pwr.c SRC += $(PIOSSTM32F10X)/pios_usb_com.c diff --git a/flight/OpenPilot/Makefile b/flight/OpenPilot/Makefile index 0fe336af9..73f3f766c 100644 --- a/flight/OpenPilot/Makefile +++ b/flight/OpenPilot/Makefile @@ -180,11 +180,11 @@ SRC += $(PIOSSTM32F10X)/pios_wdg.c # PIOS USB related files (seperated to make code maintenance more easy) +SRC += $(PIOSSTM32F10X)/pios_usbhook.c SRC += $(PIOSSTM32F10X)/pios_usb_hid.c SRC += $(PIOSSTM32F10X)/pios_usb_hid_desc.c #SRC += $(PIOSSTM32F10X)/pios_usb_hid_endp.c SRC += $(PIOSSTM32F10X)/pios_usb_hid_istr.c -SRC += $(PIOSSTM32F10X)/pios_usb_hid_prop.c SRC += $(PIOSSTM32F10X)/pios_usb_hid_pwr.c SRC += $(PIOSSTM32F10X)/pios_usb_com.c diff --git a/flight/PiOS/STM32F10x/Libraries/STM32_USB-FS-Device_Driver/inc/usb_core.h b/flight/PiOS/STM32F10x/Libraries/STM32_USB-FS-Device_Driver/inc/usb_core.h index c4bac0caf..bd777f000 100644 --- a/flight/PiOS/STM32F10x/Libraries/STM32_USB-FS-Device_Driver/inc/usb_core.h +++ b/flight/PiOS/STM32F10x/Libraries/STM32_USB-FS-Device_Driver/inc/usb_core.h @@ -232,10 +232,10 @@ RESULT Standard_ClearFeature(void); void SetDeviceAddress(uint8_t); void NOP_Process(void); -/*extern*/ DEVICE_PROP Device_Property; -/*extern*/ USER_STANDARD_REQUESTS User_Standard_Requests; -/*extern*/ DEVICE Device_Table; -/*extern*/ DEVICE_INFO Device_Info; +extern DEVICE_PROP Device_Property; +extern USER_STANDARD_REQUESTS User_Standard_Requests; +extern DEVICE Device_Table; +extern DEVICE_INFO Device_Info; /* cells saving status during interrupt servicing */ extern __IO uint16_t SaveRState; diff --git a/flight/PiOS/STM32F10x/pios_usb_hid_prop.c b/flight/PiOS/STM32F10x/pios_usbhook.c similarity index 74% rename from flight/PiOS/STM32F10x/pios_usb_hid_prop.c rename to flight/PiOS/STM32F10x/pios_usbhook.c index 916cfff8e..92836db29 100644 --- a/flight/PiOS/STM32F10x/pios_usb_hid_prop.c +++ b/flight/PiOS/STM32F10x/pios_usbhook.c @@ -1,5 +1,5 @@ /******************** (C) COPYRIGHT 2010 STMicroelectronics ******************** -* File Name : usb_prop.c +* File Name : pios_usbhook.c * Author : MCD Application Team * Version : V3.2.1 * Date : 07/05/2010 @@ -18,7 +18,7 @@ #include "usb_lib.h" #include "usb_conf.h" #include "pios.h" -#include "pios_usb_hid_prop.h" +#include "pios_usbhook.h" #include "pios_usb_hid_desc.h" #include "pios_usb_hid_pwr.h" #include "pios_usb_hid.h" @@ -40,54 +40,68 @@ DEVICE Device_Table = { 1 }; +static void PIOS_USBHOOK_Init(void); +static void PIOS_USBHOOK_Reset(void); +static void PIOS_USBHOOK_Status_In(void); +static void PIOS_USBHOOK_Status_Out(void); +static RESULT PIOS_USBHOOK_Data_Setup(uint8_t RequestNo); +static RESULT PIOS_USBHOOK_NoData_Setup(uint8_t RequestNo); +static RESULT PIOS_USBHOOK_Get_Interface_Setting(uint8_t Interface, uint8_t AlternateSetting); +static uint8_t *PIOS_USBHOOK_GetDeviceDescriptor(uint16_t Length); +static uint8_t *PIOS_USBHOOK_GetConfigDescriptor(uint16_t Length); +static uint8_t *PIOS_USBHOOK_GetStringDescriptor(uint16_t Length); + DEVICE_PROP Device_Property = { - PIOS_HID_init, - PIOS_HID_Reset, - PIOS_HID_Status_In, - PIOS_HID_Status_Out, - PIOS_HID_Data_Setup, - PIOS_HID_NoData_Setup, - PIOS_HID_Get_Interface_Setting, - PIOS_HID_GetDeviceDescriptor, - PIOS_HID_GetConfigDescriptor, - PIOS_HID_GetStringDescriptor, - 0, - 0x40 /*MAX PACKET SIZE */ + .Init = PIOS_USBHOOK_Init, + .Reset = PIOS_USBHOOK_Reset, + .Process_Status_IN = PIOS_USBHOOK_Status_In, + .Process_Status_OUT = PIOS_USBHOOK_Status_Out, + .Class_Data_Setup = PIOS_USBHOOK_Data_Setup, + .Class_NoData_Setup = PIOS_USBHOOK_NoData_Setup, + .Class_Get_Interface_Setting = PIOS_USBHOOK_Get_Interface_Setting, + .GetDeviceDescriptor = PIOS_USBHOOK_GetDeviceDescriptor, + .GetConfigDescriptor = PIOS_USBHOOK_GetConfigDescriptor, + .GetStringDescriptor = PIOS_USBHOOK_GetStringDescriptor, + .RxEP_buffer = 0, + .MaxPacketSize = 0x40, }; +static void PIOS_USBHOOK_SetConfiguration(void); +static void PIOS_USBHOOK_SetDeviceAddress(void); + USER_STANDARD_REQUESTS User_Standard_Requests = { - PIOS_HID_GetConfiguration, - PIOS_HID_SetConfiguration, - PIOS_HID_GetInterface, - PIOS_HID_SetInterface, - PIOS_HID_GetStatus, - PIOS_HID_ClearFeature, - PIOS_HID_SetEndPointFeature, - PIOS_HID_SetDeviceFeature, - PIOS_HID_SetDeviceAddress + .User_GetConfiguration = NOP_Process, + .User_SetConfiguration = PIOS_USBHOOK_SetConfiguration, + .User_GetInterface = NOP_Process, + .User_SetInterface = NOP_Process, + .User_GetStatus = NOP_Process, + .User_ClearFeature = NOP_Process, + .User_SetEndPointFeature = NOP_Process, + .User_SetDeviceFeature = NOP_Process, + .User_SetDeviceAddress = PIOS_USBHOOK_SetDeviceAddress }; -ONE_DESCRIPTOR Device_Descriptor = { +static ONE_DESCRIPTOR Device_Descriptor = { (uint8_t *) PIOS_HID_DeviceDescriptor, PIOS_HID_SIZ_DEVICE_DESC }; -ONE_DESCRIPTOR Config_Descriptor = { +static ONE_DESCRIPTOR Config_Descriptor = { (uint8_t *) PIOS_HID_ConfigDescriptor, PIOS_HID_SIZ_CONFIG_DESC }; -ONE_DESCRIPTOR PIOS_HID_Report_Descriptor = { +static ONE_DESCRIPTOR PIOS_HID_Report_Descriptor = { (uint8_t *) PIOS_HID_ReportDescriptor, PIOS_HID_SIZ_REPORT_DESC }; -ONE_DESCRIPTOR PIOS_HID_Hid_Descriptor = { +static ONE_DESCRIPTOR PIOS_HID_Hid_Descriptor = { (uint8_t *) PIOS_HID_ConfigDescriptor + PIOS_HID_OFF_HID_DESC, PIOS_HID_SIZ_HID_DESC }; -ONE_DESCRIPTOR String_Descriptor[4] = { +static ONE_DESCRIPTOR String_Descriptor[4] = { {(uint8_t *) PIOS_HID_StringLangID, PIOS_HID_SIZ_STRING_LANGID} , {(uint8_t *) PIOS_HID_StringVendor, PIOS_HID_SIZ_STRING_VENDOR} @@ -99,17 +113,21 @@ ONE_DESCRIPTOR String_Descriptor[4] = { /* Extern variables ----------------------------------------------------------*/ /* Private function prototypes -----------------------------------------------*/ +static RESULT PIOS_USBHOOK_SetProtocol(void); +static uint8_t *PIOS_USBHOOK_GetProtocolValue(uint16_t Length); +static uint8_t *PIOS_USBHOOK_GetReportDescriptor(uint16_t Length); +static uint8_t *PIOS_USBHOOK_GetHIDDescriptor(uint16_t Length); /* Extern function prototypes ------------------------------------------------*/ /* Private functions ---------------------------------------------------------*/ /******************************************************************************* -* Function Name : PIOS_HID_init. +* Function Name : PIOS_USBHOOK_Init. * Description : Custom HID init routine. * Input : None. * Output : None. * Return : None. *******************************************************************************/ -void PIOS_HID_init(void) +static void PIOS_USBHOOK_Init(void) { /* Update the serial number string descriptor with the data from the unique ID */ @@ -126,15 +144,15 @@ void PIOS_HID_init(void) } /******************************************************************************* -* Function Name : PIOS_HID_Reset. +* Function Name : PIOS_USBHOOK_Reset. * Description : Custom HID reset routine. * Input : None. * Output : None. * Return : None. *******************************************************************************/ -void PIOS_HID_Reset(void) +static void PIOS_USBHOOK_Reset(void) { - /* Set Joystick_DEVICE as not configured */ + /* Set DEVICE as not configured */ pInformation->Current_Configuration = 0; pInformation->Current_Interface = 0; /*the default Interface */ @@ -201,13 +219,13 @@ void PIOS_HID_Reset(void) } /******************************************************************************* -* Function Name : PIOS_HID_SetConfiguration. +* Function Name : PIOS_USBHOOK_SetConfiguration. * Description : Update the device state to configured * Input : None. * Output : None. * Return : None. *******************************************************************************/ -void PIOS_HID_SetConfiguration(void) +static void PIOS_USBHOOK_SetConfiguration(void) { if (pInformation->Current_Configuration != 0) { /* Device configured */ @@ -219,47 +237,47 @@ void PIOS_HID_SetConfiguration(void) } /******************************************************************************* -* Function Name : PIOS_HID_SetConfiguration. +* Function Name : PIOS_USBHOOK_SetConfiguration. * Description : Update the device state to addressed. * Input : None. * Output : None. * Return : None. *******************************************************************************/ -void PIOS_HID_SetDeviceAddress(void) +static void PIOS_USBHOOK_SetDeviceAddress(void) { bDeviceState = ADDRESSED; } /******************************************************************************* -* Function Name : PIOS_HID_Status_In. -* Description : Joystick status IN routine. +* Function Name : PIOS_USBHOOK_Status_In. +* Description : status IN routine. * Input : None. * Output : None. * Return : None. *******************************************************************************/ -void PIOS_HID_Status_In(void) +static void PIOS_USBHOOK_Status_In(void) { } /******************************************************************************* -* Function Name : PIOS_HID_Status_Out -* Description : Joystick status OUT routine. +* Function Name : PIOS_USBHOOK_Status_Out +* Description : status OUT routine. * Input : None. * Output : None. * Return : None. *******************************************************************************/ -void PIOS_HID_Status_Out(void) +static void PIOS_USBHOOK_Status_Out(void) { } /******************************************************************************* -* Function Name : PIOS_HID_Data_Setup +* Function Name : PIOS_USBHOOK_Data_Setup * Description : Handle the data class specific requests. * Input : Request Nb. * Output : None. * Return : USB_UNSUPPORT or USB_SUCCESS. *******************************************************************************/ -RESULT PIOS_HID_Data_Setup(uint8_t RequestNo) +static RESULT PIOS_USBHOOK_Data_Setup(uint8_t RequestNo) { uint8_t *(*CopyRoutine) (uint16_t); @@ -273,10 +291,10 @@ RESULT PIOS_HID_Data_Setup(uint8_t RequestNo) case GET_DESCRIPTOR: switch (pInformation->USBwValue1) { case REPORT_DESCRIPTOR: - CopyRoutine = PIOS_HID_GetReportDescriptor; + CopyRoutine = PIOS_USBHOOK_GetReportDescriptor; break; case HID_DESCRIPTOR_TYPE: - CopyRoutine = PIOS_HID_GetHIDDescriptor; + CopyRoutine = PIOS_USBHOOK_GetHIDDescriptor; break; } } @@ -288,7 +306,7 @@ RESULT PIOS_HID_Data_Setup(uint8_t RequestNo) case 0: /* HID Interface */ switch (RequestNo) { case GET_PROTOCOL: - CopyRoutine = PIOS_HID_GetProtocolValue; + CopyRoutine = PIOS_USBHOOK_GetProtocolValue; break; } @@ -326,13 +344,13 @@ RESULT PIOS_HID_Data_Setup(uint8_t RequestNo) } /******************************************************************************* -* Function Name : PIOS_HID_NoData_Setup +* Function Name : PIOS_USBHOOK_NoData_Setup * Description : handle the no data class specific requests * Input : Request Nb. * Output : None. * Return : USB_UNSUPPORT or USB_SUCCESS. *******************************************************************************/ -RESULT PIOS_HID_NoData_Setup(uint8_t RequestNo) +static RESULT PIOS_USBHOOK_NoData_Setup(uint8_t RequestNo) { switch (Type_Recipient) { case (CLASS_REQUEST | INTERFACE_RECIPIENT): @@ -340,7 +358,7 @@ RESULT PIOS_HID_NoData_Setup(uint8_t RequestNo) case 0: /* HID */ switch (RequestNo) { case SET_PROTOCOL: - return PIOS_HID_SetProtocol(); + return PIOS_USBHOOK_SetProtocol(); break; } @@ -368,37 +386,37 @@ RESULT PIOS_HID_NoData_Setup(uint8_t RequestNo) } /******************************************************************************* -* Function Name : PIOS_HID_GetDeviceDescriptor. +* Function Name : PIOS_USBHOOK_GetDeviceDescriptor. * Description : Gets the device descriptor. * Input : Length * Output : None. * Return : The address of the device descriptor. *******************************************************************************/ -uint8_t *PIOS_HID_GetDeviceDescriptor(uint16_t Length) +static uint8_t *PIOS_USBHOOK_GetDeviceDescriptor(uint16_t Length) { return Standard_GetDescriptorData(Length, &Device_Descriptor); } /******************************************************************************* -* Function Name : PIOS_HID_GetConfigDescriptor. +* Function Name : PIOS_USBHOOK_GetConfigDescriptor. * Description : Gets the configuration descriptor. * Input : Length * Output : None. * Return : The address of the configuration descriptor. *******************************************************************************/ -uint8_t *PIOS_HID_GetConfigDescriptor(uint16_t Length) +static uint8_t *PIOS_USBHOOK_GetConfigDescriptor(uint16_t Length) { return Standard_GetDescriptorData(Length, &Config_Descriptor); } /******************************************************************************* -* Function Name : PIOS_HID_GetStringDescriptor +* Function Name : PIOS_USBHOOK_GetStringDescriptor * Description : Gets the string descriptors according to the needed index * Input : Length * Output : None. * Return : The address of the string descriptors. *******************************************************************************/ -uint8_t *PIOS_HID_GetStringDescriptor(uint16_t Length) +static uint8_t *PIOS_USBHOOK_GetStringDescriptor(uint16_t Length) { uint8_t wValue0 = pInformation->USBwValue0; if (wValue0 > 4) { @@ -409,31 +427,31 @@ uint8_t *PIOS_HID_GetStringDescriptor(uint16_t Length) } /******************************************************************************* -* Function Name : PIOS_HID_GetReportDescriptor. +* Function Name : PIOS_USBHOOK_GetReportDescriptor. * Description : Gets the HID report descriptor. * Input : Length * Output : None. * Return : The address of the configuration descriptor. *******************************************************************************/ -uint8_t *PIOS_HID_GetReportDescriptor(uint16_t Length) +static uint8_t *PIOS_USBHOOK_GetReportDescriptor(uint16_t Length) { return Standard_GetDescriptorData(Length, &PIOS_HID_Report_Descriptor); } /******************************************************************************* -* Function Name : PIOS_HID_GetHIDDescriptor. +* Function Name : PIOS_USBHOOK_GetHIDDescriptor. * Description : Gets the HID descriptor. * Input : Length * Output : None. * Return : The address of the configuration descriptor. *******************************************************************************/ -uint8_t *PIOS_HID_GetHIDDescriptor(uint16_t Length) +static uint8_t *PIOS_USBHOOK_GetHIDDescriptor(uint16_t Length) { return Standard_GetDescriptorData(Length, &PIOS_HID_Hid_Descriptor); } /******************************************************************************* -* Function Name : PIOS_HID_Get_Interface_Setting. +* Function Name : PIOS_USBHOOK_Get_Interface_Setting. * Description : tests the interface and the alternate setting according to the * supported one. * Input : - Interface : interface number. @@ -441,7 +459,7 @@ uint8_t *PIOS_HID_GetHIDDescriptor(uint16_t Length) * Output : None. * Return : USB_SUCCESS or USB_UNSUPPORT. *******************************************************************************/ -RESULT PIOS_HID_Get_Interface_Setting(uint8_t Interface, uint8_t AlternateSetting) +static RESULT PIOS_USBHOOK_Get_Interface_Setting(uint8_t Interface, uint8_t AlternateSetting) { if (AlternateSetting > 0) { return USB_UNSUPPORT; @@ -452,13 +470,13 @@ RESULT PIOS_HID_Get_Interface_Setting(uint8_t Interface, uint8_t AlternateSettin } /******************************************************************************* -* Function Name : PIOS_HID_SetProtocol -* Description : Joystick Set Protocol request routine. +* Function Name : PIOS_USBHOOK_SetProtocol +* Description : Set Protocol request routine. * Input : None. * Output : None. * Return : USB SUCCESS. *******************************************************************************/ -RESULT PIOS_HID_SetProtocol(void) +static RESULT PIOS_USBHOOK_SetProtocol(void) { uint8_t wValue0 = pInformation->USBwValue0; ProtocolValue = wValue0; @@ -466,13 +484,13 @@ RESULT PIOS_HID_SetProtocol(void) } /******************************************************************************* -* Function Name : PIOS_HID_GetProtocolValue +* Function Name : PIOS_USBHOOK_GetProtocolValue * Description : get the protocol value * Input : Length. * Output : None. * Return : address of the protcol value. *******************************************************************************/ -uint8_t *PIOS_HID_GetProtocolValue(uint16_t Length) +static uint8_t *PIOS_USBHOOK_GetProtocolValue(uint16_t Length) { if (Length == 0) { pInformation->Ctrl_Info.Usb_wLength = 1; diff --git a/flight/PiOS/inc/pios_usb_hid_prop.h b/flight/PiOS/inc/pios_usbhook.h similarity index 57% rename from flight/PiOS/inc/pios_usb_hid_prop.h rename to flight/PiOS/inc/pios_usbhook.h index 57e5c9fda..7b1a6f2c5 100644 --- a/flight/PiOS/inc/pios_usb_hid_prop.h +++ b/flight/PiOS/inc/pios_usbhook.h @@ -1,5 +1,5 @@ /******************** (C) COPYRIGHT 2010 STMicroelectronics ******************** -* File Name : usb_prop.h +* File Name : pios_usbhook.h * Author : MCD Application Team * Version : V3.2.1 * Date : 07/05/2010 @@ -14,8 +14,8 @@ *******************************************************************************/ /* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_PROP_H -#define __USB_PROP_H +#ifndef PIOS_USBHOOK_H +#define PIOS_USBHOOK_H /* Includes ------------------------------------------------------------------*/ /* Exported types ------------------------------------------------------------*/ @@ -38,37 +38,9 @@ typedef enum CDC_REQUESTS { /* Exported constants --------------------------------------------------------*/ /* Exported macro ------------------------------------------------------------*/ /* Exported functions ------------------------------------------------------- */ -void PIOS_HID_init(void); -void PIOS_HID_Reset(void); -void PIOS_HID_SetConfiguration(void); -void PIOS_HID_SetDeviceAddress(void); -void PIOS_HID_Status_In(void); -void PIOS_HID_Status_Out(void); -RESULT PIOS_HID_Data_Setup(uint8_t); -RESULT PIOS_HID_NoData_Setup(uint8_t); -RESULT PIOS_HID_Get_Interface_Setting(uint8_t Interface, uint8_t AlternateSetting); -uint8_t *PIOS_HID_GetDeviceDescriptor(uint16_t); -uint8_t *PIOS_HID_GetConfigDescriptor(uint16_t); -uint8_t *PIOS_HID_GetStringDescriptor(uint16_t); -RESULT PIOS_HID_SetProtocol(void); -uint8_t *PIOS_HID_GetProtocolValue(uint16_t Length); -RESULT PIOS_HID_SetProtocol(void); -uint8_t *PIOS_HID_GetReportDescriptor(uint16_t Length); -uint8_t *PIOS_HID_GetHIDDescriptor(uint16_t Length); - /* Exported define -----------------------------------------------------------*/ -#define PIOS_HID_GetConfiguration NOP_Process -//#define PIOS_HID_SetConfiguration NOP_Process -#define PIOS_HID_GetInterface NOP_Process -#define PIOS_HID_SetInterface NOP_Process -#define PIOS_HID_GetStatus NOP_Process -#define PIOS_HID_ClearFeature NOP_Process -#define PIOS_HID_SetEndPointFeature NOP_Process -#define PIOS_HID_SetDeviceFeature NOP_Process -//#define PIOS_HID_SetDeviceAddress NOP_Process - #define REPORT_DESCRIPTOR 0x22 -#endif /* __USB_PROP_H */ +#endif /* PIOS_USBHOOK_H */ /******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/flight/PipXtreme/Makefile b/flight/PipXtreme/Makefile index ebb7254be..dc4d9bf5f 100644 --- a/flight/PipXtreme/Makefile +++ b/flight/PipXtreme/Makefile @@ -115,11 +115,11 @@ SRC += $(PIOSSTM32F10X)/pios_ppm.c # PIOS USB related files (seperated to make code maintenance more easy) ifeq ($(USE_USB), YES) + SRC += $(PIOSSTM32F10X)/pios_usbhook.c SRC += $(PIOSSTM32F10X)/pios_usb_hid.c #SRC += $(PIOSSTM32F10X)/pios_usb_hid_desc.c #SRC += $(PIOSSTM32F10X)/pios_usb_hid_endp.c SRC += $(PIOSSTM32F10X)/pios_usb_hid_istr.c - SRC += $(PIOSSTM32F10X)/pios_usb_hid_prop.c SRC += $(PIOSSTM32F10X)/pios_usb_hid_pwr.c SRC += $(PIOSSTM32F10X)/pios_usb_com.c endif From 617a30c07c69b6e2158e4a55caa50331add0ebc0 Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Sat, 10 Sep 2011 20:14:09 -0400 Subject: [PATCH 027/121] usb cdc: attach telemetry to CDC rather than HID --- flight/Modules/Telemetry/telemetry.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/flight/Modules/Telemetry/telemetry.c b/flight/Modules/Telemetry/telemetry.c index 3e935d089..266ae5313 100644 --- a/flight/Modules/Telemetry/telemetry.c +++ b/flight/Modules/Telemetry/telemetry.c @@ -311,7 +311,7 @@ static void telemetryRxTask(void *parameters) #if defined(PIOS_INCLUDE_USB_HID) // Determine input port (USB takes priority over telemetry port) if (PIOS_USB_HID_CheckAvailable(0)) { - inputPort = PIOS_COM_TELEM_USB_HID; + inputPort = PIOS_COM_TELEM_USB_CDC; } else #endif /* PIOS_INCLUDE_USB_HID */ { @@ -348,7 +348,7 @@ static int32_t transmitData(uint8_t * data, int32_t length) // Determine input port (USB takes priority over telemetry port) #if defined(PIOS_INCLUDE_USB_HID) if (PIOS_USB_HID_CheckAvailable(0)) { - outputPort = PIOS_COM_TELEM_USB_HID; + outputPort = PIOS_COM_TELEM_USB_CDC; } else #endif /* PIOS_INCLUDE_USB_HID */ { From e6ead85857fe9229b56b90997f7641c83a30b52f Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Mon, 12 Sep 2011 12:18:05 -0400 Subject: [PATCH 028/121] usb cdc: fix device descriptor to work on Mac Apple is very particular about requiring the bDeviceClass to be set to 2 (Commmunication Device) even for composite devices which seems wrong. Device is enumerated without error on Mac now. Not sure if it works though. --- flight/CopterControl/System/pios_usb_hid_desc.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flight/CopterControl/System/pios_usb_hid_desc.c b/flight/CopterControl/System/pios_usb_hid_desc.c index 2ca8f8246..b57191d67 100644 --- a/flight/CopterControl/System/pios_usb_hid_desc.c +++ b/flight/CopterControl/System/pios_usb_hid_desc.c @@ -27,9 +27,9 @@ const uint8_t PIOS_HID_DeviceDescriptor[PIOS_HID_SIZ_DEVICE_DESC] = USB_DEVICE_DESCRIPTOR_TYPE, // bDescriptorType 0x00, // bcdUSB 0x02, - 0xEF, // bDeviceClass (Misc) - 0x02, // bDeviceSubClass (common) - 0x01, // bDeviceProtocol (IAD) + 0x02, // bDeviceClass (Communication Device) + 0x00, // bDeviceSubClass (Use Interface SubClass) + 0x00, // bDeviceProtocol 0x40, // bMaxPacketSize40 (uint8_t)((PIOS_USB_VENDOR_ID) & 0xff), // idVendor (uint8_t)((PIOS_USB_VENDOR_ID) >> 8), From eebdda6276dcdc8610e2fb1b9a51a176fad344a3 Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Wed, 14 Sep 2011 17:04:15 -0400 Subject: [PATCH 029/121] usb cdc: make HID/CDC configurable in hwsettings --- flight/Bootloaders/CopterControl/main.c | 4 +- flight/Bootloaders/CopterControl/op_dfu.c | 8 +- flight/Bootloaders/CopterControl/pios_board.c | 4 +- flight/Bootloaders/OpenPilot/main.c | 4 +- flight/Bootloaders/OpenPilot/op_dfu.c | 8 +- flight/Bootloaders/OpenPilot/pios_board.c | 5 +- flight/Bootloaders/PipXtreme/main.c | 4 +- flight/Bootloaders/PipXtreme/op_dfu.c | 10 +-- flight/Bootloaders/PipXtreme/pios_board.c | 4 +- flight/CopterControl/System/pios_board.c | 74 ++++++++++++------- flight/Modules/Telemetry/telemetry.c | 4 +- flight/OpenPilot/System/pios_board.c | 5 +- flight/PiOS/Boards/STM32103CB_CC_Rev1.h | 7 +- .../PiOS/Boards/STM32103CB_PIPXTREME_Rev1.h | 4 +- flight/PiOS/Boards/STM3210E_OP.h | 7 +- flight/PipXtreme/api_config.c | 2 +- flight/PipXtreme/pios_board.c | 5 +- flight/PipXtreme/transparent_comms.c | 2 +- shared/uavobjectdefinition/hwsettings.xml | 1 + 19 files changed, 86 insertions(+), 76 deletions(-) diff --git a/flight/Bootloaders/CopterControl/main.c b/flight/Bootloaders/CopterControl/main.c index e60696115..aa375a49c 100644 --- a/flight/Bootloaders/CopterControl/main.c +++ b/flight/Bootloaders/CopterControl/main.c @@ -198,8 +198,8 @@ uint32_t LedPWM(uint32_t pwm_period, uint32_t pwm_sweep_steps, uint32_t count) { } uint8_t processRX() { - while (PIOS_COM_ReceiveBufferUsed(PIOS_COM_TELEM_USB_HID) >= 63) { - if (PIOS_COM_ReceiveBuffer(PIOS_COM_TELEM_USB_HID, mReceive_Buffer, 63, 0) == 63) { + while (PIOS_COM_ReceiveBufferUsed(PIOS_COM_TELEM_USB) >= 63) { + if (PIOS_COM_ReceiveBuffer(PIOS_COM_TELEM_USB, mReceive_Buffer, 63, 0) == 63) { processComand(mReceive_Buffer); } } diff --git a/flight/Bootloaders/CopterControl/op_dfu.c b/flight/Bootloaders/CopterControl/op_dfu.c index dc2b1836d..b45e1e798 100644 --- a/flight/Bootloaders/CopterControl/op_dfu.c +++ b/flight/Bootloaders/CopterControl/op_dfu.c @@ -113,7 +113,7 @@ void processComand(uint8_t *xReceive_Buffer) { #ifdef DEBUG_SSP char str[63]= {0}; sprintf(str,"Received COMMAND:%d|",Command); - PIOS_COM_SendString(PIOS_COM_TELEM_USB_HID,str); + PIOS_COM_SendString(PIOS_COM_TELEM_USB,str); #endif EchoReqFlag = (Command >> 7); EchoAnsFlag = (Command >> 6) & 0x01; @@ -324,11 +324,11 @@ void processComand(uint8_t *xReceive_Buffer) { case Download_Req: #ifdef DEBUG_SSP sprintf(str,"COMMAND:DOWNLOAD_REQ 1 Status=%d|",DeviceState); - PIOS_COM_SendString(PIOS_COM_TELEM_USB_HID,str); + PIOS_COM_SendString(PIOS_COM_TELEM_USB,str); #endif if (DeviceState == DFUidle) { #ifdef DEBUG_SSP - PIOS_COM_SendString(PIOS_COM_TELEM_USB_HID,"COMMAND:DOWNLOAD_REQ 1|"); + PIOS_COM_SendString(PIOS_COM_TELEM_USB,"COMMAND:DOWNLOAD_REQ 1|"); #endif downType = Data0; downPacketTotal = Count; @@ -442,7 +442,7 @@ uint32_t CalcFirmCRC() { } void sendData(uint8_t * buf, uint16_t size) { - PIOS_COM_SendBuffer(PIOS_COM_TELEM_USB_HID, buf, size); + PIOS_COM_SendBuffer(PIOS_COM_TELEM_USB, buf, size); if (DeviceState == downloading) PIOS_DELAY_WaitmS(20);//this is an hack, we should check wtf is wrong with hid } diff --git a/flight/Bootloaders/CopterControl/pios_board.c b/flight/Bootloaders/CopterControl/pios_board.c index 118143679..e017e8282 100644 --- a/flight/Bootloaders/CopterControl/pios_board.c +++ b/flight/Bootloaders/CopterControl/pios_board.c @@ -68,7 +68,7 @@ const struct pios_usb_com_cfg pios_usb_com_hid_cfg = { #endif /* PIOS_INCLUDE_USB_COM */ -uint32_t pios_com_telem_usb_hid_id; +uint32_t pios_com_telem_usb_id; /** * PIOS_Board_Init() @@ -103,7 +103,7 @@ void PIOS_Board_Init(void) { if (PIOS_USB_COM_Init(&pios_usb_com_id, &pios_usb_com_hid_cfg, pios_usb_id)) { PIOS_Assert(0); } - if (PIOS_COM_Init(&pios_com_telem_usb_hid_id, &pios_usb_hid_com_driver, pios_usb_com_id, + if (PIOS_COM_Init(&pios_com_telem_usb_id, &pios_usb_hid_com_driver, pios_usb_com_id, pios_com_telem_usb_rx_buffer, sizeof(pios_com_telem_usb_rx_buffer), pios_com_telem_usb_tx_buffer, sizeof(pios_com_telem_usb_tx_buffer))) { PIOS_Assert(0); diff --git a/flight/Bootloaders/OpenPilot/main.c b/flight/Bootloaders/OpenPilot/main.c index 25f38fdb9..8e15952ea 100644 --- a/flight/Bootloaders/OpenPilot/main.c +++ b/flight/Bootloaders/OpenPilot/main.c @@ -249,8 +249,8 @@ uint32_t LedPWM(uint32_t pwm_period, uint32_t pwm_sweep_steps, uint32_t count) { uint8_t processRX() { if (ProgPort == Usb) { - while (PIOS_COM_ReceiveBufferUsed(PIOS_COM_TELEM_USB_HID) >= 63) { - if (PIOS_COM_ReceiveBuffer(PIOS_COM_TELEM_USB_HID, mReceive_Buffer, 63, 0) == 63) { + while (PIOS_COM_ReceiveBufferUsed(PIOS_COM_TELEM_USB) >= 63) { + if (PIOS_COM_ReceiveBuffer(PIOS_COM_TELEM_USB, mReceive_Buffer, 63, 0) == 63) { processComand(mReceive_Buffer); } } diff --git a/flight/Bootloaders/OpenPilot/op_dfu.c b/flight/Bootloaders/OpenPilot/op_dfu.c index 102dca079..bc62fff6c 100644 --- a/flight/Bootloaders/OpenPilot/op_dfu.c +++ b/flight/Bootloaders/OpenPilot/op_dfu.c @@ -121,7 +121,7 @@ void processComand(uint8_t *xReceive_Buffer) { #ifdef DEBUG_SSP char str[63]= {0}; sprintf(str,"Received COMMAND:%d|",Command); - PIOS_COM_SendString(PIOS_COM_TELEM_USB_HID,str); + PIOS_COM_SendString(PIOS_COM_TELEM_USB,str); #endif EchoReqFlag = (Command >> 7); EchoAnsFlag = (Command >> 6) & 0x01; @@ -389,11 +389,11 @@ void processComand(uint8_t *xReceive_Buffer) { case Download_Req: #ifdef DEBUG_SSP sprintf(str,"COMMAND:DOWNLOAD_REQ 1 Status=%d|",DeviceState); - PIOS_COM_SendString(PIOS_COM_TELEM_USB_HID,str); + PIOS_COM_SendString(PIOS_COM_TELEM_USB,str); #endif if (DeviceState == DFUidle) { #ifdef DEBUG_SSP - PIOS_COM_SendString(PIOS_COM_TELEM_USB_HID,"COMMAND:DOWNLOAD_REQ 1|"); + PIOS_COM_SendString(PIOS_COM_TELEM_USB,"COMMAND:DOWNLOAD_REQ 1|"); #endif downType = Data0; downPacketTotal = Count; @@ -551,7 +551,7 @@ uint32_t CalcFirmCRC() { void sendData(uint8_t * buf, uint16_t size) { if (ProgPort == Usb) { - PIOS_COM_SendBuffer(PIOS_COM_TELEM_USB_HID, buf, size); + PIOS_COM_SendBuffer(PIOS_COM_TELEM_USB, buf, size); if (DeviceState == downloading) PIOS_DELAY_WaitmS(10); diff --git a/flight/Bootloaders/OpenPilot/pios_board.c b/flight/Bootloaders/OpenPilot/pios_board.c index 0da0f1a4a..9e8db4723 100644 --- a/flight/Bootloaders/OpenPilot/pios_board.c +++ b/flight/Bootloaders/OpenPilot/pios_board.c @@ -226,8 +226,7 @@ const struct pios_usb_com_cfg pios_usb_com_hid_cfg = { #endif /* PIOS_INCLUDE_USB_COM */ uint32_t pios_com_telem_rf_id; -uint32_t pios_com_telem_usb_hid_id; -uint32_t pios_com_telem_usb_cdc_id; +uint32_t pios_com_telem_usb_id; #include "pios_opahrs.h" @@ -275,7 +274,7 @@ void PIOS_Board_Init(void) { if (PIOS_USB_COM_Init(&pios_usb_com_id, &pios_usb_com_hid_cfg, pios_usb_id)) { PIOS_Assert(0); } - if (PIOS_COM_Init(&pios_com_telem_usb_hid_id, &pios_usb_hid_com_driver, pios_usb_com_id, + if (PIOS_COM_Init(&pios_com_telem_usb_id, &pios_usb_hid_com_driver, pios_usb_com_id, pios_com_telem_usb_rx_buffer, sizeof(pios_com_telem_usb_rx_buffer), pios_com_telem_usb_tx_buffer, sizeof(pios_com_telem_usb_tx_buffer))) { PIOS_Assert(0); diff --git a/flight/Bootloaders/PipXtreme/main.c b/flight/Bootloaders/PipXtreme/main.c index 4161657c8..3f1c4bd54 100644 --- a/flight/Bootloaders/PipXtreme/main.c +++ b/flight/Bootloaders/PipXtreme/main.c @@ -204,8 +204,8 @@ uint32_t LedPWM(uint32_t pwm_period, uint32_t pwm_sweep_steps, uint32_t count) { } uint8_t processRX() { - while (PIOS_COM_ReceiveBufferUsed(PIOS_COM_TELEM_USB_HID) >= 63) { - if (PIOS_COM_ReceiveBuffer(PIOS_COM_TELEM_USB_HID, mReceive_Buffer, 63, 0) == 63) { + while (PIOS_COM_ReceiveBufferUsed(PIOS_COM_TELEM_USB) >= 63) { + if (PIOS_COM_ReceiveBuffer(PIOS_COM_TELEM_USB, mReceive_Buffer, 63, 0) == 63) { processComand(mReceive_Buffer); } } diff --git a/flight/Bootloaders/PipXtreme/op_dfu.c b/flight/Bootloaders/PipXtreme/op_dfu.c index c5c465ab3..770ce8237 100644 --- a/flight/Bootloaders/PipXtreme/op_dfu.c +++ b/flight/Bootloaders/PipXtreme/op_dfu.c @@ -141,7 +141,7 @@ void processComand(uint8_t *xReceive_Buffer) { #ifdef DEBUG_SSP char str[63]= {0}; sprintf(str,"Received COMMAND:%d|",Command); - PIOS_COM_SendString(PIOS_COM_TELEM_USB_HID,str); + PIOS_COM_SendString(PIOS_COM_TELEM_USB,str); #endif EchoReqFlag = (Command >> 7); EchoAnsFlag = (Command >> 6) & 0x01; @@ -322,7 +322,7 @@ void processComand(uint8_t *xReceive_Buffer) { Buffer[15] = devicesTable[Data0 - 1].devID; } sendData(Buffer + 1, 63); - //PIOS_COM_SendBuffer(PIOS_COM_TELEM_USB_HID, Buffer + 1, 63);//FIX+1 + //PIOS_COM_SendBuffer(PIOS_COM_TELEM_USB, Buffer + 1, 63);//FIX+1 break; case JumpFW: FLASH_Lock(); @@ -356,11 +356,11 @@ void processComand(uint8_t *xReceive_Buffer) { case Download_Req: #ifdef DEBUG_SSP sprintf(str,"COMMAND:DOWNLOAD_REQ 1 Status=%d|",DeviceState); - PIOS_COM_SendString(PIOS_COM_TELEM_USB_HID,str); + PIOS_COM_SendString(PIOS_COM_TELEM_USB,str); #endif if (DeviceState == DFUidle) { #ifdef DEBUG_SSP - PIOS_COM_SendString(PIOS_COM_TELEM_USB_HID,"COMMAND:DOWNLOAD_REQ 1|"); + PIOS_COM_SendString(PIOS_COM_TELEM_USB,"COMMAND:DOWNLOAD_REQ 1|"); #endif downType = Data0; downPacketTotal = Count; @@ -474,7 +474,7 @@ uint32_t CalcFirmCRC() { } void sendData(uint8_t * buf, uint16_t size) { - PIOS_COM_SendBuffer(PIOS_COM_TELEM_USB_HID, buf, size); + PIOS_COM_SendBuffer(PIOS_COM_TELEM_USB, buf, size); if (DeviceState == downloading) PIOS_DELAY_WaitmS(10); } diff --git a/flight/Bootloaders/PipXtreme/pios_board.c b/flight/Bootloaders/PipXtreme/pios_board.c index 118143679..e017e8282 100644 --- a/flight/Bootloaders/PipXtreme/pios_board.c +++ b/flight/Bootloaders/PipXtreme/pios_board.c @@ -68,7 +68,7 @@ const struct pios_usb_com_cfg pios_usb_com_hid_cfg = { #endif /* PIOS_INCLUDE_USB_COM */ -uint32_t pios_com_telem_usb_hid_id; +uint32_t pios_com_telem_usb_id; /** * PIOS_Board_Init() @@ -103,7 +103,7 @@ void PIOS_Board_Init(void) { if (PIOS_USB_COM_Init(&pios_usb_com_id, &pios_usb_com_hid_cfg, pios_usb_id)) { PIOS_Assert(0); } - if (PIOS_COM_Init(&pios_com_telem_usb_hid_id, &pios_usb_hid_com_driver, pios_usb_com_id, + if (PIOS_COM_Init(&pios_com_telem_usb_id, &pios_usb_hid_com_driver, pios_usb_com_id, pios_com_telem_usb_rx_buffer, sizeof(pios_com_telem_usb_rx_buffer), pios_com_telem_usb_tx_buffer, sizeof(pios_com_telem_usb_tx_buffer))) { PIOS_Assert(0); diff --git a/flight/CopterControl/System/pios_board.c b/flight/CopterControl/System/pios_board.c index 76cf473c1..716e170df 100644 --- a/flight/CopterControl/System/pios_board.c +++ b/flight/CopterControl/System/pios_board.c @@ -1101,8 +1101,7 @@ const struct pios_usb_com_cfg pios_usb_com_cdc_cfg = { #endif /* PIOS_INCLUDE_USB_COM */ uint32_t pios_com_telem_rf_id; -uint32_t pios_com_telem_usb_hid_id; -uint32_t pios_com_telem_usb_cdc_id; +uint32_t pios_com_telem_usb_id; uint32_t pios_com_gps_id; /** @@ -1436,34 +1435,53 @@ void PIOS_Board_Init(void) { #if defined(PIOS_INCLUDE_USB_HID) uint32_t pios_usb_id; PIOS_USB_Init(&pios_usb_id, &pios_usb_main_cfg); -#if defined(PIOS_INCLUDE_COM) - uint32_t pios_usb_com_id; - if (PIOS_USB_COM_Init(&pios_usb_com_id, &pios_usb_com_hid_cfg, pios_usb_id)) { - PIOS_Assert(0); - } - uint8_t * rx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_TELEM_USB_RX_BUF_LEN); - uint8_t * tx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_TELEM_USB_TX_BUF_LEN); - PIOS_Assert(rx_buffer); - PIOS_Assert(tx_buffer); - if (PIOS_COM_Init(&pios_com_telem_usb_hid_id, &pios_usb_hid_com_driver, pios_usb_com_id, - rx_buffer, PIOS_COM_TELEM_USB_RX_BUF_LEN, - tx_buffer, PIOS_COM_TELEM_USB_TX_BUF_LEN)) { - PIOS_Assert(0); - } - if (PIOS_USB_COM_Init(&pios_usb_com_id, &pios_usb_com_cdc_cfg, pios_usb_id)) { - PIOS_Assert(0); - } - uint8_t * rx_buffer2 = (uint8_t *) pvPortMalloc(PIOS_COM_TELEM_USB_RX_BUF_LEN); - uint8_t * tx_buffer2 = (uint8_t *) pvPortMalloc(PIOS_COM_TELEM_USB_TX_BUF_LEN); - PIOS_Assert(rx_buffer2); - PIOS_Assert(tx_buffer2); - if (PIOS_COM_Init(&pios_com_telem_usb_cdc_id, &pios_usb_cdc_com_driver, pios_usb_com_id, - rx_buffer2, PIOS_COM_TELEM_USB_RX_BUF_LEN, - tx_buffer2, PIOS_COM_TELEM_USB_TX_BUF_LEN)) { - PIOS_Assert(0); - } + /* Configure the usb telemetry protocol */ + uint8_t hwsettings_usb_telemetry_channel; + HwSettingsUSB_TelemetryChannelGet(&hwsettings_usb_telemetry_channel); + + switch (hwsettings_usb_telemetry_channel) { + case HWSETTINGS_USB_TELEMETRYCHANNEL_HID: +#if defined(PIOS_INCLUDE_COM) + { + uint32_t pios_usb_com_id; + if (PIOS_USB_COM_Init(&pios_usb_com_id, &pios_usb_com_hid_cfg, pios_usb_id)) { + PIOS_Assert(0); + } + uint8_t * rx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_TELEM_USB_RX_BUF_LEN); + uint8_t * tx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_TELEM_USB_TX_BUF_LEN); + PIOS_Assert(rx_buffer); + PIOS_Assert(tx_buffer); + if (PIOS_COM_Init(&pios_com_telem_usb_id, &pios_usb_hid_com_driver, pios_usb_com_id, + rx_buffer, PIOS_COM_TELEM_USB_RX_BUF_LEN, + tx_buffer, PIOS_COM_TELEM_USB_TX_BUF_LEN)) { + PIOS_Assert(0); + } + } #endif /* PIOS_INCLUDE_COM */ + break; + case HWSETTINGS_USB_TELEMETRYCHANNEL_CDC: +#if defined(PIOS_INCLUDE_COM) + { + uint32_t pios_usb_com_id; + if (PIOS_USB_COM_Init(&pios_usb_com_id, &pios_usb_com_cdc_cfg, pios_usb_id)) { + PIOS_Assert(0); + } + uint8_t * rx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_TELEM_USB_RX_BUF_LEN); + uint8_t * tx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_TELEM_USB_TX_BUF_LEN); + PIOS_Assert(rx_buffer); + PIOS_Assert(tx_buffer); + if (PIOS_COM_Init(&pios_com_telem_usb_id, &pios_usb_cdc_com_driver, pios_usb_com_id, + rx_buffer, PIOS_COM_TELEM_USB_RX_BUF_LEN, + tx_buffer, PIOS_COM_TELEM_USB_TX_BUF_LEN)) { + PIOS_Assert(0); + } + } +#endif /* PIOS_INCLUDE_COM */ + break; + default: + PIOS_Assert(0); + } #endif /* PIOS_INCLUDE_USB_HID */ PIOS_IAP_Init(); diff --git a/flight/Modules/Telemetry/telemetry.c b/flight/Modules/Telemetry/telemetry.c index 266ae5313..e0f8b2d5f 100644 --- a/flight/Modules/Telemetry/telemetry.c +++ b/flight/Modules/Telemetry/telemetry.c @@ -311,7 +311,7 @@ static void telemetryRxTask(void *parameters) #if defined(PIOS_INCLUDE_USB_HID) // Determine input port (USB takes priority over telemetry port) if (PIOS_USB_HID_CheckAvailable(0)) { - inputPort = PIOS_COM_TELEM_USB_CDC; + inputPort = PIOS_COM_TELEM_USB; } else #endif /* PIOS_INCLUDE_USB_HID */ { @@ -348,7 +348,7 @@ static int32_t transmitData(uint8_t * data, int32_t length) // Determine input port (USB takes priority over telemetry port) #if defined(PIOS_INCLUDE_USB_HID) if (PIOS_USB_HID_CheckAvailable(0)) { - outputPort = PIOS_COM_TELEM_USB_CDC; + outputPort = PIOS_COM_TELEM_USB; } else #endif /* PIOS_INCLUDE_USB_HID */ { diff --git a/flight/OpenPilot/System/pios_board.c b/flight/OpenPilot/System/pios_board.c index f5cbfac43..df2ea246d 100644 --- a/flight/OpenPilot/System/pios_board.c +++ b/flight/OpenPilot/System/pios_board.c @@ -1069,8 +1069,7 @@ const struct pios_usb_com_cfg pios_usb_com_hid_cfg = { #endif /* PIOS_INCLUDE_USB_COM */ uint32_t pios_com_telem_rf_id; -uint32_t pios_com_telem_usb_hid_id; -uint32_t pios_com_telem_usb_cdc_id; +uint32_t pios_com_telem_usb_id; uint32_t pios_com_gps_id; uint32_t pios_com_aux_id; uint32_t pios_com_dsm_id; @@ -1299,7 +1298,7 @@ void PIOS_Board_Init(void) { uint8_t * tx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_TELEM_USB_TX_BUF_LEN); PIOS_Assert(rx_buffer); PIOS_Assert(tx_buffer); - if (PIOS_COM_Init(&pios_com_telem_usb_hid_id, &pios_usb_hid_com_driver, pios_usb_com_id, + if (PIOS_COM_Init(&pios_com_telem_usb_id, &pios_usb_hid_com_driver, pios_usb_com_id, rx_buffer, PIOS_COM_TELEM_USB_RX_BUF_LEN, tx_buffer, PIOS_COM_TELEM_USB_TX_BUF_LEN)) { PIOS_Assert(0); diff --git a/flight/PiOS/Boards/STM32103CB_CC_Rev1.h b/flight/PiOS/Boards/STM32103CB_CC_Rev1.h index f585fbee4..a88589ed2 100644 --- a/flight/PiOS/Boards/STM32103CB_CC_Rev1.h +++ b/flight/PiOS/Boards/STM32103CB_CC_Rev1.h @@ -141,11 +141,8 @@ extern uint32_t pios_com_gps_id; #define PIOS_COM_GPS (pios_com_gps_id) #endif /* PIOS_INCLUDE_GPS */ -extern uint32_t pios_com_telem_usb_hid_id; -#define PIOS_COM_TELEM_USB_HID (pios_com_telem_usb_hid_id) - -extern uint32_t pios_com_telem_usb_cdc_id; -#define PIOS_COM_TELEM_USB_CDC (pios_com_telem_usb_cdc_id) +extern uint32_t pios_com_telem_usb_id; +#define PIOS_COM_TELEM_USB (pios_com_telem_usb_id) //------------------------- // ADC diff --git a/flight/PiOS/Boards/STM32103CB_PIPXTREME_Rev1.h b/flight/PiOS/Boards/STM32103CB_PIPXTREME_Rev1.h index 4fcf034da..e29a6249b 100644 --- a/flight/PiOS/Boards/STM32103CB_PIPXTREME_Rev1.h +++ b/flight/PiOS/Boards/STM32103CB_PIPXTREME_Rev1.h @@ -156,8 +156,8 @@ extern uint32_t pios_com_serial_id; //#define PIOS_COM_DEBUG PIOS_COM_SERIAL // uncomment this to send debug info out the serial port #if defined(PIOS_INCLUDE_USB_HID) -extern uint32_t pios_com_telem_usb_hid_id; -#define PIOS_COM_TELEM_USB_HID (pios_com_telem_usb_hid_id) +extern uint32_t pios_com_telem_usb_id; +#define PIOS_COM_TELEM_USB (pios_com_telem_usb_id) #endif #if defined(PIOS_COM_DEBUG) diff --git a/flight/PiOS/Boards/STM3210E_OP.h b/flight/PiOS/Boards/STM3210E_OP.h index 72732c0d0..2d1c80038 100644 --- a/flight/PiOS/Boards/STM3210E_OP.h +++ b/flight/PiOS/Boards/STM3210E_OP.h @@ -152,11 +152,8 @@ extern uint32_t pios_com_telem_rf_id; extern uint32_t pios_com_gps_id; #define PIOS_COM_GPS (pios_com_gps_id) -extern uint32_t pios_com_telem_usb_hid_id; -#define PIOS_COM_TELEM_USB_HID (pios_com_telem_usb_hid_id) - -extern uint32_t pios_com_telem_usb_cdc_id; -#define PIOS_COM_TELEM_USB_CDC (pios_com_telem_usb_cdc_id) +extern uint32_t pios_com_telem_usb_id; +#define PIOS_COM_TELEM_USB (pios_com_telem_usb_id) #ifdef PIOS_ENABLE_AUX_UART extern uint32_t pios_com_aux_id; diff --git a/flight/PipXtreme/api_config.c b/flight/PipXtreme/api_config.c index 5f476e330..2cecfc65e 100644 --- a/flight/PipXtreme/api_config.c +++ b/flight/PipXtreme/api_config.c @@ -777,7 +777,7 @@ void apiconfig_process(void) if (PIOS_USB_HID_CheckAvailable(0)) { // USB comms is up, use the USB comm-port instead of the USART comm-port apiconfig_usb_comms = true; - apiconfig_comm_port = PIOS_COM_TELEM_USB_HID; + apiconfig_comm_port = PIOS_COM_TELEM_USB; } #endif diff --git a/flight/PipXtreme/pios_board.c b/flight/PipXtreme/pios_board.c index 5f0b49964..99fade5e1 100644 --- a/flight/PipXtreme/pios_board.c +++ b/flight/PipXtreme/pios_board.c @@ -339,8 +339,7 @@ const struct pios_usb_com_cfg pios_usb_com_hid_cfg = { #endif /* PIOS_INCLUDE_USB_COM */ uint32_t pios_com_serial_id; -uint32_t pios_com_telem_usb_hid_id; -uint32_t pios_com_telem_usb_cdc_id; +uint32_t pios_com_telem_usb_id; /** * PIOS_Board_Init() @@ -378,7 +377,7 @@ void PIOS_Board_Init(void) { if (PIOS_USB_COM_Init(&pios_usb_com_id, &pios_usb_com_hid_cfg, pios_usb_id)) { PIOS_Assert(0); } - if (PIOS_COM_Init(&pios_com_telem_usb_hid_id, &pios_usb_hid_com_driver, pios_usb_com_id, + if (PIOS_COM_Init(&pios_com_telem_usb_id, &pios_usb_hid_com_driver, pios_usb_com_id, pios_com_telem_usb_rx_buffer, sizeof(pios_com_telem_usb_rx_buffer), pios_com_telem_usb_tx_buffer, sizeof(pios_com_telem_usb_tx_buffer))) { PIOS_Assert(0); diff --git a/flight/PipXtreme/transparent_comms.c b/flight/PipXtreme/transparent_comms.c index aebbc20a7..b30f5f581 100644 --- a/flight/PipXtreme/transparent_comms.c +++ b/flight/PipXtreme/transparent_comms.c @@ -74,7 +74,7 @@ void trans_process(void) if (PIOS_USB_HID_CheckAvailable(0)) { // USB comms is up, use the USB comm-port instead of the USART comm-port usb_comms = true; - comm_port = PIOS_COM_TELEM_USB_HID; + comm_port = PIOS_COM_TELEM_USB; } #endif diff --git a/shared/uavobjectdefinition/hwsettings.xml b/shared/uavobjectdefinition/hwsettings.xml index 9ec859fa3..0b77d0857 100644 --- a/shared/uavobjectdefinition/hwsettings.xml +++ b/shared/uavobjectdefinition/hwsettings.xml @@ -11,6 +11,7 @@ + From 504cf3417fd58d68a170731f4bf1cf32bb28cd37 Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Wed, 21 Dec 2011 21:03:41 -0500 Subject: [PATCH 030/121] init: collapse usart definitions for generic usage Telemetry and GPS usarts are generic users of the uart devices. This collapses the duplicated usart configuration structs into a single generic one. --- flight/CopterControl/System/pios_board.c | 110 +++-------------------- 1 file changed, 14 insertions(+), 96 deletions(-) diff --git a/flight/CopterControl/System/pios_board.c b/flight/CopterControl/System/pios_board.c index 716e170df..a5131bf10 100644 --- a/flight/CopterControl/System/pios_board.c +++ b/flight/CopterControl/System/pios_board.c @@ -541,11 +541,7 @@ static const struct pios_tim_channel pios_tim_servoport_rcvrport_pins[] = { #include "pios_usart_priv.h" -#if defined(PIOS_INCLUDE_TELEMETRY_RF) -/* - * Telemetry USART - */ -static const struct pios_usart_cfg pios_usart_telem_main_cfg = { +static const struct pios_usart_cfg pios_usart_generic_main_cfg = { .regs = USART1, .init = { .USART_BaudRate = 57600, @@ -581,7 +577,7 @@ static const struct pios_usart_cfg pios_usart_telem_main_cfg = { }, }; -static const struct pios_usart_cfg pios_usart_telem_flexi_cfg = { +static const struct pios_usart_cfg pios_usart_generic_flexi_cfg = { .regs = USART3, .init = { .USART_BaudRate = 57600, @@ -616,84 +612,6 @@ static const struct pios_usart_cfg pios_usart_telem_flexi_cfg = { }, }, }; -#endif /* PIOS_INCLUDE_TELEMETRY_RF */ - -#if defined(PIOS_INCLUDE_GPS) -/* - * GPS USART - */ -static const struct pios_usart_cfg pios_usart_gps_main_cfg = { - .regs = USART1, - .init = { - .USART_BaudRate = 57600, - .USART_WordLength = USART_WordLength_8b, - .USART_Parity = USART_Parity_No, - .USART_StopBits = USART_StopBits_1, - .USART_HardwareFlowControl = USART_HardwareFlowControl_None, - .USART_Mode = USART_Mode_Rx | USART_Mode_Tx, - }, - .irq = { - .init = { - .NVIC_IRQChannel = USART1_IRQn, - .NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_MID, - .NVIC_IRQChannelSubPriority = 0, - .NVIC_IRQChannelCmd = ENABLE, - }, - }, - .rx = { - .gpio = GPIOA, - .init = { - .GPIO_Pin = GPIO_Pin_10, - .GPIO_Speed = GPIO_Speed_2MHz, - .GPIO_Mode = GPIO_Mode_IPU, - }, - }, - .tx = { - .gpio = GPIOA, - .init = { - .GPIO_Pin = GPIO_Pin_9, - .GPIO_Speed = GPIO_Speed_2MHz, - .GPIO_Mode = GPIO_Mode_AF_PP, - }, - }, -}; - -static const struct pios_usart_cfg pios_usart_gps_flexi_cfg = { - .regs = USART3, - .init = { - .USART_BaudRate = 57600, - .USART_WordLength = USART_WordLength_8b, - .USART_Parity = USART_Parity_No, - .USART_StopBits = USART_StopBits_1, - .USART_HardwareFlowControl = USART_HardwareFlowControl_None, - .USART_Mode = USART_Mode_Rx | USART_Mode_Tx, - }, - .irq = { - .init = { - .NVIC_IRQChannel = USART3_IRQn, - .NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_MID, - .NVIC_IRQChannelSubPriority = 0, - .NVIC_IRQChannelCmd = ENABLE, - }, - }, - .rx = { - .gpio = GPIOB, - .init = { - .GPIO_Pin = GPIO_Pin_11, - .GPIO_Speed = GPIO_Speed_2MHz, - .GPIO_Mode = GPIO_Mode_IPU, - }, - }, - .tx = { - .gpio = GPIOB, - .init = { - .GPIO_Pin = GPIO_Pin_10, - .GPIO_Speed = GPIO_Speed_2MHz, - .GPIO_Mode = GPIO_Mode_AF_PP, - }, - }, -}; -#endif /* PIOS_INCLUDE_GPS */ #if defined(PIOS_INCLUDE_DSM) /* @@ -1159,8 +1077,8 @@ void PIOS_Board_Init(void) { case HWSETTINGS_CC_MAINPORT_TELEMETRY: #if defined(PIOS_INCLUDE_TELEMETRY_RF) { - uint32_t pios_usart_telem_rf_id; - if (PIOS_USART_Init(&pios_usart_telem_rf_id, &pios_usart_telem_main_cfg)) { + uint32_t pios_usart_generic_id; + if (PIOS_USART_Init(&pios_usart_generic_id, &pios_usart_generic_main_cfg)) { PIOS_Assert(0); } @@ -1168,7 +1086,7 @@ void PIOS_Board_Init(void) { uint8_t * tx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_TELEM_RF_TX_BUF_LEN); PIOS_Assert(rx_buffer); PIOS_Assert(tx_buffer); - if (PIOS_COM_Init(&pios_com_telem_rf_id, &pios_usart_com_driver, pios_usart_telem_rf_id, + if (PIOS_COM_Init(&pios_com_telem_rf_id, &pios_usart_com_driver, pios_usart_generic_id, rx_buffer, PIOS_COM_TELEM_RF_RX_BUF_LEN, tx_buffer, PIOS_COM_TELEM_RF_TX_BUF_LEN)) { PIOS_Assert(0); @@ -1201,14 +1119,14 @@ void PIOS_Board_Init(void) { case HWSETTINGS_CC_MAINPORT_GPS: #if defined(PIOS_INCLUDE_GPS) { - uint32_t pios_usart_gps_id; - if (PIOS_USART_Init(&pios_usart_gps_id, &pios_usart_gps_main_cfg)) { + uint32_t pios_usart_generic_id; + if (PIOS_USART_Init(&pios_usart_generic_id, &pios_usart_generic_main_cfg)) { PIOS_Assert(0); } uint8_t * rx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_GPS_RX_BUF_LEN); PIOS_Assert(rx_buffer); - if (PIOS_COM_Init(&pios_com_gps_id, &pios_usart_com_driver, pios_usart_gps_id, + if (PIOS_COM_Init(&pios_com_gps_id, &pios_usart_com_driver, pios_usart_generic_id, rx_buffer, PIOS_COM_GPS_RX_BUF_LEN, NULL, 0)) { PIOS_Assert(0); @@ -1273,15 +1191,15 @@ void PIOS_Board_Init(void) { case HWSETTINGS_CC_FLEXIPORT_TELEMETRY: #if defined(PIOS_INCLUDE_TELEMETRY_RF) { - uint32_t pios_usart_telem_rf_id; - if (PIOS_USART_Init(&pios_usart_telem_rf_id, &pios_usart_telem_flexi_cfg)) { + uint32_t pios_usart_generic_id; + if (PIOS_USART_Init(&pios_usart_generic_id, &pios_usart_generic_flexi_cfg)) { PIOS_Assert(0); } uint8_t * rx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_TELEM_RF_RX_BUF_LEN); uint8_t * tx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_TELEM_RF_TX_BUF_LEN); PIOS_Assert(rx_buffer); PIOS_Assert(tx_buffer); - if (PIOS_COM_Init(&pios_com_telem_rf_id, &pios_usart_com_driver, pios_usart_telem_rf_id, + if (PIOS_COM_Init(&pios_com_telem_rf_id, &pios_usart_com_driver, pios_usart_generic_id, rx_buffer, PIOS_COM_TELEM_RF_RX_BUF_LEN, tx_buffer, PIOS_COM_TELEM_RF_TX_BUF_LEN)) { PIOS_Assert(0); @@ -1292,13 +1210,13 @@ void PIOS_Board_Init(void) { case HWSETTINGS_CC_FLEXIPORT_GPS: #if defined(PIOS_INCLUDE_GPS) { - uint32_t pios_usart_gps_id; - if (PIOS_USART_Init(&pios_usart_gps_id, &pios_usart_gps_flexi_cfg)) { + uint32_t pios_usart_generic_id; + if (PIOS_USART_Init(&pios_usart_generic_id, &pios_usart_generic_flexi_cfg)) { PIOS_Assert(0); } uint8_t * rx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_GPS_RX_BUF_LEN); PIOS_Assert(rx_buffer); - if (PIOS_COM_Init(&pios_com_gps_id, &pios_usart_com_driver, pios_usart_gps_id, + if (PIOS_COM_Init(&pios_com_gps_id, &pios_usart_com_driver, pios_usart_generic_id, rx_buffer, PIOS_COM_GPS_RX_BUF_LEN, NULL, 0)) { PIOS_Assert(0); From 64f498e48a1ebf5f4585f8b44e62badece40df56 Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Wed, 21 Dec 2011 21:04:29 -0500 Subject: [PATCH 031/121] com-bridge: add usart to usb vcp bridge --- flight/CopterControl/Makefile | 2 +- flight/CopterControl/System/pios_board.c | 146 +++++++++++++-------- flight/Modules/ComUsbBridge/ComUsbBridge.c | 135 +++++++++++++++++++ flight/PiOS/Boards/STM32103CB_CC_Rev1.h | 6 + shared/uavobjectdefinition/hwsettings.xml | 4 +- 5 files changed, 237 insertions(+), 56 deletions(-) create mode 100644 flight/Modules/ComUsbBridge/ComUsbBridge.c diff --git a/flight/CopterControl/Makefile b/flight/CopterControl/Makefile index f0eb31cb9..66186ed86 100644 --- a/flight/CopterControl/Makefile +++ b/flight/CopterControl/Makefile @@ -70,7 +70,7 @@ ifeq ($(USE_GPS), YES) OPTMODULES += GPS endif -MODULES = Attitude Stabilization Actuator ManualControl FirmwareIAP +MODULES = Attitude Stabilization Actuator ManualControl FirmwareIAP ComUsbBridge # Telemetry must be last to grab the optional modules (why?) MODULES += Telemetry diff --git a/flight/CopterControl/System/pios_board.c b/flight/CopterControl/System/pios_board.c index a5131bf10..70c60d1bb 100644 --- a/flight/CopterControl/System/pios_board.c +++ b/flight/CopterControl/System/pios_board.c @@ -788,6 +788,9 @@ static const struct pios_sbus_cfg pios_sbus_cfg = { #define PIOS_COM_TELEM_USB_RX_BUF_LEN 192 #define PIOS_COM_TELEM_USB_TX_BUF_LEN 192 +#define PIOS_COM_BRIDGE_RX_BUF_LEN 65 +#define PIOS_COM_BRIDGE_TX_BUF_LEN 65 + #endif /* PIOS_INCLUDE_COM */ #if defined(PIOS_INCLUDE_RTC) @@ -1020,7 +1023,9 @@ const struct pios_usb_com_cfg pios_usb_com_cdc_cfg = { uint32_t pios_com_telem_rf_id; uint32_t pios_com_telem_usb_id; +uint32_t pios_com_vcp_id = 0; uint32_t pios_com_gps_id; +uint32_t pios_com_bridge_id = 0; /** * PIOS_Board_Init() @@ -1065,6 +1070,58 @@ void PIOS_Board_Init(void) { PIOS_TIM_InitClock(&tim_3_cfg); PIOS_TIM_InitClock(&tim_4_cfg); +#if defined(PIOS_INCLUDE_USB_HID) + uint32_t pios_usb_id; + PIOS_USB_Init(&pios_usb_id, &pios_usb_main_cfg); + + /* Configure the usb telemetry protocol */ + uint8_t hwsettings_usb_telemetry_channel; + HwSettingsUSB_TelemetryChannelGet(&hwsettings_usb_telemetry_channel); + + switch (hwsettings_usb_telemetry_channel) { + case HWSETTINGS_USB_TELEMETRYCHANNEL_HID: +#if defined(PIOS_INCLUDE_COM) + { + uint32_t pios_usb_com_id; + if (PIOS_USB_COM_Init(&pios_usb_com_id, &pios_usb_com_hid_cfg, pios_usb_id)) { + PIOS_Assert(0); + } + uint8_t * rx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_TELEM_USB_RX_BUF_LEN); + uint8_t * tx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_TELEM_USB_TX_BUF_LEN); + PIOS_Assert(rx_buffer); + PIOS_Assert(tx_buffer); + if (PIOS_COM_Init(&pios_com_telem_usb_id, &pios_usb_hid_com_driver, pios_usb_com_id, + rx_buffer, PIOS_COM_TELEM_USB_RX_BUF_LEN, + tx_buffer, PIOS_COM_TELEM_USB_TX_BUF_LEN)) { + PIOS_Assert(0); + } + } +#endif /* PIOS_INCLUDE_COM */ + break; + case HWSETTINGS_USB_TELEMETRYCHANNEL_CDC: +#if defined(PIOS_INCLUDE_COM) + { + uint32_t pios_usb_com_id; + if (PIOS_USB_COM_Init(&pios_usb_com_id, &pios_usb_com_cdc_cfg, pios_usb_id)) { + PIOS_Assert(0); + } + uint8_t * rx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_TELEM_USB_RX_BUF_LEN); + uint8_t * tx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_TELEM_USB_TX_BUF_LEN); + PIOS_Assert(rx_buffer); + PIOS_Assert(tx_buffer); + if (PIOS_COM_Init(&pios_com_telem_usb_id, &pios_usb_cdc_com_driver, pios_usb_com_id, + rx_buffer, PIOS_COM_TELEM_USB_RX_BUF_LEN, + tx_buffer, PIOS_COM_TELEM_USB_TX_BUF_LEN)) { + PIOS_Assert(0); + } + } +#endif /* PIOS_INCLUDE_COM */ + break; + default: + PIOS_Assert(0); + } +#endif /* PIOS_INCLUDE_USB_HID */ + /* Configure the main IO port */ uint8_t hwsettings_DSMxBind; HwSettingsDSMxBindGet(&hwsettings_DSMxBind); @@ -1179,6 +1236,40 @@ void PIOS_Board_Init(void) { break; case HWSETTINGS_CC_MAINPORT_COMAUX: break; + case HWSETTINGS_CC_MAINPORT_COMBRIDGE: + { + uint32_t pios_usart_generic_id; + if (PIOS_USART_Init(&pios_usart_generic_id, &pios_usart_generic_main_cfg)) { + PIOS_Assert(0); + } + + uint8_t * rx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_BRIDGE_RX_BUF_LEN); + PIOS_Assert(rx_buffer); + uint8_t * tx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_BRIDGE_TX_BUF_LEN); + PIOS_Assert(tx_buffer); + if (PIOS_COM_Init(&pios_com_bridge_id, &pios_usart_com_driver, pios_usart_generic_id, + rx_buffer, PIOS_COM_BRIDGE_RX_BUF_LEN, + tx_buffer, PIOS_COM_BRIDGE_TX_BUF_LEN)) { + PIOS_Assert(0); + } + } + { + uint32_t pios_usb_vcp_id; + if (PIOS_USB_COM_Init(&pios_usb_vcp_id, &pios_usb_com_cdc_cfg, pios_usb_id)) { + PIOS_Assert(0); + } + uint8_t * rx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_BRIDGE_RX_BUF_LEN); + uint8_t * tx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_BRIDGE_TX_BUF_LEN); + PIOS_Assert(rx_buffer); + PIOS_Assert(tx_buffer); + if (PIOS_COM_Init(&pios_com_vcp_id, &pios_usb_cdc_com_driver, pios_usb_vcp_id, + rx_buffer, PIOS_COM_BRIDGE_RX_BUF_LEN, + tx_buffer, PIOS_COM_BRIDGE_TX_BUF_LEN)) { + PIOS_Assert(0); + } + + } + break; } /* Configure the flexi port */ @@ -1278,6 +1369,8 @@ void PIOS_Board_Init(void) { } #endif /* PIOS_INCLUDE_I2C */ break; + case HWSETTINGS_CC_FLEXIPORT_COMBRIDGE: + break; } /* Configure the rcvr port */ @@ -1349,59 +1442,6 @@ void PIOS_Board_Init(void) { PIOS_ADC_Init(); PIOS_GPIO_Init(); - -#if defined(PIOS_INCLUDE_USB_HID) - uint32_t pios_usb_id; - PIOS_USB_Init(&pios_usb_id, &pios_usb_main_cfg); - - /* Configure the usb telemetry protocol */ - uint8_t hwsettings_usb_telemetry_channel; - HwSettingsUSB_TelemetryChannelGet(&hwsettings_usb_telemetry_channel); - - switch (hwsettings_usb_telemetry_channel) { - case HWSETTINGS_USB_TELEMETRYCHANNEL_HID: -#if defined(PIOS_INCLUDE_COM) - { - uint32_t pios_usb_com_id; - if (PIOS_USB_COM_Init(&pios_usb_com_id, &pios_usb_com_hid_cfg, pios_usb_id)) { - PIOS_Assert(0); - } - uint8_t * rx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_TELEM_USB_RX_BUF_LEN); - uint8_t * tx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_TELEM_USB_TX_BUF_LEN); - PIOS_Assert(rx_buffer); - PIOS_Assert(tx_buffer); - if (PIOS_COM_Init(&pios_com_telem_usb_id, &pios_usb_hid_com_driver, pios_usb_com_id, - rx_buffer, PIOS_COM_TELEM_USB_RX_BUF_LEN, - tx_buffer, PIOS_COM_TELEM_USB_TX_BUF_LEN)) { - PIOS_Assert(0); - } - } -#endif /* PIOS_INCLUDE_COM */ - break; - case HWSETTINGS_USB_TELEMETRYCHANNEL_CDC: -#if defined(PIOS_INCLUDE_COM) - { - uint32_t pios_usb_com_id; - if (PIOS_USB_COM_Init(&pios_usb_com_id, &pios_usb_com_cdc_cfg, pios_usb_id)) { - PIOS_Assert(0); - } - uint8_t * rx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_TELEM_USB_RX_BUF_LEN); - uint8_t * tx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_TELEM_USB_TX_BUF_LEN); - PIOS_Assert(rx_buffer); - PIOS_Assert(tx_buffer); - if (PIOS_COM_Init(&pios_com_telem_usb_id, &pios_usb_cdc_com_driver, pios_usb_com_id, - rx_buffer, PIOS_COM_TELEM_USB_RX_BUF_LEN, - tx_buffer, PIOS_COM_TELEM_USB_TX_BUF_LEN)) { - PIOS_Assert(0); - } - } -#endif /* PIOS_INCLUDE_COM */ - break; - default: - PIOS_Assert(0); - } -#endif /* PIOS_INCLUDE_USB_HID */ - PIOS_IAP_Init(); #ifndef ERASE_FLASH PIOS_WDG_Init(); diff --git a/flight/Modules/ComUsbBridge/ComUsbBridge.c b/flight/Modules/ComUsbBridge/ComUsbBridge.c new file mode 100644 index 000000000..c84c93c22 --- /dev/null +++ b/flight/Modules/ComUsbBridge/ComUsbBridge.c @@ -0,0 +1,135 @@ +/** + ****************************************************************************** + * @addtogroup OpenPilotModules OpenPilot Modules + * @{ + * @addtogroup ComUsbBridgeModule Com Port to USB VCP Bridge Module + * @brief Bridge Com and USB VCP ports + * @{ + * + * @file ComUsbBridge.c + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2011. + * @brief Bridges selected Com Port to the USB VCP emulated serial port + * @see The GNU Public License (GPL) Version 3 + * + *****************************************************************************/ +/* + * 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 + */ + +// **************** + +#include "openpilot.h" + +#include + +// **************** +// Private functions + +static void com2UsbBridgeTask(void *parameters); +static void usb2ComBridgeTask(void *parameters); + +// **************** +// Private constants + +#define STACK_SIZE_BYTES 280 +#define TASK_PRIORITY (tskIDLE_PRIORITY + 1) + +#define BRIDGE_BUF_LEN 10 + +// **************** +// Private variables + +static xTaskHandle com2UsbBridgeTaskHandle; +static xTaskHandle usb2ComBridgeTaskHandle; + +static uint8_t * com2usb_buf; +static uint8_t * usb2com_buf; + +static uint32_t usart_port; +static uint32_t vcp_port; + +/** + * Initialise the module + * \return -1 if initialisation failed + * \return 0 on success + */ + +static int32_t comUsbBridgeStart(void) +{ + if (usart_port && vcp_port) { + // Start tasks + xTaskCreate(com2UsbBridgeTask, (signed char *)"Com2UsbBridge", STACK_SIZE_BYTES/4, NULL, TASK_PRIORITY, &com2UsbBridgeTaskHandle); + xTaskCreate(usb2ComBridgeTask, (signed char *)"Usb2ComBridge", STACK_SIZE_BYTES/4, NULL, TASK_PRIORITY, &usb2ComBridgeTaskHandle); + } + + return 0; +} +/** + * Initialise the module + * \return -1 if initialisation failed + * \return 0 on success + */ +static int32_t comUsbBridgeInitialize(void) +{ + // TODO: Get from settings object + usart_port = PIOS_COM_BRIDGE; + vcp_port = PIOS_COM_VCP; + + com2usb_buf = pvPortMalloc(BRIDGE_BUF_LEN); + PIOS_Assert(com2usb_buf); + usb2com_buf = pvPortMalloc(BRIDGE_BUF_LEN); + PIOS_Assert(usb2com_buf); + + return 0; +} +MODULE_INITCALL(comUsbBridgeInitialize, comUsbBridgeStart) + +/** + * Main task. It does not return. + */ + +static void com2UsbBridgeTask(void *parameters) +{ + /* Handle usart -> vcp direction */ + while (1) { + uint32_t rx_bytes; + + rx_bytes = PIOS_COM_ReceiveBuffer(usart_port, com2usb_buf, BRIDGE_BUF_LEN, 500); + if (rx_bytes > 0) { + if (PIOS_COM_SendBuffer(vcp_port, com2usb_buf, rx_bytes)) { + vTaskDelay(10 / portTICK_RATE_MS); + } + } else { + vTaskDelay(10 / portTICK_RATE_MS); + } + } +} + +static void usb2ComBridgeTask(void * parameters) +{ + /* Handle vcp -> usart direction */ + while (1) { + uint32_t rx_bytes; + + rx_bytes = PIOS_COM_ReceiveBuffer(vcp_port, usb2com_buf, BRIDGE_BUF_LEN, 500); + if (rx_bytes > 0) { + if (PIOS_COM_SendBuffer(usart_port, usb2com_buf, rx_bytes)) { + vTaskDelay(10 / portTICK_RATE_MS); + } + } else { + vTaskDelay(10 / portTICK_RATE_MS); + } + } +} diff --git a/flight/PiOS/Boards/STM32103CB_CC_Rev1.h b/flight/PiOS/Boards/STM32103CB_CC_Rev1.h index a88589ed2..8221d659b 100644 --- a/flight/PiOS/Boards/STM32103CB_CC_Rev1.h +++ b/flight/PiOS/Boards/STM32103CB_CC_Rev1.h @@ -141,6 +141,12 @@ extern uint32_t pios_com_gps_id; #define PIOS_COM_GPS (pios_com_gps_id) #endif /* PIOS_INCLUDE_GPS */ +extern uint32_t pios_com_bridge_id; +#define PIOS_COM_BRIDGE (pios_com_bridge_id) + +extern uint32_t pios_com_vcp_id; +#define PIOS_COM_VCP (pios_com_vcp_id) + extern uint32_t pios_com_telem_usb_id; #define PIOS_COM_TELEM_USB (pios_com_telem_usb_id) diff --git a/shared/uavobjectdefinition/hwsettings.xml b/shared/uavobjectdefinition/hwsettings.xml index 0b77d0857..d259ee6c2 100644 --- a/shared/uavobjectdefinition/hwsettings.xml +++ b/shared/uavobjectdefinition/hwsettings.xml @@ -2,8 +2,8 @@ Selection of optional hardware configurations. - - + + From 202b1bd428ba7089bbc5489cd3a030440f7f661d Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Sun, 25 Dec 2011 17:54:43 -0500 Subject: [PATCH 032/121] com: Always kick rx_start if we got zero bytes This will ensure that we kick rx_start at least once every time that a user tries to receive bytes from the underlying device. --- flight/PiOS/Common/pios_com.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/flight/PiOS/Common/pios_com.c b/flight/PiOS/Common/pios_com.c index e7fba8867..9f325fa1f 100644 --- a/flight/PiOS/Common/pios_com.c +++ b/flight/PiOS/Common/pios_com.c @@ -463,7 +463,7 @@ uint16_t PIOS_COM_ReceiveBuffer(uint32_t com_id, uint8_t * buf, uint16_t buf_len uint16_t bytes_from_fifo = fifoBuf_getData(&com_dev->rx, buf, buf_len); PIOS_IRQ_Enable(); - if (bytes_from_fifo == 0 && timeout_ms > 0) { + if (bytes_from_fifo == 0) { /* No more bytes in receive buffer */ /* Make sure the receiver is running while we wait */ if (com_dev->driver->rx_start) { @@ -471,17 +471,19 @@ uint16_t PIOS_COM_ReceiveBuffer(uint32_t com_id, uint8_t * buf, uint16_t buf_len (com_dev->driver->rx_start)(com_dev->lower_id, fifoBuf_getFree(&com_dev->rx)); } + if (timeout_ms > 0) { #if defined(PIOS_INCLUDE_FREERTOS) - if (xSemaphoreTake(com_dev->rx_sem, timeout_ms / portTICK_RATE_MS) == pdTRUE) { - /* Make sure we don't come back here again */ - timeout_ms = 0; - goto check_again; - } + if (xSemaphoreTake(com_dev->rx_sem, timeout_ms / portTICK_RATE_MS) == pdTRUE) { + /* Make sure we don't come back here again */ + timeout_ms = 0; + goto check_again; + } #else - PIOS_DELAY_WaitmS(1); - timeout_ms--; - goto check_again; + PIOS_DELAY_WaitmS(1); + timeout_ms--; + goto check_again; #endif + } } /* Return received byte */ From f54c0552ce09d5717d3ad45ea44339fcb0244d43 Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Sun, 25 Dec 2011 17:56:38 -0500 Subject: [PATCH 033/121] com: make sure we know when a higher prio task is woken --- flight/PiOS/Common/pios_com.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/flight/PiOS/Common/pios_com.c b/flight/PiOS/Common/pios_com.c index 9f325fa1f..739329f15 100644 --- a/flight/PiOS/Common/pios_com.c +++ b/flight/PiOS/Common/pios_com.c @@ -161,7 +161,7 @@ out_fail: static void PIOS_COM_UnblockRx(struct pios_com_dev * com_dev, bool * need_yield) { #if defined(PIOS_INCLUDE_FREERTOS) - static signed portBASE_TYPE xHigherPriorityTaskWoken; + static signed portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; xSemaphoreGiveFromISR(com_dev->rx_sem, &xHigherPriorityTaskWoken); if (xHigherPriorityTaskWoken != pdFALSE) { @@ -177,7 +177,7 @@ static void PIOS_COM_UnblockRx(struct pios_com_dev * com_dev, bool * need_yield) static void PIOS_COM_UnblockTx(struct pios_com_dev * com_dev, bool * need_yield) { #if defined(PIOS_INCLUDE_FREERTOS) - static signed portBASE_TYPE xHigherPriorityTaskWoken; + static signed portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; xSemaphoreGiveFromISR(com_dev->tx_sem, &xHigherPriorityTaskWoken); if (xHigherPriorityTaskWoken != pdFALSE) { From 86aead52ce2d57e8f2051b18b603e5134f9fe726 Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Sun, 25 Dec 2011 17:58:37 -0500 Subject: [PATCH 034/121] usb cdc: only pass valid bytes from USB rx up to com layer Previously, up to 63 random bytes would be passed to the COM layer and would be delivered to the application as though the far end had sent them. --- flight/PiOS/STM32F10x/pios_usb_com.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flight/PiOS/STM32F10x/pios_usb_com.c b/flight/PiOS/STM32F10x/pios_usb_com.c index 8bdcbed6a..8fa56a752 100644 --- a/flight/PiOS/STM32F10x/pios_usb_com.c +++ b/flight/PiOS/STM32F10x/pios_usb_com.c @@ -481,7 +481,7 @@ static void PIOS_USB_COM_CDC_DATA_EP_OUT_Callback(void) bool need_yield = false; (usb_com_dev->rx_in_cb)(usb_com_dev->rx_in_context, usb_com_dev->rx_packet_buffer, - sizeof(usb_com_dev->rx_packet_buffer), + DataLength, &headroom, &need_yield); From e2bb7140feca702be19b8ff122649a600fbf78fc Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Sun, 25 Dec 2011 18:00:17 -0500 Subject: [PATCH 035/121] usb cdc: allow use of entire rx buffer Previously, the code only allowed n-1 bytes of the available space to be used. --- flight/PiOS/STM32F10x/pios_usb_com.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/flight/PiOS/STM32F10x/pios_usb_com.c b/flight/PiOS/STM32F10x/pios_usb_com.c index 8fa56a752..a9c9b4bb7 100644 --- a/flight/PiOS/STM32F10x/pios_usb_com.c +++ b/flight/PiOS/STM32F10x/pios_usb_com.c @@ -266,7 +266,7 @@ static void PIOS_USB_COM_HID_RxStart(uint32_t usbcom_id, uint16_t rx_bytes_avail // If endpoint was stalled and there is now space make it valid PIOS_IRQ_Disable(); if ((GetEPRxStatus(usb_com_dev->cfg->data_rx_ep) != EP_RX_VALID) && - (rx_bytes_avail > PIOS_USB_COM_DATA_LENGTH)) { + (rx_bytes_avail >= PIOS_USB_COM_DATA_LENGTH)) { SetEPRxStatus(usb_com_dev->cfg->data_rx_ep, EP_RX_VALID); } PIOS_IRQ_Enable(); @@ -355,7 +355,7 @@ static void PIOS_USB_COM_HID_EP_OUT_Callback(void) &headroom, &need_yield); #endif - if (headroom > PIOS_USB_COM_DATA_LENGTH) { + if (headroom >= PIOS_USB_COM_DATA_LENGTH) { /* We have room for a maximum length message */ SetEPRxStatus(usb_com_dev->cfg->data_rx_ep, EP_RX_VALID); } else { @@ -385,7 +385,7 @@ static void PIOS_USB_COM_CDC_RxStart(uint32_t usbcom_id, uint16_t rx_bytes_avail // If endpoint was stalled and there is now space make it valid PIOS_IRQ_Disable(); if ((GetEPRxStatus(usb_com_dev->cfg->data_rx_ep) != EP_RX_VALID) && - (rx_bytes_avail > sizeof(usb_com_dev->rx_packet_buffer))) { + (rx_bytes_avail >= sizeof(usb_com_dev->rx_packet_buffer))) { SetEPRxStatus(usb_com_dev->cfg->data_rx_ep, EP_RX_VALID); } PIOS_IRQ_Enable(); @@ -485,7 +485,7 @@ static void PIOS_USB_COM_CDC_DATA_EP_OUT_Callback(void) &headroom, &need_yield); - if (headroom > sizeof(usb_com_dev->rx_packet_buffer)) { + if (headroom >= sizeof(usb_com_dev->rx_packet_buffer)) { /* We have room for a maximum length message */ SetEPRxStatus(usb_com_dev->cfg->data_rx_ep, EP_RX_VALID); } else { From 34af9ac92dc6b5c48b3d6af9186dbc1e01c57e55 Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Mon, 26 Dec 2011 17:09:08 -0500 Subject: [PATCH 036/121] usb_com: NAK rather than STALL on buffer full STALL should only be used to indicate an error has occurred. NAK is the correct mechanism to provide backpressure. --- flight/PiOS/STM32F10x/pios_usb_com.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flight/PiOS/STM32F10x/pios_usb_com.c b/flight/PiOS/STM32F10x/pios_usb_com.c index a9c9b4bb7..ac758b808 100644 --- a/flight/PiOS/STM32F10x/pios_usb_com.c +++ b/flight/PiOS/STM32F10x/pios_usb_com.c @@ -490,7 +490,7 @@ static void PIOS_USB_COM_CDC_DATA_EP_OUT_Callback(void) SetEPRxStatus(usb_com_dev->cfg->data_rx_ep, EP_RX_VALID); } else { /* Not enough room left for a message, apply backpressure */ - SetEPRxStatus(usb_com_dev->cfg->data_rx_ep, EP_RX_STALL); + SetEPRxStatus(usb_com_dev->cfg->data_rx_ep, EP_RX_NAK); } #if defined(PIOS_INCLUDE_FREERTOS) From 20406451714ced1c8434755771bbed442cf04a08 Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Mon, 26 Dec 2011 17:11:50 -0500 Subject: [PATCH 037/121] com: Use all bytes in Tx buffer Code would previously fail Tx if we happen to send data that happened to be exactly the size of the available space in the tx buffer. --- flight/PiOS/Common/pios_com.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flight/PiOS/Common/pios_com.c b/flight/PiOS/Common/pios_com.c index 739329f15..c7f252973 100644 --- a/flight/PiOS/Common/pios_com.c +++ b/flight/PiOS/Common/pios_com.c @@ -285,7 +285,7 @@ int32_t PIOS_COM_SendBufferNonBlocking(uint32_t com_id, const uint8_t *buffer, u PIOS_Assert(com_dev->has_tx); - if (len >= fifoBuf_getFree(&com_dev->tx)) { + if (len > fifoBuf_getFree(&com_dev->tx)) { /* Buffer cannot accept all requested bytes (retry) */ return -2; } From b858cf387e9aa5eaaec1a4a2cbda028d9fba8432 Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Mon, 26 Dec 2011 17:13:20 -0500 Subject: [PATCH 038/121] com: track dropped bytes on rx for usart and usb com --- flight/PiOS/STM32F10x/pios_usart.c | 9 ++++++++- flight/PiOS/STM32F10x/pios_usb_com.c | 10 +++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/flight/PiOS/STM32F10x/pios_usart.c b/flight/PiOS/STM32F10x/pios_usart.c index 68a9265ee..a8221ad0b 100644 --- a/flight/PiOS/STM32F10x/pios_usart.c +++ b/flight/PiOS/STM32F10x/pios_usart.c @@ -63,6 +63,8 @@ struct pios_usart_dev { uint32_t rx_in_context; pios_com_callback tx_out_cb; uint32_t tx_out_context; + + uint32_t rx_dropped; }; static bool PIOS_USART_validate(struct pios_usart_dev * usart_dev) @@ -285,7 +287,12 @@ static void PIOS_USART_generic_irq_handler(uint32_t usart_id) if (sr & USART_SR_RXNE) { uint8_t byte = dr; if (usart_dev->rx_in_cb) { - (void) (usart_dev->rx_in_cb)(usart_dev->rx_in_context, &byte, 1, NULL, &rx_need_yield); + uint16_t rc; + rc = (usart_dev->rx_in_cb)(usart_dev->rx_in_context, &byte, 1, NULL, &rx_need_yield); + if (rc < 1) { + /* Lost bytes on rx */ + usart_dev->rx_dropped += 1; + } } } diff --git a/flight/PiOS/STM32F10x/pios_usb_com.c b/flight/PiOS/STM32F10x/pios_usb_com.c index ac758b808..2c7ea646e 100644 --- a/flight/PiOS/STM32F10x/pios_usb_com.c +++ b/flight/PiOS/STM32F10x/pios_usb_com.c @@ -81,6 +81,8 @@ struct pios_usb_com_dev { uint8_t rx_packet_buffer[PIOS_USB_COM_DATA_LENGTH + 2]; uint8_t tx_packet_buffer[PIOS_USB_COM_DATA_LENGTH + 2]; + + uint32_t rx_dropped; }; static bool PIOS_USB_COM_validate(struct pios_usb_com_dev * usb_com_dev) @@ -479,12 +481,18 @@ static void PIOS_USB_COM_CDC_DATA_EP_OUT_Callback(void) uint16_t headroom; bool need_yield = false; - (usb_com_dev->rx_in_cb)(usb_com_dev->rx_in_context, + uint16_t rc; + rc = (usb_com_dev->rx_in_cb)(usb_com_dev->rx_in_context, usb_com_dev->rx_packet_buffer, DataLength, &headroom, &need_yield); + if (rc < DataLength) { + /* Lost bytes on rx */ + usb_com_dev->rx_dropped += (DataLength - rc); + } + if (headroom >= sizeof(usb_com_dev->rx_packet_buffer)) { /* We have room for a maximum length message */ SetEPRxStatus(usb_com_dev->cfg->data_rx_ep, EP_RX_VALID); From 407bec0c95ba37b80a4050227b9baf6e2c753ea3 Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Mon, 26 Dec 2011 17:15:14 -0500 Subject: [PATCH 039/121] usb cdc: track oversized rx buffers --- flight/PiOS/STM32F10x/pios_usb_com.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/flight/PiOS/STM32F10x/pios_usb_com.c b/flight/PiOS/STM32F10x/pios_usb_com.c index 2c7ea646e..808f81afd 100644 --- a/flight/PiOS/STM32F10x/pios_usb_com.c +++ b/flight/PiOS/STM32F10x/pios_usb_com.c @@ -83,6 +83,7 @@ struct pios_usb_com_dev { uint8_t tx_packet_buffer[PIOS_USB_COM_DATA_LENGTH + 2]; uint32_t rx_dropped; + uint32_t rx_oversize; }; static bool PIOS_USB_COM_validate(struct pios_usb_com_dev * usb_com_dev) @@ -465,6 +466,7 @@ static void PIOS_USB_COM_CDC_DATA_EP_OUT_Callback(void) /* Get the number of received data on the selected Endpoint */ DataLength = GetEPRxCount(usb_com_dev->cfg->data_rx_ep); if (DataLength > sizeof(usb_com_dev->rx_packet_buffer)) { + usb_com_dev->rx_oversize++; DataLength = sizeof(usb_com_dev->rx_packet_buffer); } From 80e0be3cece78f6e00c0b43fd2b1a6b9bb30523a Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Mon, 26 Dec 2011 17:20:29 -0500 Subject: [PATCH 040/121] com: fragment transmitted buffers to match underlying device PIOS_COM_SendBufferNonBlocking() will now fragment its buffer to match the max size of the underlying device. This allows the buffer size of the underlying device to shrink below the maximum message size, thus allowing us to use smaller buffers on memory-constrained platforms. --- flight/PiOS/Common/pios_com.c | 57 ++++++++++++++++++++++++----------- 1 file changed, 39 insertions(+), 18 deletions(-) diff --git a/flight/PiOS/Common/pios_com.c b/flight/PiOS/Common/pios_com.c index c7f252973..29179c99f 100644 --- a/flight/PiOS/Common/pios_com.c +++ b/flight/PiOS/Common/pios_com.c @@ -272,7 +272,7 @@ int32_t PIOS_COM_ChangeBaud(uint32_t com_id, uint32_t baud) * \return -1 if port not available * \return -2 if non-blocking mode activated: buffer is full * caller should retry until buffer is free again -* \return 0 on success +* \return number of bytes transmitted on success */ int32_t PIOS_COM_SendBufferNonBlocking(uint32_t com_id, const uint8_t *buffer, uint16_t len) { @@ -302,7 +302,7 @@ int32_t PIOS_COM_SendBufferNonBlocking(uint32_t com_id, const uint8_t *buffer, u } } - return (0); + return (bytes_into_fifo); } /** @@ -312,7 +312,7 @@ int32_t PIOS_COM_SendBufferNonBlocking(uint32_t com_id, const uint8_t *buffer, u * \param[in] buffer character buffer * \param[in] len buffer length * \return -1 if port not available -* \return 0 on success +* \return number of bytes transmitted on success */ int32_t PIOS_COM_SendBuffer(uint32_t com_id, const uint8_t *buffer, uint16_t len) { @@ -325,25 +325,46 @@ int32_t PIOS_COM_SendBuffer(uint32_t com_id, const uint8_t *buffer, uint16_t len PIOS_Assert(com_dev->has_tx); - int32_t rc; - do { - rc = PIOS_COM_SendBufferNonBlocking(com_id, buffer, len); + uint32_t max_frag_len = fifoBuf_getSize(&com_dev->tx); + uint32_t bytes_to_send = len; + while (bytes_to_send) { + uint32_t frag_size; + if (bytes_to_send > max_frag_len) { + frag_size = max_frag_len; + } else { + frag_size = bytes_to_send; + } + int32_t rc = PIOS_COM_SendBufferNonBlocking(com_id, buffer, frag_size); + if (rc >= 0) { + bytes_to_send -= rc; + buffer += rc; + } else { + switch (rc) { + case -1: + /* Device is invalid, this will never work */ + return -1; + case -2: + /* Device is busy, wait for the underlying device to free some space and retry */ + /* Make sure the transmitter is running while we wait */ + if (com_dev->driver->tx_start) { + (com_dev->driver->tx_start)(com_dev->lower_id, + fifoBuf_getUsed(&com_dev->tx)); + } #if defined(PIOS_INCLUDE_FREERTOS) - if (rc == -2) { - /* Make sure the transmitter is running while we wait */ - if (com_dev->driver->tx_start) { - (com_dev->driver->tx_start)(com_dev->lower_id, - fifoBuf_getUsed(&com_dev->tx)); - } - if (xSemaphoreTake(com_dev->tx_sem, portMAX_DELAY) != pdTRUE) { - return -3; - } - } + if (xSemaphoreTake(com_dev->tx_sem, portMAX_DELAY) != pdTRUE) { + return -3; + } #endif - } while (rc == -2); + continue; + default: + /* Unhandled return code */ + return rc; + } + } + } - return rc; + return len; } /** From a68f5a4fc997a43cd170f4a1d76550e3696f571a Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Mon, 26 Dec 2011 17:21:36 -0500 Subject: [PATCH 041/121] com-bridge: detect lost characters on transmit --- flight/Modules/ComUsbBridge/ComUsbBridge.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/flight/Modules/ComUsbBridge/ComUsbBridge.c b/flight/Modules/ComUsbBridge/ComUsbBridge.c index c84c93c22..3b52119ae 100644 --- a/flight/Modules/ComUsbBridge/ComUsbBridge.c +++ b/flight/Modules/ComUsbBridge/ComUsbBridge.c @@ -103,16 +103,17 @@ MODULE_INITCALL(comUsbBridgeInitialize, comUsbBridgeStart) static void com2UsbBridgeTask(void *parameters) { /* Handle usart -> vcp direction */ + volatile uint32_t tx_errors = 0; while (1) { uint32_t rx_bytes; rx_bytes = PIOS_COM_ReceiveBuffer(usart_port, com2usb_buf, BRIDGE_BUF_LEN, 500); if (rx_bytes > 0) { - if (PIOS_COM_SendBuffer(vcp_port, com2usb_buf, rx_bytes)) { - vTaskDelay(10 / portTICK_RATE_MS); + /* Bytes available to transfer */ + if (PIOS_COM_SendBuffer(vcp_port, com2usb_buf, rx_bytes) != rx_bytes) { + /* Error on transmit */ + tx_errors++; } - } else { - vTaskDelay(10 / portTICK_RATE_MS); } } } @@ -120,16 +121,17 @@ static void com2UsbBridgeTask(void *parameters) static void usb2ComBridgeTask(void * parameters) { /* Handle vcp -> usart direction */ + volatile uint32_t tx_errors = 0; while (1) { uint32_t rx_bytes; rx_bytes = PIOS_COM_ReceiveBuffer(vcp_port, usb2com_buf, BRIDGE_BUF_LEN, 500); if (rx_bytes > 0) { - if (PIOS_COM_SendBuffer(usart_port, usb2com_buf, rx_bytes)) { - vTaskDelay(10 / portTICK_RATE_MS); + /* Bytes available to transfer */ + if (PIOS_COM_SendBuffer(usart_port, usb2com_buf, rx_bytes) != rx_bytes) { + /* Error on transmit */ + tx_errors++; } - } else { - vTaskDelay(10 / portTICK_RATE_MS); } } } From 16619584e42ecfd43f3c790427bf6f8deea191eb Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Mon, 26 Dec 2011 17:23:06 -0500 Subject: [PATCH 042/121] usb cdc: return valid data in response to SetLineCoding --- flight/PiOS/STM32F10x/pios_usb_com.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/flight/PiOS/STM32F10x/pios_usb_com.c b/flight/PiOS/STM32F10x/pios_usb_com.c index 808f81afd..5795d967e 100644 --- a/flight/PiOS/STM32F10x/pios_usb_com.c +++ b/flight/PiOS/STM32F10x/pios_usb_com.c @@ -527,6 +527,13 @@ RESULT PIOS_CDC_SetControlLineState(void) return USB_SUCCESS; } +static uint8_t line_coding[] = { + 0x00, 0xE1, 0x00, 0x00, /* 57600bps */ + 0x00, /* 1 stop bit */ + 0x00, /* Even parity */ + 0x08, /* 8 data bits */ +}; + RESULT PIOS_CDC_SetLineCoding(void) { struct pios_usb_com_dev * usb_com_dev = (struct pios_usb_com_dev *)pios_usb_com_cdc_id; @@ -544,7 +551,12 @@ uint8_t *PIOS_CDC_GetLineCoding(uint16_t Length) bool valid = PIOS_USB_COM_validate(usb_com_dev); PIOS_Assert(valid); - return NULL; + if (Length == 0) { + pInformation->Ctrl_Info.Usb_wLength = sizeof(line_coding); + return NULL; + } else { + return (line_coding); + } } static uint8_t serial_state[] = { From 785a7ccd887c4233e5c44d1657f3c9a3049e4069 Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Tue, 27 Dec 2011 12:19:05 -0500 Subject: [PATCH 043/121] uavtalk: convert tx to use blocking send routines The uavtalk layer was previously implementing a poor version of packet fragmentation based on a hard-coded max packet size. Since this was hard-coded, there was no guarantee that it would match the underlying devices. Now that the COM layer sending routines support fragmentation, remove fragmentation and use the COM layer directly. This will support future buffer size reductions in the COM layer. --- flight/Modules/Telemetry/telemetry.c | 7 +++-- flight/UAVTalk/inc/uavtalk.h | 2 +- flight/UAVTalk/uavtalk.c | 42 +++++++++++++--------------- 3 files changed, 25 insertions(+), 26 deletions(-) diff --git a/flight/Modules/Telemetry/telemetry.c b/flight/Modules/Telemetry/telemetry.c index e0f8b2d5f..cf24ec12a 100644 --- a/flight/Modules/Telemetry/telemetry.c +++ b/flight/Modules/Telemetry/telemetry.c @@ -133,7 +133,7 @@ int32_t TelemetryInitialize(void) updateSettings(); // Initialise UAVTalk - uavTalkCon = UAVTalkInitialize(&transmitData,256); + uavTalkCon = UAVTalkInitialize(&transmitData); // Create periodic event that will be used to update the telemetry stats txErrors = 0; @@ -339,7 +339,8 @@ static void telemetryRxTask(void *parameters) * Transmit data buffer to the modem or USB port. * \param[in] data Data buffer to send * \param[in] length Length of buffer - * \return 0 Success + * \return -1 on failure + * \return number of bytes transmitted on success */ static int32_t transmitData(uint8_t * data, int32_t length) { @@ -356,7 +357,7 @@ static int32_t transmitData(uint8_t * data, int32_t length) } if (outputPort) { - return PIOS_COM_SendBufferNonBlocking(outputPort, data, length); + return PIOS_COM_SendBuffer(outputPort, data, length); } else { return -1; } diff --git a/flight/UAVTalk/inc/uavtalk.h b/flight/UAVTalk/inc/uavtalk.h index 71114ce74..3b7f2a2f9 100644 --- a/flight/UAVTalk/inc/uavtalk.h +++ b/flight/UAVTalk/inc/uavtalk.h @@ -46,7 +46,7 @@ typedef struct { typedef void* UAVTalkConnection; // Public functions -UAVTalkConnection UAVTalkInitialize(UAVTalkOutputStream outputStream, uint32_t maxPacketSize); +UAVTalkConnection UAVTalkInitialize(UAVTalkOutputStream outputStream); int32_t UAVTalkSetOutputStream(UAVTalkConnection connection, UAVTalkOutputStream outputStream); UAVTalkOutputStream UAVTalkGetOutputStream(UAVTalkConnection connection); int32_t UAVTalkSendObject(UAVTalkConnection connection, UAVObjHandle obj, uint16_t instId, uint8_t acked, int32_t timeoutMs); diff --git a/flight/UAVTalk/uavtalk.c b/flight/UAVTalk/uavtalk.c index 900dc24b3..844ed5e38 100644 --- a/flight/UAVTalk/uavtalk.c +++ b/flight/UAVTalk/uavtalk.c @@ -48,9 +48,8 @@ static void updateAck(UAVTalkConnectionData *connection, UAVObjHandle obj, uint1 * \return 0 Success * \return -1 Failure */ -UAVTalkConnection UAVTalkInitialize(UAVTalkOutputStream outputStream, uint32_t maxPacketSize) +UAVTalkConnection UAVTalkInitialize(UAVTalkOutputStream outputStream) { - if (maxPacketSize<1) return 0; // allocate object UAVTalkConnectionData * connection = pvPortMalloc(sizeof(UAVTalkConnectionData)); if (!connection) return 0; @@ -60,7 +59,6 @@ UAVTalkConnection UAVTalkInitialize(UAVTalkOutputStream outputStream, uint32_t m connection->outStream = outputStream; connection->lock = xSemaphoreCreateRecursiveMutex(); connection->transLock = xSemaphoreCreateRecursiveMutex(); - connection->txSize = maxPacketSize; // allocate buffers connection->rxBuffer = pvPortMalloc(UAVTALK_MAX_PACKET_LENGTH); if (!connection->rxBuffer) return 0; @@ -646,7 +644,9 @@ static int32_t sendSingleObject(UAVTalkConnectionData *connection, UAVObjHandle int32_t length; int32_t dataOffset; uint32_t objId; - + + if (!connection->outStream) return -1; + // Setup type and object id fields objId = UAVObjGetID(obj); connection->txBuffer[0] = UAVTALK_SYNC_VAL; // sync byte @@ -701,22 +701,16 @@ static int32_t sendSingleObject(UAVTalkConnectionData *connection, UAVObjHandle // Calculate checksum connection->txBuffer[dataOffset+length] = PIOS_CRC_updateCRC(0, connection->txBuffer, dataOffset+length); - // Send buffer (partially if needed) - uint32_t sent=0; - while (sent < dataOffset+length+UAVTALK_CHECKSUM_LENGTH) { - uint32_t sending = dataOffset+length+UAVTALK_CHECKSUM_LENGTH - sent; - if ( sending > connection->txSize ) sending = connection->txSize; - if ( connection->outStream != NULL ) { - (*connection->outStream)(connection->txBuffer+sent, sending); - } - sent += sending; + uint16_t tx_msg_len = dataOffset+length+UAVTALK_CHECKSUM_LENGTH; + int32_t rc = (*connection->outStream)(connection->txBuffer, tx_msg_len); + + if (rc == tx_msg_len) { + // Update stats + ++connection->stats.txObjects; + connection->stats.txBytes += tx_msg_len; + connection->stats.txObjectBytes += length; } - // Update stats - ++connection->stats.txObjects; - connection->stats.txBytes += dataOffset+length+UAVTALK_CHECKSUM_LENGTH; - connection->stats.txObjectBytes += length; - // Done return 0; } @@ -732,6 +726,8 @@ static int32_t sendNack(UAVTalkConnectionData *connection, uint32_t objId) { int32_t dataOffset; + if (!connection->outStream) return -1; + connection->txBuffer[0] = UAVTALK_SYNC_VAL; // sync byte connection->txBuffer[1] = UAVTALK_TYPE_NACK; // data length inserted here below @@ -749,11 +745,13 @@ static int32_t sendNack(UAVTalkConnectionData *connection, uint32_t objId) // Calculate checksum connection->txBuffer[dataOffset] = PIOS_CRC_updateCRC(0, connection->txBuffer, dataOffset); - // Send buffer - if (connection->outStream!=NULL) (*connection->outStream)(connection->txBuffer, dataOffset+UAVTALK_CHECKSUM_LENGTH); + uint16_t tx_msg_len = dataOffset+UAVTALK_CHECKSUM_LENGTH; + int32_t rc = (*connection->outStream)(connection->txBuffer, tx_msg_len); - // Update stats - connection->stats.txBytes += dataOffset+UAVTALK_CHECKSUM_LENGTH; + if (rc == tx_msg_len) { + // Update stats + connection->stats.txBytes += tx_msg_len; + } // Done return 0; From 5b3227d1ff930e54450e834220165ca8c92c2d5e Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Tue, 27 Dec 2011 21:12:20 -0500 Subject: [PATCH 044/121] com: reduce buffer sizes for com layer This saves a few hundred bytes of RAM in a typical configuration. --- flight/CopterControl/System/pios_board.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/flight/CopterControl/System/pios_board.c b/flight/CopterControl/System/pios_board.c index 70c60d1bb..7d2e8532f 100644 --- a/flight/CopterControl/System/pios_board.c +++ b/flight/CopterControl/System/pios_board.c @@ -780,16 +780,16 @@ static const struct pios_sbus_cfg pios_sbus_cfg = { #include "pios_com_priv.h" -#define PIOS_COM_TELEM_RF_RX_BUF_LEN 192 -#define PIOS_COM_TELEM_RF_TX_BUF_LEN 192 +#define PIOS_COM_TELEM_RF_RX_BUF_LEN 96 +#define PIOS_COM_TELEM_RF_TX_BUF_LEN 12 #define PIOS_COM_GPS_RX_BUF_LEN 32 -#define PIOS_COM_TELEM_USB_RX_BUF_LEN 192 -#define PIOS_COM_TELEM_USB_TX_BUF_LEN 192 +#define PIOS_COM_TELEM_USB_RX_BUF_LEN 96 +#define PIOS_COM_TELEM_USB_TX_BUF_LEN 65 #define PIOS_COM_BRIDGE_RX_BUF_LEN 65 -#define PIOS_COM_BRIDGE_TX_BUF_LEN 65 +#define PIOS_COM_BRIDGE_TX_BUF_LEN 12 #endif /* PIOS_INCLUDE_COM */ From ab135aa00ba9c3c06f121df2ba7e7c201b42194a Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Wed, 28 Dec 2011 12:24:32 -0500 Subject: [PATCH 045/121] com-bridge: Make com-bridge an optional (and configurable) module --- flight/Modules/ComUsbBridge/ComUsbBridge.c | 70 ++++++++++++++++++++-- shared/uavobjectdefinition/hwsettings.xml | 3 +- shared/uavobjectdefinition/taskinfo.xml | 6 +- 3 files changed, 69 insertions(+), 10 deletions(-) diff --git a/flight/Modules/ComUsbBridge/ComUsbBridge.c b/flight/Modules/ComUsbBridge/ComUsbBridge.c index 3b52119ae..984a53944 100644 --- a/flight/Modules/ComUsbBridge/ComUsbBridge.c +++ b/flight/Modules/ComUsbBridge/ComUsbBridge.c @@ -31,6 +31,7 @@ // **************** #include "openpilot.h" +#include "hwsettings.h" #include @@ -39,6 +40,7 @@ static void com2UsbBridgeTask(void *parameters); static void usb2ComBridgeTask(void *parameters); +static void updateSettings(); // **************** // Private constants @@ -60,6 +62,8 @@ static uint8_t * usb2com_buf; static uint32_t usart_port; static uint32_t vcp_port; +static bool bridge_enabled = false; + /** * Initialise the module * \return -1 if initialisation failed @@ -68,13 +72,16 @@ static uint32_t vcp_port; static int32_t comUsbBridgeStart(void) { - if (usart_port && vcp_port) { + if (bridge_enabled) { // Start tasks xTaskCreate(com2UsbBridgeTask, (signed char *)"Com2UsbBridge", STACK_SIZE_BYTES/4, NULL, TASK_PRIORITY, &com2UsbBridgeTaskHandle); + TaskMonitorAdd(TASKINFO_RUNNING_COM2USBBRIDGE, com2UsbBridgeTaskHandle); xTaskCreate(usb2ComBridgeTask, (signed char *)"Usb2ComBridge", STACK_SIZE_BYTES/4, NULL, TASK_PRIORITY, &usb2ComBridgeTaskHandle); + TaskMonitorAdd(TASKINFO_RUNNING_USB2COMBRIDGE, usb2ComBridgeTaskHandle); + return 0; } - return 0; + return -1; } /** * Initialise the module @@ -87,10 +94,25 @@ static int32_t comUsbBridgeInitialize(void) usart_port = PIOS_COM_BRIDGE; vcp_port = PIOS_COM_VCP; - com2usb_buf = pvPortMalloc(BRIDGE_BUF_LEN); - PIOS_Assert(com2usb_buf); - usb2com_buf = pvPortMalloc(BRIDGE_BUF_LEN); - PIOS_Assert(usb2com_buf); + HwSettingsInitialize(); + uint8_t optionalModules[HWSETTINGS_OPTIONALMODULES_NUMELEM]; + + HwSettingsOptionalModulesGet(optionalModules); + + if (usart_port && vcp_port && + (optionalModules[HWSETTINGS_OPTIONALMODULES_COMUSBBRIDGE] == HWSETTINGS_OPTIONALMODULES_ENABLED)) + bridge_enabled = true; + else + bridge_enabled = false; + + if (bridge_enabled) { + com2usb_buf = pvPortMalloc(BRIDGE_BUF_LEN); + PIOS_Assert(com2usb_buf); + usb2com_buf = pvPortMalloc(BRIDGE_BUF_LEN); + PIOS_Assert(usb2com_buf); + + updateSettings(); + } return 0; } @@ -135,3 +157,39 @@ static void usb2ComBridgeTask(void * parameters) } } } + + +static void updateSettings() +{ + if (usart_port) { + + // Retrieve settings + uint8_t speed; + HwSettingsComUsbBridgeSpeedGet(&speed); + + // Set port speed + switch (speed) { + case HWSETTINGS_COMUSBBRIDGESPEED_2400: + PIOS_COM_ChangeBaud(usart_port, 2400); + break; + case HWSETTINGS_COMUSBBRIDGESPEED_4800: + PIOS_COM_ChangeBaud(usart_port, 4800); + break; + case HWSETTINGS_COMUSBBRIDGESPEED_9600: + PIOS_COM_ChangeBaud(usart_port, 9600); + break; + case HWSETTINGS_COMUSBBRIDGESPEED_19200: + PIOS_COM_ChangeBaud(usart_port, 19200); + break; + case HWSETTINGS_COMUSBBRIDGESPEED_38400: + PIOS_COM_ChangeBaud(usart_port, 38400); + break; + case HWSETTINGS_COMUSBBRIDGESPEED_57600: + PIOS_COM_ChangeBaud(usart_port, 57600); + break; + case HWSETTINGS_COMUSBBRIDGESPEED_115200: + PIOS_COM_ChangeBaud(usart_port, 115200); + break; + } + } +} diff --git a/shared/uavobjectdefinition/hwsettings.xml b/shared/uavobjectdefinition/hwsettings.xml index d259ee6c2..dbb605c51 100644 --- a/shared/uavobjectdefinition/hwsettings.xml +++ b/shared/uavobjectdefinition/hwsettings.xml @@ -11,9 +11,10 @@ + - + diff --git a/shared/uavobjectdefinition/taskinfo.xml b/shared/uavobjectdefinition/taskinfo.xml index cbccac73f..11b550089 100644 --- a/shared/uavobjectdefinition/taskinfo.xml +++ b/shared/uavobjectdefinition/taskinfo.xml @@ -1,9 +1,9 @@ Task information - - - + + + From 87be56eff7a93744ba8ec1aa2bc4cda2ece37bc7 Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Wed, 28 Dec 2011 12:25:16 -0500 Subject: [PATCH 046/121] hwsettings: add support for com-bridge to hwsettings config gui --- .../src/plugins/config/cc_hw_settings.ui | 20 +++++++++++++++++++ .../plugins/config/config_cc_hw_widget.cpp | 4 +++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/ground/openpilotgcs/src/plugins/config/cc_hw_settings.ui b/ground/openpilotgcs/src/plugins/config/cc_hw_settings.ui index 929c9053d..99e173cd3 100644 --- a/ground/openpilotgcs/src/plugins/config/cc_hw_settings.ui +++ b/ground/openpilotgcs/src/plugins/config/cc_hw_settings.ui @@ -123,6 +123,19 @@ + + + + + 55 + 0 + + + + ComUsbBridge speed: + + + @@ -137,6 +150,13 @@ + + + + Select the speed here. + + + diff --git a/ground/openpilotgcs/src/plugins/config/config_cc_hw_widget.cpp b/ground/openpilotgcs/src/plugins/config/config_cc_hw_widget.cpp index 1d0f723d0..afd25e865 100644 --- a/ground/openpilotgcs/src/plugins/config/config_cc_hw_widget.cpp +++ b/ground/openpilotgcs/src/plugins/config/config_cc_hw_widget.cpp @@ -46,6 +46,7 @@ ConfigCCHWWidget::ConfigCCHWWidget(QWidget *parent) : ConfigTaskWidget(parent) addUAVObjectToWidgetRelation("HwSettings","CC_RcvrPort",m_telemetry->cbRcvr); addUAVObjectToWidgetRelation("HwSettings","TelemetrySpeed",m_telemetry->telemetrySpeed); addUAVObjectToWidgetRelation("HwSettings","GPSSpeed",m_telemetry->gpsSpeed); + addUAVObjectToWidgetRelation("HwSettings","ComUsbBridgeSpeed",m_telemetry->comUsbBridgeSpeed); connect(m_telemetry->cchwHelp,SIGNAL(clicked()),this,SLOT(openHelp())); enableControls(false); populateWidgets(); @@ -67,7 +68,8 @@ void ConfigCCHWWidget::widgetsContentsChanged() if (((m_telemetry->cbTele->currentIndex() == HwSettings::CC_MAINPORT_TELEMETRY) && (m_telemetry->cbFlexi->currentIndex() == HwSettings::CC_FLEXIPORT_TELEMETRY)) || ((m_telemetry->cbTele->currentIndex() == HwSettings::CC_MAINPORT_GPS) && (m_telemetry->cbFlexi->currentIndex() == HwSettings::CC_FLEXIPORT_GPS)) || - ((m_telemetry->cbTele->currentIndex() == HwSettings::CC_MAINPORT_COMAUX) && (m_telemetry->cbFlexi->currentIndex() == HwSettings::CC_FLEXIPORT_COMAUX))) + ((m_telemetry->cbTele->currentIndex() == HwSettings::CC_MAINPORT_COMAUX) && (m_telemetry->cbFlexi->currentIndex() == HwSettings::CC_FLEXIPORT_COMAUX)) || + ((m_telemetry->cbTele->currentIndex() == HwSettings::CC_MAINPORT_COMBRIDGE) && (m_telemetry->cbFlexi->currentIndex() == HwSettings::CC_FLEXIPORT_COMBRIDGE))) { enableControls(false); m_telemetry->problems->setText(tr("Warning: you have configured both MainPort and FlexiPort for the same function, this currently is not supported")); From 60969b57d8f7180e60ece8b6130b35d2cf85f026 Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Wed, 28 Dec 2011 16:16:29 -0500 Subject: [PATCH 047/121] usb-hid: split apart hwsettings for HID and VCP ports This allows the HID and VCP functions to be configured separately so that additional functions can be more easily bound to the VCP port. This change also provides a safety net that forces either the HID or VCP to be configured for USB Telemetry. This safety net may vanish in the future once the GCS can check it. Disabling USB Telemetry entirely would save more than 400 bytes of RAM. --- flight/CopterControl/System/pios_board.c | 100 +++++++++++++--------- shared/uavobjectdefinition/hwsettings.xml | 3 +- 2 files changed, 61 insertions(+), 42 deletions(-) diff --git a/flight/CopterControl/System/pios_board.c b/flight/CopterControl/System/pios_board.c index 7d2e8532f..385c03283 100644 --- a/flight/CopterControl/System/pios_board.c +++ b/flight/CopterControl/System/pios_board.c @@ -1074,31 +1074,14 @@ void PIOS_Board_Init(void) { uint32_t pios_usb_id; PIOS_USB_Init(&pios_usb_id, &pios_usb_main_cfg); - /* Configure the usb telemetry protocol */ - uint8_t hwsettings_usb_telemetry_channel; - HwSettingsUSB_TelemetryChannelGet(&hwsettings_usb_telemetry_channel); + /* Configure the usb VCP port */ + uint8_t hwsettings_usb_vcpport; + HwSettingsUSB_VCPPortGet(&hwsettings_usb_vcpport); - switch (hwsettings_usb_telemetry_channel) { - case HWSETTINGS_USB_TELEMETRYCHANNEL_HID: -#if defined(PIOS_INCLUDE_COM) - { - uint32_t pios_usb_com_id; - if (PIOS_USB_COM_Init(&pios_usb_com_id, &pios_usb_com_hid_cfg, pios_usb_id)) { - PIOS_Assert(0); - } - uint8_t * rx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_TELEM_USB_RX_BUF_LEN); - uint8_t * tx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_TELEM_USB_TX_BUF_LEN); - PIOS_Assert(rx_buffer); - PIOS_Assert(tx_buffer); - if (PIOS_COM_Init(&pios_com_telem_usb_id, &pios_usb_hid_com_driver, pios_usb_com_id, - rx_buffer, PIOS_COM_TELEM_USB_RX_BUF_LEN, - tx_buffer, PIOS_COM_TELEM_USB_TX_BUF_LEN)) { - PIOS_Assert(0); - } - } -#endif /* PIOS_INCLUDE_COM */ + switch (hwsettings_usb_vcpport) { + case HWSETTINGS_USB_VCPPORT_DISABLED: break; - case HWSETTINGS_USB_TELEMETRYCHANNEL_CDC: + case HWSETTINGS_USB_VCPPORT_USBTELEMETRY: #if defined(PIOS_INCLUDE_COM) { uint32_t pios_usb_com_id; @@ -1117,9 +1100,60 @@ void PIOS_Board_Init(void) { } #endif /* PIOS_INCLUDE_COM */ break; - default: - PIOS_Assert(0); + case HWSETTINGS_USB_VCPPORT_COMBRIDGE: + { + uint32_t pios_usb_vcp_id; + if (PIOS_USB_COM_Init(&pios_usb_vcp_id, &pios_usb_com_cdc_cfg, pios_usb_id)) { + PIOS_Assert(0); + } + uint8_t * rx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_BRIDGE_RX_BUF_LEN); + uint8_t * tx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_BRIDGE_TX_BUF_LEN); + PIOS_Assert(rx_buffer); + PIOS_Assert(tx_buffer); + if (PIOS_COM_Init(&pios_com_vcp_id, &pios_usb_cdc_com_driver, pios_usb_vcp_id, + rx_buffer, PIOS_COM_BRIDGE_RX_BUF_LEN, + tx_buffer, PIOS_COM_BRIDGE_TX_BUF_LEN)) { + PIOS_Assert(0); + } + + } + break; } + + /* Configure the usb HID port */ + uint8_t hwsettings_usb_hidport; + HwSettingsUSB_HIDPortGet(&hwsettings_usb_hidport); + + /* Make sure we have at least one telemetry link over USB */ + if (hwsettings_usb_vcpport != HWSETTINGS_USB_VCPPORT_USBTELEMETRY) { + hwsettings_usb_hidport = HWSETTINGS_USB_HIDPORT_USBTELEMETRY; + } + + switch (hwsettings_usb_hidport) { + case HWSETTINGS_USB_HIDPORT_DISABLED: + break; + case HWSETTINGS_USB_HIDPORT_USBTELEMETRY: +#if defined(PIOS_INCLUDE_COM) + { + uint32_t pios_usb_com_id; + if (PIOS_USB_COM_Init(&pios_usb_com_id, &pios_usb_com_hid_cfg, pios_usb_id)) { + PIOS_Assert(0); + } + uint8_t * rx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_TELEM_USB_RX_BUF_LEN); + uint8_t * tx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_TELEM_USB_TX_BUF_LEN); + PIOS_Assert(rx_buffer); + PIOS_Assert(tx_buffer); + if (PIOS_COM_Init(&pios_com_telem_usb_id, &pios_usb_hid_com_driver, pios_usb_com_id, + rx_buffer, PIOS_COM_TELEM_USB_RX_BUF_LEN, + tx_buffer, PIOS_COM_TELEM_USB_TX_BUF_LEN)) { + PIOS_Assert(0); + } + } +#endif /* PIOS_INCLUDE_COM */ + break; + } + + #endif /* PIOS_INCLUDE_USB_HID */ /* Configure the main IO port */ @@ -1253,22 +1287,6 @@ void PIOS_Board_Init(void) { PIOS_Assert(0); } } - { - uint32_t pios_usb_vcp_id; - if (PIOS_USB_COM_Init(&pios_usb_vcp_id, &pios_usb_com_cdc_cfg, pios_usb_id)) { - PIOS_Assert(0); - } - uint8_t * rx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_BRIDGE_RX_BUF_LEN); - uint8_t * tx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_BRIDGE_TX_BUF_LEN); - PIOS_Assert(rx_buffer); - PIOS_Assert(tx_buffer); - if (PIOS_COM_Init(&pios_com_vcp_id, &pios_usb_cdc_com_driver, pios_usb_vcp_id, - rx_buffer, PIOS_COM_BRIDGE_RX_BUF_LEN, - tx_buffer, PIOS_COM_BRIDGE_TX_BUF_LEN)) { - PIOS_Assert(0); - } - - } break; } diff --git a/shared/uavobjectdefinition/hwsettings.xml b/shared/uavobjectdefinition/hwsettings.xml index dbb605c51..263d5f279 100644 --- a/shared/uavobjectdefinition/hwsettings.xml +++ b/shared/uavobjectdefinition/hwsettings.xml @@ -12,7 +12,8 @@ - + + From 56c4ff8f40532524ceaea6d07f23780ee8399582 Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Wed, 28 Dec 2011 16:17:10 -0500 Subject: [PATCH 048/121] com-bridge: add support for bridging to flexiport --- flight/CopterControl/System/pios_board.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/flight/CopterControl/System/pios_board.c b/flight/CopterControl/System/pios_board.c index 385c03283..3a28f5d4c 100644 --- a/flight/CopterControl/System/pios_board.c +++ b/flight/CopterControl/System/pios_board.c @@ -1316,6 +1316,24 @@ void PIOS_Board_Init(void) { } #endif /* PIOS_INCLUDE_TELEMETRY_RF */ break; + case HWSETTINGS_CC_FLEXIPORT_COMBRIDGE: + { + uint32_t pios_usart_generic_id; + if (PIOS_USART_Init(&pios_usart_generic_id, &pios_usart_generic_flexi_cfg)) { + PIOS_Assert(0); + } + + uint8_t * rx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_BRIDGE_RX_BUF_LEN); + uint8_t * tx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_BRIDGE_TX_BUF_LEN); + PIOS_Assert(rx_buffer); + PIOS_Assert(tx_buffer); + if (PIOS_COM_Init(&pios_com_bridge_id, &pios_usart_com_driver, pios_usart_generic_id, + rx_buffer, PIOS_COM_BRIDGE_RX_BUF_LEN, + tx_buffer, PIOS_COM_BRIDGE_TX_BUF_LEN)) { + PIOS_Assert(0); + } + } + break; case HWSETTINGS_CC_FLEXIPORT_GPS: #if defined(PIOS_INCLUDE_GPS) { @@ -1387,8 +1405,6 @@ void PIOS_Board_Init(void) { } #endif /* PIOS_INCLUDE_I2C */ break; - case HWSETTINGS_CC_FLEXIPORT_COMBRIDGE: - break; } /* Configure the rcvr port */ From ad793f0b815c86734a8cff930a12bb83afdb21a7 Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Wed, 28 Dec 2011 16:18:44 -0500 Subject: [PATCH 049/121] hwsettings: add HID and VCP config to hwsettings gui --- .../src/plugins/config/cc_hw_settings.ui | 28 ++++++++++++++++++- .../plugins/config/config_cc_hw_widget.cpp | 7 +++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/ground/openpilotgcs/src/plugins/config/cc_hw_settings.ui b/ground/openpilotgcs/src/plugins/config/cc_hw_settings.ui index 99e173cd3..118acb6e4 100644 --- a/ground/openpilotgcs/src/plugins/config/cc_hw_settings.ui +++ b/ground/openpilotgcs/src/plugins/config/cc_hw_settings.ui @@ -71,7 +71,7 @@ - + Qt::Horizontal @@ -84,6 +84,32 @@ + + + + USB HID Port + + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + + + + + + + + + + USB VCP Port + + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + + + + + + diff --git a/ground/openpilotgcs/src/plugins/config/config_cc_hw_widget.cpp b/ground/openpilotgcs/src/plugins/config/config_cc_hw_widget.cpp index afd25e865..67ae8901b 100644 --- a/ground/openpilotgcs/src/plugins/config/config_cc_hw_widget.cpp +++ b/ground/openpilotgcs/src/plugins/config/config_cc_hw_widget.cpp @@ -44,6 +44,8 @@ ConfigCCHWWidget::ConfigCCHWWidget(QWidget *parent) : ConfigTaskWidget(parent) addUAVObjectToWidgetRelation("HwSettings","CC_FlexiPort",m_telemetry->cbFlexi); addUAVObjectToWidgetRelation("HwSettings","CC_MainPort",m_telemetry->cbTele); addUAVObjectToWidgetRelation("HwSettings","CC_RcvrPort",m_telemetry->cbRcvr); + addUAVObjectToWidgetRelation("HwSettings","USB_HIDPort",m_telemetry->cbUsbHid); + addUAVObjectToWidgetRelation("HwSettings","USB_VCPPort",m_telemetry->cbUsbVcp); addUAVObjectToWidgetRelation("HwSettings","TelemetrySpeed",m_telemetry->telemetrySpeed); addUAVObjectToWidgetRelation("HwSettings","GPSSpeed",m_telemetry->gpsSpeed); addUAVObjectToWidgetRelation("HwSettings","ComUsbBridgeSpeed",m_telemetry->comUsbBridgeSpeed); @@ -74,6 +76,11 @@ void ConfigCCHWWidget::widgetsContentsChanged() enableControls(false); m_telemetry->problems->setText(tr("Warning: you have configured both MainPort and FlexiPort for the same function, this currently is not supported")); } + else if ((m_telemetry->cbUsbHid->currentIndex() == HwSettings::USB_HIDPORT_USBTELEMETRY) && (m_telemetry->cbUsbVcp->currentIndex() == HwSettings::USB_VCPPORT_USBTELEMETRY)) + { + enableControls(false); + m_telemetry->problems->setText(tr("Warning: you have configured both USB HID Port and USB VCP Port for the same function, this currently is not supported")); + } else { m_telemetry->problems->setText(""); From 7c03875013143069f133b0d094222962aeb297e5 Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Fri, 30 Dec 2011 12:49:27 -0500 Subject: [PATCH 050/121] diag-tasks: make taskinfo diagnostics a separate enable This allows task stack analysis without turning on all of the other diagnostics. --- flight/CopterControl/Makefile | 4 ++++ flight/CopterControl/System/inc/FreeRTOSConfig.h | 2 +- flight/CopterControl/System/taskmonitor.c | 4 ++-- flight/Modules/System/systemmod.c | 4 +++- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/flight/CopterControl/Makefile b/flight/CopterControl/Makefile index 66186ed86..fc24341f8 100644 --- a/flight/CopterControl/Makefile +++ b/flight/CopterControl/Makefile @@ -435,6 +435,10 @@ ifeq ($(DIAGNOSTICS),YES) CFLAGS = -DDIAGNOSTICS endif +ifeq ($(DIAG_TASKS),YES) +CFLAGS = -DDIAG_TASKS +endif + CFLAGS += -g$(DEBUGF) CFLAGS += -O$(OPT) CFLAGS += -mcpu=$(MCU) diff --git a/flight/CopterControl/System/inc/FreeRTOSConfig.h b/flight/CopterControl/System/inc/FreeRTOSConfig.h index 994956008..68bb9da0e 100644 --- a/flight/CopterControl/System/inc/FreeRTOSConfig.h +++ b/flight/CopterControl/System/inc/FreeRTOSConfig.h @@ -76,7 +76,7 @@ NVIC value of 255. */ #endif /* Enable run time stats collection */ -#if defined(DIAGNOSTICS) +#if defined(DIAG_TASKS) #define configCHECK_FOR_STACK_OVERFLOW 2 #define configGENERATE_RUN_TIME_STATS 1 diff --git a/flight/CopterControl/System/taskmonitor.c b/flight/CopterControl/System/taskmonitor.c index 6ff6299d0..627dedaab 100644 --- a/flight/CopterControl/System/taskmonitor.c +++ b/flight/CopterControl/System/taskmonitor.c @@ -47,7 +47,7 @@ int32_t TaskMonitorInitialize(void) lock = xSemaphoreCreateRecursiveMutex(); memset(handles, 0, sizeof(xTaskHandle)*TASKINFO_RUNNING_NUMELEM); lastMonitorTime = 0; -#if defined(DIAGNOSTICS) +#if defined(DIAG_TASKS) lastMonitorTime = portGET_RUN_TIME_COUNTER_VALUE(); #endif return 0; @@ -76,7 +76,7 @@ int32_t TaskMonitorAdd(TaskInfoRunningElem task, xTaskHandle handle) */ void TaskMonitorUpdateAll(void) { -#if defined(DIAGNOSTICS) +#if defined(DIAG_TASKS) TaskInfoData data; int n; diff --git a/flight/Modules/System/systemmod.c b/flight/Modules/System/systemmod.c index b3da26870..67701ace1 100644 --- a/flight/Modules/System/systemmod.c +++ b/flight/Modules/System/systemmod.c @@ -115,8 +115,10 @@ int32_t SystemModInitialize(void) SystemStatsInitialize(); FlightStatusInitialize(); ObjectPersistenceInitialize(); -#if defined(DIAGNOSTICS) +#if defined(DIAG_TASKS) TaskInfoInitialize(); +#endif +#if defined(DIAGNOSTICS) I2CStatsInitialize(); WatchdogStatusInitialize(); #endif From 2cf1fe93c68df58abeb36e736c695fd46b8fdec4 Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Fri, 30 Dec 2011 12:55:51 -0500 Subject: [PATCH 051/121] com: don't block forever waiting for a transmitter Not all transmitters will continue to run when disconnected. USB is one example of this. When the USB cable was disconnected, any transmitter blocked here would wait forever. This was particularly noticeable when the telemetry Tx task blocked forever on USB disconnect. This also resulted in the telemetry Rx task blocking forever waiting on the UAVTalk connection lock. We now block for a max of 5s waiting for space in the transmit buffer. --- flight/PiOS/Common/pios_com.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flight/PiOS/Common/pios_com.c b/flight/PiOS/Common/pios_com.c index 29179c99f..e5440d065 100644 --- a/flight/PiOS/Common/pios_com.c +++ b/flight/PiOS/Common/pios_com.c @@ -352,7 +352,7 @@ int32_t PIOS_COM_SendBuffer(uint32_t com_id, const uint8_t *buffer, uint16_t len fifoBuf_getUsed(&com_dev->tx)); } #if defined(PIOS_INCLUDE_FREERTOS) - if (xSemaphoreTake(com_dev->tx_sem, portMAX_DELAY) != pdTRUE) { + if (xSemaphoreTake(com_dev->tx_sem, 5000) != pdTRUE) { return -3; } #endif From fa9702db97a45819c60f6b787dce8f362523c547 Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Fri, 30 Dec 2011 13:00:37 -0500 Subject: [PATCH 052/121] gcs serial: fix broken baud rate selection The difference between 56000 and 57600 baud is very important. When using a USB to serial adapter that is capable of synthesizing arbitrary baud rates, these errors resulted in a completely mismatched/unusable serial link. --- .../src/plugins/serialconnection/serialplugin.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/serialconnection/serialplugin.cpp b/ground/openpilotgcs/src/plugins/serialconnection/serialplugin.cpp index 23bb8f9f9..d799e843f 100644 --- a/ground/openpilotgcs/src/plugins/serialconnection/serialplugin.cpp +++ b/ground/openpilotgcs/src/plugins/serialconnection/serialplugin.cpp @@ -209,9 +209,9 @@ BaudRateType SerialConnection::stringToBaud(QString str) if(str=="1200") return BAUD1200; else if(str=="2400") - return BAUD1200; - else if(str== "4800") return BAUD2400; + else if(str== "4800") + return BAUD4800; else if(str== "9600") return BAUD9600; else if(str== "19200") @@ -219,7 +219,7 @@ BaudRateType SerialConnection::stringToBaud(QString str) else if(str== "38400") return BAUD38400; else if(str== "57600") - return BAUD56000; + return BAUD57600; else if(str== "115200") return BAUD115200; else if(str== "230400") @@ -229,7 +229,7 @@ BaudRateType SerialConnection::stringToBaud(QString str) else if(str== "921600") return BAUD921600; else - return BAUD56000; + return BAUD57600; } SerialPlugin::SerialPlugin() From bd9f3569db85ffb5dcb2dcf1330b7b22c830bf3d Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Fri, 30 Dec 2011 13:02:42 -0500 Subject: [PATCH 053/121] gcs uavtalk: Add full state-level debug logs These logs are disabled by default, and can be turned on at compile time by defining: UAVTALK_DEBUG at the top of uavtalk.cpp. These logs proved very helpful in diagnosing a serial comms issue. --- .../src/plugins/uavtalk/uavtalk.cpp | 94 ++++++++++++++++++- 1 file changed, 93 insertions(+), 1 deletion(-) diff --git a/ground/openpilotgcs/src/plugins/uavtalk/uavtalk.cpp b/ground/openpilotgcs/src/plugins/uavtalk/uavtalk.cpp index 7295f79c3..aa5428bfd 100644 --- a/ground/openpilotgcs/src/plugins/uavtalk/uavtalk.cpp +++ b/ground/openpilotgcs/src/plugins/uavtalk/uavtalk.cpp @@ -28,6 +28,11 @@ #include #include +//#define UAVTALK_DEBUG +#ifdef UAVTALK_DEBUG +#include "qxtlogger.h" +#endif + #define SYNC_VAL 0x3C const quint8 UAVTalk::crc_table[256] = { @@ -207,7 +212,12 @@ bool UAVTalk::processInputByte(quint8 rxbyte) case STATE_SYNC: if (rxbyte != SYNC_VAL) + { +#ifdef UAVTALK_DEBUG + qxtLog->debug("UAVTalk: Sync->Sync (" + QString::number(rxbyte) + " " + QString("0x%1").arg(rxbyte,2,16) + ")"); +#endif break; + } // Initialize and update CRC rxCS = updateCRC(0, rxbyte); @@ -215,6 +225,9 @@ bool UAVTalk::processInputByte(quint8 rxbyte) rxPacketLength = 1; rxState = STATE_TYPE; +#ifdef UAVTALK_DEBUG + qxtLog->debug("UAVTalk: Sync->Type"); +#endif break; case STATE_TYPE: @@ -225,6 +238,9 @@ bool UAVTalk::processInputByte(quint8 rxbyte) if ((rxbyte & TYPE_MASK) != TYPE_VER) { rxState = STATE_SYNC; +#ifdef UAVTALK_DEBUG + qxtLog->debug("UAVTalk: Type->Sync"); +#endif break; } @@ -233,6 +249,9 @@ bool UAVTalk::processInputByte(quint8 rxbyte) packetSize = 0; rxState = STATE_SIZE; +#ifdef UAVTALK_DEBUG + qxtLog->debug("UAVTalk: Type->Size"); +#endif rxCount = 0; break; @@ -245,6 +264,9 @@ bool UAVTalk::processInputByte(quint8 rxbyte) { packetSize += rxbyte; rxCount++; +#ifdef UAVTALK_DEBUG + qxtLog->debug("UAVTalk: Size->Size"); +#endif break; } @@ -253,11 +275,17 @@ bool UAVTalk::processInputByte(quint8 rxbyte) if (packetSize < MIN_HEADER_LENGTH || packetSize > MAX_HEADER_LENGTH + MAX_PAYLOAD_LENGTH) { // incorrect packet size rxState = STATE_SYNC; +#ifdef UAVTALK_DEBUG + qxtLog->debug("UAVTalk: Size->Sync"); +#endif break; } rxCount = 0; rxState = STATE_OBJID; +#ifdef UAVTALK_DEBUG + qxtLog->debug("UAVTalk: Size->ObjID"); +#endif break; case STATE_OBJID: @@ -267,7 +295,12 @@ bool UAVTalk::processInputByte(quint8 rxbyte) rxTmpBuffer[rxCount++] = rxbyte; if (rxCount < 4) + { +#ifdef UAVTALK_DEBUG + qxtLog->debug("UAVTalk: ObjID->ObjID"); +#endif break; + } // Search for object, if not found reset state machine rxObjId = (qint32)qFromLittleEndian(rxTmpBuffer); @@ -277,6 +310,9 @@ bool UAVTalk::processInputByte(quint8 rxbyte) { stats.rxErrors++; rxState = STATE_SYNC; +#ifdef UAVTALK_DEBUG + qxtLog->debug("UAVTalk: ObjID->Sync (badtype)"); +#endif break; } @@ -297,6 +333,9 @@ bool UAVTalk::processInputByte(quint8 rxbyte) { stats.rxErrors++; rxState = STATE_SYNC; +#ifdef UAVTALK_DEBUG + qxtLog->debug("UAVTalk: ObjID->Sync (oversize)"); +#endif break; } @@ -305,6 +344,9 @@ bool UAVTalk::processInputByte(quint8 rxbyte) { // packet error - mismatched packet size stats.rxErrors++; rxState = STATE_SYNC; +#ifdef UAVTALK_DEBUG + qxtLog->debug("UAVTalk: ObjID->Sync (length mismatch)"); +#endif break; } @@ -314,6 +356,9 @@ bool UAVTalk::processInputByte(quint8 rxbyte) // This is a non-existing object, just skip to checksum // and we'll send a NACK next. rxState = STATE_CS; +#ifdef UAVTALK_DEBUG + qxtLog->debug("UAVTalk: ObjID->CSum (no obj)"); +#endif rxInstId = 0; rxCount = 0; } @@ -321,15 +366,28 @@ bool UAVTalk::processInputByte(quint8 rxbyte) { // If there is a payload get it, otherwise receive checksum if (rxLength > 0) + { rxState = STATE_DATA; +#ifdef UAVTALK_DEBUG + qxtLog->debug("UAVTalk: ObjID->Data (needs data)"); +#endif + } else + { rxState = STATE_CS; +#ifdef UAVTALK_DEBUG + qxtLog->debug("UAVTalk: ObjID->Checksum"); +#endif + } rxInstId = 0; rxCount = 0; } else { rxState = STATE_INSTID; +#ifdef UAVTALK_DEBUG + qxtLog->debug("UAVTalk: ObjID->InstID"); +#endif rxCount = 0; } } @@ -343,7 +401,12 @@ bool UAVTalk::processInputByte(quint8 rxbyte) rxTmpBuffer[rxCount++] = rxbyte; if (rxCount < 2) + { +#ifdef UAVTALK_DEBUG + qxtLog->debug("UAVTalk: InstID->InstID"); +#endif break; + } rxInstId = (qint16)qFromLittleEndian(rxTmpBuffer); @@ -351,10 +414,19 @@ bool UAVTalk::processInputByte(quint8 rxbyte) // If there is a payload get it, otherwise receive checksum if (rxLength > 0) + { rxState = STATE_DATA; +#ifdef UAVTALK_DEBUG + qxtLog->debug("UAVTalk: InstID->Data"); +#endif + } else + { rxState = STATE_CS; - +#ifdef UAVTALK_DEBUG + qxtLog->debug("UAVTalk: InstID->CSum"); +#endif + } break; case STATE_DATA: @@ -364,9 +436,17 @@ bool UAVTalk::processInputByte(quint8 rxbyte) rxBuffer[rxCount++] = rxbyte; if (rxCount < rxLength) + { +#ifdef UAVTALK_DEBUG + qxtLog->debug("UAVTalk: Data->Data"); +#endif break; + } rxState = STATE_CS; +#ifdef UAVTALK_DEBUG + qxtLog->debug("UAVTalk: Data->CSum"); +#endif rxCount = 0; break; @@ -379,6 +459,9 @@ bool UAVTalk::processInputByte(quint8 rxbyte) { // packet error - faulty CRC stats.rxErrors++; rxState = STATE_SYNC; +#ifdef UAVTALK_DEBUG + qxtLog->debug("UAVTalk: CSum->Sync (badcrc)"); +#endif break; } @@ -386,6 +469,9 @@ bool UAVTalk::processInputByte(quint8 rxbyte) { // packet error - mismatched packet size stats.rxErrors++; rxState = STATE_SYNC; +#ifdef UAVTALK_DEBUG + qxtLog->debug("UAVTalk: CSum->Sync (length mismatch)"); +#endif break; } @@ -396,11 +482,17 @@ bool UAVTalk::processInputByte(quint8 rxbyte) mutex->unlock(); rxState = STATE_SYNC; +#ifdef UAVTALK_DEBUG + qxtLog->debug("UAVTalk: CSum->Sync (OK)"); +#endif break; default: rxState = STATE_SYNC; stats.rxErrors++; +#ifdef UAVTALK_DEBUG + qxtLog->debug("UAVTalk: ???->Sync"); +#endif } // Done From e980bb863fc2197af62d71c34ae551d937c11a06 Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Fri, 30 Dec 2011 13:04:05 -0500 Subject: [PATCH 054/121] uavobj browser: add object size to tree display --- .../src/plugins/uavobjectbrowser/uavobjecttreemodel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ground/openpilotgcs/src/plugins/uavobjectbrowser/uavobjecttreemodel.cpp b/ground/openpilotgcs/src/plugins/uavobjectbrowser/uavobjecttreemodel.cpp index 64ad9544c..ac2e4bcee 100644 --- a/ground/openpilotgcs/src/plugins/uavobjectbrowser/uavobjecttreemodel.cpp +++ b/ground/openpilotgcs/src/plugins/uavobjectbrowser/uavobjecttreemodel.cpp @@ -95,7 +95,7 @@ void UAVObjectTreeModel::addDataObject(UAVDataObject *obj) int index = root->objIds().indexOf(obj->getObjID()); addInstance(obj, root->child(index)); } else { - DataObjectTreeItem *data = new DataObjectTreeItem(obj->getName()); + DataObjectTreeItem *data = new DataObjectTreeItem(obj->getName() + " (" + QString::number(obj->getNumBytes()) + " bytes)"); connect(data, SIGNAL(updateHighlight(TreeItem*)), this, SLOT(updateHighlight(TreeItem*))); int index = root->nameIndex(obj->getName()); root->insert(index, data); From 45615b5812afc9269edc420de915a043bd248f01 Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Fri, 30 Dec 2011 13:07:25 -0500 Subject: [PATCH 055/121] com: reduce buffer sizes on com interfaces on CC Now that the COM layer fragments to the underlying buffer sizes, the COM layer buffers can shrink below single message sizes. --- flight/CopterControl/System/pios_board.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/flight/CopterControl/System/pios_board.c b/flight/CopterControl/System/pios_board.c index 3a28f5d4c..c8320175d 100644 --- a/flight/CopterControl/System/pios_board.c +++ b/flight/CopterControl/System/pios_board.c @@ -780,12 +780,12 @@ static const struct pios_sbus_cfg pios_sbus_cfg = { #include "pios_com_priv.h" -#define PIOS_COM_TELEM_RF_RX_BUF_LEN 96 +#define PIOS_COM_TELEM_RF_RX_BUF_LEN 32 #define PIOS_COM_TELEM_RF_TX_BUF_LEN 12 #define PIOS_COM_GPS_RX_BUF_LEN 32 -#define PIOS_COM_TELEM_USB_RX_BUF_LEN 96 +#define PIOS_COM_TELEM_USB_RX_BUF_LEN 65 #define PIOS_COM_TELEM_USB_TX_BUF_LEN 65 #define PIOS_COM_BRIDGE_RX_BUF_LEN 65 @@ -1023,9 +1023,9 @@ const struct pios_usb_com_cfg pios_usb_com_cdc_cfg = { uint32_t pios_com_telem_rf_id; uint32_t pios_com_telem_usb_id; -uint32_t pios_com_vcp_id = 0; +uint32_t pios_com_vcp_id; uint32_t pios_com_gps_id; -uint32_t pios_com_bridge_id = 0; +uint32_t pios_com_bridge_id; /** * PIOS_Board_Init() From 1543a6dbd394b376a9279f7a05822b654498e160 Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Fri, 30 Dec 2011 13:12:46 -0500 Subject: [PATCH 056/121] hwsettings: allow disabling of USB telemetry entirely The GCS hwsettings config widget now disallows any configuration that disables both HID and VCP telemetry over the USB port. The firmware will allow it if the UAVObj is set manually. This allows a mechanism to reduce RAM usage by another 500 more bytes if USB telemetry can be sacrificed in certain configurations. --- flight/CopterControl/System/pios_board.c | 5 ----- flight/Modules/Telemetry/telemetry.c | 4 ++-- .../openpilotgcs/src/plugins/config/config_cc_hw_widget.cpp | 5 +++++ 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/flight/CopterControl/System/pios_board.c b/flight/CopterControl/System/pios_board.c index c8320175d..9df05515a 100644 --- a/flight/CopterControl/System/pios_board.c +++ b/flight/CopterControl/System/pios_board.c @@ -1124,11 +1124,6 @@ void PIOS_Board_Init(void) { uint8_t hwsettings_usb_hidport; HwSettingsUSB_HIDPortGet(&hwsettings_usb_hidport); - /* Make sure we have at least one telemetry link over USB */ - if (hwsettings_usb_vcpport != HWSETTINGS_USB_VCPPORT_USBTELEMETRY) { - hwsettings_usb_hidport = HWSETTINGS_USB_HIDPORT_USBTELEMETRY; - } - switch (hwsettings_usb_hidport) { case HWSETTINGS_USB_HIDPORT_DISABLED: break; diff --git a/flight/Modules/Telemetry/telemetry.c b/flight/Modules/Telemetry/telemetry.c index cf24ec12a..23b1a0549 100644 --- a/flight/Modules/Telemetry/telemetry.c +++ b/flight/Modules/Telemetry/telemetry.c @@ -310,7 +310,7 @@ static void telemetryRxTask(void *parameters) while (1) { #if defined(PIOS_INCLUDE_USB_HID) // Determine input port (USB takes priority over telemetry port) - if (PIOS_USB_HID_CheckAvailable(0)) { + if (PIOS_USB_HID_CheckAvailable(0) && PIOS_COM_TELEM_USB) { inputPort = PIOS_COM_TELEM_USB; } else #endif /* PIOS_INCLUDE_USB_HID */ @@ -348,7 +348,7 @@ static int32_t transmitData(uint8_t * data, int32_t length) // Determine input port (USB takes priority over telemetry port) #if defined(PIOS_INCLUDE_USB_HID) - if (PIOS_USB_HID_CheckAvailable(0)) { + if (PIOS_USB_HID_CheckAvailable(0) && PIOS_COM_TELEM_USB) { outputPort = PIOS_COM_TELEM_USB; } else #endif /* PIOS_INCLUDE_USB_HID */ diff --git a/ground/openpilotgcs/src/plugins/config/config_cc_hw_widget.cpp b/ground/openpilotgcs/src/plugins/config/config_cc_hw_widget.cpp index 67ae8901b..ed6e6e551 100644 --- a/ground/openpilotgcs/src/plugins/config/config_cc_hw_widget.cpp +++ b/ground/openpilotgcs/src/plugins/config/config_cc_hw_widget.cpp @@ -81,6 +81,11 @@ void ConfigCCHWWidget::widgetsContentsChanged() enableControls(false); m_telemetry->problems->setText(tr("Warning: you have configured both USB HID Port and USB VCP Port for the same function, this currently is not supported")); } + else if ((m_telemetry->cbUsbHid->currentIndex() != HwSettings::USB_HIDPORT_USBTELEMETRY) && (m_telemetry->cbUsbVcp->currentIndex() != HwSettings::USB_VCPPORT_USBTELEMETRY)) + { + enableControls(false); + m_telemetry->problems->setText(tr("Warning: you have disabled USB Telemetry on both USB HID Port and USB VCP Port, this currently is not supported")); + } else { m_telemetry->problems->setText(""); From b91f40eb94772541bf58cec3472bedabdf86e5f0 Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Fri, 30 Dec 2011 13:15:39 -0500 Subject: [PATCH 057/121] iap: extend API to support read/write of boot counter Also clean up unused/obsolete definitions. --- flight/PiOS/Common/pios_iap.c | 21 ++++++++++----------- flight/PiOS/inc/pios_iap.h | 15 +++------------ 2 files changed, 13 insertions(+), 23 deletions(-) diff --git a/flight/PiOS/Common/pios_iap.c b/flight/PiOS/Common/pios_iap.c index b9a71a331..bb679f067 100644 --- a/flight/PiOS/Common/pios_iap.c +++ b/flight/PiOS/Common/pios_iap.c @@ -20,17 +20,6 @@ #define IAP_MAGIC_WORD_1 0x1122 #define IAP_MAGIC_WORD_2 0xAA55 -#define IAP_REQLOC_1 BKP_DR1 -#define IAP_CRCLOC_LOW BKP_DR2 -#define IAP_CRCLOC_UPPER BKP_DR3 -#define IAP_PORTLOC BKP_DR4 -#define IAP_REQLOC_2 BKP_RR5 - -#define IAP_UPLOAD_REQ_1 0x20AA -#define IAP_UPLOAD_REQ_2 0x2055 -#define IAP_DNLOAD_REQ_1 0x30AA -#define IAP_DNLOAD_REQ_2 0x3055 - #define UPPERWORD16(lw) (uint16_t)((uint32_t)(lw)>>16) #define LOWERWORD16(lw) (uint16_t)((uint32_t)(lw)&0x0000ffff) #define UPPERBYTE(w) (uint8_t)((w)>>8) @@ -121,3 +110,13 @@ void PIOS_IAP_ClearRequest(void) BKP_WriteBackupRegister( MAGIC_REG_1, 0); BKP_WriteBackupRegister( MAGIC_REG_2, 0); } + +uint16_t PIOS_IAP_ReadBootCount(void) +{ + return BKP_ReadBackupRegister ( IAP_BOOTCOUNT ); +} + +void PIOS_IAP_WriteBootCount (uint16_t boot_count) +{ + BKP_WriteBackupRegister ( IAP_BOOTCOUNT, boot_count ); +} diff --git a/flight/PiOS/inc/pios_iap.h b/flight/PiOS/inc/pios_iap.h index aae0132f0..1f67d651f 100644 --- a/flight/PiOS/inc/pios_iap.h +++ b/flight/PiOS/inc/pios_iap.h @@ -19,27 +19,18 @@ ****************************************************************************************/ #define MAGIC_REG_1 BKP_DR1 #define MAGIC_REG_2 BKP_DR2 -#define IAP_COMM BKP_DR3 - -#define IAP_COMM_INVALID 0 -#define IAP_COMM_USB 1 -#define IAP_COMM_TELEMETRY 2 -#define IAP_COMM_SPI_AHRS 3 -#define IAP_COMM_I2C 4 -// Additional types can be added along with the proper support code. +#define IAP_BOOTCOUNT BKP_DR3 /**************************************************************************************** * Public Functions ****************************************************************************************/ void PIOS_IAP_Init(void); -uint32_t PIOS_IAP_CRCVerify( void ); uint32_t PIOS_IAP_CheckRequest( void ); -void PIOS_IAP_SetCommInput( uint16_t comm ); -uint16_t PIOS_IAP_GetCommInput( void ); void PIOS_IAP_SetRequest1(void); void PIOS_IAP_SetRequest2(void); void PIOS_IAP_ClearRequest(void); -void PIOS_IAP_SetCRC( uint32_t crcval ); +uint16_t PIOS_IAP_ReadBootCount(void); +void PIOS_IAP_WriteBootCount(uint16_t); /**************************************************************************************** * Public Data From f886af186d309571919e03248428f6c13160a73d Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Fri, 30 Dec 2011 13:26:54 -0500 Subject: [PATCH 058/121] bootfault: add support for recovery from init failures After 3 failed warm start attempts, the init sequence will force the RAM version of the HWSettings object to its defaults. This should allow a user to regain connectivity to a board that is continually faulting during init. This is accomplished by: - Incrementing a boot counter that is stored in the STM32 BKP registers. These registers survive a warm start but are cleared on a cold start (ie. powerup). - On multiple failures, force hwsettings to defaults and raise the (new) BootFault alarm to prevent arming. - Resetting the boot counter whenever the system manages to successfully run the System Module task. NOTE: This does not actually change the hwsettings object in flash. That's up to the user. This is intended to catch ONLY faults during early initialization. It should not be used to recover from faults after the application is up and running. --- flight/CopterControl/System/pios_board.c | 31 +++++++++++++++------ flight/Modules/System/systemmod.c | 14 +++++++++- shared/uavobjectdefinition/systemalarms.xml | 2 +- 3 files changed, 36 insertions(+), 11 deletions(-) diff --git a/flight/CopterControl/System/pios_board.c b/flight/CopterControl/System/pios_board.c index 9df05515a..9d8981eeb 100644 --- a/flight/CopterControl/System/pios_board.c +++ b/flight/CopterControl/System/pios_board.c @@ -1052,15 +1052,32 @@ void PIOS_Board_Init(void) { UAVObjInitialize(); HwSettingsInitialize(); - -#if defined(PIOS_INCLUDE_RTC) - /* Initialize the real-time clock and its associated tick */ - PIOS_RTC_Init(&pios_rtc_main_cfg); + +#ifndef ERASE_FLASH + /* Initialize watchdog as early as possible to catch faults during init */ + PIOS_WDG_Init(); #endif /* Initialize the alarms library */ AlarmsInitialize(); + /* Check for repeated boot failures */ + PIOS_IAP_Init(); + uint16_t boot_count = PIOS_IAP_ReadBootCount(); + if (boot_count < 3) { + PIOS_IAP_WriteBootCount(++boot_count); + AlarmsClear(SYSTEMALARMS_ALARM_BOOTFAULT); + } else { + /* Too many failed boot attempts, force hwsettings to defaults */ + HwSettingsSetDefaults(HwSettingsHandle(), 0); + AlarmsSet(SYSTEMALARMS_ALARM_BOOTFAULT, SYSTEMALARMS_ALARM_CRITICAL); + } + +#if defined(PIOS_INCLUDE_RTC) + /* Initialize the real-time clock and its associated tick */ + PIOS_RTC_Init(&pios_rtc_main_cfg); +#endif + /* Initialize the task monitor library */ TaskMonitorInitialize(); @@ -1450,7 +1467,7 @@ void PIOS_Board_Init(void) { pios_rcvr_group_map[MANUALCONTROLSETTINGS_CHANNELGROUPS_GCS] = pios_gcsrcvr_rcvr_id; #endif /* PIOS_INCLUDE_GCSRCVR */ - /* Remap AFIO pin */ + /* Remap AFIO pin for PB4 (Servo 5 Out)*/ GPIO_PinRemapConfig( GPIO_Remap_SWJ_NoJTRST, ENABLE); #ifndef PIOS_DEBUG_ENABLE_DEBUG_PINS @@ -1471,10 +1488,6 @@ void PIOS_Board_Init(void) { PIOS_ADC_Init(); PIOS_GPIO_Init(); - PIOS_IAP_Init(); -#ifndef ERASE_FLASH - PIOS_WDG_Init(); -#endif } /** diff --git a/flight/Modules/System/systemmod.c b/flight/Modules/System/systemmod.c index 67701ace1..bb3496b0f 100644 --- a/flight/Modules/System/systemmod.c +++ b/flight/Modules/System/systemmod.c @@ -48,6 +48,7 @@ #include "taskinfo.h" #include "watchdogstatus.h" #include "taskmonitor.h" +#include "pios_iap.h" // Private constants @@ -137,7 +138,18 @@ static void systemTask(void *parameters) portTickType lastSysTime; /* create all modules thread */ - MODULE_TASKCREATE_ALL + MODULE_TASKCREATE_ALL; + + if (mallocFailed) { + /* We failed to malloc during task creation, + * system behaviour is undefined. Reset and let + * the BootFault code recover for us. + */ + PIOS_SYS_Reset(); + } + + /* Record a successful boot */ + PIOS_IAP_WriteBootCount(0); // Initialize vars idleCounter = 0; diff --git a/shared/uavobjectdefinition/systemalarms.xml b/shared/uavobjectdefinition/systemalarms.xml index 54eedc8cd..09b37bcd2 100644 --- a/shared/uavobjectdefinition/systemalarms.xml +++ b/shared/uavobjectdefinition/systemalarms.xml @@ -2,7 +2,7 @@ Alarms from OpenPilot to indicate failure conditions or warnings. Set by various modules. + elementnames="OutOfMemory,StackOverflow,CPUOverload,EventSystem,SDCard,Telemetry,ManualControl,Actuator,Attitude,Stabilization,Guidance,AHRSComms,Battery,FlightTime,I2C,GPS,BootFault" defaultvalue="Uninitialised"/> From f4f0dab764c73c43ea4ba2e9818ed0ec6193f0af Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Fri, 30 Dec 2011 19:43:09 -0500 Subject: [PATCH 059/121] fixup make combridge an optional module --- flight/CopterControl/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/flight/CopterControl/Makefile b/flight/CopterControl/Makefile index fc24341f8..7b4fb96f2 100644 --- a/flight/CopterControl/Makefile +++ b/flight/CopterControl/Makefile @@ -65,12 +65,12 @@ endif FLASH_TOOL = OPENOCD # List of modules to include -OPTMODULES = CameraStab +OPTMODULES = CameraStab ComUsbBridge ifeq ($(USE_GPS), YES) OPTMODULES += GPS endif -MODULES = Attitude Stabilization Actuator ManualControl FirmwareIAP ComUsbBridge +MODULES = Attitude Stabilization Actuator ManualControl FirmwareIAP # Telemetry must be last to grab the optional modules (why?) MODULES += Telemetry From 5c0921e92cafd42027c0f2572626a0b02bc1c44e Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Fri, 30 Dec 2011 22:53:09 -0500 Subject: [PATCH 060/121] fault: add optional fault insertion module This module and its associated settings uavo can be used to test various fault conditions during initialization. To enable the module, add the TEST_FAULTS=YES to your make command line: make fw_coptercontrol TEST_FAULTS=YES Once this module is part of your firmware load, you can enable it in the hwsettings uavo and then select the type of fault to insert by editing the faultsettings uavo. On the next reset, the configured fault will be inserted into the init sequence to allow you to test the boot fault recovery code. With a fault inserted, you should see 3 failed boot attempts followed by a successful (recovery) boot. You will see the BootFault alarm set to Critical, and the RAM version of your hwsettings will be reset to defaults. Since the defaults have all optional modules disabled, the fault module will be out of the way during the recovery boot. You can then "Load" the flash version of the hwsettings uavo in the object browser, disable the Fault module and then "Save" the hwsettings module back to the board. The next reset will boot normally without the fault inserted. --- flight/CopterControl/Makefile | 5 + flight/Modules/Fault/Fault.c | 131 ++++++++++++++++++ .../src/plugins/uavobjects/uavobjects.pro | 6 +- shared/uavobjectdefinition/faultsettings.xml | 12 ++ shared/uavobjectdefinition/hwsettings.xml | 2 +- 5 files changed, 153 insertions(+), 3 deletions(-) create mode 100644 flight/Modules/Fault/Fault.c create mode 100644 shared/uavobjectdefinition/faultsettings.xml diff --git a/flight/CopterControl/Makefile b/flight/CopterControl/Makefile index 7b4fb96f2..a6136a416 100644 --- a/flight/CopterControl/Makefile +++ b/flight/CopterControl/Makefile @@ -70,6 +70,10 @@ ifeq ($(USE_GPS), YES) OPTMODULES += GPS endif +ifeq ($(TEST_FAULTS), YES) +OPTMODULES += Fault +endif + MODULES = Attitude Stabilization Actuator ManualControl FirmwareIAP # Telemetry must be last to grab the optional modules (why?) MODULES += Telemetry @@ -151,6 +155,7 @@ SRC += $(OPUAVSYNTHDIR)/accessorydesired.c SRC += $(OPUAVSYNTHDIR)/objectpersistence.c SRC += $(OPUAVSYNTHDIR)/gcstelemetrystats.c SRC += $(OPUAVSYNTHDIR)/flighttelemetrystats.c +SRC += $(OPUAVSYNTHDIR)/faultsettings.c SRC += $(OPUAVSYNTHDIR)/flightstatus.c SRC += $(OPUAVSYNTHDIR)/systemstats.c SRC += $(OPUAVSYNTHDIR)/systemalarms.c diff --git a/flight/Modules/Fault/Fault.c b/flight/Modules/Fault/Fault.c new file mode 100644 index 000000000..a76ebb4ec --- /dev/null +++ b/flight/Modules/Fault/Fault.c @@ -0,0 +1,131 @@ +/** + ****************************************************************************** + * @addtogroup OpenPilotModules OpenPilot Modules + * @{ + * @addtogroup FaultModule Fault Module + * @brief Insert various fault conditions for testing + * @{ + * + * @file FaultInsertion.c + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. + * @brief Fault module, inserts faults for testing + * @see The GNU Public License (GPL) Version 3 + * + *****************************************************************************/ +/* + * 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 + */ + +// **************** + +#include "openpilot.h" +#include +#include "hwsettings.h" +#include "faultsettings.h" + +static bool module_enabled; +static uint8_t active_fault; + +static int32_t fault_initialize(void) +{ + HwSettingsInitialize(); + uint8_t optionalModules[HWSETTINGS_OPTIONALMODULES_NUMELEM]; + + HwSettingsOptionalModulesGet(optionalModules); + + if (optionalModules[HWSETTINGS_OPTIONALMODULES_FAULT] == HWSETTINGS_OPTIONALMODULES_ENABLED) { + module_enabled = true; + } else { + module_enabled = false; + } + + /* Do this outside the module_enabled test so that it + * can be changed even when the module has been disabled. + * This is important so we can remove faults even when + * we've booted in BootFault recovery mode with all optional + * modules disabled. + */ + FaultSettingsInitialize(); + + if (module_enabled) { + FaultSettingsActivateFaultGet(&active_fault); + + switch (active_fault) { + case FAULTSETTINGS_ACTIVATEFAULT_MODULEINITASSERT: + /* Simulate an assert during module init */ + PIOS_Assert(0); + break; + case FAULTSETTINGS_ACTIVATEFAULT_INITOUTOFMEMORY: + /* Leak all available memory */ + while (pvPortMalloc(10)) ; + break; + case FAULTSETTINGS_ACTIVATEFAULT_INITBUSERROR: + { + /* Force a bad access */ + uint32_t * bad_ptr = (uint32_t *)0xFFFFFFFF; + *bad_ptr = 0xAA55AA55; + } + break; + } + } + + return 0; +} + +static void fault_task(void *parameters); + +static int32_t fault_start(void) +{ + xTaskHandle fault_task_handle; + + if (module_enabled) { + switch (active_fault) { + case FAULTSETTINGS_ACTIVATEFAULT_RUNAWAYTASK: + case FAULTSETTINGS_ACTIVATEFAULT_TASKOUTOFMEMORY: + xTaskCreate(fault_task, + (signed char *)"Fault", + configMINIMAL_STACK_SIZE, + NULL, + configMAX_PRIORITIES-1, + &fault_task_handle); + return 0; + break; + } + } + return -1; +} +MODULE_INITCALL(fault_initialize, fault_start) + +static void fault_task(void *parameters) +{ + switch (active_fault) { + case FAULTSETTINGS_ACTIVATEFAULT_RUNAWAYTASK: + /* Consume all realtime, not letting the systemtask run */ + while(1); + break; + case FAULTSETTINGS_ACTIVATEFAULT_TASKOUTOFMEMORY: + /* Leak all available memory and then sleep */ + while (pvPortMalloc(10)) ; + while (1) { + vTaskDelay(1000); + } + break; + } +} + +/** + * @} + * @} + */ diff --git a/ground/openpilotgcs/src/plugins/uavobjects/uavobjects.pro b/ground/openpilotgcs/src/plugins/uavobjects/uavobjects.pro index 511253626..0b17a6755 100644 --- a/ground/openpilotgcs/src/plugins/uavobjects/uavobjects.pro +++ b/ground/openpilotgcs/src/plugins/uavobjects/uavobjects.pro @@ -72,7 +72,8 @@ HEADERS += $$UAVOBJECT_SYNTHETICS/accessorydesired.h \ $$UAVOBJECT_SYNTHETICS/gcsreceiver.h \ $$UAVOBJECT_SYNTHETICS/receiveractivity.h \ $$UAVOBJECT_SYNTHETICS/attitudesettings.h \ - $$UAVOBJECT_SYNTHETICS/cameradesired.h + $$UAVOBJECT_SYNTHETICS/cameradesired.h \ + $$UAVOBJECT_SYNTHETICS/faultsettings.h SOURCES += $$UAVOBJECT_SYNTHETICS/accessorydesired.cpp \ $$UAVOBJECT_SYNTHETICS/ahrsstatus.cpp \ @@ -124,4 +125,5 @@ SOURCES += $$UAVOBJECT_SYNTHETICS/accessorydesired.cpp \ $$UAVOBJECT_SYNTHETICS/gcsreceiver.cpp \ $$UAVOBJECT_SYNTHETICS/receiveractivity.cpp \ $$UAVOBJECT_SYNTHETICS/attitudesettings.cpp \ - $$UAVOBJECT_SYNTHETICS/cameradesired.cpp + $$UAVOBJECT_SYNTHETICS/cameradesired.cpp \ + $$UAVOBJECT_SYNTHETICS/faultsettings.cpp diff --git a/shared/uavobjectdefinition/faultsettings.xml b/shared/uavobjectdefinition/faultsettings.xml new file mode 100644 index 000000000..8d02f0d78 --- /dev/null +++ b/shared/uavobjectdefinition/faultsettings.xml @@ -0,0 +1,12 @@ + + + Allows testers to simulate various fault scenarios. + + + + + + + + + diff --git a/shared/uavobjectdefinition/hwsettings.xml b/shared/uavobjectdefinition/hwsettings.xml index 263d5f279..1e34e0808 100644 --- a/shared/uavobjectdefinition/hwsettings.xml +++ b/shared/uavobjectdefinition/hwsettings.xml @@ -15,7 +15,7 @@ - + From e7053c77f04067aae78c8a524e1d972c8edf80a9 Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Sat, 31 Dec 2011 13:02:43 -0500 Subject: [PATCH 061/121] usb config: remove unused macro for number of endpoints This is no longer referenced and is confusing. --- flight/Bootloaders/CopterControl/inc/pios_usb.h | 1 - flight/Bootloaders/OpenPilot/inc/pios_usb.h | 1 - flight/Bootloaders/PipXtreme/inc/pios_usb.h | 1 - flight/CopterControl/System/inc/pios_usb.h | 1 - flight/PiOS/inc/pios_usb.h | 1 - flight/PipXtreme/inc/pios_usb.h | 1 - 6 files changed, 6 deletions(-) diff --git a/flight/Bootloaders/CopterControl/inc/pios_usb.h b/flight/Bootloaders/CopterControl/inc/pios_usb.h index f95a31835..f81bb3294 100644 --- a/flight/Bootloaders/CopterControl/inc/pios_usb.h +++ b/flight/Bootloaders/CopterControl/inc/pios_usb.h @@ -55,7 +55,6 @@ #endif /* Internal defines which are used by PIOS USB HID (don't touch) */ -#define PIOS_USB_EP_NUM 2 /* Buffer table base address */ #define PIOS_USB_BTABLE_ADDRESS 0x000 diff --git a/flight/Bootloaders/OpenPilot/inc/pios_usb.h b/flight/Bootloaders/OpenPilot/inc/pios_usb.h index bca8a883b..708e18578 100644 --- a/flight/Bootloaders/OpenPilot/inc/pios_usb.h +++ b/flight/Bootloaders/OpenPilot/inc/pios_usb.h @@ -55,7 +55,6 @@ #endif /* Internal defines which are used by PIOS USB HID (don't touch) */ -#define PIOS_USB_EP_NUM 2 /* Buffer table base address */ #define PIOS_USB_BTABLE_ADDRESS 0x000 diff --git a/flight/Bootloaders/PipXtreme/inc/pios_usb.h b/flight/Bootloaders/PipXtreme/inc/pios_usb.h index 1b7688217..1b0eb5502 100644 --- a/flight/Bootloaders/PipXtreme/inc/pios_usb.h +++ b/flight/Bootloaders/PipXtreme/inc/pios_usb.h @@ -55,7 +55,6 @@ #endif /* Internal defines which are used by PIOS USB HID (don't touch) */ -#define PIOS_USB_EP_NUM 2 /* Buffer table base address */ #define PIOS_USB_BTABLE_ADDRESS 0x000 diff --git a/flight/CopterControl/System/inc/pios_usb.h b/flight/CopterControl/System/inc/pios_usb.h index 3e20a7b03..a20803d23 100644 --- a/flight/CopterControl/System/inc/pios_usb.h +++ b/flight/CopterControl/System/inc/pios_usb.h @@ -55,7 +55,6 @@ #endif /* Internal defines which are used by PIOS USB HID (don't touch) */ -#define PIOS_USB_EP_NUM 5 /* Buffer table base address */ #define PIOS_USB_BTABLE_ADDRESS 0x000 diff --git a/flight/PiOS/inc/pios_usb.h b/flight/PiOS/inc/pios_usb.h index f86926e8d..986062e1e 100644 --- a/flight/PiOS/inc/pios_usb.h +++ b/flight/PiOS/inc/pios_usb.h @@ -55,7 +55,6 @@ #endif /* Internal defines which are used by PIOS USB HID (don't touch) */ -#define PIOS_USB_EP_NUM 2 /* Buffer table base address */ #define PIOS_USB_BTABLE_ADDRESS 0x000 diff --git a/flight/PipXtreme/inc/pios_usb.h b/flight/PipXtreme/inc/pios_usb.h index bab436469..517bfde90 100644 --- a/flight/PipXtreme/inc/pios_usb.h +++ b/flight/PipXtreme/inc/pios_usb.h @@ -48,7 +48,6 @@ #endif /* Internal defines which are used by PIOS USB HID (don't touch) */ -#define PIOS_USB_EP_NUM 2 /* Buffer table base address */ #define PIOS_USB_BTABLE_ADDRESS 0x000 From 6c192f67eed502c044c7c50256232d473cf5ea58 Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Sat, 31 Dec 2011 13:03:49 -0500 Subject: [PATCH 062/121] gasp: delete clutter --- flight/PiOS/inc/pios_com_priv.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/flight/PiOS/inc/pios_com_priv.h b/flight/PiOS/inc/pios_com_priv.h index 85f2af9e1..ff7a97d83 100644 --- a/flight/PiOS/inc/pios_com_priv.h +++ b/flight/PiOS/inc/pios_com_priv.h @@ -32,8 +32,6 @@ #ifndef PIOS_COM_PRIV_H #define PIOS_COM_PRIV_H -//#include - #endif /* PIOS_COM_PRIV_H */ /** From 075eb65603f2a13c3041618eacd53b34528fb628 Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Sat, 31 Dec 2011 13:08:30 -0500 Subject: [PATCH 063/121] bootfault: fail initialization if no telemetry link is configured This detects a locked out state and fails the init. The new bootfault detection code will automatically drop to default hwsettings after 3 consecutive boot failures. That will put the board back into an unlocked state where the user can now enable a telemetry link using the GCS and everything will be OK. NOTE: Any configured telemetry link will be considered enough to boot up. If you only configure a serial telemetry link but don't know how to hook anything up to it, this will not save you. As the ultimate recovery, you can always load firmware on the board that wipes the settings entirely and start over. --- flight/CopterControl/System/pios_board.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/flight/CopterControl/System/pios_board.c b/flight/CopterControl/System/pios_board.c index 9d8981eeb..a1f78f5dd 100644 --- a/flight/CopterControl/System/pios_board.c +++ b/flight/CopterControl/System/pios_board.c @@ -1488,6 +1488,9 @@ void PIOS_Board_Init(void) { PIOS_ADC_Init(); PIOS_GPIO_Init(); + + /* Make sure we have at least one telemetry link configured or else fail initialization */ + PIOS_Assert(pios_com_telem_rf_id || pios_com_telem_usb_id); } /** From d43258f2fbedbbd4ffd39d7f075ff42c0dda4319 Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Sun, 1 Jan 2012 09:24:22 -0500 Subject: [PATCH 064/121] gcs uavtalk: improve readability of debug logging --- .../src/plugins/uavtalk/uavtalk.cpp | 103 +++++------------- 1 file changed, 29 insertions(+), 74 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/uavtalk/uavtalk.cpp b/ground/openpilotgcs/src/plugins/uavtalk/uavtalk.cpp index aa5428bfd..4c218379d 100644 --- a/ground/openpilotgcs/src/plugins/uavtalk/uavtalk.cpp +++ b/ground/openpilotgcs/src/plugins/uavtalk/uavtalk.cpp @@ -30,8 +30,11 @@ //#define UAVTALK_DEBUG #ifdef UAVTALK_DEBUG -#include "qxtlogger.h" -#endif + #include "qxtlogger.h" + #define UAVTALK_QXTLOG_DEBUG(args...) qxtLog->debug(args...) +#else // UAVTALK_DEBUG + #define UAVTALK_QXTLOG_DEBUG(args...) +#endif // UAVTALK_DEBUG #define SYNC_VAL 0x3C @@ -213,9 +216,7 @@ bool UAVTalk::processInputByte(quint8 rxbyte) if (rxbyte != SYNC_VAL) { -#ifdef UAVTALK_DEBUG - qxtLog->debug("UAVTalk: Sync->Sync (" + QString::number(rxbyte) + " " + QString("0x%1").arg(rxbyte,2,16) + ")"); -#endif + UAVTALK_QXTLOG_DEBUG("UAVTalk: Sync->Sync (" + QString::number(rxbyte) + " " + QString("0x%1").arg(rxbyte,2,16) + ")"); break; } @@ -225,9 +226,7 @@ bool UAVTalk::processInputByte(quint8 rxbyte) rxPacketLength = 1; rxState = STATE_TYPE; -#ifdef UAVTALK_DEBUG - qxtLog->debug("UAVTalk: Sync->Type"); -#endif + UAVTALK_QXTLOG_DEBUG("UAVTalk: Sync->Type"); break; case STATE_TYPE: @@ -238,9 +237,7 @@ bool UAVTalk::processInputByte(quint8 rxbyte) if ((rxbyte & TYPE_MASK) != TYPE_VER) { rxState = STATE_SYNC; -#ifdef UAVTALK_DEBUG - qxtLog->debug("UAVTalk: Type->Sync"); -#endif + UAVTALK_QXTLOG_DEBUG("UAVTalk: Type->Sync"); break; } @@ -249,9 +246,7 @@ bool UAVTalk::processInputByte(quint8 rxbyte) packetSize = 0; rxState = STATE_SIZE; -#ifdef UAVTALK_DEBUG - qxtLog->debug("UAVTalk: Type->Size"); -#endif + UAVTALK_QXTLOG_DEBUG("UAVTalk: Type->Size"); rxCount = 0; break; @@ -264,9 +259,7 @@ bool UAVTalk::processInputByte(quint8 rxbyte) { packetSize += rxbyte; rxCount++; -#ifdef UAVTALK_DEBUG - qxtLog->debug("UAVTalk: Size->Size"); -#endif + UAVTALK_QXTLOG_DEBUG("UAVTalk: Size->Size"); break; } @@ -275,17 +268,13 @@ bool UAVTalk::processInputByte(quint8 rxbyte) if (packetSize < MIN_HEADER_LENGTH || packetSize > MAX_HEADER_LENGTH + MAX_PAYLOAD_LENGTH) { // incorrect packet size rxState = STATE_SYNC; -#ifdef UAVTALK_DEBUG - qxtLog->debug("UAVTalk: Size->Sync"); -#endif + UAVTALK_QXTLOG_DEBUG("UAVTalk: Size->Sync"); break; } rxCount = 0; rxState = STATE_OBJID; -#ifdef UAVTALK_DEBUG - qxtLog->debug("UAVTalk: Size->ObjID"); -#endif + UAVTALK_QXTLOG_DEBUG("UAVTalk: Size->ObjID"); break; case STATE_OBJID: @@ -296,9 +285,7 @@ bool UAVTalk::processInputByte(quint8 rxbyte) rxTmpBuffer[rxCount++] = rxbyte; if (rxCount < 4) { -#ifdef UAVTALK_DEBUG - qxtLog->debug("UAVTalk: ObjID->ObjID"); -#endif + UAVTALK_QXTLOG_DEBUG("UAVTalk: ObjID->ObjID"); break; } @@ -310,9 +297,7 @@ bool UAVTalk::processInputByte(quint8 rxbyte) { stats.rxErrors++; rxState = STATE_SYNC; -#ifdef UAVTALK_DEBUG - qxtLog->debug("UAVTalk: ObjID->Sync (badtype)"); -#endif + UAVTALK_QXTLOG_DEBUG("UAVTalk: ObjID->Sync (badtype)"); break; } @@ -333,9 +318,7 @@ bool UAVTalk::processInputByte(quint8 rxbyte) { stats.rxErrors++; rxState = STATE_SYNC; -#ifdef UAVTALK_DEBUG - qxtLog->debug("UAVTalk: ObjID->Sync (oversize)"); -#endif + UAVTALK_QXTLOG_DEBUG("UAVTalk: ObjID->Sync (oversize)"); break; } @@ -344,9 +327,7 @@ bool UAVTalk::processInputByte(quint8 rxbyte) { // packet error - mismatched packet size stats.rxErrors++; rxState = STATE_SYNC; -#ifdef UAVTALK_DEBUG - qxtLog->debug("UAVTalk: ObjID->Sync (length mismatch)"); -#endif + UAVTALK_QXTLOG_DEBUG("UAVTalk: ObjID->Sync (length mismatch)"); break; } @@ -356,9 +337,7 @@ bool UAVTalk::processInputByte(quint8 rxbyte) // This is a non-existing object, just skip to checksum // and we'll send a NACK next. rxState = STATE_CS; -#ifdef UAVTALK_DEBUG - qxtLog->debug("UAVTalk: ObjID->CSum (no obj)"); -#endif + UAVTALK_QXTLOG_DEBUG("UAVTalk: ObjID->CSum (no obj)"); rxInstId = 0; rxCount = 0; } @@ -368,16 +347,12 @@ bool UAVTalk::processInputByte(quint8 rxbyte) if (rxLength > 0) { rxState = STATE_DATA; -#ifdef UAVTALK_DEBUG - qxtLog->debug("UAVTalk: ObjID->Data (needs data)"); -#endif + UAVTALK_QXTLOG_DEBUG("UAVTalk: ObjID->Data (needs data)"); } else { rxState = STATE_CS; -#ifdef UAVTALK_DEBUG - qxtLog->debug("UAVTalk: ObjID->Checksum"); -#endif + UAVTALK_QXTLOG_DEBUG("UAVTalk: ObjID->Checksum"); } rxInstId = 0; rxCount = 0; @@ -385,9 +360,7 @@ bool UAVTalk::processInputByte(quint8 rxbyte) else { rxState = STATE_INSTID; -#ifdef UAVTALK_DEBUG - qxtLog->debug("UAVTalk: ObjID->InstID"); -#endif + UAVTALK_QXTLOG_DEBUG("UAVTalk: ObjID->InstID"); rxCount = 0; } } @@ -402,9 +375,7 @@ bool UAVTalk::processInputByte(quint8 rxbyte) rxTmpBuffer[rxCount++] = rxbyte; if (rxCount < 2) { -#ifdef UAVTALK_DEBUG - qxtLog->debug("UAVTalk: InstID->InstID"); -#endif + UAVTALK_QXTLOG_DEBUG("UAVTalk: InstID->InstID"); break; } @@ -416,16 +387,12 @@ bool UAVTalk::processInputByte(quint8 rxbyte) if (rxLength > 0) { rxState = STATE_DATA; -#ifdef UAVTALK_DEBUG - qxtLog->debug("UAVTalk: InstID->Data"); -#endif + UAVTALK_QXTLOG_DEBUG("UAVTalk: InstID->Data"); } else { rxState = STATE_CS; -#ifdef UAVTALK_DEBUG - qxtLog->debug("UAVTalk: InstID->CSum"); -#endif + UAVTALK_QXTLOG_DEBUG("UAVTalk: InstID->CSum"); } break; @@ -437,16 +404,12 @@ bool UAVTalk::processInputByte(quint8 rxbyte) rxBuffer[rxCount++] = rxbyte; if (rxCount < rxLength) { -#ifdef UAVTALK_DEBUG - qxtLog->debug("UAVTalk: Data->Data"); -#endif + UAVTALK_QXTLOG_DEBUG("UAVTalk: Data->Data"); break; } rxState = STATE_CS; -#ifdef UAVTALK_DEBUG - qxtLog->debug("UAVTalk: Data->CSum"); -#endif + UAVTALK_QXTLOG_DEBUG("UAVTalk: Data->CSum"); rxCount = 0; break; @@ -459,9 +422,7 @@ bool UAVTalk::processInputByte(quint8 rxbyte) { // packet error - faulty CRC stats.rxErrors++; rxState = STATE_SYNC; -#ifdef UAVTALK_DEBUG - qxtLog->debug("UAVTalk: CSum->Sync (badcrc)"); -#endif + UAVTALK_QXTLOG_DEBUG("UAVTalk: CSum->Sync (badcrc)"); break; } @@ -469,9 +430,7 @@ bool UAVTalk::processInputByte(quint8 rxbyte) { // packet error - mismatched packet size stats.rxErrors++; rxState = STATE_SYNC; -#ifdef UAVTALK_DEBUG - qxtLog->debug("UAVTalk: CSum->Sync (length mismatch)"); -#endif + UAVTALK_QXTLOG_DEBUG("UAVTalk: CSum->Sync (length mismatch)"); break; } @@ -482,17 +441,13 @@ bool UAVTalk::processInputByte(quint8 rxbyte) mutex->unlock(); rxState = STATE_SYNC; -#ifdef UAVTALK_DEBUG - qxtLog->debug("UAVTalk: CSum->Sync (OK)"); -#endif + UAVTALK_QXTLOG_DEBUG("UAVTalk: CSum->Sync (OK)"); break; default: rxState = STATE_SYNC; stats.rxErrors++; -#ifdef UAVTALK_DEBUG - qxtLog->debug("UAVTalk: ???->Sync"); -#endif + UAVTALK_QXTLOG_DEBUG("UAVTalk: ???->Sync"); } // Done From 21714911e8e8a1e3cc3af91aebb77f4898186d80 Mon Sep 17 00:00:00 2001 From: James Cotton Date: Sun, 1 Jan 2012 13:14:18 -0600 Subject: [PATCH 065/121] Convert log files to structure of array instead of array of struct from Kenz --- .../plugins/uavobjects/uavobjecttemplate.m | 79 ++++++++++++++++--- .../matlab/uavobjectgeneratormatlab.cpp | 69 +++++++++------- .../matlab/uavobjectgeneratormatlab.h | 1 + 3 files changed, 110 insertions(+), 39 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/uavobjects/uavobjecttemplate.m b/ground/openpilotgcs/src/plugins/uavobjects/uavobjecttemplate.m index 5cfcb6068..96d727dff 100644 --- a/ground/openpilotgcs/src/plugins/uavobjects/uavobjecttemplate.m +++ b/ground/openpilotgcs/src/plugins/uavobjects/uavobjecttemplate.m @@ -1,39 +1,54 @@ -function [] = OPLogConvert(logfile) +function [] = OPLogConvert(varargin) %% Define indices and arrays of structures to hold data % THIS FILE IS AUTOMATICALLY GENERATED. -$(ALLOCATIONCODE) + +outputType='mat'; %Default output is a .mat file if nargin==0 %% if (exist('uigetfile')) - [FileName, PathName]=uigetfile; + [FileName, PathName]=uigetfile('*.opl'); logfile=fullfile(PathName, FileName); else error('Your technical computing program does not support file choosers. Please input the file name in the argument. ') + end +elseif nargin>0 + logfile=varargin{1}; + if nargin>1 + outputType=varargin{2}; end end +if ~strcmpi(outputType,'mat') && ~strcmpi(outputType,'csv') + error('Incorrect file format specified. Second argument must be ''mat'' or ''csv''.'); +end + +$(ALLOCATIONCODE) + + fid = fopen(logfile); +correctMsgByte=hex2dec('20'); +correctSyncByte=hex2dec('3C'); % Parse log file, entry by entry while (1) %% Read logging header - timestamp = fread(fid, 1, 'uint32'); + timestamp = fread(fid, 1, '*uint32'); if (feof(fid)); break; end - datasize = fread(fid, 1, 'int64'); + datasize = fread(fid, 1, '*int64'); %% Read message header % get sync field (0x3C, 1 byte) sync = fread(fid, 1, 'uint8'); - if sync ~= hex2dec('3C') + if sync ~= correctSyncByte disp ('Wrong sync byte'); return end % get msg type (quint8 1 byte ) should be 0x20, ignore the rest? msgType = fread(fid, 1, 'uint8'); - if msgType ~= hex2dec('20') + if msgType ~= correctMsgByte disp ('Wrong msgType'); return end @@ -42,12 +57,15 @@ while (1) % get obj id (quint32 4 bytes) objID = fread(fid, 1, 'uint32'); + if (isempty(objID)) %End of file + break; + end %% Read object switch objID $(SWITCHCODE) otherwise - disp(['Unknown object ID: 0x' dec2hex(objID)]); + disp(['Unknown object ID: 0x' dec2hex(objID)]); msgBytesLeft = datasize - 1 - 1 - 2 - 4; fread(fid, msgBytesLeft, 'uint8'); end @@ -60,13 +78,52 @@ fclose(fid); % Trim output structs $(CLEANUPCODE) -matfile = strrep(logfile,'opl','mat'); -save(matfile $(SAVEOBJECTSCODE)); - +if strcmpi(outputType,'mat') + matfile = strrep(logfile,'opl','mat'); + save(matfile $(SAVEOBJECTSCODE)); +else +$(EXPORTCSVCODE); +end %% Object reading functions $(FUNCTIONSCODE) +% This function prunes the excess pre-allocated space +function [structOut]=PruneStructOfArrays(structIn, lastIndex) + + fieldNames = fieldnames(structIn); + for i=1:length(fieldNames) + structOut.(fieldNames{i})=structIn.(fieldNames{i})(1:lastIndex); + end + + +function OPLog2csv(structIn, structName, logfile) + %Get each field name from the structure + fieldNames = fieldnames(structIn); + + %Create a text string with the field names + headerOut=sprintf('%s,',fieldNames{:}); + headerOut=headerOut(1:end-1); %Trim off last `,` and `\t` + + %Assign the structure arrays to a matrix. + matOut=zeros(max(size(structIn.(fieldNames{1}))), length(fieldNames)); + + if isempty(structIn.(fieldNames{1})); + matOut=[]; + else + for i=1:length(fieldNames) + matOut(:,i)=structIn.(fieldNames{i}); + end + end + % Create filename by replacing opl by csv + [path, name] = fileparts(logfile); + csvDirName=[name '_csv']; + [dummyA, dummyB]=mkdir(fullfile(path, csvDirName)); %Dummy outputs so the program doens't throw warnings about "Directory already exists" + csvfile=fullfile(path, csvDirName , [name '.csv']); + + %Write to csv. + dlmwrite(csvfile, headerOut, ''); + dlmwrite(csvfile, matOut, '-append'); diff --git a/ground/uavobjgenerator/generators/matlab/uavobjectgeneratormatlab.cpp b/ground/uavobjgenerator/generators/matlab/uavobjectgeneratormatlab.cpp index c7cedddda..9f160ad52 100644 --- a/ground/uavobjgenerator/generators/matlab/uavobjectgeneratormatlab.cpp +++ b/ground/uavobjgenerator/generators/matlab/uavobjectgeneratormatlab.cpp @@ -54,6 +54,7 @@ bool UAVObjectGeneratorMatlab::generate(UAVObjectParser* parser,QString template matlabCodeTemplate.replace( QString("$(CLEANUPCODE)"), matlabCleanupCode); matlabCodeTemplate.replace( QString("$(SAVEOBJECTSCODE)"), matlabSaveObjectsCode); matlabCodeTemplate.replace( QString("$(FUNCTIONSCODE)"), matlabFunctionsCode); + matlabCodeTemplate.replace( QString("$(EXPORTCSVCODE)"), matlabExportCsvCode); bool res = writeFile( matlabOutputPath.absolutePath() + "/OPLogConvert.m", matlabCodeTemplate ); if (!res) { @@ -78,7 +79,7 @@ bool UAVObjectGeneratorMatlab::process_object(ObjectInfo* info) QString objectTableName(objectName); QString tableIdxName(objectName.toLower() + "Idx"); QString functionName("Read" + info->name + "Object"); - QString functionCall(functionName + "(fid, timestamp)"); + QString functionCall(functionName + "(fid, timestamp, "); QString objectID(QString().setNum(info->id)); QString isSingleInst = boolTo01String( info->isSingleInst ); @@ -87,7 +88,7 @@ bool UAVObjectGeneratorMatlab::process_object(ObjectInfo* info) // Generate allocation code (will replace the $(ALLOCATIONCODE) tag) // //===================================================================// // matlabSwitchCode.append("\t\tcase " + objectID + "\n"); - matlabAllocationCode.append("\n\t" + tableIdxName + " = 1;\n"); + matlabAllocationCode.append("\n\t" + tableIdxName + " = 0;\n"); QString type; QString allocfields; if (0){ @@ -97,7 +98,7 @@ bool UAVObjectGeneratorMatlab::process_object(ObjectInfo* info) type = fieldTypeStrMatlab[info->fields[n]->type]; // Append field if ( info->fields[n]->numElements > 1 ) - allocfields.append("\t" + objectTableName + "(1)." + info->fields[n]->name + " = zeros(1," + QString::number(info->fields[n]->numElements, 10) + ");\n"); + allocfields.append("\t" + objectTableName + "(1)." + info->fields[n]->name + " = zeros(" + QString::number(info->fields[n]->numElements, 10) + ",1);\n"); else allocfields.append("\t" + objectTableName + "(1)." + info->fields[n]->name + " = 0;\n"); } @@ -112,52 +113,64 @@ bool UAVObjectGeneratorMatlab::process_object(ObjectInfo* info) type = fieldTypeStrMatlab[info->fields[n]->type]; // Append field if ( info->fields[n]->numElements > 1 ) - allocfields.append(",...\n\t\t '" + info->fields[n]->name + "', zeros(1," + QString::number(info->fields[n]->numElements, 10) + ")"); + allocfields.append(",...\n\t\t '" + info->fields[n]->name + "', zeros(" + QString::number(info->fields[n]->numElements, 10) + ",1)"); else allocfields.append(",...\n\t\t '" + info->fields[n]->name + "', 0"); } allocfields.append(");\n"); - } + } matlabAllocationCode.append(allocfields); - matlabAllocationCode.append("\t" + objectTableName.toUpper() + "_OBJID=" + objectID + ";\n"); + matlabAllocationCode.append("\t" + objectTableName.toUpper() + "_OBJID=" + objectID + ";\n"); - //=============================================================// + //==============================================================// // Generate 'Switch:' code (will replace the $(SWITCHCODE) tag) // - //=============================================================// + //==============================================================// + + + matlabSwitchCode.append("\t\tcase " + objectTableName.toUpper() + "_OBJID\n"); - matlabSwitchCode.append("\t\t\t" + objectTableName + "(" + tableIdxName +") = " + functionCall + ";\n"); - matlabSwitchCode.append("\t\t\t" + tableIdxName + " = " + tableIdxName +" + 1;\n"); - matlabSwitchCode.append("\t\t\tif " + tableIdxName + " > length(" + objectTableName +")\n"); - matlabSwitchCode.append("\t\t\t\t" + objectTableName + "(" + tableIdxName + "*2+1) = " + objectTableName +"(end);\n"); - matlabSwitchCode.append("\t\t\t\t" + objectTableName +"(end)=[];\n"); +// matlabSwitchCode.append("\t\t\t" + objectTableName + "(" + tableIdxName +") = " + functionCall + ";\n"); + matlabSwitchCode.append("\t\t\t" + tableIdxName + " = " + tableIdxName +" + 1;\n"); + matlabSwitchCode.append("\t\t\t" + objectTableName + "= " + functionCall + objectTableName + ", " + tableIdxName + ");\n"); + matlabSwitchCode.append("\t\t\tif " + tableIdxName + " >= length(" + objectTableName +") %Check to see if pre-allocated memory is exhausted\n"); + matlabSwitchCode.append("\t\t\t\tFieldNames= fieldnames(" + objectTableName +");\n"); + matlabSwitchCode.append("\t\t\t\tfor i=1:length(FieldNames) %Grow structure\n"); + matlabSwitchCode.append("\t\t\t\t\t" + objectTableName + ".(FieldNames{i})(:," + tableIdxName + "*2+1) = 0;\n"); + matlabSwitchCode.append("\t\t\t\tend;\n"); matlabSwitchCode.append("\t\t\tend\n"); - //=============================================================// + //============================================================// // Generate 'Cleanup:' code (will replace the $(CLEANUP) tag) // - //=============================================================// - matlabCleanupCode.append(objectTableName + "(" + tableIdxName +":end) = [];\n"); + //============================================================// + matlabCleanupCode.append(objectTableName + "=PruneStructOfArrays(" + objectTableName + "," + tableIdxName +"); %#ok\n" ); + - - //=============================================================================// - // Generate objects saving code code (will replace the $(SAVEOBJECTSCODE) tag) // - //=============================================================================// + //========================================================================// + // Generate objects saving code (will replace the $(SAVEOBJECTSCODE) tag) // + //========================================================================// matlabSaveObjectsCode.append(",'"+objectTableName+"'"); - matlabFunctionsCode.append("%%\n% " + objectName + " read function\n"); + //==========================================================================// + // Generate objects csv export code (will replace the $(EXPORTCSVCODE) tag) // + //==========================================================================// + matlabExportCsvCode.append("\tOPLog2csv(" + objectTableName + ", '"+objectTableName+"', logfile);\n"); +// OPLog2csv(ActuatorCommand, 'ActuatorCommand', logfile) //=================================================================// // Generate functions code (will replace the $(FUNCTIONSCODE) tag) // //=================================================================// - //Generate function description comment - matlabFunctionsCode.append("function [" + objectName + "] = " + functionCall + "\n"); - matlabFunctionsCode.append("\t" + objectName + ".timestamp = timestamp;\n"); + //Generate function description comment + matlabFunctionsCode.append("%%\n% " + objectName + " read function\n"); + + matlabFunctionsCode.append("function [" + objectName + "] = " + functionCall + objectTableName + ", " + tableIdxName + ")" + "\n"); + matlabFunctionsCode.append("\t" + objectName + ".timestamp(" + tableIdxName + ")= timestamp;\n"); matlabFunctionsCode.append("\tif " + isSingleInst + "\n"); matlabFunctionsCode.append("\t\theaderSize = 8;\n"); matlabFunctionsCode.append("\telse\n"); - matlabFunctionsCode.append("\t\t" + objectName + ".instanceID = fread(fid, 1, 'uint16');\n"); + matlabFunctionsCode.append("\t\t" + objectName + ".instanceID(" + tableIdxName + ") = (fread(fid, 1, 'uint16'));\n"); matlabFunctionsCode.append("\t\theaderSize = 10;\n"); matlabFunctionsCode.append("\tend\n\n"); @@ -169,14 +182,14 @@ bool UAVObjectGeneratorMatlab::process_object(ObjectInfo* info) type = fieldTypeStrMatlab[info->fields[n]->type]; // Append field if ( info->fields[n]->numElements > 1 ) - funcfields.append("\t" + objectName + "." + info->fields[n]->name + " = double(fread(fid, " + QString::number(info->fields[n]->numElements, 10) + ", '" + type + "'));\n"); + funcfields.append("\t" + objectName + "." + info->fields[n]->name + "(:," + tableIdxName + ") = double(fread(fid, " + QString::number(info->fields[n]->numElements, 10) + ", '" + type + "'));\n"); else - funcfields.append("\t" + objectName + "." + info->fields[n]->name + " = double(fread(fid, 1, '" + type + "'));\n"); + funcfields.append("\t" + objectName + "." + info->fields[n]->name + "(" + tableIdxName + ") = double(fread(fid, 1, '" + type + "'));\n"); } matlabFunctionsCode.append(funcfields); matlabFunctionsCode.append("\t% read CRC\n"); - matlabFunctionsCode.append("\tfread(fid, 1, 'uint8');\n"); + matlabFunctionsCode.append("\tfread(fid, 1, '*uint8');\n"); matlabFunctionsCode.append("\n\n"); diff --git a/ground/uavobjgenerator/generators/matlab/uavobjectgeneratormatlab.h b/ground/uavobjgenerator/generators/matlab/uavobjectgeneratormatlab.h index b86b001a5..c4025a4f4 100644 --- a/ground/uavobjgenerator/generators/matlab/uavobjectgeneratormatlab.h +++ b/ground/uavobjgenerator/generators/matlab/uavobjectgeneratormatlab.h @@ -40,6 +40,7 @@ private: QString matlabSwitchCode; QString matlabCleanupCode; QString matlabSaveObjectsCode; + QString matlabExportCsvCode; QString matlabFunctionsCode; QStringList fieldTypeStrMatlab; From 2eb5130a7cf59877add86bdee58f97c1c7cbe231 Mon Sep 17 00:00:00 2001 From: Oleg Semyonov Date: Fri, 16 Dec 2011 22:27:13 +0200 Subject: [PATCH 066/121] CameraStab: new camera stabilization mode and low-pass stick input filtering This patch is based on work of Crubier (LPF) and Cossacs (AxisLock mode). I've just reworked it a bit by adding a dynamic memory allocation for static module data. --- flight/Modules/CameraStab/camerastab.c | 87 ++++++++++++------- .../camerastabsettings.xml | 4 + 2 files changed, 62 insertions(+), 29 deletions(-) diff --git a/flight/Modules/CameraStab/camerastab.c b/flight/Modules/CameraStab/camerastab.c index 770ff7ab6..fce2f70d9 100644 --- a/flight/Modules/CameraStab/camerastab.c +++ b/flight/Modules/CameraStab/camerastab.c @@ -61,10 +61,17 @@ // Private types // Private variables +static struct CameraStab_data { + UAVObjEvent ev; + portTickType lastSysTime; + float dT; + float inputs[CAMERASTABSETTINGS_INPUTS_NUMELEM]; + float inputs_filtered[CAMERASTABSETTINGS_INPUTS_NUMELEM]; +} *csd; // Private functions static void attitudeUpdated(UAVObjEvent* ev); -static float bound(float val); +static float bound(float val, float limit); /** * Initialise the module, called on startup @@ -72,8 +79,6 @@ static float bound(float val); */ int32_t CameraStabInitialize(void) { - static UAVObjEvent ev; - bool cameraStabEnabled; uint8_t optionalModules[HWSETTINGS_OPTIONALMODULES_NUMELEM]; @@ -87,16 +92,26 @@ int32_t CameraStabInitialize(void) if (cameraStabEnabled) { + // allocate and initialize the static data storage only if module is enabled + csd = (struct CameraStab_data *) pvPortMalloc(sizeof(struct CameraStab_data)); + if (!csd) + return -1; + + // make sure that all inputs[] and inputs_filtered[] are zeroed + memset(csd, 0, sizeof(struct CameraStab_data)); + csd->lastSysTime = xTaskGetTickCount(); + csd->dT = 1; + AttitudeActualInitialize(); - ev.obj = AttitudeActualHandle(); - ev.instId = 0; - ev.event = 0; + csd->ev.obj = AttitudeActualHandle(); + csd->ev.instId = 0; + csd->ev.event = 0; CameraStabSettingsInitialize(); CameraDesiredInitialize(); - EventPeriodicCallbackCreate(&ev, attitudeUpdated, SAMPLE_PERIOD_MS / portTICK_RATE_MS); + EventPeriodicCallbackCreate(&(csd->ev), attitudeUpdated, SAMPLE_PERIOD_MS / portTICK_RATE_MS); return 0; } @@ -117,47 +132,61 @@ static void attitudeUpdated(UAVObjEvent* ev) if (ev->obj != AttitudeActualHandle()) return; - float attitude; - float output; AccessoryDesiredData accessory; CameraStabSettingsData cameraStab; CameraStabSettingsGet(&cameraStab); - // Read any input channels - float inputs[3] = {0,0,0}; - if(cameraStab.Inputs[CAMERASTABSETTINGS_INPUTS_ROLL] != CAMERASTABSETTINGS_INPUTS_NONE) { - if(AccessoryDesiredInstGet(cameraStab.Inputs[CAMERASTABSETTINGS_INPUTS_ROLL] - CAMERASTABSETTINGS_INPUTS_ACCESSORY0, &accessory) == 0) - inputs[0] = accessory.AccessoryVal * cameraStab.InputRange[CAMERASTABSETTINGS_INPUTRANGE_ROLL]; - } - if(cameraStab.Inputs[CAMERASTABSETTINGS_INPUTS_PITCH] != CAMERASTABSETTINGS_INPUTS_NONE) { - if(AccessoryDesiredInstGet(cameraStab.Inputs[CAMERASTABSETTINGS_INPUTS_PITCH] - CAMERASTABSETTINGS_INPUTS_ACCESSORY0, &accessory) == 0) - inputs[1] = accessory.AccessoryVal * cameraStab.InputRange[CAMERASTABSETTINGS_INPUTRANGE_PITCH]; - } - if(cameraStab.Inputs[CAMERASTABSETTINGS_INPUTS_YAW] != CAMERASTABSETTINGS_INPUTS_NONE) { - if(AccessoryDesiredInstGet(cameraStab.Inputs[CAMERASTABSETTINGS_INPUTS_YAW] - CAMERASTABSETTINGS_INPUTS_ACCESSORY0, &accessory) == 0) - inputs[2] = accessory.AccessoryVal * cameraStab.InputRange[CAMERASTABSETTINGS_INPUTRANGE_YAW]; + // Check how long since last update, time delta between calls in ms + portTickType thisSysTime = xTaskGetTickCount(); + if (thisSysTime > csd->lastSysTime) // reuse dt in case of wraparound + csd->dT = (thisSysTime - csd->lastSysTime) / portTICK_RATE_MS; + csd->lastSysTime = thisSysTime; + + // Read any input channels and apply LPF + for (uint8_t i = 0; i < CAMERASTABSETTINGS_INPUTS_NUMELEM; i++) { + if (cameraStab.Inputs[i] != CAMERASTABSETTINGS_INPUTS_NONE) { + if (AccessoryDesiredInstGet(cameraStab.Inputs[i] - CAMERASTABSETTINGS_INPUTS_ACCESSORY0, &accessory) == 0) { + float input_rate; + switch (cameraStab.StabilizationMode[i]) { + case CAMERASTABSETTINGS_STABILIZATIONMODE_ATTITUDE: + csd->inputs[i] = accessory.AccessoryVal * cameraStab.InputRange[i]; + break; + case CAMERASTABSETTINGS_STABILIZATIONMODE_AXISLOCK: + input_rate = accessory.AccessoryVal * cameraStab.InputRate[i]; + if (abs(input_rate) > cameraStab.MaxAxisLockRate) + csd->inputs[i] = bound(csd->inputs[i] + input_rate * csd->dT / 1000.0f, cameraStab.InputRange[i]); + break; + default: + PIOS_Assert(0); + } + csd->inputs_filtered[i] = (cameraStab.ResponseTime[i] / (cameraStab.ResponseTime[i] + csd->dT)) * csd->inputs_filtered[i] + + (csd->dT / (cameraStab.ResponseTime[i] + csd->dT)) * csd->inputs[i]; + } + } } // Set output channels + float attitude; + float output; + AttitudeActualRollGet(&attitude); - output = bound((attitude + inputs[0]) / cameraStab.OutputRange[CAMERASTABSETTINGS_OUTPUTRANGE_ROLL]); + output = bound((attitude + csd->inputs_filtered[CAMERASTABSETTINGS_INPUTS_ROLL]) / cameraStab.OutputRange[CAMERASTABSETTINGS_OUTPUTRANGE_ROLL], 1.0f); CameraDesiredRollSet(&output); AttitudeActualPitchGet(&attitude); - output = bound((attitude + inputs[1]) / cameraStab.OutputRange[CAMERASTABSETTINGS_OUTPUTRANGE_PITCH]); + output = bound((attitude + csd->inputs_filtered[CAMERASTABSETTINGS_INPUTS_PITCH]) / cameraStab.OutputRange[CAMERASTABSETTINGS_OUTPUTRANGE_PITCH], 1.0f); CameraDesiredPitchSet(&output); AttitudeActualYawGet(&attitude); - output = bound((attitude + inputs[2]) / cameraStab.OutputRange[CAMERASTABSETTINGS_OUTPUTRANGE_YAW]); + output = bound((attitude + csd->inputs_filtered[CAMERASTABSETTINGS_INPUTS_YAW]) / cameraStab.OutputRange[CAMERASTABSETTINGS_OUTPUTRANGE_YAW], 1.0f); CameraDesiredYawSet(&output); - } -float bound(float val) +float bound(float val, float limit) { - return (val > 1) ? 1 : - (val < -1) ? -1 : + return (val > limit) ? limit : + (val < -limit) ? -limit : val; } /** diff --git a/shared/uavobjectdefinition/camerastabsettings.xml b/shared/uavobjectdefinition/camerastabsettings.xml index 09199b77a..27ba09536 100644 --- a/shared/uavobjectdefinition/camerastabsettings.xml +++ b/shared/uavobjectdefinition/camerastabsettings.xml @@ -3,6 +3,10 @@ Settings for the @ref CameraStab mmodule + + + + From e11904c42f746d97943a3912d89251818d8c7e49 Mon Sep 17 00:00:00 2001 From: Oleg Semyonov Date: Sun, 18 Dec 2011 01:34:45 +0200 Subject: [PATCH 067/121] CameraStab: change ResponseTime type from float to int16 --- flight/Modules/CameraStab/camerastab.c | 7 ++++--- shared/uavobjectdefinition/camerastabsettings.xml | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/flight/Modules/CameraStab/camerastab.c b/flight/Modules/CameraStab/camerastab.c index fce2f70d9..87f07e079 100644 --- a/flight/Modules/CameraStab/camerastab.c +++ b/flight/Modules/CameraStab/camerastab.c @@ -154,14 +154,15 @@ static void attitudeUpdated(UAVObjEvent* ev) break; case CAMERASTABSETTINGS_STABILIZATIONMODE_AXISLOCK: input_rate = accessory.AccessoryVal * cameraStab.InputRate[i]; - if (abs(input_rate) > cameraStab.MaxAxisLockRate) + if (fabs(input_rate) > cameraStab.MaxAxisLockRate) csd->inputs[i] = bound(csd->inputs[i] + input_rate * csd->dT / 1000.0f, cameraStab.InputRange[i]); break; default: PIOS_Assert(0); } - csd->inputs_filtered[i] = (cameraStab.ResponseTime[i] / (cameraStab.ResponseTime[i] + csd->dT)) * csd->inputs_filtered[i] - + (csd->dT / (cameraStab.ResponseTime[i] + csd->dT)) * csd->inputs[i]; + float rt = (float)cameraStab.ResponseTime[i]; + csd->inputs_filtered[i] = (rt / (rt + csd->dT)) * csd->inputs_filtered[i] + + (csd->dT / (rt + csd->dT)) * csd->inputs[i]; } } } diff --git a/shared/uavobjectdefinition/camerastabsettings.xml b/shared/uavobjectdefinition/camerastabsettings.xml index 27ba09536..3208b9f24 100644 --- a/shared/uavobjectdefinition/camerastabsettings.xml +++ b/shared/uavobjectdefinition/camerastabsettings.xml @@ -4,7 +4,7 @@ - + From 406cff296da2b4b4a2bbb71e9005a425ebbfa8d4 Mon Sep 17 00:00:00 2001 From: Oleg Semyonov Date: Sun, 18 Dec 2011 02:24:15 +0200 Subject: [PATCH 068/121] CameraStab: bypass LPF calculation if ResponseTime is zero --- flight/Modules/CameraStab/camerastab.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/flight/Modules/CameraStab/camerastab.c b/flight/Modules/CameraStab/camerastab.c index 87f07e079..20f4db03a 100644 --- a/flight/Modules/CameraStab/camerastab.c +++ b/flight/Modules/CameraStab/camerastab.c @@ -160,9 +160,14 @@ static void attitudeUpdated(UAVObjEvent* ev) default: PIOS_Assert(0); } + + // bypass LPF calculation if ResponseTime is zero float rt = (float)cameraStab.ResponseTime[i]; - csd->inputs_filtered[i] = (rt / (rt + csd->dT)) * csd->inputs_filtered[i] - + (csd->dT / (rt + csd->dT)) * csd->inputs[i]; + if (rt) + csd->inputs_filtered[i] = (rt / (rt + csd->dT)) * csd->inputs_filtered[i] + + (csd->dT / (rt + csd->dT)) * csd->inputs[i]; + else + csd->inputs_filtered[i] = csd->inputs[i]; } } } From 65abb8f81953eb937d977c9161c7075b284c4a0a Mon Sep 17 00:00:00 2001 From: Oleg Semyonov Date: Mon, 19 Dec 2011 02:16:32 +0200 Subject: [PATCH 069/121] CameraStab: small optimization, freed 8 more heap bytes --- flight/Modules/CameraStab/camerastab.c | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/flight/Modules/CameraStab/camerastab.c b/flight/Modules/CameraStab/camerastab.c index 20f4db03a..715da1aca 100644 --- a/flight/Modules/CameraStab/camerastab.c +++ b/flight/Modules/CameraStab/camerastab.c @@ -62,9 +62,7 @@ // Private variables static struct CameraStab_data { - UAVObjEvent ev; portTickType lastSysTime; - float dT; float inputs[CAMERASTABSETTINGS_INPUTS_NUMELEM]; float inputs_filtered[CAMERASTABSETTINGS_INPUTS_NUMELEM]; } *csd; @@ -100,18 +98,17 @@ int32_t CameraStabInitialize(void) // make sure that all inputs[] and inputs_filtered[] are zeroed memset(csd, 0, sizeof(struct CameraStab_data)); csd->lastSysTime = xTaskGetTickCount(); - csd->dT = 1; AttitudeActualInitialize(); - - csd->ev.obj = AttitudeActualHandle(); - csd->ev.instId = 0; - csd->ev.event = 0; - CameraStabSettingsInitialize(); CameraDesiredInitialize(); - EventPeriodicCallbackCreate(&(csd->ev), attitudeUpdated, SAMPLE_PERIOD_MS / portTICK_RATE_MS); + UAVObjEvent ev = { + .obj = AttitudeActualHandle(), + .instId = 0, + .event = 0, + }; + EventPeriodicCallbackCreate(&ev, attitudeUpdated, SAMPLE_PERIOD_MS / portTICK_RATE_MS); return 0; } @@ -139,8 +136,9 @@ static void attitudeUpdated(UAVObjEvent* ev) // Check how long since last update, time delta between calls in ms portTickType thisSysTime = xTaskGetTickCount(); - if (thisSysTime > csd->lastSysTime) // reuse dt in case of wraparound - csd->dT = (thisSysTime - csd->lastSysTime) / portTICK_RATE_MS; + float dT = (thisSysTime > csd->lastSysTime) ? + (thisSysTime - csd->lastSysTime) / portTICK_RATE_MS : + (float)SAMPLE_PERIOD_MS / 1000.0f; csd->lastSysTime = thisSysTime; // Read any input channels and apply LPF @@ -155,7 +153,7 @@ static void attitudeUpdated(UAVObjEvent* ev) case CAMERASTABSETTINGS_STABILIZATIONMODE_AXISLOCK: input_rate = accessory.AccessoryVal * cameraStab.InputRate[i]; if (fabs(input_rate) > cameraStab.MaxAxisLockRate) - csd->inputs[i] = bound(csd->inputs[i] + input_rate * csd->dT / 1000.0f, cameraStab.InputRange[i]); + csd->inputs[i] = bound(csd->inputs[i] + input_rate * dT / 1000.0f, cameraStab.InputRange[i]); break; default: PIOS_Assert(0); @@ -164,8 +162,8 @@ static void attitudeUpdated(UAVObjEvent* ev) // bypass LPF calculation if ResponseTime is zero float rt = (float)cameraStab.ResponseTime[i]; if (rt) - csd->inputs_filtered[i] = (rt / (rt + csd->dT)) * csd->inputs_filtered[i] - + (csd->dT / (rt + csd->dT)) * csd->inputs[i]; + csd->inputs_filtered[i] = (rt / (rt + dT)) * csd->inputs_filtered[i] + + (dT / (rt + dT)) * csd->inputs[i]; else csd->inputs_filtered[i] = csd->inputs[i]; } From 445fd79b110b40a0382a4376dd715716695d41fd Mon Sep 17 00:00:00 2001 From: Oleg Semyonov Date: Mon, 19 Dec 2011 02:27:58 +0200 Subject: [PATCH 070/121] CameraStab: update README.txt --- HISTORY.txt | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/HISTORY.txt b/HISTORY.txt index aba9effab..a69fae150 100644 --- a/HISTORY.txt +++ b/HISTORY.txt @@ -1,5 +1,17 @@ Short summary of changes. For a complete list see the git log. +2011-12-19 +Added new camera stabilization features: AxisLock mode and LPF. +New options: + StabilizationMode: Attitude (default) or AxisLock. + InputRate: 50deg/s by default. Changes stick sensitivity in AxisLock mode. + MaxAxisLockRate: 1deg/s by default. The same meaning as similar option + for AxisLock stabilization. + ResponseTime: 150ms by default. Zero value disables LPF. +The GUI does not currently expose the configuration for using the transmitter +to change the view angle and advanced options but this is supported by the +hardware. + 2011-12-10 Merged a change that sorts the UAVO fields based on size. Because this changes all of the objects, erase all existing flash files based on this. From 9c35570df6df0110e55a041775df8c55b3cb33b2 Mon Sep 17 00:00:00 2001 From: Oleg Semyonov Date: Fri, 30 Dec 2011 22:25:24 +0200 Subject: [PATCH 071/121] CameraStab: add advanced camera settings to the config GUI --- HISTORY.txt | 3 - .../src/plugins/config/camerastabilization.ui | 954 ++++++++++++------ .../configcamerastabilizationwidget.cpp | 139 ++- 3 files changed, 732 insertions(+), 364 deletions(-) diff --git a/HISTORY.txt b/HISTORY.txt index a69fae150..4ef00b1af 100644 --- a/HISTORY.txt +++ b/HISTORY.txt @@ -8,9 +8,6 @@ New options: MaxAxisLockRate: 1deg/s by default. The same meaning as similar option for AxisLock stabilization. ResponseTime: 150ms by default. Zero value disables LPF. -The GUI does not currently expose the configuration for using the transmitter -to change the view angle and advanced options but this is supported by the -hardware. 2011-12-10 Merged a change that sorts the UAVO fields based on size. Because this changes diff --git a/ground/openpilotgcs/src/plugins/config/camerastabilization.ui b/ground/openpilotgcs/src/plugins/config/camerastabilization.ui index 76ff38fcb..f65e8b585 100644 --- a/ground/openpilotgcs/src/plugins/config/camerastabilization.ui +++ b/ground/openpilotgcs/src/plugins/config/camerastabilization.ui @@ -1,328 +1,626 @@ - - - CameraStabilizationWidget - - - - 0 - 0 - 720 - 567 - - - - Form - - - - - - Enable CameraStabilization module - - - - - - - After enabling the module, you must power cycle before using and configuring. - - - - - - - Qt::Horizontal - - - - - - - Channel Ranges (number of degrees full range) - - - - - - - - Pitch - - - - - - - Yaw - - - - - - - Roll - - - - - - - 180 - - - - - - - 180 - - - - - - - 180 - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Qt::Horizontal - - - - 212 - 20 - - - - - - - - - - - Channel Mapping (select output channel or none to disable) - - - - - - - - Roll - - - - - - - - None - - - - - - - - - None - - - - - - - - Pitch - - - - - - - - None - - - - - - - - Yaw - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Qt::Horizontal - - - - 212 - 20 - - - - - - - - - - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - 0 - 0 - - - - - 32 - 32 - - - - - true - - - - - - - - :/core/images/helpicon.svg:/core/images/helpicon.svg - - - - 32 - 32 - - - - Ctrl+S - - - false - - - true - - - - - - - Save settings to the board (RAM only). - -This does not save the calibration settings, this is done using the -specific calibration button on top of the screen. - - - Apply - - - - - - - Send settings to the board, and save to the non-volatile memory. - - - Save - - - false - - - - - - - - - - - - + + + CameraStabilizationWidget + + + + 0 + 0 + 720 + 567 + + + + Form + + + + + + QFrame::NoFrame + + + true + + + + + 0 + 0 + 702 + 488 + + + + + + + Enable CameraStabilization module + + + + + + + After enabling the module, you must power cycle before using and configuring. + + + + + + + Qt::Horizontal + + + + + + + Qt::Vertical + + + QSizePolicy::Preferred + + + + 20 + 10 + + + + + + + + + 0 + 0 + + + + + 0 + 100 + + + + Basic Settings (Stabilization) + + + + + + 180 + + + 20 + + + + + + + 180 + + + 20 + + + + + + + 180 + + + 20 + + + + + + + + None + + + + + + + + + None + + + + + + + + + None + + + + + + + + Output Channel + + + + + + + Output Range + + + + + + + Yaw + + + Qt::AlignCenter + + + + + + + Pitch + + + Qt::AlignCenter + + + + + + + Roll + + + Qt::AlignCenter + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Preferred + + + + 20 + 10 + + + + + + + + + 0 + 0 + + + + + 0 + 204 + + + + Advanced Settings (Control) + + + + + + Yaw + + + Qt::AlignCenter + + + + + + + Pitch + + + Qt::AlignCenter + + + + + + + Roll + + + Qt::AlignCenter + + + + + + + + None + + + + + + + + + None + + + + + + + + + None + + + + + + + + Input Channel + + + + + + + + Attitude + + + + + + + + 180 + + + 20 + + + + + + + 180 + + + 50 + + + + + + + 1000 + + + 150 + + + + + + + + Attitude + + + + + + + + 180 + + + 20 + + + + + + + 180 + + + 50 + + + + + + + 1000 + + + 150 + + + + + + + + Attitude + + + + + + + + 180 + + + 20 + + + + + + + 180 + + + 50 + + + + + + + 1000 + + + 150 + + + + + + + MaxAxisLockRate + + + + + + + Response Time + + + + + + + Input Rate + + + + + + + Input Range + + + + + + + Stabilization Mode + + + + + + + (the same value for Roll, Pitch, Yaw) + + + + + + + 1 + + + 0.100000000000000 + + + 1.000000000000000 + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + + + + + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 0 + 0 + + + + + 32 + 32 + + + + + true + + + + + + + + :/core/images/helpicon.svg:/core/images/helpicon.svg + + + + 32 + 32 + + + + Ctrl+S + + + false + + + true + + + + + + + Save settings to the board (RAM only). + +This does not save the calibration settings, this is done using the +specific calibration button on top of the screen. + + + Apply + + + + + + + Send settings to the board, and save to the non-volatile memory. + + + Save + + + false + + + + + + + + + + + enableCameraStabilization + rollChannel + pitchChannel + yawChannel + rollOutputRange + pitchOutputRange + yawOutputRange + rollInputChannel + pitchInputChannel + yawInputChannel + rollStabilizationMode + pitchStabilizationMode + yawStabilizationMode + rollInputRange + pitchInputRange + yawInputRange + rollInputRate + pitchInputRate + yawInputRate + rollResponseTime + pitchResponseTime + yawResponseTime + MaxAxisLockRate + camerastabilizationHelp + camerastabilizationSaveRAM + camerastabilizationSaveSD + scrollArea + + + + + + diff --git a/ground/openpilotgcs/src/plugins/config/configcamerastabilizationwidget.cpp b/ground/openpilotgcs/src/plugins/config/configcamerastabilizationwidget.cpp index a1e6c1afb..9343b34e8 100644 --- a/ground/openpilotgcs/src/plugins/config/configcamerastabilizationwidget.cpp +++ b/ground/openpilotgcs/src/plugins/config/configcamerastabilizationwidget.cpp @@ -27,16 +27,13 @@ #include "configcamerastabilizationwidget.h" #include -#include #include #include #include #include #include -#include -#include -#include #include +#include #include "camerastabsettings.h" #include "hwsettings.h" @@ -45,27 +42,57 @@ ConfigCameraStabilizationWidget::ConfigCameraStabilizationWidget(QWidget *parent) : ConfigTaskWidget(parent) { + // TODO: this widget should use the addUAVObjectToWidgetRelation() m_camerastabilization = new Ui_CameraStabilizationWidget(); m_camerastabilization->setupUi(this); - QComboBox * selectors[3] = { + QComboBox *outputs[3] = { m_camerastabilization->rollChannel, m_camerastabilization->pitchChannel, m_camerastabilization->yawChannel }; + QComboBox *inputs[3] = { + m_camerastabilization->rollInputChannel, + m_camerastabilization->pitchInputChannel, + m_camerastabilization->yawInputChannel, + }; + + QComboBox *stabilizationMode[3] = { + m_camerastabilization->rollStabilizationMode, + m_camerastabilization->pitchStabilizationMode, + m_camerastabilization->yawStabilizationMode, + }; + + CameraStabSettings *cameraStab = CameraStabSettings::GetInstance(getObjectManager()); + CameraStabSettings::DataFields cameraStabData = cameraStab->getData(); + for (int i = 0; i < 3; i++) { - selectors[i]->clear(); - selectors[i]->addItem("None"); - for (int j = 0; j < ActuatorCommand::CHANNEL_NUMELEM; j++) - selectors[i]->addItem(QString("Channel %1").arg(j+1)); + outputs[i]->clear(); + outputs[i]->addItem("None"); + for (quint32 j = 0; j < ActuatorCommand::CHANNEL_NUMELEM; j++) + outputs[i]->addItem(QString("Channel %1").arg(j+1)); + + UAVObjectField *field; + + field = cameraStab->getField("Inputs"); + Q_ASSERT(field); + inputs[i]->clear(); + inputs[i]->addItems(field->getOptions()); + inputs[i]->setCurrentIndex(cameraStabData.Inputs[i]); + + field = cameraStab->getField("StabilizationMode"); + Q_ASSERT(field); + stabilizationMode[i]->clear(); + stabilizationMode[i]->addItems(field->getOptions()); + stabilizationMode[i]->setCurrentIndex(cameraStabData.StabilizationMode[i]); } connectUpdates(); // Connect buttons - connect(m_camerastabilization->camerastabilizationSaveRAM,SIGNAL(clicked()),this,SLOT(applySettings())); - connect(m_camerastabilization->camerastabilizationSaveSD,SIGNAL(clicked()),this,SLOT(saveSettings())); + connect(m_camerastabilization->camerastabilizationSaveRAM, SIGNAL(clicked()), this, SLOT(applySettings())); + connect(m_camerastabilization->camerastabilizationSaveSD, SIGNAL(clicked()), this, SLOT(saveSettings())); connect(m_camerastabilization->camerastabilizationHelp, SIGNAL(clicked()), this, SLOT(openHelp())); } @@ -77,19 +104,19 @@ ConfigCameraStabilizationWidget::~ConfigCameraStabilizationWidget() void ConfigCameraStabilizationWidget::connectUpdates() { // Now connect the widget to the StabilizationSettings object - connect(MixerSettings::GetInstance(getObjectManager()),SIGNAL(objectUpdated(UAVObject*)),this,SLOT(refreshValues())); - connect(CameraStabSettings::GetInstance(getObjectManager()),SIGNAL(objectUpdated(UAVObject*)),this,SLOT(refreshValues())); + connect(MixerSettings::GetInstance(getObjectManager()), SIGNAL(objectUpdated(UAVObject *)), this, SLOT(refreshValues())); + connect(CameraStabSettings::GetInstance(getObjectManager()), SIGNAL(objectUpdated(UAVObject *)), this, SLOT(refreshValues())); // TODO: This will need to support both CC and OP later - connect(HwSettings::GetInstance(getObjectManager()),SIGNAL(objectUpdated(UAVObject*)),this,SLOT(refreshValues())); + connect(HwSettings::GetInstance(getObjectManager()), SIGNAL(objectUpdated(UAVObject *)), this, SLOT(refreshValues())); } void ConfigCameraStabilizationWidget::disconnectUpdates() { // Now connect the widget to the StabilizationSettings object - disconnect(MixerSettings::GetInstance(getObjectManager()),SIGNAL(objectUpdated(UAVObject*)),this,SLOT(refreshValues())); - disconnect(CameraStabSettings::GetInstance(getObjectManager()),SIGNAL(objectUpdated(UAVObject*)),this,SLOT(refreshValues())); + disconnect(MixerSettings::GetInstance(getObjectManager()), SIGNAL(objectUpdated(UAVObject *)), this, SLOT(refreshValues())); + disconnect(CameraStabSettings::GetInstance(getObjectManager()), SIGNAL(objectUpdated(UAVObject *)), this, SLOT(refreshValues())); // TODO: This will need to support both CC and OP later - disconnect(HwSettings::GetInstance(getObjectManager()),SIGNAL(objectUpdated(UAVObject*)),this,SLOT(refreshValues())); + disconnect(HwSettings::GetInstance(getObjectManager()), SIGNAL(objectUpdated(UAVObject *)), this, SLOT(refreshValues())); } /** @@ -99,7 +126,7 @@ void ConfigCameraStabilizationWidget::disconnectUpdates() void ConfigCameraStabilizationWidget::applySettings() { // Enable or disable the settings - HwSettings * hwSettings = HwSettings::GetInstance(getObjectManager()); + HwSettings *hwSettings = HwSettings::GetInstance(getObjectManager()); HwSettings::DataFields hwSettingsData = hwSettings->getData(); hwSettingsData.OptionalModules[HwSettings::OPTIONALMODULES_CAMERASTAB] = m_camerastabilization->enableCameraStabilization->isChecked() ? @@ -107,11 +134,11 @@ void ConfigCameraStabilizationWidget::applySettings() HwSettings::OPTIONALMODULES_DISABLED; // Update the mixer settings - MixerSettings * mixerSettings = MixerSettings::GetInstance(getObjectManager()); + MixerSettings *mixerSettings = MixerSettings::GetInstance(getObjectManager()); MixerSettings::DataFields mixerSettingsData = mixerSettings->getData(); const int NUM_MIXERS = 10; - QComboBox * selectors[3] = { + QComboBox *outputs[3] = { m_camerastabilization->rollChannel, m_camerastabilization->pitchChannel, m_camerastabilization->yawChannel @@ -136,14 +163,14 @@ void ConfigCameraStabilizationWidget::applySettings() for (int i = 0; i < 3; i++) { // Channel 1 is second entry, so becomes zero - int mixerNum = selectors[i]->currentIndex() - 1; + int mixerNum = outputs[i]->currentIndex() - 1; if ( mixerNum >= 0 && // Short circuit in case of none *mixerTypes[mixerNum] != MixerSettings::MIXER1TYPE_DISABLED && (*mixerTypes[mixerNum] != MixerSettings::MIXER1TYPE_CAMERAROLL + i) ) { // If the mixer channel already to something that isn't what we are // about to set it to reset to none - selectors[i]->setCurrentIndex(0); + outputs[i]->setCurrentIndex(0); m_camerastabilization->message->setText("One of the channels is already assigned, reverted to none"); } else { // Make sure no other channels have this output set @@ -158,13 +185,36 @@ void ConfigCameraStabilizationWidget::applySettings() } } - // Update the ranges - CameraStabSettings * cameraStab = CameraStabSettings::GetInstance(getObjectManager()); + // Update the settings + CameraStabSettings *cameraStab = CameraStabSettings::GetInstance(getObjectManager()); CameraStabSettings::DataFields cameraStabData = cameraStab->getData(); + cameraStabData.OutputRange[CameraStabSettings::OUTPUTRANGE_ROLL] = m_camerastabilization->rollOutputRange->value(); cameraStabData.OutputRange[CameraStabSettings::OUTPUTRANGE_PITCH] = m_camerastabilization->pitchOutputRange->value(); cameraStabData.OutputRange[CameraStabSettings::OUTPUTRANGE_YAW] = m_camerastabilization->yawOutputRange->value(); + cameraStabData.Inputs[CameraStabSettings::INPUTS_ROLL] = m_camerastabilization->rollInputChannel->currentIndex(); + cameraStabData.Inputs[CameraStabSettings::INPUTS_PITCH] = m_camerastabilization->pitchInputChannel->currentIndex(); + cameraStabData.Inputs[CameraStabSettings::INPUTS_YAW] = m_camerastabilization->yawInputChannel->currentIndex(); + + cameraStabData.StabilizationMode[CameraStabSettings::STABILIZATIONMODE_ROLL] = m_camerastabilization->rollStabilizationMode->currentIndex(); + cameraStabData.StabilizationMode[CameraStabSettings::STABILIZATIONMODE_PITCH] = m_camerastabilization->pitchStabilizationMode->currentIndex(); + cameraStabData.StabilizationMode[CameraStabSettings::STABILIZATIONMODE_YAW] = m_camerastabilization->yawStabilizationMode->currentIndex(); + + cameraStabData.InputRange[CameraStabSettings::INPUTRANGE_ROLL] = m_camerastabilization->rollInputRange->value(); + cameraStabData.InputRange[CameraStabSettings::INPUTRANGE_PITCH] = m_camerastabilization->pitchInputRange->value(); + cameraStabData.InputRange[CameraStabSettings::INPUTRANGE_YAW] = m_camerastabilization->yawInputRange->value(); + + cameraStabData.InputRate[CameraStabSettings::INPUTRATE_ROLL] = m_camerastabilization->rollInputRate->value(); + cameraStabData.InputRate[CameraStabSettings::INPUTRATE_PITCH] = m_camerastabilization->pitchInputRate->value(); + cameraStabData.InputRate[CameraStabSettings::INPUTRATE_YAW] = m_camerastabilization->yawInputRate->value(); + + cameraStabData.ResponseTime[CameraStabSettings::RESPONSETIME_ROLL] = m_camerastabilization->rollResponseTime->value(); + cameraStabData.ResponseTime[CameraStabSettings::RESPONSETIME_PITCH] = m_camerastabilization->pitchResponseTime->value(); + cameraStabData.ResponseTime[CameraStabSettings::RESPONSETIME_YAW] = m_camerastabilization->yawResponseTime->value(); + + cameraStabData.MaxAxisLockRate = m_camerastabilization->MaxAxisLockRate->value(); + // Because multiple objects are updated, and all of them trigger the callback // they must be done together (if update one then load settings from second // the first update would wipe the UI controls). However to be extra cautious @@ -182,7 +232,7 @@ void ConfigCameraStabilizationWidget::applySettings() void ConfigCameraStabilizationWidget::saveSettings() { applySettings(); - UAVObject * obj = HwSettings::GetInstance(getObjectManager()); + UAVObject *obj = HwSettings::GetInstance(getObjectManager()); saveObjectToSD(obj); obj = MixerSettings::GetInstance(getObjectManager()); saveObjectToSD(obj); @@ -192,22 +242,45 @@ void ConfigCameraStabilizationWidget::saveSettings() void ConfigCameraStabilizationWidget::refreshValues() { - HwSettings * hwSettings = HwSettings::GetInstance(getObjectManager()); + HwSettings *hwSettings = HwSettings::GetInstance(getObjectManager()); HwSettings::DataFields hwSettingsData = hwSettings->getData(); m_camerastabilization->enableCameraStabilization->setChecked( hwSettingsData.OptionalModules[HwSettings::OPTIONALMODULES_CAMERASTAB] == HwSettings::OPTIONALMODULES_ENABLED); - CameraStabSettings * cameraStabSettings = CameraStabSettings::GetInstance(getObjectManager()); + CameraStabSettings *cameraStabSettings = CameraStabSettings::GetInstance(getObjectManager()); CameraStabSettings::DataFields cameraStab = cameraStabSettings->getData(); + m_camerastabilization->rollOutputRange->setValue(cameraStab.OutputRange[CameraStabSettings::OUTPUTRANGE_ROLL]); m_camerastabilization->pitchOutputRange->setValue(cameraStab.OutputRange[CameraStabSettings::OUTPUTRANGE_PITCH]); m_camerastabilization->yawOutputRange->setValue(cameraStab.OutputRange[CameraStabSettings::OUTPUTRANGE_YAW]); - MixerSettings * mixerSettings = MixerSettings::GetInstance(getObjectManager()); + m_camerastabilization->rollInputChannel->setCurrentIndex(cameraStab.Inputs[CameraStabSettings::INPUTS_ROLL]); + m_camerastabilization->pitchInputChannel->setCurrentIndex(cameraStab.Inputs[CameraStabSettings::INPUTS_PITCH]); + m_camerastabilization->yawInputChannel->setCurrentIndex(cameraStab.Inputs[CameraStabSettings::INPUTS_YAW]); + + m_camerastabilization->rollStabilizationMode->setCurrentIndex(cameraStab.StabilizationMode[CameraStabSettings::STABILIZATIONMODE_ROLL]); + m_camerastabilization->pitchStabilizationMode->setCurrentIndex(cameraStab.StabilizationMode[CameraStabSettings::STABILIZATIONMODE_PITCH]); + m_camerastabilization->yawStabilizationMode->setCurrentIndex(cameraStab.StabilizationMode[CameraStabSettings::STABILIZATIONMODE_YAW]); + + m_camerastabilization->rollInputRange->setValue(cameraStab.InputRange[CameraStabSettings::INPUTRANGE_ROLL]); + m_camerastabilization->pitchInputRange->setValue(cameraStab.InputRange[CameraStabSettings::INPUTRANGE_PITCH]); + m_camerastabilization->yawInputRange->setValue(cameraStab.InputRange[CameraStabSettings::INPUTRANGE_YAW]); + + m_camerastabilization->rollInputRate->setValue(cameraStab.InputRate[CameraStabSettings::INPUTRATE_ROLL]); + m_camerastabilization->pitchInputRate->setValue(cameraStab.InputRate[CameraStabSettings::INPUTRATE_PITCH]); + m_camerastabilization->yawInputRate->setValue(cameraStab.InputRate[CameraStabSettings::INPUTRATE_YAW]); + + m_camerastabilization->rollResponseTime->setValue(cameraStab.ResponseTime[CameraStabSettings::RESPONSETIME_ROLL]); + m_camerastabilization->pitchResponseTime->setValue(cameraStab.ResponseTime[CameraStabSettings::RESPONSETIME_PITCH]); + m_camerastabilization->yawResponseTime->setValue(cameraStab.ResponseTime[CameraStabSettings::RESPONSETIME_YAW]); + + m_camerastabilization->MaxAxisLockRate->setValue(cameraStab.MaxAxisLockRate); + + MixerSettings *mixerSettings = MixerSettings::GetInstance(getObjectManager()); MixerSettings::DataFields mixerSettingsData = mixerSettings->getData(); const int NUM_MIXERS = 10; - QComboBox * selectors[3] = { + QComboBox *outputs[3] = { m_camerastabilization->rollChannel, m_camerastabilization->pitchChannel, m_camerastabilization->yawChannel @@ -232,17 +305,17 @@ void ConfigCameraStabilizationWidget::refreshValues() { // Default to none if not found. Then search for any mixer channels set to // this - selectors[i]->setCurrentIndex(0); + outputs[i]->setCurrentIndex(0); for (int j = 0; j < NUM_MIXERS; j++) if (*mixerTypes[j] == (MixerSettings::MIXER1TYPE_CAMERAROLL + i) && - selectors[i]->currentIndex() != (j + 1)) - selectors[i]->setCurrentIndex(j + 1); + outputs[i]->currentIndex() != (j + 1)) + outputs[i]->setCurrentIndex(j + 1); } } void ConfigCameraStabilizationWidget::openHelp() { - QDesktopServices::openUrl( QUrl("http://wiki.openpilot.org/display/Doc/Camera+Stabilization", QUrl::StrictMode) ); + QDesktopServices::openUrl( QUrl("http://wiki.openpilot.org/display/Doc/Camera+Stabilization+Configuration", QUrl::StrictMode) ); } void ConfigCameraStabilizationWidget::enableControls(bool enable) From b01e332e03e77e1dee62cfd7971ac6ea66bedee6 Mon Sep 17 00:00:00 2001 From: Oleg Semyonov Date: Fri, 30 Dec 2011 19:18:33 +0200 Subject: [PATCH 072/121] CameraStab: rename UAVO field --- flight/Modules/CameraStab/camerastab.c | 16 ++++++++-------- .../config/configcamerastabilizationwidget.cpp | 16 ++++++++-------- .../uavobjectdefinition/camerastabsettings.xml | 2 +- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/flight/Modules/CameraStab/camerastab.c b/flight/Modules/CameraStab/camerastab.c index 715da1aca..b0625693f 100644 --- a/flight/Modules/CameraStab/camerastab.c +++ b/flight/Modules/CameraStab/camerastab.c @@ -63,8 +63,8 @@ // Private variables static struct CameraStab_data { portTickType lastSysTime; - float inputs[CAMERASTABSETTINGS_INPUTS_NUMELEM]; - float inputs_filtered[CAMERASTABSETTINGS_INPUTS_NUMELEM]; + float inputs[CAMERASTABSETTINGS_INPUT_NUMELEM]; + float inputs_filtered[CAMERASTABSETTINGS_INPUT_NUMELEM]; } *csd; // Private functions @@ -142,9 +142,9 @@ static void attitudeUpdated(UAVObjEvent* ev) csd->lastSysTime = thisSysTime; // Read any input channels and apply LPF - for (uint8_t i = 0; i < CAMERASTABSETTINGS_INPUTS_NUMELEM; i++) { - if (cameraStab.Inputs[i] != CAMERASTABSETTINGS_INPUTS_NONE) { - if (AccessoryDesiredInstGet(cameraStab.Inputs[i] - CAMERASTABSETTINGS_INPUTS_ACCESSORY0, &accessory) == 0) { + for (uint8_t i = 0; i < CAMERASTABSETTINGS_INPUT_NUMELEM; i++) { + if (cameraStab.Input[i] != CAMERASTABSETTINGS_INPUT_NONE) { + if (AccessoryDesiredInstGet(cameraStab.Input[i] - CAMERASTABSETTINGS_INPUT_ACCESSORY0, &accessory) == 0) { float input_rate; switch (cameraStab.StabilizationMode[i]) { case CAMERASTABSETTINGS_STABILIZATIONMODE_ATTITUDE: @@ -175,15 +175,15 @@ static void attitudeUpdated(UAVObjEvent* ev) float output; AttitudeActualRollGet(&attitude); - output = bound((attitude + csd->inputs_filtered[CAMERASTABSETTINGS_INPUTS_ROLL]) / cameraStab.OutputRange[CAMERASTABSETTINGS_OUTPUTRANGE_ROLL], 1.0f); + output = bound((attitude + csd->inputs_filtered[CAMERASTABSETTINGS_INPUT_ROLL]) / cameraStab.OutputRange[CAMERASTABSETTINGS_OUTPUTRANGE_ROLL], 1.0f); CameraDesiredRollSet(&output); AttitudeActualPitchGet(&attitude); - output = bound((attitude + csd->inputs_filtered[CAMERASTABSETTINGS_INPUTS_PITCH]) / cameraStab.OutputRange[CAMERASTABSETTINGS_OUTPUTRANGE_PITCH], 1.0f); + output = bound((attitude + csd->inputs_filtered[CAMERASTABSETTINGS_INPUT_PITCH]) / cameraStab.OutputRange[CAMERASTABSETTINGS_OUTPUTRANGE_PITCH], 1.0f); CameraDesiredPitchSet(&output); AttitudeActualYawGet(&attitude); - output = bound((attitude + csd->inputs_filtered[CAMERASTABSETTINGS_INPUTS_YAW]) / cameraStab.OutputRange[CAMERASTABSETTINGS_OUTPUTRANGE_YAW], 1.0f); + output = bound((attitude + csd->inputs_filtered[CAMERASTABSETTINGS_INPUT_YAW]) / cameraStab.OutputRange[CAMERASTABSETTINGS_OUTPUTRANGE_YAW], 1.0f); CameraDesiredYawSet(&output); } diff --git a/ground/openpilotgcs/src/plugins/config/configcamerastabilizationwidget.cpp b/ground/openpilotgcs/src/plugins/config/configcamerastabilizationwidget.cpp index 9343b34e8..28959b58b 100644 --- a/ground/openpilotgcs/src/plugins/config/configcamerastabilizationwidget.cpp +++ b/ground/openpilotgcs/src/plugins/config/configcamerastabilizationwidget.cpp @@ -75,11 +75,11 @@ ConfigCameraStabilizationWidget::ConfigCameraStabilizationWidget(QWidget *parent UAVObjectField *field; - field = cameraStab->getField("Inputs"); + field = cameraStab->getField("Input"); Q_ASSERT(field); inputs[i]->clear(); inputs[i]->addItems(field->getOptions()); - inputs[i]->setCurrentIndex(cameraStabData.Inputs[i]); + inputs[i]->setCurrentIndex(cameraStabData.Input[i]); field = cameraStab->getField("StabilizationMode"); Q_ASSERT(field); @@ -193,9 +193,9 @@ void ConfigCameraStabilizationWidget::applySettings() cameraStabData.OutputRange[CameraStabSettings::OUTPUTRANGE_PITCH] = m_camerastabilization->pitchOutputRange->value(); cameraStabData.OutputRange[CameraStabSettings::OUTPUTRANGE_YAW] = m_camerastabilization->yawOutputRange->value(); - cameraStabData.Inputs[CameraStabSettings::INPUTS_ROLL] = m_camerastabilization->rollInputChannel->currentIndex(); - cameraStabData.Inputs[CameraStabSettings::INPUTS_PITCH] = m_camerastabilization->pitchInputChannel->currentIndex(); - cameraStabData.Inputs[CameraStabSettings::INPUTS_YAW] = m_camerastabilization->yawInputChannel->currentIndex(); + cameraStabData.Input[CameraStabSettings::INPUT_ROLL] = m_camerastabilization->rollInputChannel->currentIndex(); + cameraStabData.Input[CameraStabSettings::INPUT_PITCH] = m_camerastabilization->pitchInputChannel->currentIndex(); + cameraStabData.Input[CameraStabSettings::INPUT_YAW] = m_camerastabilization->yawInputChannel->currentIndex(); cameraStabData.StabilizationMode[CameraStabSettings::STABILIZATIONMODE_ROLL] = m_camerastabilization->rollStabilizationMode->currentIndex(); cameraStabData.StabilizationMode[CameraStabSettings::STABILIZATIONMODE_PITCH] = m_camerastabilization->pitchStabilizationMode->currentIndex(); @@ -255,9 +255,9 @@ void ConfigCameraStabilizationWidget::refreshValues() m_camerastabilization->pitchOutputRange->setValue(cameraStab.OutputRange[CameraStabSettings::OUTPUTRANGE_PITCH]); m_camerastabilization->yawOutputRange->setValue(cameraStab.OutputRange[CameraStabSettings::OUTPUTRANGE_YAW]); - m_camerastabilization->rollInputChannel->setCurrentIndex(cameraStab.Inputs[CameraStabSettings::INPUTS_ROLL]); - m_camerastabilization->pitchInputChannel->setCurrentIndex(cameraStab.Inputs[CameraStabSettings::INPUTS_PITCH]); - m_camerastabilization->yawInputChannel->setCurrentIndex(cameraStab.Inputs[CameraStabSettings::INPUTS_YAW]); + m_camerastabilization->rollInputChannel->setCurrentIndex(cameraStab.Input[CameraStabSettings::INPUT_ROLL]); + m_camerastabilization->pitchInputChannel->setCurrentIndex(cameraStab.Input[CameraStabSettings::INPUT_PITCH]); + m_camerastabilization->yawInputChannel->setCurrentIndex(cameraStab.Input[CameraStabSettings::INPUT_YAW]); m_camerastabilization->rollStabilizationMode->setCurrentIndex(cameraStab.StabilizationMode[CameraStabSettings::STABILIZATIONMODE_ROLL]); m_camerastabilization->pitchStabilizationMode->setCurrentIndex(cameraStab.StabilizationMode[CameraStabSettings::STABILIZATIONMODE_PITCH]); diff --git a/shared/uavobjectdefinition/camerastabsettings.xml b/shared/uavobjectdefinition/camerastabsettings.xml index 3208b9f24..069abdeb3 100644 --- a/shared/uavobjectdefinition/camerastabsettings.xml +++ b/shared/uavobjectdefinition/camerastabsettings.xml @@ -1,7 +1,7 @@ Settings for the @ref CameraStab mmodule - + From 595c0978b34b28063e19f3380ebb6f1ab531a671 Mon Sep 17 00:00:00 2001 From: Oleg Semyonov Date: Mon, 2 Jan 2012 03:32:03 +0200 Subject: [PATCH 073/121] CameraStab: add "Reset To Defaults" button This loads the default settings (except output channels) to the GUI page but does not apply them automatically. User can apply/save them or reload current values from the board using UAVObjBrowser. --- .../src/plugins/config/camerastabilization.ui | 8 ++ .../configcamerastabilizationwidget.cpp | 92 +++++++++++-------- .../config/configcamerastabilizationwidget.h | 18 ++-- 3 files changed, 66 insertions(+), 52 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/config/camerastabilization.ui b/ground/openpilotgcs/src/plugins/config/camerastabilization.ui index f65e8b585..184aebda1 100644 --- a/ground/openpilotgcs/src/plugins/config/camerastabilization.ui +++ b/ground/openpilotgcs/src/plugins/config/camerastabilization.ui @@ -502,6 +502,13 @@ + + + + Reset To Defaults + + + @@ -614,6 +621,7 @@ specific calibration button on top of the screen. pitchResponseTime yawResponseTime MaxAxisLockRate + camerastabilizationResetToDefaults camerastabilizationHelp camerastabilizationSaveRAM camerastabilizationSaveSD diff --git a/ground/openpilotgcs/src/plugins/config/configcamerastabilizationwidget.cpp b/ground/openpilotgcs/src/plugins/config/configcamerastabilizationwidget.cpp index 28959b58b..eece2e214 100644 --- a/ground/openpilotgcs/src/plugins/config/configcamerastabilizationwidget.cpp +++ b/ground/openpilotgcs/src/plugins/config/configcamerastabilizationwidget.cpp @@ -2,7 +2,7 @@ ****************************************************************************** * * @file configcamerastabilizationwidget.cpp - * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2011. * @addtogroup GCSPlugins GCS Plugins * @{ * @addtogroup ConfigPlugin Config Plugin @@ -25,21 +25,15 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "configcamerastabilizationwidget.h" - -#include -#include -#include -#include -#include -#include -#include -#include - #include "camerastabsettings.h" #include "hwsettings.h" #include "mixersettings.h" #include "actuatorcommand.h" +#include +#include +#include + ConfigCameraStabilizationWidget::ConfigCameraStabilizationWidget(QWidget *parent) : ConfigTaskWidget(parent) { // TODO: this widget should use the addUAVObjectToWidgetRelation() @@ -49,7 +43,7 @@ ConfigCameraStabilizationWidget::ConfigCameraStabilizationWidget(QWidget *parent QComboBox *outputs[3] = { m_camerastabilization->rollChannel, m_camerastabilization->pitchChannel, - m_camerastabilization->yawChannel + m_camerastabilization->yawChannel, }; QComboBox *inputs[3] = { @@ -91,6 +85,7 @@ ConfigCameraStabilizationWidget::ConfigCameraStabilizationWidget(QWidget *parent connectUpdates(); // Connect buttons + connect(m_camerastabilization->camerastabilizationResetToDefaults, SIGNAL(clicked()), this, SLOT(resetToDefaults())); connect(m_camerastabilization->camerastabilizationSaveRAM, SIGNAL(clicked()), this, SLOT(applySettings())); connect(m_camerastabilization->camerastabilizationSaveSD, SIGNAL(clicked()), this, SLOT(saveSettings())); connect(m_camerastabilization->camerastabilizationHelp, SIGNAL(clicked()), this, SLOT(openHelp())); @@ -141,7 +136,7 @@ void ConfigCameraStabilizationWidget::applySettings() QComboBox *outputs[3] = { m_camerastabilization->rollChannel, m_camerastabilization->pitchChannel, - m_camerastabilization->yawChannel + m_camerastabilization->yawChannel, }; // TODO: Need to reformat object so types are an @@ -240,6 +235,40 @@ void ConfigCameraStabilizationWidget::saveSettings() saveObjectToSD(obj); } +/** + * Refresh UI with new settings of CameraStabSettings object + * (either from active configuration or just loaded defaults + * to be applied or saved) + */ +void ConfigCameraStabilizationWidget::refreshUIValues(CameraStabSettings::DataFields &cameraStabData) +{ + m_camerastabilization->rollOutputRange->setValue(cameraStabData.OutputRange[CameraStabSettings::OUTPUTRANGE_ROLL]); + m_camerastabilization->pitchOutputRange->setValue(cameraStabData.OutputRange[CameraStabSettings::OUTPUTRANGE_PITCH]); + m_camerastabilization->yawOutputRange->setValue(cameraStabData.OutputRange[CameraStabSettings::OUTPUTRANGE_YAW]); + + m_camerastabilization->rollInputChannel->setCurrentIndex(cameraStabData.Input[CameraStabSettings::INPUT_ROLL]); + m_camerastabilization->pitchInputChannel->setCurrentIndex(cameraStabData.Input[CameraStabSettings::INPUT_PITCH]); + m_camerastabilization->yawInputChannel->setCurrentIndex(cameraStabData.Input[CameraStabSettings::INPUT_YAW]); + + m_camerastabilization->rollStabilizationMode->setCurrentIndex(cameraStabData.StabilizationMode[CameraStabSettings::STABILIZATIONMODE_ROLL]); + m_camerastabilization->pitchStabilizationMode->setCurrentIndex(cameraStabData.StabilizationMode[CameraStabSettings::STABILIZATIONMODE_PITCH]); + m_camerastabilization->yawStabilizationMode->setCurrentIndex(cameraStabData.StabilizationMode[CameraStabSettings::STABILIZATIONMODE_YAW]); + + m_camerastabilization->rollInputRange->setValue(cameraStabData.InputRange[CameraStabSettings::INPUTRANGE_ROLL]); + m_camerastabilization->pitchInputRange->setValue(cameraStabData.InputRange[CameraStabSettings::INPUTRANGE_PITCH]); + m_camerastabilization->yawInputRange->setValue(cameraStabData.InputRange[CameraStabSettings::INPUTRANGE_YAW]); + + m_camerastabilization->rollInputRate->setValue(cameraStabData.InputRate[CameraStabSettings::INPUTRATE_ROLL]); + m_camerastabilization->pitchInputRate->setValue(cameraStabData.InputRate[CameraStabSettings::INPUTRATE_PITCH]); + m_camerastabilization->yawInputRate->setValue(cameraStabData.InputRate[CameraStabSettings::INPUTRATE_YAW]); + + m_camerastabilization->rollResponseTime->setValue(cameraStabData.ResponseTime[CameraStabSettings::RESPONSETIME_ROLL]); + m_camerastabilization->pitchResponseTime->setValue(cameraStabData.ResponseTime[CameraStabSettings::RESPONSETIME_PITCH]); + m_camerastabilization->yawResponseTime->setValue(cameraStabData.ResponseTime[CameraStabSettings::RESPONSETIME_YAW]); + + m_camerastabilization->MaxAxisLockRate->setValue(cameraStabData.MaxAxisLockRate); +} + void ConfigCameraStabilizationWidget::refreshValues() { HwSettings *hwSettings = HwSettings::GetInstance(getObjectManager()); @@ -249,33 +278,8 @@ void ConfigCameraStabilizationWidget::refreshValues() HwSettings::OPTIONALMODULES_ENABLED); CameraStabSettings *cameraStabSettings = CameraStabSettings::GetInstance(getObjectManager()); - CameraStabSettings::DataFields cameraStab = cameraStabSettings->getData(); - - m_camerastabilization->rollOutputRange->setValue(cameraStab.OutputRange[CameraStabSettings::OUTPUTRANGE_ROLL]); - m_camerastabilization->pitchOutputRange->setValue(cameraStab.OutputRange[CameraStabSettings::OUTPUTRANGE_PITCH]); - m_camerastabilization->yawOutputRange->setValue(cameraStab.OutputRange[CameraStabSettings::OUTPUTRANGE_YAW]); - - m_camerastabilization->rollInputChannel->setCurrentIndex(cameraStab.Input[CameraStabSettings::INPUT_ROLL]); - m_camerastabilization->pitchInputChannel->setCurrentIndex(cameraStab.Input[CameraStabSettings::INPUT_PITCH]); - m_camerastabilization->yawInputChannel->setCurrentIndex(cameraStab.Input[CameraStabSettings::INPUT_YAW]); - - m_camerastabilization->rollStabilizationMode->setCurrentIndex(cameraStab.StabilizationMode[CameraStabSettings::STABILIZATIONMODE_ROLL]); - m_camerastabilization->pitchStabilizationMode->setCurrentIndex(cameraStab.StabilizationMode[CameraStabSettings::STABILIZATIONMODE_PITCH]); - m_camerastabilization->yawStabilizationMode->setCurrentIndex(cameraStab.StabilizationMode[CameraStabSettings::STABILIZATIONMODE_YAW]); - - m_camerastabilization->rollInputRange->setValue(cameraStab.InputRange[CameraStabSettings::INPUTRANGE_ROLL]); - m_camerastabilization->pitchInputRange->setValue(cameraStab.InputRange[CameraStabSettings::INPUTRANGE_PITCH]); - m_camerastabilization->yawInputRange->setValue(cameraStab.InputRange[CameraStabSettings::INPUTRANGE_YAW]); - - m_camerastabilization->rollInputRate->setValue(cameraStab.InputRate[CameraStabSettings::INPUTRATE_ROLL]); - m_camerastabilization->pitchInputRate->setValue(cameraStab.InputRate[CameraStabSettings::INPUTRATE_PITCH]); - m_camerastabilization->yawInputRate->setValue(cameraStab.InputRate[CameraStabSettings::INPUTRATE_YAW]); - - m_camerastabilization->rollResponseTime->setValue(cameraStab.ResponseTime[CameraStabSettings::RESPONSETIME_ROLL]); - m_camerastabilization->pitchResponseTime->setValue(cameraStab.ResponseTime[CameraStabSettings::RESPONSETIME_PITCH]); - m_camerastabilization->yawResponseTime->setValue(cameraStab.ResponseTime[CameraStabSettings::RESPONSETIME_YAW]); - - m_camerastabilization->MaxAxisLockRate->setValue(cameraStab.MaxAxisLockRate); + CameraStabSettings::DataFields cameraStabData = cameraStabSettings->getData(); + refreshUIValues(cameraStabData); MixerSettings *mixerSettings = MixerSettings::GetInstance(getObjectManager()); MixerSettings::DataFields mixerSettingsData = mixerSettings->getData(); @@ -313,6 +317,13 @@ void ConfigCameraStabilizationWidget::refreshValues() } } +void ConfigCameraStabilizationWidget::resetToDefaults() +{ + CameraStabSettings cameraStabDefaults; + CameraStabSettings::DataFields defaults = cameraStabDefaults.getData(); + refreshUIValues(defaults); +} + void ConfigCameraStabilizationWidget::openHelp() { QDesktopServices::openUrl( QUrl("http://wiki.openpilot.org/display/Doc/Camera+Stabilization+Configuration", QUrl::StrictMode) ); @@ -320,6 +331,7 @@ void ConfigCameraStabilizationWidget::openHelp() void ConfigCameraStabilizationWidget::enableControls(bool enable) { + m_camerastabilization->camerastabilizationResetToDefaults->setEnabled(enable); m_camerastabilization->camerastabilizationSaveSD->setEnabled(enable); m_camerastabilization->camerastabilizationSaveRAM->setEnabled(enable); } diff --git a/ground/openpilotgcs/src/plugins/config/configcamerastabilizationwidget.h b/ground/openpilotgcs/src/plugins/config/configcamerastabilizationwidget.h index f5440e360..4534bdc65 100644 --- a/ground/openpilotgcs/src/plugins/config/configcamerastabilizationwidget.h +++ b/ground/openpilotgcs/src/plugins/config/configcamerastabilizationwidget.h @@ -1,8 +1,8 @@ /** ****************************************************************************** * - * @file configahrstwidget.h - * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. + * @file configcamerastabilizationtwidget.h + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2011. * @addtogroup GCSPlugins GCS Plugins * @{ * @addtogroup ConfigPlugin Config Plugin @@ -32,13 +32,6 @@ #include "extensionsystem/pluginmanager.h" #include "uavobjectmanager.h" #include "uavobject.h" -#include -#include -#include -#include -#include -#include - #include "camerastabsettings.h" class ConfigCameraStabilizationWidget: public ConfigTaskWidget @@ -50,12 +43,13 @@ public: ~ConfigCameraStabilizationWidget(); private: - virtual void enableControls(bool enable); - Ui_CameraStabilizationWidget *m_camerastabilization; + virtual void enableControls(bool enable); + void refreshUIValues(CameraStabSettings::DataFields &cameraStabData); private slots: void openHelp(); + void resetToDefaults(); void applySettings(); void saveSettings(); void refreshValues(); @@ -65,4 +59,4 @@ protected: void disconnectUpdates(); }; -#endif // ConfigCameraStabilization_H +#endif // CONFIGCAMERASTABILIZATIONWIDGET_H From f62330fefe9da44d446d77d7d11fa56fa03b5143 Mon Sep 17 00:00:00 2001 From: Oleg Semyonov Date: Mon, 2 Jan 2012 04:29:56 +0200 Subject: [PATCH 074/121] CameraStab: add tooltips to all configuration settings --- .../src/plugins/config/camerastabilization.ui | 103 ++++++++++++++++++ 1 file changed, 103 insertions(+) diff --git a/ground/openpilotgcs/src/plugins/config/camerastabilization.ui b/ground/openpilotgcs/src/plugins/config/camerastabilization.ui index 184aebda1..dccdc3cf2 100644 --- a/ground/openpilotgcs/src/plugins/config/camerastabilization.ui +++ b/ground/openpilotgcs/src/plugins/config/camerastabilization.ui @@ -89,6 +89,12 @@ + + Camera yaw angle for 100% output value, deg. + +This value should be tuned for particular gimbal and servo. You also +have to define channel output range using Output configuration tab. + 180 @@ -99,6 +105,12 @@ + + Camera pitch angle for 100% output value, deg. + +This value should be tuned for particular gimbal and servo. You also +have to define channel output range using Output configuration tab. + 180 @@ -109,6 +121,12 @@ + + Camera roll angle for 100% output value, deg. + +This value should be tuned for particular gimbal and servo. You also +have to define channel output range using Output configuration tab. + 180 @@ -119,6 +137,9 @@ + + Yaw output channel for camera gimbal + None @@ -128,6 +149,9 @@ + + Pitch output channel for camera gimbal + None @@ -137,6 +161,9 @@ + + Roll output channel for camera gimbal + None @@ -257,6 +284,11 @@ + + Input channel to control camera yaw + +Don't forget to map this channel using Input configuration tab. + None @@ -266,6 +298,11 @@ + + Input channel to control camera pitch + +Don't forget to map this channel using Input configuration tab. + None @@ -275,6 +312,11 @@ + + Input channel to control camera roll + +Don't forget to map this channel using Input configuration tab. + None @@ -291,6 +333,12 @@ + + Axis stabilization mode + +Attitude: camera tracks level for the axis. Input controls the deflection. +AxisLock: camera remembers tracking attitude. Input controls the rate of deflection. + Attitude @@ -300,6 +348,9 @@ + + Maximum camera yaw deflection for 100% input in Attitude mode, deg. + 180 @@ -310,6 +361,9 @@ + + Maximum camera yaw rate for 100% input in AxisLock mode, deg/s. + 180 @@ -320,6 +374,11 @@ + + Input low-pass filter response time for yaw axis, ms. + +This option smoothes the stick input. Zero value disables LPF. + 1000 @@ -330,6 +389,12 @@ + + Axis stabilization mode + +Attitude: camera tracks level for the axis. Input controls the deflection. +AxisLock: camera remembers tracking attitude. Input controls the rate of deflection. + Attitude @@ -339,6 +404,9 @@ + + Maximum camera pitch deflection for 100% input in Attitude mode, deg. + 180 @@ -349,6 +417,9 @@ + + Maximum camera pitch rate for 100% input in AxisLock mode, deg/s. + 180 @@ -359,6 +430,11 @@ + + Input low-pass filter response time for pitch axis, ms. + +This option smoothes the stick input. Zero value disables LPF. + 1000 @@ -369,6 +445,12 @@ + + Axis stabilization mode + +Attitude: camera tracks level for the axis. Input controls the deflection. +AxisLock: camera remembers tracking attitude. Input controls the rate of deflection. + Attitude @@ -378,6 +460,9 @@ + + Maximum camera roll deflection for 100% input in Attitude mode, deg. + 180 @@ -388,6 +473,9 @@ + + Maximum camera roll rate for 100% input in AxisLock mode, deg/s. + 180 @@ -398,6 +486,11 @@ + + Input low-pass filter response time for roll axis, ms. + +This option smoothes the stick input. Zero value disables LPF. + 1000 @@ -450,6 +543,16 @@ + + Stick input deadband for all axes in AxisLock mode, deg/s. + +When stick input is within the MaxAxisLockRate range, camera tracks +current attitude. Otherwise it starts moving according to input with +rate depending on input value. + +If you have drift in your Tx controls, you may want to increase this +value. + 1 From 6e09d61d87e8eb0219a1468258f364b9546f0d36 Mon Sep 17 00:00:00 2001 From: Oleg Semyonov Date: Mon, 2 Jan 2012 04:50:44 +0200 Subject: [PATCH 075/121] CameraStab: fix button tooltips --- .../src/plugins/config/camerastabilization.ui | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/config/camerastabilization.ui b/ground/openpilotgcs/src/plugins/config/camerastabilization.ui index dccdc3cf2..e85d7f5f3 100644 --- a/ground/openpilotgcs/src/plugins/config/camerastabilization.ui +++ b/ground/openpilotgcs/src/plugins/config/camerastabilization.ui @@ -607,6 +607,12 @@ value. + + Load default CameraStabilization settings except output channels + +Loaded settings are not applied automatically. You have to click the +Apply or Save button afterwards. + Reset To Defaults @@ -671,10 +677,7 @@ value. - Save settings to the board (RAM only). - -This does not save the calibration settings, this is done using the -specific calibration button on top of the screen. + Send settings to the board but do not save to the non-volatile memory Apply @@ -684,7 +687,7 @@ specific calibration button on top of the screen. - Send settings to the board, and save to the non-volatile memory. + Send settings to the board and save to the non-volatile memory Save From e9ffa9d03a3d2c1354bcb58143708449eb026b3a Mon Sep 17 00:00:00 2001 From: Oleg Semyonov Date: Mon, 2 Jan 2012 04:55:39 +0200 Subject: [PATCH 076/121] CameraStab: move defaults button to the right --- .../src/plugins/config/camerastabilization.ui | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/config/camerastabilization.ui b/ground/openpilotgcs/src/plugins/config/camerastabilization.ui index e85d7f5f3..fb27f1654 100644 --- a/ground/openpilotgcs/src/plugins/config/camerastabilization.ui +++ b/ground/openpilotgcs/src/plugins/config/camerastabilization.ui @@ -605,19 +605,6 @@ value. - - - - Load default CameraStabilization settings except output channels - -Loaded settings are not applied automatically. You have to click the -Apply or Save button afterwards. - - - Reset To Defaults - - - @@ -674,6 +661,19 @@ Apply or Save button afterwards. + + + + Load default CameraStabilization settings except output channels + +Loaded settings are not applied automatically. You have to click the +Apply or Save button afterwards. + + + Reset To Defaults + + + @@ -727,8 +727,8 @@ Apply or Save button afterwards. pitchResponseTime yawResponseTime MaxAxisLockRate - camerastabilizationResetToDefaults camerastabilizationHelp + camerastabilizationResetToDefaults camerastabilizationSaveRAM camerastabilizationSaveSD scrollArea From a11a65782ce72dc421982b208423cca26c8de47a Mon Sep 17 00:00:00 2001 From: Oleg Semyonov Date: Mon, 2 Jan 2012 14:26:18 +0200 Subject: [PATCH 077/121] CameraStab: remove extra details from HISTORY.txt Since there are tooltips which explain it better and more correctly. --- HISTORY.txt | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/HISTORY.txt b/HISTORY.txt index 4ef00b1af..9640c6e1f 100644 --- a/HISTORY.txt +++ b/HISTORY.txt @@ -1,13 +1,7 @@ Short summary of changes. For a complete list see the git log. -2011-12-19 +2012-01-02 Added new camera stabilization features: AxisLock mode and LPF. -New options: - StabilizationMode: Attitude (default) or AxisLock. - InputRate: 50deg/s by default. Changes stick sensitivity in AxisLock mode. - MaxAxisLockRate: 1deg/s by default. The same meaning as similar option - for AxisLock stabilization. - ResponseTime: 150ms by default. Zero value disables LPF. 2011-12-10 Merged a change that sorts the UAVO fields based on size. Because this changes From a2b067e4d5d5145c17817c8d77a1a968f1065bfa Mon Sep 17 00:00:00 2001 From: James Cotton Date: Mon, 2 Jan 2012 09:19:50 -0600 Subject: [PATCH 078/121] Fix GUI bug for the GCS controller --- .../src/plugins/gcscontrol/gcscontrol.ui | 66 ++++++++++--------- .../gcscontrol/gcscontrolgadgetwidget.cpp | 1 - 2 files changed, 34 insertions(+), 33 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/gcscontrol/gcscontrol.ui b/ground/openpilotgcs/src/plugins/gcscontrol/gcscontrol.ui index f48029e47..024db71bb 100644 --- a/ground/openpilotgcs/src/plugins/gcscontrol/gcscontrol.ui +++ b/ground/openpilotgcs/src/plugins/gcscontrol/gcscontrol.ui @@ -20,7 +20,7 @@ Form - background:transparent + @@ -30,42 +30,41 @@ 5 - + + + + - - - - - GCS Control - - - - - - - Armed - - - - - - - Flight Mode: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - + + + GCS Control + + + + + + + Armed + + + + + + + Flight Mode: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + - + 10 @@ -121,6 +120,9 @@ 100 + + background:transparent + diff --git a/ground/openpilotgcs/src/plugins/gcscontrol/gcscontrolgadgetwidget.cpp b/ground/openpilotgcs/src/plugins/gcscontrol/gcscontrolgadgetwidget.cpp index d266ec18b..68f0162f5 100644 --- a/ground/openpilotgcs/src/plugins/gcscontrol/gcscontrolgadgetwidget.cpp +++ b/ground/openpilotgcs/src/plugins/gcscontrol/gcscontrolgadgetwidget.cpp @@ -67,7 +67,6 @@ GCSControlGadgetWidget::GCSControlGadgetWidget(QWidget *parent) : QLabel(parent) // Connect object updated event from UAVObject to also update check boxes and dropdown connect(obj, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(mccChanged(UAVObject*))); - leftX = 0; leftY = 0; rightX = 0; From 7f03195abab523f9dd9e2db511965e41f4243e47 Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Mon, 2 Jan 2012 14:04:30 -0500 Subject: [PATCH 079/121] stm32 usb: allow descriptor data to be const through API This allows a few more data structures to be const to save some RAM. --- .../Libraries/STM32_USB-FS-Device_Driver/inc/usb_core.h | 2 +- .../Libraries/STM32_USB-FS-Device_Driver/src/usb_core.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/flight/PiOS/STM32F10x/Libraries/STM32_USB-FS-Device_Driver/inc/usb_core.h b/flight/PiOS/STM32F10x/Libraries/STM32_USB-FS-Device_Driver/inc/usb_core.h index bd777f000..84f975da6 100644 --- a/flight/PiOS/STM32F10x/Libraries/STM32_USB-FS-Device_Driver/inc/usb_core.h +++ b/flight/PiOS/STM32F10x/Libraries/STM32_USB-FS-Device_Driver/inc/usb_core.h @@ -225,7 +225,7 @@ uint8_t *Standard_GetConfiguration(uint16_t Length); RESULT Standard_SetConfiguration(void); uint8_t *Standard_GetInterface(uint16_t Length); RESULT Standard_SetInterface(void); -uint8_t *Standard_GetDescriptorData(uint16_t Length, PONE_DESCRIPTOR pDesc); +uint8_t *Standard_GetDescriptorData(uint16_t Length, const ONE_DESCRIPTOR * pDesc); uint8_t *Standard_GetStatus(uint16_t Length); RESULT Standard_ClearFeature(void); diff --git a/flight/PiOS/STM32F10x/Libraries/STM32_USB-FS-Device_Driver/src/usb_core.c b/flight/PiOS/STM32F10x/Libraries/STM32_USB-FS-Device_Driver/src/usb_core.c index 8cdd749f5..fb5ca3e40 100644 --- a/flight/PiOS/STM32F10x/Libraries/STM32_USB-FS-Device_Driver/src/usb_core.c +++ b/flight/PiOS/STM32F10x/Libraries/STM32_USB-FS-Device_Driver/src/usb_core.c @@ -415,7 +415,7 @@ RESULT Standard_SetDeviceFeature(void) * wOffset The buffer pointed by this address contains at least * Length bytes. *******************************************************************************/ -uint8_t *Standard_GetDescriptorData(uint16_t Length, ONE_DESCRIPTOR *pDesc) +uint8_t *Standard_GetDescriptorData(uint16_t Length, const ONE_DESCRIPTOR * pDesc) { uint32_t wOffset; From b94f4b49a408099b9ad59de43546f59d13a2d4eb Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Mon, 2 Jan 2012 14:03:15 -0500 Subject: [PATCH 080/121] usb: major refactoring of USB descriptors, CDC and HID Summary of changes: * USB CDC and HID drivers are completely split apart. * This will allow different max buffer sizes for HID and CDC. * USB descriptors have been overhauled: * Proper structs/macros/enums declared for USB (see pios_usb_defs.h) * Two common descriptor definitions. One for HID+CDC another for HID only. See pios_usb_desc_{hid_cdc,hid_only}.c for details. * Long standing bugs in OP USB descriptors became much more obvious with the new struct definitions. * Board specific USB initialization is now in pios_usb_board_data.h in each build target. * Definition of USB descriptors is now entirely indpendent of STM32 libs. Glue into STM32 libs is provided by pios_usbhook.c. * Removed a lot of stale/irrelevant USB #defines throughout the tree. * Improved naming consistency throughout USB code: * PIOS_USB_HID_* now refers to the HID endpoint code. * PIOS_USB_CDC_* now refers to the CDC endpoint code. * PIOS_USB_* now refers to the low-level USB code. * PIOS_USB_BOARD_* now refers to board-specific USB data * PIOS_USBHOOK_* is glue between PIOS and STM32 USB libs. * struct usb_* and enum usb_* and USB_* and HID_* are all types from the USB spec. * Shrunk the buffer size on the CDC call mgmt endpoint to save some RAM. * Made a few more USB related variables static to save some RAM. --- flight/Bootloaders/CopterControl/Makefile | 5 +- .../CopterControl/inc/pios_config.h | 3 +- .../Bootloaders/CopterControl/inc/pios_usb.h | 84 --- .../CopterControl/inc/pios_usb_board_data.h | 48 ++ flight/Bootloaders/CopterControl/pios_board.c | 30 +- .../CopterControl/pios_usb_board_data.c | 20 + flight/Bootloaders/OpenPilot/Makefile | 5 +- .../Bootloaders/OpenPilot/inc/pios_config.h | 3 +- flight/Bootloaders/OpenPilot/inc/pios_usb.h | 84 --- .../OpenPilot/inc/pios_usb_board_data.h | 48 ++ flight/Bootloaders/OpenPilot/pios_board.c | 32 +- .../OpenPilot/pios_usb_board_data.c | 15 + flight/Bootloaders/PipXtreme/Makefile | 5 +- .../Bootloaders/PipXtreme/inc/pios_config.h | 3 +- flight/Bootloaders/PipXtreme/inc/pios_usb.h | 84 --- .../PipXtreme/inc/pios_usb_board_data.h | 48 ++ flight/Bootloaders/PipXtreme/pios_board.c | 26 +- .../PipXtreme/pios_usb_board_data.c | 16 + flight/CopterControl/Makefile | 6 +- flight/CopterControl/System/inc/pios_config.h | 4 +- flight/CopterControl/System/inc/pios_usb.h | 84 --- .../System/inc/pios_usb_board_data.h | 52 ++ .../System/inc/pios_usb_hid_desc.h | 56 -- flight/CopterControl/System/pios_board.c | 52 +- .../System/pios_usb_board_data.c | 20 + .../CopterControl/System/pios_usb_hid_desc.c | 318 --------- flight/Modules/Telemetry/telemetry.c | 13 +- flight/OpenPilot/Makefile | 6 +- flight/OpenPilot/System/inc/pios_config.h | 2 +- .../System/inc/pios_usb_board_data.h | 52 ++ flight/OpenPilot/System/pios_board.c | 34 +- flight/OpenPilot/System/pios_usb_board_data.c | 15 + flight/PiOS/Boards/STM32103CB_CC_Rev1.h | 3 +- .../PiOS/Boards/STM32103CB_PIPXTREME_Rev1.h | 2 +- flight/PiOS/Boards/STM3210E_OP.h | 2 +- flight/PiOS/Common/pios_usb_desc_hid_cdc.c | 247 +++++++ flight/PiOS/Common/pios_usb_desc_hid_only.c | 165 +++++ flight/PiOS/STM32F10x/pios_usb.c | 225 +++++++ flight/PiOS/STM32F10x/pios_usb_cdc.c | 400 ++++++++++++ flight/PiOS/STM32F10x/pios_usb_com.c | 606 ------------------ flight/PiOS/STM32F10x/pios_usb_hid.c | 417 +++++++----- flight/PiOS/STM32F10x/pios_usb_hid_desc.c | 183 ------ flight/PiOS/STM32F10x/pios_usbhook.c | 129 ++-- flight/PiOS/inc/pios_usb.h | 51 +- ...ios_usb_com_priv.h => pios_usb_cdc_priv.h} | 30 +- flight/PiOS/inc/pios_usb_defs.h | 292 +++++++++ flight/PiOS/inc/pios_usb_hid.h | 12 - flight/PiOS/inc/pios_usb_hid_desc.h | 56 -- flight/PiOS/inc/pios_usb_hid_priv.h | 22 +- flight/PiOS/inc/pios_usb_priv.h | 49 ++ flight/PiOS/inc/pios_usbhook.h | 25 - flight/PiOS/inc/usb_conf.h | 5 - flight/PipXtreme/Makefile | 10 +- flight/PipXtreme/api_config.c | 5 +- flight/PipXtreme/inc/pios_config.h | 2 +- flight/PipXtreme/inc/pios_usb.h | 78 --- flight/PipXtreme/inc/pios_usb_board_data.h | 40 ++ flight/PipXtreme/inc/usb_conf.h | 196 ------ flight/PipXtreme/pios_board.c | 32 +- flight/PipXtreme/pios_usb_board_data.c | 16 + flight/PipXtreme/transparent_comms.c | 5 +- 61 files changed, 2273 insertions(+), 2305 deletions(-) delete mode 100644 flight/Bootloaders/CopterControl/inc/pios_usb.h create mode 100644 flight/Bootloaders/CopterControl/inc/pios_usb_board_data.h create mode 100644 flight/Bootloaders/CopterControl/pios_usb_board_data.c delete mode 100644 flight/Bootloaders/OpenPilot/inc/pios_usb.h create mode 100644 flight/Bootloaders/OpenPilot/inc/pios_usb_board_data.h create mode 100644 flight/Bootloaders/OpenPilot/pios_usb_board_data.c delete mode 100644 flight/Bootloaders/PipXtreme/inc/pios_usb.h create mode 100644 flight/Bootloaders/PipXtreme/inc/pios_usb_board_data.h create mode 100644 flight/Bootloaders/PipXtreme/pios_usb_board_data.c delete mode 100644 flight/CopterControl/System/inc/pios_usb.h create mode 100644 flight/CopterControl/System/inc/pios_usb_board_data.h delete mode 100644 flight/CopterControl/System/inc/pios_usb_hid_desc.h create mode 100644 flight/CopterControl/System/pios_usb_board_data.c delete mode 100644 flight/CopterControl/System/pios_usb_hid_desc.c create mode 100644 flight/OpenPilot/System/inc/pios_usb_board_data.h create mode 100644 flight/OpenPilot/System/pios_usb_board_data.c create mode 100644 flight/PiOS/Common/pios_usb_desc_hid_cdc.c create mode 100644 flight/PiOS/Common/pios_usb_desc_hid_only.c create mode 100644 flight/PiOS/STM32F10x/pios_usb.c create mode 100644 flight/PiOS/STM32F10x/pios_usb_cdc.c delete mode 100644 flight/PiOS/STM32F10x/pios_usb_com.c delete mode 100644 flight/PiOS/STM32F10x/pios_usb_hid_desc.c rename flight/PiOS/inc/{pios_usb_com_priv.h => pios_usb_cdc_priv.h} (67%) create mode 100644 flight/PiOS/inc/pios_usb_defs.h delete mode 100644 flight/PiOS/inc/pios_usb_hid_desc.h create mode 100644 flight/PiOS/inc/pios_usb_priv.h delete mode 100644 flight/PipXtreme/inc/pios_usb.h create mode 100644 flight/PipXtreme/inc/pios_usb_board_data.h delete mode 100644 flight/PipXtreme/inc/usb_conf.h create mode 100644 flight/PipXtreme/pios_usb_board_data.c diff --git a/flight/Bootloaders/CopterControl/Makefile b/flight/Bootloaders/CopterControl/Makefile index 07c13b190..1257ed579 100644 --- a/flight/Bootloaders/CopterControl/Makefile +++ b/flight/Bootloaders/CopterControl/Makefile @@ -106,12 +106,13 @@ SRC += $(PIOSSTM32F10X)/pios_gpio.c # PIOS USB related files (seperated to make code maintenance more easy) +SRC += $(PIOSSTM32F10X)/pios_usb.c SRC += $(PIOSSTM32F10X)/pios_usbhook.c SRC += $(PIOSSTM32F10X)/pios_usb_hid.c -SRC += $(PIOSSTM32F10X)/pios_usb_hid_desc.c SRC += $(PIOSSTM32F10X)/pios_usb_hid_istr.c SRC += $(PIOSSTM32F10X)/pios_usb_hid_pwr.c -SRC += $(PIOSSTM32F10X)/pios_usb_com.c +SRC += $(OPSYSTEM)/pios_usb_board_data.c +SRC += $(PIOSCOMMON)/pios_usb_desc_hid_only.c ## PIOS Hardware (Common) SRC += $(PIOSCOMMON)/pios_board_info.c diff --git a/flight/Bootloaders/CopterControl/inc/pios_config.h b/flight/Bootloaders/CopterControl/inc/pios_config.h index 5c25f2aa5..081ed1b0f 100644 --- a/flight/Bootloaders/CopterControl/inc/pios_config.h +++ b/flight/Bootloaders/CopterControl/inc/pios_config.h @@ -32,14 +32,13 @@ #define PIOS_CONFIG_H #define PIOS_INCLUDE_BL_HELPER #define PIOS_INCLUDE_BL_HELPER_WRITE_SUPPORT -#define USB_HID /* Enable/Disable PiOS Modules */ #define PIOS_INCLUDE_DELAY #define PIOS_INCLUDE_IRQ #define PIOS_INCLUDE_LED #define PIOS_INCLUDE_SYS +#define PIOS_INCLUDE_USB #define PIOS_INCLUDE_USB_HID -#define PIOS_INCLUDE_USB_COM #define PIOS_INCLUDE_COM #define PIOS_INCLUDE_GPIO #define PIOS_NO_GPS diff --git a/flight/Bootloaders/CopterControl/inc/pios_usb.h b/flight/Bootloaders/CopterControl/inc/pios_usb.h deleted file mode 100644 index f81bb3294..000000000 --- a/flight/Bootloaders/CopterControl/inc/pios_usb.h +++ /dev/null @@ -1,84 +0,0 @@ -/** - ****************************************************************************** - * @addtogroup PIOS PIOS Core hardware abstraction layer - * @{ - * @addtogroup PIOS_USB USB Functions - * @brief PIOS USB interface code - * @{ - * - * @file pios_usb.h - * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. - * Parts by Thorsten Klose (tk@midibox.org) - * @brief USB functions header. - * @see The GNU Public License (GPL) Version 3 - * - *****************************************************************************/ -/* - * 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 - */ - -#ifndef PIOS_USB_H -#define PIOS_USB_H - -/* Local defines */ -/* Following settings allow to customise the USB device descriptor */ -#ifndef PIOS_USB_VENDOR_ID -#define PIOS_USB_VENDOR_ID 0x20A0 -#endif - -#ifndef PIOS_USB_VENDOR_STR -#define PIOS_USB_VENDOR_STR "openpilot.org" -#endif - -#ifndef PIOS_USB_PRODUCT_STR -#define PIOS_USB_PRODUCT_STR "CopterControl" -#endif - -#ifndef PIOS_USB_PRODUCT_ID -#define PIOS_USB_PRODUCT_ID 0x415B -#endif - -#ifndef PIOS_USB_VERSION_ID -#define PIOS_USB_VERSION_ID 0x0401 /* CopterControl (04) Bootloader (01) */ -#endif - -/* Internal defines which are used by PIOS USB HID (don't touch) */ - -/* Buffer table base address */ -#define PIOS_USB_BTABLE_ADDRESS 0x000 - -/* EP0 rx/tx buffer base address */ -#define PIOS_USB_ENDP0_RXADDR 0x040 -#define PIOS_USB_ENDP0_TXADDR 0x080 - -/* EP1 Rx/Tx buffer base address for HID driver */ -#define PIOS_USB_ENDP1_TXADDR 0x0C0 -#define PIOS_USB_ENDP1_RXADDR 0x100 - -/* Global Variables */ -extern void (*pEpInt_IN[7])(void); -extern void (*pEpInt_OUT[7])(void); - -/* Public Functions */ -extern int32_t PIOS_USB_Init(uint32_t mode); -extern int32_t PIOS_USB_IsInitialized(void); -extern int32_t PIOS_USB_CableConnected(void); - -#endif /* PIOS_USB_H */ - -/** - * @} - * @} - */ diff --git a/flight/Bootloaders/CopterControl/inc/pios_usb_board_data.h b/flight/Bootloaders/CopterControl/inc/pios_usb_board_data.h new file mode 100644 index 000000000..14fdd6cfb --- /dev/null +++ b/flight/Bootloaders/CopterControl/inc/pios_usb_board_data.h @@ -0,0 +1,48 @@ +#ifndef PIOS_USB_BOARD_DATA_H +#define PIOS_USB_BOARD_DATA_H + +#define PIOS_USB_BOARD_HID_DATA_LENGTH 64 + +#define PIOS_USB_BOARD_EP_NUM 2 + +#include "pios_usb_defs.h" /* struct usb_* */ + +struct usb_board_config { + struct usb_configuration_desc config; + struct usb_interface_desc hid_if; + struct usb_hid_desc hid; + struct usb_endpoint_desc hid_in; + struct usb_endpoint_desc hid_out; +} __attribute__((packed)); + +extern const struct usb_device_desc PIOS_USB_BOARD_DeviceDescriptor; +extern const struct usb_board_config PIOS_USB_BOARD_Configuration; +extern const struct usb_string_langid PIOS_USB_BOARD_StringLangID; + +/* NOTE NOTE NOTE + * + * Care must be taken to ensure that the _actual_ contents of + * these arrays (in each board's pios_usb_board_data.c) is no + * smaller than the stated sizes here or these descriptors + * will end up with trailing zeros on the wire. + * + * The compiler will catch any time that these definitions are + * too small. + */ +extern const uint8_t PIOS_USB_BOARD_HidReportDescriptor[36]; +extern const uint8_t PIOS_USB_BOARD_StringVendorID[28]; +extern const uint8_t PIOS_USB_BOARD_StringProductID[28]; +extern uint8_t PIOS_USB_BOARD_StringSerial[52]; + +#define PIOS_USB_BOARD_PRODUCT_ID USB_PRODUCT_ID_COPTERCONTROL +#define PIOS_USB_BOARD_DEVICE_VER USB_OP_DEVICE_VER(USB_OP_BOARD_ID_COPTERCONTROL, USB_OP_BOARD_MODE_BL) + +/* + * The bootloader uses a simplified report structure + * BL: ... + * FW: ... + * This define changes the behaviour in pios_usb_hid.c + */ +#define PIOS_USB_BOARD_BL_HID_HAS_NO_LENGTH_BYTE + +#endif /* PIOS_USB_BOARD_DATA_H */ diff --git a/flight/Bootloaders/CopterControl/pios_board.c b/flight/Bootloaders/CopterControl/pios_board.c index e017e8282..1b3c54af3 100644 --- a/flight/Bootloaders/CopterControl/pios_board.c +++ b/flight/Bootloaders/CopterControl/pios_board.c @@ -41,8 +41,8 @@ static uint8_t pios_com_telem_usb_tx_buffer[PIOS_COM_TELEM_USB_TX_BUF_LEN]; // *********************************************************************************** -#if defined(PIOS_INCLUDE_USB_HID) -#include "pios_usb_hid_priv.h" +#if defined(PIOS_INCLUDE_USB) +#include "pios_usb_priv.h" static const struct pios_usb_cfg pios_usb_main_cfg = { .irq = { @@ -54,19 +54,18 @@ static const struct pios_usb_cfg pios_usb_main_cfg = { }, }, }; -#endif /* PIOS_INCLUDE_USB_HID */ +#endif /* PIOS_INCLUDE_USB */ -#if defined(PIOS_INCLUDE_USB_COM) -#include +#if defined(PIOS_INCLUDE_USB_HID) +#include -const struct pios_usb_com_cfg pios_usb_com_hid_cfg = { - .type = PIOS_USB_COM_HID, +const struct pios_usb_hid_cfg pios_usb_hid_cfg = { .data_if = 0, .data_rx_ep = 1, .data_tx_ep = 1, }; -#endif /* PIOS_INCLUDE_USB_COM */ +#endif /* PIOS_INCLUDE_USB_HID */ uint32_t pios_com_telem_usb_id; @@ -93,23 +92,24 @@ void PIOS_Board_Init(void) { /* Initialize the PiOS library */ PIOS_GPIO_Init(); -#if defined(PIOS_INCLUDE_USB_HID) +#if defined(PIOS_INCLUDE_USB) uint32_t pios_usb_id; if (PIOS_USB_Init(&pios_usb_id, &pios_usb_main_cfg)) { PIOS_Assert(0); } -#if defined(PIOS_INCLUDE_COM) - uint32_t pios_usb_com_id; - if (PIOS_USB_COM_Init(&pios_usb_com_id, &pios_usb_com_hid_cfg, pios_usb_id)) { +#if defined(PIOS_INCLUDE_USB_HID) && defined(PIOS_INCLUDE_COM) + uint32_t pios_usb_hid_id; + if (PIOS_USB_HID_Init(&pios_usb_hid_id, &pios_usb_hid_cfg, pios_usb_id)) { PIOS_Assert(0); } - if (PIOS_COM_Init(&pios_com_telem_usb_id, &pios_usb_hid_com_driver, pios_usb_com_id, + if (PIOS_COM_Init(&pios_com_telem_usb_id, &pios_usb_hid_com_driver, pios_usb_hid_id, pios_com_telem_usb_rx_buffer, sizeof(pios_com_telem_usb_rx_buffer), pios_com_telem_usb_tx_buffer, sizeof(pios_com_telem_usb_tx_buffer))) { PIOS_Assert(0); } -#endif /* PIOS_INCLUDE_COM */ -#endif /* PIOS_INCLUDE_USB_HID */ +#endif /* PIOS_INCLUDE_USB_HID && PIOS_INCLUDE_COM */ + +#endif /* PIOS_INCLUDE_USB */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE);//TODO Tirar diff --git a/flight/Bootloaders/CopterControl/pios_usb_board_data.c b/flight/Bootloaders/CopterControl/pios_usb_board_data.c new file mode 100644 index 000000000..68761609a --- /dev/null +++ b/flight/Bootloaders/CopterControl/pios_usb_board_data.c @@ -0,0 +1,20 @@ +#include "pios_usb_board_data.h" /* struct usb_*, USB_* */ + +const uint8_t PIOS_USB_BOARD_StringProductID[] = { + sizeof(PIOS_USB_BOARD_StringProductID), + USB_DESC_TYPE_STRING, + 'C', 0, + 'o', 0, + 'p', 0, + 't', 0, + 'e', 0, + 'r', 0, + 'C', 0, + 'o', 0, + 'n', 0, + 't', 0, + 'r', 0, + 'o', 0, + 'l', 0, +}; + diff --git a/flight/Bootloaders/OpenPilot/Makefile b/flight/Bootloaders/OpenPilot/Makefile index c172387f7..e9b55e134 100644 --- a/flight/Bootloaders/OpenPilot/Makefile +++ b/flight/Bootloaders/OpenPilot/Makefile @@ -109,12 +109,13 @@ SRC += $(PIOSSTM32F10X)/pios_debug.c SRC += $(PIOSSTM32F10X)/pios_gpio.c # PIOS USB related files (seperated to make code maintenance more easy) +SRC += $(PIOSSTM32F10X)/pios_usb.c SRC += $(PIOSSTM32F10X)/pios_usbhook.c SRC += $(PIOSSTM32F10X)/pios_usb_hid.c -SRC += $(PIOSSTM32F10X)/pios_usb_hid_desc.c SRC += $(PIOSSTM32F10X)/pios_usb_hid_istr.c SRC += $(PIOSSTM32F10X)/pios_usb_hid_pwr.c -SRC += $(PIOSSTM32F10X)/pios_usb_com.c +SRC += $(OPSYSTEM)/pios_usb_board_data.c +SRC += $(PIOSCOMMON)/pios_usb_desc_hid_only.c ## PIOS Hardware (Common) SRC += $(PIOSCOMMON)/pios_board_info.c diff --git a/flight/Bootloaders/OpenPilot/inc/pios_config.h b/flight/Bootloaders/OpenPilot/inc/pios_config.h index 3268ca3ca..024bcae9a 100644 --- a/flight/Bootloaders/OpenPilot/inc/pios_config.h +++ b/flight/Bootloaders/OpenPilot/inc/pios_config.h @@ -31,7 +31,6 @@ #define PIOS_CONFIG_H #define PIOS_INCLUDE_BL_HELPER #define PIOS_INCLUDE_BL_HELPER_WRITE_SUPPORT -#define USB_HID /* Enable/Disable PiOS Modules */ #define PIOS_INCLUDE_DELAY #define PIOS_INCLUDE_IRQ @@ -39,8 +38,8 @@ #define PIOS_INCLUDE_SPI #define PIOS_INCLUDE_SYS #define PIOS_INCLUDE_USART +#define PIOS_INCLUDE_USB #define PIOS_INCLUDE_USB_HID -#define PIOS_INCLUDE_USB_COM #define PIOS_INCLUDE_OPAHRS #define PIOS_INCLUDE_COM #define PIOS_INCLUDE_GPIO diff --git a/flight/Bootloaders/OpenPilot/inc/pios_usb.h b/flight/Bootloaders/OpenPilot/inc/pios_usb.h deleted file mode 100644 index 708e18578..000000000 --- a/flight/Bootloaders/OpenPilot/inc/pios_usb.h +++ /dev/null @@ -1,84 +0,0 @@ -/** - ****************************************************************************** - * @addtogroup PIOS PIOS Core hardware abstraction layer - * @{ - * @addtogroup PIOS_USB USB Functions - * @brief PIOS USB interface code - * @{ - * - * @file pios_usb.h - * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. - * Parts by Thorsten Klose (tk@midibox.org) - * @brief USB functions header. - * @see The GNU Public License (GPL) Version 3 - * - *****************************************************************************/ -/* - * 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 - */ - -#ifndef PIOS_USB_H -#define PIOS_USB_H - -/* Local defines */ -/* Following settings allow to customise the USB device descriptor */ -#ifndef PIOS_USB_VENDOR_ID -#define PIOS_USB_VENDOR_ID 0x20A0 -#endif - -#ifndef PIOS_USB_VENDOR_STR -#define PIOS_USB_VENDOR_STR "openpilot.org" -#endif - -#ifndef PIOS_USB_PRODUCT_STR -#define PIOS_USB_PRODUCT_STR "OpenPilot" -#endif - -#ifndef PIOS_USB_PRODUCT_ID -#define PIOS_USB_PRODUCT_ID 0x415A -#endif - -#ifndef PIOS_USB_VERSION_ID -#define PIOS_USB_VERSION_ID 0x0101 /* OpenPilot (01) Bootloader (01) */ -#endif - -/* Internal defines which are used by PIOS USB HID (don't touch) */ - -/* Buffer table base address */ -#define PIOS_USB_BTABLE_ADDRESS 0x000 - -/* EP0 rx/tx buffer base address */ -#define PIOS_USB_ENDP0_RXADDR 0x040 -#define PIOS_USB_ENDP0_TXADDR 0x080 - -/* EP1 Rx/Tx buffer base address for HID driver */ -#define PIOS_USB_ENDP1_TXADDR 0x0C0 -#define PIOS_USB_ENDP1_RXADDR 0x100 - -/* Global Variables */ -extern void (*pEpInt_IN[7])(void); -extern void (*pEpInt_OUT[7])(void); - -/* Public Functions */ -extern int32_t PIOS_USB_Init(uint32_t mode); -extern int32_t PIOS_USB_IsInitialized(void); -extern int32_t PIOS_USB_CableConnected(void); - -#endif /* PIOS_USB_H */ - -/** - * @} - * @} - */ diff --git a/flight/Bootloaders/OpenPilot/inc/pios_usb_board_data.h b/flight/Bootloaders/OpenPilot/inc/pios_usb_board_data.h new file mode 100644 index 000000000..612c85ff4 --- /dev/null +++ b/flight/Bootloaders/OpenPilot/inc/pios_usb_board_data.h @@ -0,0 +1,48 @@ +#ifndef PIOS_USB_BOARD_DATA_H +#define PIOS_USB_BOARD_DATA_H + +#define PIOS_USB_BOARD_HID_DATA_LENGTH 64 + +#define PIOS_USB_BOARD_EP_NUM 2 + +#include "pios_usb_defs.h" /* struct usb_* */ + +struct usb_board_config { + struct usb_configuration_desc config; + struct usb_interface_desc hid_if; + struct usb_hid_desc hid; + struct usb_endpoint_desc hid_in; + struct usb_endpoint_desc hid_out; +} __attribute__((packed)); + +extern const struct usb_device_desc PIOS_USB_BOARD_DeviceDescriptor; +extern const struct usb_board_config PIOS_USB_BOARD_Configuration; +extern const struct usb_string_langid PIOS_USB_BOARD_StringLangID; + +/* NOTE NOTE NOTE + * + * Care must be taken to ensure that the _actual_ contents of + * these arrays (in each board's pios_usb_board_data.c) is no + * smaller than the stated sizes here or these descriptors + * will end up with trailing zeros on the wire. + * + * The compiler will catch any time that these definitions are + * too small. + */ +extern const uint8_t PIOS_USB_BOARD_HidReportDescriptor[36]; +extern const uint8_t PIOS_USB_BOARD_StringVendorID[28]; +extern const uint8_t PIOS_USB_BOARD_StringProductID[20]; +extern uint8_t PIOS_USB_BOARD_StringSerial[52]; + +#define PIOS_USB_BOARD_PRODUCT_ID USB_PRODUCT_ID_OPENPILOT_MAIN +#define PIOS_USB_BOARD_DEVICE_VER USB_OP_DEVICE_VER(USB_OP_BOARD_ID_OPENPILOT_MAIN, USB_OP_BOARD_MODE_BL) + +/* + * The bootloader uses a simplified report structure + * BL: ... + * FW: ... + * This define changes the behaviour in pios_usb_hid.c + */ +#define PIOS_USB_BOARD_BL_HID_HAS_NO_LENGTH_BYTE + +#endif /* PIOS_USB_BOARD_DATA_H */ diff --git a/flight/Bootloaders/OpenPilot/pios_board.c b/flight/Bootloaders/OpenPilot/pios_board.c index 9e8db4723..a2630815a 100644 --- a/flight/Bootloaders/OpenPilot/pios_board.c +++ b/flight/Bootloaders/OpenPilot/pios_board.c @@ -198,8 +198,8 @@ static uint8_t pios_com_telem_rf_tx_buffer[PIOS_COM_TELEM_RF_TX_BUF_LEN]; #endif /* PIOS_INCLUDE_COM */ -#if defined(PIOS_INCLUDE_USB_HID) -#include "pios_usb_hid_priv.h" +#if defined(PIOS_INCLUDE_USB) +#include "pios_usb_priv.h" static const struct pios_usb_cfg pios_usb_main_cfg = { .irq = { @@ -213,17 +213,16 @@ static const struct pios_usb_cfg pios_usb_main_cfg = { }; #endif /* PIOS_INCLUDE_USB_HID */ -#if defined(PIOS_INCLUDE_USB_COM) -#include +#if defined(PIOS_INCLUDE_USB_HID) +#include -const struct pios_usb_com_cfg pios_usb_com_hid_cfg = { - .type = PIOS_USB_COM_HID, +const struct pios_usb_hid_cfg pios_usb_hid_cfg = { .data_if = 0, .data_rx_ep = 1, .data_tx_ep = 1, }; -#endif /* PIOS_INCLUDE_USB_COM */ +#endif /* PIOS_INCLUDE_USB_HID */ uint32_t pios_com_telem_rf_id; uint32_t pios_com_telem_usb_id; @@ -266,21 +265,24 @@ void PIOS_Board_Init(void) { PIOS_GPIO_Init(); -#if defined(PIOS_INCLUDE_USB_HID) +#if defined(PIOS_INCLUDE_USB) uint32_t pios_usb_id; - PIOS_USB_Init(&pios_usb_id, &pios_usb_main_cfg); -#if defined(PIOS_INCLUDE_COM) - uint32_t pios_usb_com_id; - if (PIOS_USB_COM_Init(&pios_usb_com_id, &pios_usb_com_hid_cfg, pios_usb_id)) { + if (PIOS_USB_Init(&pios_usb_id, &pios_usb_main_cfg)) { PIOS_Assert(0); } - if (PIOS_COM_Init(&pios_com_telem_usb_id, &pios_usb_hid_com_driver, pios_usb_com_id, +#if defined(PIOS_INCLUDE_USB_HID) && defined(PIOS_INCLUDE_COM) + uint32_t pios_usb_hid_id; + if (PIOS_USB_HID_Init(&pios_usb_hid_id, &pios_usb_hid_cfg, pios_usb_id)) { + PIOS_Assert(0); + } + if (PIOS_COM_Init(&pios_com_telem_usb_id, &pios_usb_hid_com_driver, pios_usb_hid_id, pios_com_telem_usb_rx_buffer, sizeof(pios_com_telem_usb_rx_buffer), pios_com_telem_usb_tx_buffer, sizeof(pios_com_telem_usb_tx_buffer))) { PIOS_Assert(0); } -#endif /* PIOS_INCLUDE_COM */ -#endif /* PIOS_INCLUDE_USB_HID */ +#endif /* PIOS_INCLUDE_USB_HID && PIOS_INCLUDE_COM */ + +#endif /* PIOS_INCLUDE_USB */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE);//TODO Tirar diff --git a/flight/Bootloaders/OpenPilot/pios_usb_board_data.c b/flight/Bootloaders/OpenPilot/pios_usb_board_data.c new file mode 100644 index 000000000..c23cc2891 --- /dev/null +++ b/flight/Bootloaders/OpenPilot/pios_usb_board_data.c @@ -0,0 +1,15 @@ +#include "pios_usb_board_data.h" /* struct usb_*, USB_* */ + +const uint8_t PIOS_USB_BOARD_StringProductID[] = { + sizeof(PIOS_USB_BOARD_StringProductID), + USB_DESC_TYPE_STRING, + 'O', 0, + 'p', 0, + 'e', 0, + 'n', 0, + 'P', 0, + 'i', 0, + 'l', 0, + 'o', 0, + 't', 0, +}; diff --git a/flight/Bootloaders/PipXtreme/Makefile b/flight/Bootloaders/PipXtreme/Makefile index 36b4b1568..af6469ae0 100644 --- a/flight/Bootloaders/PipXtreme/Makefile +++ b/flight/Bootloaders/PipXtreme/Makefile @@ -105,12 +105,13 @@ SRC += $(PIOSSTM32F10X)/pios_debug.c SRC += $(PIOSSTM32F10X)/pios_gpio.c # PIOS USB related files (seperated to make code maintenance more easy) +SRC += $(PIOSSTM32F10X)/pios_usb.c SRC += $(PIOSSTM32F10X)/pios_usbhook.c SRC += $(PIOSSTM32F10X)/pios_usb_hid.c -SRC += $(PIOSSTM32F10X)/pios_usb_hid_desc.c SRC += $(PIOSSTM32F10X)/pios_usb_hid_istr.c SRC += $(PIOSSTM32F10X)/pios_usb_hid_pwr.c -SRC += $(PIOSSTM32F10X)/pios_usb_com.c +SRC += $(OPSYSTEM)/pios_usb_board_data.c +SRC += $(PIOSCOMMON)/pios_usb_desc_hid_only.c ## PIOS Hardware (Common) SRC += $(PIOSCOMMON)/pios_board_info.c diff --git a/flight/Bootloaders/PipXtreme/inc/pios_config.h b/flight/Bootloaders/PipXtreme/inc/pios_config.h index 28ab42143..0c2cc7877 100644 --- a/flight/Bootloaders/PipXtreme/inc/pios_config.h +++ b/flight/Bootloaders/PipXtreme/inc/pios_config.h @@ -31,14 +31,13 @@ #define PIOS_CONFIG_H #define PIOS_INCLUDE_BL_HELPER #define PIOS_INCLUDE_BL_HELPER_WRITE_SUPPORT -#define USB_HID /* Enable/Disable PiOS Modules */ #define PIOS_INCLUDE_DELAY #define PIOS_INCLUDE_IRQ #define PIOS_INCLUDE_LED #define PIOS_INCLUDE_SYS +#define PIOS_INCLUDE_USB #define PIOS_INCLUDE_USB_HID -#define PIOS_INCLUDE_USB_COM #define PIOS_INCLUDE_COM #define PIOS_INCLUDE_GPIO //#define DEBUG_SSP diff --git a/flight/Bootloaders/PipXtreme/inc/pios_usb.h b/flight/Bootloaders/PipXtreme/inc/pios_usb.h deleted file mode 100644 index 1b0eb5502..000000000 --- a/flight/Bootloaders/PipXtreme/inc/pios_usb.h +++ /dev/null @@ -1,84 +0,0 @@ -/** - ****************************************************************************** - * @addtogroup PIOS PIOS Core hardware abstraction layer - * @{ - * @addtogroup PIOS_USB USB Functions - * @brief PIOS USB interface code - * @{ - * - * @file pios_usb.h - * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. - * Parts by Thorsten Klose (tk@midibox.org) - * @brief USB functions header. - * @see The GNU Public License (GPL) Version 3 - * - *****************************************************************************/ -/* - * 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 - */ - -#ifndef PIOS_USB_H -#define PIOS_USB_H - -/* Local defines */ -/* Following settings allow to customise the USB device descriptor */ -#ifndef PIOS_USB_VENDOR_ID -#define PIOS_USB_VENDOR_ID 0x20A0 -#endif - -#ifndef PIOS_USB_VENDOR_STR -#define PIOS_USB_VENDOR_STR "openpilot.org" -#endif - -#ifndef PIOS_USB_PRODUCT_STR -#define PIOS_USB_PRODUCT_STR "PipXtreme" -#endif - -#ifndef PIOS_USB_PRODUCT_ID -#define PIOS_USB_PRODUCT_ID 0x415C -#endif - -#ifndef PIOS_USB_VERSION_ID -#define PIOS_USB_VERSION_ID 0x0301 /* PipXtreme (03) Bootloader (01) */ -#endif - -/* Internal defines which are used by PIOS USB HID (don't touch) */ - -/* Buffer table base address */ -#define PIOS_USB_BTABLE_ADDRESS 0x000 - -/* EP0 rx/tx buffer base address */ -#define PIOS_USB_ENDP0_RXADDR 0x040 -#define PIOS_USB_ENDP0_TXADDR 0x080 - -/* EP1 Rx/Tx buffer base address for HID driver */ -#define PIOS_USB_ENDP1_TXADDR 0x0C0 -#define PIOS_USB_ENDP1_RXADDR 0x100 - -/* Global Variables */ -extern void (*pEpInt_IN[7])(void); -extern void (*pEpInt_OUT[7])(void); - -/* Public Functions */ -extern int32_t PIOS_USB_Init(uint32_t mode); -extern int32_t PIOS_USB_IsInitialized(void); -extern int32_t PIOS_USB_CableConnected(void); - -#endif /* PIOS_USB_H */ - -/** - * @} - * @} - */ diff --git a/flight/Bootloaders/PipXtreme/inc/pios_usb_board_data.h b/flight/Bootloaders/PipXtreme/inc/pios_usb_board_data.h new file mode 100644 index 000000000..7fd697d38 --- /dev/null +++ b/flight/Bootloaders/PipXtreme/inc/pios_usb_board_data.h @@ -0,0 +1,48 @@ +#ifndef PIOS_USB_BOARD_DATA_H +#define PIOS_USB_BOARD_DATA_H + +#define PIOS_USB_BOARD_HID_DATA_LENGTH 64 + +#define PIOS_USB_BOARD_EP_NUM 2 + +#include "pios_usb_defs.h" /* struct usb_* */ + +struct usb_board_config { + struct usb_configuration_desc config; + struct usb_interface_desc hid_if; + struct usb_hid_desc hid; + struct usb_endpoint_desc hid_in; + struct usb_endpoint_desc hid_out; +} __attribute__((packed)); + +extern const struct usb_device_desc PIOS_USB_BOARD_DeviceDescriptor; +extern const struct usb_board_config PIOS_USB_BOARD_Configuration; +extern const struct usb_string_langid PIOS_USB_BOARD_StringLangID; + +/* NOTE NOTE NOTE + * + * Care must be taken to ensure that the _actual_ contents of + * these arrays (in each board's pios_usb_board_data.c) is no + * smaller than the stated sizes here or these descriptors + * will end up with trailing zeros on the wire. + * + * The compiler will catch any time that these definitions are + * too small. + */ +extern const uint8_t PIOS_USB_BOARD_HidReportDescriptor[36]; +extern const uint8_t PIOS_USB_BOARD_StringVendorID[28]; +extern const uint8_t PIOS_USB_BOARD_StringProductID[20]; +extern uint8_t PIOS_USB_BOARD_StringSerial[52]; + +#define PIOS_USB_BOARD_PRODUCT_ID USB_PRODUCT_ID_PIPXTREME +#define PIOS_USB_BOARD_DEVICE_VER USB_OP_DEVICE_VER(USB_OP_BOARD_ID_PIPXTREME, USB_OP_BOARD_MODE_BL) + +/* + * The bootloader uses a simplified report structure + * BL: ... + * FW: ... + * This define changes the behaviour in pios_usb_hid.c + */ +#define PIOS_USB_BOARD_BL_HID_HAS_NO_LENGTH_BYTE + +#endif /* PIOS_USB_BOARD_DATA_H */ diff --git a/flight/Bootloaders/PipXtreme/pios_board.c b/flight/Bootloaders/PipXtreme/pios_board.c index e017e8282..abf079340 100644 --- a/flight/Bootloaders/PipXtreme/pios_board.c +++ b/flight/Bootloaders/PipXtreme/pios_board.c @@ -41,8 +41,8 @@ static uint8_t pios_com_telem_usb_tx_buffer[PIOS_COM_TELEM_USB_TX_BUF_LEN]; // *********************************************************************************** -#if defined(PIOS_INCLUDE_USB_HID) -#include "pios_usb_hid_priv.h" +#if defined(PIOS_INCLUDE_USB) +#include "pios_usb_priv.h" static const struct pios_usb_cfg pios_usb_main_cfg = { .irq = { @@ -54,19 +54,19 @@ static const struct pios_usb_cfg pios_usb_main_cfg = { }, }, }; -#endif /* PIOS_INCLUDE_USB_HID */ -#if defined(PIOS_INCLUDE_USB_COM) -#include +#endif /* PIOS_INCLUDE_USB */ -const struct pios_usb_com_cfg pios_usb_com_hid_cfg = { - .type = PIOS_USB_COM_HID, +#if defined(PIOS_INCLUDE_USB_HID) +#include + +const struct pios_usb_hid_cfg pios_usb_hid_cfg = { .data_if = 0, .data_rx_ep = 1, .data_tx_ep = 1, }; -#endif /* PIOS_INCLUDE_USB_COM */ +#endif /* PIOS_INCLUDE_USB_HID */ uint32_t pios_com_telem_usb_id; @@ -93,14 +93,14 @@ void PIOS_Board_Init(void) { /* Initialize the PiOS library */ PIOS_GPIO_Init(); -#if defined(PIOS_INCLUDE_USB_HID) +#if defined(PIOS_INCLUDE_USB) uint32_t pios_usb_id; if (PIOS_USB_Init(&pios_usb_id, &pios_usb_main_cfg)) { PIOS_Assert(0); } -#if defined(PIOS_INCLUDE_COM) +#if defined(PIOS_INCLUDE_USB_HID) && defined(PIOS_INCLUDE_COM) uint32_t pios_usb_com_id; - if (PIOS_USB_COM_Init(&pios_usb_com_id, &pios_usb_com_hid_cfg, pios_usb_id)) { + if (PIOS_USB_HID_Init(&pios_usb_com_id, &pios_usb_hid_cfg, pios_usb_id)) { PIOS_Assert(0); } if (PIOS_COM_Init(&pios_com_telem_usb_id, &pios_usb_hid_com_driver, pios_usb_com_id, @@ -108,8 +108,8 @@ void PIOS_Board_Init(void) { pios_com_telem_usb_tx_buffer, sizeof(pios_com_telem_usb_tx_buffer))) { PIOS_Assert(0); } -#endif /* PIOS_INCLUDE_COM */ -#endif /* PIOS_INCLUDE_USB_HID */ +#endif /* PIOS_INCLUDE_USB_HID && PIOS_INCLUDE_COM */ +#endif /* PIOS_INCLUDE_USB */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE);//TODO Tirar diff --git a/flight/Bootloaders/PipXtreme/pios_usb_board_data.c b/flight/Bootloaders/PipXtreme/pios_usb_board_data.c new file mode 100644 index 000000000..3266e1b45 --- /dev/null +++ b/flight/Bootloaders/PipXtreme/pios_usb_board_data.c @@ -0,0 +1,16 @@ +#include "pios_usb_board_data.h" /* struct usb_*, USB_* */ + +const uint8_t PIOS_USB_BOARD_StringProductID[] = { + sizeof(PIOS_USB_BOARD_StringProductID), + USB_DESC_TYPE_STRING, + 'P', 0, + 'i', 0, + 'p', 0, + 'X', 0, + 't', 0, + 'r', 0, + 'e', 0, + 'm', 0, + 'e', 0, +}; + diff --git a/flight/CopterControl/Makefile b/flight/CopterControl/Makefile index a6136a416..589251a4a 100644 --- a/flight/CopterControl/Makefile +++ b/flight/CopterControl/Makefile @@ -140,7 +140,6 @@ SRC += $(OPSYSTEM)/taskmonitor.c SRC += $(OPUAVTALK)/uavtalk.c SRC += $(OPUAVOBJ)/uavobjectmanager.c SRC += $(OPUAVOBJ)/eventdispatcher.c -SRC += $(OPSYSTEM)/pios_usb_hid_desc.c else ## TESTCODE SRC += $(OPTESTS)/test_common.c @@ -209,11 +208,14 @@ SRC += $(PIOSSTM32F10X)/pios_tim.c # PIOS USB related files (separated to make code maintenance more easy) +SRC += $(PIOSSTM32F10X)/pios_usb.c SRC += $(PIOSSTM32F10X)/pios_usbhook.c SRC += $(PIOSSTM32F10X)/pios_usb_hid.c +SRC += $(PIOSSTM32F10X)/pios_usb_cdc.c SRC += $(PIOSSTM32F10X)/pios_usb_hid_istr.c SRC += $(PIOSSTM32F10X)/pios_usb_hid_pwr.c -SRC += $(PIOSSTM32F10X)/pios_usb_com.c +SRC += $(OPSYSTEM)/pios_usb_board_data.c +SRC += $(PIOSCOMMON)/pios_usb_desc_hid_cdc.c ## PIOS Hardware (Common) SRC += $(PIOSCOMMON)/pios_crc.c diff --git a/flight/CopterControl/System/inc/pios_config.h b/flight/CopterControl/System/inc/pios_config.h index 4e5827149..54c5b3b22 100644 --- a/flight/CopterControl/System/inc/pios_config.h +++ b/flight/CopterControl/System/inc/pios_config.h @@ -61,9 +61,9 @@ #define PIOS_INCLUDE_SPI #define PIOS_INCLUDE_SYS #define PIOS_INCLUDE_USART +#define PIOS_INCLUDE_USB #define PIOS_INCLUDE_USB_HID -#define PIOS_INCLUDE_USB_COM -#define PIOS_INCLUDE_USB_COM_CDC +#define PIOS_INCLUDE_USB_CDC #define PIOS_INCLUDE_COM #define PIOS_INCLUDE_SETTINGS #define PIOS_INCLUDE_FREERTOS diff --git a/flight/CopterControl/System/inc/pios_usb.h b/flight/CopterControl/System/inc/pios_usb.h deleted file mode 100644 index a20803d23..000000000 --- a/flight/CopterControl/System/inc/pios_usb.h +++ /dev/null @@ -1,84 +0,0 @@ -/** - ****************************************************************************** - * @addtogroup PIOS PIOS Core hardware abstraction layer - * @{ - * @addtogroup PIOS_USB USB Functions - * @brief PIOS USB interface code - * @{ - * - * @file pios_usb.h - * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. - * Parts by Thorsten Klose (tk@midibox.org) - * @brief USB functions header. - * @see The GNU Public License (GPL) Version 3 - * - *****************************************************************************/ -/* - * 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 - */ - -#ifndef PIOS_USB_H -#define PIOS_USB_H - -/* Local defines */ -/* Following settings allow to customise the USB device descriptor */ -#ifndef PIOS_USB_VENDOR_ID -#define PIOS_USB_VENDOR_ID 0x20A0 -#endif - -#ifndef PIOS_USB_VENDOR_STR -#define PIOS_USB_VENDOR_STR "openpilot.org" -#endif - -#ifndef PIOS_USB_PRODUCT_STR -#define PIOS_USB_PRODUCT_STR "CopterControl" -#endif - -#ifndef PIOS_USB_PRODUCT_ID -#define PIOS_USB_PRODUCT_ID 0x415B -#endif - -#ifndef PIOS_USB_VERSION_ID -#define PIOS_USB_VERSION_ID 0x0402 /* CopterControl board (04), Running state (02) */ -#endif - -/* Internal defines which are used by PIOS USB HID (don't touch) */ - -/* Buffer table base address */ -#define PIOS_USB_BTABLE_ADDRESS 0x000 - -/* EP0 rx/tx buffer base address */ -#define PIOS_USB_ENDP0_RXADDR 0x040 -#define PIOS_USB_ENDP0_TXADDR 0x080 - -/* EP1 Rx/Tx buffer base address for HID driver */ -#define PIOS_USB_ENDP1_TXADDR 0x0C0 -#define PIOS_USB_ENDP1_RXADDR 0x100 - -/* Global Variables */ -extern void (*pEpInt_IN[7]) (void); -extern void (*pEpInt_OUT[7]) (void); - -/* Public Functions */ -extern int32_t PIOS_USB_Init(uint32_t mode); -extern int32_t PIOS_USB_IsInitialized(void); -extern int32_t PIOS_USB_CableConnected(void); - -#endif /* PIOS_USB_H */ - -/** - * @} - * @} - */ diff --git a/flight/CopterControl/System/inc/pios_usb_board_data.h b/flight/CopterControl/System/inc/pios_usb_board_data.h new file mode 100644 index 000000000..9f175ce10 --- /dev/null +++ b/flight/CopterControl/System/inc/pios_usb_board_data.h @@ -0,0 +1,52 @@ +#ifndef PIOS_USB_BOARD_DATA_H +#define PIOS_USB_BOARD_DATA_H + +#define PIOS_USB_BOARD_CDC_DATA_LENGTH 64 +#define PIOS_USB_BOARD_CDC_MGMT_LENGTH 32 +#define PIOS_USB_BOARD_HID_DATA_LENGTH 64 + +#define PIOS_USB_BOARD_EP_NUM 4 + +#include "pios_usb_defs.h" /* struct usb_* */ + +struct usb_board_config { + struct usb_configuration_desc config; + struct usb_interface_association_desc iad; + struct usb_interface_desc hid_if; + struct usb_hid_desc hid; + struct usb_endpoint_desc hid_in; + struct usb_endpoint_desc hid_out; + struct usb_interface_desc cdc_control_if; + struct usb_cdc_header_func_desc cdc_header; + struct usb_cdc_callmgmt_func_desc cdc_callmgmt; + struct usb_cdc_acm_func_desc cdc_acm; + struct usb_cdc_union_func_desc cdc_union; + struct usb_endpoint_desc cdc_mgmt_in; + struct usb_interface_desc cdc_data_if; + struct usb_endpoint_desc cdc_in; + struct usb_endpoint_desc cdc_out; +} __attribute__((packed)); + +extern const struct usb_device_desc PIOS_USB_BOARD_DeviceDescriptor; +extern const struct usb_board_config PIOS_USB_BOARD_Configuration; +extern const struct usb_string_langid PIOS_USB_BOARD_StringLangID; + +/* NOTE NOTE NOTE + * + * Care must be taken to ensure that the _actual_ contents of + * these arrays (in each board's pios_usb_board_data.c) is no + * smaller than the stated sizes here or these descriptors + * will end up with trailing zeros on the wire. + * + * The compiler will catch any time that these definitions are + * too small. + */ +extern const uint8_t PIOS_USB_BOARD_HidReportDescriptor[36]; +extern const uint8_t PIOS_USB_BOARD_StringVendorID[28]; +extern const uint8_t PIOS_USB_BOARD_StringProductID[28]; +extern uint8_t PIOS_USB_BOARD_StringSerial[52]; + +#define PIOS_USB_BOARD_PRODUCT_ID USB_PRODUCT_ID_COPTERCONTROL +#define PIOS_USB_BOARD_DEVICE_VER USB_OP_DEVICE_VER(USB_OP_BOARD_ID_COPTERCONTROL, USB_OP_BOARD_MODE_FW) + +#endif /* PIOS_USB_BOARD_DATA_H */ diff --git a/flight/CopterControl/System/inc/pios_usb_hid_desc.h b/flight/CopterControl/System/inc/pios_usb_hid_desc.h deleted file mode 100644 index d6bc3720f..000000000 --- a/flight/CopterControl/System/inc/pios_usb_hid_desc.h +++ /dev/null @@ -1,56 +0,0 @@ -/******************** (C) COPYRIGHT 2010 STMicroelectronics ******************** -* File Name : usb_desc.h -* Author : MCD Application Team -* Version : V3.2.1 -* Date : 07/05/2010 -* Description : Descriptor Header for Custom HID Demo -******************************************************************************** -* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_DESC_H -#define __USB_DESC_H - -/* Includes ------------------------------------------------------------------*/ -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/* Exported macro ------------------------------------------------------------*/ -/* Exported define -----------------------------------------------------------*/ -#define USB_DEVICE_DESCRIPTOR_TYPE 0x01 -#define USB_CONFIGURATION_DESCRIPTOR_TYPE 0x02 -#define USB_STRING_DESCRIPTOR_TYPE 0x03 -#define USB_INTERFACE_DESCRIPTOR_TYPE 0x04 -#define USB_ENDPOINT_DESCRIPTOR_TYPE 0x05 - -#define HID_DESCRIPTOR_TYPE 0x21 -#define PIOS_HID_SIZ_HID_DESC 0x09 -#define PIOS_HID_OFF_HID_DESC 0x12 - -#define PIOS_HID_SIZ_DEVICE_DESC 18 -#define PIOS_HID_SIZ_CONFIG_DESC 107 -#define PIOS_HID_SIZ_REPORT_DESC 36 -#define PIOS_HID_SIZ_STRING_LANGID 4 -#define PIOS_HID_SIZ_STRING_VENDOR 28 -#define PIOS_HID_SIZ_STRING_PRODUCT 28 -#define PIOS_HID_SIZ_STRING_SERIAL 52 /* 96 bits, 12 bytes, 24 characters, 48 in unicode */ - -#define STANDARD_ENDPOINT_DESC_SIZE 0x09 - -/* Exported functions ------------------------------------------------------- */ -extern const uint8_t PIOS_HID_DeviceDescriptor[PIOS_HID_SIZ_DEVICE_DESC]; -extern const uint8_t PIOS_HID_ConfigDescriptor[PIOS_HID_SIZ_CONFIG_DESC]; -extern const uint8_t PIOS_HID_ReportDescriptor[PIOS_HID_SIZ_REPORT_DESC]; -extern const uint8_t PIOS_HID_StringLangID[PIOS_HID_SIZ_STRING_LANGID]; -extern const uint8_t PIOS_HID_StringVendor[PIOS_HID_SIZ_STRING_VENDOR]; -extern const uint8_t PIOS_HID_StringProduct[PIOS_HID_SIZ_STRING_PRODUCT]; -extern uint8_t PIOS_HID_StringSerial[PIOS_HID_SIZ_STRING_SERIAL]; - -#endif /* __USB_DESC_H */ - -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/flight/CopterControl/System/pios_board.c b/flight/CopterControl/System/pios_board.c index a1f78f5dd..3a4c3e89f 100644 --- a/flight/CopterControl/System/pios_board.c +++ b/flight/CopterControl/System/pios_board.c @@ -985,8 +985,8 @@ uint32_t pios_rcvr_group_map[MANUALCONTROLSETTINGS_CHANNELGROUPS_NONE]; #endif /* PIOS_INCLUDE_RCVR */ -#if defined(PIOS_INCLUDE_USB_HID) -#include "pios_usb_hid_priv.h" +#if defined(PIOS_INCLUDE_USB) +#include "pios_usb_priv.h" static const struct pios_usb_cfg pios_usb_main_cfg = { .irq = { @@ -998,20 +998,22 @@ static const struct pios_usb_cfg pios_usb_main_cfg = { }, }, }; -#endif /* PIOS_INCLUDE_USB_HID */ +#endif /* PIOS_INCLUDE_USB */ -#if defined(PIOS_INCLUDE_USB_COM) -#include +#if defined(PIOS_INCLUDE_USB_HID) +#include -const struct pios_usb_com_cfg pios_usb_com_hid_cfg = { - .type = PIOS_USB_COM_HID, +const struct pios_usb_hid_cfg pios_usb_hid_cfg = { .data_if = 0, .data_rx_ep = 1, .data_tx_ep = 1, }; +#endif /* PIOS_INCLUDE_USB_HID */ -const struct pios_usb_com_cfg pios_usb_com_cdc_cfg = { - .type = PIOS_USB_COM_CDC, +#if defined(PIOS_INCLUDE_USB_CDC) +#include + +const struct pios_usb_cdc_cfg pios_usb_cdc_cfg = { .ctrl_if = 1, .ctrl_tx_ep = 2, @@ -1019,7 +1021,7 @@ const struct pios_usb_com_cfg pios_usb_com_cdc_cfg = { .data_rx_ep = 3, .data_tx_ep = 3, }; -#endif /* PIOS_INCLUDE_USB_COM */ +#endif /* PIOS_INCLUDE_USB_CDC */ uint32_t pios_com_telem_rf_id; uint32_t pios_com_telem_usb_id; @@ -1087,11 +1089,12 @@ void PIOS_Board_Init(void) { PIOS_TIM_InitClock(&tim_3_cfg); PIOS_TIM_InitClock(&tim_4_cfg); -#if defined(PIOS_INCLUDE_USB_HID) +#if defined(PIOS_INCLUDE_USB) uint32_t pios_usb_id; PIOS_USB_Init(&pios_usb_id, &pios_usb_main_cfg); - /* Configure the usb VCP port */ +#if defined(PIOS_INCLUDE_USB_CDC) + /* Configure the USB VCP port */ uint8_t hwsettings_usb_vcpport; HwSettingsUSB_VCPPortGet(&hwsettings_usb_vcpport); @@ -1101,15 +1104,15 @@ void PIOS_Board_Init(void) { case HWSETTINGS_USB_VCPPORT_USBTELEMETRY: #if defined(PIOS_INCLUDE_COM) { - uint32_t pios_usb_com_id; - if (PIOS_USB_COM_Init(&pios_usb_com_id, &pios_usb_com_cdc_cfg, pios_usb_id)) { + uint32_t pios_usb_cdc_id; + if (PIOS_USB_CDC_Init(&pios_usb_cdc_id, &pios_usb_cdc_cfg, pios_usb_id)) { PIOS_Assert(0); } uint8_t * rx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_TELEM_USB_RX_BUF_LEN); uint8_t * tx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_TELEM_USB_TX_BUF_LEN); PIOS_Assert(rx_buffer); PIOS_Assert(tx_buffer); - if (PIOS_COM_Init(&pios_com_telem_usb_id, &pios_usb_cdc_com_driver, pios_usb_com_id, + if (PIOS_COM_Init(&pios_com_telem_usb_id, &pios_usb_cdc_com_driver, pios_usb_cdc_id, rx_buffer, PIOS_COM_TELEM_USB_RX_BUF_LEN, tx_buffer, PIOS_COM_TELEM_USB_TX_BUF_LEN)) { PIOS_Assert(0); @@ -1118,25 +1121,29 @@ void PIOS_Board_Init(void) { #endif /* PIOS_INCLUDE_COM */ break; case HWSETTINGS_USB_VCPPORT_COMBRIDGE: +#if defined(PIOS_INCLUDE_COM) { - uint32_t pios_usb_vcp_id; - if (PIOS_USB_COM_Init(&pios_usb_vcp_id, &pios_usb_com_cdc_cfg, pios_usb_id)) { + uint32_t pios_usb_cdc_id; + if (PIOS_USB_CDC_Init(&pios_usb_cdc_id, &pios_usb_cdc_cfg, pios_usb_id)) { PIOS_Assert(0); } uint8_t * rx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_BRIDGE_RX_BUF_LEN); uint8_t * tx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_BRIDGE_TX_BUF_LEN); PIOS_Assert(rx_buffer); PIOS_Assert(tx_buffer); - if (PIOS_COM_Init(&pios_com_vcp_id, &pios_usb_cdc_com_driver, pios_usb_vcp_id, + if (PIOS_COM_Init(&pios_com_vcp_id, &pios_usb_cdc_com_driver, pios_usb_cdc_id, rx_buffer, PIOS_COM_BRIDGE_RX_BUF_LEN, tx_buffer, PIOS_COM_BRIDGE_TX_BUF_LEN)) { PIOS_Assert(0); } } +#endif /* PIOS_INCLUDE_COM */ break; } +#endif /* PIOS_INCLUDE_USB_CDC */ +#if defined(PIOS_INCLUDE_USB_HID) /* Configure the usb HID port */ uint8_t hwsettings_usb_hidport; HwSettingsUSB_HIDPortGet(&hwsettings_usb_hidport); @@ -1147,15 +1154,15 @@ void PIOS_Board_Init(void) { case HWSETTINGS_USB_HIDPORT_USBTELEMETRY: #if defined(PIOS_INCLUDE_COM) { - uint32_t pios_usb_com_id; - if (PIOS_USB_COM_Init(&pios_usb_com_id, &pios_usb_com_hid_cfg, pios_usb_id)) { + uint32_t pios_usb_hid_id; + if (PIOS_USB_HID_Init(&pios_usb_hid_id, &pios_usb_hid_cfg, pios_usb_id)) { PIOS_Assert(0); } uint8_t * rx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_TELEM_USB_RX_BUF_LEN); uint8_t * tx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_TELEM_USB_TX_BUF_LEN); PIOS_Assert(rx_buffer); PIOS_Assert(tx_buffer); - if (PIOS_COM_Init(&pios_com_telem_usb_id, &pios_usb_hid_com_driver, pios_usb_com_id, + if (PIOS_COM_Init(&pios_com_telem_usb_id, &pios_usb_hid_com_driver, pios_usb_hid_id, rx_buffer, PIOS_COM_TELEM_USB_RX_BUF_LEN, tx_buffer, PIOS_COM_TELEM_USB_TX_BUF_LEN)) { PIOS_Assert(0); @@ -1165,9 +1172,10 @@ void PIOS_Board_Init(void) { break; } - #endif /* PIOS_INCLUDE_USB_HID */ +#endif /* PIOS_INCLUDE_USB */ + /* Configure the main IO port */ uint8_t hwsettings_DSMxBind; HwSettingsDSMxBindGet(&hwsettings_DSMxBind); diff --git a/flight/CopterControl/System/pios_usb_board_data.c b/flight/CopterControl/System/pios_usb_board_data.c new file mode 100644 index 000000000..68761609a --- /dev/null +++ b/flight/CopterControl/System/pios_usb_board_data.c @@ -0,0 +1,20 @@ +#include "pios_usb_board_data.h" /* struct usb_*, USB_* */ + +const uint8_t PIOS_USB_BOARD_StringProductID[] = { + sizeof(PIOS_USB_BOARD_StringProductID), + USB_DESC_TYPE_STRING, + 'C', 0, + 'o', 0, + 'p', 0, + 't', 0, + 'e', 0, + 'r', 0, + 'C', 0, + 'o', 0, + 'n', 0, + 't', 0, + 'r', 0, + 'o', 0, + 'l', 0, +}; + diff --git a/flight/CopterControl/System/pios_usb_hid_desc.c b/flight/CopterControl/System/pios_usb_hid_desc.c deleted file mode 100644 index b57191d67..000000000 --- a/flight/CopterControl/System/pios_usb_hid_desc.c +++ /dev/null @@ -1,318 +0,0 @@ -/******************** (C) COPYRIGHT 2010 STMicroelectronics ******************** -* File Name : usb_desc.c -* Author : MCD Application Team -* Version : V3.2.1 -* Date : 07/05/2010 -* Description : Descriptors for Custom HID Demo -******************************************************************************** -* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ - -#include "usb_lib.h" -#include "pios_usb.h" -#include "pios_usb_hid.h" -#include "pios_usb_hid_desc.h" - -// ************************************************* -// USB Standard Device Descriptor - -const uint8_t PIOS_HID_DeviceDescriptor[PIOS_HID_SIZ_DEVICE_DESC] = - { - 0x12, // bLength - USB_DEVICE_DESCRIPTOR_TYPE, // bDescriptorType - 0x00, // bcdUSB - 0x02, - 0x02, // bDeviceClass (Communication Device) - 0x00, // bDeviceSubClass (Use Interface SubClass) - 0x00, // bDeviceProtocol - 0x40, // bMaxPacketSize40 - (uint8_t)((PIOS_USB_VENDOR_ID) & 0xff), // idVendor - (uint8_t)((PIOS_USB_VENDOR_ID) >> 8), - (uint8_t)((PIOS_USB_PRODUCT_ID) & 0xff), // idProduct - (uint8_t)((PIOS_USB_PRODUCT_ID) >> 8), - (uint8_t)((PIOS_USB_VERSION_ID) & 0xff), // bcdDevice - (uint8_t)((PIOS_USB_VERSION_ID) >> 8), - 0x01, // Index of string descriptor describing manufacturer - 0x02, // Index of string descriptor describing product - 0x03, // Index of string descriptor describing the device serial number - 0x01 // bNumConfigurations - }; - -// ************************************************* -// USB Configuration Descriptor -// All Descriptors (Configuration, Interface, Endpoint, Class, Vendor - -const uint8_t PIOS_HID_ConfigDescriptor[PIOS_HID_SIZ_CONFIG_DESC] = - { - 0x09, // bLength: Configuation Descriptor size - USB_CONFIGURATION_DESCRIPTOR_TYPE, // bDescriptorType: Configuration - PIOS_HID_SIZ_CONFIG_DESC, // wTotalLength: Bytes returned - 0x00, - 0x03, // bNumInterfaces: 3 interfaces - 0x01, // bConfigurationValue: Configuration value - 0x00, // iConfiguration: Index of string descriptor describing the configuration - 0xC0, // bmAttributes: Bus powered - 0x7D, // MaxPower 250 mA - needed to power the RF transmitter - - // *************** Interface Association Descriptor ***************** - // 9 - 0x08, /* bLength */ - 0x0B, /* bDescriptorType (IAD) */ - 0x01, /* bFirstInterface */ - 0x02, /* bInterfaceCount */ - 0x02, /* bFunctionClass (Communication Class) */ - 0x02, /* bFunctionSubClass (Abstract Control Model) */ - 0x00, /* bFunctionProtocol (V.25ter, Common AT commands) */ - 0x00, /* iInterface */ - - // ************** Descriptor of Custom HID interface **************** - // 17 - 0x09, // bLength: Interface Descriptor size - USB_INTERFACE_DESCRIPTOR_TYPE, // bDescriptorType: Interface descriptor type - 0x00, // bInterfaceNumber: Number of Interface - 0x00, // bAlternateSetting: Alternate setting - 0x02, // bNumEndpoints - 0x03, // bInterfaceClass: HID - 0x00, // bInterfaceSubClass : 1=BOOT, 0=no boot - 0x00, // nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse - 0, // iInterface: Index of string descriptor - - // ******************** Descriptor of Custom HID HID ******************** - // 26 - 0x09, // bLength: HID Descriptor size - HID_DESCRIPTOR_TYPE, // bDescriptorType: HID - 0x10, // bcdHID: HID Class Spec release number - 0x01, - 0x00, // bCountryCode: Hardware target country - 0x02, // bNumDescriptors: Number of HID class descriptors to follow - 0x22, // bDescriptorType - PIOS_HID_SIZ_REPORT_DESC, // wItemLength: Total length of Report descriptor - 0x00, - - // ******************** Descriptor of Custom HID endpoints ****************** - // 35 - 0x07, // bLength: Endpoint Descriptor size - USB_ENDPOINT_DESCRIPTOR_TYPE, // bDescriptorType: - - 0x81, // bEndpointAddress: Endpoint Address (IN) - 0x03, // bmAttributes: Interrupt endpoint - 0x40, // wMaxPacketSize: 2 Bytes max - 0x00, - 0x04, // bInterval: Polling Interval in ms - - // 42 - 0x07, // bLength: Endpoint Descriptor size - USB_ENDPOINT_DESCRIPTOR_TYPE, // bDescriptorType: (Endpoint descriptor type) - 0x01, // bEndpointAddress: Endpoint Address (OUT) - 0x03, // bmAttributes: Interrupt endpoint - 0x40, // wMaxPacketSize: 2 Bytes max - 0x00, - 0x04, // bInterval: Polling Interval in ms - - // ************** Descriptor of CDC Control interface **************** - // 49 - 0x09, /* bLength */ - USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ - 0x01, /* bInterfaceNumber */ - 0x00, /* bAlternateSetting */ - 0x01, /* bNumEndpoints */ - 0x02, /* bInterfaceClass (Communication Class) */ - 0x02, /* bInterfaceSubClass (Abstract Control Model) */ - 0x01, /* bFunctionProtocol (V.25ter, Common AT commands) */ - 0x00, /* iInterface */ - - // ************** Header Functional Descriptor **************** - // 58 - 0x05, /* bLength */ - 0x24, /* bDescriptorType (Class Specific Interface) */ - 0x00, /* bDescriptorSubtype (CDC Header Functional) */ - 0x10, /* bcdCDC (CDC spec release number, 1.10 */ - 0x01, - - // ************** Call Management Functional Descriptor **************** - // 63 - 0x05, /* bLength */ - 0x24, /* bDescriptorType (Class Specific Interface) */ - 0x01, /* bDescriptorSubtype (CDC Call Management) */ - 0x00, /* bmCapabilities (No call handling) */ - 0x02, /* bDataInterface (Interface number of Data Class Interface) */ - - // ************** Abstract Control Management Functional Descriptor **************** - // 68 - 0x04, /* bLength */ - 0x24, /* bDescriptorType (Class Specific Interface) */ - 0x02, /* bDescriptorSubtype (CDC Abstract Control Management) */ - 0x00, /* bmCapabilities */ - - // ************** Union Functional Descriptor **************** - // 72 - 0x05, /* bLength */ - 0x24, /* bDescriptorType (Class Specific Interface) */ - 0x06, /* bDescriptorSubtype (CDC Union) */ - 0x01, /* bMasterInterface (Interface number of master interface in the union) */ - 0x02, /* bSlaveInterface (Interface number of slave interface in the union) */ - - // ************** Endpoint2 Functional Descriptor **************** - // 77 - 0x07, /* bLength */ - USB_ENDPOINT_DESCRIPTOR_TYPE, // bDescriptorType (Endpoint) - 0x82, /* bEndpointAddress*/ - 0x03, /* bmAttributes (Interrupt Endpoint) */ - 0x40, /* wMaxPacketSize (bytes) */ - 0x00, - 0x04, /* bInterval (ms) */ - - // ************** Descriptor of CDC Data interface **************** - // 84 - 0x09, /* bLength */ - USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ - 0x02, /* bInterfaceNumber */ - 0x00, /* bAlternateSetting */ - 0x02, /* bNumEndpoints */ - 0x0A, /* bInterfaceClass (Data Interface Class) */ - 0x00, /* bInterfaceSubClass */ - 0x00, /* bFunctionProtocol (No class specific protocol) */ - 0x00, /* iInterface */ - - // ************** Endpoint3 Functional Descriptor **************** - // 93 - 0x07, /* bLength */ - USB_ENDPOINT_DESCRIPTOR_TYPE, // bDescriptorType (Endpoint) - 0x83, /* bEndpointAddress*/ - 0x02, /* bmAttributes (Bulk) */ - 0x40, /* wMaxPacketSize (bytes) */ - 0x00, - 0x00, /* bInterval (ms) */ - - // ************** Endpoint3 Functional Descriptor **************** - // 100 - 0x07, /* bLength */ - USB_ENDPOINT_DESCRIPTOR_TYPE, // bDescriptorType (Endpoint) - 0x03, /* bEndpointAddress*/ - 0x02, /* bmAttributes (Bulk) */ - 0x40, /* wMaxPacketSize (bytes) */ - 0x00, - 0x00 /* bInterval (ms) */ - - // 107 - }; - -// ************************************************* - - const uint8_t PIOS_HID_ReportDescriptor[PIOS_HID_SIZ_REPORT_DESC] = - { - 0x06, 0x9c, 0xff, // USAGE_PAGE (Vendor Page: 0xFF00) - 0x09, 0x01, // USAGE (Demo Kit) - 0xa1, 0x01, // COLLECTION (Application) - // 7 - - // Data 1 - 0x85, 0x01, // REPORT_ID (1) - 0x09, 0x02, // USAGE (LED 1) - 0x15, 0x00, // LOGICAL_MINIMUM (0) - 0x25, 0xff, // LOGICAL_MAXIMUM (255) - 0x75, 0x08, // REPORT_SIZE (8) - 0x95, PIOS_USB_COM_DATA_LENGTH+1, // REPORT_COUNT (1) - 0x81, 0x83, // INPUT (Const,Var,Array) - // 21 - - // Data 1 - 0x85, 0x02, // REPORT_ID (2) - 0x09, 0x03, // USAGE (LED 1) - 0x15, 0x00, // LOGICAL_MINIMUM (0) - 0x25, 0xff, // LOGICAL_MAXIMUM (255) - 0x75, 0x08, // REPORT_SIZE (8) - 0x95, PIOS_USB_COM_DATA_LENGTH+1, // REPORT_COUNT (1) - 0x91, 0x82, // OUTPUT (Data,Var,Abs,Vol) - // 35 - - 0xc0 // END_COLLECTION - }; - -// ************************************************* -// USB String Descriptors (optional) - -const uint8_t PIOS_HID_StringLangID[PIOS_HID_SIZ_STRING_LANGID] = - { - PIOS_HID_SIZ_STRING_LANGID, - USB_STRING_DESCRIPTOR_TYPE, - 0x09, 0x08 // LangID = 0x0809: UK. English -// 0x09, 0x04 // LangID = 0x0409: U.S. English - }; - -const uint8_t PIOS_HID_StringVendor[PIOS_HID_SIZ_STRING_VENDOR] = - { - PIOS_HID_SIZ_STRING_VENDOR, // Size of Vendor string - USB_STRING_DESCRIPTOR_TYPE, // bDescriptorType - // Manufacturer: "STMicroelectronics" - 'o', 0, - 'p', 0, - 'e', 0, - 'n', 0, - 'p', 0, - 'i', 0, - 'l', 0, - 'o', 0, - 't', 0, - '.', 0, - 'o', 0, - 'r', 0, - 'g', 0 - }; - -const uint8_t PIOS_HID_StringProduct[PIOS_HID_SIZ_STRING_PRODUCT] = - { - PIOS_HID_SIZ_STRING_PRODUCT, // bLength - USB_STRING_DESCRIPTOR_TYPE, // bDescriptorType - 'C', 0, - 'o', 0, - 'p', 0, - 't', 0, - 'e', 0, - 'r', 0, - 'C', 0, - 'o', 0, - 'n', 0, - 't', 0, - 'r', 0, - 'o', 0, - 'l', 0 - }; - -uint8_t PIOS_HID_StringSerial[PIOS_HID_SIZ_STRING_SERIAL] = - { - PIOS_HID_SIZ_STRING_SERIAL, // bLength - USB_STRING_DESCRIPTOR_TYPE, // bDescriptorType - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0 - }; - -// ************************************************* diff --git a/flight/Modules/Telemetry/telemetry.c b/flight/Modules/Telemetry/telemetry.c index 23b1a0549..d01085591 100644 --- a/flight/Modules/Telemetry/telemetry.c +++ b/flight/Modules/Telemetry/telemetry.c @@ -35,6 +35,7 @@ #include "flighttelemetrystats.h" #include "gcstelemetrystats.h" #include "hwsettings.h" +#include "pios_usb.h" /* PIOS_USB_* */ // Private constants #define MAX_QUEUE_SIZE TELEM_QUEUE_SIZE @@ -308,12 +309,12 @@ static void telemetryRxTask(void *parameters) // Task loop while (1) { -#if defined(PIOS_INCLUDE_USB_HID) +#if defined(PIOS_INCLUDE_USB) // Determine input port (USB takes priority over telemetry port) - if (PIOS_USB_HID_CheckAvailable(0) && PIOS_COM_TELEM_USB) { + if (PIOS_USB_CheckAvailable(0) && PIOS_COM_TELEM_USB) { inputPort = PIOS_COM_TELEM_USB; } else -#endif /* PIOS_INCLUDE_USB_HID */ +#endif /* PIOS_INCLUDE_USB */ { inputPort = telemetryPort; } @@ -347,11 +348,11 @@ static int32_t transmitData(uint8_t * data, int32_t length) uint32_t outputPort; // Determine input port (USB takes priority over telemetry port) -#if defined(PIOS_INCLUDE_USB_HID) - if (PIOS_USB_HID_CheckAvailable(0) && PIOS_COM_TELEM_USB) { +#if defined(PIOS_INCLUDE_USB) + if (PIOS_USB_CheckAvailable(0) && PIOS_COM_TELEM_USB) { outputPort = PIOS_COM_TELEM_USB; } else -#endif /* PIOS_INCLUDE_USB_HID */ +#endif /* PIOS_INCLUDE_USB */ { outputPort = telemetryPort; } diff --git a/flight/OpenPilot/Makefile b/flight/OpenPilot/Makefile index 73f3f766c..8f9d9bef9 100644 --- a/flight/OpenPilot/Makefile +++ b/flight/OpenPilot/Makefile @@ -180,13 +180,13 @@ SRC += $(PIOSSTM32F10X)/pios_wdg.c # PIOS USB related files (seperated to make code maintenance more easy) +SRC += $(PIOSSTM32F10X)/pios_usb.c SRC += $(PIOSSTM32F10X)/pios_usbhook.c SRC += $(PIOSSTM32F10X)/pios_usb_hid.c -SRC += $(PIOSSTM32F10X)/pios_usb_hid_desc.c -#SRC += $(PIOSSTM32F10X)/pios_usb_hid_endp.c SRC += $(PIOSSTM32F10X)/pios_usb_hid_istr.c SRC += $(PIOSSTM32F10X)/pios_usb_hid_pwr.c -SRC += $(PIOSSTM32F10X)/pios_usb_com.c +SRC += $(OPSYSTEM)/pios_usb_board_data.c +SRC += $(PIOSCOMMON)/pios_usb_desc_hid_only.c ## PIOS Hardware (Common) SRC += $(PIOSCOMMON)/pios_crc.c diff --git a/flight/OpenPilot/System/inc/pios_config.h b/flight/OpenPilot/System/inc/pios_config.h index 491bc4be9..3ec902e8e 100644 --- a/flight/OpenPilot/System/inc/pios_config.h +++ b/flight/OpenPilot/System/inc/pios_config.h @@ -55,8 +55,8 @@ #define PIOS_INCLUDE_SPI #define PIOS_INCLUDE_SYS #define PIOS_INCLUDE_USART +#define PIOS_INCLUDE_USB #define PIOS_INCLUDE_USB_HID -#define PIOS_INCLUDE_USB_COM #define PIOS_INCLUDE_BMP085 //#define PIOS_INCLUDE_HCSR04 #define PIOS_INCLUDE_OPAHRS diff --git a/flight/OpenPilot/System/inc/pios_usb_board_data.h b/flight/OpenPilot/System/inc/pios_usb_board_data.h new file mode 100644 index 000000000..067cf31e6 --- /dev/null +++ b/flight/OpenPilot/System/inc/pios_usb_board_data.h @@ -0,0 +1,52 @@ +#ifndef PIOS_USB_BOARD_DATA_H +#define PIOS_USB_BOARD_DATA_H + +#define PIOS_USB_BOARD_CDC_DATA_LENGTH 64 +#define PIOS_USB_BOARD_CDC_MGMT_LENGTH 32 +#define PIOS_USB_BOARD_HID_DATA_LENGTH 64 + +#define PIOS_USB_BOARD_EP_NUM 4 + +#include "pios_usb_defs.h" /* struct usb_* */ + +struct usb_board_config { + struct usb_configuration_desc config; + struct usb_interface_association_desc iad; + struct usb_interface_desc hid_if; + struct usb_hid_desc hid; + struct usb_endpoint_desc hid_in; + struct usb_endpoint_desc hid_out; + struct usb_interface_desc cdc_control_if; + struct usb_cdc_header_func_desc cdc_header; + struct usb_cdc_callmgmt_func_desc cdc_callmgmt; + struct usb_cdc_acm_func_desc cdc_acm; + struct usb_cdc_union_func_desc cdc_union; + struct usb_endpoint_desc cdc_mgmt_in; + struct usb_interface_desc cdc_data_if; + struct usb_endpoint_desc cdc_in; + struct usb_endpoint_desc cdc_out; +} __attribute__((packed)); + +extern const struct usb_device_desc PIOS_USB_BOARD_DeviceDescriptor; +extern const struct usb_board_config PIOS_USB_BOARD_Configuration; +extern const struct usb_string_langid PIOS_USB_BOARD_StringLangID; + +/* NOTE NOTE NOTE + * + * Care must be taken to ensure that the _actual_ contents of + * these arrays (in each board's pios_usb_board_data.c) is no + * smaller than the stated sizes here or these descriptors + * will end up with trailing zeros on the wire. + * + * The compiler will catch any time that these definitions are + * too small. + */ +extern const uint8_t PIOS_USB_BOARD_HidReportDescriptor[36]; +extern const uint8_t PIOS_USB_BOARD_StringVendorID[28]; +extern const uint8_t PIOS_USB_BOARD_StringProductID[20]; +extern uint8_t PIOS_USB_BOARD_StringSerial[52]; + +#define PIOS_USB_BOARD_PRODUCT_ID USB_PRODUCT_ID_OPENPILOT_MAIN +#define PIOS_USB_BOARD_DEVICE_VER USB_OP_DEVICE_VER(USB_OP_BOARD_ID_OPENPILOT_MAIN, USB_OP_BOARD_MODE_FW) + +#endif /* PIOS_USB_BOARD_DATA_H */ diff --git a/flight/OpenPilot/System/pios_board.c b/flight/OpenPilot/System/pios_board.c index df2ea246d..314a8e24d 100644 --- a/flight/OpenPilot/System/pios_board.c +++ b/flight/OpenPilot/System/pios_board.c @@ -1041,8 +1041,8 @@ uint32_t pios_rcvr_group_map[MANUALCONTROLSETTINGS_CHANNELGROUPS_NONE]; #endif /* PIOS_INCLUDE_RCVR */ -#if defined(PIOS_INCLUDE_USB_HID) -#include "pios_usb_hid_priv.h" +#if defined(PIOS_INCLUDE_USB) +#include "pios_usb_priv.h" static const struct pios_usb_cfg pios_usb_main_cfg = { .irq = { @@ -1054,19 +1054,18 @@ static const struct pios_usb_cfg pios_usb_main_cfg = { }, }, }; -#endif /* PIOS_INCLUDE_USB_HID */ +#endif /* PIOS_INCLUDE_USB */ -#if defined(PIOS_INCLUDE_USB_COM) -#include +#if defined(PIOS_INCLUDE_USB_HID) +#include -const struct pios_usb_com_cfg pios_usb_com_hid_cfg = { - .type = PIOS_USB_COM_HID, +const struct pios_usb_hid_cfg pios_usb_hid_cfg = { .data_if = 0, .data_rx_ep = 1, .data_tx_ep = 1, }; -#endif /* PIOS_INCLUDE_USB_COM */ +#endif /* PIOS_INCLUDE_USB_HID */ uint32_t pios_com_telem_rf_id; uint32_t pios_com_telem_usb_id; @@ -1286,25 +1285,28 @@ void PIOS_Board_Init(void) { break; } -#if defined(PIOS_INCLUDE_USB_HID) +#if defined(PIOS_INCLUDE_USB) uint32_t pios_usb_id; - PIOS_USB_Init(&pios_usb_id, &pios_usb_main_cfg); -#if defined(PIOS_INCLUDE_COM) - uint32_t pios_usb_com_id; - if (PIOS_USB_COM_Init(&pios_usb_com_id, &pios_usb_com_hid_cfg, pios_usb_id)) { + if (PIOS_USB_Init(&pios_usb_id, &pios_usb_main_cfg)) { + PIOS_Assert(0); + } +#if defined(PIOS_INCLUDE_USB_HID) && defined(PIOS_INCLUDE_COM) + uint32_t pios_usb_hid_id; + if (PIOS_USB_HID_Init(&pios_usb_hid_id, &pios_usb_hid_cfg, pios_usb_id)) { PIOS_Assert(0); } uint8_t * rx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_TELEM_USB_RX_BUF_LEN); uint8_t * tx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_TELEM_USB_TX_BUF_LEN); PIOS_Assert(rx_buffer); PIOS_Assert(tx_buffer); - if (PIOS_COM_Init(&pios_com_telem_usb_id, &pios_usb_hid_com_driver, pios_usb_com_id, + if (PIOS_COM_Init(&pios_com_telem_usb_id, &pios_usb_hid_com_driver, pios_usb_hid_id, rx_buffer, PIOS_COM_TELEM_USB_RX_BUF_LEN, tx_buffer, PIOS_COM_TELEM_USB_TX_BUF_LEN)) { PIOS_Assert(0); } -#endif /* PIOS_INCLUDE_COM */ -#endif /* PIOS_INCLUDE_USB_HID */ +#endif /* PIOS_INCLUDE_USB_HID && PIOS_INCLUDE_COM */ + +#endif /* PIOS_INCLUDE_USB */ #if defined(PIOS_INCLUDE_I2C) if (PIOS_I2C_Init(&pios_i2c_main_adapter_id, &pios_i2c_main_adapter_cfg)) { diff --git a/flight/OpenPilot/System/pios_usb_board_data.c b/flight/OpenPilot/System/pios_usb_board_data.c new file mode 100644 index 000000000..c23cc2891 --- /dev/null +++ b/flight/OpenPilot/System/pios_usb_board_data.c @@ -0,0 +1,15 @@ +#include "pios_usb_board_data.h" /* struct usb_*, USB_* */ + +const uint8_t PIOS_USB_BOARD_StringProductID[] = { + sizeof(PIOS_USB_BOARD_StringProductID), + USB_DESC_TYPE_STRING, + 'O', 0, + 'p', 0, + 'e', 0, + 'n', 0, + 'P', 0, + 'i', 0, + 'l', 0, + 'o', 0, + 't', 0, +}; diff --git a/flight/PiOS/Boards/STM32103CB_CC_Rev1.h b/flight/PiOS/Boards/STM32103CB_CC_Rev1.h index 8221d659b..437a49109 100644 --- a/flight/PiOS/Boards/STM32103CB_CC_Rev1.h +++ b/flight/PiOS/Boards/STM32103CB_CC_Rev1.h @@ -271,10 +271,11 @@ extern uint32_t pios_com_telem_usb_id; //------------------------- // USB //------------------------- +#define PIOS_USB_HID_MAX_DEVS 1 + #define PIOS_USB_ENABLED 1 #define PIOS_USB_DETECT_GPIO_PORT GPIOC #define PIOS_USB_MAX_DEVS 1 -#define PIOS_USB_COM_MAX_DEVS 1 #define PIOS_USB_DETECT_GPIO_PIN GPIO_Pin_15 #define PIOS_USB_DETECT_EXTI_LINE EXTI_Line15 #define PIOS_IRQ_USB_PRIORITY PIOS_IRQ_PRIO_MID diff --git a/flight/PiOS/Boards/STM32103CB_PIPXTREME_Rev1.h b/flight/PiOS/Boards/STM32103CB_PIPXTREME_Rev1.h index e29a6249b..b918ead67 100644 --- a/flight/PiOS/Boards/STM32103CB_PIPXTREME_Rev1.h +++ b/flight/PiOS/Boards/STM32103CB_PIPXTREME_Rev1.h @@ -399,7 +399,7 @@ extern uint32_t pios_com_telem_usb_id; #define PIOS_USB_DETECT_EXTI_LINE EXTI_Line4 #define PIOS_IRQ_USB_PRIORITY 8 #endif -#define PIOS_USB_COM_MAX_DEVS 1 +#define PIOS_USB_HID_MAX_DEVS 1 // ***************************************************************** // RFM22 diff --git a/flight/PiOS/Boards/STM3210E_OP.h b/flight/PiOS/Boards/STM3210E_OP.h index 2d1c80038..a7754c2ed 100644 --- a/flight/PiOS/Boards/STM3210E_OP.h +++ b/flight/PiOS/Boards/STM3210E_OP.h @@ -311,7 +311,7 @@ extern uint32_t pios_com_aux_id; #define PIOS_USB_ENABLED 1 #define PIOS_USB_DETECT_GPIO_PORT GPIOC #define PIOS_USB_MAX_DEVS 1 -#define PIOS_USB_COM_MAX_DEVS 1 +#define PIOS_USB_HID_MAX_DEVS 1 #define PIOS_USB_DETECT_GPIO_PIN GPIO_Pin_4 #define PIOS_USB_DETECT_EXTI_LINE EXTI_Line4 #define PIOS_IRQ_USB_PRIORITY PIOS_IRQ_PRIO_MID diff --git a/flight/PiOS/Common/pios_usb_desc_hid_cdc.c b/flight/PiOS/Common/pios_usb_desc_hid_cdc.c new file mode 100644 index 000000000..776a5be87 --- /dev/null +++ b/flight/PiOS/Common/pios_usb_desc_hid_cdc.c @@ -0,0 +1,247 @@ +#include "pios_usb_board_data.h" /* struct usb_*, USB_* */ + +const struct usb_device_desc PIOS_USB_BOARD_DeviceDescriptor = { + .bLength = sizeof(struct usb_device_desc), + .bDescriptorType = USB_DESC_TYPE_DEVICE, + .bcdUSB = htousbs(0x0200), + .bDeviceClass = 0x02, + .bDeviceSubClass = 0x00, + .bDeviceProtocol = 0x00, + .bMaxPacketSize0 = 64, /* Must be 64 for high-speed devices */ + .idVendor = htousbs(USB_VENDOR_ID_OPENPILOT), + .idProduct = htousbs(PIOS_USB_BOARD_PRODUCT_ID), + .bcdDevice = htousbs(PIOS_USB_BOARD_DEVICE_VER), + .iManufacturer = 1, + .iProduct = 2, + .iSerialNumber = 3, + .bNumConfigurations = 1, +}; + +const struct usb_board_config PIOS_USB_BOARD_Configuration = { + .config = { + .bLength = sizeof(struct usb_configuration_desc), + .bDescriptorType = USB_DESC_TYPE_CONFIGURATION, + .wTotalLength = htousbs(sizeof(struct usb_board_config)), + .bNumInterfaces = 3, + .bConfigurationValue = 1, + .iConfiguration = 0, + .bmAttributes = 0xC0, + .bMaxPower = 250/2, /* in units of 2ma */ + }, + .iad = { + .bLength = sizeof(struct usb_interface_association_desc), + .bDescriptorType = USB_DESC_TYPE_IAD, + .bFirstInterface = 1, + .bInterfaceCount = 2, + .bFunctionClass = 2, /* Communication */ + .bFunctionSubClass = 2, /* Abstract Control Model */ + .bFunctionProtocol = 0, /* V.25ter, Common AT commands */ + .iInterface = 0, + }, + .hid_if = { + .bLength = sizeof(struct usb_interface_desc), + .bDescriptorType = USB_DESC_TYPE_INTERFACE, + .bInterfaceNumber = 0, + .bAlternateSetting = 0, + .bNumEndpoints = 2, + .bInterfaceClass = USB_INTERFACE_CLASS_HID, + .bInterfaceSubClass = 0, /* no boot */ + .nInterfaceProtocol = 0, /* none */ + .iInterface = 0, + }, + .hid = { + .bLength = sizeof(struct usb_hid_desc), + .bDescriptorType = USB_DESC_TYPE_HID, + .bcdHID = htousbs(0x0110), + .bCountryCode = 0, + .bNumDescriptors = 1, + .bClassDescriptorType = USB_DESC_TYPE_REPORT, + .wItemLength = htousbs(sizeof(PIOS_USB_BOARD_HidReportDescriptor)), + }, + .hid_in = { + .bLength = sizeof(struct usb_endpoint_desc), + .bDescriptorType = USB_DESC_TYPE_ENDPOINT, + .bEndpointAddress = USB_EP_IN(1), + .bmAttributes = USB_EP_ATTR_TT_INTERRUPT, + .wMaxPacketSize = htousbs(PIOS_USB_BOARD_HID_DATA_LENGTH), + .bInterval = 4, /* ms */ + }, + .hid_out = { + .bLength = sizeof(struct usb_endpoint_desc), + .bDescriptorType = USB_DESC_TYPE_ENDPOINT, + .bEndpointAddress = USB_EP_OUT(1), + .bmAttributes = USB_EP_ATTR_TT_INTERRUPT, + .wMaxPacketSize = htousbs(PIOS_USB_BOARD_HID_DATA_LENGTH), + .bInterval = 4, /* ms */ + }, + .cdc_control_if = { + .bLength = sizeof(struct usb_interface_desc), + .bDescriptorType = USB_DESC_TYPE_INTERFACE, + .bInterfaceNumber = 1, + .bAlternateSetting = 0, + .bNumEndpoints = 1, + .bInterfaceClass = USB_INTERFACE_CLASS_CDC, + .bInterfaceSubClass = 2, /* Abstract Control Model */ + .nInterfaceProtocol = 1, /* V.25ter, Common AT commands */ + .iInterface = 0, + }, + .cdc_header = { + .bLength = sizeof(struct usb_cdc_header_func_desc), + .bDescriptorType = USB_DESC_TYPE_CLASS_SPECIFIC, + .bDescriptorSubType = USB_CDC_DESC_SUBTYPE_HEADER, + .bcdCDC = htousbs(0x0110), + }, + .cdc_callmgmt = { + .bLength = sizeof(struct usb_cdc_callmgmt_func_desc), + .bDescriptorType = USB_DESC_TYPE_CLASS_SPECIFIC, + .bDescriptorSubType = USB_CDC_DESC_SUBTYPE_CALLMGMT, + .bmCapabilities = 0x00, /* No call handling */ + .bDataInterface = 2, + }, + .cdc_acm = { + .bLength = sizeof(struct usb_cdc_acm_func_desc), + .bDescriptorType = USB_DESC_TYPE_CLASS_SPECIFIC, + .bDescriptorSubType = USB_CDC_DESC_SUBTYPE_ABSTRACT_CTRL, + .bmCapabilities = 0, + }, + .cdc_union = { + .bLength = sizeof(struct usb_cdc_union_func_desc), + .bDescriptorType = USB_DESC_TYPE_CLASS_SPECIFIC, + .bDescriptorSubType = USB_CDC_DESC_SUBTYPE_UNION, + .bMasterInterface = 1, + .bSlaveInterface = 2, + }, + .cdc_mgmt_in = { + .bLength = sizeof(struct usb_endpoint_desc), + .bDescriptorType = USB_DESC_TYPE_ENDPOINT, + .bEndpointAddress = USB_EP_IN(2), + .bmAttributes = USB_EP_ATTR_TT_INTERRUPT, + .wMaxPacketSize = htousbs(16), + .bInterval = 4, /* ms */ + }, + .cdc_data_if = { + .bLength = sizeof(struct usb_interface_desc), + .bDescriptorType = USB_DESC_TYPE_INTERFACE, + .bInterfaceNumber = 2, + .bAlternateSetting = 0, + .bNumEndpoints = 2, + .bInterfaceClass = USB_INTERFACE_CLASS_DATA, + .bInterfaceSubClass = 0, + .nInterfaceProtocol = 0, /* No class specific protocol */ + .iInterface = 0, + }, + .cdc_in = { + .bLength = sizeof(struct usb_endpoint_desc), + .bDescriptorType = USB_DESC_TYPE_ENDPOINT, + .bEndpointAddress = USB_EP_IN(3), + .bmAttributes = USB_EP_ATTR_TT_BULK, + .wMaxPacketSize = htousbs(PIOS_USB_BOARD_CDC_DATA_LENGTH), + .bInterval = 0, /* ms */ + }, + .cdc_out = { + .bLength = sizeof(struct usb_endpoint_desc), + .bDescriptorType = USB_DESC_TYPE_ENDPOINT, + .bEndpointAddress = USB_EP_OUT(3), + .bmAttributes = USB_EP_ATTR_TT_BULK, /* Bulk */ + .wMaxPacketSize = htousbs(PIOS_USB_BOARD_CDC_DATA_LENGTH), + .bInterval = 0, /* ms */ + }, +}; + +const uint8_t PIOS_USB_BOARD_HidReportDescriptor[] = { + HID_GLOBAL_ITEM_2 (HID_TAG_GLOBAL_USAGE_PAGE), + 0x9C, 0xFF, /* Usage Page 0xFF9C (Vendor Defined) */ + HID_LOCAL_ITEM_1 (HID_TAG_LOCAL_USAGE), + 0x01, /* Usage ID 0x0001 (0x01-0x1F uaually for top-level collections) */ + + HID_MAIN_ITEM_1 (HID_TAG_MAIN_COLLECTION), + 0x01, /* Application */ + + /* Device -> Host emulated serial channel */ + HID_GLOBAL_ITEM_1 (HID_TAG_GLOBAL_REPORT_ID), + 0x01, /* OpenPilot emulated serial channel (Device -> Host) */ + HID_LOCAL_ITEM_1 (HID_TAG_LOCAL_USAGE), + 0x02, + HID_GLOBAL_ITEM_1 (HID_TAG_GLOBAL_LOGICAL_MIN), + 0x00, /* Values range from min = 0x00 */ + HID_GLOBAL_ITEM_1 (HID_TAG_GLOBAL_LOGICAL_MAX), + 0xFF, /* Values range to max = 0xFF */ + HID_GLOBAL_ITEM_1 (HID_TAG_GLOBAL_REPORT_SIZE), + 0x08, /* 8 bits wide */ + HID_GLOBAL_ITEM_1 (HID_TAG_GLOBAL_REPORT_CNT), + PIOS_USB_BOARD_HID_DATA_LENGTH-1, /* Need to leave room for a report ID */ + HID_MAIN_ITEM_1 (HID_TAG_MAIN_INPUT), + 0x03, /* Variable, Constant (read-only) */ + + /* Host -> Host emulated serial channel */ + HID_GLOBAL_ITEM_1 (HID_TAG_GLOBAL_REPORT_ID), + 0x02, /* OpenPilot emulated Serial Channel (Host -> Device) */ + HID_LOCAL_ITEM_1 (HID_TAG_LOCAL_USAGE), + 0x02, + HID_GLOBAL_ITEM_1 (HID_TAG_GLOBAL_LOGICAL_MIN), + 0x00, /* Values range from min = 0x00 */ + HID_GLOBAL_ITEM_1 (HID_TAG_GLOBAL_LOGICAL_MAX), + 0xFF, /* Values range to max = 0xFF */ + HID_GLOBAL_ITEM_1 (HID_TAG_GLOBAL_REPORT_SIZE), + 0x08, /* 8 bits wide */ + HID_GLOBAL_ITEM_1 (HID_TAG_GLOBAL_REPORT_CNT), + PIOS_USB_BOARD_HID_DATA_LENGTH-1, /* Need to leave room for a report ID */ + HID_MAIN_ITEM_1 (HID_TAG_MAIN_OUTPUT), + 0x82, /* Volatile, Variable */ + + HID_MAIN_ITEM_0 (HID_TAG_MAIN_ENDCOLLECTION), +}; + +const struct usb_string_langid PIOS_USB_BOARD_StringLangID = { + .bLength = sizeof(PIOS_USB_BOARD_StringLangID), + .bDescriptorType = USB_DESC_TYPE_STRING, + .bLangID = htousbs(USB_LANGID_ENGLISH_UK), +}; + +const uint8_t PIOS_USB_BOARD_StringVendorID[] = { + sizeof(PIOS_USB_BOARD_StringVendorID), + USB_DESC_TYPE_STRING, + 'o', 0, + 'p', 0, + 'e', 0, + 'n', 0, + 'p', 0, + 'i', 0, + 'l', 0, + 'o', 0, + 't', 0, + '.', 0, + 'o', 0, + 'r', 0, + 'g', 0 +}; + +uint8_t PIOS_USB_BOARD_StringSerial[] = { + sizeof(PIOS_USB_BOARD_StringSerial), + USB_DESC_TYPE_STRING, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0 +}; diff --git a/flight/PiOS/Common/pios_usb_desc_hid_only.c b/flight/PiOS/Common/pios_usb_desc_hid_only.c new file mode 100644 index 000000000..68e24e491 --- /dev/null +++ b/flight/PiOS/Common/pios_usb_desc_hid_only.c @@ -0,0 +1,165 @@ +#include "pios_usb_board_data.h" /* struct usb_*, USB_* */ + +const struct usb_device_desc PIOS_USB_BOARD_DeviceDescriptor = { + .bLength = sizeof(struct usb_device_desc), + .bDescriptorType = USB_DESC_TYPE_DEVICE, + .bcdUSB = htousbs(0x0200), + .bDeviceClass = 0x00, + .bDeviceSubClass = 0x00, + .bDeviceProtocol = 0x00, + .bMaxPacketSize0 = 64, /* Must be 64 for high-speed devices */ + .idVendor = htousbs(USB_VENDOR_ID_OPENPILOT), + .idProduct = htousbs(PIOS_USB_BOARD_PRODUCT_ID), + .bcdDevice = htousbs(PIOS_USB_BOARD_DEVICE_VER), + .iManufacturer = 1, + .iProduct = 2, + .iSerialNumber = 3, + .bNumConfigurations = 1, +}; + +const struct usb_board_config PIOS_USB_BOARD_Configuration = { + .config = { + .bLength = sizeof(struct usb_configuration_desc), + .bDescriptorType = USB_DESC_TYPE_CONFIGURATION, + .wTotalLength = htousbs(sizeof(struct usb_board_config)), + .bNumInterfaces = 1, + .bConfigurationValue = 1, + .iConfiguration = 0, + .bmAttributes = 0xC0, + .bMaxPower = 250/2, /* in units of 2ma */ + }, + .hid_if = { + .bLength = sizeof(struct usb_interface_desc), + .bDescriptorType = USB_DESC_TYPE_INTERFACE, + .bInterfaceNumber = 0, + .bAlternateSetting = 0, + .bNumEndpoints = 2, + .bInterfaceClass = USB_INTERFACE_CLASS_HID, + .bInterfaceSubClass = 0, /* no boot */ + .nInterfaceProtocol = 0, /* none */ + .iInterface = 0, + }, + .hid = { + .bLength = sizeof(struct usb_hid_desc), + .bDescriptorType = USB_DESC_TYPE_HID, + .bcdHID = htousbs(0x0110), + .bCountryCode = 0, + .bNumDescriptors = 1, + .bClassDescriptorType = USB_DESC_TYPE_REPORT, + .wItemLength = htousbs(sizeof(PIOS_USB_BOARD_HidReportDescriptor)), + }, + .hid_in = { + .bLength = sizeof(struct usb_endpoint_desc), + .bDescriptorType = USB_DESC_TYPE_ENDPOINT, + .bEndpointAddress = USB_EP_IN(1), + .bmAttributes = USB_EP_ATTR_TT_INTERRUPT, + .wMaxPacketSize = htousbs(PIOS_USB_BOARD_HID_DATA_LENGTH), + .bInterval = 4, /* ms */ + }, + .hid_out = { + .bLength = sizeof(struct usb_endpoint_desc), + .bDescriptorType = USB_DESC_TYPE_ENDPOINT, + .bEndpointAddress = USB_EP_OUT(1), + .bmAttributes = USB_EP_ATTR_TT_INTERRUPT, + .wMaxPacketSize = htousbs(PIOS_USB_BOARD_HID_DATA_LENGTH), + .bInterval = 4, /* ms */ + }, +}; + +const uint8_t PIOS_USB_BOARD_HidReportDescriptor[] = { + HID_GLOBAL_ITEM_2 (HID_TAG_GLOBAL_USAGE_PAGE), + 0x9C, 0xFF, /* Usage Page 0xFF9C (Vendor Defined) */ + HID_LOCAL_ITEM_1 (HID_TAG_LOCAL_USAGE), + 0x01, /* Usage ID 0x0001 (0x01-0x1F uaually for top-level collections) */ + + HID_MAIN_ITEM_1 (HID_TAG_MAIN_COLLECTION), + 0x01, /* Application */ + + /* Device -> Host emulated serial channel */ + HID_GLOBAL_ITEM_1 (HID_TAG_GLOBAL_REPORT_ID), + 0x01, /* OpenPilot emulated serial channel (Device -> Host) */ + HID_LOCAL_ITEM_1 (HID_TAG_LOCAL_USAGE), + 0x02, + HID_GLOBAL_ITEM_1 (HID_TAG_GLOBAL_LOGICAL_MIN), + 0x00, /* Values range from min = 0x00 */ + HID_GLOBAL_ITEM_1 (HID_TAG_GLOBAL_LOGICAL_MAX), + 0xFF, /* Values range to max = 0xFF */ + HID_GLOBAL_ITEM_1 (HID_TAG_GLOBAL_REPORT_SIZE), + 0x08, /* 8 bits wide */ + HID_GLOBAL_ITEM_1 (HID_TAG_GLOBAL_REPORT_CNT), + PIOS_USB_BOARD_HID_DATA_LENGTH-1, /* Need to leave room for a report ID */ + HID_MAIN_ITEM_1 (HID_TAG_MAIN_INPUT), + 0x03, /* Variable, Constant (read-only) */ + + /* Host -> Host emulated serial channel */ + HID_GLOBAL_ITEM_1 (HID_TAG_GLOBAL_REPORT_ID), + 0x02, /* OpenPilot emulated Serial Channel (Host -> Device) */ + HID_LOCAL_ITEM_1 (HID_TAG_LOCAL_USAGE), + 0x02, + HID_GLOBAL_ITEM_1 (HID_TAG_GLOBAL_LOGICAL_MIN), + 0x00, /* Values range from min = 0x00 */ + HID_GLOBAL_ITEM_1 (HID_TAG_GLOBAL_LOGICAL_MAX), + 0xFF, /* Values range to max = 0xFF */ + HID_GLOBAL_ITEM_1 (HID_TAG_GLOBAL_REPORT_SIZE), + 0x08, /* 8 bits wide */ + HID_GLOBAL_ITEM_1 (HID_TAG_GLOBAL_REPORT_CNT), + PIOS_USB_BOARD_HID_DATA_LENGTH-1, /* Need to leave room for a report ID */ + HID_MAIN_ITEM_1 (HID_TAG_MAIN_OUTPUT), + 0x82, /* Volatile, Variable */ + + HID_MAIN_ITEM_0 (HID_TAG_MAIN_ENDCOLLECTION), +}; + +const struct usb_string_langid PIOS_USB_BOARD_StringLangID = { + .bLength = sizeof(PIOS_USB_BOARD_StringLangID), + .bDescriptorType = USB_DESC_TYPE_STRING, + .bLangID = htousbs(USB_LANGID_ENGLISH_UK), +}; + +const uint8_t PIOS_USB_BOARD_StringVendorID[] = { + sizeof(PIOS_USB_BOARD_StringVendorID), + USB_DESC_TYPE_STRING, + 'o', 0, + 'p', 0, + 'e', 0, + 'n', 0, + 'p', 0, + 'i', 0, + 'l', 0, + 'o', 0, + 't', 0, + '.', 0, + 'o', 0, + 'r', 0, + 'g', 0 +}; + +uint8_t PIOS_USB_BOARD_StringSerial[] = { + sizeof(PIOS_USB_BOARD_StringSerial), + USB_DESC_TYPE_STRING, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0 +}; diff --git a/flight/PiOS/STM32F10x/pios_usb.c b/flight/PiOS/STM32F10x/pios_usb.c new file mode 100644 index 000000000..df17777c7 --- /dev/null +++ b/flight/PiOS/STM32F10x/pios_usb.c @@ -0,0 +1,225 @@ +/** + ****************************************************************************** + * @addtogroup PIOS PIOS Core hardware abstraction layer + * @{ + * @addtogroup PIOS_USB USB Setup Functions + * @brief PIOS USB device implementation + * @{ + * + * @file pios_usb.c + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. + * @brief USB device functions (STM32 dependent code) + * @see The GNU Public License (GPL) Version 3 + * + *****************************************************************************/ +/* + * 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 + */ + +/* Project Includes */ +#include "pios.h" +#include "usb_lib.h" +#include "pios_usb_board_data.h" +#include "stm32f10x.h" + +#include "pios_usb.h" +#include "pios_usb_priv.h" + +#if defined(PIOS_INCLUDE_USB_HID) + +/* Rx/Tx status */ +static uint8_t transfer_possible = 0; + +enum pios_usb_dev_magic { + PIOS_USB_DEV_MAGIC = 0x17365904, +}; + +struct pios_usb_dev { + enum pios_usb_dev_magic magic; + const struct pios_usb_cfg * cfg; +}; + +#if 0 +static bool PIOS_USB_validate(struct pios_usb_dev * usb_dev) +{ + return (usb_dev->magic == PIOS_USB_DEV_MAGIC); +} +#endif + +#if defined(PIOS_INCLUDE_FREERTOS) +static struct pios_usb_dev * PIOS_USB_alloc(void) +{ + struct pios_usb_dev * usb_dev; + + usb_dev = (struct pios_usb_dev *)pvPortMalloc(sizeof(*usb_dev)); + if (!usb_dev) return(NULL); + + usb_dev->magic = PIOS_USB_DEV_MAGIC; + return(usb_dev); +} +#else +static struct pios_usb_dev pios_usb_devs[PIOS_USB_MAX_DEVS]; +static uint8_t pios_usb_num_devs; +static struct pios_usb_dev * PIOS_USB_alloc(void) +{ + struct pios_usb_dev * usb_dev; + + if (pios_usb_num_devs >= PIOS_USB_MAX_DEVS) { + return (NULL); + } + + usb_dev = &pios_usb_devs[pios_usb_num_devs++]; + usb_dev->magic = PIOS_USB_DEV_MAGIC; + + return (usb_dev); +} +#endif + + +/** + * Initialises USB COM layer + * \return < 0 if initialisation failed + * \note Applications shouldn't call this function directly, instead please use \ref PIOS_COM layer functions + */ +static uint32_t pios_usb_com_id; +int32_t PIOS_USB_Init(uint32_t * usb_id, const struct pios_usb_cfg * cfg) +{ + PIOS_Assert(usb_id); + PIOS_Assert(cfg); + + struct pios_usb_dev * usb_dev; + + usb_dev = (struct pios_usb_dev *) PIOS_USB_alloc(); + if (!usb_dev) goto out_fail; + + /* Bind the configuration to the device instance */ + usb_dev->cfg = cfg; + + PIOS_USB_Reenumerate(); + + /* + * This is a horrible hack to make this available to + * the interrupt callbacks. This should go away ASAP. + */ + pios_usb_com_id = (uint32_t) usb_dev; + + /* Enable the USB Interrupts */ + NVIC_Init(&usb_dev->cfg->irq.init); + + /* Select USBCLK source */ + RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_1Div5); + /* Enable the USB clock */ + RCC_APB1PeriphClockCmd(RCC_APB1Periph_USB, ENABLE); + + /* Update the USB serial number from the chip */ + uint8_t sn[25]; + PIOS_SYS_SerialNumberGet((char *)sn); + for (uint8_t i = 0; sn[i] != '\0' && (2 * i) < PIOS_USB_BOARD_StringSerial[0]; i++) { + PIOS_USB_BOARD_StringSerial[2 + 2 * i] = sn[i]; + } + + USB_Init(); + USB_SIL_Init(); + + *usb_id = (uint32_t) usb_dev; + + return 0; /* No error */ + +out_fail: + return(-1); +} + +/** + * This function is called by the USB driver on cable connection/disconnection + * \param[in] connected connection status (1 if connected) + * \return < 0 on errors + * \note Applications shouldn't call this function directly, instead please use \ref PIOS_COM layer functions + */ +int32_t PIOS_USB_ChangeConnectionState(uint32_t Connected) +{ + // In all cases: re-initialise USB HID driver + if (Connected) { + transfer_possible = 1; + + //TODO: Check SetEPRxValid(ENDP1); + +#if defined(USB_LED_ON) + USB_LED_ON; // turn the USB led on +#endif + } else { + // Cable disconnected: disable transfers + transfer_possible = 0; + +#if defined(USB_LED_OFF) + USB_LED_OFF; // turn the USB led off +#endif + } + + return 0; +} + +int32_t PIOS_USB_Reenumerate() +{ + /* Force USB reset and power-down (this will also release the USB pins for direct GPIO control) */ + _SetCNTR(CNTR_FRES | CNTR_PDWN); + + /* Using a "dirty" method to force a re-enumeration: */ + /* Force DPM (Pin PA12) low for ca. 10 mS before USB Tranceiver will be enabled */ + /* This overrules the external Pull-Up at PA12, and at least Windows & MacOS will enumerate again */ + GPIO_InitTypeDef GPIO_InitStructure; + GPIO_StructInit(&GPIO_InitStructure); + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_Init(GPIOA, &GPIO_InitStructure); + + PIOS_DELAY_WaitmS(50); + + /* Release power-down, still hold reset */ + _SetCNTR(CNTR_PDWN); + PIOS_DELAY_WaituS(5); + + /* CNTR_FRES = 0 */ + _SetCNTR(0); + + /* Clear pending interrupts */ + _SetISTR(0); + + /* Configure USB clock */ + /* USBCLK = PLLCLK / 1.5 */ + RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_1Div5); + /* Enable USB clock */ + RCC_APB1PeriphClockCmd(RCC_APB1Periph_USB, ENABLE); + + return 0; +} + +/** + * This function returns the connection status of the USB HID interface + * \return 1: interface available + * \return 0: interface not available + * \note Applications shouldn't call this function directly, instead please use \ref PIOS_COM layer functions + */ +bool PIOS_USB_CheckAvailable(uint8_t id) +{ + return (PIOS_USB_DETECT_GPIO_PORT->IDR & PIOS_USB_DETECT_GPIO_PIN) != 0 && transfer_possible ? 1 : 0; +} + +#endif + +/** + * @} + * @} + */ diff --git a/flight/PiOS/STM32F10x/pios_usb_cdc.c b/flight/PiOS/STM32F10x/pios_usb_cdc.c new file mode 100644 index 000000000..994c276ea --- /dev/null +++ b/flight/PiOS/STM32F10x/pios_usb_cdc.c @@ -0,0 +1,400 @@ +/** + ****************************************************************************** + * @addtogroup PIOS PIOS Core hardware abstraction layer + * @{ + * @addtogroup PIOS_USB_COM USB COM Functions + * @brief PIOS USB COM implementation for CDC interfaces + * @notes This implements a CDC Serial Port + * @{ + * + * @file pios_usb_com_cdc.c + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. + * @brief USB COM functions (STM32 dependent code) + * @see The GNU Public License (GPL) Version 3 + * + *****************************************************************************/ +/* + * 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 + */ + +/* Project Includes */ +#include "pios.h" + +#if defined(PIOS_INCLUDE_USB_CDC) + +#include "pios_usb.h" +#include "pios_usb_cdc_priv.h" +#include "pios_usb_board_data.h" /* PIOS_BOARD_*_DATA_LENGTH */ + +static void PIOS_USB_CDC_RegisterTxCallback(uint32_t usbcdc_id, pios_com_callback tx_out_cb, uint32_t context); +static void PIOS_USB_CDC_RegisterRxCallback(uint32_t usbcdc_id, pios_com_callback rx_in_cb, uint32_t context); +static void PIOS_USB_CDC_TxStart(uint32_t usbcdc_id, uint16_t tx_bytes_avail); +static void PIOS_USB_CDC_RxStart(uint32_t usbcdc_id, uint16_t rx_bytes_avail); + +const struct pios_com_driver pios_usb_cdc_com_driver = { + .tx_start = PIOS_USB_CDC_TxStart, + .rx_start = PIOS_USB_CDC_RxStart, + .bind_tx_cb = PIOS_USB_CDC_RegisterTxCallback, + .bind_rx_cb = PIOS_USB_CDC_RegisterRxCallback, +}; + +enum pios_usb_cdc_dev_magic { + PIOS_USB_CDC_DEV_MAGIC = 0xAABBCCDD, +}; + +struct pios_usb_cdc_dev { + enum pios_usb_cdc_dev_magic magic; + const struct pios_usb_cdc_cfg * cfg; + + uint32_t lower_id; + + pios_com_callback rx_in_cb; + uint32_t rx_in_context; + pios_com_callback tx_out_cb; + uint32_t tx_out_context; + + uint8_t rx_packet_buffer[PIOS_USB_BOARD_CDC_DATA_LENGTH]; + uint8_t tx_packet_buffer[PIOS_USB_BOARD_CDC_DATA_LENGTH]; + + uint32_t rx_dropped; + uint32_t rx_oversize; +}; + +static bool PIOS_USB_CDC_validate(struct pios_usb_cdc_dev * usb_cdc_dev) +{ + return (usb_cdc_dev->magic == PIOS_USB_CDC_DEV_MAGIC); +} + +#if defined(PIOS_INCLUDE_FREERTOS) +static struct pios_usb_cdc_dev * PIOS_USB_CDC_alloc(void) +{ + struct pios_usb_cdc_dev * usb_cdc_dev; + + usb_cdc_dev = (struct pios_usb_cdc_dev *)pvPortMalloc(sizeof(*usb_cdc_dev)); + if (!usb_cdc_dev) return(NULL); + + usb_cdc_dev->magic = PIOS_USB_CDC_DEV_MAGIC; + return(usb_cdc_dev); +} +#else +static struct pios_usb_cdc_dev pios_usb_cdc_devs[PIOS_USB_CDC_MAX_DEVS]; +static uint8_t pios_usb_cdc_num_devs; +static struct pios_usb_cdc_dev * PIOS_USB_CDC_alloc(void) +{ + struct pios_usb_cdc_dev * usb_cdc_dev; + + if (pios_usb_cdc_num_devs >= PIOS_USB_CDC_MAX_DEVS) { + return (NULL); + } + + usb_cdc_dev = &pios_usb_cdc_devs[pios_usb_cdc_num_devs++]; + usb_cdc_dev->magic = PIOS_USB_CDC_DEV_MAGIC; + + return (usb_cdc_dev); +} +#endif + +static void PIOS_USB_CDC_DATA_EP_IN_Callback(void); +static void PIOS_USB_CDC_DATA_EP_OUT_Callback(void); +static void PIOS_USB_CDC_CTRL_EP_IN_Callback(void); + +static uint32_t pios_usb_cdc_id; + +/* Need a better way to pull these in */ +extern void (*pEpInt_IN[7])(void); +extern void (*pEpInt_OUT[7])(void); + +int32_t PIOS_USB_CDC_Init(uint32_t * usbcdc_id, const struct pios_usb_cdc_cfg * cfg, uint32_t lower_id) +{ + PIOS_Assert(usbcdc_id); + PIOS_Assert(cfg); + + struct pios_usb_cdc_dev * usb_cdc_dev; + + usb_cdc_dev = (struct pios_usb_cdc_dev *) PIOS_USB_CDC_alloc(); + if (!usb_cdc_dev) goto out_fail; + + /* Bind the configuration to the device instance */ + usb_cdc_dev->cfg = cfg; + usb_cdc_dev->lower_id = lower_id; + + pios_usb_cdc_id = (uint32_t) usb_cdc_dev; + + /* Bind lower level callbacks into the USB infrastructure */ + pEpInt_OUT[cfg->ctrl_tx_ep - 1] = PIOS_USB_CDC_CTRL_EP_IN_Callback; + pEpInt_IN[cfg->data_tx_ep - 1] = PIOS_USB_CDC_DATA_EP_IN_Callback; + pEpInt_OUT[cfg->data_rx_ep - 1] = PIOS_USB_CDC_DATA_EP_OUT_Callback; + + *usbcdc_id = (uint32_t) usb_cdc_dev; + + return 0; + +out_fail: + return -1; +} + + + +static void PIOS_USB_CDC_RegisterRxCallback(uint32_t usbcdc_id, pios_com_callback rx_in_cb, uint32_t context) +{ + struct pios_usb_cdc_dev * usb_cdc_dev = (struct pios_usb_cdc_dev *)usbcdc_id; + + bool valid = PIOS_USB_CDC_validate(usb_cdc_dev); + PIOS_Assert(valid); + + /* + * Order is important in these assignments since ISR uses _cb + * field to determine if it's ok to dereference _cb and _context + */ + usb_cdc_dev->rx_in_context = context; + usb_cdc_dev->rx_in_cb = rx_in_cb; +} + +static void PIOS_USB_CDC_RegisterTxCallback(uint32_t usbcdc_id, pios_com_callback tx_out_cb, uint32_t context) +{ + struct pios_usb_cdc_dev * usb_cdc_dev = (struct pios_usb_cdc_dev *)usbcdc_id; + + bool valid = PIOS_USB_CDC_validate(usb_cdc_dev); + PIOS_Assert(valid); + + /* + * Order is important in these assignments since ISR uses _cb + * field to determine if it's ok to dereference _cb and _context + */ + usb_cdc_dev->tx_out_context = context; + usb_cdc_dev->tx_out_cb = tx_out_cb; +} + +static void PIOS_USB_CDC_RxStart(uint32_t usbcdc_id, uint16_t rx_bytes_avail) { + struct pios_usb_cdc_dev * usb_cdc_dev = (struct pios_usb_cdc_dev *)usbcdc_id; + + bool valid = PIOS_USB_CDC_validate(usb_cdc_dev); + PIOS_Assert(valid); + + if (!PIOS_USB_CheckAvailable(usb_cdc_dev->lower_id)) { + return; + } + + // If endpoint was stalled and there is now space make it valid + PIOS_IRQ_Disable(); + if ((GetEPRxStatus(usb_cdc_dev->cfg->data_rx_ep) != EP_RX_VALID) && + (rx_bytes_avail >= sizeof(usb_cdc_dev->rx_packet_buffer))) { + SetEPRxStatus(usb_cdc_dev->cfg->data_rx_ep, EP_RX_VALID); + } + PIOS_IRQ_Enable(); +} + +static void PIOS_USB_CDC_SendData(struct pios_usb_cdc_dev * usb_cdc_dev) +{ + uint16_t bytes_to_tx; + + if (!usb_cdc_dev->tx_out_cb) { + return; + } + + bool need_yield = false; + bytes_to_tx = (usb_cdc_dev->tx_out_cb)(usb_cdc_dev->tx_out_context, + usb_cdc_dev->tx_packet_buffer, + sizeof(usb_cdc_dev->tx_packet_buffer), + NULL, + &need_yield); + if (bytes_to_tx == 0) { + return; + } + + UserToPMABufferCopy(usb_cdc_dev->tx_packet_buffer, + GetEPTxAddr(usb_cdc_dev->cfg->data_tx_ep), + bytes_to_tx); + SetEPTxCount(usb_cdc_dev->cfg->data_tx_ep, bytes_to_tx); + SetEPTxValid(usb_cdc_dev->cfg->data_tx_ep); + +#if defined(PIOS_INCLUDE_FREERTOS) + if (need_yield) { + vPortYieldFromISR(); + } +#endif /* PIOS_INCLUDE_FREERTOS */ +} + +static void PIOS_USB_CDC_TxStart(uint32_t usbcdc_id, uint16_t tx_bytes_avail) +{ + struct pios_usb_cdc_dev * usb_cdc_dev = (struct pios_usb_cdc_dev *)usbcdc_id; + + bool valid = PIOS_USB_CDC_validate(usb_cdc_dev); + PIOS_Assert(valid); + + if (!PIOS_USB_CheckAvailable(usb_cdc_dev->lower_id)) { + return; + } + + if (GetEPTxStatus(usb_cdc_dev->cfg->data_tx_ep) == EP_TX_VALID) { + /* Endpoint is already transmitting */ + return; + } + + PIOS_USB_CDC_SendData(usb_cdc_dev); +} + +static void PIOS_USB_CDC_DATA_EP_IN_Callback(void) +{ + struct pios_usb_cdc_dev * usb_cdc_dev = (struct pios_usb_cdc_dev *)pios_usb_cdc_id; + + bool valid = PIOS_USB_CDC_validate(usb_cdc_dev); + PIOS_Assert(valid); + + PIOS_USB_CDC_SendData(usb_cdc_dev); +} + +static void PIOS_USB_CDC_DATA_EP_OUT_Callback(void) +{ + struct pios_usb_cdc_dev * usb_cdc_dev = (struct pios_usb_cdc_dev *)pios_usb_cdc_id; + + bool valid = PIOS_USB_CDC_validate(usb_cdc_dev); + PIOS_Assert(valid); + + uint32_t DataLength; + + /* Get the number of received data on the selected Endpoint */ + DataLength = GetEPRxCount(usb_cdc_dev->cfg->data_rx_ep); + if (DataLength > sizeof(usb_cdc_dev->rx_packet_buffer)) { + usb_cdc_dev->rx_oversize++; + DataLength = sizeof(usb_cdc_dev->rx_packet_buffer); + } + + /* Use the memory interface function to read from the selected endpoint */ + PMAToUserBufferCopy((uint8_t *) usb_cdc_dev->rx_packet_buffer, + GetEPRxAddr(usb_cdc_dev->cfg->data_rx_ep), + DataLength); + + if (!usb_cdc_dev->rx_in_cb) { + /* No Rx call back registered, disable the receiver */ + SetEPRxStatus(usb_cdc_dev->cfg->data_rx_ep, EP_RX_NAK); + return; + } + + uint16_t headroom; + bool need_yield = false; + uint16_t rc; + rc = (usb_cdc_dev->rx_in_cb)(usb_cdc_dev->rx_in_context, + usb_cdc_dev->rx_packet_buffer, + DataLength, + &headroom, + &need_yield); + + if (rc < DataLength) { + /* Lost bytes on rx */ + usb_cdc_dev->rx_dropped += (DataLength - rc); + } + + if (headroom >= sizeof(usb_cdc_dev->rx_packet_buffer)) { + /* We have room for a maximum length message */ + SetEPRxStatus(usb_cdc_dev->cfg->data_rx_ep, EP_RX_VALID); + } else { + /* Not enough room left for a message, apply backpressure */ + SetEPRxStatus(usb_cdc_dev->cfg->data_rx_ep, EP_RX_NAK); + } + +#if defined(PIOS_INCLUDE_FREERTOS) + if (need_yield) { + vPortYieldFromISR(); + } +#endif /* PIOS_INCLUDE_FREERTOS */ +} + +RESULT PIOS_USB_CDC_SetControlLineState(void) +{ + struct pios_usb_cdc_dev * usb_cdc_dev = (struct pios_usb_cdc_dev *)pios_usb_cdc_id; + + bool valid = PIOS_USB_CDC_validate(usb_cdc_dev); + PIOS_Assert(valid); + + static uint16_t control_line_state; + + uint8_t wValue0 = pInformation->USBwValue0; + uint8_t wValue1 = pInformation->USBwValue1; + + control_line_state = wValue1 << 8 | wValue0; + + return USB_SUCCESS; +} + +static struct usb_cdc_line_coding line_coding = { + .dwDTERate = htousbl(57600), + .bCharFormat = USB_CDC_LINE_CODING_STOP_1, + .bParityType = USB_CDC_LINE_CODING_PARITY_NONE, + .bDataBits = 8, +}; + +RESULT PIOS_USB_CDC_SetLineCoding(void) +{ + struct pios_usb_cdc_dev * usb_cdc_dev = (struct pios_usb_cdc_dev *)pios_usb_cdc_id; + + bool valid = PIOS_USB_CDC_validate(usb_cdc_dev); + PIOS_Assert(valid); + + return USB_SUCCESS; +} + +uint8_t *PIOS_USB_CDC_GetLineCoding(uint16_t Length) +{ + struct pios_usb_cdc_dev * usb_cdc_dev = (struct pios_usb_cdc_dev *)pios_usb_cdc_id; + + bool valid = PIOS_USB_CDC_validate(usb_cdc_dev); + PIOS_Assert(valid); + + if (Length == 0) { + pInformation->Ctrl_Info.Usb_wLength = sizeof(line_coding); + return NULL; + } else { + return ((uint8_t *) &line_coding); + } +} + +struct usb_cdc_serial_state_report uart_state = { + .bmRequestType = 0xA1, + .bNotification = USB_CDC_NOTIFICATION_SERIAL_STATE, + .wValue = 0, + .wIndex = htousbs(1), + .wLength = htousbs(2), + .bmUartState = htousbs(0), +}; + +static void PIOS_USB_CDC_CTRL_EP_IN_Callback(void) +{ + struct pios_usb_cdc_dev * usb_cdc_dev = (struct pios_usb_cdc_dev *)pios_usb_cdc_id; + + bool valid = PIOS_USB_CDC_validate(usb_cdc_dev); + PIOS_Assert(valid); + + /* Give back UART State Bitmap */ + /* UART State Bitmap + * 15-7: reserved + * 6: bOverRun overrun error + * 5: bParity parity error + * 4: bFraming framing error + * 3: bRingSignal RI + * 2: bBreak break reception + * 1: bTxCarrier DSR + * 0: bRxCarrier DCD + */ + uart_state.bmUartState = htousbs(0x0003); + + UserToPMABufferCopy((uint8_t *) &uart_state, + GetEPTxAddr(usb_cdc_dev->cfg->data_tx_ep), + sizeof(uart_state)); + SetEPTxCount(usb_cdc_dev->cfg->data_tx_ep, PIOS_USB_BOARD_CDC_MGMT_LENGTH); + SetEPTxValid(usb_cdc_dev->cfg->data_tx_ep); +} + +#endif /* PIOS_INCLUDE_USB_CDC */ diff --git a/flight/PiOS/STM32F10x/pios_usb_com.c b/flight/PiOS/STM32F10x/pios_usb_com.c deleted file mode 100644 index 5795d967e..000000000 --- a/flight/PiOS/STM32F10x/pios_usb_com.c +++ /dev/null @@ -1,606 +0,0 @@ -/** - ****************************************************************************** - * @addtogroup PIOS PIOS Core hardware abstraction layer - * @{ - * @addtogroup PIOS_USB_COM USB COM Functions - * @brief PIOS USB COM implementation - * @notes This implements both a simple HID device and a CDC Serial Port - * @{ - * - * @file pios_usb_com.c - * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. - * @brief USB COM functions (STM32 dependent code) - * @see The GNU Public License (GPL) Version 3 - * - *****************************************************************************/ -/* - * 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 - */ - -/* Project Includes */ -#include "pios.h" - -#if defined(PIOS_INCLUDE_USB_COM) - -#include "pios_usb.h" -#include "usb_lib.h" -#include "pios_usb_com_priv.h" - -static void PIOS_USB_COM_RegisterTxCallback(uint32_t usbcom_id, pios_com_callback tx_out_cb, uint32_t context); -static void PIOS_USB_COM_RegisterRxCallback(uint32_t usbcom_id, pios_com_callback rx_in_cb, uint32_t context); - -static void PIOS_USB_COM_HID_TxStart(uint32_t usbcom_id, uint16_t tx_bytes_avail); -static void PIOS_USB_COM_HID_RxStart(uint32_t usbcom_id, uint16_t rx_bytes_avail); - -const struct pios_com_driver pios_usb_hid_com_driver = { - .tx_start = PIOS_USB_COM_HID_TxStart, - .rx_start = PIOS_USB_COM_HID_RxStart, - .bind_tx_cb = PIOS_USB_COM_RegisterTxCallback, - .bind_rx_cb = PIOS_USB_COM_RegisterRxCallback, -}; - -#if defined(PIOS_INCLUDE_USB_COM_CDC) - -static void PIOS_USB_COM_CDC_TxStart(uint32_t usbcom_id, uint16_t tx_bytes_avail); -static void PIOS_USB_COM_CDC_RxStart(uint32_t usbcom_id, uint16_t rx_bytes_avail); - -const struct pios_com_driver pios_usb_cdc_com_driver = { - .tx_start = PIOS_USB_COM_CDC_TxStart, - .rx_start = PIOS_USB_COM_CDC_RxStart, - .bind_tx_cb = PIOS_USB_COM_RegisterTxCallback, - .bind_rx_cb = PIOS_USB_COM_RegisterRxCallback, -}; -#endif /* PIOS_INCLUDE_USB_COM_CDC */ - -enum pios_usb_com_dev_magic { - PIOS_USB_COM_DEV_MAGIC = 0xAABBCCDD, -}; - -struct pios_usb_com_dev { - enum pios_usb_com_dev_magic magic; - const struct pios_usb_com_cfg * cfg; - - uint32_t lower_id; - - pios_com_callback rx_in_cb; - uint32_t rx_in_context; - pios_com_callback tx_out_cb; - uint32_t tx_out_context; - - uint8_t rx_packet_buffer[PIOS_USB_COM_DATA_LENGTH + 2]; - uint8_t tx_packet_buffer[PIOS_USB_COM_DATA_LENGTH + 2]; - - uint32_t rx_dropped; - uint32_t rx_oversize; -}; - -static bool PIOS_USB_COM_validate(struct pios_usb_com_dev * usb_com_dev) -{ - return (usb_com_dev->magic == PIOS_USB_COM_DEV_MAGIC); -} - -#if defined(PIOS_INCLUDE_FREERTOS) -static struct pios_usb_com_dev * PIOS_USB_COM_alloc(void) -{ - struct pios_usb_com_dev * usb_com_dev; - - usb_com_dev = (struct pios_usb_com_dev *)pvPortMalloc(sizeof(*usb_com_dev)); - if (!usb_com_dev) return(NULL); - - usb_com_dev->magic = PIOS_USB_COM_DEV_MAGIC; - return(usb_com_dev); -} -#else -static struct pios_usb_com_dev pios_usb_com_devs[PIOS_USB_COM_MAX_DEVS]; -static uint8_t pios_usb_com_num_devs; -static struct pios_usb_com_dev * PIOS_USB_COM_alloc(void) -{ - struct pios_usb_com_dev * usb_com_dev; - - if (pios_usb_com_num_devs >= PIOS_USB_COM_MAX_DEVS) { - return (NULL); - } - - usb_com_dev = &pios_usb_com_devs[pios_usb_com_num_devs++]; - usb_com_dev->magic = PIOS_USB_COM_DEV_MAGIC; - - return (usb_com_dev); -} -#endif - -static void PIOS_USB_COM_HID_EP_IN_Callback(void); -static void PIOS_USB_COM_HID_EP_OUT_Callback(void); - -static uint32_t pios_usb_com_hid_id; - -#if defined(PIOS_INCLUDE_USB_COM_CDC) - -static void PIOS_USB_COM_CDC_DATA_EP_IN_Callback(void); -static void PIOS_USB_COM_CDC_DATA_EP_OUT_Callback(void); -static void PIOS_USB_COM_CDC_CTRL_EP_IN_Callback(void); - -static uint32_t pios_usb_com_cdc_id; - -#endif /* PIOS_INCLUDE_USB_COM_CDC */ - -int32_t PIOS_USB_COM_Init(uint32_t * usbcom_id, const struct pios_usb_com_cfg * cfg, uint32_t lower_id) -{ - PIOS_Assert(usbcom_id); - PIOS_Assert(cfg); - - struct pios_usb_com_dev * usb_com_dev; - - usb_com_dev = (struct pios_usb_com_dev *) PIOS_USB_COM_alloc(); - if (!usb_com_dev) goto out_fail; - - /* Bind the configuration to the device instance */ - usb_com_dev->cfg = cfg; - usb_com_dev->lower_id = lower_id; - - switch (cfg->type) { -#if defined(PIOS_INCLUDE_USB_COM_CDC) - case PIOS_USB_COM_CDC: - pios_usb_com_cdc_id = (uint32_t) usb_com_dev; - pEpInt_OUT[cfg->ctrl_tx_ep - 1] = PIOS_USB_COM_CDC_CTRL_EP_IN_Callback; - pEpInt_IN[cfg->data_tx_ep - 1] = PIOS_USB_COM_CDC_DATA_EP_IN_Callback; - pEpInt_OUT[cfg->data_rx_ep - 1] = PIOS_USB_COM_CDC_DATA_EP_OUT_Callback; - break; -#endif /* PIOS_INCLUDE_USB_COM_CDC */ - case PIOS_USB_COM_HID: - pios_usb_com_hid_id = (uint32_t) usb_com_dev; - pEpInt_IN[cfg->data_tx_ep - 1] = PIOS_USB_COM_HID_EP_IN_Callback; - pEpInt_OUT[cfg->data_rx_ep - 1] = PIOS_USB_COM_HID_EP_OUT_Callback; - break; - default: - PIOS_Assert(0); - } - - *usbcom_id = (uint32_t) usb_com_dev; - - return 0; - -out_fail: - return -1; -} - - -static void PIOS_USB_COM_RegisterRxCallback(uint32_t usbcom_id, pios_com_callback rx_in_cb, uint32_t context) -{ - struct pios_usb_com_dev * usb_com_dev = (struct pios_usb_com_dev *)usbcom_id; - - bool valid = PIOS_USB_COM_validate(usb_com_dev); - PIOS_Assert(valid); - - /* - * Order is important in these assignments since ISR uses _cb - * field to determine if it's ok to dereference _cb and _context - */ - usb_com_dev->rx_in_context = context; - usb_com_dev->rx_in_cb = rx_in_cb; -} - -static void PIOS_USB_COM_RegisterTxCallback(uint32_t usbcom_id, pios_com_callback tx_out_cb, uint32_t context) -{ - struct pios_usb_com_dev * usb_com_dev = (struct pios_usb_com_dev *)usbcom_id; - - bool valid = PIOS_USB_COM_validate(usb_com_dev); - PIOS_Assert(valid); - - /* - * Order is important in these assignments since ISR uses _cb - * field to determine if it's ok to dereference _cb and _context - */ - usb_com_dev->tx_out_context = context; - usb_com_dev->tx_out_cb = tx_out_cb; -} - -static void PIOS_USB_COM_HID_SendReport(struct pios_usb_com_dev * usb_com_dev) -{ - uint16_t bytes_to_tx; - - if (!usb_com_dev->tx_out_cb) { - return; - } - - bool need_yield = false; -#ifdef USB_HID - bytes_to_tx = (usb_com_dev->tx_out_cb)(usb_com_dev->tx_out_context, - &usb_com_dev->tx_packet_buffer[1], - sizeof(usb_com_dev->tx_packet_buffer)-1, - NULL, - &need_yield); -#else - bytes_to_tx = (usb_com_dev->tx_out_cb)(usb_com_dev->tx_out_context, - &usb_com_dev->tx_packet_buffer[2], - sizeof(usb_com_dev->tx_packet_buffer)-2, - NULL, - &need_yield); -#endif - if (bytes_to_tx == 0) { - return; - } - - /* Always set type as report ID */ - usb_com_dev->tx_packet_buffer[0] = 1; - -#ifdef USB_HID - UserToPMABufferCopy(usb_com_dev->tx_packet_buffer, - GetEPTxAddr(usb_com_dev->cfg->data_tx_ep), - bytes_to_tx + 1); -#else - usb_com_dev->tx_packet_buffer[1] = bytes_to_tx; - UserToPMABufferCopy(usb_com_dev->tx_packet_buffer, - GetEPTxAddr(usb_com_dev->cfg->data_tx_ep), - bytes_to_tx + 2); -#endif - /* Is this correct? Why do we always send the whole buffer? */ - SetEPTxCount(usb_com_dev->cfg->data_tx_ep, sizeof(usb_com_dev->tx_packet_buffer)); - SetEPTxValid(usb_com_dev->cfg->data_tx_ep); - -#if defined(PIOS_INCLUDE_FREERTOS) - if (need_yield) { - vPortYieldFromISR(); - } -#endif /* PIOS_INCLUDE_FREERTOS */ -} - -static void PIOS_USB_COM_HID_RxStart(uint32_t usbcom_id, uint16_t rx_bytes_avail) { - struct pios_usb_com_dev * usb_com_dev = (struct pios_usb_com_dev *)usbcom_id; - - bool valid = PIOS_USB_COM_validate(usb_com_dev); - PIOS_Assert(valid); - - if (!PIOS_USB_HID_CheckAvailable(usb_com_dev->lower_id)) { - return; - } - - // If endpoint was stalled and there is now space make it valid - PIOS_IRQ_Disable(); - if ((GetEPRxStatus(usb_com_dev->cfg->data_rx_ep) != EP_RX_VALID) && - (rx_bytes_avail >= PIOS_USB_COM_DATA_LENGTH)) { - SetEPRxStatus(usb_com_dev->cfg->data_rx_ep, EP_RX_VALID); - } - PIOS_IRQ_Enable(); -} - -static void PIOS_USB_COM_HID_TxStart(uint32_t usbcom_id, uint16_t tx_bytes_avail) -{ - struct pios_usb_com_dev * usb_com_dev = (struct pios_usb_com_dev *)usbcom_id; - - bool valid = PIOS_USB_COM_validate(usb_com_dev); - PIOS_Assert(valid); - - if (!PIOS_USB_HID_CheckAvailable(usb_com_dev->lower_id)) { - return; - } - - if (GetEPTxStatus(usb_com_dev->cfg->data_tx_ep) == EP_TX_VALID) { - /* Endpoint is already transmitting */ - return; - } - - PIOS_USB_COM_HID_SendReport(usb_com_dev); -} - -/** - * @brief Callback used to indicate a transmission from device INto host completed - * Checks if any data remains, pads it into HID packet and sends. - */ -static void PIOS_USB_COM_HID_EP_IN_Callback(void) -{ - struct pios_usb_com_dev * usb_com_dev = (struct pios_usb_com_dev *)pios_usb_com_hid_id; - - bool valid = PIOS_USB_COM_validate(usb_com_dev); - PIOS_Assert(valid); - - if (!PIOS_USB_HID_CheckAvailable(usb_com_dev->lower_id)) { - return; - } - - PIOS_USB_COM_HID_SendReport(usb_com_dev); -} - -/** - * EP1 OUT Callback Routine - */ -static void PIOS_USB_COM_HID_EP_OUT_Callback(void) -{ - struct pios_usb_com_dev * usb_com_dev = (struct pios_usb_com_dev *)pios_usb_com_hid_id; - - bool valid = PIOS_USB_COM_validate(usb_com_dev); - PIOS_Assert(valid); - - uint32_t DataLength = 0; - - /* Read received data (63 bytes) */ - /* Get the number of received data on the selected Endpoint */ - DataLength = GetEPRxCount(usb_com_dev->cfg->data_rx_ep); - if (DataLength > sizeof(usb_com_dev->rx_packet_buffer)) { - DataLength = sizeof(usb_com_dev->rx_packet_buffer); - } - - /* Use the memory interface function to read from the selected endpoint */ - PMAToUserBufferCopy((uint8_t *) usb_com_dev->rx_packet_buffer, - GetEPRxAddr(usb_com_dev->cfg->data_rx_ep), - DataLength); - - if (!usb_com_dev->rx_in_cb) { - /* No Rx call back registered, disable the receiver */ - SetEPRxStatus(usb_com_dev->cfg->data_rx_ep, EP_RX_NAK); - return; - } - - /* The first byte is report ID (not checked), the second byte is the valid data length */ - uint16_t headroom; - bool need_yield = false; -#ifdef USB_HID - (usb_com_dev->rx_in_cb)(usb_com_dev->rx_in_context, - &usb_com_dev->rx_packet_buffer[1], - sizeof(usb_com_dev->rx_packet_buffer)-1, - &headroom, - &need_yield); -#else - (usb_com_dev->rx_in_cb)(usb_com_dev->rx_in_context, - &usb_com_dev->rx_packet_buffer[2], - usb_com_dev->rx_packet_buffer[1], - &headroom, - &need_yield); -#endif - if (headroom >= PIOS_USB_COM_DATA_LENGTH) { - /* We have room for a maximum length message */ - SetEPRxStatus(usb_com_dev->cfg->data_rx_ep, EP_RX_VALID); - } else { - /* Not enough room left for a message, apply backpressure */ - SetEPRxStatus(usb_com_dev->cfg->data_rx_ep, EP_RX_NAK); - } - -#if defined(PIOS_INCLUDE_FREERTOS) - if (need_yield) { - vPortYieldFromISR(); - } -#endif /* PIOS_INCLUDE_FREERTOS */ -} - -#if defined(PIOS_INCLUDE_USB_COM_CDC) - -static void PIOS_USB_COM_CDC_RxStart(uint32_t usbcom_id, uint16_t rx_bytes_avail) { - struct pios_usb_com_dev * usb_com_dev = (struct pios_usb_com_dev *)usbcom_id; - - bool valid = PIOS_USB_COM_validate(usb_com_dev); - PIOS_Assert(valid); - - if (!PIOS_USB_HID_CheckAvailable(usb_com_dev->lower_id)) { - return; - } - - // If endpoint was stalled and there is now space make it valid - PIOS_IRQ_Disable(); - if ((GetEPRxStatus(usb_com_dev->cfg->data_rx_ep) != EP_RX_VALID) && - (rx_bytes_avail >= sizeof(usb_com_dev->rx_packet_buffer))) { - SetEPRxStatus(usb_com_dev->cfg->data_rx_ep, EP_RX_VALID); - } - PIOS_IRQ_Enable(); -} - -static void PIOS_USB_COM_CDC_SendData(struct pios_usb_com_dev * usb_com_dev) -{ - uint16_t bytes_to_tx; - - if (!usb_com_dev->tx_out_cb) { - return; - } - - bool need_yield = false; - bytes_to_tx = (usb_com_dev->tx_out_cb)(usb_com_dev->tx_out_context, - usb_com_dev->tx_packet_buffer, - sizeof(usb_com_dev->tx_packet_buffer), - NULL, - &need_yield); - if (bytes_to_tx == 0) { - return; - } - - UserToPMABufferCopy(usb_com_dev->tx_packet_buffer, - GetEPTxAddr(usb_com_dev->cfg->data_tx_ep), - bytes_to_tx); - SetEPTxCount(usb_com_dev->cfg->data_tx_ep, bytes_to_tx); - SetEPTxValid(usb_com_dev->cfg->data_tx_ep); - -#if defined(PIOS_INCLUDE_FREERTOS) - if (need_yield) { - vPortYieldFromISR(); - } -#endif /* PIOS_INCLUDE_FREERTOS */ -} - -static void PIOS_USB_COM_CDC_TxStart(uint32_t usbcom_id, uint16_t tx_bytes_avail) -{ - struct pios_usb_com_dev * usb_com_dev = (struct pios_usb_com_dev *)usbcom_id; - - bool valid = PIOS_USB_COM_validate(usb_com_dev); - PIOS_Assert(valid); - - if (!PIOS_USB_HID_CheckAvailable(usb_com_dev->lower_id)) { - return; - } - - if (GetEPTxStatus(usb_com_dev->cfg->data_tx_ep) == EP_TX_VALID) { - /* Endpoint is already transmitting */ - return; - } - - PIOS_USB_COM_CDC_SendData(usb_com_dev); -} - -static void PIOS_USB_COM_CDC_DATA_EP_IN_Callback(void) -{ - struct pios_usb_com_dev * usb_com_dev = (struct pios_usb_com_dev *)pios_usb_com_cdc_id; - - bool valid = PIOS_USB_COM_validate(usb_com_dev); - PIOS_Assert(valid); - - PIOS_USB_COM_CDC_SendData(usb_com_dev); -} - -static void PIOS_USB_COM_CDC_DATA_EP_OUT_Callback(void) -{ - struct pios_usb_com_dev * usb_com_dev = (struct pios_usb_com_dev *)pios_usb_com_cdc_id; - - bool valid = PIOS_USB_COM_validate(usb_com_dev); - PIOS_Assert(valid); - - uint32_t DataLength = 0; - - /* Get the number of received data on the selected Endpoint */ - DataLength = GetEPRxCount(usb_com_dev->cfg->data_rx_ep); - if (DataLength > sizeof(usb_com_dev->rx_packet_buffer)) { - usb_com_dev->rx_oversize++; - DataLength = sizeof(usb_com_dev->rx_packet_buffer); - } - - /* Use the memory interface function to read from the selected endpoint */ - PMAToUserBufferCopy((uint8_t *) usb_com_dev->rx_packet_buffer, - GetEPRxAddr(usb_com_dev->cfg->data_rx_ep), - DataLength); - - if (!usb_com_dev->rx_in_cb) { - /* No Rx call back registered, disable the receiver */ - SetEPRxStatus(usb_com_dev->cfg->data_rx_ep, EP_RX_NAK); - return; - } - - uint16_t headroom; - bool need_yield = false; - uint16_t rc; - rc = (usb_com_dev->rx_in_cb)(usb_com_dev->rx_in_context, - usb_com_dev->rx_packet_buffer, - DataLength, - &headroom, - &need_yield); - - if (rc < DataLength) { - /* Lost bytes on rx */ - usb_com_dev->rx_dropped += (DataLength - rc); - } - - if (headroom >= sizeof(usb_com_dev->rx_packet_buffer)) { - /* We have room for a maximum length message */ - SetEPRxStatus(usb_com_dev->cfg->data_rx_ep, EP_RX_VALID); - } else { - /* Not enough room left for a message, apply backpressure */ - SetEPRxStatus(usb_com_dev->cfg->data_rx_ep, EP_RX_NAK); - } - -#if defined(PIOS_INCLUDE_FREERTOS) - if (need_yield) { - vPortYieldFromISR(); - } -#endif /* PIOS_INCLUDE_FREERTOS */ -} - -RESULT PIOS_CDC_SetControlLineState(void) -{ - struct pios_usb_com_dev * usb_com_dev = (struct pios_usb_com_dev *)pios_usb_com_cdc_id; - - bool valid = PIOS_USB_COM_validate(usb_com_dev); - PIOS_Assert(valid); - - static uint16_t control_line_state; - - uint8_t wValue0 = pInformation->USBwValue0; - uint8_t wValue1 = pInformation->USBwValue1; - - control_line_state = wValue1 << 8 | wValue0; - - return USB_SUCCESS; -} - -static uint8_t line_coding[] = { - 0x00, 0xE1, 0x00, 0x00, /* 57600bps */ - 0x00, /* 1 stop bit */ - 0x00, /* Even parity */ - 0x08, /* 8 data bits */ -}; - -RESULT PIOS_CDC_SetLineCoding(void) -{ - struct pios_usb_com_dev * usb_com_dev = (struct pios_usb_com_dev *)pios_usb_com_cdc_id; - - bool valid = PIOS_USB_COM_validate(usb_com_dev); - PIOS_Assert(valid); - - return USB_SUCCESS; -} - -uint8_t *PIOS_CDC_GetLineCoding(uint16_t Length) -{ - struct pios_usb_com_dev * usb_com_dev = (struct pios_usb_com_dev *)pios_usb_com_cdc_id; - - bool valid = PIOS_USB_COM_validate(usb_com_dev); - PIOS_Assert(valid); - - if (Length == 0) { - pInformation->Ctrl_Info.Usb_wLength = sizeof(line_coding); - return NULL; - } else { - return (line_coding); - } -} - -static uint8_t serial_state[] = { - 0xA1, /* bmRequestType */ - 0x20, /* bNotification (Serial State) */ - 0x00, /* wValue */ - 0x00, - 0x01, /* wIndex (Interface #, LSB first) */ - 0x00, - 0x02, /* wLength (Data length) */ - 0x00, - - 0x00, /* USART State Bitmap (LSB first) */ - 0x00, -}; - -static void PIOS_USB_COM_CDC_CTRL_EP_IN_Callback(void) -{ - struct pios_usb_com_dev * usb_com_dev = (struct pios_usb_com_dev *)pios_usb_com_cdc_id; - - bool valid = PIOS_USB_COM_validate(usb_com_dev); - PIOS_Assert(valid); - - /* Give back UART State Bitmap */ - /* UART State Bitmap - * 15-7: reserved - * 6: bOverRun overrun error - * 5: bParity parity error - * 4: bFraming framing error - * 3: bRingSignal RI - * 2: bBreak break reception - * 1: bTxCarrier DSR - * 0: bRxCarrier DCD - */ - serial_state[8] = 0x03; - serial_state[9] = 0x00; - - UserToPMABufferCopy(serial_state, - GetEPTxAddr(usb_com_dev->cfg->data_tx_ep), - sizeof(serial_state)); - SetEPTxCount(usb_com_dev->cfg->data_tx_ep, PIOS_USB_COM_DATA_LENGTH + 2); - SetEPTxValid(usb_com_dev->cfg->data_tx_ep); -} - -#endif /* PIOS_INCLUDE_USB_COM_CDC */ - -#endif /* PIOS_INCLUDE_USB_COM */ diff --git a/flight/PiOS/STM32F10x/pios_usb_hid.c b/flight/PiOS/STM32F10x/pios_usb_hid.c index 99d709a99..11eb988c1 100644 --- a/flight/PiOS/STM32F10x/pios_usb_hid.c +++ b/flight/PiOS/STM32F10x/pios_usb_hid.c @@ -2,16 +2,14 @@ ****************************************************************************** * @addtogroup PIOS PIOS Core hardware abstraction layer * @{ - * @addtogroup PIOS_USB_HID USB HID Functions - * @brief PIOS USB HID implementation - * @notes This implements a very simple HID device with a simple data in - * and data out endpoints. + * @addtogroup PIOS_USB_HID USB COM Functions + * @brief PIOS USB COM implementation for HID interfaces + * @notes This implements serial emulation over HID reports * @{ * * @file pios_usb_hid.c * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. - * Parts by Thorsten Klose (tk@midibox.org) - * @brief USB HID functions (STM32 dependent code) + * @brief USB COM functions (STM32 dependent code) * @see The GNU Public License (GPL) Version 3 * *****************************************************************************/ @@ -33,195 +31,316 @@ /* Project Includes */ #include "pios.h" -#include "usb_lib.h" -#include "pios_usb_hid_desc.h" -#include "stm32f10x.h" - -#include "pios_usb_hid_priv.h" #if defined(PIOS_INCLUDE_USB_HID) -/* Rx/Tx status */ -static uint8_t transfer_possible = 0; +#include "pios_usb.h" +#include "pios_usb_hid_priv.h" +#include "pios_usb_board_data.h" /* PIOS_BOARD_*_DATA_LENGTH */ -enum pios_usb_dev_magic { - PIOS_USB_DEV_MAGIC = 0x17365904, +static void PIOS_USB_HID_RegisterTxCallback(uint32_t usbhid_id, pios_com_callback tx_out_cb, uint32_t context); +static void PIOS_USB_HID_RegisterRxCallback(uint32_t usbhid_id, pios_com_callback rx_in_cb, uint32_t context); +static void PIOS_USB_HID_TxStart(uint32_t usbhid_id, uint16_t tx_bytes_avail); +static void PIOS_USB_HID_RxStart(uint32_t usbhid_id, uint16_t rx_bytes_avail); + +const struct pios_com_driver pios_usb_hid_com_driver = { + .tx_start = PIOS_USB_HID_TxStart, + .rx_start = PIOS_USB_HID_RxStart, + .bind_tx_cb = PIOS_USB_HID_RegisterTxCallback, + .bind_rx_cb = PIOS_USB_HID_RegisterRxCallback, }; -struct pios_usb_dev { - enum pios_usb_dev_magic magic; - const struct pios_usb_cfg * cfg; +enum pios_usb_hid_dev_magic { + PIOS_USB_HID_DEV_MAGIC = 0xAA00BB00, }; -#if 0 -static bool PIOS_USB_validate(struct pios_usb_dev * usb_dev) +struct pios_usb_hid_dev { + enum pios_usb_hid_dev_magic magic; + const struct pios_usb_hid_cfg * cfg; + + uint32_t lower_id; + + pios_com_callback rx_in_cb; + uint32_t rx_in_context; + pios_com_callback tx_out_cb; + uint32_t tx_out_context; + + uint8_t rx_packet_buffer[PIOS_USB_BOARD_HID_DATA_LENGTH]; + uint8_t tx_packet_buffer[PIOS_USB_BOARD_HID_DATA_LENGTH]; + + uint32_t rx_dropped; + uint32_t rx_oversize; +}; + +static bool PIOS_USB_HID_validate(struct pios_usb_hid_dev * usb_hid_dev) { - return (usb_dev->magic == PIOS_USB_DEV_MAGIC); + return (usb_hid_dev->magic == PIOS_USB_HID_DEV_MAGIC); } -#endif #if defined(PIOS_INCLUDE_FREERTOS) -static struct pios_usb_dev * PIOS_USB_alloc(void) +static struct pios_usb_hid_dev * PIOS_USB_HID_alloc(void) { - struct pios_usb_dev * usb_dev; + struct pios_usb_hid_dev * usb_hid_dev; - usb_dev = (struct pios_usb_dev *)pvPortMalloc(sizeof(*usb_dev)); - if (!usb_dev) return(NULL); + usb_hid_dev = (struct pios_usb_hid_dev *)pvPortMalloc(sizeof(*usb_hid_dev)); + if (!usb_hid_dev) return(NULL); - usb_dev->magic = PIOS_USB_DEV_MAGIC; - return(usb_dev); + usb_hid_dev->magic = PIOS_USB_HID_DEV_MAGIC; + return(usb_hid_dev); } #else -static struct pios_usb_dev pios_usb_devs[PIOS_USB_MAX_DEVS]; -static uint8_t pios_usb_num_devs; -static struct pios_usb_dev * PIOS_USB_alloc(void) +static struct pios_usb_hid_dev pios_usb_hid_devs[PIOS_USB_HID_MAX_DEVS]; +static uint8_t pios_usb_hid_num_devs; +static struct pios_usb_hid_dev * PIOS_USB_HID_alloc(void) { - struct pios_usb_dev * usb_dev; + struct pios_usb_hid_dev * usb_hid_dev; - if (pios_usb_num_devs >= PIOS_USB_MAX_DEVS) { + if (pios_usb_hid_num_devs >= PIOS_USB_HID_MAX_DEVS) { return (NULL); } - usb_dev = &pios_usb_devs[pios_usb_num_devs++]; - usb_dev->magic = PIOS_USB_DEV_MAGIC; + usb_hid_dev = &pios_usb_hid_devs[pios_usb_hid_num_devs++]; + usb_hid_dev->magic = PIOS_USB_HID_DEV_MAGIC; - return (usb_dev); + return (usb_hid_dev); } #endif +static void PIOS_USB_HID_EP_IN_Callback(void); +static void PIOS_USB_HID_EP_OUT_Callback(void); -/** - * Initialises USB COM layer - * \return < 0 if initialisation failed - * \note Applications shouldn't call this function directly, instead please use \ref PIOS_COM layer functions - */ -static uint32_t pios_usb_com_id; -int32_t PIOS_USB_Init(uint32_t * usb_id, const struct pios_usb_cfg * cfg) +static uint32_t pios_usb_hid_id; + +/* Need a better way to pull these in */ +extern void (*pEpInt_IN[7])(void); +extern void (*pEpInt_OUT[7])(void); + +int32_t PIOS_USB_HID_Init(uint32_t * usbhid_id, const struct pios_usb_hid_cfg * cfg, uint32_t lower_id) { - PIOS_Assert(usb_id); + PIOS_Assert(usbhid_id); PIOS_Assert(cfg); - struct pios_usb_dev * usb_dev; + struct pios_usb_hid_dev * usb_hid_dev; - usb_dev = (struct pios_usb_dev *) PIOS_USB_alloc(); - if (!usb_dev) goto out_fail; + usb_hid_dev = (struct pios_usb_hid_dev *) PIOS_USB_HID_alloc(); + if (!usb_hid_dev) goto out_fail; /* Bind the configuration to the device instance */ - usb_dev->cfg = cfg; + usb_hid_dev->cfg = cfg; + usb_hid_dev->lower_id = lower_id; - PIOS_USB_HID_Reenumerate(); + pios_usb_hid_id = (uint32_t) usb_hid_dev; - /* - * This is a horrible hack to make this available to - * the interrupt callbacks. This should go away ASAP. - */ - pios_usb_com_id = (uint32_t) usb_dev; + /* Bind lower level callbacks into the USB infrastructure */ + pEpInt_IN[cfg->data_tx_ep - 1] = PIOS_USB_HID_EP_IN_Callback; + pEpInt_OUT[cfg->data_rx_ep - 1] = PIOS_USB_HID_EP_OUT_Callback; - /* Enable the USB Interrupts */ - NVIC_Init(&usb_dev->cfg->irq.init); + *usbhid_id = (uint32_t) usb_hid_dev; - /* Select USBCLK source */ - RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_1Div5); - /* Enable the USB clock */ - RCC_APB1PeriphClockCmd(RCC_APB1Periph_USB, ENABLE); - - /* Update the USB serial number from the chip */ - uint8_t sn[25]; - PIOS_SYS_SerialNumberGet((char *)sn); - for (uint8_t i = 0; sn[i] != '\0' && (2 * i) < PIOS_HID_StringSerial[0]; i++) { - PIOS_HID_StringSerial[2 + 2 * i] = sn[i]; - } - - USB_Init(); - USB_SIL_Init(); - - *usb_id = (uint32_t) usb_dev; - - return 0; /* No error */ + return 0; out_fail: - return(-1); + return -1; } -/** - * This function is called by the USB driver on cable connection/disconnection - * \param[in] connected connection status (1 if connected) - * \return < 0 on errors - * \note Applications shouldn't call this function directly, instead please use \ref PIOS_COM layer functions - */ -int32_t PIOS_USB_HID_ChangeConnectionState(uint32_t Connected) + + + +static void PIOS_USB_HID_SendReport(struct pios_usb_hid_dev * usb_hid_dev) { - // In all cases: re-initialise USB HID driver - if (Connected) { - transfer_possible = 1; + uint16_t bytes_to_tx; - //TODO: Check SetEPRxValid(ENDP1); - -#if defined(USB_LED_ON) - USB_LED_ON; // turn the USB led on -#endif - } else { - // Cable disconnected: disable transfers - transfer_possible = 0; - -#if defined(USB_LED_OFF) - USB_LED_OFF; // turn the USB led off -#endif + if (!usb_hid_dev->tx_out_cb) { + return; } - return 0; -} - -int32_t PIOS_USB_HID_Reenumerate() -{ - /* Force USB reset and power-down (this will also release the USB pins for direct GPIO control) */ - _SetCNTR(CNTR_FRES | CNTR_PDWN); - - /* Using a "dirty" method to force a re-enumeration: */ - /* Force DPM (Pin PA12) low for ca. 10 mS before USB Tranceiver will be enabled */ - /* This overrules the external Pull-Up at PA12, and at least Windows & MacOS will enumerate again */ - GPIO_InitTypeDef GPIO_InitStructure; - GPIO_StructInit(&GPIO_InitStructure); - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; - GPIO_Init(GPIOA, &GPIO_InitStructure); - - PIOS_DELAY_WaitmS(50); - - /* Release power-down, still hold reset */ - _SetCNTR(CNTR_PDWN); - PIOS_DELAY_WaituS(5); - - /* CNTR_FRES = 0 */ - _SetCNTR(0); - - /* Clear pending interrupts */ - _SetISTR(0); - - /* Configure USB clock */ - /* USBCLK = PLLCLK / 1.5 */ - RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_1Div5); - /* Enable USB clock */ - RCC_APB1PeriphClockCmd(RCC_APB1Periph_USB, ENABLE); - - return 0; -} - -/** - * This function returns the connection status of the USB HID interface - * \return 1: interface available - * \return 0: interface not available - * \note Applications shouldn't call this function directly, instead please use \ref PIOS_COM layer functions - */ -bool PIOS_USB_HID_CheckAvailable(uint8_t id) -{ - return (PIOS_USB_DETECT_GPIO_PORT->IDR & PIOS_USB_DETECT_GPIO_PIN) != 0 && transfer_possible ? 1 : 0; -} - + bool need_yield = false; +#ifdef PIOS_USB_BOARD_BL_HID_HAS_NO_LENGTH_BYTE + bytes_to_tx = (usb_hid_dev->tx_out_cb)(usb_hid_dev->tx_out_context, + &usb_hid_dev->tx_packet_buffer[1], + sizeof(usb_hid_dev->tx_packet_buffer)-1, + NULL, + &need_yield); +#else + bytes_to_tx = (usb_hid_dev->tx_out_cb)(usb_hid_dev->tx_out_context, + &usb_hid_dev->tx_packet_buffer[2], + sizeof(usb_hid_dev->tx_packet_buffer)-2, + NULL, + &need_yield); #endif + if (bytes_to_tx == 0) { + return; + } + + /* Always set type as report ID */ + usb_hid_dev->tx_packet_buffer[0] = 1; + +#ifdef PIOS_USB_BOARD_BL_HID_HAS_NO_LENGTH_BYTE + UserToPMABufferCopy(usb_hid_dev->tx_packet_buffer, + GetEPTxAddr(usb_hid_dev->cfg->data_tx_ep), + bytes_to_tx + 1); +#else + usb_hid_dev->tx_packet_buffer[1] = bytes_to_tx; + UserToPMABufferCopy(usb_hid_dev->tx_packet_buffer, + GetEPTxAddr(usb_hid_dev->cfg->data_tx_ep), + bytes_to_tx + 2); +#endif + /* Is this correct? Why do we always send the whole buffer? */ + SetEPTxCount(usb_hid_dev->cfg->data_tx_ep, sizeof(usb_hid_dev->tx_packet_buffer)); + SetEPTxValid(usb_hid_dev->cfg->data_tx_ep); + +#if defined(PIOS_INCLUDE_FREERTOS) + if (need_yield) { + vPortYieldFromISR(); + } +#endif /* PIOS_INCLUDE_FREERTOS */ +} + +static void PIOS_USB_HID_RxStart(uint32_t usbhid_id, uint16_t rx_bytes_avail) { + struct pios_usb_hid_dev * usb_hid_dev = (struct pios_usb_hid_dev *)usbhid_id; + + bool valid = PIOS_USB_HID_validate(usb_hid_dev); + PIOS_Assert(valid); + + if (!PIOS_USB_CheckAvailable(usb_hid_dev->lower_id)) { + return; + } + + // If endpoint was stalled and there is now space make it valid + PIOS_IRQ_Disable(); + if ((GetEPRxStatus(usb_hid_dev->cfg->data_rx_ep) != EP_RX_VALID) && + (rx_bytes_avail >= PIOS_USB_BOARD_HID_DATA_LENGTH)) { + SetEPRxStatus(usb_hid_dev->cfg->data_rx_ep, EP_RX_VALID); + } + PIOS_IRQ_Enable(); +} + +static void PIOS_USB_HID_TxStart(uint32_t usbhid_id, uint16_t tx_bytes_avail) +{ + struct pios_usb_hid_dev * usb_hid_dev = (struct pios_usb_hid_dev *)usbhid_id; + + bool valid = PIOS_USB_HID_validate(usb_hid_dev); + PIOS_Assert(valid); + + if (!PIOS_USB_CheckAvailable(usb_hid_dev->lower_id)) { + return; + } + + if (GetEPTxStatus(usb_hid_dev->cfg->data_tx_ep) == EP_TX_VALID) { + /* Endpoint is already transmitting */ + return; + } + + PIOS_USB_HID_SendReport(usb_hid_dev); +} + +static void PIOS_USB_HID_RegisterRxCallback(uint32_t usbhid_id, pios_com_callback rx_in_cb, uint32_t context) +{ + struct pios_usb_hid_dev * usb_hid_dev = (struct pios_usb_hid_dev *)usbhid_id; + + bool valid = PIOS_USB_HID_validate(usb_hid_dev); + PIOS_Assert(valid); + + /* + * Order is important in these assignments since ISR uses _cb + * field to determine if it's ok to dereference _cb and _context + */ + usb_hid_dev->rx_in_context = context; + usb_hid_dev->rx_in_cb = rx_in_cb; +} + +static void PIOS_USB_HID_RegisterTxCallback(uint32_t usbhid_id, pios_com_callback tx_out_cb, uint32_t context) +{ + struct pios_usb_hid_dev * usb_hid_dev = (struct pios_usb_hid_dev *)usbhid_id; + + bool valid = PIOS_USB_HID_validate(usb_hid_dev); + PIOS_Assert(valid); + + /* + * Order is important in these assignments since ISR uses _cb + * field to determine if it's ok to dereference _cb and _context + */ + usb_hid_dev->tx_out_context = context; + usb_hid_dev->tx_out_cb = tx_out_cb; +} /** - * @} - * @} + * @brief Callback used to indicate a transmission from device INto host completed + * Checks if any data remains, pads it into HID packet and sends. */ +static void PIOS_USB_HID_EP_IN_Callback(void) +{ + struct pios_usb_hid_dev * usb_hid_dev = (struct pios_usb_hid_dev *)pios_usb_hid_id; + + bool valid = PIOS_USB_HID_validate(usb_hid_dev); + PIOS_Assert(valid); + + if (!PIOS_USB_CheckAvailable(usb_hid_dev->lower_id)) { + return; + } + + PIOS_USB_HID_SendReport(usb_hid_dev); +} + +/** + * EP1 OUT Callback Routine + */ +static void PIOS_USB_HID_EP_OUT_Callback(void) +{ + struct pios_usb_hid_dev * usb_hid_dev = (struct pios_usb_hid_dev *)pios_usb_hid_id; + + bool valid = PIOS_USB_HID_validate(usb_hid_dev); + PIOS_Assert(valid); + + uint32_t DataLength; + + /* Read received data (63 bytes) */ + /* Get the number of received data on the selected Endpoint */ + DataLength = GetEPRxCount(usb_hid_dev->cfg->data_rx_ep); + if (DataLength > sizeof(usb_hid_dev->rx_packet_buffer)) { + DataLength = sizeof(usb_hid_dev->rx_packet_buffer); + } + + /* Use the memory interface function to read from the selected endpoint */ + PMAToUserBufferCopy((uint8_t *) usb_hid_dev->rx_packet_buffer, + GetEPRxAddr(usb_hid_dev->cfg->data_rx_ep), + DataLength); + + if (!usb_hid_dev->rx_in_cb) { + /* No Rx call back registered, disable the receiver */ + SetEPRxStatus(usb_hid_dev->cfg->data_rx_ep, EP_RX_NAK); + return; + } + + /* The first byte is report ID (not checked), the second byte is the valid data length */ + uint16_t headroom; + bool need_yield = false; +#ifdef PIOS_USB_BOARD_BL_HID_HAS_NO_LENGTH_BYTE + (usb_hid_dev->rx_in_cb)(usb_hid_dev->rx_in_context, + &usb_hid_dev->rx_packet_buffer[1], + sizeof(usb_hid_dev->rx_packet_buffer)-1, + &headroom, + &need_yield); +#else + (usb_hid_dev->rx_in_cb)(usb_hid_dev->rx_in_context, + &usb_hid_dev->rx_packet_buffer[2], + usb_hid_dev->rx_packet_buffer[1], + &headroom, + &need_yield); +#endif + if (headroom >= PIOS_USB_BOARD_HID_DATA_LENGTH) { + /* We have room for a maximum length message */ + SetEPRxStatus(usb_hid_dev->cfg->data_rx_ep, EP_RX_VALID); + } else { + /* Not enough room left for a message, apply backpressure */ + SetEPRxStatus(usb_hid_dev->cfg->data_rx_ep, EP_RX_NAK); + } + +#if defined(PIOS_INCLUDE_FREERTOS) + if (need_yield) { + vPortYieldFromISR(); + } +#endif /* PIOS_INCLUDE_FREERTOS */ +} + +#endif /* PIOS_INCLUDE_USB_HID */ diff --git a/flight/PiOS/STM32F10x/pios_usb_hid_desc.c b/flight/PiOS/STM32F10x/pios_usb_hid_desc.c deleted file mode 100644 index 98f76f9e5..000000000 --- a/flight/PiOS/STM32F10x/pios_usb_hid_desc.c +++ /dev/null @@ -1,183 +0,0 @@ -/******************** (C) COPYRIGHT 2010 STMicroelectronics ******************** -* File Name : usb_desc.c -* Author : MCD Application Team -* Version : V3.2.1 -* Date : 07/05/2010 -* Description : Descriptors for Custom HID Demo -******************************************************************************** -* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ - -/* Includes ------------------------------------------------------------------*/ -#include "usb_lib.h" -#include "pios_usb.h" -#include "pios_usb_hid.h" -#include "pios_usb_hid_desc.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Extern variables ----------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/* USB Standard Device Descriptor */ -const uint8_t PIOS_HID_DeviceDescriptor[PIOS_HID_SIZ_DEVICE_DESC] = { - 0x12, /*bLength */ - USB_DEVICE_DESCRIPTOR_TYPE, /*bDescriptorType */ - 0x00, /*bcdUSB */ - 0x02, - 0x00, /*bDeviceClass */ - 0x00, /*bDeviceSubClass */ - 0x00, /*bDeviceProtocol */ - 0x40, /*bMaxPacketSize40 */ - (uint8_t) ((PIOS_USB_VENDOR_ID) & 0xff), /*idVendor */ - (uint8_t) ((PIOS_USB_VENDOR_ID) >> 8), - (uint8_t) ((PIOS_USB_PRODUCT_ID) & 0xff), /*idProduct */ - (uint8_t) ((PIOS_USB_PRODUCT_ID) >> 8), - (uint8_t) ((PIOS_USB_VERSION_ID) & 0xff), /*bcdDevice */ - (uint8_t) ((PIOS_USB_VERSION_ID) >> 8), - 0x01, /*Index of string descriptor describing - manufacturer */ - 0x02, /*Index of string descriptor describing - product */ - 0x03, /*Index of string descriptor describing the - device serial number */ - 0x01 /*bNumConfigurations */ -} - -; /* PIOS_HID_DeviceDescriptor */ - -/* USB Configuration Descriptor */ -/* All Descriptors (Configuration, Interface, Endpoint, Class, Vendor */ -const uint8_t PIOS_HID_ConfigDescriptor[PIOS_HID_SIZ_CONFIG_DESC] = { - 0x09, /* bLength: Configuation Descriptor size */ - USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType: Configuration */ - PIOS_HID_SIZ_CONFIG_DESC, - /* wTotalLength: Bytes returned */ - 0x00, - 0x01, /* bNumInterfaces: 1 interface */ - 0x01, /* bConfigurationValue: Configuration value */ - 0x00, /* iConfiguration: Index of string descriptor describing - the configuration */ - 0xC0, /* bmAttributes: Bus powered */ - 0x32, /* MaxPower 100 mA: this current is used for detecting Vbus */ - - /************** Descriptor of Custom HID interface ****************/ - /* 09 */ - 0x09, /* bLength: Interface Descriptor size */ - USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType: Interface descriptor type */ - 0x00, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x02, /* bNumEndpoints */ - 0x03, /* bInterfaceClass: HID */ - 0x00, /* bInterfaceSubClass : 1=BOOT, 0=no boot */ - 0x00, /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */ - 0, /* iInterface: Index of string descriptor */ - /******************** Descriptor of Custom HID HID ********************/ - /* 18 */ - 0x09, /* bLength: HID Descriptor size */ - HID_DESCRIPTOR_TYPE, /* bDescriptorType: HID */ - 0x10, /* bcdHID: HID Class Spec release number */ - 0x01, - 0x00, /* bCountryCode: Hardware target country */ - 0x01, /* bNumDescriptors: Number of HID class descriptors to follow */ - 0x22, /* bDescriptorType */ - PIOS_HID_SIZ_REPORT_DESC, /* wItemLength: Total length of Report descriptor */ - 0x00, - /******************** Descriptor of Custom HID endpoints ******************/ - /* 27 */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: */ - - 0x81, /* bEndpointAddress: Endpoint Address (IN) */ - 0x03, /* bmAttributes: Interrupt endpoint */ - 0x40, /* wMaxPacketSize: 2 Bytes max */ - 0x00, - 0x04, /* bInterval: Polling Interval (32 ms) */ - /* 34 */ - - 0x07, /* bLength: Endpoint Descriptor size */ - USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: */ - /* Endpoint descriptor type */ - 0x01, /* bEndpointAddress: */ - /* Endpoint Address (OUT) */ - 0x03, /* bmAttributes: Interrupt endpoint */ - 0x40, /* wMaxPacketSize: 2 Bytes max */ - 0x00, - 0x04, /* bInterval: Polling Interval (20 ms) */ - /* 41 */ -} - -; /* PIOS_HID_ConfigDescriptor */ -const uint8_t PIOS_HID_ReportDescriptor[PIOS_HID_SIZ_REPORT_DESC] = { - 0x06, 0x9c, 0xff, /* USAGE_PAGE (Vendor Page: 0xFF00) */ - 0x09, 0x01, /* USAGE (Demo Kit) */ - 0xa1, 0x01, /* COLLECTION (Application) */ - /* 6 */ - - /* Data 1 */ - 0x85, 0x01, /* REPORT_ID (1) */ - 0x09, 0x02, /* USAGE (LED 1) */ - 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ - 0x25, 0xff, /* LOGICAL_MAXIMUM (255) */ - 0x75, 0x08, /* REPORT_SIZE (8) */ - 0x95, PIOS_USB_COM_DATA_LENGTH + 1, /* REPORT_COUNT (1) */ - 0x81, 0x83, /* INPUT (Const,Var,Array) */ - /* 20 */ - - /* Data 1 */ - 0x85, 0x02, /* REPORT_ID (2) */ - 0x09, 0x03, /* USAGE (LED 1) */ - 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ - 0x25, 0xff, /* LOGICAL_MAXIMUM (255) */ - 0x75, 0x08, /* REPORT_SIZE (8) */ - 0x95, PIOS_USB_COM_DATA_LENGTH + 1, /* REPORT_COUNT (1) */ - 0x91, 0x82, /* OUTPUT (Data,Var,Abs,Vol) */ - /* 34 */ - - 0xc0 /* END_COLLECTION */ -}; /* PIOS_HID_ReportDescriptor */ - -/* USB String Descriptors (optional) */ -const uint8_t PIOS_HID_StringLangID[PIOS_HID_SIZ_STRING_LANGID] = { - PIOS_HID_SIZ_STRING_LANGID, - USB_STRING_DESCRIPTOR_TYPE, - 0x09, - 0x04 -} - -; /* LangID = 0x0409: U.S. English */ - -const uint8_t PIOS_HID_StringVendor[PIOS_HID_SIZ_STRING_VENDOR] = { - PIOS_HID_SIZ_STRING_VENDOR, /* Size of Vendor string */ - USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType */ - /* Manufacturer: "STMicroelectronics" */ - 'o', 0, 'p', 0, 'e', 0, 'n', 0, 'p', 0, 'i', 0, 'l', 0, 'o', 0, - 't', 0, '.', 0, 'o', 0, 'r', 0, 'g', 0 -}; - -const uint8_t PIOS_HID_StringProduct[PIOS_HID_SIZ_STRING_PRODUCT] = { - PIOS_HID_SIZ_STRING_PRODUCT, /* bLength */ - USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType */ - 'O', 0, 'p', 0, 'e', 0, 'n', 0, 'P', 0, 'i', 0, 'l', 0, - 'o', 0, 't', 0 -}; - -uint8_t PIOS_HID_StringSerial[PIOS_HID_SIZ_STRING_SERIAL] = { - PIOS_HID_SIZ_STRING_SERIAL, /* bLength */ - USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -}; - -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/flight/PiOS/STM32F10x/pios_usbhook.c b/flight/PiOS/STM32F10x/pios_usbhook.c index 92836db29..3d2bb8df2 100644 --- a/flight/PiOS/STM32F10x/pios_usbhook.c +++ b/flight/PiOS/STM32F10x/pios_usbhook.c @@ -1,42 +1,18 @@ -/******************** (C) COPYRIGHT 2010 STMicroelectronics ******************** -* File Name : pios_usbhook.c -* Author : MCD Application Team -* Version : V3.2.1 -* Date : 07/05/2010 -* Description : All processings related to Custom HID Demo -******************************************************************************** -* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f10x.h" -#include "usb_lib.h" -#include "usb_conf.h" #include "pios.h" +#include "pios_usb.h" /* PIOS_USB_* */ #include "pios_usbhook.h" -#include "pios_usb_hid_desc.h" +#include "pios_usb_defs.h" /* struct usb_* */ #include "pios_usb_hid_pwr.h" -#include "pios_usb_hid.h" -#include "pios_usb_com_priv.h" +#include "pios_usb_cdc_priv.h" /* PIOS_USB_CDC_* */ +#include "pios_usb_board_data.h" /* PIOS_USB_BOARD_* */ -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -uint32_t ProtocolValue; +#include "stm32f10x.h" /* __IO */ __IO uint8_t EXTI_Enable; -/* -------------------------------------------------------------------------- */ -/* Structures initializations */ -/* -------------------------------------------------------------------------- */ +uint32_t ProtocolValue; DEVICE Device_Table = { - EP_NUM, + PIOS_USB_BOARD_EP_NUM, 1 }; @@ -81,44 +57,49 @@ USER_STANDARD_REQUESTS User_Standard_Requests = { .User_SetDeviceAddress = PIOS_USBHOOK_SetDeviceAddress }; -static ONE_DESCRIPTOR Device_Descriptor = { - (uint8_t *) PIOS_HID_DeviceDescriptor, - PIOS_HID_SIZ_DEVICE_DESC +const static ONE_DESCRIPTOR Device_Descriptor = { + (uint8_t *) &PIOS_USB_BOARD_DeviceDescriptor, + sizeof(PIOS_USB_BOARD_DeviceDescriptor), }; static ONE_DESCRIPTOR Config_Descriptor = { - (uint8_t *) PIOS_HID_ConfigDescriptor, - PIOS_HID_SIZ_CONFIG_DESC + (uint8_t *) &PIOS_USB_BOARD_Configuration, + sizeof(PIOS_USB_BOARD_Configuration), }; -static ONE_DESCRIPTOR PIOS_HID_Report_Descriptor = { - (uint8_t *) PIOS_HID_ReportDescriptor, - PIOS_HID_SIZ_REPORT_DESC +const static ONE_DESCRIPTOR Hid_Report_Descriptor = { + (uint8_t *) &PIOS_USB_BOARD_HidReportDescriptor, + sizeof(PIOS_USB_BOARD_HidReportDescriptor), }; -static ONE_DESCRIPTOR PIOS_HID_Hid_Descriptor = { - (uint8_t *) PIOS_HID_ConfigDescriptor + PIOS_HID_OFF_HID_DESC, - PIOS_HID_SIZ_HID_DESC +const static ONE_DESCRIPTOR Hid_Interface_Descriptor = { + (uint8_t *) &PIOS_USB_BOARD_Configuration.hid_if, + sizeof(PIOS_USB_BOARD_Configuration.hid_if), }; -static ONE_DESCRIPTOR String_Descriptor[4] = { - {(uint8_t *) PIOS_HID_StringLangID, PIOS_HID_SIZ_STRING_LANGID} - , - {(uint8_t *) PIOS_HID_StringVendor, PIOS_HID_SIZ_STRING_VENDOR} - , - {(uint8_t *) PIOS_HID_StringProduct, PIOS_HID_SIZ_STRING_PRODUCT} - , - {(uint8_t *) PIOS_HID_StringSerial, PIOS_HID_SIZ_STRING_SERIAL} +const static ONE_DESCRIPTOR String_Descriptor[] = { + { + (uint8_t *) &PIOS_USB_BOARD_StringLangID, + sizeof(PIOS_USB_BOARD_StringLangID), + }, + { + (uint8_t *) PIOS_USB_BOARD_StringVendorID, + sizeof(PIOS_USB_BOARD_StringVendorID), + }, + { + (uint8_t *) PIOS_USB_BOARD_StringProductID, + sizeof(PIOS_USB_BOARD_StringProductID), + }, + { + (uint8_t *) PIOS_USB_BOARD_StringSerial, + sizeof(PIOS_USB_BOARD_StringSerial), + }, }; -/* Extern variables ----------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ static RESULT PIOS_USBHOOK_SetProtocol(void); static uint8_t *PIOS_USBHOOK_GetProtocolValue(uint16_t Length); static uint8_t *PIOS_USBHOOK_GetReportDescriptor(uint16_t Length); static uint8_t *PIOS_USBHOOK_GetHIDDescriptor(uint16_t Length); -/* Extern function prototypes ------------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ /******************************************************************************* * Function Name : PIOS_USBHOOK_Init. @@ -157,7 +138,7 @@ static void PIOS_USBHOOK_Reset(void) pInformation->Current_Interface = 0; /*the default Interface */ /* Current Feature initialization */ - pInformation->Current_Feature = PIOS_HID_ConfigDescriptor[7]; + pInformation->Current_Feature = 0; #ifdef STM32F10X_CL /* EP0 is already configured in DFU_Init() by USB_SIL_Init() function */ @@ -180,24 +161,26 @@ static void PIOS_USBHOOK_Reset(void) SetEPRxCount(ENDP0, Device_Property.MaxPacketSize); SetEPRxValid(ENDP0); +#if defined(PIOS_INCLUDE_USB_HID) /* Initialize Endpoint 1 (HID) */ SetEPType(ENDP1, EP_INTERRUPT); SetEPTxAddr(ENDP1, ENDP1_TXADDR); - SetEPTxCount(ENDP1, PIOS_USB_COM_DATA_LENGTH + 2); + SetEPTxCount(ENDP1, PIOS_USB_BOARD_HID_DATA_LENGTH); SetEPTxStatus(ENDP1, EP_TX_NAK); SetEPRxAddr(ENDP1, ENDP1_RXADDR); - SetEPRxCount(ENDP1, PIOS_USB_COM_DATA_LENGTH + 2); + SetEPRxCount(ENDP1, PIOS_USB_BOARD_HID_DATA_LENGTH); SetEPRxStatus(ENDP1, EP_RX_VALID); +#endif /* PIOS_INCLUDE_USB_HID */ -#if defined(PIOS_INCLUDE_USB_COM_CDC) +#if defined(PIOS_INCLUDE_USB_CDC) /* Initialize Endpoint 2 (CDC Call Control) */ SetEPType(ENDP2, EP_INTERRUPT); SetEPTxAddr(ENDP2, ENDP2_TXADDR); SetEPTxStatus(ENDP2, EP_TX_NAK); SetEPRxAddr(ENDP2, ENDP2_RXADDR); - SetEPRxCount(ENDP2, PIOS_USB_COM_DATA_LENGTH + 2); + SetEPRxCount(ENDP2, PIOS_USB_BOARD_CDC_MGMT_LENGTH); SetEPRxStatus(ENDP2, EP_RX_DIS); /* Initialize Endpoint 3 (CDC Data) */ @@ -206,10 +189,10 @@ static void PIOS_USBHOOK_Reset(void) SetEPTxStatus(ENDP3, EP_TX_NAK); SetEPRxAddr(ENDP3, ENDP3_RXADDR); - SetEPRxCount(ENDP3, PIOS_USB_COM_DATA_LENGTH + 2); + SetEPRxCount(ENDP3, PIOS_USB_BOARD_CDC_DATA_LENGTH); SetEPRxStatus(ENDP3, EP_RX_VALID); -#endif /* PIOS_INCLUDE_USB_COM_CDC */ +#endif /* PIOS_INCLUDE_USB_CDC */ /* Set this device to response on default address */ SetDeviceAddress(0); @@ -233,7 +216,7 @@ static void PIOS_USBHOOK_SetConfiguration(void) } /* Enable transfers */ - PIOS_USB_HID_ChangeConnectionState(pInformation->Current_Configuration != 0); + PIOS_USB_ChangeConnectionState(pInformation->Current_Configuration != 0); } /******************************************************************************* @@ -290,10 +273,10 @@ static RESULT PIOS_USBHOOK_Data_Setup(uint8_t RequestNo) switch (RequestNo) { case GET_DESCRIPTOR: switch (pInformation->USBwValue1) { - case REPORT_DESCRIPTOR: + case USB_DESC_TYPE_REPORT: CopyRoutine = PIOS_USBHOOK_GetReportDescriptor; break; - case HID_DESCRIPTOR_TYPE: + case USB_DESC_TYPE_HID: CopyRoutine = PIOS_USBHOOK_GetHIDDescriptor; break; } @@ -311,11 +294,11 @@ static RESULT PIOS_USBHOOK_Data_Setup(uint8_t RequestNo) } break; -#if defined(PIOS_INCLUDE_USB_COM_CDC) +#if defined(PIOS_INCLUDE_USB_CDC) case 1: /* CDC Call Control Interface */ switch (RequestNo) { case GET_LINE_CODING: - CopyRoutine = PIOS_CDC_GetLineCoding; + CopyRoutine = PIOS_USB_CDC_GetLineCoding; break; } @@ -328,7 +311,7 @@ static RESULT PIOS_USBHOOK_Data_Setup(uint8_t RequestNo) } break; -#endif /* PIOS_INCLUDE_USB_COM_CDC */ +#endif /* PIOS_INCLUDE_USB_CDC */ } break; } @@ -364,19 +347,19 @@ static RESULT PIOS_USBHOOK_NoData_Setup(uint8_t RequestNo) break; -#if defined(PIOS_INCLUDE_USB_COM_CDC) +#if defined(PIOS_INCLUDE_USB_CDC) case 1: /* CDC Call Control Interface */ switch (RequestNo) { case SET_LINE_CODING: - return PIOS_CDC_SetLineCoding(); + return PIOS_USB_CDC_SetLineCoding(); break; case SET_CONTROL_LINE_STATE: - return PIOS_CDC_SetControlLineState(); + return PIOS_USB_CDC_SetControlLineState(); break; } break; -#endif /* PIOS_INCLUDE_USB_COM_CDC */ +#endif /* PIOS_INCLUDE_USB_CDC */ } break; @@ -435,7 +418,7 @@ static uint8_t *PIOS_USBHOOK_GetStringDescriptor(uint16_t Length) *******************************************************************************/ static uint8_t *PIOS_USBHOOK_GetReportDescriptor(uint16_t Length) { - return Standard_GetDescriptorData(Length, &PIOS_HID_Report_Descriptor); + return Standard_GetDescriptorData(Length, &Hid_Report_Descriptor); } /******************************************************************************* @@ -447,7 +430,7 @@ static uint8_t *PIOS_USBHOOK_GetReportDescriptor(uint16_t Length) *******************************************************************************/ static uint8_t *PIOS_USBHOOK_GetHIDDescriptor(uint16_t Length) { - return Standard_GetDescriptorData(Length, &PIOS_HID_Hid_Descriptor); + return Standard_GetDescriptorData(Length, &Hid_Interface_Descriptor); } /******************************************************************************* diff --git a/flight/PiOS/inc/pios_usb.h b/flight/PiOS/inc/pios_usb.h index 986062e1e..1c6347a0d 100644 --- a/flight/PiOS/inc/pios_usb.h +++ b/flight/PiOS/inc/pios_usb.h @@ -3,13 +3,11 @@ * @addtogroup PIOS PIOS Core hardware abstraction layer * @{ * @addtogroup PIOS_USB USB Functions - * @brief PIOS USB interface code * @{ * * @file pios_usb.h * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. - * Parts by Thorsten Klose (tk@midibox.org) - * @brief USB functions header. + * @brief USB HID layer functions header * @see The GNU Public License (GPL) Version 3 * *****************************************************************************/ @@ -32,49 +30,10 @@ #ifndef PIOS_USB_H #define PIOS_USB_H -/* Local defines */ -/* Following settings allow to customise the USB device descriptor */ -#ifndef PIOS_USB_VENDOR_ID -#define PIOS_USB_VENDOR_ID 0x20A0 -#endif - -#ifndef PIOS_USB_VENDOR_STR -#define PIOS_USB_VENDOR_STR "openpilot.org" -#endif - -#ifndef PIOS_USB_PRODUCT_STR -#define PIOS_USB_PRODUCT_STR "OpenPilot" -#endif - -#ifndef PIOS_USB_PRODUCT_ID -#define PIOS_USB_PRODUCT_ID 0x415A -#endif - -#ifndef PIOS_USB_VERSION_ID -#define PIOS_USB_VERSION_ID 0x0102 /* OpenPilot board (01), Running state (02) */ -#endif - -/* Internal defines which are used by PIOS USB HID (don't touch) */ - -/* Buffer table base address */ -#define PIOS_USB_BTABLE_ADDRESS 0x000 - -/* EP0 rx/tx buffer base address */ -#define PIOS_USB_ENDP0_RXADDR 0x040 -#define PIOS_USB_ENDP0_TXADDR 0x080 - -/* EP1 Rx/Tx buffer base address for HID driver */ -#define PIOS_USB_ENDP1_TXADDR 0x0C0 -#define PIOS_USB_ENDP1_RXADDR 0x100 - -/* Global Variables */ -extern void (*pEpInt_IN[7]) (void); -extern void (*pEpInt_OUT[7]) (void); - -/* Public Functions */ -extern int32_t PIOS_USB_Init(uint32_t mode); -extern int32_t PIOS_USB_IsInitialized(void); -extern int32_t PIOS_USB_CableConnected(void); +/* Global functions */ +extern int32_t PIOS_USB_Reenumerate(); +extern int32_t PIOS_USB_ChangeConnectionState(uint32_t Connected); +extern bool PIOS_USB_CheckAvailable(uint8_t id); #endif /* PIOS_USB_H */ diff --git a/flight/PiOS/inc/pios_usb_com_priv.h b/flight/PiOS/inc/pios_usb_cdc_priv.h similarity index 67% rename from flight/PiOS/inc/pios_usb_com_priv.h rename to flight/PiOS/inc/pios_usb_cdc_priv.h index 525f71d13..e6b94bad8 100644 --- a/flight/PiOS/inc/pios_usb_com_priv.h +++ b/flight/PiOS/inc/pios_usb_cdc_priv.h @@ -2,13 +2,13 @@ ****************************************************************************** * @addtogroup PIOS PIOS Core hardware abstraction layer * @{ - * @addtogroup PIOS_USB_COM USB COM layer functions + * @addtogroup PIOS_USB_COM USB CDC COM layer functions * @brief Hardware communication layer * @{ * - * @file pios_usb_com_priv.h + * @file pios_usb_cdc_priv.h * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. - * @brief USB COM private definitions. + * @brief USB COM CDC private definitions. * @see The GNU Public License (GPL) Version 3 * *****************************************************************************/ @@ -28,19 +28,12 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#ifndef PIOS_USB_COM_PRIV_H -#define PIOS_USB_COM_PRIV_H +#ifndef PIOS_USB_CDC_PRIV_H +#define PIOS_USB_CDC_PRIV_H #include "usb_core.h" /* RESULT */ -enum pios_usb_com_type { - PIOS_USB_COM_CDC, - PIOS_USB_COM_HID, -}; - -struct pios_usb_com_cfg { - enum pios_usb_com_type type; - +struct pios_usb_cdc_cfg { uint8_t ctrl_if; uint8_t ctrl_tx_ep; @@ -49,16 +42,15 @@ struct pios_usb_com_cfg { uint8_t data_tx_ep; }; -extern const struct pios_com_driver pios_usb_hid_com_driver; extern const struct pios_com_driver pios_usb_cdc_com_driver; -extern int32_t PIOS_USB_COM_Init(uint32_t * usbcom_id, const struct pios_usb_com_cfg * cfg, uint32_t lower_id); +extern int32_t PIOS_USB_CDC_Init(uint32_t * usbcdc_id, const struct pios_usb_cdc_cfg * cfg, uint32_t lower_id); -extern uint8_t *PIOS_CDC_GetLineCoding(uint16_t Length); -extern RESULT PIOS_CDC_SetControlLineState(void); -extern RESULT PIOS_CDC_SetLineCoding(void); +extern uint8_t *PIOS_USB_CDC_GetLineCoding(uint16_t Length); +extern RESULT PIOS_USB_CDC_SetControlLineState(void); +extern RESULT PIOS_USB_CDC_SetLineCoding(void); -#endif /* PIOS_USB_COM_PRIV_H */ +#endif /* PIOS_USB_CDC_PRIV_H */ /** * @} diff --git a/flight/PiOS/inc/pios_usb_defs.h b/flight/PiOS/inc/pios_usb_defs.h new file mode 100644 index 000000000..78b2eba69 --- /dev/null +++ b/flight/PiOS/inc/pios_usb_defs.h @@ -0,0 +1,292 @@ +#ifndef PIOS_USB_DEFS_H +#define PIOS_USB_DEFS_H + +#include /* uint*_t */ + +enum usb_desc_types { + USB_DESC_TYPE_DEVICE = 0x01, + USB_DESC_TYPE_CONFIGURATION = 0x02, + USB_DESC_TYPE_STRING = 0x03, + USB_DESC_TYPE_INTERFACE = 0x04, + USB_DESC_TYPE_ENDPOINT = 0x05, + USB_DESC_TYPE_IAD = 0x0B, + USB_DESC_TYPE_HID = 0x21, + USB_DESC_TYPE_REPORT = 0x22, + USB_DESC_TYPE_CLASS_SPECIFIC = 0x24, +} __attribute__((packed)); + +enum usb_interface_class { + USB_INTERFACE_CLASS_CDC = 0x02, + USB_INTERFACE_CLASS_HID = 0x03, + USB_INTERFACE_CLASS_DATA = 0x0A, +} __attribute__((packed)); + +enum usb_cdc_desc_subtypes { + USB_CDC_DESC_SUBTYPE_HEADER = 0x00, + USB_CDC_DESC_SUBTYPE_CALLMGMT = 0x01, + USB_CDC_DESC_SUBTYPE_ABSTRACT_CTRL = 0x02, + USB_CDC_DESC_SUBTYPE_UNION = 0x06, +} __attribute__((packed)); + +enum usb_ep_attr { + USB_EP_ATTR_TT_CONTROL = 0x00, + USB_EP_ATTR_TT_ISOCHRONOUS = 0x01, + USB_EP_ATTR_TT_BULK = 0x02, + USB_EP_ATTR_TT_INTERRUPT = 0x03, +} __attribute__((packed)); + +/* Standard macros to convert from host endian to USB endian (ie. little endian) */ +#if __BIG_ENDIAN__ +#define htousbs(v) ((uint16_t)(\ + ((((v) >> 0) & 0xFF) << 8) | \ + ((((v) >> 8) & 0xFF) << 0))) +#define htousbl(v) ((uint32_t)(\ + ((((v) >> 0) & 0xFF) << 24) | \ + ((((v) >> 8) & 0xFF) << 16) | \ + ((((v) >> 16) & 0xFF) << 8) | \ + ((((v) >> 24) & 0xFF) << 0))) +#else +#define htousbs(v) (v) +#define htousbl(v) (v) +#endif + +#define USB_EP_IN(ep) ((uint8_t) (0x80 | ((ep) & 0xF))) +#define USB_EP_OUT(ep) ((uint8_t) (0x00 | ((ep) & 0xF))) + +#define HID_ITEM_TYPE_MAIN 0x0 +#define HID_ITEM_TYPE_GLOBAL 0x1 +#define HID_ITEM_TYPE_LOCAL 0x2 +#define HID_ITEM_TYPE_RSVD 0x3 + +#define HID_TAG_GLOBAL_USAGE_PAGE 0x0 /* 0b0000 */ +#define HID_TAG_GLOBAL_LOGICAL_MIN 0x1 /* 0b0001 */ +#define HID_TAG_GLOBAL_LOGICAL_MAX 0x2 /* 0b0010 */ +#define HID_TAG_GLOBAL_PHYS_MIN 0x3 /* 0b0011 */ +#define HID_TAG_GLOBAL_PHYS_MAX 0x4 /* 0b0100 */ +#define HID_TAG_GLOBAL_UNIT_EXP 0x5 /* 0b0101 */ +#define HID_TAG_GLOBAL_UNIT 0x6 /* 0b0110 */ +#define HID_TAG_GLOBAL_REPORT_SIZE 0x7 /* 0b0111 */ +#define HID_TAG_GLOBAL_REPORT_ID 0x8 /* 0b1000 */ +#define HID_TAG_GLOBAL_REPORT_CNT 0x9 /* 0b1001 */ +#define HID_TAG_GLOBAL_PUSH 0xA /* 0b1010 */ +#define HID_TAG_GLOBAL_POP 0xB /* 0b1011 */ + +#define HID_TAG_MAIN_INPUT 0x8 /* 0b1000 */ +#define HID_TAG_MAIN_OUTPUT 0x9 /* 0b1001 */ +#define HID_TAG_MAIN_COLLECTION 0xA /* 0b1010 */ +#define HID_TAG_MAIN_FEATURE 0xB /* 0b1011 */ +#define HID_TAG_MAIN_ENDCOLLECTION 0xC /* 0b1100 */ + +#define HID_TAG_LOCAL_USAGE 0x0 /* 0b0000 */ +#define HID_TAG_LOCAL_USAGE_MIN 0x1 /* 0b0001 */ +#define HID_TAG_LOCAL_USAGE_MAX 0x2 /* 0b0010 */ +#define HID_TAG_LOCAL_DESIG_INDEX 0x3 /* 0b0011 */ +#define HID_TAG_LOCAL_DESIG_MIN 0x4 /* 0b0100 */ +#define HID_TAG_LOCAL_DESIG_MAX 0x5 /* 0b0101 */ +/* There is no value defined for 0x6 */ +#define HID_TAG_LOCAL_STRING_INDEX 0x7 /* 0b0111 */ +#define HID_TAG_LOCAL_STRING_MIN 0x8 /* 0b1000 */ +#define HID_TAG_LOCAL_STRING_MAX 0x9 /* 0b1001 */ +#define HID_TAG_LOCAL_DELIMITER 0xA /* 0b1010 */ + +#define HID_TAG_RSVD 0xF /* 0b1111 */ + +#define HID_ITEM_SIZE_0 0 +#define HID_ITEM_SIZE_1 1 +#define HID_ITEM_SIZE_2 2 +#define HID_ITEM_SIZE_4 3 /* Yes, 4 bytes is represented with a size field = 3 */ + +#define HID_SHORT_ITEM(tag,type,size) (\ + (((tag) & 0xF) << 4) | \ + (((type) & 0x3) << 2) | \ + (((size) & 0x3) << 0)) + +/* Long items have a fixed prefix */ +#define HID_LONG_ITEM HID_SHORT_ITEM(HID_TAG_RSVD, HID_ITEM_TYPE_RSVD, HID_ITEM_SIZE_2) + +#define HID_MAIN_ITEM_0(tag) HID_SHORT_ITEM((tag), HID_ITEM_TYPE_MAIN, HID_ITEM_SIZE_0) +#define HID_MAIN_ITEM_1(tag) HID_SHORT_ITEM((tag), HID_ITEM_TYPE_MAIN, HID_ITEM_SIZE_1) +#define HID_MAIN_ITEM_2(tag) HID_SHORT_ITEM((tag), HID_ITEM_TYPE_MAIN, HID_ITEM_SIZE_2) +#define HID_MAIN_ITEM_4(tag) HID_SHORT_ITEM((tag), HID_ITEM_TYPE_MAIN, HID_ITEM_SIZE_4) + +#define HID_GLOBAL_ITEM_0(tag) HID_SHORT_ITEM((tag), HID_ITEM_TYPE_GLOBAL, HID_ITEM_SIZE_0) +#define HID_GLOBAL_ITEM_1(tag) HID_SHORT_ITEM((tag), HID_ITEM_TYPE_GLOBAL, HID_ITEM_SIZE_1) +#define HID_GLOBAL_ITEM_2(tag) HID_SHORT_ITEM((tag), HID_ITEM_TYPE_GLOBAL, HID_ITEM_SIZE_2) +#define HID_GLOBAL_ITEM_4(tag) HID_SHORT_ITEM((tag), HID_ITEM_TYPE_GLOBAL, HID_ITEM_SIZE_4) + +#define HID_LOCAL_ITEM_0(tag) HID_SHORT_ITEM((tag), HID_ITEM_TYPE_LOCAL, HID_ITEM_SIZE_0) +#define HID_LOCAL_ITEM_1(tag) HID_SHORT_ITEM((tag), HID_ITEM_TYPE_LOCAL, HID_ITEM_SIZE_1) +#define HID_LOCAL_ITEM_2(tag) HID_SHORT_ITEM((tag), HID_ITEM_TYPE_LOCAL, HID_ITEM_SIZE_2) +#define HID_LOCAL_ITEM_3(tag) HID_SHORT_ITEM((tag), HID_ITEM_TYPE_LOCAL, HID_ITEM_SIZE_3) + +struct usb_device_desc { + uint8_t bLength; + uint8_t bDescriptorType; + uint16_t bcdUSB; + uint8_t bDeviceClass; + uint8_t bDeviceSubClass; + uint8_t bDeviceProtocol; + uint8_t bMaxPacketSize0; + uint16_t idVendor; + uint16_t idProduct; + uint16_t bcdDevice; + uint8_t iManufacturer; + uint8_t iProduct; + uint8_t iSerialNumber; + uint8_t bNumConfigurations; +} __attribute__((packed)); + +struct usb_configuration_desc { + uint8_t bLength; + uint8_t bDescriptorType; + uint16_t wTotalLength; + uint8_t bNumInterfaces; + uint8_t bConfigurationValue; + uint8_t iConfiguration; + uint8_t bmAttributes; + uint8_t bMaxPower; +} __attribute__((packed)); + +struct usb_interface_association_desc { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bFirstInterface; + uint8_t bInterfaceCount; + uint8_t bFunctionClass; + uint8_t bFunctionSubClass; + uint8_t bFunctionProtocol; + uint8_t iInterface; +} __attribute__((packed)); + +struct usb_interface_desc { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bInterfaceNumber; + uint8_t bAlternateSetting; + uint8_t bNumEndpoints; + uint8_t bInterfaceClass; + uint8_t bInterfaceSubClass; + uint8_t nInterfaceProtocol; + uint8_t iInterface; +} __attribute__((packed)); + +struct usb_hid_desc { + uint8_t bLength; + uint8_t bDescriptorType; + uint16_t bcdHID; + uint8_t bCountryCode; + uint8_t bNumDescriptors; + uint8_t bClassDescriptorType; + uint16_t wItemLength; +} __attribute__((packed)); + +struct usb_endpoint_desc { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bEndpointAddress; + uint8_t bmAttributes; + uint16_t wMaxPacketSize; + uint8_t bInterval; +} __attribute__((packed)); + +struct usb_cdc_header_func_desc { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubType; + uint16_t bcdCDC; +} __attribute__((packed)); + +struct usb_cdc_callmgmt_func_desc { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubType; + uint8_t bmCapabilities; + uint8_t bDataInterface; +} __attribute__((packed)); + +struct usb_cdc_acm_func_desc { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubType; + uint8_t bmCapabilities; +} __attribute__((packed)); + +struct usb_cdc_union_func_desc { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubType; + uint8_t bMasterInterface; + uint8_t bSlaveInterface; +} __attribute__((packed)); + +#define USB_LANGID_ENGLISH_UK 0x0809 + +struct usb_string_langid { + uint8_t bLength; + uint8_t bDescriptorType; + uint16_t bLangID; +} __attribute__((packed)); + +struct usb_cdc_line_coding { + uint32_t dwDTERate; + uint8_t bCharFormat; + uint8_t bParityType; + uint8_t bDataBits; +} __attribute__((packed)); + +enum usb_cdc_line_coding_stop { + USB_CDC_LINE_CODING_STOP_1 = 0, + USB_CDC_LINE_CODING_STOP_1_5 = 1, + USB_CDC_LINE_CODING_STOP_2 = 2, +} __attribute__((packed)); + +enum usb_cdc_line_coding_parity { + USB_CDC_LINE_CODING_PARITY_NONE = 0, + USB_CDC_LINE_CODING_PARITY_ODD = 1, + USB_CDC_LINE_CODING_PARITY_EVEN = 2, + USB_CDC_LINE_CODING_PARITY_MARK = 3, + USB_CDC_LINE_CODING_PARITY_SPACE = 4, +} __attribute__((packed)); + +struct usb_cdc_serial_state_report { + uint8_t bmRequestType; + uint8_t bNotification; + uint16_t wValue; + uint16_t wIndex; + uint16_t wLength; + uint16_t bmUartState; +} __attribute__((packed)); + +enum usb_cdc_notification { + USB_CDC_NOTIFICATION_SERIAL_STATE = 0x20, +} __attribute__((packed)); + +/* + * OpenPilot Specific USB Definitions + */ + +#define USB_VENDOR_ID_OPENPILOT 0x20A0 + +enum usb_product_ids { + USB_PRODUCT_ID_OPENPILOT_MAIN = 0x415A, + USB_PRODUCT_ID_COPTERCONTROL = 0x415B, + USB_PRODUCT_ID_PIPXTREME = 0x415C, +} __attribute__((packed)); + +enum usb_op_board_ids { + USB_OP_BOARD_ID_OPENPILOT_MAIN = 1, + /* Board ID 2 may be unused or AHRS */ + USB_OP_BOARD_ID_PIPXTREME = 3, + USB_OP_BOARD_ID_COPTERCONTROL = 4, +} __attribute__((packed)); + +enum usb_op_board_modes { + USB_OP_BOARD_MODE_BL = 1, + USB_OP_BOARD_MODE_FW = 2, +} __attribute__((packed)); + +#define USB_OP_DEVICE_VER(board_id, board_mode) (\ + ((board_id & 0xFF) << 8) | \ + ((board_mode & 0xFF) << 0)) + +#endif /* PIOS_USB_DEFS_H */ diff --git a/flight/PiOS/inc/pios_usb_hid.h b/flight/PiOS/inc/pios_usb_hid.h index 10e3d6277..da353c555 100644 --- a/flight/PiOS/inc/pios_usb_hid.h +++ b/flight/PiOS/inc/pios_usb_hid.h @@ -31,23 +31,11 @@ #ifndef PIOS_USB_HID_H #define PIOS_USB_HID_H -/* Global Definitions */ -#define PIOS_USB_HID_SIZ_REPORT_DESC 36 -#define PIOS_USB_HID_REPORT_DESCRIPTOR 0x22 -#define PIOS_USB_HID_HID_DESCRIPTOR_TYPE 0x21 -#define PIOS_USB_HID_OFF_HID_DESC 0x12 -#define PIOS_USB_HID_SIZ_HID_DESC 0x09 - -#define PIOS_USB_COM_DATA_LENGTH 62 - /* Global functions */ extern int32_t PIOS_USB_HID_Reenumerate(); extern int32_t PIOS_USB_HID_ChangeConnectionState(uint32_t Connected); extern bool PIOS_USB_HID_CheckAvailable(uint8_t id); -extern int32_t PIOS_USB_HID_CB_Data_Setup(uint8_t RequestNo); -extern int32_t PIOS_USB_HID_CB_NoData_Setup(uint8_t RequestNo); - #endif /* PIOS_USB_HID_H */ /** diff --git a/flight/PiOS/inc/pios_usb_hid_desc.h b/flight/PiOS/inc/pios_usb_hid_desc.h deleted file mode 100644 index ba9af390b..000000000 --- a/flight/PiOS/inc/pios_usb_hid_desc.h +++ /dev/null @@ -1,56 +0,0 @@ -/******************** (C) COPYRIGHT 2010 STMicroelectronics ******************** -* File Name : usb_desc.h -* Author : MCD Application Team -* Version : V3.2.1 -* Date : 07/05/2010 -* Description : Descriptor Header for Custom HID Demo -******************************************************************************** -* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_DESC_H -#define __USB_DESC_H - -/* Includes ------------------------------------------------------------------*/ -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/* Exported macro ------------------------------------------------------------*/ -/* Exported define -----------------------------------------------------------*/ -#define USB_DEVICE_DESCRIPTOR_TYPE 0x01 -#define USB_CONFIGURATION_DESCRIPTOR_TYPE 0x02 -#define USB_STRING_DESCRIPTOR_TYPE 0x03 -#define USB_INTERFACE_DESCRIPTOR_TYPE 0x04 -#define USB_ENDPOINT_DESCRIPTOR_TYPE 0x05 - -#define HID_DESCRIPTOR_TYPE 0x21 -#define PIOS_HID_SIZ_HID_DESC 0x09 -#define PIOS_HID_OFF_HID_DESC 0x12 - -#define PIOS_HID_SIZ_DEVICE_DESC 18 -#define PIOS_HID_SIZ_CONFIG_DESC 41 -#define PIOS_HID_SIZ_REPORT_DESC 36 -#define PIOS_HID_SIZ_STRING_LANGID 4 -#define PIOS_HID_SIZ_STRING_VENDOR 28 -#define PIOS_HID_SIZ_STRING_PRODUCT 20 -#define PIOS_HID_SIZ_STRING_SERIAL 52 /* 96 bits, 12 bytes, 24 characters, 48 in unicode */ - -#define STANDARD_ENDPOINT_DESC_SIZE 0x09 - -/* Exported functions ------------------------------------------------------- */ -extern const uint8_t PIOS_HID_DeviceDescriptor[PIOS_HID_SIZ_DEVICE_DESC]; -extern const uint8_t PIOS_HID_ConfigDescriptor[PIOS_HID_SIZ_CONFIG_DESC]; -extern const uint8_t PIOS_HID_ReportDescriptor[PIOS_HID_SIZ_REPORT_DESC]; -extern const uint8_t PIOS_HID_StringLangID[PIOS_HID_SIZ_STRING_LANGID]; -extern const uint8_t PIOS_HID_StringVendor[PIOS_HID_SIZ_STRING_VENDOR]; -extern const uint8_t PIOS_HID_StringProduct[PIOS_HID_SIZ_STRING_PRODUCT]; -extern uint8_t PIOS_HID_StringSerial[PIOS_HID_SIZ_STRING_SERIAL]; - -#endif /* __USB_DESC_H */ - -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/flight/PiOS/inc/pios_usb_hid_priv.h b/flight/PiOS/inc/pios_usb_hid_priv.h index 7e2be04ec..ac638cd54 100644 --- a/flight/PiOS/inc/pios_usb_hid_priv.h +++ b/flight/PiOS/inc/pios_usb_hid_priv.h @@ -1,14 +1,14 @@ - /** +/** ****************************************************************************** * @addtogroup PIOS PIOS Core hardware abstraction layer * @{ - * @addtogroup PIOS_USB_HID USB_HID Functions - * @brief PIOS interface for USB_HID port + * @addtogroup PIOS_USB_COM USB HID COM layer functions + * @brief Hardware communication layer * @{ * * @file pios_usb_hid_priv.h * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. - * @brief USB_HID private definitions. + * @brief USB COM HID private definitions. * @see The GNU Public License (GPL) Version 3 * *****************************************************************************/ @@ -31,14 +31,17 @@ #ifndef PIOS_USB_HID_PRIV_H #define PIOS_USB_HID_PRIV_H -#include -#include +#include "usb_core.h" /* RESULT */ -struct pios_usb_cfg { - struct stm32_irq irq; +struct pios_usb_hid_cfg { + uint8_t data_if; + uint8_t data_rx_ep; + uint8_t data_tx_ep; }; -extern int32_t PIOS_USB_Init(uint32_t * usb_id, const struct pios_usb_cfg * cfg); +extern const struct pios_com_driver pios_usb_hid_com_driver; + +extern int32_t PIOS_USB_HID_Init(uint32_t * usbhid_id, const struct pios_usb_hid_cfg * cfg, uint32_t lower_id); #endif /* PIOS_USB_HID_PRIV_H */ @@ -46,4 +49,3 @@ extern int32_t PIOS_USB_Init(uint32_t * usb_id, const struct pios_usb_cfg * cfg) * @} * @} */ - diff --git a/flight/PiOS/inc/pios_usb_priv.h b/flight/PiOS/inc/pios_usb_priv.h new file mode 100644 index 000000000..dd3f949ee --- /dev/null +++ b/flight/PiOS/inc/pios_usb_priv.h @@ -0,0 +1,49 @@ + /** + ****************************************************************************** + * @addtogroup PIOS PIOS Core hardware abstraction layer + * @{ + * @addtogroup PIOS_USB USB Setup Functions + * @brief PIOS interface for USB device driver + * @{ + * + * @file pios_usb_priv.h + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. + * @brief USB private definitions. + * @see The GNU Public License (GPL) Version 3 + * + *****************************************************************************/ +/* + * 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 + */ + +#ifndef PIOS_USB_PRIV_H +#define PIOS_USB_PRIV_H + +#include +#include + +struct pios_usb_cfg { + struct stm32_irq irq; +}; + +extern int32_t PIOS_USB_Init(uint32_t * usb_id, const struct pios_usb_cfg * cfg); + +#endif /* PIOS_USB_PRIV_H */ + +/** + * @} + * @} + */ + diff --git a/flight/PiOS/inc/pios_usbhook.h b/flight/PiOS/inc/pios_usbhook.h index 7b1a6f2c5..9246afcff 100644 --- a/flight/PiOS/inc/pios_usbhook.h +++ b/flight/PiOS/inc/pios_usbhook.h @@ -1,24 +1,6 @@ -/******************** (C) COPYRIGHT 2010 STMicroelectronics ******************** -* File Name : pios_usbhook.h -* Author : MCD Application Team -* Version : V3.2.1 -* Date : 07/05/2010 -* Description : All processings related to Custom HID demo -******************************************************************************** -* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ - -/* Define to prevent recursive inclusion -------------------------------------*/ #ifndef PIOS_USBHOOK_H #define PIOS_USBHOOK_H -/* Includes ------------------------------------------------------------------*/ -/* Exported types ------------------------------------------------------------*/ typedef enum _HID_REQUESTS { GET_REPORT = 1, GET_IDLE, @@ -35,12 +17,5 @@ typedef enum CDC_REQUESTS { SET_CONTROL_LINE_STATE = 0x23, } CDC_REQUESTS; -/* Exported constants --------------------------------------------------------*/ -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ -/* Exported define -----------------------------------------------------------*/ -#define REPORT_DESCRIPTOR 0x22 - #endif /* PIOS_USBHOOK_H */ -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/flight/PiOS/inc/usb_conf.h b/flight/PiOS/inc/usb_conf.h index ad0c33c29..f174eaf62 100644 --- a/flight/PiOS/inc/usb_conf.h +++ b/flight/PiOS/inc/usb_conf.h @@ -23,11 +23,6 @@ /* Exported macro ------------------------------------------------------------*/ /* Exported functions ------------------------------------------------------- */ /* External variables --------------------------------------------------------*/ -/*-------------------------------------------------------------*/ -/* EP_NUM */ -/* defines how many endpoints are used by the device */ -/*-------------------------------------------------------------*/ -#define EP_NUM (4) #ifndef STM32F10X_CL /*-------------------------------------------------------------*/ diff --git a/flight/PipXtreme/Makefile b/flight/PipXtreme/Makefile index dc4d9bf5f..c4bc900ca 100644 --- a/flight/PipXtreme/Makefile +++ b/flight/PipXtreme/Makefile @@ -97,10 +97,6 @@ SRC += $(HOME_DIR)/gpio_in.c SRC += $(HOME_DIR)/stopwatch.c SRC += $(HOME_DIR)/watchdog.c SRC += $(FLIGHTLIB)/fifo_buffer.c -ifeq ($(USE_USB), YES) - SRC += $(HOME_DIR)/pios_usb_hid_desc.c -endif - ## PIOS Hardware (STM32F10x) SRC += $(PIOSSTM32F10X)/pios_sys.c @@ -115,13 +111,13 @@ SRC += $(PIOSSTM32F10X)/pios_ppm.c # PIOS USB related files (seperated to make code maintenance more easy) ifeq ($(USE_USB), YES) + SRC += $(PIOSSTM32F10X)/pios_usb.c SRC += $(PIOSSTM32F10X)/pios_usbhook.c SRC += $(PIOSSTM32F10X)/pios_usb_hid.c - #SRC += $(PIOSSTM32F10X)/pios_usb_hid_desc.c - #SRC += $(PIOSSTM32F10X)/pios_usb_hid_endp.c SRC += $(PIOSSTM32F10X)/pios_usb_hid_istr.c SRC += $(PIOSSTM32F10X)/pios_usb_hid_pwr.c - SRC += $(PIOSSTM32F10X)/pios_usb_com.c + SRC += $(HOME_DIR)/pios_usb_board_data.c + SRC += $(PIOSCOMMON)/pios_usb_desc_hid_only.c endif ## PIOS Hardware (Common) diff --git a/flight/PipXtreme/api_config.c b/flight/PipXtreme/api_config.c index 2cecfc65e..10587a6ee 100644 --- a/flight/PipXtreme/api_config.c +++ b/flight/PipXtreme/api_config.c @@ -35,6 +35,7 @@ #include "saved_settings.h" #include "crc.h" #include "main.h" +#include "pios_usb.h" /* PIOS_USB_* */ #if defined(PIOS_COM_DEBUG) // #define APICONFIG_DEBUG @@ -773,8 +774,8 @@ void apiconfig_process(void) // decide which comm-port we are using (usart or usb) apiconfig_usb_comms = false; // TRUE if we are using the usb port for comms. apiconfig_comm_port = PIOS_COM_SERIAL; // default to using the usart comm-port - #if defined(PIOS_INCLUDE_USB_HID) - if (PIOS_USB_HID_CheckAvailable(0)) + #if defined(PIOS_INCLUDE_USB) + if (PIOS_USB_CheckAvailable(0)) { // USB comms is up, use the USB comm-port instead of the USART comm-port apiconfig_usb_comms = true; apiconfig_comm_port = PIOS_COM_TELEM_USB; diff --git a/flight/PipXtreme/inc/pios_config.h b/flight/PipXtreme/inc/pios_config.h index ca0f6c0c9..46728b2cb 100644 --- a/flight/PipXtreme/inc/pios_config.h +++ b/flight/PipXtreme/inc/pios_config.h @@ -39,7 +39,7 @@ #define PIOS_INCLUDE_COM #define PIOS_INCLUDE_GPIO #define PIOS_INCLUDE_EXTI +#define PIOS_INCLUDE_USB #define PIOS_INCLUDE_USB_HID -#define PIOS_INCLUDE_USB_COM #endif /* PIOS_CONFIG_H */ diff --git a/flight/PipXtreme/inc/pios_usb.h b/flight/PipXtreme/inc/pios_usb.h deleted file mode 100644 index 517bfde90..000000000 --- a/flight/PipXtreme/inc/pios_usb.h +++ /dev/null @@ -1,78 +0,0 @@ -/** - ****************************************************************************** - * @addtogroup PIOS PIOS Core hardware abstraction layer - * @{ - * @addtogroup PIOS_USB USB Functions - * @brief PIOS USB interface code - * @{ - * - * @file pios_usb.h - * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. - * Parts by Thorsten Klose (tk@midibox.org) - * @brief USB functions header. - * @see The GNU Public License (GPL) Version 3 - * - *****************************************************************************/ -/* - * 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 - */ - -#ifndef PIOS_USB_H -#define PIOS_USB_H - -/* Local defines */ -/* Following settings allow to customise the USB device descriptor */ -#ifndef PIOS_USB_VENDOR_ID -#define PIOS_USB_VENDOR_ID 0x20A0 -#endif - - -#ifndef PIOS_USB_PRODUCT_ID -#define PIOS_USB_PRODUCT_ID 0x415C // PipXtreme PID -#endif - -#ifndef PIOS_USB_VERSION_ID -#define PIOS_USB_VERSION_ID 0x0302 // PipXtreme, board revision 1, Running state (02) -#endif - -/* Internal defines which are used by PIOS USB HID (don't touch) */ - -/* Buffer table base address */ -#define PIOS_USB_BTABLE_ADDRESS 0x000 - -/* EP0 rx/tx buffer base address */ -#define PIOS_USB_ENDP0_RXADDR 0x040 -#define PIOS_USB_ENDP0_TXADDR 0x080 - -/* EP1 Rx/Tx buffer base address for HID driver */ -#define PIOS_USB_ENDP1_TXADDR 0x0C0 -#define PIOS_USB_ENDP1_RXADDR 0x100 - - -/* Global Variables */ -extern void (*pEpInt_IN[7])(void); -extern void (*pEpInt_OUT[7])(void); - -/* Public Functions */ -extern int32_t PIOS_USB_Init(uint32_t mode); -extern int32_t PIOS_USB_IsInitialized(void); -extern int32_t PIOS_USB_CableConnected(void); - -#endif /* PIOS_USB_H */ - -/** - * @} - * @} - */ diff --git a/flight/PipXtreme/inc/pios_usb_board_data.h b/flight/PipXtreme/inc/pios_usb_board_data.h new file mode 100644 index 000000000..4ec9fa1c8 --- /dev/null +++ b/flight/PipXtreme/inc/pios_usb_board_data.h @@ -0,0 +1,40 @@ +#ifndef PIOS_USB_BOARD_DATA_H +#define PIOS_USB_BOARD_DATA_H + +#define PIOS_USB_BOARD_HID_DATA_LENGTH 64 + +#define PIOS_USB_BOARD_EP_NUM 2 + +#include "pios_usb_defs.h" /* struct usb_* */ + +struct usb_board_config { + struct usb_configuration_desc config; + struct usb_interface_desc hid_if; + struct usb_hid_desc hid; + struct usb_endpoint_desc hid_in; + struct usb_endpoint_desc hid_out; +} __attribute__((packed)); + +extern const struct usb_device_desc PIOS_USB_BOARD_DeviceDescriptor; +extern const struct usb_board_config PIOS_USB_BOARD_Configuration; +extern const struct usb_string_langid PIOS_USB_BOARD_StringLangID; + +/* NOTE NOTE NOTE + * + * Care must be taken to ensure that the _actual_ contents of + * these arrays (in each board's pios_usb_board_data.c) is no + * smaller than the stated sizes here or these descriptors + * will end up with trailing zeros on the wire. + * + * The compiler will catch any time that these definitions are + * too small. + */ +extern const uint8_t PIOS_USB_BOARD_HidReportDescriptor[36]; +extern const uint8_t PIOS_USB_BOARD_StringVendorID[28]; +extern const uint8_t PIOS_USB_BOARD_StringProductID[20]; +extern uint8_t PIOS_USB_BOARD_StringSerial[52]; + +#define PIOS_USB_BOARD_PRODUCT_ID USB_PRODUCT_ID_PIPXTREME +#define PIOS_USB_BOARD_DEVICE_VER USB_OP_DEVICE_VER(USB_OP_BOARD_ID_PIPXTREME, USB_OP_BOARD_MODE_FW) + +#endif /* PIOS_USB_BOARD_DATA_H */ diff --git a/flight/PipXtreme/inc/usb_conf.h b/flight/PipXtreme/inc/usb_conf.h deleted file mode 100644 index 1c56117e5..000000000 --- a/flight/PipXtreme/inc/usb_conf.h +++ /dev/null @@ -1,196 +0,0 @@ -/******************** (C) COPYRIGHT 2010 STMicroelectronics ******************** -* File Name : usb_conf.h -* Author : MCD Application Team -* Version : V3.2.1 -* Date : 07/05/2010 -* Description : Custom HID demo configuration file -******************************************************************************** -* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_CONF_H -#define __USB_CONF_H - -/* Includes ------------------------------------------------------------------*/ -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ -/* External variables --------------------------------------------------------*/ -/*-------------------------------------------------------------*/ -/* EP_NUM */ -/* defines how many endpoints are used by the device */ -/*-------------------------------------------------------------*/ -#define EP_NUM (2) - -#ifndef STM32F10X_CL -/*-------------------------------------------------------------*/ -/* -------------- Buffer Description Table -----------------*/ -/*-------------------------------------------------------------*/ -/* buffer table base address */ -/* buffer table base address */ -#define BTABLE_ADDRESS (0x00) - -/* EP0 */ -/* rx/tx buffer base address */ -#define ENDP0_RXADDR (0x20) -#define ENDP0_TXADDR (0x40) - -/* EP1 */ -/* rx/tx buffer base address */ -#define ENDP1_TXADDR (0x60) -#define ENDP1_RXADDR (0x80) - -/* EP2 */ -/* rx/tx buffer base address */ -#define ENDP2_TXADDR (0x100) -#define ENDP2_RXADDR (0x140) - -/* EP3 */ -/* rx/tx buffer base address */ -#define ENDP3_TXADDR (0x180) -#define ENDP3_RXADDR (0x1C0) - -/*-------------------------------------------------------------*/ -/* ------------------- ISTR events -------------------------*/ -/*-------------------------------------------------------------*/ -/* IMR_MSK */ -/* mask defining which events has to be handled */ -/* by the device application software */ -#define IMR_MSK (CNTR_CTRM | CNTR_WKUPM | CNTR_SUSPM | CNTR_ERRM | CNTR_SOFM \ - | CNTR_ESOFM | CNTR_RESETM ) -#endif /* STM32F10X_CL */ - -#ifdef STM32F10X_CL - -/******************************************************************************* -* FIFO Size Configuration -* -* (i) Dedicated data FIFO SPRAM of 1.25 Kbytes = 1280 bytes = 320 32-bits words -* available for the endpoints IN and OUT. -* Device mode features: -* -1 bidirectional CTRL EP 0 -* -3 IN EPs to support any kind of Bulk, Interrupt or Isochronous transfer -* -3 OUT EPs to support any kind of Bulk, Interrupt or Isochronous transfer -* -* ii) Receive data FIFO size = RAM for setup packets + -* OUT endpoint control information + -* data OUT packets + miscellaneous -* Space = ONE 32-bits words -* --> RAM for setup packets = 4 * n + 6 space -* (n is the nbr of CTRL EPs the device core supports) -* --> OUT EP CTRL info = 1 space -* (one space for status information written to the FIFO along with each -* received packet) -* --> data OUT packets = (Largest Packet Size / 4) + 1 spaces -* (MINIMUM to receive packets) -* --> OR data OUT packets = at least 2*(Largest Packet Size / 4) + 1 spaces -* (if high-bandwidth EP is enabled or multiple isochronous EPs) -* --> miscellaneous = 1 space per OUT EP -* (one space for transfer complete status information also pushed to the -* FIFO with each endpoint's last packet) -* -* (iii)MINIMUM RAM space required for each IN EP Tx FIFO = MAX packet size for -* that particular IN EP. More space allocated in the IN EP Tx FIFO results -* in a better performance on the USB and can hide latencies on the AHB. -* -* (iv) TXn min size = 16 words. (n : Transmit FIFO index) -* (v) When a TxFIFO is not used, the Configuration should be as follows: -* case 1 : n > m and Txn is not used (n,m : Transmit FIFO indexes) -* --> Txm can use the space allocated for Txn. -* case2 : n < m and Txn is not used (n,m : Transmit FIFO indexes) -* --> Txn should be configured with the minimum space of 16 words -* (vi) The FIFO is used optimally when used TxFIFOs are allocated in the top -* of the FIFO.Ex: use EP1 and EP2 as IN instead of EP1 and EP3 as IN ones. -*******************************************************************************/ - -#define RX_FIFO_SIZE 128 -#define TX0_FIFO_SIZE 64 -#define TX1_FIFO_SIZE 64 -#define TX2_FIFO_SIZE 16 -#define TX3_FIFO_SIZE 16 - -/* OTGD-FS-DEVICE IP interrupts Enable definitions */ -/* Uncomment the define to enable the selected interrupt */ -//#define INTR_MODEMISMATCH -#define INTR_SOFINTR -#define INTR_RXSTSQLVL /* Mandatory */ -//#define INTR_NPTXFEMPTY -//#define INTR_GINNAKEFF -//#define INTR_GOUTNAKEFF -//#define INTR_ERLYSUSPEND -#define INTR_USBSUSPEND /* Mandatory */ -#define INTR_USBRESET /* Mandatory */ -#define INTR_ENUMDONE /* Mandatory */ -//#define INTR_ISOOUTDROP -//#define INTR_EOPFRAME -//#define INTR_EPMISMATCH -#define INTR_INEPINTR /* Mandatory */ -#define INTR_OUTEPINTR /* Mandatory */ -//#define INTR_INCOMPLISOIN -//#define INTR_INCOMPLISOOUT -#define INTR_WKUPINTR /* Mandatory */ - -/* OTGD-FS-DEVICE IP interrupts subroutines */ -/* Comment the define to enable the selected interrupt subroutine and replace it - by user code */ -#define INTR_MODEMISMATCH_Callback NOP_Process -#define INTR_SOFINTR_Callback NOP_Process -#define INTR_RXSTSQLVL_Callback NOP_Process -#define INTR_NPTXFEMPTY_Callback NOP_Process -#define INTR_NPTXFEMPTY_Callback NOP_Process -#define INTR_GINNAKEFF_Callback NOP_Process -#define INTR_GOUTNAKEFF_Callback NOP_Process -#define INTR_ERLYSUSPEND_Callback NOP_Process -#define INTR_USBSUSPEND_Callback NOP_Process -#define INTR_USBRESET_Callback NOP_Process -#define INTR_ENUMDONE_Callback NOP_Process -#define INTR_ISOOUTDROP_Callback NOP_Process -#define INTR_EOPFRAME_Callback NOP_Process -#define INTR_EPMISMATCH_Callback NOP_Process -#define INTR_INEPINTR_Callback NOP_Process -#define INTR_OUTEPINTR_Callback NOP_Process -#define INTR_INCOMPLISOIN_Callback NOP_Process -#define INTR_INCOMPLISOOUT_Callback NOP_Process -#define INTR_WKUPINTR_Callback NOP_Process - -/* Isochronous data update */ -#define INTR_RXSTSQLVL_ISODU_Callback NOP_Process - -/* Isochronous transfer parameters */ -/* Size of a single Isochronous buffer (size of a single transfer) */ -#define ISOC_BUFFER_SZE 1 -/* Number of sub-buffers (number of single buffers/transfers), should be even */ -#define NUM_SUB_BUFFERS 2 - -#endif /* STM32F10X_CL */ - - -/* CTR service routines */ -/* associated to defined endpoints */ -#define EP1_IN_Callback NOP_Process -#define EP2_IN_Callback NOP_Process -#define EP3_IN_Callback NOP_Process -#define EP4_IN_Callback NOP_Process -#define EP5_IN_Callback NOP_Process -#define EP6_IN_Callback NOP_Process -#define EP7_IN_Callback NOP_Process - -#define EP1_OUT_Callback NOP_Process -#define EP2_OUT_Callback NOP_Process -#define EP3_OUT_Callback NOP_Process -#define EP4_OUT_Callback NOP_Process -#define EP5_OUT_Callback NOP_Process -#define EP6_OUT_Callback NOP_Process -#define EP7_OUT_Callback NOP_Process - -#endif /*__USB_CONF_H*/ - -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ - diff --git a/flight/PipXtreme/pios_board.c b/flight/PipXtreme/pios_board.c index 99fade5e1..7da3705a8 100644 --- a/flight/PipXtreme/pios_board.c +++ b/flight/PipXtreme/pios_board.c @@ -311,8 +311,8 @@ static uint8_t pios_com_serial_tx_buffer[PIOS_COM_SERIAL_TX_BUF_LEN]; // *********************************************************************************** -#if defined(PIOS_INCLUDE_USB_HID) -#include "pios_usb_hid_priv.h" +#if defined(PIOS_INCLUDE_USB) +#include "pios_usb_priv.h" static const struct pios_usb_cfg pios_usb_main_cfg = { .irq = { @@ -324,19 +324,18 @@ static const struct pios_usb_cfg pios_usb_main_cfg = { }, }, }; -#endif /* PIOS_INCLUDE_USB_HID */ +#endif /* PIOS_INCLUDE_USB */ -#if defined(PIOS_INCLUDE_USB_COM) -#include +#if defined(PIOS_INCLUDE_USB_HID) +#include -const struct pios_usb_com_cfg pios_usb_com_hid_cfg = { - .type = PIOS_USB_COM_HID, +const struct pios_usb_hid_cfg pios_usb_hid_cfg = { .data_if = 0, .data_rx_ep = 1, .data_tx_ep = 1, }; -#endif /* PIOS_INCLUDE_USB_COM */ +#endif /* PIOS_INCLUDE_USB_HID */ uint32_t pios_com_serial_id; uint32_t pios_com_telem_usb_id; @@ -369,20 +368,23 @@ void PIOS_Board_Init(void) { PIOS_DEBUG_Assert(0); } -#if defined(PIOS_INCLUDE_USB_HID) +#if defined(PIOS_INCLUDE_USB) uint32_t pios_usb_id; - PIOS_USB_Init(&pios_usb_id, &pios_usb_main_cfg); -#if defined(PIOS_INCLUDE_COM) - uint32_t pios_usb_com_id; - if (PIOS_USB_COM_Init(&pios_usb_com_id, &pios_usb_com_hid_cfg, pios_usb_id)) { + if (PIOS_USB_Init(&pios_usb_id, &pios_usb_main_cfg)) { PIOS_Assert(0); } - if (PIOS_COM_Init(&pios_com_telem_usb_id, &pios_usb_hid_com_driver, pios_usb_com_id, +#if defined(PIOS_INCLUDE_USB_HID) && defined(PIOS_INCLUDE_COM) + uint32_t pios_usb_hid_id; + if (PIOS_USB_HID_Init(&pios_usb_hid_id, &pios_usb_hid_cfg, pios_usb_id)) { + PIOS_Assert(0); + } + if (PIOS_COM_Init(&pios_com_telem_usb_id, &pios_usb_hid_com_driver, pios_usb_hid_id, pios_com_telem_usb_rx_buffer, sizeof(pios_com_telem_usb_rx_buffer), pios_com_telem_usb_tx_buffer, sizeof(pios_com_telem_usb_tx_buffer))) { PIOS_Assert(0); } -#endif /* PIOS_INCLUDE_COM */ +#endif /* PIOS_INCLUDE_USB_HID && PIOS_INCLUDE_COM */ + #endif /* PIOS_INCLUDE_USB_HID */ // ADC system diff --git a/flight/PipXtreme/pios_usb_board_data.c b/flight/PipXtreme/pios_usb_board_data.c new file mode 100644 index 000000000..3266e1b45 --- /dev/null +++ b/flight/PipXtreme/pios_usb_board_data.c @@ -0,0 +1,16 @@ +#include "pios_usb_board_data.h" /* struct usb_*, USB_* */ + +const uint8_t PIOS_USB_BOARD_StringProductID[] = { + sizeof(PIOS_USB_BOARD_StringProductID), + USB_DESC_TYPE_STRING, + 'P', 0, + 'i', 0, + 'p', 0, + 'X', 0, + 't', 0, + 'r', 0, + 'e', 0, + 'm', 0, + 'e', 0, +}; + diff --git a/flight/PipXtreme/transparent_comms.c b/flight/PipXtreme/transparent_comms.c index b30f5f581..20d78290b 100644 --- a/flight/PipXtreme/transparent_comms.c +++ b/flight/PipXtreme/transparent_comms.c @@ -31,6 +31,7 @@ #include "packet_handler.h" #include "saved_settings.h" #include "main.h" +#include "pios_usb.h" /* PIOS_USB_* */ #if defined(PIOS_COM_DEBUG) #define TRANS_DEBUG @@ -70,8 +71,8 @@ void trans_process(void) bool usb_comms = false; // TRUE if we are using the usb port for comms. uint32_t comm_port = PIOS_COM_SERIAL; // default to using the usart comm-port - #if defined(PIOS_INCLUDE_USB_HID) - if (PIOS_USB_HID_CheckAvailable(0)) + #if defined(PIOS_INCLUDE_USB) + if (PIOS_USB_CheckAvailable(0)) { // USB comms is up, use the USB comm-port instead of the USART comm-port usb_comms = true; comm_port = PIOS_COM_TELEM_USB; From 481a13609e3fdf2d731ecf514444bc8a0a5e3763 Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Mon, 2 Jan 2012 14:08:32 -0500 Subject: [PATCH 081/121] com: remove all references to PIOS_COM_ReceiveBufferUsed() The PIOS_COM_ReceiveBufferUsed() function call is no longer necessary since the same semantics can be achieved using calls to PIOS_COM_ReceiveBuffer(). --- flight/Bootloaders/CopterControl/main.c | 6 ++--- flight/Bootloaders/OpenPilot/main.c | 19 ++++++---------- flight/Bootloaders/PipXtreme/main.c | 6 ++--- flight/PiOS/Common/pios_com.c | 18 --------------- flight/PiOS/inc/pios_com.h | 1 - flight/PipXtreme/api_config.c | 24 ++++---------------- flight/PipXtreme/transparent_comms.c | 30 ++++++------------------- 7 files changed, 22 insertions(+), 82 deletions(-) diff --git a/flight/Bootloaders/CopterControl/main.c b/flight/Bootloaders/CopterControl/main.c index aa375a49c..c1def4a46 100644 --- a/flight/Bootloaders/CopterControl/main.c +++ b/flight/Bootloaders/CopterControl/main.c @@ -198,10 +198,8 @@ uint32_t LedPWM(uint32_t pwm_period, uint32_t pwm_sweep_steps, uint32_t count) { } uint8_t processRX() { - while (PIOS_COM_ReceiveBufferUsed(PIOS_COM_TELEM_USB) >= 63) { - if (PIOS_COM_ReceiveBuffer(PIOS_COM_TELEM_USB, mReceive_Buffer, 63, 0) == 63) { - processComand(mReceive_Buffer); - } + if (PIOS_COM_ReceiveBuffer(PIOS_COM_TELEM_USB, mReceive_Buffer, 63, 0) == 63) { + processComand(mReceive_Buffer); } return TRUE; } diff --git a/flight/Bootloaders/OpenPilot/main.c b/flight/Bootloaders/OpenPilot/main.c index 8e15952ea..48056cff6 100644 --- a/flight/Bootloaders/OpenPilot/main.c +++ b/flight/Bootloaders/OpenPilot/main.c @@ -249,10 +249,8 @@ uint32_t LedPWM(uint32_t pwm_period, uint32_t pwm_sweep_steps, uint32_t count) { uint8_t processRX() { if (ProgPort == Usb) { - while (PIOS_COM_ReceiveBufferUsed(PIOS_COM_TELEM_USB) >= 63) { - if (PIOS_COM_ReceiveBuffer(PIOS_COM_TELEM_USB, mReceive_Buffer, 63, 0) == 63) { - processComand(mReceive_Buffer); - } + if (PIOS_COM_ReceiveBuffer(PIOS_COM_TELEM_USB, mReceive_Buffer, 63, 0) == 63) { + processComand(mReceive_Buffer); } } else if (ProgPort == Serial) { @@ -277,15 +275,12 @@ void SSP_CallBack(uint8_t *buf, uint16_t len) { fifoBuf_putData(&ssp_buffer, buf, len); } int16_t SSP_SerialRead(void) { - if (PIOS_COM_ReceiveBufferUsed(PIOS_COM_TELEM_RF) > 0) { - uint8_t byte; - if (PIOS_COM_ReceiveBuffer(PIOS_COM_TELEM_RF, &byte, 1, 0) == 1) { - return byte; - } else { - return -1; - } - } else + uint8_t byte; + if (PIOS_COM_ReceiveBuffer(PIOS_COM_TELEM_RF, &byte, 1, 0) == 1) { + return byte; + } else { return -1; + } } void SSP_SerialWrite(uint8_t value) { PIOS_COM_SendChar(PIOS_COM_TELEM_RF, value); diff --git a/flight/Bootloaders/PipXtreme/main.c b/flight/Bootloaders/PipXtreme/main.c index 3f1c4bd54..f09881d42 100644 --- a/flight/Bootloaders/PipXtreme/main.c +++ b/flight/Bootloaders/PipXtreme/main.c @@ -204,10 +204,8 @@ uint32_t LedPWM(uint32_t pwm_period, uint32_t pwm_sweep_steps, uint32_t count) { } uint8_t processRX() { - while (PIOS_COM_ReceiveBufferUsed(PIOS_COM_TELEM_USB) >= 63) { - if (PIOS_COM_ReceiveBuffer(PIOS_COM_TELEM_USB, mReceive_Buffer, 63, 0) == 63) { - processComand(mReceive_Buffer); - } + if (PIOS_COM_ReceiveBuffer(PIOS_COM_TELEM_USB, mReceive_Buffer, 63, 0) == 63) { + processComand(mReceive_Buffer); } return TRUE; } diff --git a/flight/PiOS/Common/pios_com.c b/flight/PiOS/Common/pios_com.c index e5440d065..992167bad 100644 --- a/flight/PiOS/Common/pios_com.c +++ b/flight/PiOS/Common/pios_com.c @@ -511,24 +511,6 @@ uint16_t PIOS_COM_ReceiveBuffer(uint32_t com_id, uint8_t * buf, uint16_t buf_len return (bytes_from_fifo); } -/** -* Get the number of bytes waiting in the buffer -* \param[in] port COM port -* \return Number of bytes used in buffer -*/ -int32_t PIOS_COM_ReceiveBufferUsed(uint32_t com_id) -{ - struct pios_com_dev * com_dev = (struct pios_com_dev *)com_id; - - if (!PIOS_COM_validate(com_dev)) { - /* Undefined COM port for this board (see pios_board.c) */ - PIOS_Assert(0); - } - - PIOS_Assert(com_dev->has_rx); - return (fifoBuf_getUsed(&com_dev->rx)); -} - #endif /** diff --git a/flight/PiOS/inc/pios_com.h b/flight/PiOS/inc/pios_com.h index cbee33735..1bda392f6 100644 --- a/flight/PiOS/inc/pios_com.h +++ b/flight/PiOS/inc/pios_com.h @@ -55,7 +55,6 @@ extern int32_t PIOS_COM_SendString(uint32_t com_id, const char *str); extern int32_t PIOS_COM_SendFormattedStringNonBlocking(uint32_t com_id, const char *format, ...); extern int32_t PIOS_COM_SendFormattedString(uint32_t com_id, const char *format, ...); extern uint16_t PIOS_COM_ReceiveBuffer(uint32_t com_id, uint8_t * buf, uint16_t buf_len, uint32_t timeout_ms); -extern int32_t PIOS_COM_ReceiveBufferUsed(uint32_t com_id); #endif /* PIOS_COM_H */ diff --git a/flight/PipXtreme/api_config.c b/flight/PipXtreme/api_config.c index 10587a6ee..5aa9fc6c0 100644 --- a/flight/PipXtreme/api_config.c +++ b/flight/PipXtreme/api_config.c @@ -792,13 +792,8 @@ void apiconfig_process(void) else if (apiconfig_usb_comms) { // we're using the USB for comms - keep the USART rx buffer empty - int32_t bytes = PIOS_COM_ReceiveBufferUsed(PIOS_COM_SERIAL); - while (bytes > 0) - { - uint8_t c; - PIOS_COM_ReceiveBuffer(PIOS_COM_SERIAL, &c, 1, 0); - bytes--; - } + uint8_t c; + while (PIOS_COM_ReceiveBuffer(PIOS_COM_SERIAL, &c, 1, 0) > 0); } apiconfig_previous_com_port = apiconfig_comm_port; // remember the current comm-port we are using @@ -808,20 +803,9 @@ void apiconfig_process(void) // fetch the data received via the comm-port // get the number of data bytes received down the comm-port - int32_t com_num = PIOS_COM_ReceiveBufferUsed(apiconfig_comm_port); + uint16_t buf_avail = sizeof(apiconfig_rx_buffer) - apiconfig_rx_buffer_wr; - // limit number of bytes we will get to how much space we have in our RX buffer - if (com_num > sizeof(apiconfig_rx_buffer) - apiconfig_rx_buffer_wr) - com_num = sizeof(apiconfig_rx_buffer) - apiconfig_rx_buffer_wr; - - - while (com_num > 0) - { // fetch a byte from the comm-port RX buffer and save it into our RX buffer - uint8_t c; - PIOS_COM_ReceiveBuffer(apiconfig_comm_port, &c, 1, 0); - apiconfig_rx_buffer[apiconfig_rx_buffer_wr++] = c; - com_num--; - } + PIOS_COM_ReceiveBuffer(apiconfig_comm_port, &(apiconfig_rx_buffer[apiconfig_rx_buffer_wr]), buf_avail, 0); apiconfig_processTx(); apiconfig_processRx(); diff --git a/flight/PipXtreme/transparent_comms.c b/flight/PipXtreme/transparent_comms.c index 20d78290b..dc5e0384a 100644 --- a/flight/PipXtreme/transparent_comms.c +++ b/flight/PipXtreme/transparent_comms.c @@ -89,13 +89,8 @@ void trans_process(void) else if (usb_comms) { // we're using the USB for comms - keep the USART rx buffer empty - int32_t bytes = PIOS_COM_ReceiveBufferUsed(PIOS_COM_SERIAL); - while (bytes > 0) - { - uint8_t c; - PIOS_COM_ReceiveBuffer(PIOS_COM_SERIAL, &c, 1, 0); - bytes--; - } + uint8_t c; + while (PIOS_COM_ReceiveBuffer(PIOS_COM_SERIAL, &c, 1, 0) > 0); } trans_previous_com_port = comm_port; // remember the current comm-port we are using @@ -112,9 +107,6 @@ void trans_process(void) // free space size in the RF packet handler tx buffer uint16_t ph_num = ph_putData_free(connection_index); - // get the number of data bytes received down the comm-port - int32_t com_num = PIOS_COM_ReceiveBufferUsed(comm_port); - // set the USART RTS handshaking line if (!usb_comms) { @@ -127,16 +119,12 @@ void trans_process(void) SERIAL_RTS_SET; // release the USART RTS line // limit number of bytes we will get to the size of the temp buffer - if (com_num > sizeof(trans_temp_buffer1)) - com_num = sizeof(trans_temp_buffer1); - - // limit number of bytes we will get to the size of the free space in the RF packet handler TX buffer - if (com_num > ph_num) - com_num = ph_num; + if (ph_num > sizeof(trans_temp_buffer1)) + ph_num = sizeof(trans_temp_buffer1); // copy data received down the comm-port into our temp buffer register uint16_t bytes_saved = 0; - bytes_saved = PIOS_COM_ReceiveBuffer(comm_port, trans_temp_buffer1, com_num, 0); + bytes_saved = PIOS_COM_ReceiveBuffer(comm_port, trans_temp_buffer1, ph_num, 0); // put the received comm-port data bytes into the RF packet handler TX buffer if (bytes_saved > 0) @@ -147,12 +135,8 @@ void trans_process(void) } else { // empty the comm-ports rx buffer - int32_t com_num = PIOS_COM_ReceiveBufferUsed(comm_port); - while (com_num > 0) { - uint8_t c; - PIOS_COM_ReceiveBuffer(comm_port, &c, 1, 0); - com_num--; - } + uint8_t c; + while (PIOS_COM_ReceiveBuffer(comm_port, &c, 1, 0) > 0); } // ******************** From 4d2760f11dc5e1f83dba5f09353d1fc21e20dab4 Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Mon, 2 Jan 2012 14:13:51 -0500 Subject: [PATCH 082/121] cc bl: allow bootloader to force safe-boot into firmware This can be used by the GCS firmware uploader widget to boot the firmware with a (temporarily) defaulted hwsettings uavo so that a user can easily recover from a bad/incompatible hwsettings configuration without wiping all settings. This uses the same mechanism that the BootFault auto-recovery code already uses in the CC firmware. The auto-recovery is triggered by setting the failed-boot counter to a maximum value forcing recovery on the next FW init. --- flight/Bootloaders/CopterControl/op_dfu.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/flight/Bootloaders/CopterControl/op_dfu.c b/flight/Bootloaders/CopterControl/op_dfu.c index b45e1e798..ae85160c2 100644 --- a/flight/Bootloaders/CopterControl/op_dfu.c +++ b/flight/Bootloaders/CopterControl/op_dfu.c @@ -294,6 +294,10 @@ void processComand(uint8_t *xReceive_Buffer) { sendData(Buffer + 1, 63); break; case JumpFW: + if (Data == 0x5AFE) { + /* Force board into safe mode */ + PIOS_IAP_WriteBootCount(0xFFFF); + } FLASH_Lock(); JumpToApp = 1; break; From 4fd40ca0d2afc58314fe6cb2101fd73f1bd957d4 Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Mon, 2 Jan 2012 14:21:12 -0500 Subject: [PATCH 083/121] gcs uploader: add support for "Safe Boot" to the GCS uploader When halted in the bootloader or while rescuing a board, the user can press the "Safe Boot" button in the uploader gadget to force the FW to boot with a default hwsettings configuration. The default conditions of the hwsettings uavo will disable all optional modules, disable all serial port config, and ensure that the board can communicate via the USB HID telemetry interface. Once booted in this mode, a user can easily reconfigure the hwsettings uavo through the config GUI and save the fixed settings to the board to be used on the next reboot. No need to wipe all settings just to recover from a non-functional HW config. NOTE: The GCS needs to grow some very clear visual clues to indicate when the board has booted in safe mode. The firmware helpfully raises a (new) critical alarm called BootFault whenever it boots in safe mode. --- .../src/plugins/uploader/op_dfu.cpp | 15 ++++++++++--- .../src/plugins/uploader/op_dfu.h | 2 +- .../src/plugins/uploader/uploader.ui | 18 +++++++++++++++ .../plugins/uploader/uploadergadgetwidget.cpp | 22 +++++++++++++++++-- .../plugins/uploader/uploadergadgetwidget.h | 2 ++ 5 files changed, 53 insertions(+), 6 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/uploader/op_dfu.cpp b/ground/openpilotgcs/src/plugins/uploader/op_dfu.cpp index 961103d22..0143a180b 100644 --- a/ground/openpilotgcs/src/plugins/uploader/op_dfu.cpp +++ b/ground/openpilotgcs/src/plugins/uploader/op_dfu.cpp @@ -509,7 +509,7 @@ int DFUObject::AbortOperation(void) /** Starts the firmware (leaves bootloader and boots the main software) */ -int DFUObject::JumpToApp() +int DFUObject::JumpToApp(bool safeboot) { char buf[BUF_LEN]; buf[0] =0x02;//reportID @@ -520,8 +520,17 @@ int DFUObject::JumpToApp() buf[5] = 0; buf[6] = 0; buf[7] = 0; - buf[8] = 0; - buf[9] = 0; + if (safeboot) + { + /* force system to safe boot mode (hwsettings == defaults) */ + buf[8] = 0x5A; + buf[9] = 0xFE; + } + else + { + buf[8] = 0; + buf[9] = 0; + } return sendData(buf, BUF_LEN); //return hidHandle.send(0,buf, BUF_LEN, 500); diff --git a/ground/openpilotgcs/src/plugins/uploader/op_dfu.h b/ground/openpilotgcs/src/plugins/uploader/op_dfu.h index 79624b546..812f3f2fb 100644 --- a/ground/openpilotgcs/src/plugins/uploader/op_dfu.h +++ b/ground/openpilotgcs/src/plugins/uploader/op_dfu.h @@ -129,7 +129,7 @@ namespace OP_DFU { // Service commands: bool enterDFU(int const &devNumber); bool findDevices(); - int JumpToApp(); + int JumpToApp(bool); int ResetDevice(void); OP_DFU::Status StatusRequest(); bool EndOperation(); diff --git a/ground/openpilotgcs/src/plugins/uploader/uploader.ui b/ground/openpilotgcs/src/plugins/uploader/uploader.ui index d66fc02ef..b0dffd4a0 100644 --- a/ground/openpilotgcs/src/plugins/uploader/uploader.ui +++ b/ground/openpilotgcs/src/plugins/uploader/uploader.ui @@ -50,6 +50,24 @@ menu on the right. + + + + true + + + Boots the system into safe mode (ie. default HwSettings). +Only useful if the system is halted +(mainboard blue LED blinking slowly, orange LED off) + +If telemetry is not running, select the link using the dropdown +menu on the right. + + + Safe Boot + + + diff --git a/ground/openpilotgcs/src/plugins/uploader/uploadergadgetwidget.cpp b/ground/openpilotgcs/src/plugins/uploader/uploadergadgetwidget.cpp index c0a1aea90..bf0c66510 100755 --- a/ground/openpilotgcs/src/plugins/uploader/uploadergadgetwidget.cpp +++ b/ground/openpilotgcs/src/plugins/uploader/uploadergadgetwidget.cpp @@ -52,6 +52,7 @@ UploaderGadgetWidget::UploaderGadgetWidget(QWidget *parent) : QWidget(parent) connect(m_config->haltButton, SIGNAL(clicked()), this, SLOT(goToBootloader())); connect(m_config->resetButton, SIGNAL(clicked()), this, SLOT(systemReset())); connect(m_config->bootButton, SIGNAL(clicked()), this, SLOT(systemBoot())); + connect(m_config->safeBootButton, SIGNAL(clicked()), this, SLOT(systemSafeBoot())); connect(m_config->rescueButton, SIGNAL(clicked()), this, SLOT(systemRescue())); Core::ConnectionManager *cm = Core::ICore::instance()->connectionManager(); connect(cm,SIGNAL(deviceConnected(QIODevice*)),this,SLOT(onPhisicalHWConnect())); @@ -117,6 +118,7 @@ QString UploaderGadgetWidget::getPortDevice(const QString &friendName) void UploaderGadgetWidget::onPhisicalHWConnect() { m_config->bootButton->setEnabled(false); + m_config->safeBootButton->setEnabled(false); m_config->rescueButton->setEnabled(false); m_config->telemetryLink->setEnabled(false); } @@ -132,6 +134,7 @@ void UploaderGadgetWidget::populate() { m_config->haltButton->setEnabled(true); m_config->resetButton->setEnabled(true); + m_config->safeBootButton->setEnabled(false); m_config->bootButton->setEnabled(false); m_config->rescueButton->setEnabled(false); m_config->telemetryLink->setEnabled(false); @@ -155,6 +158,7 @@ void UploaderGadgetWidget::onAutopilotDisconnect(){ m_config->haltButton->setEnabled(false); m_config->resetButton->setEnabled(false); m_config->bootButton->setEnabled(true); + m_config->safeBootButton->setEnabled(true); if (currentStep == IAP_STATE_BOOTLOADER) { m_config->rescueButton->setEnabled(false); m_config->telemetryLink->setEnabled(false); @@ -311,6 +315,7 @@ void UploaderGadgetWidget::goToBootloader(UAVObject* callerObj, bool success) */ // Need to re-enable in case we were not connected m_config->bootButton->setEnabled(true); + m_config->safeBootButton->setEnabled(true); /* m_config->telemetryLink->setEnabled(false); m_config->rescueButton->setEnabled(false); @@ -348,14 +353,25 @@ void UploaderGadgetWidget::systemReset() goToBootloader(); } +void UploaderGadgetWidget::systemBoot() +{ + commonSystemBoot(false); +} + +void UploaderGadgetWidget::systemSafeBoot() +{ + commonSystemBoot(true); +} + /** Tells the system to boot (from Bootloader state) */ -void UploaderGadgetWidget::systemBoot() +void UploaderGadgetWidget::commonSystemBoot(bool safeboot) { clearLog(); m_config->bootButton->setEnabled(false); + m_config->safeBootButton->setEnabled(false); // Suspend telemety & polling in case it is not done yet Core::ConnectionManager *cm = Core::ICore::instance()->connectionManager(); @@ -379,11 +395,12 @@ void UploaderGadgetWidget::systemBoot() delete dfu; dfu = NULL; m_config->bootButton->setEnabled(true); + m_config->safeBootButton->setEnabled(true); m_config->rescueButton->setEnabled(true); // Boot not possible, maybe Rescue OK? return; } log("Booting system..."); - dfu->JumpToApp(); + dfu->JumpToApp(safeboot); // Restart the polling thread cm->resumePolling(); m_config->rescueButton->setEnabled(true); @@ -530,6 +547,7 @@ void UploaderGadgetWidget::systemRescue() m_config->haltButton->setEnabled(false); m_config->resetButton->setEnabled(false); m_config->bootButton->setEnabled(true); + m_config->safeBootButton->setEnabled(true); m_config->rescueButton->setEnabled(false); currentStep = IAP_STATE_BOOTLOADER; // So that we can boot from the GUI afterwards. } diff --git a/ground/openpilotgcs/src/plugins/uploader/uploadergadgetwidget.h b/ground/openpilotgcs/src/plugins/uploader/uploadergadgetwidget.h index 9b1fa1433..998166d69 100755 --- a/ground/openpilotgcs/src/plugins/uploader/uploadergadgetwidget.h +++ b/ground/openpilotgcs/src/plugins/uploader/uploadergadgetwidget.h @@ -94,6 +94,8 @@ private slots: void goToBootloader(UAVObject* = NULL, bool = false); void systemReset(); void systemBoot(); + void systemSafeBoot(); + void commonSystemBoot(bool = false); void systemRescue(); void getSerialPorts(); void perform(); From 7b38bc3d2dabf9226e90b7c332ce6339aff58d88 Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Mon, 2 Jan 2012 14:25:20 -0500 Subject: [PATCH 084/121] jtag: add new make targets for reset and safeboot It is now easier to trigger warm restarts of a board via jtag. Examples: * make fw_coptercontrol_reset * make fw_coptercontrol_safeboot NOTE: These targets are making chip-specific assumptions so they have to be rewritten to support the F2/F4 boards. --- make/firmware-defs.mk | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/make/firmware-defs.mk b/make/firmware-defs.mk index b22a66639..2eb0a13d8 100644 --- a/make/firmware-defs.mk +++ b/make/firmware-defs.mk @@ -49,6 +49,8 @@ MSG_OPFIRMWARE := ${quote} OPFW ${quote} MSG_FWINFO := ${quote} FWINFO ${quote} MSG_JTAG_PROGRAM := ${quote} JTAG-PGM ${quote} MSG_JTAG_WIPE := ${quote} JTAG-WIPE ${quote} +MSG_JTAG_RESET := ${quote} JTAG-RST ${quote} +MSG_JTAG_SAFEBOOT := ${quote} JTAG-SAFE ${quote} toprel = $(subst $(realpath $(TOP))/,,$(abspath $(1))) @@ -243,5 +245,34 @@ wipe: -c "flash erase_address pad $(2) $(3)" \ -c "reset run" \ -c "shutdown" + +reset: + @echo $(MSG_JTAG_RESET) resetting device + $(V1) $(OOCD_EXE) \ + $$(OOCD_JTAG_SETUP) \ + $$(OOCD_BOARD_RESET) \ + -c "reset run" \ + -c "shutdown" + +# Enable PWR and BKP clocks (set RCC_APB1ENR[PWREN|BKPEN]) +OOCD_WRITE_BKPDR3 = -c "mww 0x4002101C 0x18000000" +# Enable writes to BKP registers (set PWR_CR[DBP] via bit op alias address) +# +# Direct register access would be: +# mww 0x40007000 0x00000100 +# +# Direct _bit_ access is: +# Bit 8 in 0x40007000 = 0x42000000 + 0x7000 * 32 + 8 * 4 = 420E0020 +OOCD_WRITE_BKPDR3 += -c "mww 0x420E0020 0x00000001" +# Set BR3 to max value to force a safe boot +OOCD_WRITE_BKPDR3 += -c "mwh 0x40006C0C 0xFFFF" +safeboot: + @echo $(MSG_JTAG_SAFEBOOT) forcing boot into safe mode + $(V1) $(OOCD_EXE) \ + $$(OOCD_JTAG_SETUP) \ + $$(OOCD_BOARD_RESET) \ + $$(OOCD_WRITE_BKPDR3) \ + -c "reset run" \ + -c "shutdown" endef From 8d8715c8c1c80792d8f7756b0207274ab1a87cb8 Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Mon, 2 Jan 2012 23:28:53 -0500 Subject: [PATCH 085/121] copyright: add/correct GPL + copyright boilerplate I missed some of the boilerplate text on some of the new files I've added recently. Fixed. --- .../CopterControl/inc/pios_usb_board_data.h | 30 +++++++++++++++++++ .../CopterControl/pios_usb_board_data.c | 30 +++++++++++++++++++ .../OpenPilot/inc/pios_usb_board_data.h | 30 +++++++++++++++++++ .../OpenPilot/pios_usb_board_data.c | 30 +++++++++++++++++++ .../PipXtreme/inc/pios_usb_board_data.h | 30 +++++++++++++++++++ .../PipXtreme/pios_usb_board_data.c | 30 +++++++++++++++++++ .../System/inc/pios_usb_board_data.h | 30 +++++++++++++++++++ .../System/pios_usb_board_data.c | 30 +++++++++++++++++++ flight/Modules/Fault/Fault.c | 2 +- .../System/inc/pios_usb_board_data.h | 30 +++++++++++++++++++ flight/OpenPilot/System/pios_usb_board_data.c | 30 +++++++++++++++++++ flight/PiOS/Common/pios_usb_desc_hid_cdc.c | 30 +++++++++++++++++++ flight/PiOS/Common/pios_usb_desc_hid_only.c | 30 +++++++++++++++++++ flight/PiOS/STM32F10x/pios_usbhook.c | 30 +++++++++++++++++++ flight/PiOS/inc/pios_usb_defs.h | 30 +++++++++++++++++++ flight/PiOS/inc/pios_usbhook.h | 30 +++++++++++++++++++ flight/PipXtreme/inc/pios_usb_board_data.h | 30 +++++++++++++++++++ flight/PipXtreme/pios_usb_board_data.c | 30 +++++++++++++++++++ 18 files changed, 511 insertions(+), 1 deletion(-) diff --git a/flight/Bootloaders/CopterControl/inc/pios_usb_board_data.h b/flight/Bootloaders/CopterControl/inc/pios_usb_board_data.h index 14fdd6cfb..85f407a9e 100644 --- a/flight/Bootloaders/CopterControl/inc/pios_usb_board_data.h +++ b/flight/Bootloaders/CopterControl/inc/pios_usb_board_data.h @@ -1,3 +1,33 @@ +/** + ****************************************************************************** + * @addtogroup PIOS PIOS Core hardware abstraction layer + * @{ + * @addtogroup PIOS_USB_BOARD Board specific USB definitions + * @brief Board specific USB definitions + * @{ + * + * @file pios_usb_board_data.h + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. + * @brief Board specific USB definitions + * @see The GNU Public License (GPL) Version 3 + * + *****************************************************************************/ +/* + * 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 + */ + #ifndef PIOS_USB_BOARD_DATA_H #define PIOS_USB_BOARD_DATA_H diff --git a/flight/Bootloaders/CopterControl/pios_usb_board_data.c b/flight/Bootloaders/CopterControl/pios_usb_board_data.c index 68761609a..b39fcbec3 100644 --- a/flight/Bootloaders/CopterControl/pios_usb_board_data.c +++ b/flight/Bootloaders/CopterControl/pios_usb_board_data.c @@ -1,3 +1,33 @@ +/** + ****************************************************************************** + * @addtogroup PIOS PIOS Core hardware abstraction layer + * @{ + * @addtogroup PIOS_USB_BOARD Board specific USB definitions + * @brief Board specific USB definitions + * @{ + * + * @file pios_usb_board_data.c + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. + * @brief Board specific USB definitions + * @see The GNU Public License (GPL) Version 3 + * + *****************************************************************************/ +/* + * 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 + */ + #include "pios_usb_board_data.h" /* struct usb_*, USB_* */ const uint8_t PIOS_USB_BOARD_StringProductID[] = { diff --git a/flight/Bootloaders/OpenPilot/inc/pios_usb_board_data.h b/flight/Bootloaders/OpenPilot/inc/pios_usb_board_data.h index 612c85ff4..d3e1079d6 100644 --- a/flight/Bootloaders/OpenPilot/inc/pios_usb_board_data.h +++ b/flight/Bootloaders/OpenPilot/inc/pios_usb_board_data.h @@ -1,3 +1,33 @@ +/** + ****************************************************************************** + * @addtogroup PIOS PIOS Core hardware abstraction layer + * @{ + * @addtogroup PIOS_USB_BOARD Board specific USB definitions + * @brief Board specific USB definitions + * @{ + * + * @file pios_usb_board_data.h + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. + * @brief Board specific USB definitions + * @see The GNU Public License (GPL) Version 3 + * + *****************************************************************************/ +/* + * 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 + */ + #ifndef PIOS_USB_BOARD_DATA_H #define PIOS_USB_BOARD_DATA_H diff --git a/flight/Bootloaders/OpenPilot/pios_usb_board_data.c b/flight/Bootloaders/OpenPilot/pios_usb_board_data.c index c23cc2891..9492d316e 100644 --- a/flight/Bootloaders/OpenPilot/pios_usb_board_data.c +++ b/flight/Bootloaders/OpenPilot/pios_usb_board_data.c @@ -1,3 +1,33 @@ +/** + ****************************************************************************** + * @addtogroup PIOS PIOS Core hardware abstraction layer + * @{ + * @addtogroup PIOS_USB_BOARD Board specific USB definitions + * @brief Board specific USB definitions + * @{ + * + * @file pios_usb_board_data.c + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. + * @brief Board specific USB definitions + * @see The GNU Public License (GPL) Version 3 + * + *****************************************************************************/ +/* + * 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 + */ + #include "pios_usb_board_data.h" /* struct usb_*, USB_* */ const uint8_t PIOS_USB_BOARD_StringProductID[] = { diff --git a/flight/Bootloaders/PipXtreme/inc/pios_usb_board_data.h b/flight/Bootloaders/PipXtreme/inc/pios_usb_board_data.h index 7fd697d38..fb6ced1f8 100644 --- a/flight/Bootloaders/PipXtreme/inc/pios_usb_board_data.h +++ b/flight/Bootloaders/PipXtreme/inc/pios_usb_board_data.h @@ -1,3 +1,33 @@ +/** + ****************************************************************************** + * @addtogroup PIOS PIOS Core hardware abstraction layer + * @{ + * @addtogroup PIOS_USB_BOARD Board specific USB definitions + * @brief Board specific USB definitions + * @{ + * + * @file pios_usb_board_data.h + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. + * @brief Board specific USB definitions + * @see The GNU Public License (GPL) Version 3 + * + *****************************************************************************/ +/* + * 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 + */ + #ifndef PIOS_USB_BOARD_DATA_H #define PIOS_USB_BOARD_DATA_H diff --git a/flight/Bootloaders/PipXtreme/pios_usb_board_data.c b/flight/Bootloaders/PipXtreme/pios_usb_board_data.c index 3266e1b45..d54ca6565 100644 --- a/flight/Bootloaders/PipXtreme/pios_usb_board_data.c +++ b/flight/Bootloaders/PipXtreme/pios_usb_board_data.c @@ -1,3 +1,33 @@ +/** + ****************************************************************************** + * @addtogroup PIOS PIOS Core hardware abstraction layer + * @{ + * @addtogroup PIOS_USB_BOARD Board specific USB definitions + * @brief Board specific USB definitions + * @{ + * + * @file pios_usb_board_data.c + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. + * @brief Board specific USB definitions + * @see The GNU Public License (GPL) Version 3 + * + *****************************************************************************/ +/* + * 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 + */ + #include "pios_usb_board_data.h" /* struct usb_*, USB_* */ const uint8_t PIOS_USB_BOARD_StringProductID[] = { diff --git a/flight/CopterControl/System/inc/pios_usb_board_data.h b/flight/CopterControl/System/inc/pios_usb_board_data.h index 9f175ce10..ee53c7455 100644 --- a/flight/CopterControl/System/inc/pios_usb_board_data.h +++ b/flight/CopterControl/System/inc/pios_usb_board_data.h @@ -1,3 +1,33 @@ +/** + ****************************************************************************** + * @addtogroup PIOS PIOS Core hardware abstraction layer + * @{ + * @addtogroup PIOS_USB_BOARD Board specific USB definitions + * @brief Board specific USB definitions + * @{ + * + * @file pios_usb_board_data.h + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. + * @brief Board specific USB definitions + * @see The GNU Public License (GPL) Version 3 + * + *****************************************************************************/ +/* + * 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 + */ + #ifndef PIOS_USB_BOARD_DATA_H #define PIOS_USB_BOARD_DATA_H diff --git a/flight/CopterControl/System/pios_usb_board_data.c b/flight/CopterControl/System/pios_usb_board_data.c index 68761609a..b39fcbec3 100644 --- a/flight/CopterControl/System/pios_usb_board_data.c +++ b/flight/CopterControl/System/pios_usb_board_data.c @@ -1,3 +1,33 @@ +/** + ****************************************************************************** + * @addtogroup PIOS PIOS Core hardware abstraction layer + * @{ + * @addtogroup PIOS_USB_BOARD Board specific USB definitions + * @brief Board specific USB definitions + * @{ + * + * @file pios_usb_board_data.c + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. + * @brief Board specific USB definitions + * @see The GNU Public License (GPL) Version 3 + * + *****************************************************************************/ +/* + * 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 + */ + #include "pios_usb_board_data.h" /* struct usb_*, USB_* */ const uint8_t PIOS_USB_BOARD_StringProductID[] = { diff --git a/flight/Modules/Fault/Fault.c b/flight/Modules/Fault/Fault.c index a76ebb4ec..0ac3748a6 100644 --- a/flight/Modules/Fault/Fault.c +++ b/flight/Modules/Fault/Fault.c @@ -6,7 +6,7 @@ * @brief Insert various fault conditions for testing * @{ * - * @file FaultInsertion.c + * @file Fault.c * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. * @brief Fault module, inserts faults for testing * @see The GNU Public License (GPL) Version 3 diff --git a/flight/OpenPilot/System/inc/pios_usb_board_data.h b/flight/OpenPilot/System/inc/pios_usb_board_data.h index 067cf31e6..e2f079bc2 100644 --- a/flight/OpenPilot/System/inc/pios_usb_board_data.h +++ b/flight/OpenPilot/System/inc/pios_usb_board_data.h @@ -1,3 +1,33 @@ +/** + ****************************************************************************** + * @addtogroup PIOS PIOS Core hardware abstraction layer + * @{ + * @addtogroup PIOS_USB_BOARD Board specific USB definitions + * @brief Board specific USB definitions + * @{ + * + * @file pios_usb_board_data.h + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. + * @brief Board specific USB definitions + * @see The GNU Public License (GPL) Version 3 + * + *****************************************************************************/ +/* + * 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 + */ + #ifndef PIOS_USB_BOARD_DATA_H #define PIOS_USB_BOARD_DATA_H diff --git a/flight/OpenPilot/System/pios_usb_board_data.c b/flight/OpenPilot/System/pios_usb_board_data.c index c23cc2891..9492d316e 100644 --- a/flight/OpenPilot/System/pios_usb_board_data.c +++ b/flight/OpenPilot/System/pios_usb_board_data.c @@ -1,3 +1,33 @@ +/** + ****************************************************************************** + * @addtogroup PIOS PIOS Core hardware abstraction layer + * @{ + * @addtogroup PIOS_USB_BOARD Board specific USB definitions + * @brief Board specific USB definitions + * @{ + * + * @file pios_usb_board_data.c + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. + * @brief Board specific USB definitions + * @see The GNU Public License (GPL) Version 3 + * + *****************************************************************************/ +/* + * 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 + */ + #include "pios_usb_board_data.h" /* struct usb_*, USB_* */ const uint8_t PIOS_USB_BOARD_StringProductID[] = { diff --git a/flight/PiOS/Common/pios_usb_desc_hid_cdc.c b/flight/PiOS/Common/pios_usb_desc_hid_cdc.c index 776a5be87..a6e95c774 100644 --- a/flight/PiOS/Common/pios_usb_desc_hid_cdc.c +++ b/flight/PiOS/Common/pios_usb_desc_hid_cdc.c @@ -1,3 +1,33 @@ +/** + ****************************************************************************** + * @addtogroup PIOS PIOS Core hardware abstraction layer + * @{ + * @addtogroup PIOS_USB_DESC USB Descriptor definitions + * @brief USB Descriptor definitions for HID and CDC + * @{ + * + * @file pios_usb_desc_hid_cdc.c + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. + * @brief USB Descriptor definitions for HID and CDC + * @see The GNU Public License (GPL) Version 3 + * + *****************************************************************************/ +/* + * 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 + */ + #include "pios_usb_board_data.h" /* struct usb_*, USB_* */ const struct usb_device_desc PIOS_USB_BOARD_DeviceDescriptor = { diff --git a/flight/PiOS/Common/pios_usb_desc_hid_only.c b/flight/PiOS/Common/pios_usb_desc_hid_only.c index 68e24e491..913c18b16 100644 --- a/flight/PiOS/Common/pios_usb_desc_hid_only.c +++ b/flight/PiOS/Common/pios_usb_desc_hid_only.c @@ -1,3 +1,33 @@ +/** + ****************************************************************************** + * @addtogroup PIOS PIOS Core hardware abstraction layer + * @{ + * @addtogroup PIOS_USB_DESC USB Descriptor definitions + * @brief USB Descriptor definitions for HID only + * @{ + * + * @file pios_usb_desc_hid_only.c + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. + * @brief USB Descriptor definitions for HID only + * @see The GNU Public License (GPL) Version 3 + * + *****************************************************************************/ +/* + * 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 + */ + #include "pios_usb_board_data.h" /* struct usb_*, USB_* */ const struct usb_device_desc PIOS_USB_BOARD_DeviceDescriptor = { diff --git a/flight/PiOS/STM32F10x/pios_usbhook.c b/flight/PiOS/STM32F10x/pios_usbhook.c index 3d2bb8df2..ade1f8ac1 100644 --- a/flight/PiOS/STM32F10x/pios_usbhook.c +++ b/flight/PiOS/STM32F10x/pios_usbhook.c @@ -1,3 +1,33 @@ +/** + ****************************************************************************** + * @addtogroup PIOS PIOS Core hardware abstraction layer + * @{ + * @addtogroup PIOS_USBHOOK USB glue code + * @brief Glue between PiOS and STM32 libs + * @{ + * + * @file pios_usbhook.c + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. + * @brief Glue between PiOS and STM32 libs + * @see The GNU Public License (GPL) Version 3 + * + *****************************************************************************/ +/* + * 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 + */ + #include "pios.h" #include "pios_usb.h" /* PIOS_USB_* */ #include "pios_usbhook.h" diff --git a/flight/PiOS/inc/pios_usb_defs.h b/flight/PiOS/inc/pios_usb_defs.h index 78b2eba69..2e63a8fa4 100644 --- a/flight/PiOS/inc/pios_usb_defs.h +++ b/flight/PiOS/inc/pios_usb_defs.h @@ -1,3 +1,33 @@ +/** + ****************************************************************************** + * @addtogroup PIOS PIOS Core hardware abstraction layer + * @{ + * @addtogroup PIOS_USB_DEFS USB standard types and definitions + * @brief USB standard types and definitions + * @{ + * + * @file pios_usb_defs.h + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. + * @brief USB Standard types and definitions + * @see The GNU Public License (GPL) Version 3 + * + *****************************************************************************/ +/* + * 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 + */ + #ifndef PIOS_USB_DEFS_H #define PIOS_USB_DEFS_H diff --git a/flight/PiOS/inc/pios_usbhook.h b/flight/PiOS/inc/pios_usbhook.h index 9246afcff..d5f032450 100644 --- a/flight/PiOS/inc/pios_usbhook.h +++ b/flight/PiOS/inc/pios_usbhook.h @@ -1,3 +1,33 @@ +/** + ****************************************************************************** + * @addtogroup PIOS PIOS Core hardware abstraction layer + * @{ + * @addtogroup PIOS_USBHOOK USB glue code + * @brief Glue between PiOS and STM32 libs + * @{ + * + * @file pios_usbhook.h + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. + * @brief APIs for PIOS_USBHOOK layer + * @see The GNU Public License (GPL) Version 3 + * + *****************************************************************************/ +/* + * 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 + */ + #ifndef PIOS_USBHOOK_H #define PIOS_USBHOOK_H diff --git a/flight/PipXtreme/inc/pios_usb_board_data.h b/flight/PipXtreme/inc/pios_usb_board_data.h index 4ec9fa1c8..95dc03d73 100644 --- a/flight/PipXtreme/inc/pios_usb_board_data.h +++ b/flight/PipXtreme/inc/pios_usb_board_data.h @@ -1,3 +1,33 @@ +/** + ****************************************************************************** + * @addtogroup PIOS PIOS Core hardware abstraction layer + * @{ + * @addtogroup PIOS_USB_BOARD Board specific USB definitions + * @brief Board specific USB definitions + * @{ + * + * @file pios_usb_board_data.h + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. + * @brief Board specific USB definitions + * @see The GNU Public License (GPL) Version 3 + * + *****************************************************************************/ +/* + * 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 + */ + #ifndef PIOS_USB_BOARD_DATA_H #define PIOS_USB_BOARD_DATA_H diff --git a/flight/PipXtreme/pios_usb_board_data.c b/flight/PipXtreme/pios_usb_board_data.c index 3266e1b45..d54ca6565 100644 --- a/flight/PipXtreme/pios_usb_board_data.c +++ b/flight/PipXtreme/pios_usb_board_data.c @@ -1,3 +1,33 @@ +/** + ****************************************************************************** + * @addtogroup PIOS PIOS Core hardware abstraction layer + * @{ + * @addtogroup PIOS_USB_BOARD Board specific USB definitions + * @brief Board specific USB definitions + * @{ + * + * @file pios_usb_board_data.c + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. + * @brief Board specific USB definitions + * @see The GNU Public License (GPL) Version 3 + * + *****************************************************************************/ +/* + * 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 + */ + #include "pios_usb_board_data.h" /* struct usb_*, USB_* */ const uint8_t PIOS_USB_BOARD_StringProductID[] = { From e22bc0c51b3b4e11a343458caa302fa48adbfe4e Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Mon, 2 Jan 2012 23:33:07 -0500 Subject: [PATCH 086/121] copyright: remove incorrect attribution in boilerplate text These files do not contain content from the ID in the header. This name seems to have been cut/pasted all over throughout the openpilot source tree and should be removed from any files that should not rightfully be attributed to this person. --- flight/PiOS/Common/pios_com.c | 1 - flight/PiOS/STM32F10x/pios_i2c.c | 1 - flight/PiOS/STM32F10x/pios_spi.c | 1 - flight/PiOS/STM32F10x/pios_usart.c | 1 - flight/PiOS/inc/pios_com.h | 1 - flight/PiOS/inc/pios_com_priv.h | 1 - flight/PiOS/inc/pios_delay.h | 1 - flight/PiOS/inc/pios_i2c.h | 1 - flight/PiOS/inc/pios_i2c_priv.h | 1 - flight/PiOS/inc/pios_rcvr_priv.h | 1 - flight/PiOS/inc/pios_spi.h | 1 - flight/PiOS/inc/pios_spi_priv.h | 1 - flight/PiOS/inc/pios_usart.h | 1 - flight/PiOS/inc/pios_usart_priv.h | 1 - flight/PiOS/inc/pios_usb_hid.h | 1 - 15 files changed, 15 deletions(-) diff --git a/flight/PiOS/Common/pios_com.c b/flight/PiOS/Common/pios_com.c index 992167bad..20e32ffd3 100644 --- a/flight/PiOS/Common/pios_com.c +++ b/flight/PiOS/Common/pios_com.c @@ -8,7 +8,6 @@ * * @file pios_com.c * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. - * Parts by Thorsten Klose (tk@midibox.org) * @brief COM layer functions * @see The GNU Public License (GPL) Version 3 * diff --git a/flight/PiOS/STM32F10x/pios_i2c.c b/flight/PiOS/STM32F10x/pios_i2c.c index 6e623d597..90c208133 100644 --- a/flight/PiOS/STM32F10x/pios_i2c.c +++ b/flight/PiOS/STM32F10x/pios_i2c.c @@ -8,7 +8,6 @@ * * @file pios_i2c.c * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. - * Parts by Thorsten Klose (tk@midibox.org) (tk@midibox.org) * @brief I2C Enable/Disable routines * @see The GNU Public License (GPL) Version 3 * diff --git a/flight/PiOS/STM32F10x/pios_spi.c b/flight/PiOS/STM32F10x/pios_spi.c index a5e57335f..a47e27d83 100644 --- a/flight/PiOS/STM32F10x/pios_spi.c +++ b/flight/PiOS/STM32F10x/pios_spi.c @@ -8,7 +8,6 @@ * * @file pios_spi.c * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. - * Parts by Thorsten Klose (tk@midibox.org) (tk@midibox.org) * @brief Hardware Abstraction Layer for SPI ports of STM32 * @see The GNU Public License (GPL) Version 3 * @notes diff --git a/flight/PiOS/STM32F10x/pios_usart.c b/flight/PiOS/STM32F10x/pios_usart.c index a8221ad0b..041738f70 100644 --- a/flight/PiOS/STM32F10x/pios_usart.c +++ b/flight/PiOS/STM32F10x/pios_usart.c @@ -8,7 +8,6 @@ * * @file pios_usart.c * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. - * Parts by Thorsten Klose (tk@midibox.org) (tk@midibox.org) * @brief USART commands. Inits USARTs, controls USARTs & Interupt handlers. (STM32 dependent) * @see The GNU Public License (GPL) Version 3 * diff --git a/flight/PiOS/inc/pios_com.h b/flight/PiOS/inc/pios_com.h index 1bda392f6..19abb2f27 100644 --- a/flight/PiOS/inc/pios_com.h +++ b/flight/PiOS/inc/pios_com.h @@ -8,7 +8,6 @@ * * @file pios_com.h * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. - * Parts by Thorsten Klose (tk@midibox.org) * @brief COM layer functions header * @see The GNU Public License (GPL) Version 3 * diff --git a/flight/PiOS/inc/pios_com_priv.h b/flight/PiOS/inc/pios_com_priv.h index ff7a97d83..7bd9a9be0 100644 --- a/flight/PiOS/inc/pios_com_priv.h +++ b/flight/PiOS/inc/pios_com_priv.h @@ -8,7 +8,6 @@ * * @file pios_com_priv.h * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. - * Parts by Thorsten Klose (tk@midibox.org) * @brief COM private definitions. * @see The GNU Public License (GPL) Version 3 * diff --git a/flight/PiOS/inc/pios_delay.h b/flight/PiOS/inc/pios_delay.h index 17e6d0452..545deb841 100644 --- a/flight/PiOS/inc/pios_delay.h +++ b/flight/PiOS/inc/pios_delay.h @@ -8,7 +8,6 @@ * * @file pios_settings.h * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. - * Parts by Thorsten Klose (tk@midibox.org) * @brief Settings functions header * @see The GNU Public License (GPL) Version 3 * diff --git a/flight/PiOS/inc/pios_i2c.h b/flight/PiOS/inc/pios_i2c.h index 5264e0122..cd8a0ff22 100644 --- a/flight/PiOS/inc/pios_i2c.h +++ b/flight/PiOS/inc/pios_i2c.h @@ -7,7 +7,6 @@ * * @file pios_i2c.h * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. - * Parts by Thorsten Klose (tk@midibox.org) * @brief I2C functions header. * @see The GNU Public License (GPL) Version 3 * diff --git a/flight/PiOS/inc/pios_i2c_priv.h b/flight/PiOS/inc/pios_i2c_priv.h index 604087b18..5834fef34 100644 --- a/flight/PiOS/inc/pios_i2c_priv.h +++ b/flight/PiOS/inc/pios_i2c_priv.h @@ -3,7 +3,6 @@ * * @file pios_i2c_priv.h * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. - * Parts by Thorsten Klose (tk@midibox.org) * @brief I2C private definitions. * @see The GNU Public License (GPL) Version 3 * diff --git a/flight/PiOS/inc/pios_rcvr_priv.h b/flight/PiOS/inc/pios_rcvr_priv.h index 968dc2116..7b41d2764 100644 --- a/flight/PiOS/inc/pios_rcvr_priv.h +++ b/flight/PiOS/inc/pios_rcvr_priv.h @@ -8,7 +8,6 @@ * * @file pios_rcvr_priv.h * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. - * Parts by Thorsten Klose (tk@midibox.org) * @brief USART private definitions. * @see The GNU Public License (GPL) Version 3 * diff --git a/flight/PiOS/inc/pios_spi.h b/flight/PiOS/inc/pios_spi.h index d780b91a2..e34b7e4c9 100644 --- a/flight/PiOS/inc/pios_spi.h +++ b/flight/PiOS/inc/pios_spi.h @@ -7,7 +7,6 @@ * * @file pios_spi.h * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. - * Parts by Thorsten Klose (tk@midibox.org) * @brief SPI functions header. * @see The GNU Public License (GPL) Version 3 * diff --git a/flight/PiOS/inc/pios_spi_priv.h b/flight/PiOS/inc/pios_spi_priv.h index 65c10e3e2..71468b63a 100644 --- a/flight/PiOS/inc/pios_spi_priv.h +++ b/flight/PiOS/inc/pios_spi_priv.h @@ -8,7 +8,6 @@ * * @file pios_spi_priv.h * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. - * Parts by Thorsten Klose (tk@midibox.org) * @brief SPI private definitions. * @see The GNU Public License (GPL) Version 3 * diff --git a/flight/PiOS/inc/pios_usart.h b/flight/PiOS/inc/pios_usart.h index 2eb009652..d7bebc18e 100644 --- a/flight/PiOS/inc/pios_usart.h +++ b/flight/PiOS/inc/pios_usart.h @@ -8,7 +8,6 @@ * * @file pios_usart.h * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. - * Parts by Thorsten Klose (tk@midibox.org) * @brief USART functions header. * @see The GNU Public License (GPL) Version 3 * diff --git a/flight/PiOS/inc/pios_usart_priv.h b/flight/PiOS/inc/pios_usart_priv.h index edca829aa..defe3bb8a 100644 --- a/flight/PiOS/inc/pios_usart_priv.h +++ b/flight/PiOS/inc/pios_usart_priv.h @@ -8,7 +8,6 @@ * * @file pios_usart_priv.h * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. - * Parts by Thorsten Klose (tk@midibox.org) * @brief USART private definitions. * @see The GNU Public License (GPL) Version 3 * diff --git a/flight/PiOS/inc/pios_usb_hid.h b/flight/PiOS/inc/pios_usb_hid.h index da353c555..7a7409631 100644 --- a/flight/PiOS/inc/pios_usb_hid.h +++ b/flight/PiOS/inc/pios_usb_hid.h @@ -7,7 +7,6 @@ * * @file pios_usb_hid.h * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. - * Parts by Thorsten Klose (tk@midibox.org) * @brief USB HID layer functions header * @see The GNU Public License (GPL) Version 3 * From b9eecadbe297e664fd1a16182b941219488e1c87 Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Mon, 2 Jan 2012 23:35:39 -0500 Subject: [PATCH 087/121] alarms: add BootFault alarm to system health SVG files Original changes provided by Jose, text was slightly modified to match alarm name. --- .../diagrams/default/system-health.svg | 71 ++++++++++++++----- 1 file changed, 55 insertions(+), 16 deletions(-) diff --git a/ground/openpilotgcs/share/openpilotgcs/diagrams/default/system-health.svg b/ground/openpilotgcs/share/openpilotgcs/diagrams/default/system-health.svg index d7928b89e..7667ecbb9 100644 --- a/ground/openpilotgcs/share/openpilotgcs/diagrams/default/system-health.svg +++ b/ground/openpilotgcs/share/openpilotgcs/diagrams/default/system-health.svg @@ -14,8 +14,8 @@ height="79.57505" id="svg3604" version="1.1" - inkscape:version="0.48.0 r9654" - sodipodi:docname="system-health-path.svg" + inkscape:version="0.47pre4 r22446" + sodipodi:docname="system-health1.svg" inkscape:export-filename="C:\NoBackup\OpenPilot\mainboard-health.png" inkscape:export-xdpi="269.53" inkscape:export-ydpi="269.53" @@ -594,17 +594,17 @@ borderopacity="1.0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" - inkscape:zoom="4.6775775" - inkscape:cx="48.833406" - inkscape:cy="55.424138" - inkscape:current-layer="foreground" + inkscape:zoom="6.6150935" + inkscape:cx="44.907363" + inkscape:cy="47.413196" + inkscape:current-layer="g4794" id="namedview3608" showgrid="false" - inkscape:window-width="1366" - inkscape:window-height="691" + inkscape:window-width="1280" + inkscape:window-height="775" inkscape:window-x="0" - inkscape:window-y="24" - inkscape:window-maximized="1" + inkscape:window-y="25" + inkscape:window-maximized="0" showguides="true" inkscape:guide-bbox="true"> + + + Boot Fault + style="display:none"> Date: Mon, 2 Jan 2012 23:57:58 -0500 Subject: [PATCH 088/121] history: added notes about newly added features --- HISTORY.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/HISTORY.txt b/HISTORY.txt index aba9effab..a2b6cd49a 100644 --- a/HISTORY.txt +++ b/HISTORY.txt @@ -1,5 +1,10 @@ Short summary of changes. For a complete list see the git log. +2012-01-02 +CC FW now supports USB Virtual Com Port (VCP/CDC) in addition to the original HID interface +New ComUsbBridge module can bridge any serial port to the USB CDC port +CC FW now detects repeated faults during init and boots with default hwsettings + 2011-12-10 Merged a change that sorts the UAVO fields based on size. Because this changes all of the objects, erase all existing flash files based on this. From 3bc45b0036e657a7b7972ad321d3d81ad14d0f7e Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Wed, 4 Jan 2012 00:38:19 -0500 Subject: [PATCH 089/121] usb cdc: use proper macro for CDC mgmt endpoint packet size The hard-coded value (16) in the descriptor differed from the macro (32) which was used to configure the low-level USB HW block in the STM32. --- flight/PiOS/Common/pios_usb_desc_hid_cdc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flight/PiOS/Common/pios_usb_desc_hid_cdc.c b/flight/PiOS/Common/pios_usb_desc_hid_cdc.c index a6e95c774..5c21e15ca 100644 --- a/flight/PiOS/Common/pios_usb_desc_hid_cdc.c +++ b/flight/PiOS/Common/pios_usb_desc_hid_cdc.c @@ -146,7 +146,7 @@ const struct usb_board_config PIOS_USB_BOARD_Configuration = { .bDescriptorType = USB_DESC_TYPE_ENDPOINT, .bEndpointAddress = USB_EP_IN(2), .bmAttributes = USB_EP_ATTR_TT_INTERRUPT, - .wMaxPacketSize = htousbs(16), + .wMaxPacketSize = htousbs(PIOS_USB_BOARD_CDC_MGMT_LENGTH), .bInterval = 4, /* ms */ }, .cdc_data_if = { From 82d91d9830f761917064a865e6981d0efd0560f2 Mon Sep 17 00:00:00 2001 From: James Cotton Date: Tue, 3 Jan 2012 12:46:38 -0600 Subject: [PATCH 090/121] Talked PT into a simpler firmware mismatch warning in exchange for more photoshop. --- .../src/plugins/uploader/uploadergadgetwidget.cpp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/uploader/uploadergadgetwidget.cpp b/ground/openpilotgcs/src/plugins/uploader/uploadergadgetwidget.cpp index c0a1aea90..73bc0c535 100755 --- a/ground/openpilotgcs/src/plugins/uploader/uploadergadgetwidget.cpp +++ b/ground/openpilotgcs/src/plugins/uploader/uploadergadgetwidget.cpp @@ -627,10 +627,8 @@ void UploaderGadgetWidget::versionMatchCheck() qDebug()<0) - msg->showMessage(QString("Incompatible GCS and FW detected, you should upgrade your board's Firmware to %1 version.").arg(gcsDescription)); - else - msg->showMessage(QString("Incompatible GCS and FW detected, you should upgrade your GCS to %1 version.").arg(boardDescription.gitTag+":"+boardDescription.buildDate)); - + msg->showMessage(QString(tr("GCS and FW versions do not match which can cause configuration problems.")) + " \n" + + QString(tr("GCS Versions: ")) + gcsDescription + " \n" + + QString(tr("FW Versions: ")) + boardDescription.gitTag+":"+boardDescription.buildDate); } } From 14ee6e4fb569d1255fd7e5c84159de17afc428d5 Mon Sep 17 00:00:00 2001 From: James Cotton Date: Wed, 4 Jan 2012 11:13:54 -0600 Subject: [PATCH 091/121] When configuring a heli transmitter instruct the user to disable throttle hold. --- ground/openpilotgcs/src/plugins/config/configinputwidget.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp b/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp index 128f9885b..863104447 100644 --- a/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp +++ b/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp @@ -622,6 +622,8 @@ void ConfigInputWidget::setChannel(int newChan) m_config->wzText->setText(QString(tr("Please enable throttle hold mode and move the collective pitch stick"))); else if (newChan == ManualControlSettings::CHANNELGROUPS_FLIGHTMODE) m_config->wzText->setText(QString(tr("Please flick the flight mode switch. For switches you may have to repeat this rapidly."))); + else if((transmitterType == heli) && (newChan == ManualControlSettings::CHANNELGROUPS_THROTTLE)) + m_config->wzText->setText(QString(tr("Please disable throttle hold mode and move the throttle stick"))); else m_config->wzText->setText(QString(tr("Please move each control once at a time according to the instructions and picture below.\n\n" "Move the %1 stick")).arg(manualSettingsObj->getField("ChannelGroups")->getElementNames().at(newChan))); From 6c38114cfc7676ea4b7f3e0cdef3ee8c507cf75b Mon Sep 17 00:00:00 2001 From: naiiawah Date: Wed, 4 Jan 2012 21:39:23 -0700 Subject: [PATCH 092/121] Fixed borkage in the rules file where the if test was malformed. Added a change to force an error if the passed in ENV var is not defined. If that had been there, the borkage wouldn't have been undetected. Changed to only put the main FW in the firmware dir, instead of BL and FW. --- package/Makefile.linux | 2 +- package/linux/deb_common/rules | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) mode change 100755 => 100644 package/linux/deb_common/rules diff --git a/package/Makefile.linux b/package/Makefile.linux index fba2ef3ff..78e902d71 100644 --- a/package/Makefile.linux +++ b/package/Makefile.linux @@ -49,7 +49,7 @@ linux_deb_package: deb_build gcs deb_build: | $(DEB_BUILD_DIR) $(ALL_DEB_FILES) $(BUILD_DIR)/build @echo $@ starting - $(V1)$(shell echo $(PACKAGE_DIR) > $(BUILD_DIR)/package_dir) + $(V1)$(shell echo $(FW_DIR) > $(BUILD_DIR)/package_dir) $(V1)sed -i -e "$(SED_SCRIPT)" $(DEB_BUILD_DIR)/changelog $(BUILD_DIR)/build: package_flight diff --git a/package/linux/deb_common/rules b/package/linux/deb_common/rules old mode 100755 new mode 100644 index c4a7d9bd9..ba22c1e9c --- a/package/linux/deb_common/rules +++ b/package/linux/deb_common/rules @@ -43,8 +43,10 @@ install: cp -arp package/linux/openpilot_menu.png debian/openpilot/usr/share/pixmaps cp -arp package/linux/openpilot_menu.menu debian/openpilot/etc/xdg/menus/applications-merged cp -arp package/linux/openpilot_menu.directory debian/openpilot/usr/share/desktop-directories -ifdef $(PACKAGE_DIR) - cp -ar $(PACKAGE_DIR)/* debian/openpilot/usr/local/OpenPilot/firmware/ +ifdef PACKAGE_DIR + cp -a $(PACKAGE_DIR)/*.opfw debian/openpilot/usr/local/OpenPilot/firmware/ +else + $(error PACKAGE_DIR not defined! $(PACKAGE_DIR)) endif ln -s /usr/local/OpenPilot/bin/openpilotgcs.bin `pwd`/debian/openpilot/usr/bin/openpilot-gcs rm -rf debian/openpilot/usr/local/OpenPilot/share/openpilotgcs/sounds/sounds From 08a498aa484fa5c9640d3a834e29663322dd05b1 Mon Sep 17 00:00:00 2001 From: dankers Date: Sat, 7 Jan 2012 05:43:20 +1100 Subject: [PATCH 093/121] Update font file --- artwork/Font/OpenPilot.ttf | Bin 9588 -> 10120 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/artwork/Font/OpenPilot.ttf b/artwork/Font/OpenPilot.ttf index c3bb5765c75c3f450be3107a1bb88993bf56f9c1..c61597d72db64f6ba8f0eaadddd71818fb50ca0e 100644 GIT binary patch delta 1261 zcmc&vOHUJF6un<(_=ZAT9Xrzz6l|H10!AJV%v8aM38GOE;{!A?VuKW{eQ7IJX&ECi z8g-#*!osjn7qBxVO?)Jp7+)cT4PENOg*#0QF&YzXiURHUM&9&>xQhKq-Lt687T3(1ie3dG$0x1wir*4fs#~O1vAue^0TrAtYAW z*crrMv6P{3BKhc5z7A*I0$?tNqW%6aGoQx+=n3Rrg#F1F{IF<+-?5!YrqX}wW8v8=DL zyz3{H`~FS;egAA#u`U`8GY1v6dCL=62_C3}R@e#qp$CQ_1_?;PO&Etsfc2WLd8@tE zoF=&>7e_gUa})Q)XmQ=Fy;T`XiNiRg}f0(w!R z6Y}QN`DFjd_xEm(Ah1k%na3@NEL(Q0F4P~4G`H0{^u~kx+B>XdZi#8FvFi;7jqYt7 z)(U1ukSn*CZ3G@zG(xG^G}y5bO%cn1QJ& z(ijYy&15dPID4FBpG{Lbo$l@clr=k(}R(EISo-&u2Rvek|dhRz3Vq@L_ delta 729 zcmeD1|Kc@4v3{R~00RRn4+8^ZP2%uRL7#NtVa`KZCTR$`%U|?WN z0E!*TO{^$j_{C%fWP|i5 Date: Sat, 7 Jan 2012 09:45:33 -0500 Subject: [PATCH 094/121] usb cdc: fix index of first interface in IAD This error resulted in the HID interface being non functional on windows platforms. --- flight/PiOS/Common/pios_usb_desc_hid_cdc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flight/PiOS/Common/pios_usb_desc_hid_cdc.c b/flight/PiOS/Common/pios_usb_desc_hid_cdc.c index 5c21e15ca..3d5748163 100644 --- a/flight/PiOS/Common/pios_usb_desc_hid_cdc.c +++ b/flight/PiOS/Common/pios_usb_desc_hid_cdc.c @@ -61,7 +61,7 @@ const struct usb_board_config PIOS_USB_BOARD_Configuration = { .iad = { .bLength = sizeof(struct usb_interface_association_desc), .bDescriptorType = USB_DESC_TYPE_IAD, - .bFirstInterface = 1, + .bFirstInterface = 0, .bInterfaceCount = 2, .bFunctionClass = 2, /* Communication */ .bFunctionSubClass = 2, /* Abstract Control Model */ From fb0fbb150dae4e1e401e0d67a1191fb38d2ce5cd Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Sat, 7 Jan 2012 09:52:25 -0500 Subject: [PATCH 095/121] bl: bump CC bootloader version to reflect safe boot support --- make/boards/coptercontrol/board-info.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/make/boards/coptercontrol/board-info.mk b/make/boards/coptercontrol/board-info.mk index 547692212..1f8e52610 100644 --- a/make/boards/coptercontrol/board-info.mk +++ b/make/boards/coptercontrol/board-info.mk @@ -1,6 +1,6 @@ BOARD_TYPE := 0x04 BOARD_REVISION := 0x01 -BOOTLOADER_VERSION := 0x01 +BOOTLOADER_VERSION := 0x02 HW_TYPE := 0x01 MCU := cortex-m3 From 0ce95839ca1b1ccb8f48466aee1f0e335db64964 Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Sat, 7 Jan 2012 17:28:00 -0500 Subject: [PATCH 096/121] stm32flash: Upgrade to revision 61 to support STM32F4 CPU --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 438f697a4..72adb05be 100644 --- a/Makefile +++ b/Makefile @@ -235,7 +235,7 @@ STM32FLASH_DIR := $(TOOLS_DIR)/stm32flash .PHONY: stm32flash_install stm32flash_install: STM32FLASH_URL := http://stm32flash.googlecode.com/svn/trunk -stm32flash_install: STM32FLASH_REV := 52 +stm32flash_install: STM32FLASH_REV := 61 stm32flash_install: stm32flash_clean # download the source $(V0) @echo " DOWNLOAD $(STM32FLASH_URL) @ r$(STM32FLASH_REV)" From 9f2b71a3518d1e848e0f556a3e1914a2d0968656 Mon Sep 17 00:00:00 2001 From: zedamota Date: Mon, 9 Jan 2012 14:06:27 +0000 Subject: [PATCH 097/121] Convert filename to lowercase --- .../src/plugins/notify/{NotificationItem.h => notificationitem.h} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename ground/openpilotgcs/src/plugins/notify/{NotificationItem.h => notificationitem.h} (100%) diff --git a/ground/openpilotgcs/src/plugins/notify/NotificationItem.h b/ground/openpilotgcs/src/plugins/notify/notificationitem.h similarity index 100% rename from ground/openpilotgcs/src/plugins/notify/NotificationItem.h rename to ground/openpilotgcs/src/plugins/notify/notificationitem.h From 38392ee6389c19cf83acc11341b5fe52f8e080be Mon Sep 17 00:00:00 2001 From: zedamota Date: Mon, 9 Jan 2012 16:09:50 +0000 Subject: [PATCH 098/121] several fixes to the notify plugin --- .../openpilotgcs/src/plugins/notify/notificationitem.cpp | 2 ++ ground/openpilotgcs/src/plugins/notify/notifyplugin.cpp | 9 ++------- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/notify/notificationitem.cpp b/ground/openpilotgcs/src/plugins/notify/notificationitem.cpp index 264ffed09..a54e7ff89 100644 --- a/ground/openpilotgcs/src/plugins/notify/notificationitem.cpp +++ b/ground/openpilotgcs/src/plugins/notify/notificationitem.cpp @@ -333,6 +333,8 @@ QStringList valueToSoundList(QString value) QString stringFromValue(QVariant value, UAVObjectField* field) { + if(field==NULL) + return ""; Q_ASSERT(field); Q_ASSERT(!value.isNull()); QString str; diff --git a/ground/openpilotgcs/src/plugins/notify/notifyplugin.cpp b/ground/openpilotgcs/src/plugins/notify/notifyplugin.cpp index 9acb4b6f3..6f74ec018 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifyplugin.cpp +++ b/ground/openpilotgcs/src/plugins/notify/notifyplugin.cpp @@ -256,13 +256,6 @@ void SoundNotifyPlugin::on_arrived_Notification(UAVObject *object) .arg(ntf->singleValue().toString()) .arg(ntf->valueRange2()); - QString fieldName = ntf->getObjectField(); - UAVObjectField* field = object->getField(fieldName); - - qNotifyDebug() << QString("UAV object: %1 | value: %2") - .arg(object->getName()) - .arg(field->getValue().toString()); - checkNotificationRule(ntf, object); } connect(object, SIGNAL(objectUpdated(UAVObject*)), @@ -402,6 +395,8 @@ bool checkRange(double fieldValue, double min, double max, int direction) void SoundNotifyPlugin::checkNotificationRule(NotificationItem* notification, UAVObject* object) { + if(notification->getDataObject()!=object->getName() | object->getField(notification->getObjectField())==NULL) + return; bool condition=false; if (notification->mute()) From 00cb66ae79ae8842b003f6067542d0371433da63 Mon Sep 17 00:00:00 2001 From: zedamota Date: Mon, 9 Jan 2012 16:35:35 +0000 Subject: [PATCH 099/121] OpenPilot OP-602 Please add a Help button on the Firmware page --- .../src/plugins/uploader/uploader.ui | 46 ++++++++++++++----- .../plugins/uploader/uploadergadgetwidget.cpp | 6 +++ .../plugins/uploader/uploadergadgetwidget.h | 2 + 3 files changed, 42 insertions(+), 12 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/uploader/uploader.ui b/ground/openpilotgcs/src/plugins/uploader/uploader.ui index b0dffd4a0..540d69302 100644 --- a/ground/openpilotgcs/src/plugins/uploader/uploader.ui +++ b/ground/openpilotgcs/src/plugins/uploader/uploader.ui @@ -6,7 +6,7 @@ 0 0 - 580 + 583 350 @@ -144,6 +144,26 @@ halting a running board. + + + + + + + + :/core/images/helpicon.svg:/core/images/helpicon.svg + + + + 30 + 30 + + + + true + + + @@ -166,14 +186,14 @@ halting a running board. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">To upgrade the firmware in your boards, proceed as follows:</p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">- Connect telemetry</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">- Once telemetry is running, press &quot;Halt&quot; above</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">- You will get a list of devices.</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">- You can then upload/download to/from each board as you wish</p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">- You can resume operations by pressing &quot;Boot&quot;</p></body></html> +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Ubuntu'; font-size:11pt;">To upgrade the firmware in your boards, proceed as follows:</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Ubuntu'; font-size:11pt;"></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Ubuntu'; font-size:11pt;">- Connect telemetry</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Ubuntu'; font-size:11pt;">- Once telemetry is running, press &quot;Halt&quot; above</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Ubuntu'; font-size:11pt;">- You will get a list of devices.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Ubuntu'; font-size:11pt;">- You can then upload/download to/from each board as you wish</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Ubuntu'; font-size:11pt;">- You can resume operations by pressing &quot;Boot&quot;</span></p></body></html> @@ -188,14 +208,16 @@ p, li { white-space: pre-wrap; } <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Ubuntu'; font-size:11pt;"></p></body></html> - + + + diff --git a/ground/openpilotgcs/src/plugins/uploader/uploadergadgetwidget.cpp b/ground/openpilotgcs/src/plugins/uploader/uploadergadgetwidget.cpp index 182753b24..851334c86 100755 --- a/ground/openpilotgcs/src/plugins/uploader/uploadergadgetwidget.cpp +++ b/ground/openpilotgcs/src/plugins/uploader/uploadergadgetwidget.cpp @@ -64,6 +64,7 @@ UploaderGadgetWidget::UploaderGadgetWidget(QWidget *parent) : QWidget(parent) connect(m_config->refreshPorts, SIGNAL(clicked()), this, SLOT(getSerialPorts())); + connect(m_config->pbHelp,SIGNAL(clicked()),this,SLOT(openHelp())); // And check whether by any chance we are not already connected if (telMngr->isConnected()) { @@ -650,3 +651,8 @@ void UploaderGadgetWidget::versionMatchCheck() QString(tr("FW Versions: ")) + boardDescription.gitTag+":"+boardDescription.buildDate); } } +void UploaderGadgetWidget::openHelp() +{ + + QDesktopServices::openUrl( QUrl("http://wiki.openpilot.org/display/Doc/Uploader+Plugin", QUrl::StrictMode) ); +} diff --git a/ground/openpilotgcs/src/plugins/uploader/uploadergadgetwidget.h b/ground/openpilotgcs/src/plugins/uploader/uploadergadgetwidget.h index 998166d69..2c6814827 100755 --- a/ground/openpilotgcs/src/plugins/uploader/uploadergadgetwidget.h +++ b/ground/openpilotgcs/src/plugins/uploader/uploadergadgetwidget.h @@ -55,6 +55,7 @@ #include "devicedescriptorstruct.h" #include #include +#include using namespace OP_DFU; @@ -74,6 +75,7 @@ public slots: void onAutopilotConnect(); void onAutopilotDisconnect(); void populate(); + void openHelp(); private: Ui_UploaderWidget *m_config; DFUObject *dfu; From dbd9fcda281974cdbe5392da5c18d078a1a49fb4 Mon Sep 17 00:00:00 2001 From: zedamota Date: Mon, 9 Jan 2012 16:53:59 +0000 Subject: [PATCH 100/121] OpenPilot OP-611 disable Flash button during operation --- ground/openpilotgcs/src/plugins/uploader/devicewidget.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/ground/openpilotgcs/src/plugins/uploader/devicewidget.cpp b/ground/openpilotgcs/src/plugins/uploader/devicewidget.cpp index 9e57a4225..cf4315596 100644 --- a/ground/openpilotgcs/src/plugins/uploader/devicewidget.cpp +++ b/ground/openpilotgcs/src/plugins/uploader/devicewidget.cpp @@ -358,8 +358,10 @@ void deviceWidget::loadFirmware() */ void deviceWidget::uploadFirmware() { + myDevice->updateButton->setEnabled(false); if (!m_dfu->devices[deviceID].Writable) { status("Device not writable!", STATUSICON_FAIL); + myDevice->updateButton->setEnabled(true); return; } @@ -378,6 +380,7 @@ void deviceWidget::uploadFirmware() int firmwareBoard = ((desc.at(12)&0xff)<<8) + (desc.at(13)&0xff); if (firmwareBoard != board) { status("Error: firmware does not match board", STATUSICON_FAIL); + myDevice->updateButton->setEnabled(true); return; } // Check the firmware embedded in the file: @@ -385,6 +388,7 @@ void deviceWidget::uploadFirmware() QByteArray fileHash = QCryptographicHash::hash(loadedFW.left(loadedFW.length()-100), QCryptographicHash::Sha1); if (firmwareHash != fileHash) { status("Error: firmware file corrupt", STATUSICON_FAIL); + myDevice->updateButton->setEnabled(true); return; } } else { @@ -400,6 +404,7 @@ void deviceWidget::uploadFirmware() if(!m_dfu->enterDFU(deviceID)) { status("Error:Could not enter DFU mode", STATUSICON_FAIL); + myDevice->updateButton->setEnabled(true); return; } OP_DFU::Status ret=m_dfu->StatusRequest(); @@ -412,6 +417,7 @@ void deviceWidget::uploadFirmware() bool retstatus = m_dfu->UploadFirmware(filename,verify, deviceID); if(!retstatus ) { status("Could not start upload", STATUSICON_FAIL); + myDevice->updateButton->setEnabled(true); return; } status("Uploading, please wait...", STATUSICON_RUNNING); @@ -465,6 +471,7 @@ void deviceWidget::downloadFinished() */ void deviceWidget::uploadFinished(OP_DFU::Status retstatus) { + myDevice->updateButton->setEnabled(true); disconnect(m_dfu, SIGNAL(uploadFinished(OP_DFU::Status)), this, SLOT(uploadFinished(OP_DFU::Status))); disconnect(m_dfu, SIGNAL(progressUpdated(int)), this, SLOT(setProgress(int))); disconnect(m_dfu, SIGNAL(operationProgress(QString)), this, SLOT(dfuStatus(QString))); From 63bb2874d732654180ca9126b6b3c53b17aa88fb Mon Sep 17 00:00:00 2001 From: zedamota Date: Tue, 10 Jan 2012 17:03:58 +0000 Subject: [PATCH 101/121] OP-608 Camera Stabilization settings not being read from CC board into GCS if CC is started first. Created connection callback only to be called after all plugins are loaded. --- .../src/libs/extensionsystem/pluginmanager.cpp | 4 +++- .../src/libs/extensionsystem/pluginmanager.h | 4 +++- .../plugins/coreplugin/connectionmanager.cpp | 17 +++++++++++++++++ .../src/plugins/coreplugin/connectionmanager.h | 3 ++- 4 files changed, 25 insertions(+), 3 deletions(-) diff --git a/ground/openpilotgcs/src/libs/extensionsystem/pluginmanager.cpp b/ground/openpilotgcs/src/libs/extensionsystem/pluginmanager.cpp index edd65d3ce..d8e637802 100644 --- a/ground/openpilotgcs/src/libs/extensionsystem/pluginmanager.cpp +++ b/ground/openpilotgcs/src/libs/extensionsystem/pluginmanager.cpp @@ -177,7 +177,7 @@ PluginManager *PluginManager::instance() Create a plugin manager. Should be done only once per application. */ PluginManager::PluginManager() - : d(new PluginManagerPrivate(this)) + : d(new PluginManagerPrivate(this)),m_allPluginsLoaded(false) { m_instance = this; } @@ -586,6 +586,8 @@ void PluginManagerPrivate::loadPlugins() loadPlugin(it.previous(), PluginSpec::Running); } emit q->pluginsChanged(); + q->m_allPluginsLoaded=true; + emit q->pluginsLoadEnded(); } /*! diff --git a/ground/openpilotgcs/src/libs/extensionsystem/pluginmanager.h b/ground/openpilotgcs/src/libs/extensionsystem/pluginmanager.h index 6182b388e..49bcd5c55 100644 --- a/ground/openpilotgcs/src/libs/extensionsystem/pluginmanager.h +++ b/ground/openpilotgcs/src/libs/extensionsystem/pluginmanager.h @@ -56,7 +56,7 @@ class EXTENSIONSYSTEM_EXPORT PluginManager : public QObject public: static PluginManager *instance(); - + bool allPluginsLoaded(){return m_allPluginsLoaded;} PluginManager(); virtual ~PluginManager(); @@ -115,6 +115,7 @@ signals: void aboutToRemoveObject(QObject *obj); void pluginsChanged(); + void pluginsLoadEnded(); private slots: void startTests(); @@ -122,6 +123,7 @@ private: Internal::PluginManagerPrivate *d; static PluginManager *m_instance; mutable QReadWriteLock m_lock; + bool m_allPluginsLoaded; friend class Internal::PluginManagerPrivate; }; diff --git a/ground/openpilotgcs/src/plugins/coreplugin/connectionmanager.cpp b/ground/openpilotgcs/src/plugins/coreplugin/connectionmanager.cpp index 9dfa46518..f49d98c0e 100644 --- a/ground/openpilotgcs/src/plugins/coreplugin/connectionmanager.cpp +++ b/ground/openpilotgcs/src/plugins/coreplugin/connectionmanager.cpp @@ -38,6 +38,7 @@ #include #include #include +#include namespace Core { @@ -333,6 +334,12 @@ void ConnectionManager::registerDevice(IConnection *conn, const QString &devN, c */ void ConnectionManager::devChanged(IConnection *connection) { + if(!ExtensionSystem::PluginManager::instance()->allPluginsLoaded()) + { + connectionBackup.append(connection); + connect(ExtensionSystem::PluginManager::instance(),SIGNAL(pluginsLoadEnded()),this,SLOT(connectionsCallBack()),Qt::UniqueConnection); + return; + } //clear device list combobox m_availableDevList->clear(); @@ -381,4 +388,14 @@ void ConnectionManager::devChanged(IConnection *connection) m_connectBtn->setEnabled(false); } +} + +void Core::ConnectionManager::connectionsCallBack() +{ + foreach(IConnection * con,connectionBackup) + { + devChanged(con); + } + connectionBackup.clear(); + disconnect(ExtensionSystem::PluginManager::instance(),SIGNAL(pluginsLoadEnded()),this,SLOT(connectionsCallBack())); } //namespace Core diff --git a/ground/openpilotgcs/src/plugins/coreplugin/connectionmanager.h b/ground/openpilotgcs/src/plugins/coreplugin/connectionmanager.h index beb809915..289e65590 100644 --- a/ground/openpilotgcs/src/plugins/coreplugin/connectionmanager.h +++ b/ground/openpilotgcs/src/plugins/coreplugin/connectionmanager.h @@ -98,7 +98,7 @@ private slots: // void onConnectionClosed(QObject *obj); void onConnectionDestroyed(QObject *obj); - + void connectionsCallBack(); //used to call devChange after all the plugins are loaded protected: QComboBox *m_availableDevList; QPushButton *m_connectBtn; @@ -114,6 +114,7 @@ protected: private: bool connectDevice(); Internal::MainWindow *m_mainWindow; + QList connectionBackup; }; From 1b314ee256eb584db81865b332b5277ce440bddb Mon Sep 17 00:00:00 2001 From: Michael Rumpler Date: Wed, 11 Jan 2012 22:16:26 +0100 Subject: [PATCH 102/121] * cleaned up notifyplugin MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit cause: /projects/OpenPilot/git/ground/openpilotgcs/src/plugins/notify/notifyplugin.cpp:104:6: warning: unused parameter ‘configInfo’ [-Wunused-parameter] /projects/OpenPilot/git/ground/openpilotgcs/src/plugins/notify/notifyplugin.cpp:353:6: warning: unused parameter ‘values’ [-Wunused-parameter] /projects/OpenPilot/git/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.cpp:73:10: warning: unused parameter ‘parent’ [-Wunused-parameter] /projects/OpenPilot/git/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.cpp:451:6: warning: unused parameter ‘rangeStr’ [-Wunused-parameter] /projects/OpenPilot/git/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.cpp:512:7: warning: unused parameter ‘oldstate’ [-Wunused-parameter] /projects/OpenPilot/git/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.cpp:527:6: warning: unused parameter ‘deselected’ [-Wunused-parameter] implemented solution: fixed all of them (commented out var name) * fixed bug in check code cause: /projects/OpenPilot/git/ground/openpilotgcs/src/plugins/notify/notifyplugin.cpp: In member function ‘void SoundNotifyPlugin::checkNotificationRule(NotificationItem*, UAVObject*)’: /projects/OpenPilot/git/ground/openpilotgcs/src/plugins/notify/notifyplugin.cpp:398:109: warning: suggest parentheses around comparison in operand of ‘|’ [-Wparentheses] implemented solution: this is an obvious bug that is syntactically correct but leads to a warning with a good compiler so this bug can be found. fixed that to use logical or instead of bitwise or. * fixed bug in include file (error in compilation under Linux) cause: In file included from /projects/OpenPilot/git/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.cpp:47:0: /projects/OpenPilot/git/ground/openpilotgcs/src/plugins/notify/notifytablemodel.h:86:39: error: reference ‘_list’ cannot be declared ‘mutable’ [-fpermissive] implemented solution: removed the mutable flag, as this is wrongly used on a reference (and therefore correctly causing a compile-time error --- ground/openpilotgcs/src/plugins/notify/notifylogging.h | 2 +- ground/openpilotgcs/src/plugins/notify/notifyplugin.cpp | 6 +++--- .../src/plugins/notify/notifypluginoptionspage.cpp | 8 ++++---- ground/openpilotgcs/src/plugins/notify/notifytablemodel.h | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/notify/notifylogging.h b/ground/openpilotgcs/src/plugins/notify/notifylogging.h index ea7ea331c..43e54f3b7 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifylogging.h +++ b/ground/openpilotgcs/src/plugins/notify/notifylogging.h @@ -29,7 +29,7 @@ #ifndef NOTIFYLOGGING_H #define NOTIFYLOGGING_H -#include "QDebug.h" +#include "qdebug.h" #define DEBUG_NOTIFIES_ENABLE diff --git a/ground/openpilotgcs/src/plugins/notify/notifyplugin.cpp b/ground/openpilotgcs/src/plugins/notify/notifyplugin.cpp index 6f74ec018..5c7d27e75 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifyplugin.cpp +++ b/ground/openpilotgcs/src/plugins/notify/notifyplugin.cpp @@ -101,7 +101,7 @@ void SoundNotifyPlugin::saveConfig( QSettings* settings, UAVConfigInfo *configIn } -void SoundNotifyPlugin::readConfig( QSettings* settings, UAVConfigInfo *configInfo) +void SoundNotifyPlugin::readConfig( QSettings* settings, UAVConfigInfo * /* configInfo */) { // Just for migration to the new format. //Q_ASSERT(configInfo->version() == UAVConfigVersion()); @@ -350,7 +350,7 @@ void SoundNotifyPlugin::stateChanged(Phonon::State newstate, Phonon::State oldst } } -bool checkRange(QString fieldValue, QString enumValue, QStringList values, int direction) +bool checkRange(QString fieldValue, QString enumValue, QStringList /* values */, int direction) { bool ret = false; @@ -395,7 +395,7 @@ bool checkRange(double fieldValue, double min, double max, int direction) void SoundNotifyPlugin::checkNotificationRule(NotificationItem* notification, UAVObject* object) { - if(notification->getDataObject()!=object->getName() | object->getField(notification->getObjectField())==NULL) + if(notification->getDataObject()!=object->getName() || object->getField(notification->getObjectField())==NULL) return; bool condition=false; diff --git a/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.cpp b/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.cpp index b7cc977c6..fa8ff053f 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.cpp +++ b/ground/openpilotgcs/src/plugins/notify/notifypluginoptionspage.cpp @@ -70,7 +70,7 @@ NotifyPluginOptionsPage::NotifyPluginOptionsPage(QObject *parent) NotifyPluginOptionsPage::~NotifyPluginOptionsPage() {} -QWidget *NotifyPluginOptionsPage::createPage(QWidget *parent) +QWidget *NotifyPluginOptionsPage::createPage(QWidget * /* parent */) { _optionsPage.reset(new Ui::NotifyPluginOptionsPage()); //main widget @@ -448,7 +448,7 @@ void NotifyPluginOptionsPage::updateConfigView(NotificationItem* notification) } -void NotifyPluginOptionsPage::on_changedIndex_rangeValue(QString rangeStr) +void NotifyPluginOptionsPage::on_changedIndex_rangeValue(QString /* rangeStr */) { Q_ASSERT(_dynamicFieldWidget); UAVObjectField* field = getObjectFieldFromSelected(); @@ -509,7 +509,7 @@ void NotifyPluginOptionsPage::on_changedIndex_soundLanguage(int index) } -void NotifyPluginOptionsPage::on_changed_playButtonText(Phonon::State newstate, Phonon::State oldstate) +void NotifyPluginOptionsPage::on_changed_playButtonText(Phonon::State newstate, Phonon::State /* oldstate */) { //Q_ASSERT(Phonon::ErrorState != newstate); @@ -524,7 +524,7 @@ void NotifyPluginOptionsPage::on_changed_playButtonText(Phonon::State newstate, } } -void NotifyPluginOptionsPage::on_changedSelection_notifyTable(const QItemSelection & selected, const QItemSelection & deselected ) +void NotifyPluginOptionsPage::on_changedSelection_notifyTable(const QItemSelection & selected, const QItemSelection & /* deselected */ ) { bool select = false; _testSound->stop(); diff --git a/ground/openpilotgcs/src/plugins/notify/notifytablemodel.h b/ground/openpilotgcs/src/plugins/notify/notifytablemodel.h index 28eb8cc68..dd2e765bd 100644 --- a/ground/openpilotgcs/src/plugins/notify/notifytablemodel.h +++ b/ground/openpilotgcs/src/plugins/notify/notifytablemodel.h @@ -83,7 +83,7 @@ private slots: void dropRows(int position, int count) const; private: - mutable QList& _list; + QList& _list; QStringList _headerStrings; }; From 2d27c54d4805a62e51321d390998978090ec2e68 Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Thu, 12 Jan 2012 19:53:52 -0500 Subject: [PATCH 103/121] com_msg: Create new message based COM layer for bootloaders The main purpose of this new COM implementation is that it is much simpler, and requires less code space. This takes a bit of the pressure off of the CC bootloader which was right at the limit of available code space in the bootloader partition. This is not intended to ever be used by the application. This driver also formalizes the assumptions in the bootloader's usage of the COM layer. All messages are assumed to arrive in atomic chunks from the HID layer. --- flight/Bootloaders/CopterControl/Makefile | 2 +- .../CopterControl/inc/pios_config.h | 2 +- flight/Bootloaders/CopterControl/main.c | 5 +- flight/Bootloaders/CopterControl/op_dfu.c | 5 +- flight/Bootloaders/CopterControl/pios_board.c | 20 +- flight/Bootloaders/OpenPilot/Makefile | 1 + .../Bootloaders/OpenPilot/inc/pios_config.h | 1 + flight/Bootloaders/OpenPilot/main.c | 5 +- flight/Bootloaders/OpenPilot/op_dfu.c | 9 +- flight/Bootloaders/OpenPilot/pios_board.c | 24 +-- flight/Bootloaders/PipXtreme/Makefile | 2 +- .../Bootloaders/PipXtreme/inc/pios_config.h | 2 +- flight/Bootloaders/PipXtreme/main.c | 5 +- flight/Bootloaders/PipXtreme/op_dfu.c | 30 +-- flight/Bootloaders/PipXtreme/pios_board.c | 25 +-- flight/PiOS/Common/pios_com_msg.c | 185 ++++++++++++++++++ flight/PiOS/STM32F10x/pios_usb_hid.c | 18 +- flight/PiOS/inc/pios_com.h | 4 +- flight/PiOS/inc/pios_com_msg.h | 45 +++++ flight/PiOS/inc/pios_com_msg_priv.h | 44 +++++ flight/PiOS/inc/pios_com_priv.h | 2 + 21 files changed, 345 insertions(+), 91 deletions(-) create mode 100644 flight/PiOS/Common/pios_com_msg.c create mode 100644 flight/PiOS/inc/pios_com_msg.h create mode 100644 flight/PiOS/inc/pios_com_msg_priv.h diff --git a/flight/Bootloaders/CopterControl/Makefile b/flight/Bootloaders/CopterControl/Makefile index 1257ed579..a5effde9c 100644 --- a/flight/Bootloaders/CopterControl/Makefile +++ b/flight/Bootloaders/CopterControl/Makefile @@ -116,7 +116,7 @@ SRC += $(PIOSCOMMON)/pios_usb_desc_hid_only.c ## PIOS Hardware (Common) SRC += $(PIOSCOMMON)/pios_board_info.c -SRC += $(PIOSCOMMON)/pios_com.c +SRC += $(PIOSCOMMON)/pios_com_msg.c SRC += $(PIOSCOMMON)/pios_bl_helper.c SRC += $(PIOSCOMMON)/pios_iap.c SRC += $(PIOSCOMMON)/printf-stdarg.c diff --git a/flight/Bootloaders/CopterControl/inc/pios_config.h b/flight/Bootloaders/CopterControl/inc/pios_config.h index 081ed1b0f..864ed4665 100644 --- a/flight/Bootloaders/CopterControl/inc/pios_config.h +++ b/flight/Bootloaders/CopterControl/inc/pios_config.h @@ -39,7 +39,7 @@ #define PIOS_INCLUDE_SYS #define PIOS_INCLUDE_USB #define PIOS_INCLUDE_USB_HID -#define PIOS_INCLUDE_COM +#define PIOS_INCLUDE_COM_MSG #define PIOS_INCLUDE_GPIO #define PIOS_NO_GPS diff --git a/flight/Bootloaders/CopterControl/main.c b/flight/Bootloaders/CopterControl/main.c index c1def4a46..7a61ae9e9 100644 --- a/flight/Bootloaders/CopterControl/main.c +++ b/flight/Bootloaders/CopterControl/main.c @@ -32,6 +32,7 @@ #include "usb_lib.h" #include "pios_iap.h" #include "fifo_buffer.h" +#include "pios_com_msg.h" /* Prototype of PIOS_Board_Init() function */ extern void PIOS_Board_Init(void); extern void FLASH_Download(); @@ -62,7 +63,7 @@ uint8_t JumpToApp = FALSE; uint8_t GO_dfu = FALSE; uint8_t USB_connected = FALSE; uint8_t User_DFU_request = FALSE; -static uint8_t mReceive_Buffer[64]; +static uint8_t mReceive_Buffer[63]; /* Private function prototypes -----------------------------------------------*/ uint32_t LedPWM(uint32_t pwm_period, uint32_t pwm_sweep_steps, uint32_t count); uint8_t processRX(); @@ -198,7 +199,7 @@ uint32_t LedPWM(uint32_t pwm_period, uint32_t pwm_sweep_steps, uint32_t count) { } uint8_t processRX() { - if (PIOS_COM_ReceiveBuffer(PIOS_COM_TELEM_USB, mReceive_Buffer, 63, 0) == 63) { + if (PIOS_COM_MSG_Receive(PIOS_COM_TELEM_USB, mReceive_Buffer, sizeof(mReceive_Buffer))) { processComand(mReceive_Buffer); } return TRUE; diff --git a/flight/Bootloaders/CopterControl/op_dfu.c b/flight/Bootloaders/CopterControl/op_dfu.c index ae85160c2..9f98d3394 100644 --- a/flight/Bootloaders/CopterControl/op_dfu.c +++ b/flight/Bootloaders/CopterControl/op_dfu.c @@ -30,6 +30,7 @@ #include "pios.h" #include "op_dfu.h" #include "pios_bl_helper.h" +#include "pios_com_msg.h" #include //programmable devices Device devicesTable[10]; @@ -446,9 +447,7 @@ uint32_t CalcFirmCRC() { } void sendData(uint8_t * buf, uint16_t size) { - PIOS_COM_SendBuffer(PIOS_COM_TELEM_USB, buf, size); - if (DeviceState == downloading) - PIOS_DELAY_WaitmS(20);//this is an hack, we should check wtf is wrong with hid + PIOS_COM_MSG_Send(PIOS_COM_TELEM_USB, buf, size); } bool flash_read(uint8_t * buffer, uint32_t adr, DFUProgType type) { diff --git a/flight/Bootloaders/CopterControl/pios_board.c b/flight/Bootloaders/CopterControl/pios_board.c index 1b3c54af3..972a85be0 100644 --- a/flight/Bootloaders/CopterControl/pios_board.c +++ b/flight/Bootloaders/CopterControl/pios_board.c @@ -27,17 +27,11 @@ // *********************************************************************************** -#if defined(PIOS_INCLUDE_COM) +#if defined(PIOS_INCLUDE_COM_MSG) -#include +#include -#define PIOS_COM_TELEM_USB_RX_BUF_LEN 192 -#define PIOS_COM_TELEM_USB_TX_BUF_LEN 192 - -static uint8_t pios_com_telem_usb_rx_buffer[PIOS_COM_TELEM_USB_RX_BUF_LEN]; -static uint8_t pios_com_telem_usb_tx_buffer[PIOS_COM_TELEM_USB_TX_BUF_LEN]; - -#endif /* PIOS_INCLUDE_COM */ +#endif /* PIOS_INCLUDE_COM_MSG */ // *********************************************************************************** @@ -97,17 +91,15 @@ void PIOS_Board_Init(void) { if (PIOS_USB_Init(&pios_usb_id, &pios_usb_main_cfg)) { PIOS_Assert(0); } -#if defined(PIOS_INCLUDE_USB_HID) && defined(PIOS_INCLUDE_COM) +#if defined(PIOS_INCLUDE_USB_HID) && defined(PIOS_INCLUDE_COM_MSG) uint32_t pios_usb_hid_id; if (PIOS_USB_HID_Init(&pios_usb_hid_id, &pios_usb_hid_cfg, pios_usb_id)) { PIOS_Assert(0); } - if (PIOS_COM_Init(&pios_com_telem_usb_id, &pios_usb_hid_com_driver, pios_usb_hid_id, - pios_com_telem_usb_rx_buffer, sizeof(pios_com_telem_usb_rx_buffer), - pios_com_telem_usb_tx_buffer, sizeof(pios_com_telem_usb_tx_buffer))) { + if (PIOS_COM_MSG_Init(&pios_com_telem_usb_id, &pios_usb_hid_com_driver, pios_usb_hid_id)) { PIOS_Assert(0); } -#endif /* PIOS_INCLUDE_USB_HID && PIOS_INCLUDE_COM */ +#endif /* PIOS_INCLUDE_USB_HID && PIOS_INCLUDE_COM_MSG */ #endif /* PIOS_INCLUDE_USB */ diff --git a/flight/Bootloaders/OpenPilot/Makefile b/flight/Bootloaders/OpenPilot/Makefile index e9b55e134..6c3888797 100644 --- a/flight/Bootloaders/OpenPilot/Makefile +++ b/flight/Bootloaders/OpenPilot/Makefile @@ -119,6 +119,7 @@ SRC += $(PIOSCOMMON)/pios_usb_desc_hid_only.c ## PIOS Hardware (Common) SRC += $(PIOSCOMMON)/pios_board_info.c +SRC += $(PIOSCOMMON)/pios_com_msg.c SRC += $(PIOSCOMMON)/pios_com.c SRC += $(PIOSCOMMON)/pios_opahrs_v0.c SRC += $(PIOSCOMMON)/pios_bl_helper.c diff --git a/flight/Bootloaders/OpenPilot/inc/pios_config.h b/flight/Bootloaders/OpenPilot/inc/pios_config.h index 024bcae9a..cf8981339 100644 --- a/flight/Bootloaders/OpenPilot/inc/pios_config.h +++ b/flight/Bootloaders/OpenPilot/inc/pios_config.h @@ -42,6 +42,7 @@ #define PIOS_INCLUDE_USB_HID #define PIOS_INCLUDE_OPAHRS #define PIOS_INCLUDE_COM +#define PIOS_INCLUDE_COM_MSG #define PIOS_INCLUDE_GPIO //#define DEBUG_SSP diff --git a/flight/Bootloaders/OpenPilot/main.c b/flight/Bootloaders/OpenPilot/main.c index 48056cff6..8a9e554ef 100644 --- a/flight/Bootloaders/OpenPilot/main.c +++ b/flight/Bootloaders/OpenPilot/main.c @@ -35,6 +35,7 @@ #include "pios_iap.h" #include "ssp.h" #include "fifo_buffer.h" +#include "pios_com_msg.h" /* Prototype of PIOS_Board_Init() function */ extern void PIOS_Board_Init(void); extern void FLASH_Download(); @@ -90,7 +91,7 @@ uint8_t JumpToApp = FALSE; uint8_t GO_dfu = FALSE; uint8_t USB_connected = FALSE; uint8_t User_DFU_request = FALSE; -static uint8_t mReceive_Buffer[64]; +static uint8_t mReceive_Buffer[63]; /* Private function prototypes -----------------------------------------------*/ uint32_t LedPWM(uint32_t pwm_period, uint32_t pwm_sweep_steps, uint32_t count); uint8_t processRX(); @@ -249,7 +250,7 @@ uint32_t LedPWM(uint32_t pwm_period, uint32_t pwm_sweep_steps, uint32_t count) { uint8_t processRX() { if (ProgPort == Usb) { - if (PIOS_COM_ReceiveBuffer(PIOS_COM_TELEM_USB, mReceive_Buffer, 63, 0) == 63) { + if (PIOS_COM_MSG_Receive(PIOS_COM_TELEM_USB, mReceive_Buffer, sizeof(mReceive_Buffer))) { processComand(mReceive_Buffer); } } else if (ProgPort == Serial) { diff --git a/flight/Bootloaders/OpenPilot/op_dfu.c b/flight/Bootloaders/OpenPilot/op_dfu.c index bc62fff6c..ad5836ad7 100644 --- a/flight/Bootloaders/OpenPilot/op_dfu.c +++ b/flight/Bootloaders/OpenPilot/op_dfu.c @@ -30,6 +30,7 @@ #include "pios.h" #include "op_dfu.h" #include "pios_bl_helper.h" +#include "pios_com_msg.h" #include #include "pios_opahrs.h" #include "ssp.h" @@ -299,7 +300,6 @@ void processComand(uint8_t *xReceive_Buffer) { ++Next_Packet; } else { - DeviceState = wrong_packet_received; Aditionals = Count; } @@ -508,6 +508,7 @@ uint32_t baseOfAdressType(DFUTransfer type) { return currentDevice.startOfUserCode + currentDevice.sizeOfCode; break; default: + return 0; } } @@ -550,11 +551,7 @@ uint32_t CalcFirmCRC() { } void sendData(uint8_t * buf, uint16_t size) { if (ProgPort == Usb) { - - PIOS_COM_SendBuffer(PIOS_COM_TELEM_USB, buf, size); - if (DeviceState == downloading) - PIOS_DELAY_WaitmS(10); - + PIOS_COM_MSG_Send(PIOS_COM_TELEM_USB, buf, size); } else if (ProgPort == Serial) { ssp_SendData(&ssp_port, buf, size); } diff --git a/flight/Bootloaders/OpenPilot/pios_board.c b/flight/Bootloaders/OpenPilot/pios_board.c index a2630815a..707600b4d 100644 --- a/flight/Bootloaders/OpenPilot/pios_board.c +++ b/flight/Bootloaders/OpenPilot/pios_board.c @@ -184,12 +184,6 @@ const struct pios_usart_cfg pios_usart_telem_cfg = { #include "pios_com_priv.h" -#define PIOS_COM_TELEM_USB_RX_BUF_LEN 192 -#define PIOS_COM_TELEM_USB_TX_BUF_LEN 192 - -static uint8_t pios_com_telem_usb_rx_buffer[PIOS_COM_TELEM_USB_RX_BUF_LEN]; -static uint8_t pios_com_telem_usb_tx_buffer[PIOS_COM_TELEM_USB_TX_BUF_LEN]; - #define PIOS_COM_TELEM_RF_RX_BUF_LEN 192 #define PIOS_COM_TELEM_RF_TX_BUF_LEN 192 @@ -198,6 +192,16 @@ static uint8_t pios_com_telem_rf_tx_buffer[PIOS_COM_TELEM_RF_TX_BUF_LEN]; #endif /* PIOS_INCLUDE_COM */ +// *********************************************************************************** + +#if defined(PIOS_INCLUDE_COM_MSG) + +#include + +#endif /* PIOS_INCLUDE_COM_MSG */ + +// *********************************************************************************** + #if defined(PIOS_INCLUDE_USB) #include "pios_usb_priv.h" @@ -270,17 +274,15 @@ void PIOS_Board_Init(void) { if (PIOS_USB_Init(&pios_usb_id, &pios_usb_main_cfg)) { PIOS_Assert(0); } -#if defined(PIOS_INCLUDE_USB_HID) && defined(PIOS_INCLUDE_COM) +#if defined(PIOS_INCLUDE_USB_HID) && defined(PIOS_INCLUDE_COM_MSG) uint32_t pios_usb_hid_id; if (PIOS_USB_HID_Init(&pios_usb_hid_id, &pios_usb_hid_cfg, pios_usb_id)) { PIOS_Assert(0); } - if (PIOS_COM_Init(&pios_com_telem_usb_id, &pios_usb_hid_com_driver, pios_usb_hid_id, - pios_com_telem_usb_rx_buffer, sizeof(pios_com_telem_usb_rx_buffer), - pios_com_telem_usb_tx_buffer, sizeof(pios_com_telem_usb_tx_buffer))) { + if (PIOS_COM_MSG_Init(&pios_com_telem_usb_id, &pios_usb_hid_com_driver, pios_usb_hid_id)) { PIOS_Assert(0); } -#endif /* PIOS_INCLUDE_USB_HID && PIOS_INCLUDE_COM */ +#endif /* PIOS_INCLUDE_USB_HID && PIOS_INCLUDE_COM_MSG */ #endif /* PIOS_INCLUDE_USB */ diff --git a/flight/Bootloaders/PipXtreme/Makefile b/flight/Bootloaders/PipXtreme/Makefile index af6469ae0..9bad695f7 100644 --- a/flight/Bootloaders/PipXtreme/Makefile +++ b/flight/Bootloaders/PipXtreme/Makefile @@ -115,7 +115,7 @@ SRC += $(PIOSCOMMON)/pios_usb_desc_hid_only.c ## PIOS Hardware (Common) SRC += $(PIOSCOMMON)/pios_board_info.c -SRC += $(PIOSCOMMON)/pios_com.c +SRC += $(PIOSCOMMON)/pios_com_msg.c SRC += $(PIOSCOMMON)/pios_bl_helper.c SRC += $(PIOSCOMMON)/pios_iap.c SRC += $(PIOSCOMMON)/printf-stdarg.c diff --git a/flight/Bootloaders/PipXtreme/inc/pios_config.h b/flight/Bootloaders/PipXtreme/inc/pios_config.h index 0c2cc7877..8084f9c0a 100644 --- a/flight/Bootloaders/PipXtreme/inc/pios_config.h +++ b/flight/Bootloaders/PipXtreme/inc/pios_config.h @@ -38,7 +38,7 @@ #define PIOS_INCLUDE_SYS #define PIOS_INCLUDE_USB #define PIOS_INCLUDE_USB_HID -#define PIOS_INCLUDE_COM +#define PIOS_INCLUDE_COM_MSG #define PIOS_INCLUDE_GPIO //#define DEBUG_SSP diff --git a/flight/Bootloaders/PipXtreme/main.c b/flight/Bootloaders/PipXtreme/main.c index f09881d42..4923f8fc1 100644 --- a/flight/Bootloaders/PipXtreme/main.c +++ b/flight/Bootloaders/PipXtreme/main.c @@ -32,6 +32,7 @@ #include "usb_lib.h" #include "pios_iap.h" #include "fifo_buffer.h" +#include "pios_com_msg.h" /* Prototype of PIOS_Board_Init() function */ extern void PIOS_Board_Init(void); extern void FLASH_Download(); @@ -62,7 +63,7 @@ uint8_t JumpToApp = FALSE; uint8_t GO_dfu = FALSE; uint8_t USB_connected = FALSE; uint8_t User_DFU_request = FALSE; -static uint8_t mReceive_Buffer[64]; +static uint8_t mReceive_Buffer[63]; /* Private function prototypes -----------------------------------------------*/ uint32_t LedPWM(uint32_t pwm_period, uint32_t pwm_sweep_steps, uint32_t count); uint8_t processRX(); @@ -204,7 +205,7 @@ uint32_t LedPWM(uint32_t pwm_period, uint32_t pwm_sweep_steps, uint32_t count) { } uint8_t processRX() { - if (PIOS_COM_ReceiveBuffer(PIOS_COM_TELEM_USB, mReceive_Buffer, 63, 0) == 63) { + if (PIOS_COM_MSG_Receive(PIOS_COM_TELEM_USB, mReceive_Buffer, sizeof(mReceive_Buffer))) { processComand(mReceive_Buffer); } return TRUE; diff --git a/flight/Bootloaders/PipXtreme/op_dfu.c b/flight/Bootloaders/PipXtreme/op_dfu.c index 770ce8237..cdc2d82b8 100644 --- a/flight/Bootloaders/PipXtreme/op_dfu.c +++ b/flight/Bootloaders/PipXtreme/op_dfu.c @@ -30,6 +30,7 @@ #include "pios.h" #include "op_dfu.h" #include "pios_bl_helper.h" +#include "pios_com_msg.h" #include /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ @@ -102,33 +103,9 @@ void DataDownload(DownloadAction action) { currentProgrammingDestination)) { DeviceState = Last_operation_failed; } - /* - switch (currentProgrammingDestination) { - case Remote_flash_via_spi: - if (downType == Descript) { - SendBuffer[6 + (x * 4)] - = spi_dev_desc[(uint8_t) partoffset]; - SendBuffer[7 + (x * 4)] = spi_dev_desc[(uint8_t) partoffset - + 1]; - SendBuffer[8 + (x * 4)] = spi_dev_desc[(uint8_t) partoffset - + 2]; - SendBuffer[9 + (x * 4)] = spi_dev_desc[(uint8_t) partoffset - + 3]; - } - break; - case Self_flash: - SendBuffer[6 + (x * 4)] = *PIOS_BL_HELPER_FLASH_If_Read(offset); - SendBuffer[7 + (x * 4)] = *PIOS_BL_HELPER_FLASH_If_Read(offset + 1); - SendBuffer[8 + (x * 4)] = *PIOS_BL_HELPER_FLASH_If_Read(offset + 2); - SendBuffer[9 + (x * 4)] = *PIOS_BL_HELPER_FLASH_If_Read(offset + 3); - break; - } - */ } - //PIOS USB_SIL_Write(EP1_IN, (uint8_t*) SendBuffer, 64); downPacketCurrent = downPacketCurrent + 1; if (downPacketCurrent > downPacketTotal - 1) { - // STM_EVAL_LEDOn(LED2); DeviceState = Last_operation_Success; Aditionals = (uint32_t) Download; } @@ -322,7 +299,6 @@ void processComand(uint8_t *xReceive_Buffer) { Buffer[15] = devicesTable[Data0 - 1].devID; } sendData(Buffer + 1, 63); - //PIOS_COM_SendBuffer(PIOS_COM_TELEM_USB, Buffer + 1, 63);//FIX+1 break; case JumpFW: FLASH_Lock(); @@ -474,9 +450,7 @@ uint32_t CalcFirmCRC() { } void sendData(uint8_t * buf, uint16_t size) { - PIOS_COM_SendBuffer(PIOS_COM_TELEM_USB, buf, size); - if (DeviceState == downloading) - PIOS_DELAY_WaitmS(10); + PIOS_COM_MSG_Send(PIOS_COM_TELEM_USB, buf, size); } bool flash_read(uint8_t * buffer, uint32_t adr, DFUProgType type) { diff --git a/flight/Bootloaders/PipXtreme/pios_board.c b/flight/Bootloaders/PipXtreme/pios_board.c index abf079340..3c06d820b 100644 --- a/flight/Bootloaders/PipXtreme/pios_board.c +++ b/flight/Bootloaders/PipXtreme/pios_board.c @@ -27,17 +27,11 @@ // *********************************************************************************** -#if defined(PIOS_INCLUDE_COM) +#if defined(PIOS_INCLUDE_COM_MSG) -#include +#include -#define PIOS_COM_TELEM_USB_RX_BUF_LEN 192 -#define PIOS_COM_TELEM_USB_TX_BUF_LEN 192 - -static uint8_t pios_com_telem_usb_rx_buffer[PIOS_COM_TELEM_USB_RX_BUF_LEN]; -static uint8_t pios_com_telem_usb_tx_buffer[PIOS_COM_TELEM_USB_TX_BUF_LEN]; - -#endif /* PIOS_INCLUDE_COM */ +#endif /* PIOS_INCLUDE_COM_MSG */ // *********************************************************************************** @@ -98,17 +92,16 @@ void PIOS_Board_Init(void) { if (PIOS_USB_Init(&pios_usb_id, &pios_usb_main_cfg)) { PIOS_Assert(0); } -#if defined(PIOS_INCLUDE_USB_HID) && defined(PIOS_INCLUDE_COM) - uint32_t pios_usb_com_id; - if (PIOS_USB_HID_Init(&pios_usb_com_id, &pios_usb_hid_cfg, pios_usb_id)) { +#if defined(PIOS_INCLUDE_USB_HID) && defined(PIOS_INCLUDE_COM_MSG) + uint32_t pios_usb_hid_id; + if (PIOS_USB_HID_Init(&pios_usb_hid_id, &pios_usb_hid_cfg, pios_usb_id)) { PIOS_Assert(0); } - if (PIOS_COM_Init(&pios_com_telem_usb_id, &pios_usb_hid_com_driver, pios_usb_com_id, - pios_com_telem_usb_rx_buffer, sizeof(pios_com_telem_usb_rx_buffer), - pios_com_telem_usb_tx_buffer, sizeof(pios_com_telem_usb_tx_buffer))) { + if (PIOS_COM_MSG_Init(&pios_com_telem_usb_id, &pios_usb_hid_com_driver, pios_usb_hid_id)) { PIOS_Assert(0); } -#endif /* PIOS_INCLUDE_USB_HID && PIOS_INCLUDE_COM */ +#endif /* PIOS_INCLUDE_USB_HID && PIOS_INCLUDE_COM_MSG */ + #endif /* PIOS_INCLUDE_USB */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE);//TODO Tirar diff --git a/flight/PiOS/Common/pios_com_msg.c b/flight/PiOS/Common/pios_com_msg.c new file mode 100644 index 000000000..c1cebe1d9 --- /dev/null +++ b/flight/PiOS/Common/pios_com_msg.c @@ -0,0 +1,185 @@ +/** + ****************************************************************************** + * @addtogroup PIOS PIOS Core hardware abstraction layer + * @{ + * @addtogroup PIOS_COM COM MSG layer functions + * @brief Hardware communication layer + * @{ + * + * @file pios_com_msg.c + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. + * @brief COM MSG layer functions + * @see The GNU Public License (GPL) Version 3 + * + *****************************************************************************/ +/* + * 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 + */ + +/* Project Includes */ +#include "pios.h" + +#if defined(PIOS_INCLUDE_COM_MSG) + +#include "pios_com.h" + +#define PIOS_COM_MSG_MAX_LEN 63 + +struct pios_com_msg_dev { + uint32_t lower_id; + const struct pios_com_driver * driver; + + uint8_t rx_msg_buffer[PIOS_COM_MSG_MAX_LEN]; + volatile bool rx_msg_full; + + uint8_t tx_msg_buffer[PIOS_COM_MSG_MAX_LEN]; + volatile bool tx_msg_full; +}; + +static struct pios_com_msg_dev com_msg_dev; + +static uint16_t PIOS_COM_MSG_TxOutCallback(uint32_t context, uint8_t * buf, uint16_t buf_len, uint16_t * headroom, bool * need_yield); +static uint16_t PIOS_COM_MSG_RxInCallback(uint32_t context, uint8_t * buf, uint16_t buf_len, uint16_t * headroom, bool * need_yield); + +int32_t PIOS_COM_MSG_Init(uint32_t * com_id, const struct pios_com_driver * driver, uint32_t lower_id) +{ + PIOS_Assert(com_id); + PIOS_Assert(driver); + + PIOS_Assert(driver->bind_tx_cb); + PIOS_Assert(driver->bind_rx_cb); + + struct pios_com_msg_dev * com_dev = &com_msg_dev; + + com_dev->driver = driver; + com_dev->lower_id = lower_id; + + com_dev->rx_msg_full = false; + (com_dev->driver->bind_rx_cb)(lower_id, PIOS_COM_MSG_RxInCallback, (uint32_t)com_dev); + (com_dev->driver->rx_start)(com_dev->lower_id, sizeof(com_dev->rx_msg_buffer)); + + com_dev->tx_msg_full = false; + (com_dev->driver->bind_tx_cb)(lower_id, PIOS_COM_MSG_TxOutCallback, (uint32_t)com_dev); + + *com_id = (uint32_t)com_dev; + return(0); +} + +static uint16_t PIOS_COM_MSG_TxOutCallback(uint32_t context, uint8_t * buf, uint16_t buf_len, uint16_t * headroom, bool * need_yield) +{ + struct pios_com_msg_dev * com_dev = (struct pios_com_msg_dev *)context; + + PIOS_Assert(buf); + PIOS_Assert(buf_len); + + uint16_t bytes_from_fifo = 0; + + if (com_dev->tx_msg_full && (buf_len >= sizeof(com_dev->tx_msg_buffer))) { + /* Room for an entire message, send it */ + memcpy(buf, com_dev->tx_msg_buffer, sizeof(com_dev->tx_msg_buffer)); + bytes_from_fifo = sizeof(com_dev->tx_msg_buffer); + com_dev->tx_msg_full = false; + } + + if (headroom) { + if (com_dev->tx_msg_full) { + *headroom = sizeof(com_dev->tx_msg_buffer); + } else { + *headroom = 0; + } + } + + return (bytes_from_fifo); +} + +static uint16_t PIOS_COM_MSG_RxInCallback(uint32_t context, uint8_t * buf, uint16_t buf_len, uint16_t * headroom, bool * need_yield) +{ + struct pios_com_msg_dev * com_dev = (struct pios_com_msg_dev *)context; + + uint16_t bytes_into_fifo = 0; + + if (!com_dev->rx_msg_full && (buf_len >= sizeof(com_dev->rx_msg_buffer))) { + memcpy(com_dev->rx_msg_buffer, buf, sizeof(com_dev->rx_msg_buffer)); + bytes_into_fifo = sizeof(com_dev->rx_msg_buffer); + com_dev->rx_msg_full = true; + } + + if (headroom) { + if (!com_dev->rx_msg_full) { + *headroom = sizeof(com_dev->rx_msg_buffer); + } else { + *headroom = 0; + } + } + + return (bytes_into_fifo); +} + +int32_t PIOS_COM_MSG_Send(uint32_t com_id, const uint8_t *msg, uint16_t msg_len) +{ + PIOS_Assert(msg); + PIOS_Assert(msg_len); + + struct pios_com_msg_dev * com_dev = (struct pios_com_msg_dev *)com_id; + + PIOS_Assert(msg_len == sizeof(com_dev->tx_msg_buffer)); + + /* Wait forever for room in the tx buffer */ + while (com_dev->tx_msg_full) { + /* Kick the transmitter while we wait */ + if (com_dev->driver->tx_start) { + (com_dev->driver->tx_start)(com_dev->lower_id, sizeof(com_dev->tx_msg_buffer)); + } + } + + memcpy((void *) com_dev->tx_msg_buffer, msg, msg_len); + com_dev->tx_msg_full = true; + + /* Kick the transmitter now that we've queued our message */ + if (com_dev->driver->tx_start) { + (com_dev->driver->tx_start)(com_dev->lower_id, sizeof(com_dev->tx_msg_buffer)); + } + + return 0; +} + +uint16_t PIOS_COM_MSG_Receive(uint32_t com_id, uint8_t * msg, uint16_t msg_len) +{ + PIOS_Assert(msg); + PIOS_Assert(msg_len); + + struct pios_com_msg_dev * com_dev = (struct pios_com_msg_dev *)com_id; + + PIOS_Assert(msg_len == sizeof(com_dev->rx_msg_buffer)); + + if (!com_dev->rx_msg_full) { + /* There's room in our buffer, kick the receiver */ + (com_dev->driver->rx_start)(com_dev->lower_id, sizeof(com_dev->rx_msg_buffer)); + } else { + memcpy(msg, com_dev->rx_msg_buffer, msg_len); + com_dev->rx_msg_full = false; + + return msg_len; + } + + return 0; +} + +#endif /* PIOS_INCLUDE_COM_MSG */ + +/** + * @} + * @} + */ diff --git a/flight/PiOS/STM32F10x/pios_usb_hid.c b/flight/PiOS/STM32F10x/pios_usb_hid.c index 11eb988c1..e70c93046 100644 --- a/flight/PiOS/STM32F10x/pios_usb_hid.c +++ b/flight/PiOS/STM32F10x/pios_usb_hid.c @@ -207,9 +207,15 @@ static void PIOS_USB_HID_RxStart(uint32_t usbhid_id, uint16_t rx_bytes_avail) { } // If endpoint was stalled and there is now space make it valid +#ifdef PIOS_USB_BOARD_BL_HID_HAS_NO_LENGTH_BYTE + uint16_t max_payload_length = PIOS_USB_BOARD_HID_DATA_LENGTH - 1; +#else + uint16_t max_payload_length = PIOS_USB_BOARD_HID_DATA_LENGTH - 2; +#endif + PIOS_IRQ_Disable(); if ((GetEPRxStatus(usb_hid_dev->cfg->data_rx_ep) != EP_RX_VALID) && - (rx_bytes_avail >= PIOS_USB_BOARD_HID_DATA_LENGTH)) { + (rx_bytes_avail >= max_payload_length)) { SetEPRxStatus(usb_hid_dev->cfg->data_rx_ep, EP_RX_VALID); } PIOS_IRQ_Enable(); @@ -328,7 +334,15 @@ static void PIOS_USB_HID_EP_OUT_Callback(void) &headroom, &need_yield); #endif - if (headroom >= PIOS_USB_BOARD_HID_DATA_LENGTH) { + +#ifdef PIOS_USB_BOARD_BL_HID_HAS_NO_LENGTH_BYTE + uint16_t max_payload_length = PIOS_USB_BOARD_HID_DATA_LENGTH - 1; +#else + uint16_t max_payload_length = PIOS_USB_BOARD_HID_DATA_LENGTH - 2; +#endif + + if (headroom >= max_payload_length) { + /* We have room for a maximum length message */ SetEPRxStatus(usb_hid_dev->cfg->data_rx_ep, EP_RX_VALID); } else { diff --git a/flight/PiOS/inc/pios_com.h b/flight/PiOS/inc/pios_com.h index 19abb2f27..10591f116 100644 --- a/flight/PiOS/inc/pios_com.h +++ b/flight/PiOS/inc/pios_com.h @@ -31,6 +31,9 @@ #ifndef PIOS_COM_H #define PIOS_COM_H +#include /* uint*_t */ +#include /* bool */ + typedef uint16_t (*pios_com_callback)(uint32_t context, uint8_t * buf, uint16_t buf_len, uint16_t * headroom, bool * task_woken); struct pios_com_driver { @@ -43,7 +46,6 @@ struct pios_com_driver { }; /* Public Functions */ -extern int32_t PIOS_COM_Init(uint32_t * com_id, const struct pios_com_driver * driver, uint32_t lower_id, uint8_t * rx_buffer, uint16_t rx_buffer_len, uint8_t * tx_buffer, uint16_t tx_buffer_len); extern int32_t PIOS_COM_ChangeBaud(uint32_t com_id, uint32_t baud); extern int32_t PIOS_COM_SendCharNonBlocking(uint32_t com_id, char c); extern int32_t PIOS_COM_SendChar(uint32_t com_id, char c); diff --git a/flight/PiOS/inc/pios_com_msg.h b/flight/PiOS/inc/pios_com_msg.h new file mode 100644 index 000000000..1caaeabeb --- /dev/null +++ b/flight/PiOS/inc/pios_com_msg.h @@ -0,0 +1,45 @@ +/** + ****************************************************************************** + * @addtogroup PIOS PIOS Core hardware abstraction layer + * @{ + * @addtogroup PIOS_COM COM MSG layer functions + * @brief Hardware communication layer + * @{ + * + * @file pios_com_msg.h + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. + * @brief COM MSG layer functions header + * @see The GNU Public License (GPL) Version 3 + * + *****************************************************************************/ +/* + * 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 + */ + +#ifndef PIOS_COM_MSG_H +#define PIOS_COM_MSG_H + +#include /* uint*_t */ + +/* Public Functions */ +extern int32_t PIOS_COM_MSG_Send(uint32_t com_id, const uint8_t *msg, uint16_t msg_len); +extern uint16_t PIOS_COM_MSG_Receive(uint32_t com_id, uint8_t * buf, uint16_t buf_len); + +#endif /* PIOS_COM_MSG_H */ + +/** + * @} + * @} + */ diff --git a/flight/PiOS/inc/pios_com_msg_priv.h b/flight/PiOS/inc/pios_com_msg_priv.h new file mode 100644 index 000000000..20992de47 --- /dev/null +++ b/flight/PiOS/inc/pios_com_msg_priv.h @@ -0,0 +1,44 @@ +/** + ****************************************************************************** + * @addtogroup PIOS PIOS Core hardware abstraction layer + * @{ + * @addtogroup PIOS_COM COM MSG layer functions + * @brief Hardware communication layer + * @{ + * + * @file pios_com_msg_priv.h + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. + * @brief COM MSG private definitions. + * @see The GNU Public License (GPL) Version 3 + * + *****************************************************************************/ +/* + * 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 + */ + +#ifndef PIOS_COM_MSG_PRIV_H +#define PIOS_COM_MSG_PRIV_H + +#include /* uint*_t */ +#include "pios_com_priv.h" /* struct pios_com_driver */ + +extern int32_t PIOS_COM_MSG_Init(uint32_t * com_id, const struct pios_com_driver * driver, uint32_t lower_id); + +#endif /* PIOS_COM_MSG_PRIV_H */ + +/** + * @} + * @} + */ diff --git a/flight/PiOS/inc/pios_com_priv.h b/flight/PiOS/inc/pios_com_priv.h index 7bd9a9be0..c39522f79 100644 --- a/flight/PiOS/inc/pios_com_priv.h +++ b/flight/PiOS/inc/pios_com_priv.h @@ -31,6 +31,8 @@ #ifndef PIOS_COM_PRIV_H #define PIOS_COM_PRIV_H +extern int32_t PIOS_COM_Init(uint32_t * com_id, const struct pios_com_driver * driver, uint32_t lower_id, uint8_t * rx_buffer, uint16_t rx_buffer_len, uint8_t * tx_buffer, uint16_t tx_buffer_len); + #endif /* PIOS_COM_PRIV_H */ /** From 1d14ab00e1c6d0229466720cc6459606bbd02672 Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Sat, 14 Jan 2012 14:28:11 -0500 Subject: [PATCH 104/121] safeboot: add safe boot support to OP and PIPX bootloaders Application support for OP and PIPX will show up in future commits. --- flight/Bootloaders/OpenPilot/op_dfu.c | 8 ++++++++ flight/Bootloaders/PipXtreme/op_dfu.c | 4 ++++ make/boards/openpilot/board-info.mk | 2 +- make/boards/pipxtreme/board-info.mk | 2 +- 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/flight/Bootloaders/OpenPilot/op_dfu.c b/flight/Bootloaders/OpenPilot/op_dfu.c index ad5836ad7..40ef6fbda 100644 --- a/flight/Bootloaders/OpenPilot/op_dfu.c +++ b/flight/Bootloaders/OpenPilot/op_dfu.c @@ -353,10 +353,18 @@ void processComand(uint8_t *xReceive_Buffer) { DeviceState = failed_jump; break; } else { + if (Data == 0x5AFE) { + /* Force board into safe mode */ + PIOS_IAP_WriteBootCount(0xFFFF); + } FLASH_Lock(); JumpToApp = 1; } } else { + if (Data == 0x5AFE) { + /* Force board into safe mode */ + PIOS_IAP_WriteBootCount(0xFFFF); + } FLASH_Lock(); JumpToApp = 1; } diff --git a/flight/Bootloaders/PipXtreme/op_dfu.c b/flight/Bootloaders/PipXtreme/op_dfu.c index cdc2d82b8..0d5da248f 100644 --- a/flight/Bootloaders/PipXtreme/op_dfu.c +++ b/flight/Bootloaders/PipXtreme/op_dfu.c @@ -301,6 +301,10 @@ void processComand(uint8_t *xReceive_Buffer) { sendData(Buffer + 1, 63); break; case JumpFW: + if (Data == 0x5AFE) { + /* Force board into safe mode */ + PIOS_IAP_WriteBootCount(0xFFFF); + } FLASH_Lock(); JumpToApp = 1; break; diff --git a/make/boards/openpilot/board-info.mk b/make/boards/openpilot/board-info.mk index d9cff166d..e98ac4480 100644 --- a/make/boards/openpilot/board-info.mk +++ b/make/boards/openpilot/board-info.mk @@ -1,6 +1,6 @@ BOARD_TYPE := 0x01 BOARD_REVISION := 0x01 -BOOTLOADER_VERSION := 0x00 +BOOTLOADER_VERSION := 0x01 HW_TYPE := 0x00 MCU := cortex-m3 diff --git a/make/boards/pipxtreme/board-info.mk b/make/boards/pipxtreme/board-info.mk index f9635109e..dbcb314df 100644 --- a/make/boards/pipxtreme/board-info.mk +++ b/make/boards/pipxtreme/board-info.mk @@ -1,6 +1,6 @@ BOARD_TYPE := 0x03 BOARD_REVISION := 0x01 -BOOTLOADER_VERSION := 0x00 +BOOTLOADER_VERSION := 0x01 HW_TYPE := 0x01 MCU := cortex-m3 From a51bf72bc76d2036fc4f58d61d9b14de8a4c53ec Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Sat, 14 Jan 2012 14:17:06 -0500 Subject: [PATCH 105/121] usb: allow runtime selection of USB descriptors via hwsettings --- flight/Bootloaders/CopterControl/Makefile | 1 - .../CopterControl/inc/pios_usb_board_data.h | 27 --- flight/Bootloaders/CopterControl/pios_board.c | 10 + .../CopterControl/pios_usb_board_data.c | 77 ++++++- flight/Bootloaders/OpenPilot/Makefile | 2 +- .../OpenPilot/inc/pios_usb_board_data.h | 27 --- flight/Bootloaders/OpenPilot/main.c | 5 - flight/Bootloaders/OpenPilot/op_dfu.c | 7 +- flight/Bootloaders/OpenPilot/pios_board.c | 12 +- .../OpenPilot/pios_usb_board_data.c | 78 ++++++- flight/Bootloaders/PipXtreme/Makefile | 2 +- .../Bootloaders/PipXtreme/inc/pios_config.h | 1 - .../PipXtreme/inc/pios_usb_board_data.h | 27 --- flight/Bootloaders/PipXtreme/main.c | 5 - flight/Bootloaders/PipXtreme/op_dfu.c | 11 +- flight/Bootloaders/PipXtreme/pios_board.c | 9 + .../PipXtreme/pios_usb_board_data.c | 77 ++++++- flight/CopterControl/Makefile | 1 + .../System/inc/pios_usb_board_data.h | 39 +--- flight/CopterControl/System/pios_board.c | 49 ++++- .../System/pios_usb_board_data.c | 77 ++++++- flight/OpenPilot/Makefile | 2 + flight/OpenPilot/System/inc/pios_config.h | 1 + .../System/inc/pios_usb_board_data.h | 37 ---- flight/OpenPilot/System/pios_board.c | 193 +++++++++++++++--- flight/OpenPilot/System/pios_usb_board_data.c | 79 ++++++- flight/PiOS/Common/pios_usb_desc_hid_cdc.c | 183 ++++++++--------- flight/PiOS/Common/pios_usb_desc_hid_only.c | 173 +++++++--------- .../STM32_USB-FS-Device_Driver/inc/usb_core.h | 19 +- .../STM32_USB-FS-Device_Driver/inc/usb_mem.h | 2 +- .../STM32_USB-FS-Device_Driver/src/usb_core.c | 20 +- .../STM32_USB-FS-Device_Driver/src/usb_mem.c | 2 +- flight/PiOS/STM32F10x/pios_usb.c | 7 - flight/PiOS/STM32F10x/pios_usb_cdc.c | 2 +- flight/PiOS/STM32F10x/pios_usbhook.c | 114 +++++------ flight/PiOS/inc/pios_usb_board_data_priv.h | 1 + flight/PiOS/inc/pios_usb_cdc_priv.h | 2 +- flight/PiOS/inc/pios_usb_desc_hid_cdc_priv.h | 8 + flight/PiOS/inc/pios_usb_desc_hid_only_priv.h | 8 + flight/PiOS/inc/pios_usbhook.h | 13 ++ flight/PipXtreme/inc/pios_usb_board_data.h | 27 --- flight/PipXtreme/pios_board.c | 14 +- flight/PipXtreme/pios_usb_board_data.c | 77 ++++++- shared/uavobjectdefinition/hwsettings.xml | 1 + 44 files changed, 980 insertions(+), 549 deletions(-) create mode 100644 flight/PiOS/inc/pios_usb_board_data_priv.h create mode 100644 flight/PiOS/inc/pios_usb_desc_hid_cdc_priv.h create mode 100644 flight/PiOS/inc/pios_usb_desc_hid_only_priv.h diff --git a/flight/Bootloaders/CopterControl/Makefile b/flight/Bootloaders/CopterControl/Makefile index a5effde9c..699fd02e5 100644 --- a/flight/Bootloaders/CopterControl/Makefile +++ b/flight/Bootloaders/CopterControl/Makefile @@ -104,7 +104,6 @@ SRC += $(PIOSSTM32F10X)/pios_irq.c SRC += $(PIOSSTM32F10X)/pios_debug.c SRC += $(PIOSSTM32F10X)/pios_gpio.c - # PIOS USB related files (seperated to make code maintenance more easy) SRC += $(PIOSSTM32F10X)/pios_usb.c SRC += $(PIOSSTM32F10X)/pios_usbhook.c diff --git a/flight/Bootloaders/CopterControl/inc/pios_usb_board_data.h b/flight/Bootloaders/CopterControl/inc/pios_usb_board_data.h index 85f407a9e..f1accee17 100644 --- a/flight/Bootloaders/CopterControl/inc/pios_usb_board_data.h +++ b/flight/Bootloaders/CopterControl/inc/pios_usb_board_data.h @@ -37,33 +37,6 @@ #include "pios_usb_defs.h" /* struct usb_* */ -struct usb_board_config { - struct usb_configuration_desc config; - struct usb_interface_desc hid_if; - struct usb_hid_desc hid; - struct usb_endpoint_desc hid_in; - struct usb_endpoint_desc hid_out; -} __attribute__((packed)); - -extern const struct usb_device_desc PIOS_USB_BOARD_DeviceDescriptor; -extern const struct usb_board_config PIOS_USB_BOARD_Configuration; -extern const struct usb_string_langid PIOS_USB_BOARD_StringLangID; - -/* NOTE NOTE NOTE - * - * Care must be taken to ensure that the _actual_ contents of - * these arrays (in each board's pios_usb_board_data.c) is no - * smaller than the stated sizes here or these descriptors - * will end up with trailing zeros on the wire. - * - * The compiler will catch any time that these definitions are - * too small. - */ -extern const uint8_t PIOS_USB_BOARD_HidReportDescriptor[36]; -extern const uint8_t PIOS_USB_BOARD_StringVendorID[28]; -extern const uint8_t PIOS_USB_BOARD_StringProductID[28]; -extern uint8_t PIOS_USB_BOARD_StringSerial[52]; - #define PIOS_USB_BOARD_PRODUCT_ID USB_PRODUCT_ID_COPTERCONTROL #define PIOS_USB_BOARD_DEVICE_VER USB_OP_DEVICE_VER(USB_OP_BOARD_ID_COPTERCONTROL, USB_OP_BOARD_MODE_BL) diff --git a/flight/Bootloaders/CopterControl/pios_board.c b/flight/Bootloaders/CopterControl/pios_board.c index 972a85be0..a70537fcc 100644 --- a/flight/Bootloaders/CopterControl/pios_board.c +++ b/flight/Bootloaders/CopterControl/pios_board.c @@ -48,6 +48,10 @@ static const struct pios_usb_cfg pios_usb_main_cfg = { }, }, }; + +#include "pios_usb_board_data_priv.h" +#include "pios_usb_desc_hid_only_priv.h" + #endif /* PIOS_INCLUDE_USB */ #if defined(PIOS_INCLUDE_USB_HID) @@ -87,6 +91,12 @@ void PIOS_Board_Init(void) { PIOS_GPIO_Init(); #if defined(PIOS_INCLUDE_USB) + /* Initialize board specific USB data */ + PIOS_USB_BOARD_DATA_Init(); + + /* Activate the HID-only USB configuration */ + PIOS_USB_DESC_HID_ONLY_Init(); + uint32_t pios_usb_id; if (PIOS_USB_Init(&pios_usb_id, &pios_usb_main_cfg)) { PIOS_Assert(0); diff --git a/flight/Bootloaders/CopterControl/pios_usb_board_data.c b/flight/Bootloaders/CopterControl/pios_usb_board_data.c index b39fcbec3..4f02ce424 100644 --- a/flight/Bootloaders/CopterControl/pios_usb_board_data.c +++ b/flight/Bootloaders/CopterControl/pios_usb_board_data.c @@ -29,9 +29,11 @@ */ #include "pios_usb_board_data.h" /* struct usb_*, USB_* */ +#include "pios_sys.h" /* PIOS_SYS_SerialNumberGet */ +#include "pios_usbhook.h" /* PIOS_USBHOOK_* */ -const uint8_t PIOS_USB_BOARD_StringProductID[] = { - sizeof(PIOS_USB_BOARD_StringProductID), +static const uint8_t usb_product_id[28] = { + sizeof(usb_product_id), USB_DESC_TYPE_STRING, 'C', 0, 'o', 0, @@ -48,3 +50,74 @@ const uint8_t PIOS_USB_BOARD_StringProductID[] = { 'l', 0, }; +static uint8_t usb_serial_number[52] = { + sizeof(usb_serial_number), + USB_DESC_TYPE_STRING, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0 +}; + +static const struct usb_string_langid usb_lang_id = { + .bLength = sizeof(usb_lang_id), + .bDescriptorType = USB_DESC_TYPE_STRING, + .bLangID = htousbs(USB_LANGID_ENGLISH_UK), +}; + +static const uint8_t usb_vendor_id[28] = { + sizeof(usb_vendor_id), + USB_DESC_TYPE_STRING, + 'o', 0, + 'p', 0, + 'e', 0, + 'n', 0, + 'p', 0, + 'i', 0, + 'l', 0, + 'o', 0, + 't', 0, + '.', 0, + 'o', 0, + 'r', 0, + 'g', 0 +}; + +int32_t PIOS_USB_BOARD_DATA_Init(void) +{ + /* Load device serial number into serial number string */ + uint8_t sn[25]; + PIOS_SYS_SerialNumberGet((char *)sn); + for (uint8_t i = 0; sn[i] != '\0' && (2 * i) < usb_serial_number[0]; i++) { + usb_serial_number[2 + 2 * i] = sn[i]; + } + + PIOS_USBHOOK_RegisterString(USB_STRING_DESC_PRODUCT, (uint8_t *)&usb_product_id, sizeof(usb_product_id)); + PIOS_USBHOOK_RegisterString(USB_STRING_DESC_SERIAL, (uint8_t *)&usb_serial_number, sizeof(usb_serial_number)); + + PIOS_USBHOOK_RegisterString(USB_STRING_DESC_LANG, (uint8_t *)&usb_lang_id, sizeof(usb_lang_id)); + PIOS_USBHOOK_RegisterString(USB_STRING_DESC_VENDOR, (uint8_t *)&usb_vendor_id, sizeof(usb_vendor_id)); + + return 0; +} diff --git a/flight/Bootloaders/OpenPilot/Makefile b/flight/Bootloaders/OpenPilot/Makefile index 6c3888797..05d1bec1d 100644 --- a/flight/Bootloaders/OpenPilot/Makefile +++ b/flight/Bootloaders/OpenPilot/Makefile @@ -293,7 +293,7 @@ CSTANDARD = -std=gnu99 # Flags for C and C++ (arm-elf-gcc/arm-elf-g++) ifeq ($(DEBUG),YES) -CFLAGS = -DDEBUG +CFLAGS += -DDEBUG endif CFLAGS += -g$(DEBUGF) diff --git a/flight/Bootloaders/OpenPilot/inc/pios_usb_board_data.h b/flight/Bootloaders/OpenPilot/inc/pios_usb_board_data.h index d3e1079d6..ca9c948b0 100644 --- a/flight/Bootloaders/OpenPilot/inc/pios_usb_board_data.h +++ b/flight/Bootloaders/OpenPilot/inc/pios_usb_board_data.h @@ -37,33 +37,6 @@ #include "pios_usb_defs.h" /* struct usb_* */ -struct usb_board_config { - struct usb_configuration_desc config; - struct usb_interface_desc hid_if; - struct usb_hid_desc hid; - struct usb_endpoint_desc hid_in; - struct usb_endpoint_desc hid_out; -} __attribute__((packed)); - -extern const struct usb_device_desc PIOS_USB_BOARD_DeviceDescriptor; -extern const struct usb_board_config PIOS_USB_BOARD_Configuration; -extern const struct usb_string_langid PIOS_USB_BOARD_StringLangID; - -/* NOTE NOTE NOTE - * - * Care must be taken to ensure that the _actual_ contents of - * these arrays (in each board's pios_usb_board_data.c) is no - * smaller than the stated sizes here or these descriptors - * will end up with trailing zeros on the wire. - * - * The compiler will catch any time that these definitions are - * too small. - */ -extern const uint8_t PIOS_USB_BOARD_HidReportDescriptor[36]; -extern const uint8_t PIOS_USB_BOARD_StringVendorID[28]; -extern const uint8_t PIOS_USB_BOARD_StringProductID[20]; -extern uint8_t PIOS_USB_BOARD_StringSerial[52]; - #define PIOS_USB_BOARD_PRODUCT_ID USB_PRODUCT_ID_OPENPILOT_MAIN #define PIOS_USB_BOARD_DEVICE_VER USB_OP_DEVICE_VER(USB_OP_BOARD_ID_OPENPILOT_MAIN, USB_OP_BOARD_MODE_BL) diff --git a/flight/Bootloaders/OpenPilot/main.c b/flight/Bootloaders/OpenPilot/main.c index 8a9e554ef..3a06c9751 100644 --- a/flight/Bootloaders/OpenPilot/main.c +++ b/flight/Bootloaders/OpenPilot/main.c @@ -102,10 +102,6 @@ uint32_t sspTimeSource(); #define RED LED2 #define LED_PWM_TIMER TIM6 int main() { - /* NOTE: Do NOT modify the following start-up sequence */ - /* Any new initialization functions should be added in OpenPilotInit() */ - - /* Brings up System using CMSIS functions, enables the LEDs. */ PIOS_SYS_Init(); if (BSL_HOLD_STATE == 0) USB_connected = TRUE; @@ -228,7 +224,6 @@ void jump_to_app() { RCC_APB1PeriphResetCmd(0xffffffff, DISABLE); _SetCNTR(0); // clear interrupt mask _SetISTR(0); // clear all requests - JumpAddress = *(__IO uint32_t*) (bdinfo->fw_base + 4); Jump_To_Application = (pFunction) JumpAddress; /* Initialize user application's Stack Pointer */ diff --git a/flight/Bootloaders/OpenPilot/op_dfu.c b/flight/Bootloaders/OpenPilot/op_dfu.c index 40ef6fbda..ef30e4897 100644 --- a/flight/Bootloaders/OpenPilot/op_dfu.c +++ b/flight/Bootloaders/OpenPilot/op_dfu.c @@ -34,10 +34,6 @@ #include #include "pios_opahrs.h" #include "ssp.h" -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ //programmable devices Device devicesTable[10]; uint8_t numberOfDevices = 0; @@ -223,7 +219,7 @@ void processComand(uint8_t *xReceive_Buffer) { } } if (result != 1) { - DeviceState = Last_operation_failed;//ok + DeviceState = Last_operation_failed; Aditionals = (uint32_t) Command; } else { @@ -392,7 +388,6 @@ void processComand(uint8_t *xReceive_Buffer) { DeviceState = too_few_packets; } } - break; case Download_Req: #ifdef DEBUG_SSP diff --git a/flight/Bootloaders/OpenPilot/pios_board.c b/flight/Bootloaders/OpenPilot/pios_board.c index 707600b4d..d1ba74d8b 100644 --- a/flight/Bootloaders/OpenPilot/pios_board.c +++ b/flight/Bootloaders/OpenPilot/pios_board.c @@ -215,7 +215,11 @@ static const struct pios_usb_cfg pios_usb_main_cfg = { }, }, }; -#endif /* PIOS_INCLUDE_USB_HID */ + +#include "pios_usb_board_data_priv.h" +#include "pios_usb_desc_hid_only_priv.h" + +#endif /* PIOS_INCLUDE_USB */ #if defined(PIOS_INCLUDE_USB_HID) #include @@ -270,6 +274,12 @@ void PIOS_Board_Init(void) { PIOS_GPIO_Init(); #if defined(PIOS_INCLUDE_USB) + /* Initialize board specific USB data */ + PIOS_USB_BOARD_DATA_Init(); + + /* Activate the HID-only USB configuration */ + PIOS_USB_DESC_HID_ONLY_Init(); + uint32_t pios_usb_id; if (PIOS_USB_Init(&pios_usb_id, &pios_usb_main_cfg)) { PIOS_Assert(0); diff --git a/flight/Bootloaders/OpenPilot/pios_usb_board_data.c b/flight/Bootloaders/OpenPilot/pios_usb_board_data.c index 9492d316e..b73419ba4 100644 --- a/flight/Bootloaders/OpenPilot/pios_usb_board_data.c +++ b/flight/Bootloaders/OpenPilot/pios_usb_board_data.c @@ -29,9 +29,11 @@ */ #include "pios_usb_board_data.h" /* struct usb_*, USB_* */ +#include "pios_sys.h" /* PIOS_SYS_SerialNumberGet */ +#include "pios_usbhook.h" /* PIOS_USBHOOK_* */ -const uint8_t PIOS_USB_BOARD_StringProductID[] = { - sizeof(PIOS_USB_BOARD_StringProductID), +static const uint8_t usb_product_id[20] = { + sizeof(usb_product_id), USB_DESC_TYPE_STRING, 'O', 0, 'p', 0, @@ -43,3 +45,75 @@ const uint8_t PIOS_USB_BOARD_StringProductID[] = { 'o', 0, 't', 0, }; + +static uint8_t usb_serial_number[52] = { + sizeof(usb_serial_number), + USB_DESC_TYPE_STRING, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0 +}; + +static const struct usb_string_langid usb_lang_id = { + .bLength = sizeof(usb_lang_id), + .bDescriptorType = USB_DESC_TYPE_STRING, + .bLangID = htousbs(USB_LANGID_ENGLISH_UK), +}; + +static const uint8_t usb_vendor_id[28] = { + sizeof(usb_vendor_id), + USB_DESC_TYPE_STRING, + 'o', 0, + 'p', 0, + 'e', 0, + 'n', 0, + 'p', 0, + 'i', 0, + 'l', 0, + 'o', 0, + 't', 0, + '.', 0, + 'o', 0, + 'r', 0, + 'g', 0 +}; + +int32_t PIOS_USB_BOARD_DATA_Init(void) +{ + /* Load device serial number into serial number string */ + uint8_t sn[25]; + PIOS_SYS_SerialNumberGet((char *)sn); + for (uint8_t i = 0; sn[i] != '\0' && (2 * i) < usb_serial_number[0]; i++) { + usb_serial_number[2 + 2 * i] = sn[i]; + } + + PIOS_USBHOOK_RegisterString(USB_STRING_DESC_PRODUCT, (uint8_t *)&usb_product_id, sizeof(usb_product_id)); + PIOS_USBHOOK_RegisterString(USB_STRING_DESC_SERIAL, (uint8_t *)&usb_serial_number, sizeof(usb_serial_number)); + + PIOS_USBHOOK_RegisterString(USB_STRING_DESC_LANG, (uint8_t *)&usb_lang_id, sizeof(usb_lang_id)); + PIOS_USBHOOK_RegisterString(USB_STRING_DESC_VENDOR, (uint8_t *)&usb_vendor_id, sizeof(usb_vendor_id)); + + return 0; +} diff --git a/flight/Bootloaders/PipXtreme/Makefile b/flight/Bootloaders/PipXtreme/Makefile index 9bad695f7..a411b6403 100644 --- a/flight/Bootloaders/PipXtreme/Makefile +++ b/flight/Bootloaders/PipXtreme/Makefile @@ -287,7 +287,7 @@ CSTANDARD = -std=gnu99 # Flags for C and C++ (arm-elf-gcc/arm-elf-g++) ifeq ($(DEBUG),YES) -CFLAGS = -DDEBUG +CFLAGS += -DDEBUG endif CFLAGS += -g$(DEBUGF) diff --git a/flight/Bootloaders/PipXtreme/inc/pios_config.h b/flight/Bootloaders/PipXtreme/inc/pios_config.h index 8084f9c0a..cec926057 100644 --- a/flight/Bootloaders/PipXtreme/inc/pios_config.h +++ b/flight/Bootloaders/PipXtreme/inc/pios_config.h @@ -40,7 +40,6 @@ #define PIOS_INCLUDE_USB_HID #define PIOS_INCLUDE_COM_MSG #define PIOS_INCLUDE_GPIO -//#define DEBUG_SSP /* Defaults for Logging */ #define LOG_FILENAME "PIOS.LOG" diff --git a/flight/Bootloaders/PipXtreme/inc/pios_usb_board_data.h b/flight/Bootloaders/PipXtreme/inc/pios_usb_board_data.h index fb6ced1f8..2e35f2fa4 100644 --- a/flight/Bootloaders/PipXtreme/inc/pios_usb_board_data.h +++ b/flight/Bootloaders/PipXtreme/inc/pios_usb_board_data.h @@ -37,33 +37,6 @@ #include "pios_usb_defs.h" /* struct usb_* */ -struct usb_board_config { - struct usb_configuration_desc config; - struct usb_interface_desc hid_if; - struct usb_hid_desc hid; - struct usb_endpoint_desc hid_in; - struct usb_endpoint_desc hid_out; -} __attribute__((packed)); - -extern const struct usb_device_desc PIOS_USB_BOARD_DeviceDescriptor; -extern const struct usb_board_config PIOS_USB_BOARD_Configuration; -extern const struct usb_string_langid PIOS_USB_BOARD_StringLangID; - -/* NOTE NOTE NOTE - * - * Care must be taken to ensure that the _actual_ contents of - * these arrays (in each board's pios_usb_board_data.c) is no - * smaller than the stated sizes here or these descriptors - * will end up with trailing zeros on the wire. - * - * The compiler will catch any time that these definitions are - * too small. - */ -extern const uint8_t PIOS_USB_BOARD_HidReportDescriptor[36]; -extern const uint8_t PIOS_USB_BOARD_StringVendorID[28]; -extern const uint8_t PIOS_USB_BOARD_StringProductID[20]; -extern uint8_t PIOS_USB_BOARD_StringSerial[52]; - #define PIOS_USB_BOARD_PRODUCT_ID USB_PRODUCT_ID_PIPXTREME #define PIOS_USB_BOARD_DEVICE_VER USB_OP_DEVICE_VER(USB_OP_BOARD_ID_PIPXTREME, USB_OP_BOARD_MODE_BL) diff --git a/flight/Bootloaders/PipXtreme/main.c b/flight/Bootloaders/PipXtreme/main.c index 4923f8fc1..602193f5c 100644 --- a/flight/Bootloaders/PipXtreme/main.c +++ b/flight/Bootloaders/PipXtreme/main.c @@ -72,10 +72,6 @@ void jump_to_app(); #define BLUE LED1 #define RED LED4 int main() { - /* NOTE: Do NOT modify the following start-up sequence */ - /* Any new initialization functions should be added in OpenPilotInit() */ - - /* Brings up System using CMSIS functions, enables the LEDs. */ PIOS_SYS_Init(); if (BSL_HOLD_STATE == 0) USB_connected = TRUE; @@ -182,7 +178,6 @@ void jump_to_app() { RCC_APB1PeriphResetCmd(0xffffffff, DISABLE); _SetCNTR(0); // clear interrupt mask _SetISTR(0); // clear all requests - JumpAddress = *(__IO uint32_t*) (bdinfo->fw_base + 4); Jump_To_Application = (pFunction) JumpAddress; /* Initialize user application's Stack Pointer */ diff --git a/flight/Bootloaders/PipXtreme/op_dfu.c b/flight/Bootloaders/PipXtreme/op_dfu.c index 0d5da248f..249e3d320 100644 --- a/flight/Bootloaders/PipXtreme/op_dfu.c +++ b/flight/Bootloaders/PipXtreme/op_dfu.c @@ -32,10 +32,6 @@ #include "pios_bl_helper.h" #include "pios_com_msg.h" #include -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ //programmable devices Device devicesTable[10]; uint8_t numberOfDevices = 0; @@ -145,7 +141,7 @@ void processComand(uint8_t *xReceive_Buffer) { case EnterDFU: if (((DeviceState == BLidle) && (Data0 < numberOfDevices)) || (DeviceState == DFUidle)) { - if (Data0 > 0)//PORQUE??? + if (Data0 > 0) OPDfuIni(TRUE); DeviceState = DFUidle; currentProgrammingDestination = devicesTable[Data0].programmingType; @@ -202,7 +198,7 @@ void processComand(uint8_t *xReceive_Buffer) { } } if (result != 1) { - DeviceState = Last_operation_failed;//ok + DeviceState = Last_operation_failed; Aditionals = (uint32_t) Command; } else { @@ -253,11 +249,9 @@ void processComand(uint8_t *xReceive_Buffer) { ++Next_Packet; } else { - DeviceState = wrong_packet_received; Aditionals = Count; } - // FLASH_ProgramWord(MemLocations[TransferType]+4,++Next_Packet);//+Count,Data); } else { DeviceState = Last_operation_failed; Aditionals = (uint32_t) Command; @@ -331,7 +325,6 @@ void processComand(uint8_t *xReceive_Buffer) { DeviceState = too_few_packets; } } - break; case Download_Req: #ifdef DEBUG_SSP diff --git a/flight/Bootloaders/PipXtreme/pios_board.c b/flight/Bootloaders/PipXtreme/pios_board.c index 3c06d820b..a70537fcc 100644 --- a/flight/Bootloaders/PipXtreme/pios_board.c +++ b/flight/Bootloaders/PipXtreme/pios_board.c @@ -49,6 +49,9 @@ static const struct pios_usb_cfg pios_usb_main_cfg = { }, }; +#include "pios_usb_board_data_priv.h" +#include "pios_usb_desc_hid_only_priv.h" + #endif /* PIOS_INCLUDE_USB */ #if defined(PIOS_INCLUDE_USB_HID) @@ -88,6 +91,12 @@ void PIOS_Board_Init(void) { PIOS_GPIO_Init(); #if defined(PIOS_INCLUDE_USB) + /* Initialize board specific USB data */ + PIOS_USB_BOARD_DATA_Init(); + + /* Activate the HID-only USB configuration */ + PIOS_USB_DESC_HID_ONLY_Init(); + uint32_t pios_usb_id; if (PIOS_USB_Init(&pios_usb_id, &pios_usb_main_cfg)) { PIOS_Assert(0); diff --git a/flight/Bootloaders/PipXtreme/pios_usb_board_data.c b/flight/Bootloaders/PipXtreme/pios_usb_board_data.c index d54ca6565..3e41e5ac9 100644 --- a/flight/Bootloaders/PipXtreme/pios_usb_board_data.c +++ b/flight/Bootloaders/PipXtreme/pios_usb_board_data.c @@ -29,9 +29,11 @@ */ #include "pios_usb_board_data.h" /* struct usb_*, USB_* */ +#include "pios_sys.h" /* PIOS_SYS_SerialNumberGet */ +#include "pios_usbhook.h" /* PIOS_USBHOOK_* */ -const uint8_t PIOS_USB_BOARD_StringProductID[] = { - sizeof(PIOS_USB_BOARD_StringProductID), +static const uint8_t usb_product_id[20] = { + sizeof(usb_product_id), USB_DESC_TYPE_STRING, 'P', 0, 'i', 0, @@ -44,3 +46,74 @@ const uint8_t PIOS_USB_BOARD_StringProductID[] = { 'e', 0, }; +static uint8_t usb_serial_number[52] = { + sizeof(usb_serial_number), + USB_DESC_TYPE_STRING, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0 +}; + +static const struct usb_string_langid usb_lang_id = { + .bLength = sizeof(usb_lang_id), + .bDescriptorType = USB_DESC_TYPE_STRING, + .bLangID = htousbs(USB_LANGID_ENGLISH_UK), +}; + +static const uint8_t usb_vendor_id[28] = { + sizeof(usb_vendor_id), + USB_DESC_TYPE_STRING, + 'o', 0, + 'p', 0, + 'e', 0, + 'n', 0, + 'p', 0, + 'i', 0, + 'l', 0, + 'o', 0, + 't', 0, + '.', 0, + 'o', 0, + 'r', 0, + 'g', 0 +}; + +int32_t PIOS_USB_BOARD_DATA_Init(void) +{ + /* Load device serial number into serial number string */ + uint8_t sn[25]; + PIOS_SYS_SerialNumberGet((char *)sn); + for (uint8_t i = 0; sn[i] != '\0' && (2 * i) < usb_serial_number[0]; i++) { + usb_serial_number[2 + 2 * i] = sn[i]; + } + + PIOS_USBHOOK_RegisterString(USB_STRING_DESC_PRODUCT, (uint8_t *)&usb_product_id, sizeof(usb_product_id)); + PIOS_USBHOOK_RegisterString(USB_STRING_DESC_SERIAL, (uint8_t *)&usb_serial_number, sizeof(usb_serial_number)); + + PIOS_USBHOOK_RegisterString(USB_STRING_DESC_LANG, (uint8_t *)&usb_lang_id, sizeof(usb_lang_id)); + PIOS_USBHOOK_RegisterString(USB_STRING_DESC_VENDOR, (uint8_t *)&usb_vendor_id, sizeof(usb_vendor_id)); + + return 0; +} diff --git a/flight/CopterControl/Makefile b/flight/CopterControl/Makefile index 589251a4a..891e7f6c6 100644 --- a/flight/CopterControl/Makefile +++ b/flight/CopterControl/Makefile @@ -216,6 +216,7 @@ SRC += $(PIOSSTM32F10X)/pios_usb_hid_istr.c SRC += $(PIOSSTM32F10X)/pios_usb_hid_pwr.c SRC += $(OPSYSTEM)/pios_usb_board_data.c SRC += $(PIOSCOMMON)/pios_usb_desc_hid_cdc.c +SRC += $(PIOSCOMMON)/pios_usb_desc_hid_only.c ## PIOS Hardware (Common) SRC += $(PIOSCOMMON)/pios_crc.c diff --git a/flight/CopterControl/System/inc/pios_usb_board_data.h b/flight/CopterControl/System/inc/pios_usb_board_data.h index ee53c7455..9907a4934 100644 --- a/flight/CopterControl/System/inc/pios_usb_board_data.h +++ b/flight/CopterControl/System/inc/pios_usb_board_data.h @@ -37,44 +37,7 @@ #define PIOS_USB_BOARD_EP_NUM 4 -#include "pios_usb_defs.h" /* struct usb_* */ - -struct usb_board_config { - struct usb_configuration_desc config; - struct usb_interface_association_desc iad; - struct usb_interface_desc hid_if; - struct usb_hid_desc hid; - struct usb_endpoint_desc hid_in; - struct usb_endpoint_desc hid_out; - struct usb_interface_desc cdc_control_if; - struct usb_cdc_header_func_desc cdc_header; - struct usb_cdc_callmgmt_func_desc cdc_callmgmt; - struct usb_cdc_acm_func_desc cdc_acm; - struct usb_cdc_union_func_desc cdc_union; - struct usb_endpoint_desc cdc_mgmt_in; - struct usb_interface_desc cdc_data_if; - struct usb_endpoint_desc cdc_in; - struct usb_endpoint_desc cdc_out; -} __attribute__((packed)); - -extern const struct usb_device_desc PIOS_USB_BOARD_DeviceDescriptor; -extern const struct usb_board_config PIOS_USB_BOARD_Configuration; -extern const struct usb_string_langid PIOS_USB_BOARD_StringLangID; - -/* NOTE NOTE NOTE - * - * Care must be taken to ensure that the _actual_ contents of - * these arrays (in each board's pios_usb_board_data.c) is no - * smaller than the stated sizes here or these descriptors - * will end up with trailing zeros on the wire. - * - * The compiler will catch any time that these definitions are - * too small. - */ -extern const uint8_t PIOS_USB_BOARD_HidReportDescriptor[36]; -extern const uint8_t PIOS_USB_BOARD_StringVendorID[28]; -extern const uint8_t PIOS_USB_BOARD_StringProductID[28]; -extern uint8_t PIOS_USB_BOARD_StringSerial[52]; +#include "pios_usb_defs.h" /* USB_* macros */ #define PIOS_USB_BOARD_PRODUCT_ID USB_PRODUCT_ID_COPTERCONTROL #define PIOS_USB_BOARD_DEVICE_VER USB_OP_DEVICE_VER(USB_OP_BOARD_ID_COPTERCONTROL, USB_OP_BOARD_MODE_FW) diff --git a/flight/CopterControl/System/pios_board.c b/flight/CopterControl/System/pios_board.c index 3a4c3e89f..ffdde4759 100644 --- a/flight/CopterControl/System/pios_board.c +++ b/flight/CopterControl/System/pios_board.c @@ -998,6 +998,11 @@ static const struct pios_usb_cfg pios_usb_main_cfg = { }, }, }; + +#include "pios_usb_board_data_priv.h" +#include "pios_usb_desc_hid_cdc_priv.h" +#include "pios_usb_desc_hid_only_priv.h" + #endif /* PIOS_INCLUDE_USB */ #if defined(PIOS_INCLUDE_USB_HID) @@ -1090,14 +1095,50 @@ void PIOS_Board_Init(void) { PIOS_TIM_InitClock(&tim_4_cfg); #if defined(PIOS_INCLUDE_USB) + /* Initialize board specific USB data */ + PIOS_USB_BOARD_DATA_Init(); + + /* Flags to determine if various USB interfaces are advertised */ + bool usb_hid_present = false; + bool usb_cdc_present = false; + + uint8_t hwsettings_usb_devicetype; + HwSettingsUSB_DeviceTypeGet(&hwsettings_usb_devicetype); + + switch (hwsettings_usb_devicetype) { + case HWSETTINGS_USB_DEVICETYPE_HIDONLY: + if (PIOS_USB_DESC_HID_ONLY_Init()) { + PIOS_Assert(0); + } + usb_hid_present = true; + break; + case HWSETTINGS_USB_DEVICETYPE_HIDVCP: + if (PIOS_USB_DESC_HID_CDC_Init()) { + PIOS_Assert(0); + } + usb_hid_present = true; + usb_cdc_present = true; + break; + case HWSETTINGS_USB_DEVICETYPE_VCPONLY: + break; + default: + PIOS_Assert(0); + } + uint32_t pios_usb_id; PIOS_USB_Init(&pios_usb_id, &pios_usb_main_cfg); #if defined(PIOS_INCLUDE_USB_CDC) - /* Configure the USB VCP port */ + uint8_t hwsettings_usb_vcpport; + /* Configure the USB VCP port */ HwSettingsUSB_VCPPortGet(&hwsettings_usb_vcpport); + if (!usb_cdc_present) { + /* Force VCP port function to disabled if we haven't advertised VCP in our USB descriptor */ + hwsettings_usb_vcpport = HWSETTINGS_USB_VCPPORT_DISABLED; + } + switch (hwsettings_usb_vcpport) { case HWSETTINGS_USB_VCPPORT_DISABLED: break; @@ -1136,7 +1177,6 @@ void PIOS_Board_Init(void) { tx_buffer, PIOS_COM_BRIDGE_TX_BUF_LEN)) { PIOS_Assert(0); } - } #endif /* PIOS_INCLUDE_COM */ break; @@ -1148,6 +1188,11 @@ void PIOS_Board_Init(void) { uint8_t hwsettings_usb_hidport; HwSettingsUSB_HIDPortGet(&hwsettings_usb_hidport); + if (!usb_hid_present) { + /* Force HID port function to disabled if we haven't advertised HID in our USB descriptor */ + hwsettings_usb_hidport = HWSETTINGS_USB_HIDPORT_DISABLED; + } + switch (hwsettings_usb_hidport) { case HWSETTINGS_USB_HIDPORT_DISABLED: break; diff --git a/flight/CopterControl/System/pios_usb_board_data.c b/flight/CopterControl/System/pios_usb_board_data.c index b39fcbec3..4f02ce424 100644 --- a/flight/CopterControl/System/pios_usb_board_data.c +++ b/flight/CopterControl/System/pios_usb_board_data.c @@ -29,9 +29,11 @@ */ #include "pios_usb_board_data.h" /* struct usb_*, USB_* */ +#include "pios_sys.h" /* PIOS_SYS_SerialNumberGet */ +#include "pios_usbhook.h" /* PIOS_USBHOOK_* */ -const uint8_t PIOS_USB_BOARD_StringProductID[] = { - sizeof(PIOS_USB_BOARD_StringProductID), +static const uint8_t usb_product_id[28] = { + sizeof(usb_product_id), USB_DESC_TYPE_STRING, 'C', 0, 'o', 0, @@ -48,3 +50,74 @@ const uint8_t PIOS_USB_BOARD_StringProductID[] = { 'l', 0, }; +static uint8_t usb_serial_number[52] = { + sizeof(usb_serial_number), + USB_DESC_TYPE_STRING, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0 +}; + +static const struct usb_string_langid usb_lang_id = { + .bLength = sizeof(usb_lang_id), + .bDescriptorType = USB_DESC_TYPE_STRING, + .bLangID = htousbs(USB_LANGID_ENGLISH_UK), +}; + +static const uint8_t usb_vendor_id[28] = { + sizeof(usb_vendor_id), + USB_DESC_TYPE_STRING, + 'o', 0, + 'p', 0, + 'e', 0, + 'n', 0, + 'p', 0, + 'i', 0, + 'l', 0, + 'o', 0, + 't', 0, + '.', 0, + 'o', 0, + 'r', 0, + 'g', 0 +}; + +int32_t PIOS_USB_BOARD_DATA_Init(void) +{ + /* Load device serial number into serial number string */ + uint8_t sn[25]; + PIOS_SYS_SerialNumberGet((char *)sn); + for (uint8_t i = 0; sn[i] != '\0' && (2 * i) < usb_serial_number[0]; i++) { + usb_serial_number[2 + 2 * i] = sn[i]; + } + + PIOS_USBHOOK_RegisterString(USB_STRING_DESC_PRODUCT, (uint8_t *)&usb_product_id, sizeof(usb_product_id)); + PIOS_USBHOOK_RegisterString(USB_STRING_DESC_SERIAL, (uint8_t *)&usb_serial_number, sizeof(usb_serial_number)); + + PIOS_USBHOOK_RegisterString(USB_STRING_DESC_LANG, (uint8_t *)&usb_lang_id, sizeof(usb_lang_id)); + PIOS_USBHOOK_RegisterString(USB_STRING_DESC_VENDOR, (uint8_t *)&usb_vendor_id, sizeof(usb_vendor_id)); + + return 0; +} diff --git a/flight/OpenPilot/Makefile b/flight/OpenPilot/Makefile index 8f9d9bef9..940c1f117 100644 --- a/flight/OpenPilot/Makefile +++ b/flight/OpenPilot/Makefile @@ -183,9 +183,11 @@ SRC += $(PIOSSTM32F10X)/pios_wdg.c SRC += $(PIOSSTM32F10X)/pios_usb.c SRC += $(PIOSSTM32F10X)/pios_usbhook.c SRC += $(PIOSSTM32F10X)/pios_usb_hid.c +SRC += $(PIOSSTM32F10X)/pios_usb_cdc.c SRC += $(PIOSSTM32F10X)/pios_usb_hid_istr.c SRC += $(PIOSSTM32F10X)/pios_usb_hid_pwr.c SRC += $(OPSYSTEM)/pios_usb_board_data.c +SRC += $(PIOSCOMMON)/pios_usb_desc_hid_cdc.c SRC += $(PIOSCOMMON)/pios_usb_desc_hid_only.c ## PIOS Hardware (Common) diff --git a/flight/OpenPilot/System/inc/pios_config.h b/flight/OpenPilot/System/inc/pios_config.h index 3ec902e8e..ce0484a8d 100644 --- a/flight/OpenPilot/System/inc/pios_config.h +++ b/flight/OpenPilot/System/inc/pios_config.h @@ -57,6 +57,7 @@ #define PIOS_INCLUDE_USART #define PIOS_INCLUDE_USB #define PIOS_INCLUDE_USB_HID +#define PIOS_INCLUDE_USB_CDC #define PIOS_INCLUDE_BMP085 //#define PIOS_INCLUDE_HCSR04 #define PIOS_INCLUDE_OPAHRS diff --git a/flight/OpenPilot/System/inc/pios_usb_board_data.h b/flight/OpenPilot/System/inc/pios_usb_board_data.h index e2f079bc2..08fc3423b 100644 --- a/flight/OpenPilot/System/inc/pios_usb_board_data.h +++ b/flight/OpenPilot/System/inc/pios_usb_board_data.h @@ -39,43 +39,6 @@ #include "pios_usb_defs.h" /* struct usb_* */ -struct usb_board_config { - struct usb_configuration_desc config; - struct usb_interface_association_desc iad; - struct usb_interface_desc hid_if; - struct usb_hid_desc hid; - struct usb_endpoint_desc hid_in; - struct usb_endpoint_desc hid_out; - struct usb_interface_desc cdc_control_if; - struct usb_cdc_header_func_desc cdc_header; - struct usb_cdc_callmgmt_func_desc cdc_callmgmt; - struct usb_cdc_acm_func_desc cdc_acm; - struct usb_cdc_union_func_desc cdc_union; - struct usb_endpoint_desc cdc_mgmt_in; - struct usb_interface_desc cdc_data_if; - struct usb_endpoint_desc cdc_in; - struct usb_endpoint_desc cdc_out; -} __attribute__((packed)); - -extern const struct usb_device_desc PIOS_USB_BOARD_DeviceDescriptor; -extern const struct usb_board_config PIOS_USB_BOARD_Configuration; -extern const struct usb_string_langid PIOS_USB_BOARD_StringLangID; - -/* NOTE NOTE NOTE - * - * Care must be taken to ensure that the _actual_ contents of - * these arrays (in each board's pios_usb_board_data.c) is no - * smaller than the stated sizes here or these descriptors - * will end up with trailing zeros on the wire. - * - * The compiler will catch any time that these definitions are - * too small. - */ -extern const uint8_t PIOS_USB_BOARD_HidReportDescriptor[36]; -extern const uint8_t PIOS_USB_BOARD_StringVendorID[28]; -extern const uint8_t PIOS_USB_BOARD_StringProductID[20]; -extern uint8_t PIOS_USB_BOARD_StringSerial[52]; - #define PIOS_USB_BOARD_PRODUCT_ID USB_PRODUCT_ID_OPENPILOT_MAIN #define PIOS_USB_BOARD_DEVICE_VER USB_OP_DEVICE_VER(USB_OP_BOARD_ID_OPENPILOT_MAIN, USB_OP_BOARD_MODE_FW) diff --git a/flight/OpenPilot/System/pios_board.c b/flight/OpenPilot/System/pios_board.c index 314a8e24d..8dbb5eee2 100644 --- a/flight/OpenPilot/System/pios_board.c +++ b/flight/OpenPilot/System/pios_board.c @@ -611,6 +611,9 @@ static const struct pios_dsm_cfg pios_dsm_cfg = { #define PIOS_COM_TELEM_USB_RX_BUF_LEN 192 #define PIOS_COM_TELEM_USB_TX_BUF_LEN 192 +#define PIOS_COM_BRIDGE_RX_BUF_LEN 65 +#define PIOS_COM_BRIDGE_TX_BUF_LEN 12 + #endif /* PIOS_INCLUDE_COM */ /** @@ -1054,6 +1057,10 @@ static const struct pios_usb_cfg pios_usb_main_cfg = { }, }, }; + +#include "pios_usb_board_data_priv.h" +#include "pios_usb_desc_hid_cdc_priv.h" +#include "pios_usb_desc_hid_only_priv.h" #endif /* PIOS_INCLUDE_USB */ #if defined(PIOS_INCLUDE_USB_HID) @@ -1067,8 +1074,22 @@ const struct pios_usb_hid_cfg pios_usb_hid_cfg = { #endif /* PIOS_INCLUDE_USB_HID */ +#if defined(PIOS_INCLUDE_USB_CDC) +#include + +const struct pios_usb_cdc_cfg pios_usb_cdc_cfg = { + .ctrl_if = 1, + .ctrl_tx_ep = 2, + + .data_if = 2, + .data_rx_ep = 3, + .data_tx_ep = 3, +}; +#endif /* PIOS_INCLUDE_USB_CDC */ + uint32_t pios_com_telem_rf_id; uint32_t pios_com_telem_usb_id; +uint32_t pios_com_vcp_id; uint32_t pios_com_gps_id; uint32_t pios_com_aux_id; uint32_t pios_com_dsm_id; @@ -1109,14 +1130,27 @@ void PIOS_Board_Init(void) { HwSettingsInitialize(); + PIOS_WDG_Init(); + + /* Initialize the alarms library */ + AlarmsInitialize(); + + PIOS_IAP_Init(); + uint16_t boot_count = PIOS_IAP_ReadBootCount(); + if (boot_count < 3) { + PIOS_IAP_WriteBootCount(++boot_count); + AlarmsClear(SYSTEMALARMS_ALARM_BOOTFAULT); + } else { + /* Too many failed boot attempts, force hwsettings to defaults */ + HwSettingsSetDefaults(HwSettingsHandle(), 0); + AlarmsSet(SYSTEMALARMS_ALARM_BOOTFAULT, SYSTEMALARMS_ALARM_CRITICAL); + } + #if defined(PIOS_INCLUDE_RTC) /* Initialize the real-time clock and its associated tick */ PIOS_RTC_Init(&pios_rtc_main_cfg); #endif - /* Initialize the alarms library */ - AlarmsInitialize(); - /* Initialize the task monitor library */ TaskMonitorInitialize(); @@ -1124,7 +1158,6 @@ void PIOS_Board_Init(void) { PIOS_TIM_InitClock(&tim_1_cfg); PIOS_TIM_InitClock(&tim_3_cfg); PIOS_TIM_InitClock(&tim_5_cfg); - PIOS_TIM_InitClock(&tim_4_cfg); PIOS_TIM_InitClock(&tim_8_cfg); @@ -1139,6 +1172,133 @@ void PIOS_Board_Init(void) { /* Bind the AHRS comms layer to the AHRS SPI link */ AhrsConnect(pios_spi_ahrs_id); +#if defined(PIOS_INCLUDE_USB) + /* Initialize board specific USB data */ + PIOS_USB_BOARD_DATA_Init(); + + /* Flags to determine if various USB interfaces are advertised */ + bool usb_hid_present = false; + bool usb_cdc_present = false; + + uint8_t hwsettings_usb_devicetype; + HwSettingsUSB_DeviceTypeGet(&hwsettings_usb_devicetype); + + switch (hwsettings_usb_devicetype) { + case HWSETTINGS_USB_DEVICETYPE_HIDONLY: + if (PIOS_USB_DESC_HID_ONLY_Init()) { + PIOS_Assert(0); + } + usb_hid_present = true; + break; + case HWSETTINGS_USB_DEVICETYPE_HIDVCP: + if (PIOS_USB_DESC_HID_CDC_Init()) { + PIOS_Assert(0); + } + usb_hid_present = true; + usb_cdc_present = true; + break; + case HWSETTINGS_USB_DEVICETYPE_VCPONLY: + break; + default: + PIOS_Assert(0); + } + + uint32_t pios_usb_id; + PIOS_USB_Init(&pios_usb_id, &pios_usb_main_cfg); + +#if defined(PIOS_INCLUDE_USB_CDC) + /* Configure the USB VCP port */ + uint8_t hwsettings_usb_vcpport; + HwSettingsUSB_VCPPortGet(&hwsettings_usb_vcpport); + + if (!usb_cdc_present) { + /* Force VCP port function to disabled if we haven't advertised VCP in our USB descriptor */ + hwsettings_usb_vcpport = HWSETTINGS_USB_VCPPORT_DISABLED; + } + + switch (hwsettings_usb_vcpport) { + case HWSETTINGS_USB_VCPPORT_DISABLED: + break; + case HWSETTINGS_USB_VCPPORT_USBTELEMETRY: +#if defined(PIOS_INCLUDE_COM) + { + uint32_t pios_usb_cdc_id; + if (PIOS_USB_CDC_Init(&pios_usb_cdc_id, &pios_usb_cdc_cfg, pios_usb_id)) { + PIOS_Assert(0); + } + uint8_t * rx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_TELEM_USB_RX_BUF_LEN); + uint8_t * tx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_TELEM_USB_TX_BUF_LEN); + PIOS_Assert(rx_buffer); + PIOS_Assert(tx_buffer); + if (PIOS_COM_Init(&pios_com_telem_usb_id, &pios_usb_cdc_com_driver, pios_usb_cdc_id, + rx_buffer, PIOS_COM_TELEM_USB_RX_BUF_LEN, + tx_buffer, PIOS_COM_TELEM_USB_TX_BUF_LEN)) { + PIOS_Assert(0); + } + } +#endif /* PIOS_INCLUDE_COM */ + break; + case HWSETTINGS_USB_VCPPORT_COMBRIDGE: +#if defined(PIOS_INCLUDE_COM) + { + uint32_t pios_usb_cdc_id; + if (PIOS_USB_CDC_Init(&pios_usb_cdc_id, &pios_usb_cdc_cfg, pios_usb_id)) { + PIOS_Assert(0); + } + uint8_t * rx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_BRIDGE_RX_BUF_LEN); + uint8_t * tx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_BRIDGE_TX_BUF_LEN); + PIOS_Assert(rx_buffer); + PIOS_Assert(tx_buffer); + if (PIOS_COM_Init(&pios_com_vcp_id, &pios_usb_cdc_com_driver, pios_usb_cdc_id, + rx_buffer, PIOS_COM_BRIDGE_RX_BUF_LEN, + tx_buffer, PIOS_COM_BRIDGE_TX_BUF_LEN)) { + PIOS_Assert(0); + } + + } +#endif /* PIOS_INCLUDE_COM */ + break; + } +#endif /* PIOS_INCLUDE_USB_CDC */ + +#if defined(PIOS_INCLUDE_USB_HID) + /* Configure the usb HID port */ + uint8_t hwsettings_usb_hidport; + HwSettingsUSB_HIDPortGet(&hwsettings_usb_hidport); + + if (!usb_hid_present) { + /* Force HID port function to disabled if we haven't advertised HID in our USB descriptor */ + hwsettings_usb_hidport = HWSETTINGS_USB_HIDPORT_DISABLED; + } + + switch (hwsettings_usb_hidport) { + case HWSETTINGS_USB_HIDPORT_DISABLED: + break; + case HWSETTINGS_USB_HIDPORT_USBTELEMETRY: +#if defined(PIOS_INCLUDE_COM) + { + uint32_t pios_usb_hid_id; + if (PIOS_USB_HID_Init(&pios_usb_hid_id, &pios_usb_hid_cfg, pios_usb_id)) { + PIOS_Assert(0); + } + uint8_t * rx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_TELEM_USB_RX_BUF_LEN); + uint8_t * tx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_TELEM_USB_TX_BUF_LEN); + PIOS_Assert(rx_buffer); + PIOS_Assert(tx_buffer); + if (PIOS_COM_Init(&pios_com_telem_usb_id, &pios_usb_hid_com_driver, pios_usb_hid_id, + rx_buffer, PIOS_COM_TELEM_USB_RX_BUF_LEN, + tx_buffer, PIOS_COM_TELEM_USB_TX_BUF_LEN)) { + PIOS_Assert(0); + } + } +#endif /* PIOS_INCLUDE_COM */ + break; + } + +#endif /* PIOS_INCLUDE_USB_HID */ + +#endif /* PIOS_INCLUDE_USB */ + /* Configure the main IO port */ uint8_t hwsettings_op_mainport; HwSettingsOP_MainPortGet(&hwsettings_op_mainport); @@ -1285,36 +1445,11 @@ void PIOS_Board_Init(void) { break; } -#if defined(PIOS_INCLUDE_USB) - uint32_t pios_usb_id; - if (PIOS_USB_Init(&pios_usb_id, &pios_usb_main_cfg)) { - PIOS_Assert(0); - } -#if defined(PIOS_INCLUDE_USB_HID) && defined(PIOS_INCLUDE_COM) - uint32_t pios_usb_hid_id; - if (PIOS_USB_HID_Init(&pios_usb_hid_id, &pios_usb_hid_cfg, pios_usb_id)) { - PIOS_Assert(0); - } - uint8_t * rx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_TELEM_USB_RX_BUF_LEN); - uint8_t * tx_buffer = (uint8_t *) pvPortMalloc(PIOS_COM_TELEM_USB_TX_BUF_LEN); - PIOS_Assert(rx_buffer); - PIOS_Assert(tx_buffer); - if (PIOS_COM_Init(&pios_com_telem_usb_id, &pios_usb_hid_com_driver, pios_usb_hid_id, - rx_buffer, PIOS_COM_TELEM_USB_RX_BUF_LEN, - tx_buffer, PIOS_COM_TELEM_USB_TX_BUF_LEN)) { - PIOS_Assert(0); - } -#endif /* PIOS_INCLUDE_USB_HID && PIOS_INCLUDE_COM */ - -#endif /* PIOS_INCLUDE_USB */ - #if defined(PIOS_INCLUDE_I2C) if (PIOS_I2C_Init(&pios_i2c_main_adapter_id, &pios_i2c_main_adapter_cfg)) { PIOS_Assert(0); } #endif /* PIOS_INCLUDE_I2C */ - PIOS_IAP_Init(); - PIOS_WDG_Init(); } /** diff --git a/flight/OpenPilot/System/pios_usb_board_data.c b/flight/OpenPilot/System/pios_usb_board_data.c index 9492d316e..a6fa67abe 100644 --- a/flight/OpenPilot/System/pios_usb_board_data.c +++ b/flight/OpenPilot/System/pios_usb_board_data.c @@ -29,9 +29,11 @@ */ #include "pios_usb_board_data.h" /* struct usb_*, USB_* */ +#include "pios_sys.h" /* PIOS_SYS_SerialNumberGet */ +#include "pios_usbhook.h" /* PIOS_USBHOOK_* */ -const uint8_t PIOS_USB_BOARD_StringProductID[] = { - sizeof(PIOS_USB_BOARD_StringProductID), +static const uint8_t usb_product_id[20] = { + sizeof(usb_product_id), USB_DESC_TYPE_STRING, 'O', 0, 'p', 0, @@ -43,3 +45,76 @@ const uint8_t PIOS_USB_BOARD_StringProductID[] = { 'o', 0, 't', 0, }; + +static uint8_t usb_serial_number[52] = { + sizeof(usb_serial_number), + USB_DESC_TYPE_STRING, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0 +}; + +static const struct usb_string_langid usb_lang_id = { + .bLength = sizeof(usb_lang_id), + .bDescriptorType = USB_DESC_TYPE_STRING, + .bLangID = htousbs(USB_LANGID_ENGLISH_UK), +}; + +static const uint8_t usb_vendor_id[28] = { + sizeof(usb_vendor_id), + USB_DESC_TYPE_STRING, + 'o', 0, + 'p', 0, + 'e', 0, + 'n', 0, + 'p', 0, + 'i', 0, + 'l', 0, + 'o', 0, + 't', 0, + '.', 0, + 'o', 0, + 'r', 0, + 'g', 0 +}; + +int32_t PIOS_USB_BOARD_DATA_Init(void) +{ + /* Load device serial number into serial number string */ + uint8_t sn[25]; + PIOS_SYS_SerialNumberGet((char *)sn); + for (uint8_t i = 0; sn[i] != '\0' && (2 * i) < usb_serial_number[0]; i++) { + usb_serial_number[2 + 2 * i] = sn[i]; + } + + PIOS_USBHOOK_RegisterString(USB_STRING_DESC_PRODUCT, (uint8_t *)&usb_product_id, sizeof(usb_product_id)); + PIOS_USBHOOK_RegisterString(USB_STRING_DESC_SERIAL, (uint8_t *)&usb_serial_number, sizeof(usb_serial_number)); + + PIOS_USBHOOK_RegisterString(USB_STRING_DESC_LANG, (uint8_t *)&usb_lang_id, sizeof(usb_lang_id)); + PIOS_USBHOOK_RegisterString(USB_STRING_DESC_VENDOR, (uint8_t *)&usb_vendor_id, sizeof(usb_vendor_id)); + + return 0; +} + diff --git a/flight/PiOS/Common/pios_usb_desc_hid_cdc.c b/flight/PiOS/Common/pios_usb_desc_hid_cdc.c index 3d5748163..cd4e8a1da 100644 --- a/flight/PiOS/Common/pios_usb_desc_hid_cdc.c +++ b/flight/PiOS/Common/pios_usb_desc_hid_cdc.c @@ -28,9 +28,12 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#include "pios_usb_board_data.h" /* struct usb_*, USB_* */ +#include "pios_usb_desc_hid_cdc_priv.h" /* exported API */ +#include "pios_usb_defs.h" /* struct usb_*, USB_* */ +#include "pios_usb_board_data.h" /* PIOS_USB_BOARD_* */ +#include "pios_usbhook.h" /* PIOS_USBHOOK_Register* */ -const struct usb_device_desc PIOS_USB_BOARD_DeviceDescriptor = { +static const struct usb_device_desc device_desc = { .bLength = sizeof(struct usb_device_desc), .bDescriptorType = USB_DESC_TYPE_DEVICE, .bcdUSB = htousbs(0x0200), @@ -41,17 +44,79 @@ const struct usb_device_desc PIOS_USB_BOARD_DeviceDescriptor = { .idVendor = htousbs(USB_VENDOR_ID_OPENPILOT), .idProduct = htousbs(PIOS_USB_BOARD_PRODUCT_ID), .bcdDevice = htousbs(PIOS_USB_BOARD_DEVICE_VER), - .iManufacturer = 1, - .iProduct = 2, - .iSerialNumber = 3, + .iManufacturer = USB_STRING_DESC_VENDOR, + .iProduct = USB_STRING_DESC_PRODUCT, + .iSerialNumber = USB_STRING_DESC_SERIAL, .bNumConfigurations = 1, }; -const struct usb_board_config PIOS_USB_BOARD_Configuration = { +static const uint8_t hid_report_desc[36] = { + HID_GLOBAL_ITEM_2 (HID_TAG_GLOBAL_USAGE_PAGE), + 0x9C, 0xFF, /* Usage Page 0xFF9C (Vendor Defined) */ + HID_LOCAL_ITEM_1 (HID_TAG_LOCAL_USAGE), + 0x01, /* Usage ID 0x0001 (0x01-0x1F uaually for top-level collections) */ + + HID_MAIN_ITEM_1 (HID_TAG_MAIN_COLLECTION), + 0x01, /* Application */ + + /* Device -> Host emulated serial channel */ + HID_GLOBAL_ITEM_1 (HID_TAG_GLOBAL_REPORT_ID), + 0x01, /* OpenPilot emulated serial channel (Device -> Host) */ + HID_LOCAL_ITEM_1 (HID_TAG_LOCAL_USAGE), + 0x02, + HID_GLOBAL_ITEM_1 (HID_TAG_GLOBAL_LOGICAL_MIN), + 0x00, /* Values range from min = 0x00 */ + HID_GLOBAL_ITEM_1 (HID_TAG_GLOBAL_LOGICAL_MAX), + 0xFF, /* Values range to max = 0xFF */ + HID_GLOBAL_ITEM_1 (HID_TAG_GLOBAL_REPORT_SIZE), + 0x08, /* 8 bits wide */ + HID_GLOBAL_ITEM_1 (HID_TAG_GLOBAL_REPORT_CNT), + PIOS_USB_BOARD_HID_DATA_LENGTH-1, /* Need to leave room for a report ID */ + HID_MAIN_ITEM_1 (HID_TAG_MAIN_INPUT), + 0x03, /* Variable, Constant (read-only) */ + + /* Host -> Host emulated serial channel */ + HID_GLOBAL_ITEM_1 (HID_TAG_GLOBAL_REPORT_ID), + 0x02, /* OpenPilot emulated Serial Channel (Host -> Device) */ + HID_LOCAL_ITEM_1 (HID_TAG_LOCAL_USAGE), + 0x02, + HID_GLOBAL_ITEM_1 (HID_TAG_GLOBAL_LOGICAL_MIN), + 0x00, /* Values range from min = 0x00 */ + HID_GLOBAL_ITEM_1 (HID_TAG_GLOBAL_LOGICAL_MAX), + 0xFF, /* Values range to max = 0xFF */ + HID_GLOBAL_ITEM_1 (HID_TAG_GLOBAL_REPORT_SIZE), + 0x08, /* 8 bits wide */ + HID_GLOBAL_ITEM_1 (HID_TAG_GLOBAL_REPORT_CNT), + PIOS_USB_BOARD_HID_DATA_LENGTH-1, /* Need to leave room for a report ID */ + HID_MAIN_ITEM_1 (HID_TAG_MAIN_OUTPUT), + 0x82, /* Volatile, Variable */ + + HID_MAIN_ITEM_0 (HID_TAG_MAIN_ENDCOLLECTION), +}; + +struct usb_config_hid_cdc { + struct usb_configuration_desc config; + struct usb_interface_association_desc iad; + struct usb_interface_desc hid_if; + struct usb_hid_desc hid; + struct usb_endpoint_desc hid_in; + struct usb_endpoint_desc hid_out; + struct usb_interface_desc cdc_control_if; + struct usb_cdc_header_func_desc cdc_header; + struct usb_cdc_callmgmt_func_desc cdc_callmgmt; + struct usb_cdc_acm_func_desc cdc_acm; + struct usb_cdc_union_func_desc cdc_union; + struct usb_endpoint_desc cdc_mgmt_in; + struct usb_interface_desc cdc_data_if; + struct usb_endpoint_desc cdc_in; + struct usb_endpoint_desc cdc_out; +} __attribute__((packed)); + +static const struct usb_config_hid_cdc config_hid_cdc = { .config = { .bLength = sizeof(struct usb_configuration_desc), .bDescriptorType = USB_DESC_TYPE_CONFIGURATION, - .wTotalLength = htousbs(sizeof(struct usb_board_config)), + .wTotalLength = htousbs(sizeof(struct usb_config_hid_cdc)), .bNumInterfaces = 3, .bConfigurationValue = 1, .iConfiguration = 0, @@ -86,7 +151,7 @@ const struct usb_board_config PIOS_USB_BOARD_Configuration = { .bCountryCode = 0, .bNumDescriptors = 1, .bClassDescriptorType = USB_DESC_TYPE_REPORT, - .wItemLength = htousbs(sizeof(PIOS_USB_BOARD_HidReportDescriptor)), + .wItemLength = htousbs(sizeof(hid_report_desc)), }, .hid_in = { .bLength = sizeof(struct usb_endpoint_desc), @@ -178,100 +243,14 @@ const struct usb_board_config PIOS_USB_BOARD_Configuration = { }, }; -const uint8_t PIOS_USB_BOARD_HidReportDescriptor[] = { - HID_GLOBAL_ITEM_2 (HID_TAG_GLOBAL_USAGE_PAGE), - 0x9C, 0xFF, /* Usage Page 0xFF9C (Vendor Defined) */ - HID_LOCAL_ITEM_1 (HID_TAG_LOCAL_USAGE), - 0x01, /* Usage ID 0x0001 (0x01-0x1F uaually for top-level collections) */ +int32_t PIOS_USB_DESC_HID_CDC_Init(void) +{ + PIOS_USBHOOK_RegisterConfig(1, (uint8_t *)&config_hid_cdc, sizeof(config_hid_cdc)); - HID_MAIN_ITEM_1 (HID_TAG_MAIN_COLLECTION), - 0x01, /* Application */ + PIOS_USBHOOK_RegisterDevice((uint8_t *)&device_desc, sizeof(device_desc)); - /* Device -> Host emulated serial channel */ - HID_GLOBAL_ITEM_1 (HID_TAG_GLOBAL_REPORT_ID), - 0x01, /* OpenPilot emulated serial channel (Device -> Host) */ - HID_LOCAL_ITEM_1 (HID_TAG_LOCAL_USAGE), - 0x02, - HID_GLOBAL_ITEM_1 (HID_TAG_GLOBAL_LOGICAL_MIN), - 0x00, /* Values range from min = 0x00 */ - HID_GLOBAL_ITEM_1 (HID_TAG_GLOBAL_LOGICAL_MAX), - 0xFF, /* Values range to max = 0xFF */ - HID_GLOBAL_ITEM_1 (HID_TAG_GLOBAL_REPORT_SIZE), - 0x08, /* 8 bits wide */ - HID_GLOBAL_ITEM_1 (HID_TAG_GLOBAL_REPORT_CNT), - PIOS_USB_BOARD_HID_DATA_LENGTH-1, /* Need to leave room for a report ID */ - HID_MAIN_ITEM_1 (HID_TAG_MAIN_INPUT), - 0x03, /* Variable, Constant (read-only) */ + PIOS_USBHOOK_RegisterHidInterface((uint8_t *)&(config_hid_cdc.hid_if), sizeof(config_hid_cdc.hid_if)); + PIOS_USBHOOK_RegisterHidReport((uint8_t *)hid_report_desc, sizeof(hid_report_desc)); - /* Host -> Host emulated serial channel */ - HID_GLOBAL_ITEM_1 (HID_TAG_GLOBAL_REPORT_ID), - 0x02, /* OpenPilot emulated Serial Channel (Host -> Device) */ - HID_LOCAL_ITEM_1 (HID_TAG_LOCAL_USAGE), - 0x02, - HID_GLOBAL_ITEM_1 (HID_TAG_GLOBAL_LOGICAL_MIN), - 0x00, /* Values range from min = 0x00 */ - HID_GLOBAL_ITEM_1 (HID_TAG_GLOBAL_LOGICAL_MAX), - 0xFF, /* Values range to max = 0xFF */ - HID_GLOBAL_ITEM_1 (HID_TAG_GLOBAL_REPORT_SIZE), - 0x08, /* 8 bits wide */ - HID_GLOBAL_ITEM_1 (HID_TAG_GLOBAL_REPORT_CNT), - PIOS_USB_BOARD_HID_DATA_LENGTH-1, /* Need to leave room for a report ID */ - HID_MAIN_ITEM_1 (HID_TAG_MAIN_OUTPUT), - 0x82, /* Volatile, Variable */ - - HID_MAIN_ITEM_0 (HID_TAG_MAIN_ENDCOLLECTION), -}; - -const struct usb_string_langid PIOS_USB_BOARD_StringLangID = { - .bLength = sizeof(PIOS_USB_BOARD_StringLangID), - .bDescriptorType = USB_DESC_TYPE_STRING, - .bLangID = htousbs(USB_LANGID_ENGLISH_UK), -}; - -const uint8_t PIOS_USB_BOARD_StringVendorID[] = { - sizeof(PIOS_USB_BOARD_StringVendorID), - USB_DESC_TYPE_STRING, - 'o', 0, - 'p', 0, - 'e', 0, - 'n', 0, - 'p', 0, - 'i', 0, - 'l', 0, - 'o', 0, - 't', 0, - '.', 0, - 'o', 0, - 'r', 0, - 'g', 0 -}; - -uint8_t PIOS_USB_BOARD_StringSerial[] = { - sizeof(PIOS_USB_BOARD_StringSerial), - USB_DESC_TYPE_STRING, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0 -}; + return 0; +} diff --git a/flight/PiOS/Common/pios_usb_desc_hid_only.c b/flight/PiOS/Common/pios_usb_desc_hid_only.c index 913c18b16..168efe841 100644 --- a/flight/PiOS/Common/pios_usb_desc_hid_only.c +++ b/flight/PiOS/Common/pios_usb_desc_hid_only.c @@ -28,9 +28,12 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#include "pios_usb_board_data.h" /* struct usb_*, USB_* */ +#include "pios_usb_desc_hid_only_priv.h" /* exported API */ +#include "pios_usb_defs.h" /* struct usb_*, USB_* */ +#include "pios_usb_board_data.h" /* PIOS_USB_BOARD_* */ +#include "pios_usbhook.h" /* PIOS_USBHOOK_Register* */ -const struct usb_device_desc PIOS_USB_BOARD_DeviceDescriptor = { +static const struct usb_device_desc device_desc = { .bLength = sizeof(struct usb_device_desc), .bDescriptorType = USB_DESC_TYPE_DEVICE, .bcdUSB = htousbs(0x0200), @@ -47,56 +50,7 @@ const struct usb_device_desc PIOS_USB_BOARD_DeviceDescriptor = { .bNumConfigurations = 1, }; -const struct usb_board_config PIOS_USB_BOARD_Configuration = { - .config = { - .bLength = sizeof(struct usb_configuration_desc), - .bDescriptorType = USB_DESC_TYPE_CONFIGURATION, - .wTotalLength = htousbs(sizeof(struct usb_board_config)), - .bNumInterfaces = 1, - .bConfigurationValue = 1, - .iConfiguration = 0, - .bmAttributes = 0xC0, - .bMaxPower = 250/2, /* in units of 2ma */ - }, - .hid_if = { - .bLength = sizeof(struct usb_interface_desc), - .bDescriptorType = USB_DESC_TYPE_INTERFACE, - .bInterfaceNumber = 0, - .bAlternateSetting = 0, - .bNumEndpoints = 2, - .bInterfaceClass = USB_INTERFACE_CLASS_HID, - .bInterfaceSubClass = 0, /* no boot */ - .nInterfaceProtocol = 0, /* none */ - .iInterface = 0, - }, - .hid = { - .bLength = sizeof(struct usb_hid_desc), - .bDescriptorType = USB_DESC_TYPE_HID, - .bcdHID = htousbs(0x0110), - .bCountryCode = 0, - .bNumDescriptors = 1, - .bClassDescriptorType = USB_DESC_TYPE_REPORT, - .wItemLength = htousbs(sizeof(PIOS_USB_BOARD_HidReportDescriptor)), - }, - .hid_in = { - .bLength = sizeof(struct usb_endpoint_desc), - .bDescriptorType = USB_DESC_TYPE_ENDPOINT, - .bEndpointAddress = USB_EP_IN(1), - .bmAttributes = USB_EP_ATTR_TT_INTERRUPT, - .wMaxPacketSize = htousbs(PIOS_USB_BOARD_HID_DATA_LENGTH), - .bInterval = 4, /* ms */ - }, - .hid_out = { - .bLength = sizeof(struct usb_endpoint_desc), - .bDescriptorType = USB_DESC_TYPE_ENDPOINT, - .bEndpointAddress = USB_EP_OUT(1), - .bmAttributes = USB_EP_ATTR_TT_INTERRUPT, - .wMaxPacketSize = htousbs(PIOS_USB_BOARD_HID_DATA_LENGTH), - .bInterval = 4, /* ms */ - }, -}; - -const uint8_t PIOS_USB_BOARD_HidReportDescriptor[] = { +static const uint8_t hid_report_desc[36] = { HID_GLOBAL_ITEM_2 (HID_TAG_GLOBAL_USAGE_PAGE), 0x9C, 0xFF, /* Usage Page 0xFF9C (Vendor Defined) */ HID_LOCAL_ITEM_1 (HID_TAG_LOCAL_USAGE), @@ -140,56 +94,71 @@ const uint8_t PIOS_USB_BOARD_HidReportDescriptor[] = { HID_MAIN_ITEM_0 (HID_TAG_MAIN_ENDCOLLECTION), }; -const struct usb_string_langid PIOS_USB_BOARD_StringLangID = { - .bLength = sizeof(PIOS_USB_BOARD_StringLangID), - .bDescriptorType = USB_DESC_TYPE_STRING, - .bLangID = htousbs(USB_LANGID_ENGLISH_UK), +struct usb_config_hid_only { + struct usb_configuration_desc config; + struct usb_interface_desc hid_if; + struct usb_hid_desc hid; + struct usb_endpoint_desc hid_in; + struct usb_endpoint_desc hid_out; +} __attribute__((packed)); + +const struct usb_config_hid_only config_hid_only = { + .config = { + .bLength = sizeof(struct usb_configuration_desc), + .bDescriptorType = USB_DESC_TYPE_CONFIGURATION, + .wTotalLength = htousbs(sizeof(struct usb_config_hid_only)), + .bNumInterfaces = 1, + .bConfigurationValue = 1, + .iConfiguration = 0, + .bmAttributes = 0xC0, + .bMaxPower = 250/2, /* in units of 2ma */ + }, + .hid_if = { + .bLength = sizeof(struct usb_interface_desc), + .bDescriptorType = USB_DESC_TYPE_INTERFACE, + .bInterfaceNumber = 0, + .bAlternateSetting = 0, + .bNumEndpoints = 2, + .bInterfaceClass = USB_INTERFACE_CLASS_HID, + .bInterfaceSubClass = 0, /* no boot */ + .nInterfaceProtocol = 0, /* none */ + .iInterface = 0, + }, + .hid = { + .bLength = sizeof(struct usb_hid_desc), + .bDescriptorType = USB_DESC_TYPE_HID, + .bcdHID = htousbs(0x0110), + .bCountryCode = 0, + .bNumDescriptors = 1, + .bClassDescriptorType = USB_DESC_TYPE_REPORT, + .wItemLength = htousbs(sizeof(hid_report_desc)), + }, + .hid_in = { + .bLength = sizeof(struct usb_endpoint_desc), + .bDescriptorType = USB_DESC_TYPE_ENDPOINT, + .bEndpointAddress = USB_EP_IN(1), + .bmAttributes = USB_EP_ATTR_TT_INTERRUPT, + .wMaxPacketSize = htousbs(PIOS_USB_BOARD_HID_DATA_LENGTH), + .bInterval = 4, /* ms */ + }, + .hid_out = { + .bLength = sizeof(struct usb_endpoint_desc), + .bDescriptorType = USB_DESC_TYPE_ENDPOINT, + .bEndpointAddress = USB_EP_OUT(1), + .bmAttributes = USB_EP_ATTR_TT_INTERRUPT, + .wMaxPacketSize = htousbs(PIOS_USB_BOARD_HID_DATA_LENGTH), + .bInterval = 4, /* ms */ + }, }; -const uint8_t PIOS_USB_BOARD_StringVendorID[] = { - sizeof(PIOS_USB_BOARD_StringVendorID), - USB_DESC_TYPE_STRING, - 'o', 0, - 'p', 0, - 'e', 0, - 'n', 0, - 'p', 0, - 'i', 0, - 'l', 0, - 'o', 0, - 't', 0, - '.', 0, - 'o', 0, - 'r', 0, - 'g', 0 -}; +int32_t PIOS_USB_DESC_HID_ONLY_Init(void) +{ + PIOS_USBHOOK_RegisterConfig(1, (uint8_t *)&config_hid_only, sizeof(config_hid_only)); -uint8_t PIOS_USB_BOARD_StringSerial[] = { - sizeof(PIOS_USB_BOARD_StringSerial), - USB_DESC_TYPE_STRING, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0 -}; + PIOS_USBHOOK_RegisterDevice((uint8_t *)&device_desc, sizeof(device_desc)); + + PIOS_USBHOOK_RegisterHidInterface((uint8_t *)&(config_hid_only.hid_if), sizeof(config_hid_only.hid_if)); + PIOS_USBHOOK_RegisterHidReport((uint8_t *)hid_report_desc, sizeof(hid_report_desc)); + + return 0; +} diff --git a/flight/PiOS/STM32F10x/Libraries/STM32_USB-FS-Device_Driver/inc/usb_core.h b/flight/PiOS/STM32F10x/Libraries/STM32_USB-FS-Device_Driver/inc/usb_core.h index 84f975da6..7e606e44b 100644 --- a/flight/PiOS/STM32F10x/Libraries/STM32_USB-FS-Device_Driver/inc/usb_core.h +++ b/flight/PiOS/STM32F10x/Libraries/STM32_USB-FS-Device_Driver/inc/usb_core.h @@ -35,7 +35,7 @@ typedef enum _CONTROL_STATE typedef struct OneDescriptor { - uint8_t *Descriptor; + const uint8_t *Descriptor; uint16_t Descriptor_Size; } ONE_DESCRIPTOR, *PONE_DESCRIPTOR; @@ -80,7 +80,8 @@ typedef struct _ENDPOINT_INFO uint16_t Usb_wLength; uint16_t Usb_wOffset; uint16_t PacketSize; - uint8_t *(*CopyData)(uint16_t Length); + const uint8_t *(*CopyDataIn)(uint16_t Length); + uint8_t *(*CopyDataOut)(uint16_t Length); }ENDPOINT_INFO; /*-*-*-*-*-*-*-*-*-*-*-* Definitions for device level -*-*-*-*-*-*-*-*-*-*-*-*/ @@ -169,9 +170,9 @@ typedef struct _DEVICE_PROP RESULT (*Class_Get_Interface_Setting)(uint8_t Interface, uint8_t AlternateSetting); - uint8_t* (*GetDeviceDescriptor)(uint16_t Length); - uint8_t* (*GetConfigDescriptor)(uint16_t Length); - uint8_t* (*GetStringDescriptor)(uint16_t Length); + const uint8_t* (*GetDeviceDescriptor)(uint16_t Length); + const uint8_t* (*GetConfigDescriptor)(uint16_t Length); + const uint8_t* (*GetStringDescriptor)(uint16_t Length); /* This field is not used in current library version. It is kept only for compatibility with previous versions */ @@ -221,13 +222,13 @@ uint8_t In0_Process(void); RESULT Standard_SetEndPointFeature(void); RESULT Standard_SetDeviceFeature(void); -uint8_t *Standard_GetConfiguration(uint16_t Length); +const uint8_t *Standard_GetConfiguration(uint16_t Length); RESULT Standard_SetConfiguration(void); -uint8_t *Standard_GetInterface(uint16_t Length); +const uint8_t *Standard_GetInterface(uint16_t Length); RESULT Standard_SetInterface(void); -uint8_t *Standard_GetDescriptorData(uint16_t Length, const ONE_DESCRIPTOR * pDesc); +const uint8_t *Standard_GetDescriptorData(uint16_t Length, ONE_DESCRIPTOR *pDesc); -uint8_t *Standard_GetStatus(uint16_t Length); +const uint8_t *Standard_GetStatus(uint16_t Length); RESULT Standard_ClearFeature(void); void SetDeviceAddress(uint8_t); void NOP_Process(void); diff --git a/flight/PiOS/STM32F10x/Libraries/STM32_USB-FS-Device_Driver/inc/usb_mem.h b/flight/PiOS/STM32F10x/Libraries/STM32_USB-FS-Device_Driver/inc/usb_mem.h index 4d43fbe8c..f7f0ace12 100644 --- a/flight/PiOS/STM32F10x/Libraries/STM32_USB-FS-Device_Driver/inc/usb_mem.h +++ b/flight/PiOS/STM32F10x/Libraries/STM32_USB-FS-Device_Driver/inc/usb_mem.h @@ -22,7 +22,7 @@ /* Exported constants --------------------------------------------------------*/ /* Exported macro ------------------------------------------------------------*/ /* Exported functions ------------------------------------------------------- */ -void UserToPMABufferCopy(uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes); +void UserToPMABufferCopy(const uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes); void PMAToUserBufferCopy(uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes); /* External variables --------------------------------------------------------*/ diff --git a/flight/PiOS/STM32F10x/Libraries/STM32_USB-FS-Device_Driver/src/usb_core.c b/flight/PiOS/STM32F10x/Libraries/STM32_USB-FS-Device_Driver/src/usb_core.c index fb5ca3e40..75ddaa42e 100644 --- a/flight/PiOS/STM32F10x/Libraries/STM32_USB-FS-Device_Driver/src/usb_core.c +++ b/flight/PiOS/STM32F10x/Libraries/STM32_USB-FS-Device_Driver/src/usb_core.c @@ -58,7 +58,7 @@ static void Data_Setup0(void); * Return : Return 1 , if the request is invalid when "Length" is 0. * Return "Buffer" if the "Length" is not 0. *******************************************************************************/ -uint8_t *Standard_GetConfiguration(uint16_t Length) +const uint8_t *Standard_GetConfiguration(uint16_t Length) { if (Length == 0) { @@ -104,7 +104,7 @@ RESULT Standard_SetConfiguration(void) * Return : Return 0, if the request is invalid when "Length" is 0. * Return "Buffer" if the "Length" is not 0. *******************************************************************************/ -uint8_t *Standard_GetInterface(uint16_t Length) +const uint8_t *Standard_GetInterface(uint16_t Length) { if (Length == 0) { @@ -160,7 +160,7 @@ RESULT Standard_SetInterface(void) * Return : Return 0, if the request is at end of data block, * or is invalid when "Length" is 0. *******************************************************************************/ -uint8_t *Standard_GetStatus(uint16_t Length) +const uint8_t *Standard_GetStatus(uint16_t Length) { if (Length == 0) { @@ -415,7 +415,7 @@ RESULT Standard_SetDeviceFeature(void) * wOffset The buffer pointed by this address contains at least * Length bytes. *******************************************************************************/ -uint8_t *Standard_GetDescriptorData(uint16_t Length, const ONE_DESCRIPTOR * pDesc) +const uint8_t *Standard_GetDescriptorData(uint16_t Length, PONE_DESCRIPTOR pDesc) { uint32_t wOffset; @@ -443,7 +443,7 @@ void DataStageOut(void) save_rLength = pEPinfo->Usb_rLength; - if (pEPinfo->CopyData && save_rLength) + if (pEPinfo->CopyDataOut && save_rLength) { uint8_t *Buffer; uint32_t Length; @@ -454,7 +454,7 @@ void DataStageOut(void) Length = save_rLength; } - Buffer = (*pEPinfo->CopyData)(Length); + Buffer = (*pEPinfo->CopyDataOut)(Length); pEPinfo->Usb_rLength -= Length; pEPinfo->Usb_rOffset += Length; @@ -503,7 +503,7 @@ void DataStageIn(void) uint32_t save_wLength = pEPinfo->Usb_wLength; uint32_t ControlState = pInformation->ControlState; - uint8_t *DataBuffer; + const uint8_t *DataBuffer; uint32_t Length; if ((save_wLength == 0) && (ControlState == LAST_IN_DATA)) @@ -540,7 +540,7 @@ void DataStageIn(void) Length = save_wLength; } - DataBuffer = (*pEPinfo->CopyData)(Length); + DataBuffer = (*pEPinfo->CopyDataIn)(Length); #ifdef STM32F10X_CL PCD_EP_Write (ENDP0, DataBuffer, Length); @@ -697,7 +697,7 @@ exit_NoData_Setup0: *******************************************************************************/ void Data_Setup0(void) { - uint8_t *(*CopyRoutine)(uint16_t); + const uint8_t *(*CopyRoutine)(uint16_t); RESULT Result; uint32_t Request_No = pInformation->USBbRequest; @@ -802,7 +802,7 @@ void Data_Setup0(void) if (CopyRoutine) { pInformation->Ctrl_Info.Usb_wOffset = wOffset; - pInformation->Ctrl_Info.CopyData = CopyRoutine; + pInformation->Ctrl_Info.CopyDataIn = CopyRoutine; /* sb in the original the cast to word was directly */ /* now the cast is made step by step */ (*CopyRoutine)(0); diff --git a/flight/PiOS/STM32F10x/Libraries/STM32_USB-FS-Device_Driver/src/usb_mem.c b/flight/PiOS/STM32F10x/Libraries/STM32_USB-FS-Device_Driver/src/usb_mem.c index e729b844c..ca50a23c4 100644 --- a/flight/PiOS/STM32F10x/Libraries/STM32_USB-FS-Device_Driver/src/usb_mem.c +++ b/flight/PiOS/STM32F10x/Libraries/STM32_USB-FS-Device_Driver/src/usb_mem.c @@ -33,7 +33,7 @@ * Output : None. * Return : None . *******************************************************************************/ -void UserToPMABufferCopy(uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes) +void UserToPMABufferCopy(const uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes) { uint32_t n = (wNBytes + 1) >> 1; /* n = (wNBytes + 1) / 2 */ uint32_t i, temp1, temp2; diff --git a/flight/PiOS/STM32F10x/pios_usb.c b/flight/PiOS/STM32F10x/pios_usb.c index df17777c7..15decfca1 100644 --- a/flight/PiOS/STM32F10x/pios_usb.c +++ b/flight/PiOS/STM32F10x/pios_usb.c @@ -123,13 +123,6 @@ int32_t PIOS_USB_Init(uint32_t * usb_id, const struct pios_usb_cfg * cfg) /* Enable the USB clock */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_USB, ENABLE); - /* Update the USB serial number from the chip */ - uint8_t sn[25]; - PIOS_SYS_SerialNumberGet((char *)sn); - for (uint8_t i = 0; sn[i] != '\0' && (2 * i) < PIOS_USB_BOARD_StringSerial[0]; i++) { - PIOS_USB_BOARD_StringSerial[2 + 2 * i] = sn[i]; - } - USB_Init(); USB_SIL_Init(); diff --git a/flight/PiOS/STM32F10x/pios_usb_cdc.c b/flight/PiOS/STM32F10x/pios_usb_cdc.c index 994c276ea..4bb1303d9 100644 --- a/flight/PiOS/STM32F10x/pios_usb_cdc.c +++ b/flight/PiOS/STM32F10x/pios_usb_cdc.c @@ -346,7 +346,7 @@ RESULT PIOS_USB_CDC_SetLineCoding(void) return USB_SUCCESS; } -uint8_t *PIOS_USB_CDC_GetLineCoding(uint16_t Length) +const uint8_t *PIOS_USB_CDC_GetLineCoding(uint16_t Length) { struct pios_usb_cdc_dev * usb_cdc_dev = (struct pios_usb_cdc_dev *)pios_usb_cdc_id; diff --git a/flight/PiOS/STM32F10x/pios_usbhook.c b/flight/PiOS/STM32F10x/pios_usbhook.c index ade1f8ac1..7800faed1 100644 --- a/flight/PiOS/STM32F10x/pios_usbhook.c +++ b/flight/PiOS/STM32F10x/pios_usbhook.c @@ -36,6 +36,48 @@ #include "pios_usb_cdc_priv.h" /* PIOS_USB_CDC_* */ #include "pios_usb_board_data.h" /* PIOS_USB_BOARD_* */ +static ONE_DESCRIPTOR Device_Descriptor; + +void PIOS_USBHOOK_RegisterDevice(const uint8_t * desc, uint16_t desc_size) +{ + Device_Descriptor.Descriptor = desc; + Device_Descriptor.Descriptor_Size = desc_size; +} + +static ONE_DESCRIPTOR Config_Descriptor; + +void PIOS_USBHOOK_RegisterConfig(uint8_t config_id, const uint8_t * desc, uint16_t desc_size) +{ + Config_Descriptor.Descriptor = desc; + Config_Descriptor.Descriptor_Size = desc_size; +} + +static ONE_DESCRIPTOR String_Descriptor[4]; + +void PIOS_USBHOOK_RegisterString(enum usb_string_desc string_id, const uint8_t * desc, uint16_t desc_size) +{ + if (string_id < NELEMENTS(String_Descriptor)) { + String_Descriptor[string_id].Descriptor = desc; + String_Descriptor[string_id].Descriptor_Size = desc_size; + } +} + +static ONE_DESCRIPTOR Hid_Interface_Descriptor; + +void PIOS_USBHOOK_RegisterHidInterface(const uint8_t * desc, uint16_t desc_size) +{ + Hid_Interface_Descriptor.Descriptor = desc; + Hid_Interface_Descriptor.Descriptor_Size = desc_size; +} + +static ONE_DESCRIPTOR Hid_Report_Descriptor; + +void PIOS_USBHOOK_RegisterHidReport(const uint8_t * desc, uint16_t desc_size) +{ + Hid_Report_Descriptor.Descriptor = desc; + Hid_Report_Descriptor.Descriptor_Size = desc_size; +} + #include "stm32f10x.h" /* __IO */ __IO uint8_t EXTI_Enable; @@ -53,9 +95,9 @@ static void PIOS_USBHOOK_Status_Out(void); static RESULT PIOS_USBHOOK_Data_Setup(uint8_t RequestNo); static RESULT PIOS_USBHOOK_NoData_Setup(uint8_t RequestNo); static RESULT PIOS_USBHOOK_Get_Interface_Setting(uint8_t Interface, uint8_t AlternateSetting); -static uint8_t *PIOS_USBHOOK_GetDeviceDescriptor(uint16_t Length); -static uint8_t *PIOS_USBHOOK_GetConfigDescriptor(uint16_t Length); -static uint8_t *PIOS_USBHOOK_GetStringDescriptor(uint16_t Length); +static const uint8_t *PIOS_USBHOOK_GetDeviceDescriptor(uint16_t Length); +static const uint8_t *PIOS_USBHOOK_GetConfigDescriptor(uint16_t Length); +static const uint8_t *PIOS_USBHOOK_GetStringDescriptor(uint16_t Length); DEVICE_PROP Device_Property = { .Init = PIOS_USBHOOK_Init, @@ -87,49 +129,10 @@ USER_STANDARD_REQUESTS User_Standard_Requests = { .User_SetDeviceAddress = PIOS_USBHOOK_SetDeviceAddress }; -const static ONE_DESCRIPTOR Device_Descriptor = { - (uint8_t *) &PIOS_USB_BOARD_DeviceDescriptor, - sizeof(PIOS_USB_BOARD_DeviceDescriptor), -}; - -static ONE_DESCRIPTOR Config_Descriptor = { - (uint8_t *) &PIOS_USB_BOARD_Configuration, - sizeof(PIOS_USB_BOARD_Configuration), -}; - -const static ONE_DESCRIPTOR Hid_Report_Descriptor = { - (uint8_t *) &PIOS_USB_BOARD_HidReportDescriptor, - sizeof(PIOS_USB_BOARD_HidReportDescriptor), -}; - -const static ONE_DESCRIPTOR Hid_Interface_Descriptor = { - (uint8_t *) &PIOS_USB_BOARD_Configuration.hid_if, - sizeof(PIOS_USB_BOARD_Configuration.hid_if), -}; - -const static ONE_DESCRIPTOR String_Descriptor[] = { - { - (uint8_t *) &PIOS_USB_BOARD_StringLangID, - sizeof(PIOS_USB_BOARD_StringLangID), - }, - { - (uint8_t *) PIOS_USB_BOARD_StringVendorID, - sizeof(PIOS_USB_BOARD_StringVendorID), - }, - { - (uint8_t *) PIOS_USB_BOARD_StringProductID, - sizeof(PIOS_USB_BOARD_StringProductID), - }, - { - (uint8_t *) PIOS_USB_BOARD_StringSerial, - sizeof(PIOS_USB_BOARD_StringSerial), - }, -}; - static RESULT PIOS_USBHOOK_SetProtocol(void); -static uint8_t *PIOS_USBHOOK_GetProtocolValue(uint16_t Length); -static uint8_t *PIOS_USBHOOK_GetReportDescriptor(uint16_t Length); -static uint8_t *PIOS_USBHOOK_GetHIDDescriptor(uint16_t Length); +static const uint8_t *PIOS_USBHOOK_GetProtocolValue(uint16_t Length); +static const uint8_t *PIOS_USBHOOK_GetReportDescriptor(uint16_t Length); +static const uint8_t *PIOS_USBHOOK_GetHIDDescriptor(uint16_t Length); /******************************************************************************* * Function Name : PIOS_USBHOOK_Init. @@ -140,11 +143,8 @@ static uint8_t *PIOS_USBHOOK_GetHIDDescriptor(uint16_t Length); *******************************************************************************/ static void PIOS_USBHOOK_Init(void) { - /* Update the serial number string descriptor with the data from the unique - ID */ - //Get_SerialNum(); - pInformation->Current_Configuration = 0; + /* Connect the device */ PowerOn(); @@ -292,7 +292,7 @@ static void PIOS_USBHOOK_Status_Out(void) *******************************************************************************/ static RESULT PIOS_USBHOOK_Data_Setup(uint8_t RequestNo) { - uint8_t *(*CopyRoutine) (uint16_t); + const uint8_t *(*CopyRoutine) (uint16_t); CopyRoutine = NULL; @@ -350,7 +350,7 @@ static RESULT PIOS_USBHOOK_Data_Setup(uint8_t RequestNo) return USB_UNSUPPORT; } - pInformation->Ctrl_Info.CopyData = CopyRoutine; + pInformation->Ctrl_Info.CopyDataIn = CopyRoutine; pInformation->Ctrl_Info.Usb_wOffset = 0; (*CopyRoutine) (0); return USB_SUCCESS; @@ -405,7 +405,7 @@ static RESULT PIOS_USBHOOK_NoData_Setup(uint8_t RequestNo) * Output : None. * Return : The address of the device descriptor. *******************************************************************************/ -static uint8_t *PIOS_USBHOOK_GetDeviceDescriptor(uint16_t Length) +static const uint8_t *PIOS_USBHOOK_GetDeviceDescriptor(uint16_t Length) { return Standard_GetDescriptorData(Length, &Device_Descriptor); } @@ -417,7 +417,7 @@ static uint8_t *PIOS_USBHOOK_GetDeviceDescriptor(uint16_t Length) * Output : None. * Return : The address of the configuration descriptor. *******************************************************************************/ -static uint8_t *PIOS_USBHOOK_GetConfigDescriptor(uint16_t Length) +static const uint8_t *PIOS_USBHOOK_GetConfigDescriptor(uint16_t Length) { return Standard_GetDescriptorData(Length, &Config_Descriptor); } @@ -429,7 +429,7 @@ static uint8_t *PIOS_USBHOOK_GetConfigDescriptor(uint16_t Length) * Output : None. * Return : The address of the string descriptors. *******************************************************************************/ -static uint8_t *PIOS_USBHOOK_GetStringDescriptor(uint16_t Length) +static const uint8_t *PIOS_USBHOOK_GetStringDescriptor(uint16_t Length) { uint8_t wValue0 = pInformation->USBwValue0; if (wValue0 > 4) { @@ -446,7 +446,7 @@ static uint8_t *PIOS_USBHOOK_GetStringDescriptor(uint16_t Length) * Output : None. * Return : The address of the configuration descriptor. *******************************************************************************/ -static uint8_t *PIOS_USBHOOK_GetReportDescriptor(uint16_t Length) +static const uint8_t *PIOS_USBHOOK_GetReportDescriptor(uint16_t Length) { return Standard_GetDescriptorData(Length, &Hid_Report_Descriptor); } @@ -458,7 +458,7 @@ static uint8_t *PIOS_USBHOOK_GetReportDescriptor(uint16_t Length) * Output : None. * Return : The address of the configuration descriptor. *******************************************************************************/ -static uint8_t *PIOS_USBHOOK_GetHIDDescriptor(uint16_t Length) +static const uint8_t *PIOS_USBHOOK_GetHIDDescriptor(uint16_t Length) { return Standard_GetDescriptorData(Length, &Hid_Interface_Descriptor); } @@ -503,7 +503,7 @@ static RESULT PIOS_USBHOOK_SetProtocol(void) * Output : None. * Return : address of the protcol value. *******************************************************************************/ -static uint8_t *PIOS_USBHOOK_GetProtocolValue(uint16_t Length) +static const uint8_t *PIOS_USBHOOK_GetProtocolValue(uint16_t Length) { if (Length == 0) { pInformation->Ctrl_Info.Usb_wLength = 1; diff --git a/flight/PiOS/inc/pios_usb_board_data_priv.h b/flight/PiOS/inc/pios_usb_board_data_priv.h new file mode 100644 index 000000000..49166c25f --- /dev/null +++ b/flight/PiOS/inc/pios_usb_board_data_priv.h @@ -0,0 +1 @@ +extern int32_t PIOS_USB_BOARD_DATA_Init(void); diff --git a/flight/PiOS/inc/pios_usb_cdc_priv.h b/flight/PiOS/inc/pios_usb_cdc_priv.h index e6b94bad8..74d6e347d 100644 --- a/flight/PiOS/inc/pios_usb_cdc_priv.h +++ b/flight/PiOS/inc/pios_usb_cdc_priv.h @@ -46,7 +46,7 @@ extern const struct pios_com_driver pios_usb_cdc_com_driver; extern int32_t PIOS_USB_CDC_Init(uint32_t * usbcdc_id, const struct pios_usb_cdc_cfg * cfg, uint32_t lower_id); -extern uint8_t *PIOS_USB_CDC_GetLineCoding(uint16_t Length); +extern const uint8_t *PIOS_USB_CDC_GetLineCoding(uint16_t Length); extern RESULT PIOS_USB_CDC_SetControlLineState(void); extern RESULT PIOS_USB_CDC_SetLineCoding(void); diff --git a/flight/PiOS/inc/pios_usb_desc_hid_cdc_priv.h b/flight/PiOS/inc/pios_usb_desc_hid_cdc_priv.h new file mode 100644 index 000000000..4836f4569 --- /dev/null +++ b/flight/PiOS/inc/pios_usb_desc_hid_cdc_priv.h @@ -0,0 +1,8 @@ +#ifndef PIOS_USB_DESC_HID_CDC_PRIV_H +#define PIOS_USB_DESC_HID_CDC_PRIV_H + +#include + +extern int32_t PIOS_USB_DESC_HID_CDC_Init(void); + +#endif /* PIOS_USB_DESC_HID_CDC_PRIV_H */ diff --git a/flight/PiOS/inc/pios_usb_desc_hid_only_priv.h b/flight/PiOS/inc/pios_usb_desc_hid_only_priv.h new file mode 100644 index 000000000..5d161d233 --- /dev/null +++ b/flight/PiOS/inc/pios_usb_desc_hid_only_priv.h @@ -0,0 +1,8 @@ +#ifndef PIOS_USB_DESC_HID_ONLY_PRIV_H +#define PIOS_USB_DESC_HID_ONLY_PRIV_H + +#include + +extern int32_t PIOS_USB_DESC_HID_ONLY_Init(void); + +#endif /* PIOS_USB_DESC_HID_ONLY_PRIV_H */ diff --git a/flight/PiOS/inc/pios_usbhook.h b/flight/PiOS/inc/pios_usbhook.h index d5f032450..f005a6fa1 100644 --- a/flight/PiOS/inc/pios_usbhook.h +++ b/flight/PiOS/inc/pios_usbhook.h @@ -47,5 +47,18 @@ typedef enum CDC_REQUESTS { SET_CONTROL_LINE_STATE = 0x23, } CDC_REQUESTS; +enum usb_string_desc { + USB_STRING_DESC_LANG = 0, + USB_STRING_DESC_VENDOR = 1, + USB_STRING_DESC_PRODUCT = 2, + USB_STRING_DESC_SERIAL = 3, +} __attribute__((packed)); + +extern void PIOS_USBHOOK_RegisterDevice(const uint8_t * desc, uint16_t desc_size); +extern void PIOS_USBHOOK_RegisterConfig(uint8_t config_id, const uint8_t * desc, uint16_t desc_size); +extern void PIOS_USBHOOK_RegisterString(enum usb_string_desc string_id, const uint8_t * desc, uint16_t desc_size); +extern void PIOS_USBHOOK_RegisterHidInterface(const uint8_t * desc, uint16_t desc_size); +extern void PIOS_USBHOOK_RegisterHidReport(const uint8_t * desc, uint16_t desc_size); + #endif /* PIOS_USBHOOK_H */ diff --git a/flight/PipXtreme/inc/pios_usb_board_data.h b/flight/PipXtreme/inc/pios_usb_board_data.h index 95dc03d73..d4f4daf0a 100644 --- a/flight/PipXtreme/inc/pios_usb_board_data.h +++ b/flight/PipXtreme/inc/pios_usb_board_data.h @@ -37,33 +37,6 @@ #include "pios_usb_defs.h" /* struct usb_* */ -struct usb_board_config { - struct usb_configuration_desc config; - struct usb_interface_desc hid_if; - struct usb_hid_desc hid; - struct usb_endpoint_desc hid_in; - struct usb_endpoint_desc hid_out; -} __attribute__((packed)); - -extern const struct usb_device_desc PIOS_USB_BOARD_DeviceDescriptor; -extern const struct usb_board_config PIOS_USB_BOARD_Configuration; -extern const struct usb_string_langid PIOS_USB_BOARD_StringLangID; - -/* NOTE NOTE NOTE - * - * Care must be taken to ensure that the _actual_ contents of - * these arrays (in each board's pios_usb_board_data.c) is no - * smaller than the stated sizes here or these descriptors - * will end up with trailing zeros on the wire. - * - * The compiler will catch any time that these definitions are - * too small. - */ -extern const uint8_t PIOS_USB_BOARD_HidReportDescriptor[36]; -extern const uint8_t PIOS_USB_BOARD_StringVendorID[28]; -extern const uint8_t PIOS_USB_BOARD_StringProductID[20]; -extern uint8_t PIOS_USB_BOARD_StringSerial[52]; - #define PIOS_USB_BOARD_PRODUCT_ID USB_PRODUCT_ID_PIPXTREME #define PIOS_USB_BOARD_DEVICE_VER USB_OP_DEVICE_VER(USB_OP_BOARD_ID_PIPXTREME, USB_OP_BOARD_MODE_FW) diff --git a/flight/PipXtreme/pios_board.c b/flight/PipXtreme/pios_board.c index 7da3705a8..ab6bcffef 100644 --- a/flight/PipXtreme/pios_board.c +++ b/flight/PipXtreme/pios_board.c @@ -324,6 +324,10 @@ static const struct pios_usb_cfg pios_usb_main_cfg = { }, }, }; + +#include "pios_usb_board_data_priv.h" +#include "pios_usb_desc_hid_only_priv.h" + #endif /* PIOS_INCLUDE_USB */ #if defined(PIOS_INCLUDE_USB_HID) @@ -369,10 +373,16 @@ void PIOS_Board_Init(void) { } #if defined(PIOS_INCLUDE_USB) - uint32_t pios_usb_id; - if (PIOS_USB_Init(&pios_usb_id, &pios_usb_main_cfg)) { + /* Initialize board specific USB data */ + PIOS_USB_BOARD_DATA_Init(); + + if (PIOS_USB_DESC_HID_ONLY_Init()) { PIOS_Assert(0); } + + uint32_t pios_usb_id; + PIOS_USB_Init(&pios_usb_id, &pios_usb_main_cfg); + #if defined(PIOS_INCLUDE_USB_HID) && defined(PIOS_INCLUDE_COM) uint32_t pios_usb_hid_id; if (PIOS_USB_HID_Init(&pios_usb_hid_id, &pios_usb_hid_cfg, pios_usb_id)) { diff --git a/flight/PipXtreme/pios_usb_board_data.c b/flight/PipXtreme/pios_usb_board_data.c index d54ca6565..3e41e5ac9 100644 --- a/flight/PipXtreme/pios_usb_board_data.c +++ b/flight/PipXtreme/pios_usb_board_data.c @@ -29,9 +29,11 @@ */ #include "pios_usb_board_data.h" /* struct usb_*, USB_* */ +#include "pios_sys.h" /* PIOS_SYS_SerialNumberGet */ +#include "pios_usbhook.h" /* PIOS_USBHOOK_* */ -const uint8_t PIOS_USB_BOARD_StringProductID[] = { - sizeof(PIOS_USB_BOARD_StringProductID), +static const uint8_t usb_product_id[20] = { + sizeof(usb_product_id), USB_DESC_TYPE_STRING, 'P', 0, 'i', 0, @@ -44,3 +46,74 @@ const uint8_t PIOS_USB_BOARD_StringProductID[] = { 'e', 0, }; +static uint8_t usb_serial_number[52] = { + sizeof(usb_serial_number), + USB_DESC_TYPE_STRING, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0 +}; + +static const struct usb_string_langid usb_lang_id = { + .bLength = sizeof(usb_lang_id), + .bDescriptorType = USB_DESC_TYPE_STRING, + .bLangID = htousbs(USB_LANGID_ENGLISH_UK), +}; + +static const uint8_t usb_vendor_id[28] = { + sizeof(usb_vendor_id), + USB_DESC_TYPE_STRING, + 'o', 0, + 'p', 0, + 'e', 0, + 'n', 0, + 'p', 0, + 'i', 0, + 'l', 0, + 'o', 0, + 't', 0, + '.', 0, + 'o', 0, + 'r', 0, + 'g', 0 +}; + +int32_t PIOS_USB_BOARD_DATA_Init(void) +{ + /* Load device serial number into serial number string */ + uint8_t sn[25]; + PIOS_SYS_SerialNumberGet((char *)sn); + for (uint8_t i = 0; sn[i] != '\0' && (2 * i) < usb_serial_number[0]; i++) { + usb_serial_number[2 + 2 * i] = sn[i]; + } + + PIOS_USBHOOK_RegisterString(USB_STRING_DESC_PRODUCT, (uint8_t *)&usb_product_id, sizeof(usb_product_id)); + PIOS_USBHOOK_RegisterString(USB_STRING_DESC_SERIAL, (uint8_t *)&usb_serial_number, sizeof(usb_serial_number)); + + PIOS_USBHOOK_RegisterString(USB_STRING_DESC_LANG, (uint8_t *)&usb_lang_id, sizeof(usb_lang_id)); + PIOS_USBHOOK_RegisterString(USB_STRING_DESC_VENDOR, (uint8_t *)&usb_vendor_id, sizeof(usb_vendor_id)); + + return 0; +} diff --git a/shared/uavobjectdefinition/hwsettings.xml b/shared/uavobjectdefinition/hwsettings.xml index 1e34e0808..24727a080 100644 --- a/shared/uavobjectdefinition/hwsettings.xml +++ b/shared/uavobjectdefinition/hwsettings.xml @@ -12,6 +12,7 @@ + From ec6d5502252295db0881f17807d01b192fb23888 Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Sat, 12 Nov 2011 21:34:47 -0500 Subject: [PATCH 106/121] i2c: allow i2c adapters to remap pin functions Allows us to support more complex pin configurations for i2c. --- flight/PiOS/STM32F10x/pios_i2c.c | 4 ++++ flight/PiOS/inc/pios_i2c_priv.h | 1 + 2 files changed, 5 insertions(+) diff --git a/flight/PiOS/STM32F10x/pios_i2c.c b/flight/PiOS/STM32F10x/pios_i2c.c index 90c208133..e1bdb44f8 100644 --- a/flight/PiOS/STM32F10x/pios_i2c.c +++ b/flight/PiOS/STM32F10x/pios_i2c.c @@ -891,6 +891,10 @@ int32_t PIOS_I2C_Init(uint32_t * i2c_id, const struct pios_i2c_adapter_cfg * cfg break; } + if (i2c_adapter->cfg->remap) { + GPIO_PinRemapConfig(i2c_adapter->cfg->remap, ENABLE); + } + /* Initialize the state machine */ i2c_adapter_fsm_init(i2c_adapter); diff --git a/flight/PiOS/inc/pios_i2c_priv.h b/flight/PiOS/inc/pios_i2c_priv.h index 5834fef34..a10fe0603 100644 --- a/flight/PiOS/inc/pios_i2c_priv.h +++ b/flight/PiOS/inc/pios_i2c_priv.h @@ -37,6 +37,7 @@ struct pios_i2c_adapter_cfg { uint32_t transfer_timeout_ms; struct stm32_gpio scl; struct stm32_gpio sda; + uint32_t remap; struct stm32_irq event; struct stm32_irq error; }; From feacec468d6b0127716fa23183977faa2fa4abad Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Sat, 12 Nov 2011 21:39:41 -0500 Subject: [PATCH 107/121] i2c: compile-time decoupling of i2c devices from adapters This allows each device to be moved (at compile time) to a different adapter. This is the first step to allowing devices to be attached to different i2c adapters. --- flight/PiOS/Boards/STM32103CB_CC_Rev1.h | 1 + flight/PiOS/Boards/STM3210E_OP.h | 1 + flight/PiOS/Common/pios_i2c_esc.c | 8 ++++---- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/flight/PiOS/Boards/STM32103CB_CC_Rev1.h b/flight/PiOS/Boards/STM32103CB_CC_Rev1.h index 437a49109..ff37debdc 100644 --- a/flight/PiOS/Boards/STM32103CB_CC_Rev1.h +++ b/flight/PiOS/Boards/STM32103CB_CC_Rev1.h @@ -112,6 +112,7 @@ TIM4 | RC In 1 | Servo 3 | Servo 2 | Servo 1 #define PIOS_I2C_MAX_DEVS 1 extern uint32_t pios_i2c_main_adapter_id; #define PIOS_I2C_MAIN_ADAPTER (pios_i2c_main_adapter_id) +#define PIOS_I2C_ESC_ADAPTER (pios_i2c_main_adapter_id) //------------------------- // SPI diff --git a/flight/PiOS/Boards/STM3210E_OP.h b/flight/PiOS/Boards/STM3210E_OP.h index a7754c2ed..1cc4249f3 100644 --- a/flight/PiOS/Boards/STM3210E_OP.h +++ b/flight/PiOS/Boards/STM3210E_OP.h @@ -115,6 +115,7 @@ TIM8 | Servo 5 | Servo 6 | Servo 7 | Servo 8 #define PIOS_I2C_MAX_DEVS 1 extern uint32_t pios_i2c_main_adapter_id; #define PIOS_I2C_MAIN_ADAPTER (pios_i2c_main_adapter_id) +#define PIOS_I2C_ESC_ADAPTER (pios_i2c_main_adapter_id) //------------------------ // PIOS_BMP085 diff --git a/flight/PiOS/Common/pios_i2c_esc.c b/flight/PiOS/Common/pios_i2c_esc.c index fdb58eba0..d440bfa48 100644 --- a/flight/PiOS/Common/pios_i2c_esc.c +++ b/flight/PiOS/Common/pios_i2c_esc.c @@ -93,7 +93,7 @@ bool PIOS_I2C_ESC_SetSpeed(uint8_t speed[4]) } }; - return PIOS_I2C_Transfer(PIOS_I2C_MAIN_ADAPTER, txn_list, NELEMENTS(txn_list)); + return PIOS_I2C_Transfer(PIOS_I2C_ESC_ADAPTER, txn_list, NELEMENTS(txn_list)); } bool PIOS_SetMKSpeed(uint8_t motornum, uint8_t speed) { @@ -115,7 +115,7 @@ bool PIOS_SetMKSpeed(uint8_t motornum, uint8_t speed) { } }; - return PIOS_I2C_Transfer(PIOS_I2C_MAIN_ADAPTER, txn_list, NELEMENTS(txn_list)); + return PIOS_I2C_Transfer(PIOS_I2C_ESC_ADAPTER, txn_list, NELEMENTS(txn_list)); } bool PIOS_SetAstec4Address(uint8_t new_address) { @@ -134,7 +134,7 @@ bool PIOS_SetAstec4Address(uint8_t new_address) { } }; - return PIOS_I2C_Transfer(PIOS_I2C_MAIN_ADAPTER, txn_list, NELEMENTS(txn_list)); + return PIOS_I2C_Transfer(PIOS_I2C_ESC_ADAPTER, txn_list, NELEMENTS(txn_list)); } bool PIOS_SetAstec4Speed(uint8_t motornum, uint8_t speed) { @@ -161,7 +161,7 @@ bool PIOS_SetAstec4Speed(uint8_t motornum, uint8_t speed) { } }; - return PIOS_I2C_Transfer(PIOS_I2C_MAIN_ADAPTER, txn_list, NELEMENTS(txn_list)); + return PIOS_I2C_Transfer(PIOS_I2C_ESC_ADAPTER, txn_list, NELEMENTS(txn_list)); } #endif From a0089f072a03d878403efdfe2f263e0379a1a0c7 Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Sat, 12 Nov 2011 21:50:53 -0500 Subject: [PATCH 108/121] i2c: rename main adapter to flexi adapter on CC --- flight/CopterControl/System/pios_board.c | 20 ++++++++++---------- flight/PiOS/Boards/STM32103CB_CC_Rev1.h | 6 +++--- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/flight/CopterControl/System/pios_board.c b/flight/CopterControl/System/pios_board.c index ffdde4759..4e0495776 100644 --- a/flight/CopterControl/System/pios_board.c +++ b/flight/CopterControl/System/pios_board.c @@ -903,12 +903,12 @@ const struct pios_pwm_cfg pios_pwm_cfg = { * I2C Adapters */ -void PIOS_I2C_main_adapter_ev_irq_handler(void); -void PIOS_I2C_main_adapter_er_irq_handler(void); -void I2C2_EV_IRQHandler() __attribute__ ((alias ("PIOS_I2C_main_adapter_ev_irq_handler"))); -void I2C2_ER_IRQHandler() __attribute__ ((alias ("PIOS_I2C_main_adapter_er_irq_handler"))); +void PIOS_I2C_flexi_adapter_ev_irq_handler(void); +void PIOS_I2C_flexi_adapter_er_irq_handler(void); +void I2C2_EV_IRQHandler() __attribute__ ((alias ("PIOS_I2C_flexi_adapter_ev_irq_handler"))); +void I2C2_ER_IRQHandler() __attribute__ ((alias ("PIOS_I2C_flexi_adapter_er_irq_handler"))); -static const struct pios_i2c_adapter_cfg pios_i2c_main_adapter_cfg = { +static const struct pios_i2c_adapter_cfg pios_i2c_flexi_adapter_cfg = { .regs = I2C2, .init = { .I2C_Mode = I2C_Mode_I2C, @@ -955,17 +955,17 @@ static const struct pios_i2c_adapter_cfg pios_i2c_main_adapter_cfg = { }, }; -uint32_t pios_i2c_main_adapter_id; -void PIOS_I2C_main_adapter_ev_irq_handler(void) +uint32_t pios_i2c_flexi_adapter_id; +void PIOS_I2C_flexi_adapter_ev_irq_handler(void) { /* Call into the generic code to handle the IRQ for this specific device */ - PIOS_I2C_EV_IRQ_Handler(pios_i2c_main_adapter_id); + PIOS_I2C_EV_IRQ_Handler(pios_i2c_flexi_adapter_id); } -void PIOS_I2C_main_adapter_er_irq_handler(void) +void PIOS_I2C_flexi_adapter_er_irq_handler(void) { /* Call into the generic code to handle the IRQ for this specific device */ - PIOS_I2C_ER_IRQ_Handler(pios_i2c_main_adapter_id); + PIOS_I2C_ER_IRQ_Handler(pios_i2c_flexi_adapter_id); } #endif /* PIOS_INCLUDE_I2C */ diff --git a/flight/PiOS/Boards/STM32103CB_CC_Rev1.h b/flight/PiOS/Boards/STM32103CB_CC_Rev1.h index ff37debdc..e908345b7 100644 --- a/flight/PiOS/Boards/STM32103CB_CC_Rev1.h +++ b/flight/PiOS/Boards/STM32103CB_CC_Rev1.h @@ -110,9 +110,9 @@ TIM4 | RC In 1 | Servo 3 | Servo 2 | Servo 1 // See also pios_board.c //------------------------ #define PIOS_I2C_MAX_DEVS 1 -extern uint32_t pios_i2c_main_adapter_id; -#define PIOS_I2C_MAIN_ADAPTER (pios_i2c_main_adapter_id) -#define PIOS_I2C_ESC_ADAPTER (pios_i2c_main_adapter_id) +extern uint32_t pios_i2c_flexi_adapter_id; +#define PIOS_I2C_MAIN_ADAPTER (pios_i2c_flexi_adapter_id) +#define PIOS_I2C_ESC_ADAPTER (pios_i2c_flexi_adapter_id) //------------------------- // SPI From 4cb0c4133855742b00a1a35a1375c1019d0403e4 Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Fri, 25 Nov 2011 19:38:16 -0500 Subject: [PATCH 109/121] bmp085: only use eoc and drdy gpios when available When the bmp085 chip is on an external board, we don't have access to the eoc and drdy gpio lines. Only use them when available. --- flight/Modules/Altitude/altitude.c | 8 ++++++++ flight/PiOS/Boards/STM3210E_INS.h | 1 + flight/PiOS/Boards/STM3210E_OP.h | 1 + flight/PiOS/Common/pios_bmp085.c | 10 ++++++++++ flight/PiOS/STM32F10x/pios_exti.c | 2 +- 5 files changed, 21 insertions(+), 1 deletion(-) diff --git a/flight/Modules/Altitude/altitude.c b/flight/Modules/Altitude/altitude.c index d1655aaa8..163258c1c 100644 --- a/flight/Modules/Altitude/altitude.c +++ b/flight/Modules/Altitude/altitude.c @@ -144,13 +144,21 @@ static void altitudeTask(void *parameters) #endif // Update the temperature data PIOS_BMP085_StartADC(TemperatureConv); +#ifdef PIOS_BMP085_HAS_GPIOS xSemaphoreTake(PIOS_BMP085_EOC, portMAX_DELAY); +#else + vTaskDelay(5 / portTICK_RATE_MS); +#endif PIOS_BMP085_ReadADC(); alt_ds_temp += PIOS_BMP085_GetTemperature(); // Update the pressure data PIOS_BMP085_StartADC(PressureConv); +#ifdef PIOS_BMP085_HAS_GPIOS xSemaphoreTake(PIOS_BMP085_EOC, portMAX_DELAY); +#else + vTaskDelay(26 / portTICK_RATE_MS); +#endif PIOS_BMP085_ReadADC(); alt_ds_pres += PIOS_BMP085_GetPressure(); diff --git a/flight/PiOS/Boards/STM3210E_INS.h b/flight/PiOS/Boards/STM3210E_INS.h index d661e8b96..5973bd168 100644 --- a/flight/PiOS/Boards/STM3210E_INS.h +++ b/flight/PiOS/Boards/STM3210E_INS.h @@ -106,6 +106,7 @@ extern uint32_t pios_i2c_gyro_adapter_id; //------------------------ // PIOS_BMP085 //------------------------ +#define PIOS_BMP085_HAS_GPIOS #define PIOS_BMP085_EOC_GPIO_PORT GPIOC #define PIOS_BMP085_EOC_GPIO_PIN GPIO_Pin_2 #define PIOS_BMP085_EOC_PORT_SOURCE GPIO_PortSourceGPIOC diff --git a/flight/PiOS/Boards/STM3210E_OP.h b/flight/PiOS/Boards/STM3210E_OP.h index 1cc4249f3..87d4ab4a0 100644 --- a/flight/PiOS/Boards/STM3210E_OP.h +++ b/flight/PiOS/Boards/STM3210E_OP.h @@ -120,6 +120,7 @@ extern uint32_t pios_i2c_main_adapter_id; //------------------------ // PIOS_BMP085 //------------------------ +#define PIOS_BMP085_HAS_GPIOS #define PIOS_BMP085_EOC_GPIO_PORT GPIOC #define PIOS_BMP085_EOC_GPIO_PIN GPIO_Pin_15 #define PIOS_BMP085_EOC_PORT_SOURCE GPIO_PortSourceGPIOC diff --git a/flight/PiOS/Common/pios_bmp085.c b/flight/PiOS/Common/pios_bmp085.c index 9a6a2310f..5d3668b2f 100644 --- a/flight/PiOS/Common/pios_bmp085.c +++ b/flight/PiOS/Common/pios_bmp085.c @@ -38,12 +38,17 @@ /* Glocal Variables */ ConversionTypeTypeDef CurrentRead; + +#ifdef PIOS_BMP085_HAS_GPIOS + #if defined(PIOS_INCLUDE_FREERTOS) xSemaphoreHandle PIOS_BMP085_EOC; #else int32_t PIOS_BMP085_EOC; #endif +#endif /* PIOS_BMP085_HAS_GPIOS */ + /* Local Variables */ static BMP085CalibDataTypeDef CalibData; @@ -60,6 +65,9 @@ static volatile uint16_t Temperature; */ void PIOS_BMP085_Init(void) { + +#ifdef PIOS_BMP085_HAS_GPIOS + GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; @@ -101,6 +109,8 @@ void PIOS_BMP085_Init(void) GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(PIOS_BMP085_XCLR_GPIO_PORT, &GPIO_InitStructure); +#endif /* PIOS_BMP085_HAS_GPIOS */ + /* Read all 22 bytes of calibration data in one transfer, this is a very optimized way of doing things */ uint8_t Data[BMP085_CALIB_LEN]; while (!PIOS_BMP085_Read(BMP085_CALIB_ADDR, Data, BMP085_CALIB_LEN)) diff --git a/flight/PiOS/STM32F10x/pios_exti.c b/flight/PiOS/STM32F10x/pios_exti.c index 0b886666a..0b4a9a1ae 100644 --- a/flight/PiOS/STM32F10x/pios_exti.c +++ b/flight/PiOS/STM32F10x/pios_exti.c @@ -44,7 +44,7 @@ void EXTI15_10_IRQHandler(void) portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; #endif -#if defined(PIOS_INCLUDE_BMP085) +#if defined(PIOS_INCLUDE_BMP085) && defined(PIOS_BMP085_HAS_GPIOS) if (EXTI_GetITStatus(PIOS_BMP085_EOC_EXTI_LINE) != RESET) { /* Read the ADC Value */ #if defined(PIOS_INCLUDE_FREERTOS) From bae08fcad060712eb38fabdf11fe44a1972be3c9 Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Sat, 10 Dec 2011 19:38:06 -0500 Subject: [PATCH 110/121] bmp085: decouple i2c adapter Let the bmp085 be attached to different adapters for different boards. --- flight/PiOS/Boards/STM3210E_INS.h | 1 + flight/PiOS/Boards/STM3210E_OP.h | 1 + flight/PiOS/Common/pios_bmp085.c | 4 ++-- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/flight/PiOS/Boards/STM3210E_INS.h b/flight/PiOS/Boards/STM3210E_INS.h index 5973bd168..37ca4abe3 100644 --- a/flight/PiOS/Boards/STM3210E_INS.h +++ b/flight/PiOS/Boards/STM3210E_INS.h @@ -100,6 +100,7 @@ TIM8 | | | | #define PIOS_I2C_MAX_DEVS 3 extern uint32_t pios_i2c_pres_mag_adapter_id; #define PIOS_I2C_MAIN_ADAPTER (pios_i2c_pres_mag_adapter_id) +#define PIOS_I2C_BMP085_ADAPTER (pios_i2c_pres_mag_adapter_id) extern uint32_t pios_i2c_gyro_adapter_id; #define PIOS_I2C_GYRO_ADAPTER (pios_i2c_gyro_adapter_id) diff --git a/flight/PiOS/Boards/STM3210E_OP.h b/flight/PiOS/Boards/STM3210E_OP.h index 87d4ab4a0..7099234c6 100644 --- a/flight/PiOS/Boards/STM3210E_OP.h +++ b/flight/PiOS/Boards/STM3210E_OP.h @@ -116,6 +116,7 @@ TIM8 | Servo 5 | Servo 6 | Servo 7 | Servo 8 extern uint32_t pios_i2c_main_adapter_id; #define PIOS_I2C_MAIN_ADAPTER (pios_i2c_main_adapter_id) #define PIOS_I2C_ESC_ADAPTER (pios_i2c_main_adapter_id) +#define PIOS_I2C_BMP085_ADAPTER (pios_i2c_main_adapter_id) //------------------------ // PIOS_BMP085 diff --git a/flight/PiOS/Common/pios_bmp085.c b/flight/PiOS/Common/pios_bmp085.c index 5d3668b2f..5a4b0cd94 100644 --- a/flight/PiOS/Common/pios_bmp085.c +++ b/flight/PiOS/Common/pios_bmp085.c @@ -245,7 +245,7 @@ bool PIOS_BMP085_Read(uint8_t address, uint8_t * buffer, uint8_t len) } }; - return PIOS_I2C_Transfer(PIOS_I2C_MAIN_ADAPTER, txn_list, NELEMENTS(txn_list)); + return PIOS_I2C_Transfer(PIOS_I2C_BMP085_ADAPTER, txn_list, NELEMENTS(txn_list)); } /** @@ -274,7 +274,7 @@ bool PIOS_BMP085_Write(uint8_t address, uint8_t buffer) , }; - return PIOS_I2C_Transfer(PIOS_I2C_MAIN_ADAPTER, txn_list, NELEMENTS(txn_list)); + return PIOS_I2C_Transfer(PIOS_I2C_BMP085_ADAPTER, txn_list, NELEMENTS(txn_list)); } /** From 717c1311e62983889adc5fc34ac8a81bbb474f69 Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Sat, 14 Jan 2012 15:04:49 -0500 Subject: [PATCH 111/121] altitude: allow altitude to be an optional module --- flight/Modules/Altitude/altitude.c | 66 ++++++++++++++--------- shared/uavobjectdefinition/hwsettings.xml | 2 +- 2 files changed, 41 insertions(+), 27 deletions(-) diff --git a/flight/Modules/Altitude/altitude.c b/flight/Modules/Altitude/altitude.c index 163258c1c..9c0d5399f 100644 --- a/flight/Modules/Altitude/altitude.c +++ b/flight/Modules/Altitude/altitude.c @@ -37,6 +37,7 @@ */ #include "openpilot.h" +#include "hwsettings.h" #include "altitude.h" #include "baroaltitude.h" // object that will be updated by the module #if defined(PIOS_INCLUDE_HCSR04) @@ -60,6 +61,8 @@ static int32_t alt_ds_temp = 0; static int32_t alt_ds_pres = 0; static int alt_ds_count = 0; +static bool altitudeEnabled; + // Private functions static void altitudeTask(void *parameters); @@ -69,17 +72,19 @@ static void altitudeTask(void *parameters); */ int32_t AltitudeStart() { - - BaroAltitudeInitialize(); -#if defined(PIOS_INCLUDE_HCSR04) - SonarAltitudeInitialze(); -#endif - - // Start main task - xTaskCreate(altitudeTask, (signed char *)"Altitude", STACK_SIZE_BYTES/4, NULL, TASK_PRIORITY, &taskHandle); - TaskMonitorAdd(TASKINFO_RUNNING_ALTITUDE, taskHandle); - return 0; + if (altitudeEnabled) { + BaroAltitudeInitialize(); +#if defined(PIOS_INCLUDE_HCSR04) + SonarAltitudeInitialze(); +#endif + + // Start main task + xTaskCreate(altitudeTask, (signed char *)"Altitude", STACK_SIZE_BYTES/4, NULL, TASK_PRIORITY, &taskHandle); + TaskMonitorAdd(TASKINFO_RUNNING_ALTITUDE, taskHandle); + return 0; + } + return -1; } /** @@ -89,10 +94,19 @@ int32_t AltitudeStart() int32_t AltitudeInitialize() { + HwSettingsInitialize(); + uint8_t optionalModules[HWSETTINGS_OPTIONALMODULES_NUMELEM]; + HwSettingsOptionalModulesGet(optionalModules); + if (optionalModules[HWSETTINGS_OPTIONALMODULES_ALTITUDE] == HWSETTINGS_OPTIONALMODULES_ENABLED) { + altitudeEnabled = 1; + } else { + altitudeEnabled = 0; + } + // init down-sampling data - alt_ds_temp = 0; - alt_ds_pres = 0; - alt_ds_count = 0; + alt_ds_temp = 0; + alt_ds_pres = 0; + alt_ds_count = 0; return 0; } @@ -163,23 +177,23 @@ static void altitudeTask(void *parameters) alt_ds_pres += PIOS_BMP085_GetPressure(); if (++alt_ds_count >= alt_ds_size) - { - alt_ds_count = 0; + { + alt_ds_count = 0; - // Convert from 1/10ths of degC to degC - data.Temperature = alt_ds_temp / (10.0 * alt_ds_size); - alt_ds_temp = 0; + // Convert from 1/10ths of degC to degC + data.Temperature = alt_ds_temp / (10.0 * alt_ds_size); + alt_ds_temp = 0; - // Convert from Pa to kPa - data.Pressure = alt_ds_pres / (1000.0f * alt_ds_size); - alt_ds_pres = 0; + // Convert from Pa to kPa + data.Pressure = alt_ds_pres / (1000.0f * alt_ds_size); + alt_ds_pres = 0; - // Compute the current altitude (all pressures in kPa) - data.Altitude = 44330.0 * (1.0 - powf((data.Pressure / (BMP085_P0 / 1000.0)), (1.0 / 5.255))); + // Compute the current altitude (all pressures in kPa) + data.Altitude = 44330.0 * (1.0 - powf((data.Pressure / (BMP085_P0 / 1000.0)), (1.0 / 5.255))); - // Update the AltitudeActual UAVObject - BaroAltitudeSet(&data); - } + // Update the AltitudeActual UAVObject + BaroAltitudeSet(&data); + } // Delay until it is time to read the next sample vTaskDelayUntil(&lastSysTime, UPDATE_PERIOD / portTICK_RATE_MS); diff --git a/shared/uavobjectdefinition/hwsettings.xml b/shared/uavobjectdefinition/hwsettings.xml index 24727a080..455e23cd7 100644 --- a/shared/uavobjectdefinition/hwsettings.xml +++ b/shared/uavobjectdefinition/hwsettings.xml @@ -16,7 +16,7 @@ - + From 53e9ef06b4261feed21e4e8fe3d0261d1560d416 Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Sat, 14 Jan 2012 15:17:24 -0500 Subject: [PATCH 112/121] altitude: add optional altitude module --- flight/CopterControl/Makefile | 6 ++++-- flight/CopterControl/System/inc/pios_config.h | 2 ++ flight/CopterControl/System/pios_board.c | 2 +- flight/Modules/Altitude/altitude.c | 3 +-- flight/PiOS/Boards/STM32103CB_CC_Rev1.h | 6 ++++++ 5 files changed, 14 insertions(+), 5 deletions(-) diff --git a/flight/CopterControl/Makefile b/flight/CopterControl/Makefile index 891e7f6c6..7a1653c0e 100644 --- a/flight/CopterControl/Makefile +++ b/flight/CopterControl/Makefile @@ -50,7 +50,7 @@ ENABLE_AUX_UART ?= NO USE_GPS ?= YES -USE_I2C ?= NO +USE_I2C ?= YES # Set to YES when using Code Sourcery toolchain CODE_SOURCERY ?= YES @@ -65,7 +65,7 @@ endif FLASH_TOOL = OPENOCD # List of modules to include -OPTMODULES = CameraStab ComUsbBridge +OPTMODULES = CameraStab ComUsbBridge Altitude ifeq ($(USE_GPS), YES) OPTMODULES += GPS endif @@ -182,6 +182,7 @@ SRC += $(OPUAVSYNTHDIR)/receiveractivity.c SRC += $(OPUAVSYNTHDIR)/taskinfo.c SRC += $(OPUAVSYNTHDIR)/mixerstatus.c SRC += $(OPUAVSYNTHDIR)/ratedesired.c +SRC += $(OPUAVSYNTHDIR)/baroaltitude.c endif @@ -225,6 +226,7 @@ SRC += $(PIOSCOMMON)/pios_flash_w25x.c SRC += $(PIOSCOMMON)/pios_adxl345.c SRC += $(PIOSCOMMON)/pios_com.c SRC += $(PIOSCOMMON)/pios_i2c_esc.c +SRC += $(PIOSCOMMON)/pios_bmp085.c SRC += $(PIOSCOMMON)/pios_iap.c SRC += $(PIOSCOMMON)/pios_bl_helper.c SRC += $(PIOSCOMMON)/pios_rcvr.c diff --git a/flight/CopterControl/System/inc/pios_config.h b/flight/CopterControl/System/inc/pios_config.h index 54c5b3b22..9be4387f0 100644 --- a/flight/CopterControl/System/inc/pios_config.h +++ b/flight/CopterControl/System/inc/pios_config.h @@ -76,6 +76,8 @@ #define PIOS_INCLUDE_ADXL345 #define PIOS_INCLUDE_FLASH +#define PIOS_INCLUDE_BMP085 + /* A really shitty setting saving implementation */ #define PIOS_INCLUDE_FLASH_SECTOR_SETTINGS diff --git a/flight/CopterControl/System/pios_board.c b/flight/CopterControl/System/pios_board.c index 4e0495776..a7197768d 100644 --- a/flight/CopterControl/System/pios_board.c +++ b/flight/CopterControl/System/pios_board.c @@ -1464,7 +1464,7 @@ void PIOS_Board_Init(void) { case HWSETTINGS_CC_FLEXIPORT_I2C: #if defined(PIOS_INCLUDE_I2C) { - if (PIOS_I2C_Init(&pios_i2c_main_adapter_id, &pios_i2c_main_adapter_cfg)) { + if (PIOS_I2C_Init(&pios_i2c_flexi_adapter_id, &pios_i2c_flexi_adapter_cfg)) { PIOS_Assert(0); } } diff --git a/flight/Modules/Altitude/altitude.c b/flight/Modules/Altitude/altitude.c index 9c0d5399f..da90b7f7c 100644 --- a/flight/Modules/Altitude/altitude.c +++ b/flight/Modules/Altitude/altitude.c @@ -47,8 +47,7 @@ // Private constants #define STACK_SIZE_BYTES 500 #define TASK_PRIORITY (tskIDLE_PRIORITY+1) -//#define UPDATE_PERIOD 100 -#define UPDATE_PERIOD 25 +#define UPDATE_PERIOD 50 // Private types diff --git a/flight/PiOS/Boards/STM32103CB_CC_Rev1.h b/flight/PiOS/Boards/STM32103CB_CC_Rev1.h index e908345b7..7773b9092 100644 --- a/flight/PiOS/Boards/STM32103CB_CC_Rev1.h +++ b/flight/PiOS/Boards/STM32103CB_CC_Rev1.h @@ -113,6 +113,12 @@ TIM4 | RC In 1 | Servo 3 | Servo 2 | Servo 1 extern uint32_t pios_i2c_flexi_adapter_id; #define PIOS_I2C_MAIN_ADAPTER (pios_i2c_flexi_adapter_id) #define PIOS_I2C_ESC_ADAPTER (pios_i2c_flexi_adapter_id) +#define PIOS_I2C_BMP085_ADAPTER (pios_i2c_flexi_adapter_id) + +//------------------------ +// PIOS_BMP085 +//------------------------ +#define PIOS_BMP085_OVERSAMPLING 3 //------------------------- // SPI From 27ceb7ea92c29f803ac5f3fd0cf12ae970727b96 Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Sat, 14 Jan 2012 16:55:55 -0500 Subject: [PATCH 113/121] modules: Allow optional modules to be used as built-in Some modules are written such that they can be included or excluded at runtime. These are added to the OPTMODULES list in the makefile for a given board. This change provides a mechanism to allow a build to force a given module to be built-in (ie. always initialized) regardless of the configuration in hwsettings. The main use case for this is to handle a module being optional on one platform but essential on another. All modules added to the MODULES list in the Makefile will automatically result in a matching #define in the form MODULE_TheModuleName_BUILTIN being defined in the CFLAGS for all compiled source. Note that the capitalization of TheModuleName must match exactly the capitalization used in the MODULES list. --- flight/CopterControl/Makefile | 3 +++ flight/Modules/Altitude/altitude.c | 5 ++++- flight/Modules/CameraStab/camerastab.c | 5 +++++ flight/Modules/ComUsbBridge/ComUsbBridge.c | 4 ++++ flight/Modules/Fault/Fault.c | 4 ++++ flight/Modules/GPS/GPS.c | 4 ++++ flight/OpenPilot/Makefile | 3 +++ 7 files changed, 27 insertions(+), 1 deletion(-) diff --git a/flight/CopterControl/Makefile b/flight/CopterControl/Makefile index 7a1653c0e..631a0e7c9 100644 --- a/flight/CopterControl/Makefile +++ b/flight/CopterControl/Makefile @@ -412,6 +412,9 @@ ifeq ($(USE_I2C), YES) CDEFS += -DUSE_I2C endif +# Declare all non-optional modules as built-in to force inclusion +CDEFS += ${foreach MOD, ${MODULES}, -DMODULE_$(MOD)_BUILTIN } + # Place project-specific -D and/or -U options for # Assembler with preprocessor here. #ADEFS = -DUSE_IRQ_ASM_WRAPPER diff --git a/flight/Modules/Altitude/altitude.c b/flight/Modules/Altitude/altitude.c index da90b7f7c..87a4240b6 100644 --- a/flight/Modules/Altitude/altitude.c +++ b/flight/Modules/Altitude/altitude.c @@ -92,7 +92,9 @@ int32_t AltitudeStart() */ int32_t AltitudeInitialize() { - +#ifdef MODULE_Altitude_BUILTIN + altitudeEnabled = 1; +#else HwSettingsInitialize(); uint8_t optionalModules[HWSETTINGS_OPTIONALMODULES_NUMELEM]; HwSettingsOptionalModulesGet(optionalModules); @@ -101,6 +103,7 @@ int32_t AltitudeInitialize() } else { altitudeEnabled = 0; } +#endif // init down-sampling data alt_ds_temp = 0; diff --git a/flight/Modules/CameraStab/camerastab.c b/flight/Modules/CameraStab/camerastab.c index 770ff7ab6..0c5b189d9 100644 --- a/flight/Modules/CameraStab/camerastab.c +++ b/flight/Modules/CameraStab/camerastab.c @@ -75,6 +75,10 @@ int32_t CameraStabInitialize(void) static UAVObjEvent ev; bool cameraStabEnabled; + +#ifdef MODULE_CameraStab_BUILTIN + cameraStabEnabled = true; +#else uint8_t optionalModules[HWSETTINGS_OPTIONALMODULES_NUMELEM]; HwSettingsInitialize(); @@ -84,6 +88,7 @@ int32_t CameraStabInitialize(void) cameraStabEnabled = true; else cameraStabEnabled = false; +#endif if (cameraStabEnabled) { diff --git a/flight/Modules/ComUsbBridge/ComUsbBridge.c b/flight/Modules/ComUsbBridge/ComUsbBridge.c index 984a53944..678e7039d 100644 --- a/flight/Modules/ComUsbBridge/ComUsbBridge.c +++ b/flight/Modules/ComUsbBridge/ComUsbBridge.c @@ -94,6 +94,9 @@ static int32_t comUsbBridgeInitialize(void) usart_port = PIOS_COM_BRIDGE; vcp_port = PIOS_COM_VCP; +#ifdef MODULE_ComUsbBridge_BUILTIN + bridge_enabled = true; +#else HwSettingsInitialize(); uint8_t optionalModules[HWSETTINGS_OPTIONALMODULES_NUMELEM]; @@ -104,6 +107,7 @@ static int32_t comUsbBridgeInitialize(void) bridge_enabled = true; else bridge_enabled = false; +#endif if (bridge_enabled) { com2usb_buf = pvPortMalloc(BRIDGE_BUF_LEN); diff --git a/flight/Modules/Fault/Fault.c b/flight/Modules/Fault/Fault.c index 0ac3748a6..868330739 100644 --- a/flight/Modules/Fault/Fault.c +++ b/flight/Modules/Fault/Fault.c @@ -40,6 +40,9 @@ static uint8_t active_fault; static int32_t fault_initialize(void) { +#ifdef MODULE_Fault_BUILTIN + module_enabled = true; +#else HwSettingsInitialize(); uint8_t optionalModules[HWSETTINGS_OPTIONALMODULES_NUMELEM]; @@ -50,6 +53,7 @@ static int32_t fault_initialize(void) } else { module_enabled = false; } +#endif /* Do this outside the module_enabled test so that it * can be changed even when the module has been disabled. diff --git a/flight/Modules/GPS/GPS.c b/flight/Modules/GPS/GPS.c index bc8f92c17..1f93d6dba 100644 --- a/flight/Modules/GPS/GPS.c +++ b/flight/Modules/GPS/GPS.c @@ -121,6 +121,9 @@ int32_t GPSInitialize(void) { gpsPort = PIOS_COM_GPS; +#ifdef MODULE_GPS_BUILTIN + gpsEnabled = true; +#else HwSettingsInitialize(); uint8_t optionalModules[HWSETTINGS_OPTIONALMODULES_NUMELEM]; @@ -130,6 +133,7 @@ int32_t GPSInitialize(void) gpsEnabled = true; else gpsEnabled = false; +#endif if (gpsPort && gpsEnabled) { GPSPositionInitialize(); diff --git a/flight/OpenPilot/Makefile b/flight/OpenPilot/Makefile index 940c1f117..2130bf283 100644 --- a/flight/OpenPilot/Makefile +++ b/flight/OpenPilot/Makefile @@ -369,6 +369,9 @@ ifeq ($(ENABLE_AUX_UART), YES) CDEFS += -DPIOS_ENABLE_AUX_UART endif +# Declare all non-optional modules as built-in to force inclusion +CDEFS += ${foreach MOD, ${MODULES}, -DMODULE_$(MOD)_BUILTIN } + # Place project-specific -D and/or -U options for # Assembler with preprocessor here. #ADEFS = -DUSE_IRQ_ASM_WRAPPER From c97b108a1f2c1b9aa5acdd4ff130c306f3447443 Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Sun, 15 Jan 2012 17:56:42 -0500 Subject: [PATCH 114/121] bootfault: make IAP usage depend on PiOS config The sim platforms don't support an IAP mechanism. Let PiOS config control when we try to use it. --- flight/AHRS/inc/pios_config.h | 1 + flight/Bootloaders/AHRS/inc/pios_config.h | 1 + flight/Bootloaders/CopterControl/inc/pios_config.h | 1 + flight/Bootloaders/OpenPilot/inc/pios_config.h | 1 + flight/Bootloaders/PipXtreme/inc/pios_config.h | 1 + flight/CopterControl/System/inc/pios_config.h | 1 + flight/INS/inc/pios_config.h | 1 + flight/Modules/System/systemmod.c | 4 ++-- flight/OpenPilot/System/inc/pios_config.h | 1 + flight/PiOS/pios.h | 3 +++ 10 files changed, 13 insertions(+), 2 deletions(-) diff --git a/flight/AHRS/inc/pios_config.h b/flight/AHRS/inc/pios_config.h index 64f3559a0..77ddf0f2f 100644 --- a/flight/AHRS/inc/pios_config.h +++ b/flight/AHRS/inc/pios_config.h @@ -41,5 +41,6 @@ #define PIOS_INCLUDE_GPIO #define PIOS_INCLUDE_EXTI #define PIOS_INCLUDE_BL_HELPER +#define PIOS_INCLUDE_IAP #endif /* PIOS_CONFIG_H */ diff --git a/flight/Bootloaders/AHRS/inc/pios_config.h b/flight/Bootloaders/AHRS/inc/pios_config.h index b24e0fc5b..82344e2ad 100644 --- a/flight/Bootloaders/AHRS/inc/pios_config.h +++ b/flight/Bootloaders/AHRS/inc/pios_config.h @@ -36,5 +36,6 @@ #define PIOS_INCLUDE_BL_HELPER #define PIOS_INCLUDE_BL_HELPER_WRITE_SUPPORT #define PIOS_INCLUDE_GPIO +#define PIOS_INCLUDE_IAP #endif /* PIOS_CONFIG_H */ diff --git a/flight/Bootloaders/CopterControl/inc/pios_config.h b/flight/Bootloaders/CopterControl/inc/pios_config.h index 864ed4665..3eb2c281a 100644 --- a/flight/Bootloaders/CopterControl/inc/pios_config.h +++ b/flight/Bootloaders/CopterControl/inc/pios_config.h @@ -41,6 +41,7 @@ #define PIOS_INCLUDE_USB_HID #define PIOS_INCLUDE_COM_MSG #define PIOS_INCLUDE_GPIO +#define PIOS_INCLUDE_IAP #define PIOS_NO_GPS #endif /* PIOS_CONFIG_H */ diff --git a/flight/Bootloaders/OpenPilot/inc/pios_config.h b/flight/Bootloaders/OpenPilot/inc/pios_config.h index cf8981339..932c1a913 100644 --- a/flight/Bootloaders/OpenPilot/inc/pios_config.h +++ b/flight/Bootloaders/OpenPilot/inc/pios_config.h @@ -44,6 +44,7 @@ #define PIOS_INCLUDE_COM #define PIOS_INCLUDE_COM_MSG #define PIOS_INCLUDE_GPIO +#define PIOS_INCLUDE_IAP //#define DEBUG_SSP /* Defaults for Logging */ diff --git a/flight/Bootloaders/PipXtreme/inc/pios_config.h b/flight/Bootloaders/PipXtreme/inc/pios_config.h index cec926057..1b1b9c2bc 100644 --- a/flight/Bootloaders/PipXtreme/inc/pios_config.h +++ b/flight/Bootloaders/PipXtreme/inc/pios_config.h @@ -40,6 +40,7 @@ #define PIOS_INCLUDE_USB_HID #define PIOS_INCLUDE_COM_MSG #define PIOS_INCLUDE_GPIO +#define PIOS_INCLUDE_IAP /* Defaults for Logging */ #define LOG_FILENAME "PIOS.LOG" diff --git a/flight/CopterControl/System/inc/pios_config.h b/flight/CopterControl/System/inc/pios_config.h index 54c5b3b22..6ca38bf2c 100644 --- a/flight/CopterControl/System/inc/pios_config.h +++ b/flight/CopterControl/System/inc/pios_config.h @@ -42,6 +42,7 @@ #endif #define PIOS_INCLUDE_IRQ #define PIOS_INCLUDE_LED +#define PIOS_INCLUDE_IAP #define PIOS_INCLUDE_RCVR diff --git a/flight/INS/inc/pios_config.h b/flight/INS/inc/pios_config.h index ae6561236..a13394179 100644 --- a/flight/INS/inc/pios_config.h +++ b/flight/INS/inc/pios_config.h @@ -51,6 +51,7 @@ #define PIOS_INCLUDE_IMU3000 #define PIOS_INCLUDE_GPIO #define PIOS_INCLUDE_EXTI +#define PIOS_INCLUDE_IAP #define PIOS_INCLUDE_BMA180 diff --git a/flight/Modules/System/systemmod.c b/flight/Modules/System/systemmod.c index bb3496b0f..29fb99791 100644 --- a/flight/Modules/System/systemmod.c +++ b/flight/Modules/System/systemmod.c @@ -48,8 +48,6 @@ #include "taskinfo.h" #include "watchdogstatus.h" #include "taskmonitor.h" -#include "pios_iap.h" - // Private constants #define SYSTEM_UPDATE_PERIOD_MS 1000 @@ -148,8 +146,10 @@ static void systemTask(void *parameters) PIOS_SYS_Reset(); } +#if defined(PIOS_INCLUDE_IAP) /* Record a successful boot */ PIOS_IAP_WriteBootCount(0); +#endif // Initialize vars idleCounter = 0; diff --git a/flight/OpenPilot/System/inc/pios_config.h b/flight/OpenPilot/System/inc/pios_config.h index ce0484a8d..f5227019f 100644 --- a/flight/OpenPilot/System/inc/pios_config.h +++ b/flight/OpenPilot/System/inc/pios_config.h @@ -41,6 +41,7 @@ #define PIOS_INCLUDE_I2C #define PIOS_INCLUDE_IRQ #define PIOS_INCLUDE_LED +#define PIOS_INCLUDE_IAP #define PIOS_INCLUDE_RCVR diff --git a/flight/PiOS/pios.h b/flight/PiOS/pios.h index 58d869517..4429c477a 100644 --- a/flight/PiOS/pios.h +++ b/flight/PiOS/pios.h @@ -112,7 +112,10 @@ #if defined(PIOS_INCLUDE_IMU3000) #include #endif + +#if defined(PIOS_INCLUDE_IAP) #include +#endif #if defined(PIOS_INCLUDE_ADXL345) #include From 0575b45378cc17d89ee4bb06819a5b4cc3fceea6 Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Sun, 15 Jan 2012 17:58:09 -0500 Subject: [PATCH 115/121] usb: make USB usage depend on PiOS config USB is not supported on sim platforms. Let PiOS config determine when we use it. --- flight/Modules/Telemetry/telemetry.c | 1 - flight/PiOS/pios.h | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/flight/Modules/Telemetry/telemetry.c b/flight/Modules/Telemetry/telemetry.c index d01085591..12818529f 100644 --- a/flight/Modules/Telemetry/telemetry.c +++ b/flight/Modules/Telemetry/telemetry.c @@ -35,7 +35,6 @@ #include "flighttelemetrystats.h" #include "gcstelemetrystats.h" #include "hwsettings.h" -#include "pios_usb.h" /* PIOS_USB_* */ // Private constants #define MAX_QUEUE_SIZE TELEM_QUEUE_SIZE diff --git a/flight/PiOS/pios.h b/flight/PiOS/pios.h index 4429c477a..e7d02dfd2 100644 --- a/flight/PiOS/pios.h +++ b/flight/PiOS/pios.h @@ -137,6 +137,7 @@ #if defined(PIOS_INCLUDE_USB) /* USB Libs */ #include +#include #endif #include From b05697c2cfcf5127e79b3bca554ede625cf45e0d Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Sun, 15 Jan 2012 18:02:38 -0500 Subject: [PATCH 116/121] taskinfo: ensure usage of TaskInfo uavo is covered by DIAG_TASKS OpenPilot platform (and thus sim too) was missed when the DIAG_TASKS macro was broken out from the DIAGNOSTICS macro. This allowed accesses to the TaskInfo UAVO even though it hadn't been initialized. --- flight/CopterControl/System/taskmonitor.c | 26 +++++++++++++++++++---- flight/Modules/System/systemmod.c | 3 +++ flight/OpenPilot/System/taskmonitor.c | 5 ++--- 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/flight/CopterControl/System/taskmonitor.c b/flight/CopterControl/System/taskmonitor.c index 627dedaab..fffc6435c 100644 --- a/flight/CopterControl/System/taskmonitor.c +++ b/flight/CopterControl/System/taskmonitor.c @@ -71,6 +71,24 @@ int32_t TaskMonitorAdd(TaskInfoRunningElem task, xTaskHandle handle) } } +/** + * Remove a task handle from the library + */ +int32_t TaskMonitorRemove(TaskInfoRunningElem task) +{ + if (task < TASKINFO_RUNNING_NUMELEM) + { + xSemaphoreTakeRecursive(lock, portMAX_DELAY); + handles[task] = 0; + xSemaphoreGiveRecursive(lock); + return 0; + } + else + { + return -1; + } +} + /** * Update the status of all tasks */ @@ -79,10 +97,10 @@ void TaskMonitorUpdateAll(void) #if defined(DIAG_TASKS) TaskInfoData data; int n; - + // Lock xSemaphoreTakeRecursive(lock, portMAX_DELAY); - + #if ( configGENERATE_RUN_TIME_STATS == 1 ) uint32_t currentTime; uint32_t deltaTime; @@ -121,10 +139,10 @@ void TaskMonitorUpdateAll(void) data.RunningTime[n] = 0; } } - + // Update object TaskInfoSet(&data); - + // Done xSemaphoreGiveRecursive(lock); #endif diff --git a/flight/Modules/System/systemmod.c b/flight/Modules/System/systemmod.c index 29fb99791..7e476f686 100644 --- a/flight/Modules/System/systemmod.c +++ b/flight/Modules/System/systemmod.c @@ -170,8 +170,11 @@ static void systemTask(void *parameters) updateI2Cstats(); updateWDGstats(); #endif + +#if defined(DIAG_TASKS) // Update the task status object TaskMonitorUpdateAll(); +#endif // Flash the heartbeat LED PIOS_LED_Toggle(LED1); diff --git a/flight/OpenPilot/System/taskmonitor.c b/flight/OpenPilot/System/taskmonitor.c index dcd08945c..fffc6435c 100644 --- a/flight/OpenPilot/System/taskmonitor.c +++ b/flight/OpenPilot/System/taskmonitor.c @@ -47,7 +47,7 @@ int32_t TaskMonitorInitialize(void) lock = xSemaphoreCreateRecursiveMutex(); memset(handles, 0, sizeof(xTaskHandle)*TASKINFO_RUNNING_NUMELEM); lastMonitorTime = 0; -#if defined(DIAGNOSTICS) +#if defined(DIAG_TASKS) lastMonitorTime = portGET_RUN_TIME_COUNTER_VALUE(); #endif return 0; @@ -94,7 +94,7 @@ int32_t TaskMonitorRemove(TaskInfoRunningElem task) */ void TaskMonitorUpdateAll(void) { -#if defined(DIAGNOSTICS) +#if defined(DIAG_TASKS) TaskInfoData data; int n; @@ -128,7 +128,6 @@ void TaskMonitorUpdateAll(void) #if ( configGENERATE_RUN_TIME_STATS == 1 ) /* Generate run time stats */ data.RunningTime[n] = uxTaskGetRunTime(handles[n]) / deltaTime; - #endif #endif From 387ea77d3091baaa1d4600d85919d2bc958c5ab8 Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Sun, 15 Jan 2012 18:06:35 -0500 Subject: [PATCH 117/121] diagnostics: enable DIAG_TASKS on OP board by default --- flight/CopterControl/Makefile | 6 +++--- flight/OpenPilot/Makefile | 9 +++++++-- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/flight/CopterControl/Makefile b/flight/CopterControl/Makefile index 891e7f6c6..c0e202453 100644 --- a/flight/CopterControl/Makefile +++ b/flight/CopterControl/Makefile @@ -436,15 +436,15 @@ CSTANDARD = -std=gnu99 # Flags for C and C++ (arm-elf-gcc/arm-elf-g++) ifeq ($(DEBUG),YES) -CFLAGS = -DDEBUG +CFLAGS += -DDEBUG endif ifeq ($(DIAGNOSTICS),YES) -CFLAGS = -DDIAGNOSTICS +CFLAGS += -DDIAGNOSTICS endif ifeq ($(DIAG_TASKS),YES) -CFLAGS = -DDIAG_TASKS +CFLAGS += -DDIAG_TASKS endif CFLAGS += -g$(DEBUGF) diff --git a/flight/OpenPilot/Makefile b/flight/OpenPilot/Makefile index 940c1f117..119762ce9 100644 --- a/flight/OpenPilot/Makefile +++ b/flight/OpenPilot/Makefile @@ -39,6 +39,7 @@ DEBUG ?= YES # Include objects that are just nice information to show DIAGNOSTICS ?= YES +DIAG_TASKS ?= YES # Set to YES to use the Servo output pins for debugging via scope or logic analyser ENABLE_DEBUG_PINS ?= NO @@ -395,11 +396,15 @@ CSTANDARD = -std=gnu99 # Flags for C and C++ (arm-elf-gcc/arm-elf-g++) ifeq ($(DEBUG),YES) -CFLAGS = -DDEBUG +CFLAGS += -DDEBUG endif ifeq ($(DIAGNOSTICS),YES) -CFLAGS = -DDIAGNOSTICS +CFLAGS += -DDIAGNOSTICS +endif + +ifeq ($(DIAG_TASKS),YES) +CFLAGS += -DDIAG_TASKS endif CFLAGS += -g$(DEBUGF) From 8cd4816d7b3ac4a5ad2a68d933b34f6ed478dfe5 Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Sun, 15 Jan 2012 21:37:10 -0500 Subject: [PATCH 118/121] taskmonitor: move taskmonitor into flight/Libraries taskmonitor.[ch] existed as (nearly) identical copies under CC and OP directories. Both builds now reference the common version under Libraries. --- flight/CopterControl/Makefile | 2 +- flight/CopterControl/System/inc/taskmonitor.h | 42 ----- .../System => Libraries}/inc/taskmonitor.h | 0 .../System => Libraries}/taskmonitor.c | 0 flight/OpenPilot/Makefile | 2 +- flight/OpenPilot/Makefile.posix | 2 +- flight/OpenPilot/System/taskmonitor.c | 149 ------------------ 7 files changed, 3 insertions(+), 194 deletions(-) delete mode 100644 flight/CopterControl/System/inc/taskmonitor.h rename flight/{OpenPilot/System => Libraries}/inc/taskmonitor.h (100%) rename flight/{CopterControl/System => Libraries}/taskmonitor.c (100%) delete mode 100644 flight/OpenPilot/System/taskmonitor.c diff --git a/flight/CopterControl/Makefile b/flight/CopterControl/Makefile index c0e202453..562e1d9de 100644 --- a/flight/CopterControl/Makefile +++ b/flight/CopterControl/Makefile @@ -136,7 +136,6 @@ SRC += ${OPMODULEDIR}/System/systemmod.c SRC += $(OPSYSTEM)/coptercontrol.c SRC += $(OPSYSTEM)/pios_board.c SRC += $(OPSYSTEM)/alarms.c -SRC += $(OPSYSTEM)/taskmonitor.c SRC += $(OPUAVTALK)/uavtalk.c SRC += $(OPUAVOBJ)/uavobjectmanager.c SRC += $(OPUAVOBJ)/eventdispatcher.c @@ -233,6 +232,7 @@ SRC += $(PIOSCOMMON)/printf-stdarg.c ## Libraries for flight calculations SRC += $(FLIGHTLIB)/fifo_buffer.c SRC += $(FLIGHTLIB)/CoordinateConversions.c +SRC += $(FLIGHTLIB)/taskmonitor.c ## CMSIS for STM32 SRC += $(CMSISDIR)/core_cm3.c diff --git a/flight/CopterControl/System/inc/taskmonitor.h b/flight/CopterControl/System/inc/taskmonitor.h deleted file mode 100644 index 511f552f7..000000000 --- a/flight/CopterControl/System/inc/taskmonitor.h +++ /dev/null @@ -1,42 +0,0 @@ -/** - ****************************************************************************** - * @addtogroup OpenPilotSystem OpenPilot System - * @{ - * @addtogroup OpenPilotLibraries OpenPilot System Libraries - * @{ - * @file taskmonitor.h - * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. - * @brief Include file of the task monitoring library - * @see The GNU Public License (GPL) Version 3 - * - *****************************************************************************/ -/* - * 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 - */ -#ifndef TASKMONITOR_H -#define TASKMONITOR_H - -#include "taskinfo.h" - -int32_t TaskMonitorInitialize(void); -int32_t TaskMonitorAdd(TaskInfoRunningElem task, xTaskHandle handle); -void TaskMonitorUpdateAll(void); - -#endif // TASKMONITOR_H - -/** - * @} - * @} - */ diff --git a/flight/OpenPilot/System/inc/taskmonitor.h b/flight/Libraries/inc/taskmonitor.h similarity index 100% rename from flight/OpenPilot/System/inc/taskmonitor.h rename to flight/Libraries/inc/taskmonitor.h diff --git a/flight/CopterControl/System/taskmonitor.c b/flight/Libraries/taskmonitor.c similarity index 100% rename from flight/CopterControl/System/taskmonitor.c rename to flight/Libraries/taskmonitor.c diff --git a/flight/OpenPilot/Makefile b/flight/OpenPilot/Makefile index 119762ce9..6e4bf6279 100644 --- a/flight/OpenPilot/Makefile +++ b/flight/OpenPilot/Makefile @@ -139,7 +139,6 @@ SRC += ${OPMODULEDIR}/System/systemmod.c SRC += $(OPSYSTEM)/openpilot.c SRC += $(OPSYSTEM)/pios_board.c SRC += $(OPSYSTEM)/alarms.c -SRC += $(OPSYSTEM)/taskmonitor.c SRC += $(OPUAVTALK)/uavtalk.c SRC += $(OPUAVOBJ)/uavobjectmanager.c SRC += $(OPUAVOBJ)/eventdispatcher.c @@ -208,6 +207,7 @@ SRC += $(FLIGHTLIB)/ahrs_comm_objects.c SRC += $(FLIGHTLIB)/fifo_buffer.c SRC += $(FLIGHTLIB)/WorldMagModel.c SRC += $(FLIGHTLIB)/CoordinateConversions.c +SRC += $(FLIGHTLIB)/taskmonitor.c ## CMSIS for STM32 SRC += $(CMSISDIR)/core_cm3.c diff --git a/flight/OpenPilot/Makefile.posix b/flight/OpenPilot/Makefile.posix index 4a947ae8d..5fbc66b4b 100644 --- a/flight/OpenPilot/Makefile.posix +++ b/flight/OpenPilot/Makefile.posix @@ -149,7 +149,6 @@ SRC += ${OPMODULEDIR}/System/systemmod.c SRC += $(OPSYSTEM)/openpilot.c SRC += $(OPSYSTEM)/pios_board_posix.c SRC += $(OPSYSTEM)/alarms.c -SRC += $(OPSYSTEM)/taskmonitor.c SRC += $(OPUAVTALK)/uavtalk.c SRC += $(OPUAVOBJ)/uavobjectmanager.c SRC += $(OPUAVOBJ)/eventdispatcher.c @@ -189,6 +188,7 @@ SRC += $(PIOSPOSIX)/pios_rcvr.c SRC += $(FLIGHTLIB)/fifo_buffer.c SRC += $(FLIGHTLIB)/WorldMagModel.c SRC += $(FLIGHTLIB)/CoordinateConversions.c +SRC += $(FLIGHTLIB)/taskmonitor.c ## RTOS and RTOS Portable SRC += $(RTOSSRCDIR)/list.c SRC += $(RTOSSRCDIR)/queue.c diff --git a/flight/OpenPilot/System/taskmonitor.c b/flight/OpenPilot/System/taskmonitor.c deleted file mode 100644 index fffc6435c..000000000 --- a/flight/OpenPilot/System/taskmonitor.c +++ /dev/null @@ -1,149 +0,0 @@ -/** - ****************************************************************************** - * @addtogroup OpenPilotSystem OpenPilot System - * @{ - * @addtogroup OpenPilotLibraries OpenPilot System Libraries - * @{ - * @file taskmonitor.h - * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. - * @brief Task monitoring library - * @see The GNU Public License (GPL) Version 3 - * - *****************************************************************************/ -/* - * 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 - */ -#include "openpilot.h" -//#include "taskmonitor.h" - -// Private constants - -// Private types - -// Private variables -static xSemaphoreHandle lock; -static xTaskHandle handles[TASKINFO_RUNNING_NUMELEM]; -static uint32_t lastMonitorTime; - -// Private functions - -/** - * Initialize library - */ -int32_t TaskMonitorInitialize(void) -{ - lock = xSemaphoreCreateRecursiveMutex(); - memset(handles, 0, sizeof(xTaskHandle)*TASKINFO_RUNNING_NUMELEM); - lastMonitorTime = 0; -#if defined(DIAG_TASKS) - lastMonitorTime = portGET_RUN_TIME_COUNTER_VALUE(); -#endif - return 0; -} - -/** - * Register a task handle with the library - */ -int32_t TaskMonitorAdd(TaskInfoRunningElem task, xTaskHandle handle) -{ - if (task < TASKINFO_RUNNING_NUMELEM) - { - xSemaphoreTakeRecursive(lock, portMAX_DELAY); - handles[task] = handle; - xSemaphoreGiveRecursive(lock); - return 0; - } - else - { - return -1; - } -} - -/** - * Remove a task handle from the library - */ -int32_t TaskMonitorRemove(TaskInfoRunningElem task) -{ - if (task < TASKINFO_RUNNING_NUMELEM) - { - xSemaphoreTakeRecursive(lock, portMAX_DELAY); - handles[task] = 0; - xSemaphoreGiveRecursive(lock); - return 0; - } - else - { - return -1; - } -} - -/** - * Update the status of all tasks - */ -void TaskMonitorUpdateAll(void) -{ -#if defined(DIAG_TASKS) - TaskInfoData data; - int n; - - // Lock - xSemaphoreTakeRecursive(lock, portMAX_DELAY); - -#if ( configGENERATE_RUN_TIME_STATS == 1 ) - uint32_t currentTime; - uint32_t deltaTime; - - /* - * Calculate the amount of elapsed run time between the last time we - * measured and now. Scale so that we can convert task run times - * directly to percentages. - */ - currentTime = portGET_RUN_TIME_COUNTER_VALUE(); - deltaTime = ((currentTime - lastMonitorTime) / 100) ? : 1; /* avoid divide-by-zero if the interval is too small */ - lastMonitorTime = currentTime; -#endif - - // Update all task information - for (n = 0; n < TASKINFO_RUNNING_NUMELEM; ++n) - { - if (handles[n] != 0) - { - data.Running[n] = TASKINFO_RUNNING_TRUE; -#if defined(ARCH_POSIX) || defined(ARCH_WIN32) - data.StackRemaining[n] = 10000; -#else - data.StackRemaining[n] = uxTaskGetStackHighWaterMark(handles[n]) * 4; -#if ( configGENERATE_RUN_TIME_STATS == 1 ) - /* Generate run time stats */ - data.RunningTime[n] = uxTaskGetRunTime(handles[n]) / deltaTime; -#endif -#endif - - } - else - { - data.Running[n] = TASKINFO_RUNNING_FALSE; - data.StackRemaining[n] = 0; - data.RunningTime[n] = 0; - } - } - - // Update object - TaskInfoSet(&data); - - // Done - xSemaphoreGiveRecursive(lock); -#endif -} From 3bda0f450d112df41b2d47921a8f5fa439d047ff Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Sun, 15 Jan 2012 23:04:31 -0500 Subject: [PATCH 119/121] bootfault: force fault when no telemetry available on OP too If no telemetry link is configured, this will force the board to reset before finishing init. The BootFault logic will catch this after 3 resets and will boot with default hwsettings on the next reset. This won't currently ever fire on OP though since we always configure the serial telemetry interface. This just makes sure the pattern is present in case anyone decides to compile without serial telemetry. --- flight/OpenPilot/System/pios_board.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/flight/OpenPilot/System/pios_board.c b/flight/OpenPilot/System/pios_board.c index 8dbb5eee2..0fb873f0a 100644 --- a/flight/OpenPilot/System/pios_board.c +++ b/flight/OpenPilot/System/pios_board.c @@ -1450,6 +1450,9 @@ void PIOS_Board_Init(void) { PIOS_Assert(0); } #endif /* PIOS_INCLUDE_I2C */ + + /* Make sure we have at least one telemetry link configured or else fail initialization */ + PIOS_Assert(pios_com_telem_rf_id || pios_com_telem_usb_id); } /** From ee0895aa77c7cf198c1850f5c302c659f124ef17 Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Mon, 16 Jan 2012 21:31:07 -0500 Subject: [PATCH 120/121] usb hid: remove stale files from pipx These files are no longer relevent for USB configuration. --- flight/PipXtreme/inc/pios_usb_hid_desc.h | 56 ------ flight/PipXtreme/pios_usb_hid_desc.c | 220 ----------------------- 2 files changed, 276 deletions(-) delete mode 100644 flight/PipXtreme/inc/pios_usb_hid_desc.h delete mode 100644 flight/PipXtreme/pios_usb_hid_desc.c diff --git a/flight/PipXtreme/inc/pios_usb_hid_desc.h b/flight/PipXtreme/inc/pios_usb_hid_desc.h deleted file mode 100644 index 4810c1274..000000000 --- a/flight/PipXtreme/inc/pios_usb_hid_desc.h +++ /dev/null @@ -1,56 +0,0 @@ -/******************** (C) COPYRIGHT 2010 STMicroelectronics ******************** -* File Name : usb_desc.h -* Author : MCD Application Team -* Version : V3.2.1 -* Date : 07/05/2010 -* Description : Descriptor Header for Custom HID Demo -******************************************************************************** -* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_DESC_H -#define __USB_DESC_H - -/* Includes ------------------------------------------------------------------*/ -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/* Exported macro ------------------------------------------------------------*/ -/* Exported define -----------------------------------------------------------*/ -#define USB_DEVICE_DESCRIPTOR_TYPE 0x01 -#define USB_CONFIGURATION_DESCRIPTOR_TYPE 0x02 -#define USB_STRING_DESCRIPTOR_TYPE 0x03 -#define USB_INTERFACE_DESCRIPTOR_TYPE 0x04 -#define USB_ENDPOINT_DESCRIPTOR_TYPE 0x05 - -#define HID_DESCRIPTOR_TYPE 0x21 -#define PIOS_HID_SIZ_HID_DESC 0x09 -#define PIOS_HID_OFF_HID_DESC 0x12 - -#define PIOS_HID_SIZ_DEVICE_DESC 18 -#define PIOS_HID_SIZ_CONFIG_DESC 41 -#define PIOS_HID_SIZ_REPORT_DESC 36 -#define PIOS_HID_SIZ_STRING_LANGID 4 -#define PIOS_HID_SIZ_STRING_VENDOR 28 -#define PIOS_HID_SIZ_STRING_PRODUCT 20 -#define PIOS_HID_SIZ_STRING_SERIAL 52 /* 96 bits, 12 bytes, 24 characters, 48 in unicode */ - -#define STANDARD_ENDPOINT_DESC_SIZE 0x09 - -/* Exported functions ------------------------------------------------------- */ -extern const uint8_t PIOS_HID_DeviceDescriptor[PIOS_HID_SIZ_DEVICE_DESC]; -extern const uint8_t PIOS_HID_ConfigDescriptor[PIOS_HID_SIZ_CONFIG_DESC]; -extern const uint8_t PIOS_HID_ReportDescriptor[PIOS_HID_SIZ_REPORT_DESC]; -extern const uint8_t PIOS_HID_StringLangID[PIOS_HID_SIZ_STRING_LANGID]; -extern const uint8_t PIOS_HID_StringVendor[PIOS_HID_SIZ_STRING_VENDOR]; -extern const uint8_t PIOS_HID_StringProduct[PIOS_HID_SIZ_STRING_PRODUCT]; -extern uint8_t PIOS_HID_StringSerial[PIOS_HID_SIZ_STRING_SERIAL]; - -#endif /* __USB_DESC_H */ - -/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/ diff --git a/flight/PipXtreme/pios_usb_hid_desc.c b/flight/PipXtreme/pios_usb_hid_desc.c deleted file mode 100644 index c15a80551..000000000 --- a/flight/PipXtreme/pios_usb_hid_desc.c +++ /dev/null @@ -1,220 +0,0 @@ -/******************** (C) COPYRIGHT 2010 STMicroelectronics ******************** -* File Name : usb_desc.c -* Author : MCD Application Team -* Version : V3.2.1 -* Date : 07/05/2010 -* Description : Descriptors for Custom HID Demo -******************************************************************************** -* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS -* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. -* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, -* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE -* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING -* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. -*******************************************************************************/ - -#include "usb_lib.h" -#include "pios_usb.h" -#include "pios_usb_hid.h" -#include "pios_usb_hid_desc.h" - -// ************************************************* -// USB Standard Device Descriptor - -const uint8_t PIOS_HID_DeviceDescriptor[PIOS_HID_SIZ_DEVICE_DESC] = - { - 0x12, // bLength - USB_DEVICE_DESCRIPTOR_TYPE, // bDescriptorType - 0x00, // bcdUSB - 0x02, - 0x00, // bDeviceClass - 0x00, // bDeviceSubClass - 0x00, // bDeviceProtocol - 0x40, // bMaxPacketSize40 - (uint8_t)((PIOS_USB_VENDOR_ID) & 0xff), // idVendor - (uint8_t)((PIOS_USB_VENDOR_ID) >> 8), - (uint8_t)((PIOS_USB_PRODUCT_ID) & 0xff), // idProduct - (uint8_t)((PIOS_USB_PRODUCT_ID) >> 8), - (uint8_t)((PIOS_USB_VERSION_ID) & 0xff), // bcdDevice - (uint8_t)((PIOS_USB_VERSION_ID) >> 8), - 0x01, // Index of string descriptor describing manufacturer - 0x02, // Index of string descriptor describing product - 0x03, // Index of string descriptor describing the device serial number - 0x01 // bNumConfigurations - }; - -// ************************************************* -// USB Configuration Descriptor -// All Descriptors (Configuration, Interface, Endpoint, Class, Vendor - -const uint8_t PIOS_HID_ConfigDescriptor[PIOS_HID_SIZ_CONFIG_DESC] = - { - 0x09, // bLength: Configuation Descriptor size - USB_CONFIGURATION_DESCRIPTOR_TYPE, // bDescriptorType: Configuration - PIOS_HID_SIZ_CONFIG_DESC, - // wTotalLength: Bytes returned - 0x00, - 0x01, // bNumInterfaces: 1 interface - 0x01, // bConfigurationValue: Configuration value - 0x00, // iConfiguration: Index of string descriptor describing the configuration - 0xC0, // bmAttributes: Bus powered - 0x7D, // MaxPower 250 mA - needed to power the RF transmitter - - // ************** Descriptor of Custom HID interface **************** - // 09 - 0x09, // bLength: Interface Descriptor size - USB_INTERFACE_DESCRIPTOR_TYPE, // bDescriptorType: Interface descriptor type - 0x00, // bInterfaceNumber: Number of Interface - 0x00, // bAlternateSetting: Alternate setting - 0x02, // bNumEndpoints - 0x03, // bInterfaceClass: HID - 0x00, // bInterfaceSubClass : 1=BOOT, 0=no boot - 0x00, // nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse - 0, // iInterface: Index of string descriptor - - // ******************** Descriptor of Custom HID HID ******************** - // 18 - 0x09, // bLength: HID Descriptor size - HID_DESCRIPTOR_TYPE, // bDescriptorType: HID - 0x10, // bcdHID: HID Class Spec release number - 0x01, - 0x00, // bCountryCode: Hardware target country - 0x01, // bNumDescriptors: Number of HID class descriptors to follow - 0x22, // bDescriptorType - PIOS_HID_SIZ_REPORT_DESC, // wItemLength: Total length of Report descriptor - 0x00, - - // ******************** Descriptor of Custom HID endpoints ****************** - // 27 - 0x07, // bLength: Endpoint Descriptor size - USB_ENDPOINT_DESCRIPTOR_TYPE, // bDescriptorType: - - 0x81, // bEndpointAddress: Endpoint Address (IN) - 0x03, // bmAttributes: Interrupt endpoint - 0x40, // wMaxPacketSize: 2 Bytes max - 0x00, - 0x04, // bInterval: Polling Interval in ms - // 34 - - 0x07, // bLength: Endpoint Descriptor size - USB_ENDPOINT_DESCRIPTOR_TYPE, // bDescriptorType: - // Endpoint descriptor type - 0x01, // bEndpointAddress: - // Endpoint Address (OUT) - 0x03, // bmAttributes: Interrupt endpoint - 0x40, // wMaxPacketSize: 2 Bytes max - 0x00, - 0x04, // bInterval: Polling Interval in ms - // 41 - }; - -// ************************************************* - - const uint8_t PIOS_HID_ReportDescriptor[PIOS_HID_SIZ_REPORT_DESC] = - { - 0x06, 0x9c, 0xff, // USAGE_PAGE (Vendor Page: 0xFF00) - 0x09, 0x01, // USAGE (Demo Kit) - 0xa1, 0x01, // COLLECTION (Application) - // 6 - - // Data 1 - 0x85, 0x01, // REPORT_ID (1) - 0x09, 0x02, // USAGE (LED 1) - 0x15, 0x00, // LOGICAL_MINIMUM (0) - 0x25, 0xff, // LOGICAL_MAXIMUM (255) - 0x75, 0x08, // REPORT_SIZE (8) - 0x95, PIOS_USB_COM_DATA_LENGTH+1, // REPORT_COUNT (1) - 0x81, 0x83, // INPUT (Const,Var,Array) - // 20 - - // Data 1 - 0x85, 0x02, // REPORT_ID (2) - 0x09, 0x03, // USAGE (LED 1) - 0x15, 0x00, // LOGICAL_MINIMUM (0) - 0x25, 0xff, // LOGICAL_MAXIMUM (255) - 0x75, 0x08, // REPORT_SIZE (8) - 0x95, PIOS_USB_COM_DATA_LENGTH+1, // REPORT_COUNT (1) - 0x91, 0x82, // OUTPUT (Data,Var,Abs,Vol) - // 34 - - 0xc0 // END_COLLECTION - }; - -// ************************************************* -// USB String Descriptors (optional) - -const uint8_t PIOS_HID_StringLangID[PIOS_HID_SIZ_STRING_LANGID] = - { - PIOS_HID_SIZ_STRING_LANGID, - USB_STRING_DESCRIPTOR_TYPE, - 0x09, 0x08 // LangID = 0x0809: UK. English -// 0x09, 0x04 // LangID = 0x0409: U.S. English - }; - -const uint8_t PIOS_HID_StringVendor[PIOS_HID_SIZ_STRING_VENDOR] = - { - PIOS_HID_SIZ_STRING_VENDOR, // Size of Vendor string - USB_STRING_DESCRIPTOR_TYPE, // bDescriptorType - // Manufacturer: "STMicroelectronics" - 'o', 0, - 'p', 0, - 'e', 0, - 'n', 0, - 'p', 0, - 'i', 0, - 'l', 0, - 'o', 0, - 't', 0, - '.', 0, - 'o', 0, - 'r', 0, - 'g', 0 - }; - -const uint8_t PIOS_HID_StringProduct[PIOS_HID_SIZ_STRING_PRODUCT] = - { - PIOS_HID_SIZ_STRING_PRODUCT, // bLength - USB_STRING_DESCRIPTOR_TYPE, // bDescriptorType - 'P', 0, - 'i', 0, - 'p', 0, - 'X', 0, - 't', 0, - 'r', 0, - 'e', 0, - 'm', 0, - 'e', 0 - }; - -uint8_t PIOS_HID_StringSerial[PIOS_HID_SIZ_STRING_SERIAL] = - { - PIOS_HID_SIZ_STRING_SERIAL, // bLength - USB_STRING_DESCRIPTOR_TYPE, // bDescriptorType - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0, - 0, 0 - }; - -// ************************************************* From bffb184b7a62d3036f6c264fd3a0d60bfc0b3479 Mon Sep 17 00:00:00 2001 From: Stacey Sheldon Date: Mon, 16 Jan 2012 21:32:52 -0500 Subject: [PATCH 121/121] usb: add standard boilerplate to new files --- flight/PiOS/inc/pios_usb_board_data_priv.h | 39 +++++++++++++++++++ flight/PiOS/inc/pios_usb_desc_hid_cdc_priv.h | 34 ++++++++++++++++ flight/PiOS/inc/pios_usb_desc_hid_only_priv.h | 34 ++++++++++++++++ 3 files changed, 107 insertions(+) diff --git a/flight/PiOS/inc/pios_usb_board_data_priv.h b/flight/PiOS/inc/pios_usb_board_data_priv.h index 49166c25f..f4e7f7c05 100644 --- a/flight/PiOS/inc/pios_usb_board_data_priv.h +++ b/flight/PiOS/inc/pios_usb_board_data_priv.h @@ -1 +1,40 @@ +/** + ****************************************************************************** + * @addtogroup PIOS PIOS Core hardware abstraction layer + * @{ + * @addtogroup PIOS_USB_BOARD USB board layer functions + * @{ + * + * @file pios_usb_board_data_priv.h + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. + * @brief Defines the API to the board-specific USB data setup code + * @see The GNU Public License (GPL) Version 3 + * + *****************************************************************************/ +/* + * 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 + */ + +#ifndef PIOS_USB_BOARD_DATA_PRIV_H +#define PIOS_USB_BOARD_DATA_PRIV_H + extern int32_t PIOS_USB_BOARD_DATA_Init(void); + +#endif /* PIOS_USB_BOARD_DATA_PRIV_H */ + +/** + * @} + * @} + */ diff --git a/flight/PiOS/inc/pios_usb_desc_hid_cdc_priv.h b/flight/PiOS/inc/pios_usb_desc_hid_cdc_priv.h index 4836f4569..2ae94c74e 100644 --- a/flight/PiOS/inc/pios_usb_desc_hid_cdc_priv.h +++ b/flight/PiOS/inc/pios_usb_desc_hid_cdc_priv.h @@ -1,3 +1,32 @@ +/** + ****************************************************************************** + * @addtogroup PIOS PIOS Core hardware abstraction layer + * @{ + * @addtogroup PIOS_USB_DESC USB descriptor layer functions + * @{ + * + * @file pios_usb_desc_hid_cdc_priv.h + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. + * @brief Defines the API to set up the HID + CDC USB descriptor config + * @see The GNU Public License (GPL) Version 3 + * + *****************************************************************************/ +/* + * 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 + */ + #ifndef PIOS_USB_DESC_HID_CDC_PRIV_H #define PIOS_USB_DESC_HID_CDC_PRIV_H @@ -6,3 +35,8 @@ extern int32_t PIOS_USB_DESC_HID_CDC_Init(void); #endif /* PIOS_USB_DESC_HID_CDC_PRIV_H */ + +/** + * @} + * @} + */ diff --git a/flight/PiOS/inc/pios_usb_desc_hid_only_priv.h b/flight/PiOS/inc/pios_usb_desc_hid_only_priv.h index 5d161d233..321d15efa 100644 --- a/flight/PiOS/inc/pios_usb_desc_hid_only_priv.h +++ b/flight/PiOS/inc/pios_usb_desc_hid_only_priv.h @@ -1,3 +1,32 @@ +/** + ****************************************************************************** + * @addtogroup PIOS PIOS Core hardware abstraction layer + * @{ + * @addtogroup PIOS_USB_DESC USB descriptor layer functions + * @{ + * + * @file pios_usb_desc_hid_only_priv.h + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. + * @brief Defines the API to set up the HID-only USB descriptor config + * @see The GNU Public License (GPL) Version 3 + * + *****************************************************************************/ +/* + * 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 + */ + #ifndef PIOS_USB_DESC_HID_ONLY_PRIV_H #define PIOS_USB_DESC_HID_ONLY_PRIV_H @@ -6,3 +35,8 @@ extern int32_t PIOS_USB_DESC_HID_ONLY_Init(void); #endif /* PIOS_USB_DESC_HID_ONLY_PRIV_H */ + +/** + * @} + * @} + */