Commit Graph

57 Commits

Author SHA1 Message Date
Mark Liversedge
923444584a Formula Signature
.. to use when e.g. using a data filter as an input
   into the PMC functions. The data series is stored
   against a signature for the function as opposed to
   the metric symbol.
2015-08-20 18:35:45 +01:00
Mark Liversedge
ee3322fb85 FilterEdit Colors
.. time to move on now, this is slightly
   embarassing.
2015-08-20 07:18:47 +01:00
Mark Liversedge
982ff35653 FilterEditor Tweak Cosmetics
.. courier font

.. syntax coloring follows common "windows IDE"
   conventions (comments green, symbols blue etc)
2015-08-20 07:14:11 +01:00
Mark Liversedge
5a932ee435 Add brace balancing in Filter Editor
.. for finding partner parenthesis
.. for showing unbalance parenthesis
2015-08-19 22:23:30 +01:00
Mark Liversedge
4cd007ddf2 Fix Syntax Highlighting
.. distinct from parser now, so not susceptible
   to parsing / syntax errors in formula.

.. still need to do brace matching.
2015-08-19 21:02:08 +01:00
Mark Liversedge
5cca6cd259 Deprecate parser syntax highlighting
.. but do continue to highlight bad symbols etc
   with a red wavy line.

.. still need to;
   a) syntax highlight in the formula edit (just symbols
      and literals, not parsing content)

   b) add an error navigator to click on errors and have the
      text highlighted that incurred that error.
