summaryrefslogtreecommitdiff
path: root/metawatch
diff options
context:
space:
mode:
Diffstat (limited to 'metawatch')
-rw-r--r--metawatch/metawatch.cpp165
-rw-r--r--metawatch/metawatch.h20
-rw-r--r--metawatch/uires.qrc5
3 files changed, 169 insertions, 21 deletions
diff --git a/metawatch/metawatch.cpp b/metawatch/metawatch.cpp
index 657548a..5e6a8fb 100644
--- a/metawatch/metawatch.cpp
+++ b/metawatch/metawatch.cpp
@@ -79,7 +79,7 @@ MetaWatch::MetaWatch(const QBluetoothAddress& address, QObject *parent) :
_paintEngine(0),
_address(address),
_socket(0),
- _24hMode(true), _dayMonthOrder(true),
+ _24hMode(true), _dayMonthOrder(true), _notificationTimeout(10),
_connectRetries(0),
_connected(false),
_connectTimer(new QTimer(this)),
@@ -87,7 +87,8 @@ MetaWatch::MetaWatch(const QBluetoothAddress& address, QObject *parent) :
_sendTimer(new QTimer(this)),
_currentMode(IdleMode),
_paintMode(IdleMode),
- _nMails(0), _nCalls(0), _nIms(0), _nSms(0), _nMms(0)
+ _nMails(0), _nCalls(0), _nIms(0), _nSms(0), _nMms(0),
+ _idleTimer(new QTimer(this)), _ringTimer(new QTimer(this))
{
QImage baseImage(screenWidth, screenHeight, QImage::Format_MonoLSB);
baseImage.setColor(0, QColor(Qt::white).rgb());
@@ -101,9 +102,16 @@ MetaWatch::MetaWatch(const QBluetoothAddress& address, QObject *parent) :
connect(_connectTimer, SIGNAL(timeout()), SLOT(retryConnect()));
connect(_connectAlignedTimer, SIGNAL(timeout()), SLOT(retryConnect()));
- _sendTimer->setInterval(30);
+ _sendTimer->setInterval(10);
connect(_sendTimer, SIGNAL(timeout()), SLOT(timedSend()));
+ _idleTimer->setInterval(_notificationTimeout * 1000);
+ _idleTimer->setSingleShot(true);
+ connect(_idleTimer, SIGNAL(timeout()), SIGNAL(idling()));
+
+ _ringTimer->setInterval(2000);
+ connect(_ringTimer, SIGNAL(timeout()), SLOT(timedRing()));
+
retryConnect();
}
@@ -217,24 +225,92 @@ void MetaWatch::updateNotificationCount(Notification::Type type, int count)
renderIdleCounts();
}
-void MetaWatch::vibrate(bool on)
+void MetaWatch::displayIdleScreen()
{
- Q_UNUSED(on); // TODO
-}
+ _currentMode = IdleMode;
+ _ringTimer->stop();
+ _idleTimer->stop();
+ setVibrateMode(false, 0, 0, 0);
+ updateDisplay(IdleMode);
+ // Usually, idle screen is kept updated, so we can show it already.
+ qDebug() << "displayIdle";
-void MetaWatch::showNotification(const Notification &n)
-{
- qDebug() << "It's time for a notification" << n.title();
}
-void MetaWatch::startRinging(const QString &text)
+void MetaWatch::displayNotification(Notification *n)
{
+ _currentMode = NotificationMode;
+ _paintMode = NotificationMode;
+ const bool shouldRing = n->type() == Notification::CallNotification;
+ configureWatchMode(NotificationMode, shouldRing ? 60 : 10);
+ QPainter p;
+ QFont lf("MetaWatch Large 16pt", 14);
+ QFont mf("MetaWatch Large 16pt", 10);
+ QImage icon = iconForNotification(n);
+ const int x = 4;
+ const int iconY = 4;
+ const int titleY = 8 + icon.height();
+ int textFlags;
+ QString text;
+
+ qDebug() << "displayNotification" << n->title() << n->body();
+
+ p.begin(this);
+
+ p.fillRect(0, 0, screenWidth, screenHeight, Qt::white);
+ p.drawImage(x, iconY, icon);
+
+ p.setPen(Qt::black);
+ p.setFont(lf);
+ textFlags = Qt::AlignLeft | Qt::AlignTop | Qt::TextWrapAnywhere;
+ text = n->title();
+
+ QRect titleMaxRect(x, titleY, screenWidth - x*2, screenHeight - titleY);
+ QRect titleRect = p.boundingRect(titleMaxRect, textFlags, text);
+ if (titleRect.width() > titleMaxRect.width()) {
+ textFlags = Qt::AlignLeft | Qt::AlignTop | Qt::TextWrapAnywhere;
+ titleRect = p.boundingRect(titleMaxRect, textFlags, text);
+ }
+
+ qDebug() << titleMaxRect << titleRect;
+ p.drawText(titleMaxRect, textFlags, text);
+
+ p.setFont(mf);
+ textFlags = Qt::AlignLeft | Qt::AlignTop | Qt::TextWordWrap;
+ text = n->body();
+
+ int bodyY = titleRect.y() + titleRect.height();
+ if (bodyY >= screenHeight) return;
+ QRect bodyMaxRect(x, bodyY, titleMaxRect.width(), screenHeight - bodyY);
+ QRect bodyRect = p.boundingRect(bodyMaxRect, textFlags, text);
+ if (bodyRect.width() > bodyMaxRect.width()) {
+ textFlags = Qt::AlignLeft | Qt::AlignTop | Qt::TextWrapAnywhere;
+ }
+ qDebug() << bodyMaxRect << bodyRect;
+ p.drawText(bodyMaxRect, textFlags, text);
+
+ p.end();
+
+ if (n->type() == Notification::CallNotification) {
+ timedRing();
+ _ringTimer->start();
+ _idleTimer->stop();
+ } else {
+ _ringTimer->stop();
+ setVibrateMode(true, 500, 500, 2);
+ _idleTimer->start();
+ }
}
-void MetaWatch::stopRinging()
+void MetaWatch::displayApplication()
{
-
+ _currentMode = ApplicationMode;
+ _paintMode = ApplicationMode;
+ _ringTimer->stop();
+ _idleTimer->stop();
+ configureWatchMode(ApplicationMode, 250);
+ qDebug() << "displayApplication";
}
MetaWatch::Mode MetaWatch::currentMode() const
@@ -307,11 +383,11 @@ void MetaWatch::renderIdleScreen()
void MetaWatch::renderIdleWeather()
{
_paintMode = IdleMode;
- QFont smallFont("MetaWatch Small caps 8pt", 6);
+ QFont f("MetaWatch Small caps 8pt", 6);
QImage rain(QString(":/metawatch/graphics/weather_rain.bmp"));
QPainter p(this);
- p.setFont(smallFont);
+ p.setFont(f);
p.drawText(30, systemAreaHeight + 14, "No data!");
p.drawImage(screenWidth - 26, systemAreaHeight + 6, rain);
@@ -341,6 +417,41 @@ void MetaWatch::renderIdleCounts()
p.drawText(QRect((32 * 0) + 4, y, w, h), s.sprintf("%d", calls), opt);
p.drawText(QRect((32 * 1) + 4, y, w, h), s.sprintf("%d", sms), opt);
p.drawText(QRect((32 * 2) + 4, y, w, h), s.sprintf("%d", mails), opt);
+
+ _paintMode = _currentMode;
+}
+
+void MetaWatch::renderNotificationScreen()
+{
+ _paintMode = NotificationMode;
+ QPainter p(this);
+
+ p.fillRect(0, 0, screenWidth, screenHeight, Qt::white);
+
+ _paintMode = _currentMode;
+}
+
+QImage MetaWatch::iconForNotification(const Notification *n)
+{
+ switch (n->type()) {
+ case Notification::CallNotification:
+ case Notification::MissedCallNotification:
+ return QImage(QString(":/metawatch/graphics/phone.bmp"));
+ break;
+ case Notification::SmsNotification:
+ case Notification::MmsNotification:
+ case Notification::ImNotification:
+ return QImage(QString(":/metawatch/graphics/message.bmp"));
+ break;
+ case Notification::EmailNotification:
+ return QImage(QString(":/metawatch/graphics/email.bmp"));
+ break;
+ case Notification::CalendarNotification:
+ return QImage(QString(":/metawatch/graphics/timer.bmp"));
+ break;
+ default:
+ return QImage();
+ }
}
quint16 MetaWatch::calcCrc(const QByteArray &data, int size)
@@ -394,6 +505,20 @@ void MetaWatch::handleMessage(const Message &msg)
}
}
+void MetaWatch::setVibrateMode(bool enable, uint on, uint off, uint cycles)
+{
+ Message msg(SetVibrateMode, QByteArray(6, 0));
+
+ msg.data[0] = enable ? 1 : 0;
+ msg.data[1] = on & 0xFF;
+ msg.data[2] = on >> 8;
+ msg.data[3] = off & 0xFF;
+ msg.data[4] = off >> 8;
+ msg.data[5] = cycles;
+
+ send(msg);
+}
+
void MetaWatch::updateLine(Mode mode, const QImage& image, int line)
{
Message msg(WriteBuffer, QByteArray(13, 0), (1 << 4) | (mode & 0xF));
@@ -479,7 +604,7 @@ void MetaWatch::loadTemplate(Mode mode, int templ)
void MetaWatch::handleStatusChange(const Message &msg)
{
- qDebug() << "watch status changed" << msg.data.size();
+ qDebug() << "watch status changed" << msg.options << msg.data.at(0);
}
void MetaWatch::handleButtonEvent(const Message &msg)
@@ -487,6 +612,8 @@ void MetaWatch::handleButtonEvent(const Message &msg)
if (msg.data.size() < 1) return;
quint8 button = msg.data[0];
+ qDebug() << "button event" << msg.data.size() << msg.options << msg.data.at(0);
+
emit buttonPressed(button); // TODO This is completely broken
}
@@ -505,10 +632,9 @@ void MetaWatch::socketConnected()
setDateTime(QDateTime::currentDateTime());
configureIdleSystemArea(false);
- configureWatchMode(ApplicationMode, 240);
- configureWatchMode(NotificationMode, 30);
renderIdleScreen();
+ renderNotificationScreen();
emit connected();
}
@@ -624,6 +750,11 @@ void MetaWatch::timedSend()
}
}
+void MetaWatch::timedRing()
+{
+ setVibrateMode(true, 200, 200, 3);
+}
+
void MetaWatch::realSend(const Message &msg)
{
const int msgSize = msg.data.size();
diff --git a/metawatch/metawatch.h b/metawatch/metawatch.h
index 48b7be6..da0f323 100644
--- a/metawatch/metawatch.h
+++ b/metawatch/metawatch.h
@@ -78,10 +78,10 @@ public:
void updateNotificationCount(Notification::Type type, int count);
- void vibrate(bool on);
- void showNotification(const Notification& n);
- void startRinging(const QString &text);
- void stopRinging();
+ void displayIdleScreen();
+ void displayNotification(Notification *n);
+ void displayApplication();
+
Mode currentMode() const;
Mode paintTargetMode() const;
@@ -92,6 +92,9 @@ public:
void renderIdleScreen();
void renderIdleWeather();
void renderIdleCounts();
+ void renderNotificationScreen();
+
+ QImage iconForNotification(const Notification *n);
protected:
mutable MetaWatchPaintEngine* _paintEngine;
@@ -100,9 +103,12 @@ protected:
QBluetoothAddress _address;
QBluetoothSocket* _socket;
+ /* Some configurable stuff. */
bool _24hMode : 1;
bool _dayMonthOrder : 1;
+ short _notificationTimeout;
+
static const int connectRetryTimesSize = 6;
static const int connectRetryTimes[connectRetryTimesSize];
short _connectRetries;
@@ -130,6 +136,10 @@ protected:
// Notifications: Unread count
uint _nMails, _nCalls, _nIms, _nSms, _nMms;
+ // Notifications: timers
+ QTimer* _idleTimer;
+ QTimer* _ringTimer;
+
static const quint8 bitRevTable[16];
static const quint16 crcTable[256];
quint16 calcCrc(const QByteArray& data, int size);
@@ -138,6 +148,7 @@ protected:
void send(const Message& msg);
void handleMessage(const Message& msg);
+ void setVibrateMode(bool enable, uint on, uint off, uint cycles);
void updateLine(Mode mode, const QImage& image, int line);
void updateLines(Mode mode, const QImage& image, int lineA, int lineB);
void updateLines(Mode mode, const QImage& image, const QVector<bool>& lines);
@@ -157,6 +168,7 @@ protected slots:
void socketState(QBluetoothSocket::SocketState error);
void retryConnect();
void timedSend();
+ void timedRing();
private:
void realSend(const Message& msg);
diff --git a/metawatch/uires.qrc b/metawatch/uires.qrc
index 24d70fb..821a3dc 100644
--- a/metawatch/uires.qrc
+++ b/metawatch/uires.qrc
@@ -9,6 +9,11 @@
<file>weather_sunny.bmp</file>
<file>weather_thunderstorm.bmp</file>
<file>weather_wind.bmp</file>
+ <file>email.bmp</file>
+ <file>message.bmp</file>
+ <file>phone.bmp</file>
+ <file>play.bmp</file>
+ <file>timer.bmp</file>
</qresource>
<qresource prefix="/metawatch/fonts">
<file>metawatch_8pt_5pxl_CAPS.ttf</file>