Merge pull request #1683 from erikboto/monark_power_control_support

Monark: Add support for controlling power on LCx models
This commit is contained in:
Mark Liversedge
2015-11-20 12:21:18 +00:00
6 changed files with 44 additions and 11 deletions

View File

@@ -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);
}

View File

@@ -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);

View File

@@ -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.
*/

View File

@@ -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);

View File

@@ -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);
}

View File

@@ -45,6 +45,7 @@ public:
void getRealtimeData(RealtimeData &rtData);
void pushRealtimeData(RealtimeData &rtData);
void setLoad(double);
void setMode(int) { return ; }
};