Skip to content

Commit

Permalink
Monark: Add support for controlling power on LCx models
Browse files Browse the repository at this point in the history
* Only supports setLoad, no gradient mode available on Monark bikes
* Renames m_lt2 since more models are supported
  • Loading branch information
Erik Botö committed Nov 20, 2015
1 parent c1e8931 commit 40a061e
Show file tree
Hide file tree
Showing 6 changed files with 44 additions and 11 deletions.
18 changes: 12 additions & 6 deletions src/Monark.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand All @@ -38,7 +38,7 @@ Monark::~Monark()

int Monark::start()
{
m_lt2.start();
m_monarkConnection.start();
return 0;
}

Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -114,3 +114,9 @@ bool Monark::discover(QString portName)

return found;
}


void Monark::setLoad(double load)
{
m_monarkConnection.setLoad((unsigned int)load);
}
4 changes: 2 additions & 2 deletions src/Monark.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,14 +45,14 @@ class Monark : public QObject
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);
Expand Down
21 changes: 20 additions & 1 deletion src/MonarkConnection.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
}

Expand Down Expand Up @@ -108,6 +111,7 @@ void MonarkConnection::run()
if (m_id.toLower().startsWith("lc"))
{
m_canControlPower = true;
setLoad(100);
}

// Set up polling
Expand All @@ -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();
}

Expand Down Expand Up @@ -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.
*/
Expand Down
4 changes: 4 additions & 0 deletions src/MonarkConnection.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ public slots:
void requestPower();
void requestPulse();
void requestCadence();
void setLoad(unsigned int load);

private:
QString m_serialPortName;
Expand All @@ -51,6 +52,9 @@ public slots:
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);
Expand Down
7 changes: 5 additions & 2 deletions src/MonarkController.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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);
}
1 change: 1 addition & 0 deletions src/MonarkController.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ class MonarkController : public RealtimeController
void getRealtimeData(RealtimeData &rtData);
void pushRealtimeData(RealtimeData &rtData);

void setLoad(double);
void setMode(int) { return ; }
};

Expand Down

0 comments on commit 40a061e

Please sign in to comment.