From 0822b88738e00625efd27ccca9119885272924d2 Mon Sep 17 00:00:00 2001 From: "Javier S. Pedro" Date: Mon, 26 Sep 2011 02:36:09 +0200 Subject: fixing bugs found during use ;) --- ckitcallnotification/ckitcallprovider.cpp | 8 ++- libsowatch/declarativewatchlet.cpp | 9 ++- libsowatch/graphicswatchlet.cpp | 18 ++++-- libsowatch/graphicswatchlet.h | 9 +-- libsowatch/libsowatch.pro | 4 +- libsowatch/testdeclarativewatchlet.cpp | 9 --- libsowatch/testdeclarativewatchlet.h | 19 ------ libsowatch/watchpaintengine.cpp | 31 +++++++-- libsowatch/watchpaintengine.h | 12 ++-- libsowatch/watchserver.cpp | 12 ++-- metawatch/metawatch.cpp | 100 ++++++++++++++++-------------- metawatch/metawatchpaintengine.cpp | 15 ++--- metawatch/metawatchpaintengine.h | 3 +- 13 files changed, 135 insertions(+), 114 deletions(-) delete mode 100644 libsowatch/testdeclarativewatchlet.cpp delete mode 100644 libsowatch/testdeclarativewatchlet.h diff --git a/ckitcallnotification/ckitcallprovider.cpp b/ckitcallnotification/ckitcallprovider.cpp index 90dab97..acfcca3 100644 --- a/ckitcallnotification/ckitcallprovider.cpp +++ b/ckitcallnotification/ckitcallprovider.cpp @@ -22,8 +22,8 @@ void CKitCallProvider::activeCallChanged() { QVariantMap info = _activeCall->value().toMap(); qDebug() << "active call changed" << info; - if (!info.contains("state")) { - qWarning() << "broken active call context property"; + if (!info.contains("state") || !info.value("status", false).toBool()) { + return; // Ignore until we get a map with all the required properties. } int state = info["state"].toInt(); if (state == 0) { @@ -34,13 +34,15 @@ void CKitCallProvider::activeCallChanged() } // "Incoming call" if (_notification) { + // An existing incoming call has been updated _notification->changeDisplayName(displayName); } else { + // This is a new incoming call _notification = new CKitCallNotification(displayName, this); emit incomingNotification(_notification); } } else { - // Call is either answered, dropped, missed, .. + // Call has either been answered, rejected, missed, .. if (_notification) { _notification->clear(); _notification->deleteLater(); diff --git a/libsowatch/declarativewatchlet.cpp b/libsowatch/declarativewatchlet.cpp index 60538f8..ca60fb0 100644 --- a/libsowatch/declarativewatchlet.cpp +++ b/libsowatch/declarativewatchlet.cpp @@ -66,15 +66,14 @@ QDeclarativeContext* DeclarativeWatchlet::rootContext() void DeclarativeWatchlet::activate() { - Watchlet::activate(); + GraphicsWatchlet::activate(); _wrapper->activate(); - _scene->update(); } void DeclarativeWatchlet::deactivate() { - Watchlet::deactivate(); _wrapper->deactivate(); + GraphicsWatchlet::deactivate(); } void DeclarativeWatchlet::handleComponentStatus(QDeclarativeComponent::Status status) @@ -90,7 +89,7 @@ void DeclarativeWatchlet::handleComponentStatus(QDeclarativeComponent::Status st case QDeclarativeComponent::Ready: obj = _component->create(); if (_component->isError()) { - qWarning() << "QML has instantation errors:"; + qWarning() << "QML has errors found while creating:"; qWarning() << _component->errors(); return; } @@ -99,7 +98,7 @@ void DeclarativeWatchlet::handleComponentStatus(QDeclarativeComponent::Status st scene()->addItem(_item); break; case QDeclarativeComponent::Error: - qWarning() << "QML has errors:"; + qWarning() << "QML has errors found while loading:"; qWarning() << _component->errors(); break; } diff --git a/libsowatch/graphicswatchlet.cpp b/libsowatch/graphicswatchlet.cpp index 538723a..195d11b 100644 --- a/libsowatch/graphicswatchlet.cpp +++ b/libsowatch/graphicswatchlet.cpp @@ -1,4 +1,5 @@ #include +#include #include #include "watch.h" @@ -30,18 +31,25 @@ void GraphicsWatchlet::setScene(QGraphicsScene *scene) void GraphicsWatchlet::sceneChanged(const QList ®ion) { - foreach(const QRectF& r, region) - { + foreach(const QRectF& r, region) { _damaged += r.toRect(); } - if (!_damaged.isEmpty() && _active && !watch()->busy()) { const QVector rects = _damaged.rects(); QPainter p(watch()); - foreach(const QRect& r, rects) - { + + foreach(const QRect& r, rects) { _scene->render(&p, r, r, Qt::IgnoreAspectRatio); } _damaged = QRegion(); } } + +void GraphicsWatchlet::activate() +{ + Watchlet::activate(); + // We have to assume that the watch has completely forgot about everything. + QRect area(0, 0, watch()->width(), watch()->height()); + _damaged += area; + _scene->update(area); +} diff --git a/libsowatch/graphicswatchlet.h b/libsowatch/graphicswatchlet.h index 37752a9..3202631 100644 --- a/libsowatch/graphicswatchlet.h +++ b/libsowatch/graphicswatchlet.h @@ -18,13 +18,14 @@ public: QGraphicsScene* scene(); void setScene(QGraphicsScene* scene); -protected: - QGraphicsScene* _scene; - QRegion _damaged; - protected slots: void sceneChanged(const QList& region); +protected: + void activate(); + + QGraphicsScene* _scene; + QRegion _damaged; }; } diff --git a/libsowatch/libsowatch.pro b/libsowatch/libsowatch.pro index 44458c2..5ab1f3b 100644 --- a/libsowatch/libsowatch.pro +++ b/libsowatch/libsowatch.pro @@ -20,7 +20,6 @@ SOURCES += \ watchlet.cpp \ watch.cpp \ testwatchlet.cpp \ - testdeclarativewatchlet.cpp \ graphicswatchlet.cpp \ declarativewatchwrapper.cpp \ declarativewatchlet.cpp \ @@ -37,7 +36,6 @@ HEADERS +=\ watchlet.h \ watch.h \ testwatchlet.h \ - testdeclarativewatchlet.h \ sowatch.h \ graphicswatchlet.h \ declarativewatchwrapper.h \ @@ -90,6 +88,8 @@ unix:!symbian { + + diff --git a/libsowatch/testdeclarativewatchlet.cpp b/libsowatch/testdeclarativewatchlet.cpp deleted file mode 100644 index 432d525..0000000 --- a/libsowatch/testdeclarativewatchlet.cpp +++ /dev/null @@ -1,9 +0,0 @@ -#include "testdeclarativewatchlet.h" - -using namespace sowatch; - -TestDeclarativeWatchlet::TestDeclarativeWatchlet(WatchServer* server) : - DeclarativeWatchlet(server, "com.javispedro.sowatch.testdeclarativewatchlet") -{ - setSource(QUrl("qrc:/testdeclarativewatchlet.qml")); -} diff --git a/libsowatch/testdeclarativewatchlet.h b/libsowatch/testdeclarativewatchlet.h deleted file mode 100644 index a200663..0000000 --- a/libsowatch/testdeclarativewatchlet.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef SOWATCH_TESTDECLARATIVEWATCHLET_H -#define SOWATCH_TESTDECLARATIVEWATCHLET_H - -#include "declarativewatchlet.h" - -namespace sowatch -{ - -class TestDeclarativeWatchlet : public DeclarativeWatchlet -{ - Q_OBJECT -public: - explicit TestDeclarativeWatchlet(WatchServer* server); - -}; - -} - -#endif // SOWATCH_TESTDECLARATIVEWATCHLET_H diff --git a/libsowatch/watchpaintengine.cpp b/libsowatch/watchpaintengine.cpp index 6c509cb..90ad8bf 100644 --- a/libsowatch/watchpaintengine.cpp +++ b/libsowatch/watchpaintengine.cpp @@ -1,19 +1,40 @@ #include #include -#include "watch.h" #include "watchpaintengine.h" using namespace sowatch; -WatchPaintEngine::WatchPaintEngine(Watch* watch) +WatchPaintEngine::WatchPaintEngine() : QPaintEngine(QPaintEngine::AllFeatures), - _watch(watch), _painter(), - _hasPen(false), _hasBrush(false), _clipEnabled(false) + _painter() { } +WatchPaintEngine::~WatchPaintEngine() +{ + +} + +bool WatchPaintEngine::begin(QPaintDevice *pdev) +{ + _damaged = QRegion(); + _area = QRect(0, 0, pdev->width(), pdev->height()); + _hasPen = false; + _penWidth = 0.0; + _hasBrush = false; + _clipEnabled = false; + _clipRegion = _area; + + return _painter.begin(pdev); +} + +bool WatchPaintEngine::end() +{ + return _painter.end(); +} + void WatchPaintEngine::damageMappedRect(const QRect &r) { if (_clipEnabled) { @@ -57,7 +78,7 @@ void WatchPaintEngine::updateClipRegion(const QRegion& region, Qt::ClipOperation switch(op) { case Qt::NoClip: _clipEnabled = false; - _clipRegion = QRegion(0, 0, _watch->width(), _watch->height()); + _clipRegion = _area; break; case Qt::ReplaceClip: _clipEnabled = true; diff --git a/libsowatch/watchpaintengine.h b/libsowatch/watchpaintengine.h index 74d4e09..7a97ad7 100644 --- a/libsowatch/watchpaintengine.h +++ b/libsowatch/watchpaintengine.h @@ -6,12 +6,14 @@ namespace sowatch { -class Watch; - class WatchPaintEngine : public QPaintEngine { public: - WatchPaintEngine(Watch* watch); + ~WatchPaintEngine(); + + /* You are supposed to override these two functions. */ + bool begin(QPaintDevice *pdev); + bool end(); void drawEllipse(const QRectF &r); void drawEllipse(const QRect &r); @@ -33,15 +35,17 @@ public: void updateState(const QPaintEngineState &state); protected: + WatchPaintEngine(); + void damageMappedRect(const QRect& r); void damageRect(const QRect& r); void damageRect(const QRectF& r); void damagePenStroke(const QLineF& line); void updateClipRegion(const QRegion& region, Qt::ClipOperation op); - Watch* _watch; QPainter _painter; QRegion _damaged; + QRect _area; bool _hasPen; qreal _penWidth; diff --git a/libsowatch/watchserver.cpp b/libsowatch/watchserver.cpp index 07e4609..c81d937 100644 --- a/libsowatch/watchserver.cpp +++ b/libsowatch/watchserver.cpp @@ -68,6 +68,7 @@ void WatchServer::runWatchlet(const QString& id) void WatchServer::closeWatchlet() { if (_currentWatchlet) { + qDebug() << "deactivating watchlet" << _currentWatchlet->id(); _currentWatchlet->deactivate(); _currentWatchlet = 0; if (_watch->isConnected() && _pendingNotifications.empty()) { @@ -183,13 +184,13 @@ void WatchServer::notificationReceived(Notification *notification) connect(notification, SIGNAL(changed()), SLOT(notificationChanged())); connect(notification, SIGNAL(cleared()), SLOT(notificationCleared())); - qDebug() << "notification received" << notification->title() << notification->count(); + qDebug() << "notification received" << notification->title() << "(" << notification->count() << ")"; _watch->updateNotificationCount(type, getNotificationCount(type)); QDateTime oldThreshold = QDateTime::currentDateTime().addSecs(-_oldNotificationThreshold); if (notification->dateTime() < oldThreshold) { - return; // Do not care about that old notifications... + return; // Do not care about notifications that old... } if (_pendingNotifications.isEmpty()) { @@ -211,7 +212,7 @@ void WatchServer::notificationChanged() Notification* n = static_cast(obj); const Notification::Type type = n->type(); - qDebug() << "notification changed" << n->title() << n->count(); + qDebug() << "notification changed" << n->title() << "(" << n->count() << ")"; _watch->updateNotificationCount(type, getNotificationCount(type)); if (!_pendingNotifications.isEmpty() && _pendingNotifications.head() == n) { @@ -228,11 +229,12 @@ void WatchServer::notificationCleared() const Notification::Type type = n->type(); _notifications[type].removeOne(n); - qDebug() << "notification deleted" << n->title() << n->count(); + qDebug() << "notification deleted" << n->title() << "(" << n->count() << ")"; _watch->updateNotificationCount(type, getNotificationCount(type)); - if (!_pendingNotifications.isEmpty() && _pendingNotifications.head() == n) {qDebug() << "removing top notification"; + if (!_pendingNotifications.isEmpty() && _pendingNotifications.head() == n) { + qDebug() << "removing top notification"; _pendingNotifications.removeAll(n); nextNotification(); } else { diff --git a/metawatch/metawatch.cpp b/metawatch/metawatch.cpp index 1ad7159..e1d9780 100644 --- a/metawatch/metawatch.cpp +++ b/metawatch/metawatch.cpp @@ -238,6 +238,11 @@ void MetaWatch::displayNotification(Notification *n) QFont lf("MetaWatch Large 16pt"); QFont mf("MetaWatch Large 16pt"); QImage icon = iconForNotification(n); + + sf.setPixelSize(8); + mf.setPixelSize(14); + lf.setPixelSize(16); + const int iconW = icon.width(), iconH = icon.height(); const int margin = 4; const int x = margin; @@ -247,10 +252,6 @@ void MetaWatch::displayNotification(Notification *n) int textFlags; QString text; - sf.setPixelSize(8); - mf.setPixelSize(16); - lf.setPixelSize(18); - qDebug() << "displayNotification" << n->title() << n->body(); p.begin(this); @@ -267,7 +268,7 @@ void MetaWatch::displayNotification(Notification *n) p.drawText(dateRect, textFlags, text); p.setFont(lf); - textFlags = Qt::AlignLeft | Qt::AlignTop | Qt::TextWrapAnywhere; + textFlags = Qt::AlignLeft | Qt::AlignTop | Qt::TextWordWrap; text = n->title(); QRect titleMaxRect(x, titleY, screenWidth - x*2, screenHeight - titleY); @@ -607,6 +608,8 @@ void MetaWatch::updateLines(Mode mode, const QImage& image, const QVector& if (lineCount == 0) return; + qDebug() << "sending" << lineCount << "rows to watch"; + for (int line = 0; line < lines.size(); line++) { if (lines[line]) { lineCount--; @@ -690,6 +693,7 @@ void MetaWatch::disableButton(Mode mode, Button button, ButtonPress press) void MetaWatch::handleStatusChange(const Message &msg) { Q_UNUSED(msg); + qDebug() << "got status change message"; } void MetaWatch::handleButtonEvent(const Message &msg) @@ -700,7 +704,7 @@ void MetaWatch::handleButtonEvent(const Message &msg) } quint8 watchBtn = msg.options & 0xF; - ButtonPress press = (ButtonPress) ((msg.options & 0x30) >> 4); + ButtonPress press = static_cast((msg.options & 0x30) >> 4); int button = -1; if (watchBtn < 8) { @@ -785,52 +789,58 @@ void MetaWatch::socketDisconnected() void MetaWatch::socketData() { - qint64 dataRead; + do { + qint64 dataRead; - if (_partialReceived.type == 0) { - /* Still not received even the packet type */ - /* Receive the full header, 4 bytes. */ - if (_socket->bytesAvailable() < 4) return; /* Wait for more. */ - char header[4]; + qDebug() << "received" << _socket->bytesAvailable() << "bytes"; - dataRead = _socket->read(header, 4); - if (dataRead < 4 || header[0] != 0x01) { - qWarning() << "TODO: Resync / Handle Garbage"; - return; - } + if (_partialReceived.type == 0) { + /* Still not received even the packet type */ + /* Receive the full header, 4 bytes. */ + if (_socket->bytesAvailable() < 4) return; /* Wait for more. */ + char header[4]; - _partialReceived.type = static_cast(header[2]); - _partialReceived.data.resize(header[1] - 6); - _partialReceived.options = header[3]; - } + dataRead = _socket->read(header, 4); + if (dataRead < 4 || header[0] != 0x01) { + qWarning() << "TODO: Resync to start of frame"; + return; + } - /* Got the header; now, try to get the complete packet. */ - if (_socket->bytesAvailable() < _partialReceived.data.size() + 2) { - return; /* Wait for more. */ - } - dataRead = _socket->read(_partialReceived.data.data(), _partialReceived.data.size()); - if (dataRead < _partialReceived.data.size()) { - qWarning() << "Short read"; - return; - } + _partialReceived.type = static_cast(header[2]); + _partialReceived.data.resize(header[1] - 6); + _partialReceived.options = header[3]; + qDebug() << "got header"; + } - char tail[2]; - dataRead = _socket->read(tail, 2); - if (dataRead < 2) { - qWarning() << "Short read"; - return; - } + /* We have the header; now, try to get the complete packet. */ + if (_socket->bytesAvailable() < _partialReceived.data.size() + 2) { + return; /* Wait for more. */ + } + dataRead = _socket->read(_partialReceived.data.data(), _partialReceived.data.size()); + if (dataRead < _partialReceived.data.size()) { + qWarning() << "Short read"; + return; + } - quint16 realCrc = calcCrc(_partialReceived); - quint16 expectedCrc = tail[1] << 8 | (tail[0] & 0xFFU); - if (realCrc == expectedCrc) { - handleMessage(_partialReceived); - } else { - qWarning() << "CRC error?"; - } + char tail[2]; + dataRead = _socket->read(tail, 2); + if (dataRead < 2) { + qWarning() << "Short read"; + return; + } - _partialReceived.data.clear(); - _partialReceived.type = NoMessage; + quint16 realCrc = calcCrc(_partialReceived); + quint16 expectedCrc = tail[1] << 8 | (tail[0] & 0xFFU); + if (realCrc == expectedCrc) { + handleMessage(_partialReceived); + } else { + qWarning() << "CRC error?"; + } + + // Prepare for the next packet + _partialReceived.data.clear(); + _partialReceived.type = NoMessage; + } while (_socket->bytesAvailable() > 0); } void MetaWatch::socketError(QBluetoothSocket::SocketError error) diff --git a/metawatch/metawatchpaintengine.cpp b/metawatch/metawatchpaintengine.cpp index 58a7b9d..1b449ab 100644 --- a/metawatch/metawatchpaintengine.cpp +++ b/metawatch/metawatchpaintengine.cpp @@ -3,24 +3,25 @@ using namespace sowatch; +const QRect MetaWatchPaintEngine::totalAreaRect(0, 0, MetaWatch::screenWidth, MetaWatch::screenHeight); + MetaWatchPaintEngine::MetaWatchPaintEngine(MetaWatch* watch) : - WatchPaintEngine(watch), _watch(watch), - _imageRect(0, 0, MetaWatch::screenWidth, MetaWatch::screenHeight) + WatchPaintEngine(), + _watch(watch) { } bool MetaWatchPaintEngine::begin(QPaintDevice *pdev) { - _damaged = QRegion(); _watch = static_cast(pdev); _mode = _watch->paintTargetMode(); - return _painter.begin(_watch->imageFor(_mode)); + return WatchPaintEngine::begin(_watch->imageFor(_mode)); } bool MetaWatchPaintEngine::end() { - bool ret = _painter.end(); + bool ret = WatchPaintEngine::end(); if (ret) { _watch->update(_mode, _damaged.rects().toList()); } @@ -94,7 +95,7 @@ void MetaWatchPaintEngine::updateState(const QPaintEngineState &state) bool MetaWatchPaintEngine::fillsEntireImage(const QRect& rect) { - return rect == _imageRect && + return rect == totalAreaRect && (!_clipEnabled || - (_clipRegion.numRects() == 1 && _clipRegion.rects().at(0) == _imageRect)); + (_clipRegion.numRects() == 1 && _clipRegion.rects().at(0) == totalAreaRect)); } diff --git a/metawatch/metawatchpaintengine.h b/metawatch/metawatchpaintengine.h index c3b7466..98e85bb 100644 --- a/metawatch/metawatchpaintengine.h +++ b/metawatch/metawatchpaintengine.h @@ -25,9 +25,10 @@ public: protected: bool fillsEntireImage(const QRect& rect); + static const QRect totalAreaRect; + MetaWatch* _watch; MetaWatch::Mode _mode; - QRect _imageRect; bool _isBrushBlack; bool _isBrushWhite; }; -- cgit v1.2.3