Skip to content

Commit

Permalink
Monark: Improve stability of model detection and add some error messa…
Browse files Browse the repository at this point in the history
…ges when connections fails
  • Loading branch information
Erik Botö committed Nov 23, 2015
1 parent 65f522f commit c902647
Show file tree
Hide file tree
Showing 5 changed files with 80 additions and 23 deletions.
14 changes: 13 additions & 1 deletion src/Monark.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,14 @@
Monark::Monark(QObject *parent, QString devname) : QObject(parent),
m_heartRate(0),
m_power(0),
m_cadence(0)
m_cadence(0),
m_isMonarkConnectionAlive(true)
{
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);
connect(&m_monarkConnection, SIGNAL(finished()), this, SLOT(onMonarkConnectionFinished()), Qt::QueuedConnection);
}

Monark::~Monark()
Expand Down Expand Up @@ -120,3 +122,13 @@ void Monark::setLoad(double load)
{
m_monarkConnection.setLoad((unsigned int)load);
}

bool Monark::isConnected()
{
return m_isMonarkConnectionAlive;
}

void Monark::onMonarkConnectionFinished()
{
m_isMonarkConnectionAlive = false;
}
3 changes: 3 additions & 0 deletions src/Monark.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,17 +46,20 @@ class Monark : public QObject
bool discover(QString portName);

void setLoad(double load);
bool isConnected();

private:
MonarkConnection m_monarkConnection;
quint32 m_heartRate;
quint32 m_power;
quint32 m_cadence;
bool m_isMonarkConnectionAlive;

private slots:
void newHeartRate(quint32);
void newPower(quint32);
void newCadence(quint32 cadence);
void onMonarkConnectionFinished();
};

#endif // _GC_Monark_h
Expand Down
75 changes: 53 additions & 22 deletions src/MonarkConnection.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -91,36 +91,31 @@ void MonarkConnection::run()
m_serial->setPortName(m_serialPortName);

m_timer = new QTimer();
QTimer *startupTimer = new QTimer();

if (!m_serial->open(QSerialPort::ReadWrite))
{
qDebug() << "Error opening serial";
} else {
configurePort(m_serial);

// Discard any existing data
QByteArray data = m_serial->readAll();

// Read id from bike
m_serial->write("id\r");
m_serial->waitForBytesWritten(-1);
QByteArray id = readAnswer(1000);
m_id = QString(id);

qDebug() << "Connected to bike: " << m_id;

if (m_id.toLower().startsWith("lc"))
{
m_canControlPower = true;
setLoad(100);
}

// Set up polling
connect(m_timer, SIGNAL(timeout()), this, SLOT(requestAll()),Qt::DirectConnection);

// Set up initial model detection
connect(startupTimer, SIGNAL(timeout()), this, SLOT(identifyModel()),Qt::DirectConnection);
}

m_timer->setInterval(1000);
m_timer->start();

startupTimer->setSingleShot(true);
startupTimer->setInterval(0);
startupTimer->start();

exec();
}

Expand All @@ -138,8 +133,12 @@ void MonarkConnection::requestAll()
{
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;
if (!m_serial->waitForBytesWritten(500))
{
// failure to write to device, bail out
this->exit(-1);
}
m_load = m_loadToWrite;
QByteArray data = m_serial->readAll();
}

Expand All @@ -149,30 +148,62 @@ void MonarkConnection::requestAll()
void MonarkConnection::requestPower()
{
m_serial->write("power\r");
m_serial->waitForBytesWritten(-1);
QByteArray data = readAnswer();
if (!m_serial->waitForBytesWritten(500))
{
// failure to write to device, bail out
this->exit(-1);
}
QByteArray data = readAnswer(500);
quint32 p = data.toInt();
emit power(p);
}

void MonarkConnection::requestPulse()
{
m_serial->write("pulse\r");
m_serial->waitForBytesWritten(-1);
QByteArray data = readAnswer();
if (!m_serial->waitForBytesWritten(500))
{
// failure to write to device, bail out
this->exit(-1);
}
QByteArray data = readAnswer(500);
quint32 p = data.toInt();
emit pulse(p);
}

void MonarkConnection::requestCadence()
{
m_serial->write("pedal\r");
m_serial->waitForBytesWritten(-1);
QByteArray data = readAnswer();
if (!m_serial->waitForBytesWritten(500))
{
// failure to write to device, bail out
this->exit(-1);
}
QByteArray data = readAnswer(500);
quint32 c = data.toInt();
emit cadence(c);
}

void MonarkConnection::identifyModel()
{
m_serial->write("id\r");
if (!m_serial->waitForBytesWritten(500))
{
// failure to write to device, bail out
this->exit(-1);
}
QByteArray data = readAnswer(500);
m_id = QString(data);

qDebug() << "Connected to bike: " << m_id;

if (m_id.toLower().startsWith("lc"))
{
m_canControlPower = true;
setLoad(100);
}
}

void MonarkConnection::setLoad(unsigned int load)
{
m_loadToWrite = load;
Expand Down
1 change: 1 addition & 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 identifyModel();
void setLoad(unsigned int load);

private:
Expand Down
10 changes: 10 additions & 0 deletions src/MonarkController.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,16 @@ bool MonarkController::doesLoad() { return true; }
void
MonarkController::getRealtimeData(RealtimeData &rtData)
{
if (!m_monark->isConnected())
{
QMessageBox msgBox;
msgBox.setText(tr("Cannot Connect to Monark"));
msgBox.setIcon(QMessageBox::Critical);
msgBox.exec();
parent->Stop(0);
return;
}

rtData.setWatts(m_monark->power());
rtData.setHr(m_monark->heartRate());
rtData.setCadence(m_monark->cadence());
Expand Down

0 comments on commit c902647

Please sign in to comment.