Part 5 of #2588
- BodyMeasures code in Athlete was moved to BodyMeasures class in Core
- HrvMeasures code in Athlete was moved to HrvMeasures class in Core
- Both implement the Abstract Base Class MeasuresGroup which provides uniform
access to measures
- Class Measures consolidate access to Body/Hrv Measures
- Body/Hrv measures file is accessed for only one place
- Names/Symbols for Body/Hrv measures are defined only once
... add "source" and "originalSource"
... add "time" display for bodyMeasures read from cloud services
... store in /config not in /activities
... code clean-up (warnings, enum instead preprocessor constants)
... body measures are weight/height data as provided by multiple fitness platform (one of the being the already support Withings platform)
... all access to Weight from external platforms is done through the body measures model - not direct use of Withings any more
... not all platform deliver all measures - but (hopefully) all are providing "weight in kg" as a minimum data
General Download Dialog for Body Measures
... allowing to select the source and the daterange for which data is downloaded (e.g. only the new data since last available measure)
... Support existing Withings Download
... Support new Today's Plan as data source (which is able to receive measures from other sits - e.g. Garmin Connect)
... Support CSV files as data source
Store Body Measures Data in one fix file under /activities (not in /cache like Withings) (so that e.g. backup works like before).
What's open:
... CSV File Import (Info Message on missing feature)
... Test of "old" Withings Download API (since I can't do this)
.. Leif Warland is developing the HRV metric support
and some of these are std deviations. When you
aggregate std deviations the mean and variances
are needed.
.. RideMetric::stdmean() and ::stdvariance() return
a value that is stored in the RideDB if it is
non-zero.
.. RideItem::getStdMeanForSymbol()
RideItem::getStdVarianceForSymbol
return the stored value for use when aggregating in
the same way that RideItem::getCountForSymbol() does.
.. the RideMetric::count() value is written to the ride
cache (rideDB.json) if it is non-zero.
.. it is not used in the aggregation logic yet, but the
rideDB version number has been incremented to force
a rebuild on first run.
.. a data processor can now be configured to run on save
.. in addition, the data processor is now passed the operation
that is triggering it: "Manual", "ADD", "UPDATE", "DELETE",
"IMPORT".
.. a new data processor has been added to write a JSON file to
the snippet directory (added to the athlete structure).
.. this is so we can output a snippet every time an activity is
added, updated or deleted (i.e. runs "on save").
.. these JSON snippets can be used to update external datastores
where coaches use other analytic software but don't want to
manually sync GC changes with there external stores.
.. you can now use the XDATA function to return XDATA field
values using a wildcard.
.. this is likely to be most useful for ignoring the xdata
name when searching for a specific data series.
.. e.g. XDATA("*", "YAW", repeat) will get the YAW data series
regardless of the name of the xdata name that the user
chooses.
.. Filter rides for presence of XDATA by name using the syntax:
XDATA("XDATANAME", "SERIESNAME", sparse|repeat|interpolate|resample)
.. this is the first of 2 commits, in this one we have added XDATA to
the rideitem and rideDB.json so we can check if XDATA is present
without opening the ridefile
.. this allows us to return true or false for an XDATA(..) call when
working across rideitems (not data points) in DataFilter evaluate,
note that the join control (sparse,repeat etc) is ignored when you
are filtering ride items
.. in the next commit we will add the ability to get at the xdata
values when iterating in user data or user metrics
.. there are likely to be further refinements for the outer join
required to support interpolation and resampling in a third commit.
Added Specification parameter to AddIntervalDialog::findPeaks
So it can be used as a more general replacement for
BestIntervalDialog::findBests and findBestsKPH
Introducing a directory structure to make it a bit less
daunting for new developers and perhaps even old hands.
The main folders all start with an upper character, so src
files are now located in;
* Core - Core data structures
* Gui - Main GUI elements
* Metrics - Models and Metrics
* FileIO - Device and File I/O
* Charts - All the chart types
* Cloud - Working with Web Resources
* Train - Anything Train View specific
* ANT - Our ANT+ Stack
* Resources - Images, Translations, Web etc
Apologies to anyone who needs to merge across this update.