From 40a061eda928805a555da2c053a84c3aad7db840 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20Bot=C3=B6?= Date: Fri, 13 Nov 2015 20:58:35 +0100 Subject: [PATCH] Monark: Add support for controlling power on LCx models * Only supports setLoad, no gradient mode available on Monark bikes * Renames m_lt2 since more models are supported --- src/Monark.cpp | 18 ++++++++++++------ src/Monark.h | 4 ++-- src/MonarkConnection.cpp | 21 ++++++++++++++++++++- src/MonarkConnection.h | 4 ++++ src/MonarkController.cpp | 7 +++++-- src/MonarkController.h | 1 + 6 files changed, 44 insertions(+), 11 deletions(-) diff --git a/src/Monark.cpp b/src/Monark.cpp index b65cfd6db..c395f6a09 100644 --- a/src/Monark.cpp +++ b/src/Monark.cpp @@ -26,10 +26,10 @@ Monark::Monark(QObject *parent, QString devname) : QObject(parent), m_power(0), m_cadence(0) { - m_lt2.setSerialPort(devname); - connect(&m_lt2, SIGNAL(power(quint32)), this, SLOT(newPower(quint32)), Qt::QueuedConnection); - connect(&m_lt2, SIGNAL(cadence(quint32)), this, SLOT(newCadence(quint32)), Qt::QueuedConnection); - connect(&m_lt2, SIGNAL(pulse(quint32)), this, SLOT(newHeartRate(quint32)), Qt::QueuedConnection); + m_monarkConnection.setSerialPort(devname); + connect(&m_monarkConnection, SIGNAL(power(quint32)), this, SLOT(newPower(quint32)), Qt::QueuedConnection); + connect(&m_monarkConnection, SIGNAL(cadence(quint32)), this, SLOT(newCadence(quint32)), Qt::QueuedConnection); + connect(&m_monarkConnection, SIGNAL(pulse(quint32)), this, SLOT(newHeartRate(quint32)), Qt::QueuedConnection); } Monark::~Monark() @@ -38,7 +38,7 @@ Monark::~Monark() int Monark::start() { - m_lt2.start(); + m_monarkConnection.start(); return 0; } @@ -80,7 +80,7 @@ bool Monark::discover(QString portName) if (sp.open(QSerialPort::ReadWrite)) { - m_lt2.configurePort(&sp); + m_monarkConnection.configurePort(&sp); // Discard any existing data QByteArray data = sp.readAll(); @@ -114,3 +114,9 @@ bool Monark::discover(QString portName) return found; } + + +void Monark::setLoad(double load) +{ + m_monarkConnection.setLoad((unsigned int)load); +} diff --git a/src/Monark.h b/src/Monark.h index 25d5dd2d7..17d6eb465 100644 --- a/src/Monark.h +++ b/src/Monark.h @@ -45,14 +45,14 @@ public: quint32 cadence() {return m_cadence;} bool discover(QString portName); + void setLoad(double load); private: - MonarkConnection m_lt2; + MonarkConnection m_monarkConnection; quint32 m_heartRate; quint32 m_power; quint32 m_cadence; - private slots: void newHeartRate(quint32); void newPower(quint32); diff --git a/src/MonarkConnection.cpp b/src/MonarkConnection.cpp index 9ed9953cc..c65b9e727 100644 --- a/src/MonarkConnection.cpp +++ b/src/MonarkConnection.cpp @@ -25,7 +25,10 @@ MonarkConnection::MonarkConnection() : m_serial(0), m_pollInterval(1000), m_timer(0), - m_canControlPower(false) + m_canControlPower(false), + m_load(0), + m_loadToWrite(0), + m_shouldWriteLoad(false) { } @@ -108,6 +111,7 @@ void MonarkConnection::run() if (m_id.toLower().startsWith("lc")) { m_canControlPower = true; + setLoad(100); } // Set up polling @@ -130,6 +134,15 @@ void MonarkConnection::requestAll() requestPulse(); requestCadence(); + if ((m_loadToWrite != m_load) && m_canControlPower) + { + QString cmd = QString("power %1\r").arg(m_loadToWrite); + m_serial->write(cmd.toStdString().c_str()); + if (m_serial->waitForBytesWritten(100)) + m_load = m_loadToWrite; + QByteArray data = m_serial->readAll(); + } + m_mutex.unlock(); } @@ -160,6 +173,12 @@ void MonarkConnection::requestCadence() emit cadence(c); } +void MonarkConnection::setLoad(unsigned int load) +{ + m_loadToWrite = load; + m_shouldWriteLoad = true; +} + /* * Configures a serialport for communicating with a Monark bike. */ diff --git a/src/MonarkConnection.h b/src/MonarkConnection.h index f28b7637b..eedb17482 100644 --- a/src/MonarkConnection.h +++ b/src/MonarkConnection.h @@ -40,6 +40,7 @@ public slots: void requestPower(); void requestPulse(); void requestCadence(); + void setLoad(unsigned int load); private: QString m_serialPortName; @@ -51,6 +52,9 @@ private: QByteArray readAnswer(int timeoutMs = -1); QMutex m_mutex; bool m_canControlPower; + unsigned int m_load; + unsigned int m_loadToWrite; + bool m_shouldWriteLoad; signals: void pulse(quint32); diff --git a/src/MonarkController.cpp b/src/MonarkController.cpp index 6790682e5..c353657d4 100644 --- a/src/MonarkController.cpp +++ b/src/MonarkController.cpp @@ -71,7 +71,7 @@ MonarkController::discover(QString name) bool MonarkController::doesPush() { return false; } bool MonarkController::doesPull() { return true; } -bool MonarkController::doesLoad() { return false; } +bool MonarkController::doesLoad() { return true; } /* * gets called from the GUI to get updated telemetry. @@ -89,4 +89,7 @@ MonarkController::getRealtimeData(RealtimeData &rtData) void MonarkController::pushRealtimeData(RealtimeData &) { } // update realtime data with current values - +void MonarkController::setLoad(double load) +{ + m_monark->setLoad(load); +} diff --git a/src/MonarkController.h b/src/MonarkController.h index 8c8d2f974..51e3ae8f1 100644 --- a/src/MonarkController.h +++ b/src/MonarkController.h @@ -45,6 +45,7 @@ public: void getRealtimeData(RealtimeData &rtData); void pushRealtimeData(RealtimeData &rtData); + void setLoad(double); void setMode(int) { return ; } };