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:
Mark Liversedge
2014-10-31 22:26:02 +00:00
parent bdc00585ca
commit 8cd29d5555
8 changed files with 92 additions and 1 deletions

View File

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

View File

@@ -388,6 +388,7 @@ public:
void setAltWatts(float x) {
telemetry.setAltWatts(x);
}
void setHb(double smo2, double thb);
private:

View File

@@ -628,6 +628,7 @@ void ANTChannel::broadcastEvent(unsigned char *ant_message)
{
value = antMessage.tHb;
value2 = antMessage.newsmo2;
parent->setHb(value2, value);
}
break;

View File

@@ -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:

View File

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

View File

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

View File

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

View File

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