From 8cd29d5555f4b1d4e48bf6b258c657d236fc1338 Mon Sep 17 00:00:00 2001 From: Mark Liversedge Date: Fri, 31 Oct 2014 22:26:02 +0000 Subject: [PATCH] Realtime Moxy Part 2a of 3 .. telemetry is plotted in dialwindow .. need to do a part b which is the realtime plot of thb, smo2, o2hb and hhb to complete part 2 --- src/ANT.cpp | 5 +++++ src/ANT.h | 1 + src/ANTChannel.cpp | 1 + src/ANTMessage.cpp | 1 - src/DialWindow.cpp | 25 ++++++++++++++++++++++++ src/RealtimeData.cpp | 45 ++++++++++++++++++++++++++++++++++++++++++++ src/RealtimeData.h | 11 +++++++++++ src/TrainSidebar.cpp | 4 ++++ 8 files changed, 92 insertions(+), 1 deletion(-) diff --git a/src/ANT.cpp b/src/ANT.cpp index 71567dcd8..e9630a1b1 100644 --- a/src/ANT.cpp +++ b/src/ANT.cpp @@ -183,6 +183,11 @@ void ANT::setWheelRpm(float x) { else telemetry.setSpeed(x * appsettings->value(NULL, GC_WHEELSIZE, 2100).toInt() / 1000 * 60 / 1000); } +void ANT::setHb(double smo2, double thb) +{ + telemetry.setHb(smo2, thb); +} + /*====================================================================== * Main thread functions; start, stop etc *====================================================================*/ diff --git a/src/ANT.h b/src/ANT.h index 5ca9f5730..3e5fc6ee7 100644 --- a/src/ANT.h +++ b/src/ANT.h @@ -388,6 +388,7 @@ public: void setAltWatts(float x) { telemetry.setAltWatts(x); } + void setHb(double smo2, double thb); private: diff --git a/src/ANTChannel.cpp b/src/ANTChannel.cpp index 3d74b2567..5ca406eeb 100644 --- a/src/ANTChannel.cpp +++ b/src/ANTChannel.cpp @@ -628,6 +628,7 @@ void ANTChannel::broadcastEvent(unsigned char *ant_message) { value = antMessage.tHb; value2 = antMessage.newsmo2; + parent->setHb(value2, value); } break; diff --git a/src/ANTMessage.cpp b/src/ANTMessage.cpp index 057390c83..47db5fe0d 100644 --- a/src/ANTMessage.cpp +++ b/src/ANTMessage.cpp @@ -503,7 +503,6 @@ ANTMessage::ANTMessage(ANT *parent, const unsigned char *message) { tHb = 0.01f * double(message[8] + ((message[9]&0x0f)<<8)); oldsmo2 = 0.1f * double (((message[9] & 0xf0)>>4) + ((message[10]&0x3f)<<4)); newsmo2 = 0.1f * double (((message[10] & 0xc0)>>6) + (message[11]<<2)); -qDebug()<<"moxy"<setText(QString("%1%").arg(value, 0, 'f', 0)); + break; + case RealtimeData::tHb: + case RealtimeData::O2Hb: + case RealtimeData::HHb: + valueLabel->setText(QString("%1").arg(value, 0, 'f', 1)); + break; + default: valueLabel->setText(QString("%1").arg(round(displayValue))); break; @@ -536,6 +545,22 @@ void DialWindow::seriesChanged() case RealtimeData::AltWatts: foreground = GColor(CALTPOWER); break; + + case RealtimeData::SmO2: + foreground = GColor(CSMO2); + break; + + case RealtimeData::tHb: + foreground = GColor(CTHB); + break; + + case RealtimeData::O2Hb: + foreground = GColor(CO2HB); + break; + + case RealtimeData::HHb: + foreground = GColor(CHHB); + break; } // ugh. we use style sheets becuase palettes don't work on labels diff --git a/src/RealtimeData.cpp b/src/RealtimeData.cpp index 611eab19f..9e2f108b3 100644 --- a/src/RealtimeData.cpp +++ b/src/RealtimeData.cpp @@ -27,6 +27,7 @@ RealtimeData::RealtimeData() hr= watts= altWatts= speed= wheelRpm= load= slope = 0.0; cadence = distance = virtualSpeed = wbal = 0.0; lap = msecs = lapMsecs = lapMsecsRemaining = 0; + thb = smo2 = o2hb = hhb = 0.0; memset(spinScan, 0, 24); } @@ -190,6 +191,18 @@ double RealtimeData::value(DataSeries series) const case Load: return load; break; + case tHb: return thb; + break; + + case SmO2: return smo2; + break; + + case HHb: return hhb; + break; + + case O2Hb: return o2hb; + break; + case None: default: return 0; @@ -226,6 +239,10 @@ const QList &RealtimeData::listDataSeries() seriesList << VI; seriesList << Joules; seriesList << Wbal; + seriesList << SmO2; + seriesList << tHb; + seriesList << HHb; + seriesList << O2Hb; seriesList << AvgWatts; seriesList << AvgSpeed; seriesList << AvgCadence; @@ -342,9 +359,37 @@ QString RealtimeData::seriesName(DataSeries series) case LRBalance: return tr("Left/Right Balance"); break; + + case tHb: return tr("Total Hb Mass"); + break; + + case SmO2: return tr("Hb O2 Saturation"); + break; + + case HHb: return tr("Deoxy Hb"); + break; + + case O2Hb: return tr("Oxy Hb"); + break; } } +void RealtimeData::setHb(double smo2, double thb) +{ + this->smo2 = smo2; + this->thb = thb; + if (smo2 > 0 && thb > 0) { + o2hb = (thb * smo2) / 100.00f; + hhb = thb - o2hb; + } else { + o2hb = hhb = 0; + } +} +double RealtimeData::getSmO2() const { return smo2; } +double RealtimeData::gettHb() const { return thb; } +double RealtimeData::getHHb() const { return hhb; } +double RealtimeData::getO2Hb() const { return o2hb; } + void RealtimeData::setLap(long lap) { this->lap = lap; diff --git a/src/RealtimeData.h b/src/RealtimeData.h index eec3744d1..e04d61191 100644 --- a/src/RealtimeData.h +++ b/src/RealtimeData.h @@ -38,6 +38,7 @@ public: Watts, Speed, Cadence, HeartRate, Load, XPower, BikeScore, RI, Joules, SkibaVI, NP, TSS, IF, VI, Wbal, + SmO2, tHb, HHb, O2Hb, AvgWatts, AvgSpeed, AvgCadence, AvgHeartRate, AvgWattsLap, AvgSpeedLap, AvgCadenceLap, AvgHeartRateLap, VirtualSpeed, AltWatts, LRBalance, LapTimeRemaining }; @@ -72,6 +73,14 @@ public: void setLap(long); const char *getName() const; + + // new muscle oxygen stuff + void setHb(double smo2, double thb); + double getSmO2() const; + double gettHb() const; + double getHHb() const; + double getO2Hb() const; + double getWatts() const; double getAltWatts() const; double getHr() const; @@ -96,11 +105,13 @@ private: // realtime telemetry double hr, watts, altWatts, speed, wheelRpm, load, slope; double cadence; // in rpm + double smo2, thb; // derived data double distance; double virtualSpeed; double wbal; + double hhb, o2hb; long lap; long msecs; long lapMsecs; diff --git a/src/TrainSidebar.cpp b/src/TrainSidebar.cpp index 77cfacd35..be28d5a20 100644 --- a/src/TrainSidebar.cpp +++ b/src/TrainSidebar.cpp @@ -1100,6 +1100,10 @@ void TrainSidebar::guiUpdate() // refreshes the telemetry rtData.setSlope(local.getSlope()); // and get slope in case it was adjusted // to within defined limits } + + if (Devices[dev].type == DEV_ANTLOCAL) { + rtData.setHb(local.getSmO2(), local.gettHb()); //only moxy data from ant devices right now + } // what are we getting from this one? if (dev == bpmTelemetry) rtData.setHr(local.getHr());