summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMartin Leutelt <martin.leutelt@basyskom.com>2014-10-16 11:34:26 +0200
committerMartin Leutelt <martin.leutelt@basyskom.com>2014-10-17 09:04:15 +0200
commit8a39bc14ae2be320621132682d1bc575162ff69e (patch)
treecf4ae73bb32ffdbbf0470f8b902f1f43e2113d95 /src
parentcad026d8bc9c12ce775cea5d947063e36bb79608 (diff)
Extend QML NearField item to support neard
The property 'polling' has been added to query the current state and to allow the user to start and stop target detection. The signals 'tagFound' and 'tagRemoved' have been added to allow the user to react to those events. Change-Id: Ieb07b5b799679982429a66f1790fa9985c55a24d Reviewed-by: Alex Blasche <alexander.blasche@digia.com>
Diffstat (limited to 'src')
-rw-r--r--src/imports/nfc/qdeclarativenearfield.cpp98
-rw-r--r--src/imports/nfc/qdeclarativenearfield_p.h11
2 files changed, 103 insertions, 6 deletions
diff --git a/src/imports/nfc/qdeclarativenearfield.cpp b/src/imports/nfc/qdeclarativenearfield.cpp
index b1aeced7..ffba30d0 100644
--- a/src/imports/nfc/qdeclarativenearfield.cpp
+++ b/src/imports/nfc/qdeclarativenearfield.cpp
@@ -49,6 +49,8 @@
#include <qndefnfctextrecord.h>
#include <qndefnfcurirecord.h>
+#include <QtNfc/QNearFieldTarget>
+
/*!
\qmltype NearField
\instantiates QDeclarativeNearField
@@ -69,6 +71,9 @@
and \l orderMatch properties to match the required NDEF messages. Once an NDEF message is
successfully read from a tag the \l messageRecords property is updated.
+ \note For platforms using neard filtering is currently not implemented. For more information
+ on neard see \relates QNearFieldManager.
+
\snippet doc_src_qtnfc.qml QML register for messages
*/
@@ -85,6 +90,8 @@
set to NDEF messages which match the filter. If no filter is set, a message handler for
all NDEF messages will be registered.
+ \note Filtering is not supported when using neard.
+
\l QNearFieldManager::registerNdefMessageHandler()
*/
@@ -92,13 +99,44 @@
\qmlproperty bool NearField::orderMatch
This property indicates whether the order of records should be taken into account when matching
- messages.
+ messages. This is not supported when using neard.
+*/
+
+/*!
+ \qmlproperty bool NearField::polling
+
+ This property indicates if the underlying adapter is currently in polling state. If set to \c true
+ the adapter will start polling and stop polling if set to \c false.
+
+ \note On platforms using neard, the adapter will stop polling as soon as a tag has been detected.
+ For more information see \relates QNearFieldManager.
+*/
+
+/*!
+ \qmlsignal NearField::tagFound()
+
+ This signal will be emitted when a tag has been detected.
+*/
+
+/*!
+ \qmlsignal NearField::tagRemoved()
+
+ This signal will be emitted when a tag has been removed.
*/
QDeclarativeNearField::QDeclarativeNearField(QObject *parent)
-: QObject(parent), m_orderMatch(false), m_componentCompleted(false), m_messageUpdating(false),
- m_manager(0), m_messageHandlerId(-1)
+ : QObject(parent),
+ m_orderMatch(false),
+ m_componentCompleted(false),
+ m_messageUpdating(false),
+ m_manager(new QNearFieldManager(this)),
+ m_messageHandlerId(-1),
+ m_polling(false)
{
+ connect(m_manager, SIGNAL(targetDetected(QNearFieldTarget*)),
+ this, SLOT(_q_handleTargetDetected(QNearFieldTarget*)));
+ connect(m_manager, SIGNAL(targetLost(QNearFieldTarget*)),
+ this, SLOT(_q_handleTargetLost(QNearFieldTarget*)));
}
QQmlListProperty<QQmlNdefRecord> QDeclarativeNearField::messageRecords()
@@ -141,11 +179,30 @@ void QDeclarativeNearField::componentComplete()
registerMessageHandler();
}
-void QDeclarativeNearField::registerMessageHandler()
+bool QDeclarativeNearField::polling() const
+{
+ return m_polling;
+}
+
+void QDeclarativeNearField::setPolling(bool on)
{
- if (!m_manager)
- m_manager = new QNearFieldManager(this);
+ if (m_polling == on)
+ return;
+
+ if (on) {
+ if (m_manager->startTargetDetection()) {
+ m_polling = true;
+ emit pollingChanged();
+ }
+ } else {
+ m_manager->stopTargetDetection();
+ m_polling = false;
+ emit pollingChanged();
+ }
+}
+void QDeclarativeNearField::registerMessageHandler()
+{
if (m_messageHandlerId != -1)
m_manager->unregisterNdefMessageHandler(m_messageHandlerId);
@@ -160,6 +217,12 @@ void QDeclarativeNearField::registerMessageHandler()
}
m_messageHandlerId = m_manager->registerNdefMessageHandler(ndefFilter, this, SLOT(_q_handleNdefMessage(QNdefMessage)));
+
+ // FIXME: if a message handler has been registered we just assume that constant polling is done
+ if (m_messageHandlerId >= 0) {
+ m_polling = true;
+ emit pollingChanged();
+ }
}
void QDeclarativeNearField::_q_handleNdefMessage(const QNdefMessage &message)
@@ -178,6 +241,29 @@ void QDeclarativeNearField::_q_handleNdefMessage(const QNdefMessage &message)
emit messageRecordsChanged();
}
+void QDeclarativeNearField::_q_handleTargetLost(QNearFieldTarget *target)
+{
+ Q_UNUSED(target);
+ // FIXME: only notify that polling stopped when there is no registered message handler
+ if (m_messageHandlerId == -1) {
+ m_polling = false;
+ emit pollingChanged();
+ }
+
+ emit tagRemoved();
+}
+
+void QDeclarativeNearField::_q_handleTargetDetected(QNearFieldTarget *target)
+{
+ Q_UNUSED(target);
+
+ if (m_messageHandlerId == -1) {
+ connect(target, SIGNAL(ndefMessageRead(QNdefMessage)),
+ this, SLOT(_q_handleNdefMessage(QNdefMessage)));
+ target->readNdefMessages();
+ }
+}
+
void QDeclarativeNearField::append_messageRecord(QQmlListProperty<QQmlNdefRecord> *list,
QQmlNdefRecord *record)
{
diff --git a/src/imports/nfc/qdeclarativenearfield_p.h b/src/imports/nfc/qdeclarativenearfield_p.h
index 14a6d986..af6b947c 100644
--- a/src/imports/nfc/qdeclarativenearfield_p.h
+++ b/src/imports/nfc/qdeclarativenearfield_p.h
@@ -60,6 +60,7 @@ class QDeclarativeNearField : public QObject, public QQmlParserStatus
Q_PROPERTY(QQmlListProperty<QQmlNdefRecord> messageRecords READ messageRecords NOTIFY messageRecordsChanged)
Q_PROPERTY(QQmlListProperty<QDeclarativeNdefFilter> filter READ filter NOTIFY filterChanged)
Q_PROPERTY(bool orderMatch READ orderMatch WRITE setOrderMatch NOTIFY orderMatchChanged)
+ Q_PROPERTY(bool polling READ polling WRITE setPolling NOTIFY pollingChanged)
Q_INTERFACES(QQmlParserStatus)
@@ -77,13 +78,22 @@ public:
void classBegin() { }
void componentComplete();
+ bool polling() const;
+ void setPolling(bool on);
+
signals:
void messageRecordsChanged();
void filterChanged();
void orderMatchChanged();
+ void pollingChanged();
+
+ void tagFound();
+ void tagRemoved();
private slots:
void _q_handleNdefMessage(const QNdefMessage &message);
+ void _q_handleTargetLost(QNearFieldTarget*);
+ void _q_handleTargetDetected(QNearFieldTarget*);
private:
QList<QQmlNdefRecord *> m_message;
@@ -94,6 +104,7 @@ private:
QNearFieldManager *m_manager;
int m_messageHandlerId;
+ bool m_polling;
void registerMessageHandler();