mirror of
https://github.com/GoldenCheetah/GoldenCheetah.git
synced 2026-02-13 16:18:42 +00:00
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
This commit is contained in:
@@ -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
|
||||
*====================================================================*/
|
||||
|
||||
@@ -388,6 +388,7 @@ public:
|
||||
void setAltWatts(float x) {
|
||||
telemetry.setAltWatts(x);
|
||||
}
|
||||
void setHb(double smo2, double thb);
|
||||
|
||||
private:
|
||||
|
||||
|
||||
@@ -628,6 +628,7 @@ void ANTChannel::broadcastEvent(unsigned char *ant_message)
|
||||
{
|
||||
value = antMessage.tHb;
|
||||
value2 = antMessage.newsmo2;
|
||||
parent->setHb(value2, value);
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
@@ -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"<<utcTimeRequired<<moxyCapabilities<<tHb<<oldsmo2<<newsmo2;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
@@ -433,6 +433,15 @@ DialWindow::telemetryUpdate(const RealtimeData &rtData)
|
||||
}
|
||||
break;
|
||||
|
||||
case RealtimeData::SmO2:
|
||||
valueLabel->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
|
||||
|
||||
@@ -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::DataSeries> &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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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());
|
||||
|
||||
Reference in New Issue
Block a user