This repository has been archived on 2026-05-31. You can view files and clone it, but cannot push or open issues or pull requests.
powersync-app/nymea-app/nfchelper.cpp
2020-10-12 15:02:23 +02:00

87 lines
2.5 KiB
C++

#include "nfchelper.h"
#include "types/deviceclass.h"
#include "types/statetype.h"
#include <QNearFieldManager>
#include <QNdefMessage>
#include <QDebug>
#include <QNdefNfcUriRecord>
#include <QUrl>
#include <QUrlQuery>
NfcHelper::NfcHelper(QObject *parent) : QObject(parent)
{
m_manager = new QNearFieldManager(this);
connect(m_manager, &QNearFieldManager::targetDetected, this, &NfcHelper::targetDetected);
connect(m_manager, &QNearFieldManager::targetLost, this, &NfcHelper::targetLost);
}
bool NfcHelper::busy() const
{
return m_busy;
}
void NfcHelper::writeThingStates(Engine *engine, Device *thing)
{
if (m_busy) {
return;
}
QUrl url;
url.setScheme("nymea");
url.setHost(engine->jsonRpcClient()->currentHost()->uuid().toString().remove(QRegExp("[{}]")) + "." + thing->id().toString().remove(QRegExp("[{}]")));
QUrlQuery query;
for (int i = 0; i < thing->thingClass()->stateTypes()->rowCount(); i++) {
StateType *stateType = thing->thingClass()->stateTypes()->get(i);
ActionType *actionType = thing->thingClass()->actionTypes()->getActionType(stateType->id());
if (!actionType) {
continue; // Read only state
}
QVariant currentValue = thing->states()->getState(stateType->id())->value();
query.addQueryItem(stateType->id().toString().remove(QRegExp("[{}]")), currentValue.toString());
}
url.setQuery(query);
qDebug() << "writing message" << url;
QNdefNfcUriRecord record;
record.setUri(url);
QNdefMessage message;
message.append(record);
m_currentMessage = message;
m_manager->startTargetDetection();
m_busy = true;
emit busyChanged();
}
void NfcHelper::targetDetected(QNearFieldTarget *target)
{
connect(target, &QNearFieldTarget::ndefMessagesWritten, this, &NfcHelper::ndefMessageWritten);
connect(target, &QNearFieldTarget::error, this, &NfcHelper::targetError);
QNearFieldTarget::RequestId m_request = target->writeNdefMessages(QList<QNdefMessage>() << m_currentMessage);
if (!m_request.isValid()) {
qDebug() << "Error writing tag";
//targetError(QNearFieldTarget::NdefWriteError, m_request);
}
}
void NfcHelper::targetLost(QNearFieldTarget *target)
{
qDebug() << "Target lost" << target;
}
void NfcHelper::ndefMessageWritten()
{
qDebug() << "NDEF message written";
m_manager->stopTargetDetection();
m_busy = false;
emit busyChanged();
}
void NfcHelper::targetError()
{
qDebug() << "Target error";
}