2015-08-19 12:50:38 +01:00
Mark Liversedge
a9d6fcab75 Fix DataFilter regression
.. the daterange() commit broke almost every builtin
   function ! (it converted them to integers due to
   and if/else logic error.

.. also tidied parser to separate literals and symbols
   whilst making builtin functions expr elements to
   look more closely at precedence
2015-08-17 22:00:15 +01:00
Mark Liversedge
a460e6c40e Fixup unary '-'
.. so date-9 is not treated as "date" "-9" but
   instead as "date" "-" "9"
2015-08-17 15:21:24 +01:00
Mark Liversedge
cc628d6ce6 Syntax highlighting from parser
.. oopsie on binary expression.

NOTE: it may be better to highlight tokens rather than
      via the parser as errors make it impossible to
      highlight the "intention" of the user
2015-08-16 22:24:49 +01:00
Mark Liversedge
0e9d0c06f7 Formula sum, mean, max, min, count functions
Particularly useful when working with a vector
but can be used with other things.

e.g. max(xPower, BikeScore)

Or, for getting a ride's TSS expressed as a percentage
of the average TSS for the currently selected daterange.

e.g. TSS / mean(TSS[daterange(start):daterange(stop)])
2015-08-16 19:49:16 +01:00
Mark Liversedge
73dfbb0dd8 Formula Editor error highlighting
.. using red wiggly line

.. still need to find a way of providing the
   parsing errors messages and navigating to
   the part they are complaining about.
2015-08-16 18:32:32 +01:00
Mark Liversedge
35448bdc6a Formula Vectors
You can create a vector using the notation:

   expr [ from : to ]

   Where 'expr' will be evaluated for every activity
   between the dates from and to.

   e.g. TSS[today - 90 : today]

   will evaluate to TSS for the last 90 days

   e.g. Activities [ date:date ] > 1

   Will find all days with more than one workout.

.. when using a vector in any arithmetic expression it
   will be evaluated to a sum; this will be fixed shortly
   to enable the use of sum/mean/max/min functions.

.. If needed we can add vector operations but this will
   likely confuse many users (hell, they confuse developers)
   so we will need a good reason to add them !

Lastly, I have also added daterange(from) and daterange(to)
literals to get access to the currently selected daterange
when working in the trends view.
2015-08-16 17:23:46 +01:00
Mark Liversedge
84053c8dca Formula Editor Improvements 1 of 2
.. update the editor to do some basic syntax
   highlighting; literals in red, comments in
   blue and so on.

.. next commit will focus on highlighting errors
   with a wavy line and some form of error list.
2015-08-15 23:47:04 +01:00
Alejandro Martinez
5649575b2d Minor changes for DataFilter to compile on MinGW 2015-08-15 11:46:32 -03:00
Mark Liversedge
7728b3fabf DataFilter Functions and "math"
.. updated the datafilter to handle general functions
   and parse them without needing them declared in the lexer

.. makes it much easier to add new functions in the future

.. did this to add core math functions;
   *  sin, cos, tan, asin, acos, atan,
   *  sinh, cosh, tanh, asinh, acosh, atanh
   *  exp, log, log10, ceil, floor, round
   *  fabs, isinf, isnan

.. we can add more later; erf/gamma spring to mind !
2015-08-15 14:17:53 +01:00
Mark Liversedge
2e2e9c39e7 Formula const()
.. for pi and e, we can add more later
   i.e. const(pi) and const(e) return high
   precision values for both
2015-08-15 10:33:09 +01:00
Mark Liversedge
b5ce92a045 Formula config() function and test charts
.. added config(cv) .. config(pmax) etc

.. also added some test charts including one that
   just displays configuration
2015-08-14 22:10:29 +01:00
Mark Liversedge
480c9d0d04 LTM Plot Formula Part 2 of 2
.. added to LTMPlot and DataFilter methods

.. very rough and ready, but works.

.. can refine and enhance now basics are in place.
2015-08-13 12:35:17 +01:00
Mark Liversedge
6f37b208b3 DataFilter Conditional Expression
.. uses the C/C++ notation:

   expr ? expr2 : expr3

   Where expr is the condition e.g. X>2
   and expr2 is what to evaluate to if expr is true
   and expr3 is what to evaluate to if expr is false

   e.g.

   (Workout_Code = "1L3") ? 1 : 0

   Will evaluate as 1 for all workouts where the
   workout code is 1L3 and 0 for all other workouts.
2015-08-13 09:24:26 +01:00
Mark Liversedge
d0cfd5f663 Refactor DataFilter
.. get rid of terrible cut and paste code, duplicating
   eval for particular leafs

.. eval returns a Result() object which can be numeric
   or textual (date strings are parsed to numeric)

.. can now add formulas to LTM as well as adding more
   functions that may be useful (conditionals, maths
   spring to mind first).
2015-08-12 10:07:11 +01:00
Claus Assmann
1d5755443d Fix comment typos 2015-06-07 16:31:56 +01:00
Mark Liversedge
836e07d287 Added isSwim
.. to RideItem and DataFilter
2015-01-07 10:14:53 +00:00
Mark Liversedge
794b43c32b Reinstate Ramp Rate (RR)
.. on LTM plots

.. and rr(metric) function in datafilter
2015-01-02 12:05:41 +00:00
Mark Liversedge
22beffa12b DataFilter Dynamic Bug
.. leaf traversal returned parent dynamic not ours.
2015-01-01 20:04:27 +00:00
Mark Liversedge
a8856f94d2 Leaf::isDynamic SEGV
.. traversing null branches.
2015-01-01 19:30:34 +00:00
Mark Liversedge
0e94bb8520 Dynamic DataFilter Query
.. will rerun as ride selection changes.

.. but will never stop until cleared so use at your
   own risk, as will run EVERY time you select a
   different ride.
2015-01-01 17:57:36 +00:00
Mark Liversedge
e5f91f097e Datafilter date 'current' to complement 'today'
.. but need to think how we can refresh when current ride changes.
2015-01-01 16:40:40 +00:00
Mark Liversedge
255f69c1ad ConfigChanged Part 1 of 3
.. introduce concept of configChanged(what) to
   pass details of what config has been changed

.. fixed zones changes to re-read after write
   to correct the save twice to get changes to
   zones bug.

.. next parts need to spot changes (part 2) and
   then action appropriately (part 3)
2014-12-29 13:41:50 +00:00
Mark Liversedge
b854043971 Add Date strings to datafilter
.. to enable queries such as;

   Date > "2014/02/28"
   for rides since 28th February 2014

.. might be useful to allow localised dates
   but using this makes it easier to document !

.. a query like today > "1900/01/01" will pass
   on all rides, but user being an idiot.
2014-12-25 09:49:42 +00:00
Mark Liversedge
c7dc29fab6 Add Date arithmetic to DataFilter
.. use "Date" and "Today" which evaluate to the number
   of days since 1st Jan 1900.

.. so a filter for the last 90 days would be:
   (Today - Date) < 30

.. will add date strings next.
2014-12-25 09:12:34 +00:00
Mark Liversedge
01a6499fb0 Add ATL, CTL, TSB aliases to DataFilter
.. for sts(TSS), lts(TSS) and sb(TSS)
2014-12-21 19:01:02 +00:00
Mark Liversedge
b272ee63d8 Add PMC data filter functions
lts(metric), sts(metric), sb(metric) all return the PMC
value for the metric in question for the date of the ride
and therefore allow you to select rides based upon PMC data.

e.g. sb(TSS) > -5

could be considered a way of looking for rides when you were
in a well tapered state, or at least, when you should be able
to perform well.

or, e.g. lts(TSS) > 100

could be a way of looking for rides at peak form (if 100 is
a peak CTL for you).
2014-12-21 17:34:21 +00:00
Mark Liversedge
f111994d60 Introduce Specification class
.. used to create a 'specification' against which we match
   a rideitem when plotting etc.

.. so rather than passing an array/vector/list of data when
   calling a plot, we pass the 'specification' to use instead.

.. the plots themselves should now iterate across the shared
   ride cache only plotting the items that pass the specification.

.. this should reduce memory usage and increase performance.
2014-12-17 10:57:57 +00:00
Mark Liversedge
43b7e83a28 Migrate DataFilter to use RideCache
.. no longer uses metricDB but traverses in memory cache
   and should be a lot faster.

NOTE: the line endings for DataFilter.{cpp,h} have been
     changed from dos to unix format which has resulted in
     the entire file being changed, apologies but needed to
     clean that up anyway.
2014-12-16 10:57:22 +00:00
Mark Liversedge
43a9e12e15 Allow isRun in Filter
.. isRun is a bool, so isRun = 0 or isRun = 1
   will filter for runs.

.. note isRun does more than just look at sport
   it also checks if there are running data series
   in the file and may extend to more over time
2014-09-26 14:33:26 +01:00
Mark Liversedge
2ce9433a0f DataFilter handle metadata numerics
.. code assumed numeric fields always metrics when they
   could also be metadata.

.. this also fixes checkbox tests too
2014-06-19 21:25:58 +01:00
Mark Liversedge
98b8bc23aa Use w/kg units always, not wpk
.. and also allow lrbalance in data filter
2014-06-15 09:26:45 +01:00
Joern
af074d3e91 Bikescore (TM) unique Handling (Part 2)
... have the same consistent handling for (TM) at all visible places
... do not allow Translation of BikeScore (since it's a TM and might
cause unexpected behavior)
... Have (TM) sign everwhere visible - only in Searches just use
"BikeScore" as Symbol
2014-06-11 18:55:23 +02:00
Joern
1d366df734 Data Filter - Internal Field Names + Multiple tr()
... allow/use only internal field names (delivered by Column Chooser) in
Data Filter expressions
... multipe tr()

(cherry picked from commit bc4164adab74dd82c0a0307d7d0fbb736f95ef0d)
2014-06-09 20:26:43 +02:00
Mark Liversedge
82baf90131 QT5 -- 1 of 3
Porting the codebase to QT 5 (5.2) to get the
latest bug fixes, performance and improved platform
support.

This first part is to fixup the codebase to compile
on Qt 5, but some aspects have been broken (video).

The second part is to migrate from Qwt 6.0.1 to the
latest Qwt for multiaxis support.

The third part will be to fixup any platform specific
issues or issues identified at runtime.
2013-12-09 09:57:13 +00:00
Mark Liversedge
0a215562d5 Add Filter Sidebar
To allow selection of filters aka Named Searches when
plotting charts.

Fixes #732
2013-12-05 14:30:42 +00:00
Mark Liversedge
b23ed51fa4 Best aPower
Peak aPower durations now computed and cached;

* updated RideFileCache to work with aPower
* CP curve now allows you to plot aPower
* LTM plot allows you to plot aPower peaks
* DataFilter allows 'best(apower, duration)' function
2013-11-06 16:41:25 +00:00
Mark Liversedge
a8acdc8561 Fast Best and TIZ queries
Added static functions to ridefilecache
to get best and tiz values for series and duration
or zones and glued them in to the datafilter code
recently added.

It uses seek (via QDataStream::skipRawData) and is
quite fast on my Linux development PC.

We now need to update the LTM settings dialogs to
the new mockups so we can plot custom durations for
peak power / NP etc too.

NOTE: Not tried on Windows / Mac, so may not be quite
      so fast there, will need to check.

      To try this out, in the search filter box type:

            best(power, 3600) > 250

      to filter only those rides where the best hour
      power is greater than 250 watts. It should
      return almost instantly.
2013-08-04 15:45:55 +01:00
Mark Liversedge
2546b38ec2 Fix segv on filter '(NP)'
Fixes the crash but the eval code is a bit of a
fuck up. It was evaluating children instead of
using recursion, and now we have lots more types
and expressions its all a bit of a mess.

Will need to rewrite to use recursion and it will
be a lot simpler!
2013-08-04 11:40:44 +01:00
Mark Liversedge
cb5b128fb0 Forgot wpk 2013-08-03 22:16:12 +01:00
Mark Liversedge
6f1f35bcfb DataFilter update for formulas
Will now allow users to specify a formula using
the * / + - ^ operators. This can be used to specify
values (e.g. TSS > 100*2) or to calculate a totally
new user metric (e.g. Average_Heart_Rate / RPE).

Also added two functions as well;

1. best (series, duration)   which returns the best value
                             for the series of the given
                             duration in seconds.

                             Where series is one of; power,
                             hr, cadence, speed, torque,
                             xpower, np.

2. tiz (series, zone)        which returns the time spent
                             in the given series and zone
                             Where series is either power
                             or hr and zone is 1-10.

NOTE:

We know need to add the functions for retrieving the best and
tiz values from the ridefilecache without having to read the
entire file (ie. read the header and use lseek).
2013-08-03 21:25:26 +01:00
Mark Liversedge
12f63e2b73 Move specialFields from MainWindow to Context
.. and tidy up a few unneccessary references to mainWindow
2013-07-14 11:51:34 +01:00
Mark Liversedge
0fcbbe1b77 Refactor MainWindow Part 2 of 5
Decoupled classes from MainWindow to reference Context
and Athlete (and introduced a couple of new headers).

We no longer pass around a MainWindow pointer to children
but pass a context instead.

There are still a few pieces left in MainWindow that need
to move to a better place;
    * Setting/clearing filter selection
    * Working with Intervals
    * Adding/Deleting Rides
    * Save on Exit

As mentioned previously there are lots of other parts to
this refactor left to do;
    * break MainWindow Gui elements into Toolbar and Views

    * migrate from RideItem and Ridelist to ActivityCollection
      and Activity classes that are not tied into gui elements.

    * introduce Application Context and AthleteCollection
2013-07-11 14:02:02 +01:00
Mark Liversedge
c56c5a9567 MainWindow Refactor Part 1 of 5
Breaking the MainWindow 'god object' into
separate classes for Athlete and Context.

Further updates will need to;
- break MainWindow Gui elements into Toolbar and Views

- migrate from RideItem and Ridelist to ActivityCollection
  and Activity classes that are not tied into gui elements.

- introduce Application Context and AthleteCollection

Once these are done we will be in a position to decouple
most classes from mainwindow and also introduce tabbed
athletes.
2013-07-07 15:50:28 +01:00
Mark Liversedge
a18c7d68a2 Fix Filter on BikeScore and 95% heart rate
As the parser fell over on them due to special characters
and having to convert the TM symbol to an HTML escape.
2013-04-26 17:13:16 +01:00