fixes#2158
Issue:
The contents of the combo box, the array holding the raw mm values and
the index range checks were out of sync.
This led to wrong or no values at all during the wheel perimeter
calculation.
Changes:
* Add missing rim diameter 584mm
* Adjust rouding error in tire casing diameter
* Make index range checks more robust by using the actual array size
instead of just assuming a length
* Display ISO5775/ETRTO mm values in combo box
Combined with the Group By feature, it allows a simple way
to see weekly, monthly and yearly averages for cumulative
metrics s.t. Duration, Distance, TSS, etc.
.. lots of warnings about unused global variables that
are being used to call functions before main
.. a few other smaller nits that could be fixed easily
.. now get fewer warnings and more meaningful to then
review and resolve them
It is a more natural unit is most cases and allows enhanced
plotting in LTM charts since seconds are converted to hours.
Labels and ToolTip are shown in sexagesimal format.
.. the code was never written, so the season code just
crashes using an index of -1 into the season array
.. updated LTMSidebar.cpp to catch delete phase and handle
it appropriately, but the real fix should be to abstract
the code added into the Season/Phase classes.
Fixes#2139.
To enhance usability, specially when the locale uses 2 digits years.
Fixes#2123
In some places s.t. TPDowloadDialog and FileStore it was already set.
Not added to RideMetadata and RideImportWizard where 4 digits year is fixed.
Adds isMetricRelevantForRides(specification, metric) to RideCache
to check if a metric isRelevant for some of the activities passing
the specification
Also reduces from 3 to 1 the calls to getRideTypeCounts
... re-using the existing functions recognizing modified activities
... allowing to save all, without remembering to save one-by-one or
leaving GC to make sure that all was saved
... when changing the ride by clicking in the list - while change e.g. Detail data in the activities view GC aborted
because the proxyIndex.internalPointer() was not initialized
checking the initialization like in the other cases in the code fixed the problem
In ComparePane and RideSummary, to have a cleaner interval
comparison for multisport users having interval metrics
configured for different sports or cyclists using
metrics based on data not always present.
Fixes#2110
.. if the setting has not been made in options/prefs we
set the API web services to be disabled.
.. this is to stop warning messages about windows firewall
that will appear, and also to reflect the fact that
the majority of users will likely not require the
web services anyway.
.. when translating "Options" they are no longer put into
the main menu on OSX.
.. we now explicitly set the menu type to ensure this
happens regardless of the text.
To regenerate second-by-second data based on updated length-by-length info
and to recompute accumulated time and distance.
Laps are regenerated using pause lengths as markers.
.. the xdata wasn't being copied when dropping into the
compare pane. This has been resolved, but might be worth
looking closely at likely memory leak.
.. 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.
.. extracting with a view to identifying special cases in
the FIT developer fields.
.. in this instance the Moxy series have special values of
54 and 57, but its not clear how we can handle this in a
generic fashion (the whole thing is stinky).
.. added to DataFilter XDATA_UNITS("..", "...") returns the units as
a string.
.. added to the various dialogs in RideEditor, to enable units and
series name to be set and edited by the user.
.. added to JSON file format, set when importing from RP3 and FIT files
.. primarily used by FIT developer fields that contain unit data
.. but we add units for file formats where we know them (as an english
language string)
.. in part 2 we will add units to the datafilter expressions and the
dialogs in the ride editor to let users edit unit names along with
value names.
A Garmin Vivoactive Sportswatch may be identified by its product code 1907.
A BSX Insight 2 Sensor may be identified by the manufacturer code 98 and the product code 2.
References #2040
please review
In CSV-files recorded by a BSX-Insight 2 sensor the running speed measured using a footpod is denoted as *speed*. Running speed is recorded in m/s. Conversion to km/h is implemented. The metric is converted to mph if GC is configured to use non metric units.
please review
In file src/Metrics/BasicRideMetrics.cpp the minimum values of SmO2 and tHb and the average of tHb are calculated incorrectly. In functions compute of class MinSmO2 resp. class MintHb actually the maximum values get computed.
For MinSmO2 the comparison in function compute should read:
```c++
if (point->smo2 >= 0.0f && (notset || point->smo2 < min)) {
min = point->smo2;
if (point->smo2 > 0.0f && notset)
notset = false;
}
```
with min being a double initialized to 0.0f and notset a boolean initialized to true.
For MinSmO2 we've got to handle that the first recorded values might be zero, e.g. when the athlete did not attach the Moxy sensor to the muscle prior to starting recording. If the comparison given above holds true we have to verify that we get a valid value > 0 first before allowing SmO2 to fall down to zero again.
For MintHb the comparison in function compute should read:
```c++
if (point->thb > 0.0f && (notset || point->thb < min)) {
min = point->thb;
notset = false;
}
```
with min being a double initialized to 0.0f and notset a boolean initialized to true.
Please note that for physiological reasons the minimum value of tHb must not be zero as this would imply that the muscle under observation were totally drained from blood.
At the end of functions compute in classes MinSmO2 and MintHb we have to set the correct value:
```c++
setValue(min); // was max before
```
In class AvgtHb we have to take into account that tHb must not be zero as well for the same reason as stated above. In function compute the comparison should read:
```c++
if (point->thb > 0.0f) {
total += point->thb;
++count;
}
```
References #2050
please review
to run an specific Data Processor, even if not configured to run
automatically on import, over existing activities which pass the
filter expression using configured parameters.
Fixes#2037
Reproducible downloading/importing a PowerTap .raw file and
selecting an interval for the first time, _model->series is NULL
in this case, no model case added for safety
Stroke Rate: counting both arms for crawl/back corrected by 3m push-off when Pool Length is defined
Swim Pace: average swim pace in min/100m or min/100yd when Cadence>0, to avoid kick/drill sets
Strokes Per Length: counting only the arm with the watch, pool length defaults to 50m
SWolf: Strokes Per Length plus time in seconds, pool length defaults to 50m
Also moved Distance Swim and Pace Swim from BasicRideMetrics.cpp
.. when working with user data and user metrics its often
useful to work with arrays or index into the ride data.
.. a new variable INDEX is available that is the sample
number in the array of samples that make up the ride.
.. you can dereference samples in a ride using the []
operator so POWER[55] is the 55th sample for power.
.. when iterating you should consider the recording interval
so NN <- 1200 / RECINTSECS would set NN to the number of
samples in 20 minutes.
.. you can also use your own arrays: MYARRAY[44] <- 100 will
set the 44th item in MYARRAY to 100.
.. the old vector syntax [ date : date ] has been deprecated
since it is too complex !
.. a much simpler approach to aligning the xdata series
with the standard series, using a single index.
.. its faster and makes implementing the four different
merge algorithms much more straight forward.
.. committing alone to separate from the implementation
of separate algorithms.
.. for thread safety the Leaf tree must NOT be used for state
data when parsing / evaluating data filters -- the
DataFilterRuntime object should be used.
.. updated to use this for xcurrent/xnext during XDATA
processing which fixes UserMetric calculation using XDATA
for intervals
.. also added a 'print' function in the datafilter syntax to
help with debugging calculations.
.. now we return values when working with metrics and user data
.. you can now create user metrics and user data to plot on the
allplot or metrics charts
.. the XDATA function currently always returns a 'repeat' of the
last value used until a new value is available, will fix this
in commit 3 of 3
.. 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.
.. rather than using setTabBar() to keep resetting the view
for the XDATA tabs in RideEditor the model updates the
views correctly.
.. makes the editing of XDATA more responsive and doesn't
keep resizing columns on every change.
One record per length with 3 fields:
TYPE: 0-pause, 1-free, 2-back, 3-breast, 4-fly, 5-drill, 6-mixed, 7-IM
DURATION: seconds per length
STROKES: total strokes per length
Related to #2010
Added Specification parameter to AddIntervalDialog::findPeaks
So it can be used as a more general replacement for
BestIntervalDialog::findBests and findBestsKPH
.. context menu on xdata editor row/column headings now
adds functions to add/remove rows and columns
.. users can now manually create and maintain XDATA in the
ride editor
.. the UX is a bit naff and needs to be cleaned up; the
visual cues are missing on redo/undo and the performance
is poor since setTabBar is called too frequently. Will
look to fix these nits over the next few days.
Conflicts:
src/FileIO/XDataTableModel.cpp
.. get ride of the xdata by closing its tab at the bottom
of the chart. This is similar to how worksheets are
removed in Excel and should be intuitive to most people.
.. a warning is issued before removing the data, but it can
be undone as all data commands are performed on the
command stack
.. added the ability to edit point values with XDATA
series displayed as 'worksheets' within the ride editor,
in keeping with the 'Spreadsheet' UX
.. need to refine the cosmetics and work on more useful
functions like add/remove row/column etc but the basic
view and edit functions are in place.
.. add XDataDialog and tabs to the ride editor, so you can
add and remove xdata and the individual data series.
.. next commit will add editing of the xdata values.
.. there was a memory leak in RideFile and FitRideFile
.. added a test file with weather data that can be used to
test XDATA processing (it has 10 weather points with
wind, humidity etc).
.. added a new 'XDATA' element for the JsonRideFile and
RideFile classes.
.. this allows ride file readers to extract and load any
time series data that doesn't neccessarily fit into
the usual data points.
.. this was added to support weather data from FIT files
and also to support 3rd party merging data with the
GC supported data.
.. ** IMPORTANT ** the XDATA segment is added at the END
of the JSON format. So older parsers will fail to read
but will have loaded all data already (i.e. they will
fail gracefully enough)
This means files with XDATA can be read by earlier
versions of GC, but the XDATA will be discarded.
.. should be 'cycles' per minute (i.e. a pair of steps, one left
and one right)
.. previously it was number of 'steps' per minute (i.e. how many
footsteps did you take in one minute)
.. will pair and count strides to derive speed and cadence
.. this commit covers the ANT+ side of things, will now
update the config to enable the user to set stride length
When runs have power PMC metrics are inconsistent otherwise, better
to have separated rTSS/sTSS which could be added as builtin or user
defined metric.
.. it should be calculated in a data processor rather
than in the file processor.
.. Damien is looking to add one, so commenting it out
for now (so the code can be reused if needed).
Simpler and more robust lap alignment
Fixed for empty lengths due to false starts and
pauses in some devices s.t. Garmin 910xt
Added 2 contributed test files
... align terminology (upload/download vs. import/publish)
... make pushbuttons right-aligned (in sync with most GC dialogs)
... ask for confirmation before finally deleting a chart from CloudDB
.. use GcChartWindow as the base class for all charts -- so
we can truly upload *any* chart to the cloudDB
.. miscellaneous charts that were still defined as GcWindow
have been converted to GcChartWindow
.. GcChartWindow layout issues (using QGridLayout insted of
a QStackedLayout) are fixed which will also resolve a few
rendering issues related to NOWEBKIT.
.. Aerolab needed lots of cosmetic fixups once it became
a GcChartWindow
.. Added 'Upload Chart...' to mirror the 'Download Chart..'
option on the hamburger menu as users will instinctively
look for the option there instead of under the chart menu.
... add "Sport" metadata as filter option
... move "Import" from main menue to "add chart"
... make chart lists context sensitive on home, activities and diary
... import directly - without extra dialog
... add export support for the new .gchart format (allowing to post all chart types to CloudDB)
... add import in main menu for the new .gchart format
... allow to import multiple charts at once
... remove specific LTM Chart support (menu, db,... -since this is covered by general .gchart format)
.. you can now fetch activities as a list and split them
based upon gaps in recording (recording anomalies).
.. this is to support trackeR; data should already be cleaned
by the user, but thats not always the case (!)
.. completes the updates to RTool.cpp
.. as predicted by forming the pmc data.frame via an S3
list instead of a pair list the merge() function works
properly and column names are retained.
.. we should use a list not an old pair list when constructing
lists and data.frames.
.. to ensure better compatibility with coercion functions in R
and also possibly to resolve known issues with merge()
.. this is part 1 of 2, breaking up the mass changes to the many
data wrangling functions in RTool.cpp
.. it also contains an update to RLibrary to resolve the functions
used when working with lists (SET_VECTOR_ELT).
.. allow user to select target view for trends/diary charts
since they can be used on either
.. don't just add when only 1 chart imported, always let the
user confirm and adjust
.. use translated names for the views so they are more meaningful
to the end user
.. the default methods in QGraphicsView handle these
events; we don't want this since we handle them in
mainwindow
.. fixes drag-n-drop onto mainwindow as well as working
with the compare pane 'auto-open'.
.. A single .gchart file being dropped into MainWindow will
add and select it on the view.
.. still need to add a dialog when dropping multiple charts
to let user control if they want them all.
.. using mvjson not Qt Json classes, to avoid a dependency on
Qt5. The format was kept simple specifically to avoid that.
.. the chart ultimately is defined a list of properties with
a key and value.
.. export any chart to a file for sharing with others
.. the import functionality will come next (and will need to
determine property formats by querying the newly created
chart metatypes).
.. the ability to apply a datafilter to the data retrieved
is extended to the season.metrics, season.meanmax and
season.peaks methods
.. this helps to let GC filter out e.g. power data is present
before we do anything in R since GC is faster and it also
reduces the data being passed back etc.
.. clean it up, rather than resolve source (there is still a
problem in there somewhere).
.. at least now interval plots and model fits aren't skewed
by a trailing zero value
.. we really don't need 10k history on errors in the rchart
.. this is a hangover from the early development that should
have been reduced before being published
.. You can now specify which activity to retrieve by passing
a POSIXct date time representing the start time of the ride
.. this is mostly useful when used in conjunction with
GC.activities(filter=...) to select ride dates.
.. allow user to pass a data filter to evaluate when getting
a list of activities.
.. e.g. GC.activities('Workout_Code = "1L2")
will get a list of activity start times where the workout
code is 1L2.
.. when returning values we honour whatever filter is active
at the time from home sidebar or the search box
.. it is applied regardless of which view the chart is on.
This commit fixes the issue that the interval bars (in AllPlotInterval) are not correctly aligned
with the interval sections in the main plot (AllPlot). This is done by calculating the margins from
the main plotting area to the border and setting left and right margin of the interval plot
accordingly.
.. Add option to disable embedded R in preferences
.. Better diagnostics if load fails
.. If we find it in the usual place we load and set R_HOME
automatically without requiring R_HOME or config
.. The config option overrides R_HOME not the other way around
Use total duration for both length and lap messages to synch them,
even when using drill mode. Tested with Garmin Swim and 920xt files.
Garmin 310xt is special cased since it doesn't generate rest length messages
Add Pool Length in meters as metadata
.. added a checksum metric for an activity that can be used as a key
in R scripts to invalidate / reuse caches.
.. when R scripts are computationally expensive we can store the
results in a cache with a key for the activity involved -- then
the cache is tied to a particular activity (and state).
.. since caching in R has many options we may develop a 'basic'
cache function that can be guaranteed to be available to any
script so they can be shared.
.. get runtime version loaded and show on crash dialog and console
since the runtime may be different from compile time as it is
now dynamically loaded.
.. no need to define GC_WANT_R_DYNAMIC any more since it is now
working across all 3 supported platforms.
.. we need to improve the way R_HOME is configured and validated
for non-technical users.
.. fixed up to work on Windows too.
.. needed to add a couple of functions used by Windows;
getRUser(), get_R_HOME() and getDLLVersion().
.. also needed to add a path to the DLL that included the
address space (x64 or i386).
.. we can now load the installed dynamic library rather than
distributing with the version we built with.
.. the lib is loaded and symbols resolved at runtime.
.. need to fixup for Windows and remove GC_WANT_R_DYNAMIC option
and make it the way we integrate R for GC_WANT_R
.. add Graphics device entry points and almost done with defining
proxy functions to call at runtime
.. will need to create a QLibrary object to load and resolve
symbols for the proxies to call next.
.. if you add GC_WANT_R_DYNAMIC to gcconfig.pri it enables
this, but it will crash, this is a wip.
.. get peak values across rides in a season.
.. series="power", or series=c("power", "heart.rate") and
duration=1 or duration=c(1,10,100)
.. where series is a mean maximal series in the ride file cache
and duration is in seconds
.. will make this compare aware shortly.
.. get a dataframe with season details
.. all lists all seasons, compare lists those being compared and
if neither true returns the currently selected season
.. also renamed functions so we now have
GC.season.metrics -> GC.metrics
GC.season.pmc -> GC.pmc
but he old GC.metrics/pmc are retained for backward compatibility
.. some users get confused, so make the splitter sit
in the middle (ish) to help them
.. need to still fixup save/restore splitter position
to chart config.
.. instead of hacking the text to avoid a global world
transform we now transform y ourselves
.. it looks like text needs to be centered will test and
fix shortly.
.. was using invertColor and resulted in white on dark for the
default setup and was very jarring. The color is toned down
to a gray if it results in white.
.. add a new method to fetch a data.frame of PMC data
for the passed metric, by default it returns for the
selected date range, all=TRUE will fetch all dates.
.. GC.activity(compare=TRUE) will return a list of compares
.. If you are not in compare mode it will be 1 element long
and represent the currently selected ride
.. otherwise it will have one entry for each activity dropped
into the compare pane
.. each element has a $activity and a $color
Example:
df <- GC.activity()
.. do plot ..
Now:
compares <- GC.activity(compare=TRUE)
for (compare in compares) {
df <- compare$activity
col <- compare$color
.. do plot ...
}
.. you can pass all=TRUE|FALSE to GC.metrics if you want to
override the date range selection
.. also added connect to daterange select so a trend chart
will refresh when you select a date range
.. set a script to run when an activity is selected
.. this allows a plot to be generated and displayed when
you select a ride in analysis view
.. the script is stored with the chart settings
.. it now builds and runs on Windows
.. there is a runtime crash when embedded R is initialised
that needs to be reolved
** NOTE **
R is not distributed with a .lib that can be linked to
with the MS VC linker. Instead, we need to generate a
lib and exp file from the dll:
1. dumpbin /exports R.dll > R.def
2. edit the .def output to have EXPORTS at the top and
a list of functions only (last column, delete the rest)
3. lib /machine:x64 /def:R.def
After linking remember to copy the DLLs to the GoldenCheetah
build directory from the $R_HOME/bin/x64/*.dll
.. and a few more tidy ups.
.. never cease to be amazed at how some developers
will feel its OK to define generic symbols like
TRUE and FALSE in their code (!!)
.. R is a mess.
.. mostly startup issues when R_HOME is not known
.. need to think carefully about how we get the user to
register the R home. We could let them select the R
binary so we can run `R RHOME` and apply that (?)
.. we no longer need RInside or Rcpp as we use
100% R API calls to embed
.. the following need to be resolved:
1. R_HOME / Options *must* be set to startup
embedded R but we don't check / restart or
default via system("R HOME")
2. Output is not trapped - all output is sent
directly to the console you started GC on
.. will fixup the 2 above before finally:
3. Build for Windows using MSVC !
.. we can register routines when embedding via the
R_getEmbeddingDLLInfo()
.. so we just register our functions directly now
in RTool rather than needing a dynamic library.
.. its cleaner and there are no nasty casts and build
settings required
.. reimplemented with native R API
.. switched to .Call in R function since .C means all functions
return void and must return by a pass by reference parameter.
.. its not needed as the workaround of using an extern "C" function
to perform the function pointer cast conforms to standard.
.. this just simplifies src.pro that was getting heavy
.. fixup R SHLIB build and integration to work on OSX
**** WARNING ****
If you build for OSX with GC_WANT_R You will need to
manually copy RGoldenCheetah.so into the app bundle.
$ cp RGoldenCheetah.so ./GoldenCheetah.app/Contents/MacOS
*****************
.. phew. that was hard.
.. To register routines with R you need to place them in a shared
library.
.. The routines we want to register are part of the GC codebase so
cannot be linked into that shared library (it would be the whole
of GC).
.. So; we have a shared library (RGoldenCheetah.cpp) which has stubs
for all the registered functions and an array of pointers to the
actual functions.
.. We load the library (once R is embedded it is loaded in main.cpp)
.. After the library is loaded we then call one of its public
functions (GCInitialiseFunctions) to tell it where all the GC
functions are (we only have GCdisplay at present for this proof
of the concept).
.. Along the way we need to deref/cast DL_FUNC in RTool.cpp which
is not permitted in ISO C, so we also update qmake to add a
special rule to compile `dodgy' sources with -fpermissive. And
the only dodgy source is RTool.cpp.
.. This commmit will break GC_WANT_R builds on OSX, and will be
fixed up shortly.
.. The motivation behind this is to avoid RInside/Rcpp for Windows
builds -- enabling R support (which is not currently possible).
.. to use the R C API for to avoid use of Rcpp and RInside
.. the shlib doesn't do anything and isn't loaded in RTool
at this point. Need to get this working cross-platform
and iron out the build time nits.
.. so don't even try to build and warn via qmake
.. RInside/Rcpp do not suport MSVC
.. Microsoft Open R may help, but doesn't at this point
.. we can revisit at a later date.
.. not complete, but we now have a canvas (QGraphicsView)
to plot the R output without needing to use x11() or
quartz(), window() etc.
.. the primitives do not honour the graphic engine context so
all lines etc are white on black.
.. will fix and improve in followup commits, need to test
with QT4.8 and cross-platform.
.. since the R runtime is shared by charts we offer the ability
to prefix variables with $$ to ensure they don't conflict
across multiple RCharts.
.. $$d <- GC.activity() would actually be parsed within R as
gc0d <- GC.activity(). The next chart would get gc1 and so
on.
.. it is optional, so charts could share data structures (but
wonder why you might do that)
.. we still need to encapsulate the code to plot within a
script to ensure it is refreshed when the chart is selected
or underlying data changes.
.. believe it or not the R base code for plot (plot.c)
skipped plotting circles if they were white on white.
.. took me 4 hours to fix this by setting startcol and
startfill in DevDesc for the device.
.. But at least the R driver now works properly -- we can
now integrate with a qt widget.
.. the R graphics device now gets called for hist() so we can
work on the interaction with a QT widget now.
.. still have other problems to deal with (!)
.. GoldenCheetahGD is instantiated
.. GC.display() to create new GD
GC.activate() to activate the GD
NOTE: a fair amount of qDebug() in at present as
the graphics functions are being created.
.. don't crash when cannot initialise (e.g. when RInside not
available or R is not installed)
.. handle messaging via signals to trap 'late' messages from
the R Runtime
.. refactoring code to introduce an RTool for working
with RInside and Rcpp and move code away from main.cpp
.. get ready to write all the data accessors in a way
that supports multiple athlete windows.
.. now have a console in the RChart to issue R commands.
Its very basic and doesn't handle multi-line commands
well nor support up/down to cursor through history.
.. added a "GC" object with 3 variables
GC.version - a version string
GC.build - build id, later always higher
GC.home - root of all athlete directories
.. No access yet to athlete, metrics, models and rides.
This will come very shortly; need to decide on best
way to handle accessing different athletes within
a single global context.
.. of you cancel before opening an athlete you get a SEGV
on some platforms under some conditions (threads)
.. we now tidy up a little better and avoid deleting static
objects when application->exec() has not been called.
.. still working on the build/configuration to get things
started. main.cpp now creates an instance of RInside
that is shared by all athletes/charts.
.. not clear if this is going to work (!)
.. pushing to repo to test cross-platform support during
development. It /should/ not impact any code since it
will be an optional dependency.
.. first part just to get the configuration ready to
build out a chart for the trend and activity view
.. src.pro and gcconfig.pri are updated to link in with
the RInside/Rcpp package install (new dependency)
.. there is a script in util called install-packages.R
which can be run to install the packages so long as
R is available:
$ R CMD BATCH util/install-packages.R
.. if NOWEBKIT is set in gcconfig.pri when QT < 5 we unset it, since
it is only supported for QT versions > 5.0 where QWebEngine is
available
.. gcconfig.pri.in has also been updated to have a line to set
NOWEBKIT as a signpost to the user
.. we /could/ use the sed s/#DEFINES/DEFINES technique in .travis.yml
now to set NOWEBKIT always and it will only take effect if building
with QT5
... using AppVeyor.com
... only 64Bit builds with QT 5.6.0 / MSVC2015
... all libraries included (pre-compiled)
... using QtWebEngine configuration, not QtWebKit
When there are (planned) activities with future days it is
annoying to start at the latest planned activity, this change
try to select the latest which is not in the future.
.. in RideSummaryWindow we update to show
progress of the model estimates, but it
errors if the html is not set or is blank
and does not contain the div 'modhead'.
The following will always be located in the
source directories so we can find them across
the different trees:
* ../lib/libqwt.a
* ../kqoauth/libkqoauth.a (linux only)
* ./Resources
The references are made via $${PWD} which is
the directory for the currently processed
.pro file.
.. LYC set the date to 2000 from 2016 !
.. we check the date when downloading from a CERVO and if the year
is set to 2000 we set it to the current year.
.. if the date resulting is in the future (e.g download a ride in Jan
2017 from a ride in Dec 2016) then we subtract a year.
.. it will be interesting to see what happens in 2017 !
.. remove Webkit dependency if the user adds the following
to their gcconfig.pri: DEFINES += NOWEBKIT
.. at present the build disables:
* Bing map
* Google map
* Ride Window
* Street View
.. since QT 5.6 enables c++11 dependent libs may no longer
compile with c++11 enabled (e.g. qwtplot3d)
.. this is experimental and in place to enable further work
on deprecating the webkit dependency in GoldenCheetah v4.0
.. notably c++11 needed which breaks a few dependencies
.. WebKit is not available and breaks our builds
.. we will likely need to fixup WebEngine and c++11 in some
fashion. This may mean we deprecate qwtplot3d and we
pre-build WebKit for builds
.. there is a fixup for this in Qt 5.6 but not prior and
it causes horrible performance problems on the QXT
span slider on Linux, which is irritating when trying
to zoom into an area of a ride.
.. when searching for weight in withings readings there will
be measurements that do not include weight -- these are
now skipped to avoid returing a 0kg weight.
.. don't paint dots for cost > 100kJ. It was good for debugging
and checking the solver, but now its just distracting and a
very large performance overhead.
.. probability(), temperature() and neighbour() functions were
not implemented for a correct SA implementation.
.. results still need to be constrained to avoid solutions that
are implausible for the athlete status or history
.. added a solver using a simulated annealing algorithm.
.. the solver is constrained to physiologically plausible
values, but these may not be valid for the athlete. So
a second update is required to allow the user to constrain
the solver.
.. secondly, the algorithm cannot be halted and doesn't use
multiple CPUs/threads should they be available this should
be in a second update to part 2
.. finally, a visualisation is needed to show the solver progress
across the search space to give the user an indication of
where the best solutions were found (especially if they don't
constrain it themselves).
.. add the dialog to mainwindow, but not functioning.
.. Part 2 will add the Solver and Part 3 will add the
progress visualisation.
[this is a recommit after reverting the previous one
that borked line endings to MSDOS crlf]
For builtin metrics it shows the newly added description if available
and refers to the Glossary otherwise
For user defined metrics it is the text provided by the user
Complete descriptions for Running and Swimming metrics and partial
update for BasicMetrics, it defaults to a message referring to the wiki.
Fixes#1850
.. rather than only build with Google Drive support if
using QT5.4 just adapt the code to avoid issues with
QJsonObject -> operator present in QT5.x < 5.4.
.. see https://bugreports.qt.io/browse/QTBUG-29573
.. when saving weight/height the saveClicked() function was using the
value in context->athlete->useMetricUnits to decide if to perform
conversion of the values stored in the widgets -- BUT -- it will
reflect the value BEFORE our update since it has not been updated
yet (via the configChanged() signal.
.. instead we look at the pending value when deciding if the values
need conversion.
Fixes#1868
.. previously it was disabled via VLC, but if you're not running
with video then the screensaver will kick in on Windows.
.. we now disable it via the Windows API too
Fixes#1859
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.
.. using scatter plot of metrics as a basis to develop a class
hierarchy to replace all chart 'types' by a single suite of
classes
.. this is to enable easier additions of features like interval
analysis and UX as well as greater consistency (data that is
available, functions etc)
.. but for v4.0 we will just use this to introduce a scatter plot
for the trends view and develop it further in v4.1
.. this is the initial class design.
Some files were not shown because too many files have changed in this diff
Show More
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.