Suunto app Forum Suunto Community Forum
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Register
    • Login

    [Question] No stupid questions - ask anything here

    Scheduled Pinned Locked Moved Suunto Plus Development
    136 Posts 38 Posters 14.5k Views 37 Watching
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • S Offline
      SuuntoPartnerTeam @assaf1007
      last edited by SuuntoPartnerTeam

      @assaf1007 You are using two different strings for getObject and setObject.

      This should be a minimal working example which pushes settings.active up by 1 whenever you start an exercise:

      var settings = null;
      function onLoad(input, output) {
        settings = {
          maxPace: 12,
          timelapse: 123,
          active: 0,
        };
        loadSettings()
      }
      
      var loadSettings = function () {
        var loaded = localStorage.getObject("appSettings");
        if (loaded != null) settings = loaded;
        // else localStorage.setObject("appSettings", settings);
      
        settings.active++;
        localStorage.setObject("appSettings", settings);
      };
      
      function evaluate(_inp, _out) {
        setText("#active", String(settings.active))
      }
      
      function getUserInterface() {
        return {
          template: 't'
        };
      }
      

      and the html:

      <uiView>
        <div>
          <div id="active" class="p-m">
            0
          </div>
        </div>
      </uiView>
      

      So:

      but i wish to be able to set values at the watch itself (if possible) … in such case, i need (= user need) some kind of a preliminary UI (before app starts) to be able to update settings…

      Possible indeed! The ‘tennis score pro’ application has a start screen which saves the settings for the next time.

      1 Reply Last reply Reply Quote 0
      • A Offline
        aenzed
        last edited by

        @suuntopartnerteam maybe not a stupid question, but is it possible to add two icons (a left and right arrow) to the f-ico classes in the style of F266 and F267? I was looking for something similar, but I wasn’t able to find it so I’ve just used F394 and F402 for now.

        1 Reply Last reply Reply Quote 0
        • A Offline
          AYamshanov Bronze Member
          last edited by

          Hi everyone,

          I have a quick question regarding BLE connectivity that might save me (and hopefully others) some time and unnecessary experimentation.

          I’m currently working on a small add-on that retrieves and displays data from an external third-party device via BLE. Thanks to the documentation, I’ve already built a basic prototype that proves the core concept works.

          However, I’ve hit a roadblock: the external device requires a PIN to establish a secure Bluetooth connection. When testing with devices that don’t require a PIN, the connection works flawlessly.

          My issue is that I cannot find any mention in the documentation on how to explicitly handle PIN entry during the pairing process.

          Does the current Suunto SDK support manual PIN entry pairing? If so, could someone point me toward the right methods or a code snippet?

          Any insights would be greatly appreciated!

          brechtvbB 1 Reply Last reply Reply Quote 0
          • Thibault B.T Offline
            Thibault B. Bronze Member
            last edited by Thibault B.

            It is me again with new questions 🙂

            1. Can we get current ZoneSense zone information? I have not found the key of such data.
              1.bis. Can we get user configuration regarding Intensity Zone he is interested in?
            2. I struggle to make the “PREV INT” data slightly bigger (not as big as current rest/int data - which is sp-d-s -).
              “PREV INT” data is currently sp-d-xs for which I tried to override font size, rescale. Note that on simulator it might looks fine but not on the watch (can be bigger but then uses a default font which includes big spaces between numbers, etc). Can someone help me for that? Thanks!
              suunto_app.png
            Raimo JärviR 1 Reply Last reply Reply Quote 0
            • brechtvbB Offline
              brechtvb Bronze Member @AYamshanov
              last edited by brechtvb

              @AYamshanov were you able to connect to your device? I try to connect to garmin speed and cadance sensor.

              Problem: suunto can register both of them (but also allows wheel radius setting on cadance sensor…) but in the end it cannot connect to both of them at the same time during workout.

              Now with a custom suunto app, i try to do that, but it always fails to connect to any of them.

              Line 175 always fails.

              9200471c-31fe-410f-9d05-7d88ab7bccb9-afbeelding.png

              933e3516-da42-4c41-92d0-751a892da685-afbeelding.png

              A 1 Reply Last reply Reply Quote 0
              • Josef NilssonJ Offline
                Josef Nilsson
                last edited by Josef Nilsson

                Im trying to make a copy of ErgSync but for my Merach R50. So far its actually working pretty well aka Im getting Strokes, power etc onto the watch and into the the activity file.

                My question is. Can I use that data as the primary source instead of the guesstimate that the watch makes itself?

                One of the short test rows I did went like this
                Via the watch:
                Distance: 577m
                Strokes: 57

                while the rower reported:
                Distance 0.52km
                Strokes: 56

                Can we replace the watch data with SuuntoPlus app data? Because I trust the distance reported by my rower more than the watch 🙂

                Edit: can we also change the suffix for pace? And make the distance always say in meters?alt text

                1 Reply Last reply Reply Quote 1
                • Raimo JärviR Offline
                  Raimo Järvi @Thibault B.
                  last edited by

                  @Thibault-B. said in [Question] No stupid questions - ask anything here:

                  1. Can we get current ZoneSense zone information? I have not found the key of such data.

                  It’s not mentioned in documentation, but editor’s autocomplete shows there’s /Fusion/Ddfa input resource. I’m not sure how that value maps to zones.

                  1. I struggle to make the “PREV INT” data slightly bigger (not as big as current rest/int data - which is sp-d-s -).
                    “PREV INT” data is currently sp-d-xs for which I tried to override font size, rescale. Note that on simulator it might looks fine but not on the watch (can be bigger but then uses a default font which includes big spaces between numbers, etc).

                  Watch has only a predefined set of font sizes (unless there’s been some improvements to font support). For numbers you should use one of the sp-d- CSS classes, those already cover the available font sizes.

                  Documentation has this somewhat vague sentence: “The older watches do not support every possible font size and thus using the css classes for font sizes (shown below) can generally lead to less errors.” This hints that there might be better font support in some watches, but I don’t know what “older watches” means here. In any case, if you want to support all watches, you’re probably limited to sp-d- classes.

                  Pragmatic Programmer

                  Thibault B.T 1 Reply Last reply Reply Quote 2
                  • Thibault B.T Offline
                    Thibault B. Bronze Member @Raimo Järvi
                    last edited by

                    @Raimo-Järvi
                    Thanks for your answer!

                    1. I hadn’t thought about exploring the autocomplete suggestions—great idea! It works really well. I mapped values to zones based on what I’ve observed in my previous activities using ZoneSense.

                    2. OK. Then, personally, I really miss an intermediate size between sp-d-xs and sp-d-s 😕
                      You seem to confirm that there’s no way to slightly increase the size (I was about to experiment with canvas…). Easily supporting all watches wasn’t my main concern anyway—I would have been fine defining this intermediate font size per watch model if needed.

                    3. Regarding older watches: does it still make sense to support watches older than the Suunto 9 Peak Pro, or is the information in the documentation confirmed?
                      “Note: SuuntoPlus is no longer maintained for UI1 (s, m, l).”
                      Does this mean that my app simply cannot be installed on those watches?

                    Raimo JärviR 1 Reply Last reply Reply Quote 0
                    • A Offline
                      AYamshanov Bronze Member @brechtvb
                      last edited by

                      @brechtvb I had an option to switch my device to NO_PIN mode and I followed this approach to continue development and do not stuck ¯(ツ)/¯

                      1 Reply Last reply Reply Quote 0
                      • Raimo JärviR Offline
                        Raimo Järvi @Thibault B.
                        last edited by

                        @Thibault-B. said in [Question] No stupid questions - ask anything here:

                        1. Regarding older watches: does it still make sense to support watches older than the Suunto 9 Peak Pro, or is the information in the documentation confirmed?
                          “Note: SuuntoPlus is no longer maintained for UI1 (s, m, l).”
                          Does this mean that my app simply cannot be installed on those watches?

                        Information in documentation is a bit vague again, but I think it’s trying to say that UI1 watches don’t get any updates to SuuntoPlus features. If you don’t use any SuuntoPlus features that have been added to UI2 watches (e.g. settings), I think apps should still work in UI1 watches. Older watches also have less JavaScript memory, that’s another potential cause for app incompatibility. But since I’m not aware of the latest SuuntoPlus developments, I may be interpreting the documentation incorrectly.

                        Pragmatic Programmer

                        Thibault B.T 1 Reply Last reply Reply Quote 0
                        • Thibault B.T Offline
                          Thibault B. Bronze Member @Raimo Järvi
                          last edited by Thibault B.

                          @Raimo-Järvi Make sense thanks.

                          Other question: how to make a pop-up like the multi-sport one when long pressing a button (progress ring, etc)? I saw the reference in documentation regarding the lock pop-up but it also lock the button which is not what I want. I want to use such pop-up as toggle for an option.
                          @suuntopartnerteam can you provide support on that? Thank you.

                          Raimo JärviR 1 Reply Last reply Reply Quote 0
                          • Raimo JärviR Offline
                            Raimo Järvi @Thibault B.
                            last edited by

                            @Thibault-B. You can catch long press with onLongPress in pushButton element. And maybe Popup example in SuuntoPlus editor could work for toggling an option. But I don’t know how to get the progress ring. I don’t know if it’s part of the multi-sport popup, or if it’s generic functionality that can also be used elsewhere. In theory, you could catch onLongPressStart and implement your own progress ring view, but that would probably be difficult to implement.

                            Pragmatic Programmer

                            1 Reply Last reply Reply Quote 0
                            • surfboomerangS Offline
                              surfboomerang
                              last edited by

                              Can a CSS guru help me out?

                              I want to show the current speed in the center of the screen. This works fine without a postfix, but as soon as I add a postfix, the speed fields shifts slightly to the left because both <span> elements are centered together.

                              How do I center the first <span> element and put the postfix right of it?

                                  <div class="sp-d-s p-hc" style="top:calc(87% - 50%e)">
                                    <span>
                                      <eval input="/Activity/Current/Speed" outputFormat="{zapp_speed_format}" default="--" />
                                    </span>
                                    <span class="cm-mid sp-t-s" style="padding-top:6px; padding-left:4px">
                                      <postfix />
                                    </span>
                                  </div>
                              

                              Suunto Vertical Titanium Solar
                              OnePlus Nord 4

                              1 Reply Last reply Reply Quote 0
                              • Timo HelferT Offline
                                Timo Helfer
                                last edited by Timo Helfer

                                Hey guys, could someone make HRV reading work?

                                I do not get the values, even tough the Suunto Smart Belt is conencted.

                                In the SImulator it says “undefined” for /HrvRmssd

                                3b15736a-9e26-4429-b7f4-d9b54347d637-image.png

                                1 Reply Last reply Reply Quote 0
                                • bhamp0B Offline
                                  bhamp0
                                  last edited by

                                  Hi guys!
                                  Is there any solution to get the NGP values?
                                  I tried two different syntaxes: /Activity/Move/-1/NormalizedGradedPace/Current and /Activity/Move/-1/NGP/Current but both are unrecognized.
                                  Thanks a lot 🙂

                                  1 Reply Last reply Reply Quote 0
                                  • bhamp0B Offline
                                    bhamp0
                                    last edited by bhamp0

                                    I tried to investigate a bit more about my own question.
                                    I’ve been able to find two files in SuuntoPlus Editor that are listing all the available ressources:

                                    • .vscode/extensions/suunto.suuntoplus-editor-1.42.0/node_modules/@suunto-internal/suuntoplus-tools/lib/project/resource-common.js <= for generic ressources, not depending on parameters <= big array
                                    • .vscode/extensions/suunto.suuntoplus-editor-1.42.0/node_modules/@suunto-internal/suuntoplus-tools/lib/project/resource.js <= for parametric ressources <= multiple regexes, still readable 🙂

                                    Can’t find anything related to NGP, so I might conclude this is not available?

                                    1 Reply Last reply Reply Quote 0
                                    • M Offline
                                      matram
                                      last edited by

                                      Tried to develop my own data screen.

                                      fc718e2e-4d56-48ae-a876-2fede0a9803a-image.png

                                      Nice experience so far, many thanks to the devs for making this possible.

                                      My question comes to the “big picture”. I want to do structured trading with my own data screen(s). Currently I am using intervals.icu although I have been hacking on my own FIT file editor. When intervals upload training session, I get an extra data screen from intervals which I cannot modify and I also have my normal data screens which are not aware of the structure of the training.

                                      Any hints on the best way forward to combine my data screen with structured training?

                                      D 1 Reply Last reply Reply Quote 0
                                      • D Offline
                                        DonTomGot @matram
                                        last edited by

                                        @matram How did you do this dual gauge-display? looks nice and I would be interested in learning more?

                                        M 1 Reply Last reply Reply Quote 0
                                        • M Offline
                                          matram @DonTomGot
                                          last edited by

                                          @DonTomGot
                                          I did this with a canvas.

                                          These are the building blocks for the gauges.

                                          // Draw an arc for a gauge
                                            // from   from angle in degrees
                                            // to     to angle in degrees
                                            // color  arc color
                                            // width  width of the arc
                                            function arcSegment(ctx, from, to, color, width) {
                                              ctx.beginPath();
                                              ctx.arc(
                                                radius, radius,          // center of display
                                                radius - 2 - width / 2,  // radius - leave a small margin outside arc
                                                Math.PI * from / 180,    // Angles from - to in degrees converted to radians
                                                Math.PI * to / 180   
                                              );
                                              ctx.strokeStyle = color;
                                              ctx.lineWidth = width;
                                              ctx.stroke();
                                            }
                                          
                                            // Draw the gauge background segments
                                            // segmentAngles      an array of angles dividing the range, 4 for 3-zone target, 6 for 5-zone model
                                            // segmentColors      the color for each segment
                                            // activeSegment      the index to the active segment, drawn thicker
                                            function drawGaugeBackground(ctx, segmentAngles, segmentColors, activeSegment) {
                                              // Margin needs separate treatment for top (negative angles) and bottom (positive)
                                              var halfMargin = (segmentAngles[0] > 0) ? -1 : 1;
                                          
                                              // Loop over all segments
                                              for (var i = 0; i < segmentColors.length; ++i) {
                                                var ang1 = segmentAngles[i] + halfMargin;
                                                var ang2 = segmentAngles[i + 1] - halfMargin;
                                          
                                                // Determine if segment is active or not
                                                var width = (i === activeSegment) ? 14 : 5;
                                                arcSegment(ctx, ang1, ang2, segmentColors[i], width);  
                                              }
                                            }
                                          
                                            // Draw a pointer for any gauge
                                            // ctx    context
                                            // angle  angle to draw arrow at, -90 top center, +90 bottom center
                                            function pointer(ctx, angle) {
                                              var ptrHeight = 25;     // Height of gauge pointer in pixels
                                              var ptrAngle = 3;     // Half angle of gauge pointer in degrees
                                          
                                              ctx.beginPath();
                                              var x1 = (radius - ptrHeight) * Math.cos(Math.PI * angle / 180) + radius;
                                              var y1 = (radius - ptrHeight) * Math.sin(Math.PI * angle / 180) + radius;
                                              ctx.moveTo(x1, y1);
                                          
                                              var x2 = radius * Math.cos(Math.PI * (angle - ptrAngle) / 180) + radius;
                                              var y2 = radius * Math.sin(Math.PI * (angle - ptrAngle) / 180) + radius;
                                              ctx.lineTo(x2, y2);
                                          
                                              var x3 = radius * Math.cos(Math.PI * (angle + ptrAngle) / 180) + radius;
                                              var y3 = radius * Math.sin(Math.PI * (angle + ptrAngle) / 180) + radius;
                                              ctx.lineTo(x3, y3);
                                              ctx.fillStyle = ptrColor;
                                              ctx.closePath();
                                          
                                              // Stroke with black, to create a margin around the arrow
                                              ctx.strokeStyle = bkgColor;
                                              ctx.lineWidth = 3;
                                              ctx.fill();
                                              ctx.stroke();
                                            }
                                          

                                          And here the two gauges are rendered …

                                          // The function redraws both top gauge for pace target bottom gauge for HR zones
                                            var renderGauges = function(ctx) {
                                          
                                              // Top pace gauge - first background
                                              var targetLow = 0.97 * paceTarget;
                                              var targetHigh = 1.03 * paceTarget;
                                              var segmentAngles = [-135, -105, -75, -45];
                                              var segmentColors = [outColor, inColor, outColor];
                                              var activeIndex = getActiveTarget(currentPace, targetLow, targetHigh);
                                              drawGaugeBackground(ctx, segmentAngles, segmentColors, activeIndex);
                                          
                                              // Then draw the pointer
                                              var paceAngle = -135;
                                              if (typeof currentPace != 'undefined') {
                                                var fPace = (currentPace - 0.5 * ( targetHigh + targetLow)) / (targetHigh - targetLow);
                                                fPace = Math.min(Math.max(fPace, -1.5), 1.5);
                                                paceAngle = -90 + fPace * 30;
                                              }
                                              pointer(ctx, paceAngle);
                                          
                                              // Bottom HR Zone gauge - background
                                              var activeZone = getActiveZone(currentHR, hrZones);
                                              var zoneAngles = getZoneAnglesHR(activeZone);
                                              drawGaugeBackground(ctx, zoneAngles, zoneColors, activeZone);
                                          
                                              // Compute angle for HR pointer
                                              var hrAngle = 135;
                                              if (typeof currentHR != 'undefined') {
                                                var fZone = (currentHR - hrZones[activeZone]) / (hrZones[activeZone + 1] - hrZones[activeZone]);
                                                fZone = Math.min(Math.max(fZone, 0), 1);
                                                var aLow = zoneAngles[activeZone];
                                                var aHigh = zoneAngles[activeZone + 1];
                                                hrAngle = aLow + fZone * (aHigh - aLow);
                                              }
                                              pointer(ctx, hrAngle);
                                            }
                                          

                                          You will need to refresh the canvas and subscribe in .onActivate.

                                          <uiView
                                          onActivate = "
                                            $.subscribe('/Dev/Time/Tick10hz', function(){ control('#cnv', 'REFRESH'); })
                                          
                                            // Subscribe to HR, pace and targets to use in drawing gauges in the canvas
                                            $.subscribe('/Activity/Move/-1/HeartRate/Current', function(v) { currentHR = parseFloat(v) * 60; })
                                            $.subscribe('/Activity/Move/-1/Speed/Current', function(v) { currentPace = parseFloat(v); })
                                            $.subscribe('/Zapp/{zapp_index}/Output/PaceTarget', function(v) { paceTarget = parseFloat(v); })
                                            "
                                          

                                          And of course add the canvas to HTML.

                                          <!-- Canvas holds top pace gauge and bottom HR gauge -->
                                              <object id="cnv" type="canvas"
                                                    build="ctx => renderGauges(ctx)"
                                                    style="position:absolute; left: 0px; width: 466px; top: 0px; height: 466px;" />
                                          

                                          This is my current iteration…

                                          44d451ed-2007-4a78-a23e-1db49e99b53f-image.png

                                          D 1 Reply Last reply Reply Quote 3
                                          • D Offline
                                            DonTomGot @matram
                                            last edited by

                                            @matram Fantastic! many thanks!

                                            1 Reply Last reply Reply Quote 0

                                            Hello! It looks like you're interested in this conversation, but you don't have an account yet.

                                            Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

                                            With your input, this post could be even better 💗

                                            Register Login
                                            • First post
                                              Last post

                                            Suunto Terms | Privacy Policy