Forerunner 955: drawAngledText() and drawRadialText() return Symbol Not Found Error.

Heya !

I'm making an app where the watch isn't really supposed to be worn while in use, and it would be far more convenient to have the app rotated 90 degrees to get the watch straps out of the way.
I wanted to do this with dc.drawAngledText(); but in both the simulator and on the real watch [ fr955 ], it returns Symbol Not Found Error.

There was a similar discussion opened a couple of months ago regarding the fr165, where Kyle.ConnectIQ said:
"We're looking into this and will be working on a fix. In the meantime, using has checks will prevent the crash. I can confirm this is only affecting the fr165 and fr165m."

If my code isn't awful, this quote contains two false statements. The fr955 passes the has check for both drawAngledText() and drawRadialText() and still throws the error when either is called.

dc.setColor(Graphics.COLOR_WHITE, Graphics.COLOR_BLACK);
dc.clear();
if(Graphics.Dc has :drawAngledText) {
        dc.drawAngledText (
            dc.getWidth() / 2,
            dc.getHeight() / 2,
            Graphics.VectorFont,
            (Globals.blackTimeLeft / 20).toString(),
            Graphics.TEXT_JUSTIFY_CENTER,
            90
    );
}

returns:
---
Error: Symbol Not Found Error
Details: 'Failed invoking <symbol>'
Time: 2025-04-09T19:51:26Z
Part-Number: 006-B4024-00
Firmware-Version: '22.24'
Language-Code: eng
ConnectIQ-Version: 5.1.1
Filename: Rapid
Appname: Rapid
Stack:
  - pc: 0x100008bf
    File: '/home/aesh/VSCodium-Projects/Rapid/source/RapidView.mc'
    Line: 53
    Function: handleTimerDrawing

Is there something obvious I'm missing or should I just rotate a bitmap for each character instead ?
Thanks !! [ Also sorry for asking so many questions xP ]

Top Replies

All Replies

  • As far as the 955, drawAngledText works fine for me in one of my test apps in the sim. - latest device files and 8.1.1 SDK

    You are doing a getVectorFont and not getting a null back, correct?

  • update to the latest SDK and update the fr165 device files.

    But if I understand correctly you're not supposed to use those functions on fr165.

  • With the latest device files for the 165/16m they work fine in the sim and on the real device with 22.24 fw.

  • But if I understand correctly you're not supposed to use those functions on fr165.

    I disagree. The history is:

    - the functions were removed in the device config (with note in SDK changelog)

    - the functions were removed in the real devices (users and devs noticed crashes immediately and posted about it in the forums

    - the functions were restored in the real devices, with note in device changelog: "Fix some Connect IQ app crashes when drawing radial or angled text." (Garmin explicitly addressed the concerns of users)

    - In the forums, Garmin *promised* to restore these functions in the device config (but didn't do so for weeks). (Garmin explicitly addressed the concerns of devs.)

    At some point it was *speculated* that maybe Garmin was never going to restore these functions in the device config. You actually halfway convinced me of this.

    - With the release of SDK 8.1.1 (April 1st, 8 days ago), the API docs were updated to reflect that the functions were restored (even though they weren't yet), and the changelog had a note: "Fixed a bug that could cause Graphics.Dc.drawRadialText()or Graphics.Dc.drawAngledText() to crash on some devices."

    - Finally, Garmin has actually updated the device configs

    With *all* of those things together, it's very unlikely that Garmin doesn't want devs to use those functions on fr165/fr165m. If devs would use those functions anyway, who could blame them either way? They're documented to work, they work in the sim, and they work on the real devices. Any dev who starts today (and many devs who started before) would have no idea of all the history, so it wouldn't be practical to expect them to not use functions on those devices just because they were once removed from those devices.

    What more could Garmin do except make a big announcement saying "It's ok to use drawAngledText and drawRadialText on FR165 and FR165 Music?" In fact, Richard.ConnectIQ said "The [FR165] device has the true type fonts available and it shouldn't require a GPU to render angled and radial text." 

    On the flipside, if you were Garmin and you *didn't* want devs to use those functions on fr165/fr165m, would you have taken *all* of the steps above? Obviously at some point they didn't want those functions to be used, but they have completely reversed every step they took in that direction.

  • You are doing a getVectorFont and not getting a null back, correct?

    The OP literally shows code with "Graphics.VectorFont" (incorrectly) being passed into dc.drawAngledText.

    update to the latest SDK and update the fr165 device files.

    This post is about fr955

  • Is there something obvious I'm missing

    The problem is with "Graphics.VectorFont" - that's the code which is triggering the "Symbol Not Found" error, not the call to drawAngledText.

    "Graphics.VectorFont" is just the name of the vector font class, you can't pass that in to drawAngledText, you have to pass in an actual instance of the class, which you obtain with Graphics.getVectorFont() [as per the docs].

    See the TrueTypeFonts sample in the SDK: command palette (CTRL/CMD-SHIFT-P) > Monkey C: Open Samples Folder

    I think it's a shame that the type checker can't catch this kind of problem at compile-time. I'll open a bug report but idk if it can be fixed.

  • Ohhhh that makes sense

    I looked at the docs for the order of the arguments for drawAngledText() and kinda glazed over that bit. I just knew that vector fonts were somehow different from FontDefinitions. I figured out how to define TTF fonts and use the FontDefinitions as vector fonts now

    Also thanks for letting me know about the samples folder -- I've just been referencing the /connectiq-apps repo until now xP