Data Field: AppBuilder

By user request, this app lets you define your own data field, based on a simple math formula like cadence / 2.

If you want to get fancy, there's conditional expressions (like IF in Excel), functions for data analysis (like MIN and AVG), and the data field can also display the text of your choice. The resulting data can be (optionally) written to the activity FIT file.

With AppBuilder, you can implement almost any field that involves math, such as: calculating normalized power and saving the data to the FIT activity file, showing the average pace for even-numbered laps, or recording the amount of time you sprinted.

Full documentation and examples here:
http://ciq-appbuilder.blogspot.com/

AppBuilder 5:
Now with new features! AppBuilder 5 is a completely new app, so please check it out in the store if you are interested in any of the new features.
https://apps.garmin.com/en-US/apps/fd690281-9c22-4fee-a81e-3b7f39aa67c5

- Store up to four formulas per app. Switch between formulas directly on the watch, without using a phone or PC. With four clone apps, you can store up to 16 formulas total
- User variables. Allows for powerful formulas where information can be stored at one point, like the start of a lap, and used later. e.g. Lap elevation change
- Improved timeavg() options. Allows for simpler, more flexible normalized power function
- More functions and variables

4 clones of AppBuilder are available in the store, so you can have 2 formulas in the same activity
  • Hi

    Sorry to be a pain, but are there any plans to port this to the 1050 please?

    I think this could solve a problem for me

    Thanks so much!

  • Hi, there is a possibility to use any formula for show the GPS altitude instead the barometer ? Thanks!

  • Hi, there is a possibility to use any formula for show the GPS altitude instead the barometer ? Thanks!

    Sorry, no. Appbuilder doesn't have the ability to select the altitude/elevation source.

  • are there any plans to port this to the 1050 please?

    Hey, I've updated AppBuilder 5 to version 5.30, which adds support for new devices (including Edge 1050).

    It should be available in the store shortly.

  • Is a possibility to have 5+ too for Fenix 7 series? Thank you 

  • AppBuilder 5 updated to 5.32:

    - support new devices (Fenix 8 family, Fenix E, Enduro 3)

    - fix regression in 5.29

  • I have been using AppBuilder5 for about 5 years on a FR935 watch and a Edge 1030. Love it. Today I went to add a new function and hit some issues with gt, lt, > and <. I was trying to compare speed and only ever getting one result from a conditional. I subsequently tried all combinations of the previous 4 operands in this function if(1 gt 2,setv(1,1),setv(1,0));getv(1) and always got 0. This was all on the FR935 watch using v5.32. Suggestions please?

  • I loaded the same function on the edge 1030 running a much earlier version of AppBuilder (can't find a version number) but it produces the same results. if(2 gt 1,setv(1,1),setv(1,0));getv(1) produces 0. 2 devices, 2 versions suggests the issue is mine but I'm not sure why.

  • I have been using AppBuilder5 for about 5 years on a FR935 watch and a Edge 1030. Love it. Today I went to add a new function and hit some issues with gt, lt, > and <. I was trying to compare speed and only ever getting one result from a conditional. I subsequently tried all combinations of the previous 4 operands in this function if(1 gt 2,setv(1,1),setv(1,0));getv(1) and always got 0. This was all on the FR935 watch using v5.32. Suggestions please?

    The if() function in appbuilder isn't like an if-else statement in an imperative language, where only one branch is executed. Everything in appbuilder is an expression, and all expressions are always evaluated. So when you're dealing with a function that has side effects like setv(), you have to keep that mind. In this case, both instances of setv() are evaluated, and the 2nd one wins.

    The fix is to invert your logic so that the if() expression goes inside a single setv() expression:

    setv(1, if(1 gt 2, 1, 0)); getv(1)