diff options
Diffstat (limited to 'smartpen.cc')
-rw-r--r-- | smartpen.cc | 77 |
1 files changed, 50 insertions, 27 deletions
diff --git a/smartpen.cc b/smartpen.cc index ce26a31..12e2ac2 100644 --- a/smartpen.cc +++ b/smartpen.cc @@ -16,7 +16,7 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#include <QtCore/QDateTime> +#include <QtCore/QDataStream> #include <QtCore/QDebug> #include <QtCore/QDeadlineTimer> #include <QtCore/QThread> @@ -26,7 +26,6 @@ #include "xmlutils.h" #include "smartpen.h" -#define PEN_EPOCH (1289335960000LL) #define PEN_MTU OBEX_MAXIMUM_MTU #define PEN_TIMEOUT_SECONDS 5 @@ -86,9 +85,9 @@ QByteArray Smartpen::getObject(const QString &name) return result; } -QString Smartpen::getParameter(Parameters parameter) +QByteArray Smartpen::getParameter(Parameter parameter) { - QString objectName = QString("ppdata?key=pp%1").arg(uint(parameter), 4, 16); + QString objectName = QString("ppdata?key=pp%1").arg(uint(parameter), 4, 16, QChar('0')); QByteArray data = getObject(objectName); QXmlStreamReader r(data); @@ -97,21 +96,56 @@ QString Smartpen::getParameter(Parameters parameter) if (!r.atEnd()) { QXmlStreamAttributes attrs = r.attributes(); - return attrs.value("value").toString(); + QString value = attrs.value("value").toString(); + if (!value.isEmpty()) { + if (value.startsWith("0x")) { + return QByteArray::fromHex(value.mid(2).toLatin1()); + } else { + qWarning() << "Unknown parameter return format: " << value; + } + } } - return QString(); + return QByteArray(); } -QString Smartpen::getPenName() +Smartpen::PenId Smartpen::getPenId() { - QString name = getParameter(PenName); - if (name.isEmpty()) { - return name; // Empty string if unknown name + PenId id; + QByteArray value = getParameter(Parameter::Id); + if (value.isEmpty() || value.size() != 1 + sizeof(Smartpen::PenId)) { + qWarning() << "got invalid value for pen id: " << value.toHex(); + return 0; } + QDataStream ds(value); + ds.setByteOrder(QDataStream::BigEndian); + ds.skipRawData(1); // Unclear what first byte is + ds >> id; + return id; +} - QByteArray hex = QByteArray::fromHex(name.mid(2).toLatin1()); - return QString::fromUtf8(hex); +QString Smartpen::getPenSerial() +{ + return toPenSerial(getPenId()); +} + +QString Smartpen::getPenName() +{ + return QString::fromUtf8(getParameter(Parameter::Name)); +} + +Smartpen::PenTime Smartpen::getPenTime(Parameter parameter) +{ + PenTime time; + QByteArray value = getParameter(parameter); + if (value.isEmpty() || value.size() != sizeof(Smartpen::PenTime)) { + qWarning() << "got invalid value for pen time: " << value.toHex(); + return 0; + } + QDataStream ds(value); + ds.setByteOrder(QDataStream::LittleEndian); + ds >> time; + return time; } QVariantMap Smartpen::getPenInfo() @@ -216,22 +250,11 @@ QByteArray Smartpen::getPaperReplay(PenTime from) return getObject(QString("lspdata?name=com.livescribe.paperreplay.PaperReplay&start_time=%1&returnVersion=0.3&remoteCaller=WIN_LD_200").arg(from)); } -qint64 Smartpen::toPenTime(const QDateTime &dt) -{ - if (dt.isValid()) { - return dt.toMSecsSinceEpoch() - PEN_EPOCH; - } else { - return 0; - } -} - -QDateTime Smartpen::fromPenTime(qint64 t) +QDateTime Smartpen::fromPenTime(PenTime userTime, PenTime penTime) { - if (t) { - return QDateTime::fromMSecsSinceEpoch(t + PEN_EPOCH).toLocalTime(); - } else { - return QDateTime(); - } + QDateTime dt = QDateTime::fromMSecsSinceEpoch(penTime + userTime, Qt::UTC); + dt.setTimeSpec(Qt::LocalTime); // userTime is actually in LocalTime, so override tz conversion + return dt; } QString Smartpen::toPenSerial(quint64 id) |