onTimerReset()

 I read that onTimerReset() isn't called for some devices when an activity is saved (e.g. Forerunner watches). Is this still the case?

If yes, how can I detect whether an activity is saved which is suitable for all devices? I would like to save some activity summaries to a log file via sys.println at the end of an activity.

  • Per the API doc, it's supported on everything, but I've not verified that.  Another option may be to check Activity.Info.timerTime or elapsedTime  in compute.

    You probably don't want to use println to save the data in any case.  With a sideload, pre-creating the log file is easy (it's just <myapp>.txt to match <myapp>.prg, but when something is downloaded from the store, the store assigns the prg name (8 characters and not consistent for different devices/users), so determining the name of the txt file is tricky.

  • Yes, that's what I want to do. Writing summary data to the txt file in the logs folder.

    Here is the link about the forerunner issue. This was 2 years ago so maybe it's now supported on everything.

    https://forums.garmin.com/developer/connect-iq/f/discussion/7770/ontimereset-and-ontimestop-data-not-saved-in-fit-file-when-calling-field-setdata

  • Another option may be to check Activity.Info.timerTime or elapsedTime  in compute.

    Jim, can you elaborate on your workaround? I have printed some log. You can see below.

    (lmf1)[2023-12-07 12:35:55] {D} View: elapsedTimeOrigin=(Number) 0
    (lmf1)[2023-12-07 12:35:55] {D} View: timerTimeOrigin=(Number) 0
    (lmf1)[2023-12-07 12:35:55] {D} View: timerState=(Number) 0
    (lmf1)[2023-12-07 12:35:56] {D} View: elapsedTimeOrigin=(Number) 0
    (lmf1)[2023-12-07 12:35:56] {D} View: timerTimeOrigin=(Number) 0
    (lmf1)[2023-12-07 12:35:56] {D} View: timerState=(Number) 0
    (lmf1)[2023-12-07 12:35:57] {D} View: elapsedTimeOrigin=(Number) 0
    (lmf1)[2023-12-07 12:35:57] {D} View: timerTimeOrigin=(Number) 0
    (lmf1)[2023-12-07 12:35:57] {D} View: timerState=(Number) 0
    (lmf1)[2023-12-07 12:35:58] {D} View: elapsedTimeOrigin=(Number) 0
    (lmf1)[2023-12-07 12:35:58] {D} View: timerTimeOrigin=(Number) 0
    (lmf1)[2023-12-07 12:35:58] {D} View: timerState=(Number) 0
    (lmf1)[2023-12-07 12:35:59] {D} View: elapsedTimeOrigin=(Number) 0
    (lmf1)[2023-12-07 12:35:59] {D} View: timerTimeOrigin=(Number) 0
    (lmf1)[2023-12-07 12:35:59] {D} View: timerState=(Number) 0
    (lmf1)[2023-12-07 12:36:00] {D} View: elapsedTimeOrigin=(Number) 0
    (lmf1)[2023-12-07 12:36:00] {D} View: timerTimeOrigin=(Number) 0
    (lmf1)[2023-12-07 12:36:00] {D} View: timerState=(Number) 0
    (lmf1)[2023-12-07 12:36:01] {D} View: elapsedTimeOrigin=(Number) 0
    (lmf1)[2023-12-07 12:36:01] {D} View: timerTimeOrigin=(Number) 0
    (lmf1)[2023-12-07 12:36:01] {D} View: timerState=(Number) 0
    (lmf1)[2023-12-07 12:36:02] {D} View: elapsedTimeOrigin=(Number) 0
    (lmf1)[2023-12-07 12:36:02] {D} View: timerTimeOrigin=(Number) 0
    (lmf1)[2023-12-07 12:36:02] {D} View: timerState=(Number) 0
    (lmf1)[2023-12-07 12:36:03] {D} View: elapsedTimeOrigin=(Number) 0
    (lmf1)[2023-12-07 12:36:03] {D} View: timerTimeOrigin=(Number) 0
    (lmf1)[2023-12-07 12:36:03] {D} View: timerState=(Number) 0
    (lmf1)[2023-12-07 12:36:04] {D} View: elapsedTimeOrigin=(Number) 0
    (lmf1)[2023-12-07 12:36:04] {D} View: timerTimeOrigin=(Number) 0
    (lmf1)[2023-12-07 12:36:04] {D} View: timerState=(Number) 0
    (lmf1)[2023-12-07 12:36:05] {D} View: elapsedTimeOrigin=(Number) 0
    (lmf1)[2023-12-07 12:36:05] {D} View: timerTimeOrigin=(Number) 0
    (lmf1)[2023-12-07 12:36:05] {D} View: timerState=(Number) 0
    (lmf1)[2023-12-07 12:36:06] {D} View: elapsedTimeOrigin=(Number) 0
    (lmf1)[2023-12-07 12:36:06] {D} View: timerTimeOrigin=(Number) 0
    (lmf1)[2023-12-07 12:36:06] {D} View: timerState=(Number) 0
    (lmf1)[2023-12-07 12:36:07] {D} View: elapsedTimeOrigin=(Number) 0
    (lmf1)[2023-12-07 12:36:07] {D} View: timerTimeOrigin=(Number) 0
    (lmf1)[2023-12-07 12:36:07] {D} View: timerState=(Number) 0
    (lmf1)[2023-12-07 12:36:08] {D} View: elapsedTimeOrigin=(Number) 368
    (lmf1)[2023-12-07 12:36:08] {D} View: timerTimeOrigin=(Number) 368
    (lmf1)[2023-12-07 12:36:08] {D} View: timerState=(Number) 3
    (lmf1)[2023-12-07 12:36:09] {D} View: elapsedTimeOrigin=(Number) 1295
    (lmf1)[2023-12-07 12:36:09] {D} View: timerTimeOrigin=(Number) 1295
    (lmf1)[2023-12-07 12:36:09] {D} View: timerState=(Number) 3
    (lmf1)[2023-12-07 12:36:10] {D} View: elapsedTimeOrigin=(Number) 2501
    (lmf1)[2023-12-07 12:36:10] {D} View: timerTimeOrigin=(Number) 2501
    (lmf1)[2023-12-07 12:36:10] {D} View: timerState=(Number) 3
    (lmf1)[2023-12-07 12:36:11] {D} View: elapsedTimeOrigin=(Number) 3296
    (lmf1)[2023-12-07 12:36:11] {D} View: timerTimeOrigin=(Number) 3296
    (lmf1)[2023-12-07 12:36:11] {D} View: timerState=(Number) 3
    (lmf1)[2023-12-07 12:36:12] {D} View: elapsedTimeOrigin=(Number) 4296
    (lmf1)[2023-12-07 12:36:12] {D} View: timerTimeOrigin=(Number) 4296
    (lmf1)[2023-12-07 12:36:12] {D} View: timerState=(Number) 3
    (lmf1)[2023-12-07 12:36:13] {D} View: elapsedTimeOrigin=(Number) 5295
    (lmf1)[2023-12-07 12:36:13] {D} View: timerTimeOrigin=(Number) 4993   <----- onTimerStop invoked. timerTime won't change how to know when did my user press the discard/save button.
    (lmf1)[2023-12-07 12:36:13] {D} View: timerState=(Number) 1
    (lmf1)[2023-12-07 12:36:14] {D} View: elapsedTimeOrigin=(Number) 6296
    (lmf1)[2023-12-07 12:36:14] {D} View: timerTimeOrigin=(Number) 4993
    (lmf1)[2023-12-07 12:36:14] {D} View: timerState=(Number) 1
    (lmf1)[2023-12-07 12:36:15] {D} View: elapsedTimeOrigin=(Number) 7296
    (lmf1)[2023-12-07 12:36:15] {D} View: timerTimeOrigin=(Number) 4993
    (lmf1)[2023-12-07 12:36:15] {D} View: timerState=(Number) 1
    (lmf1)[2023-12-07 12:36:16] {D} View: elapsedTimeOrigin=(Number) 8296

    (lmf1)[2023-12-07 12:36:16] {D} View: timerTimeOrigin=(Number) 4993
    (lmf1)[2023-12-07 12:36:16] {D} View: timerState=(Number) 1
    (lmf1)[2023-12-07 12:36:17] {D} View: elapsedTimeOrigin=(Number) 9296
    (lmf1)[2023-12-07 12:36:17] {D} View: timerTimeOrigin=(Number) 4993
    (lmf1)[2023-12-07 12:36:17] {D} View: timerState=(Number) 1
    app onStop

  • elapsedTime is the time since you first started recording and runs until you do a save or discard.  timerTime stops when you do a stop, which happenes if you are doing a pause, and contines when you restart (continue), so it's the time you were actually recording

    let's say you start recording, and record for a minute, then pause.

    elapsed time and timer time will both be 1 minute.

    then at minute two, you resume.

    elapsed time will be 2 minutes, timer time, one minute.

    a minute later, you stop again:

    elapsed will be 3 minutes. timer time, 2 minutes.

    if you then save or discard, both reset to 0.

  • I would use timerState and a flag - let‘s call it var actFlag = 0;

    Before starting an activity, timerState and actFlag are 0.

    After starting the activity, timerState > 0. Now set actFlag =1;

    Store all data for output in variables during activity.

    After the user has saved or discard the activity, timerStatus gets 0, but actFlag still is 1;

    Now write your data to the logfile (on compute) and after that reset your variables and set actFlag to 0.

  • Understand that setData doesn't actually write the data to a fit file.  It "primes" the data for the next time it's written.  calling setData after an activity has been saved/discarded doesn't do anything.

  • Ok, I thought the OP wants only write (println) to a logfile…

  • On some devices, after a save/discard your data field is no longer running so it can't do anything.

  • I thought the OP wants only write (println) to a logfile…

    Thanks, I want to do a BLE requestWrite. I will try your idea. I tried to do it in AppBase.onStop, but it doesn't work.:(

  • After the user has saved or discard the activity, timerStatus gets 0, but actFlag still is 1;

    But I didn't see a timerState =0 after discarding only stop

    (lmf1)[2023-12-07 12:36:12] {D} View: timerState=(Number) 3
    (lmf1)[2023-12-07 12:36:13] {D} View: elapsedTimeOrigin=(Number) 5295
    (lmf1)[2023-12-07 12:36:13] {D} View: timerTimeOrigin=(Number) 4993   <----- onTimerStop invoked. timerTime won't change how to know when did my user press the discard/save button.
    (lmf1)[2023-12-07 12:36:13] {D} View: timerState=(Number) 1
    (lmf1)[2023-12-07 12:36:14] {D} View: elapsedTimeOrigin=(Number) 6296
    (lmf1)[2023-12-07 12:36:14] {D} View: timerTimeOrigin=(Number) 4993
    (lmf1)[2023-12-07 12:36:14] {D} View: timerState=(Number) 1
    (lmf1)[2023-12-07 12:36:15] {D} View: elapsedTimeOrigin=(Number) 7296
    (lmf1)[2023-12-07 12:36:15] {D} View: timerTimeOrigin=(Number) 4993
    (lmf1)[2023-12-07 12:36:15] {D} View: timerState=(Number) 1
    (lmf1)[2023-12-07 12:36:16] {D} View: elapsedTimeOrigin=(Number) 8296

    (lmf1)[2023-12-07 12:36:16] {D} View: timerTimeOrigin=(Number) 4993
    (lmf1)[2023-12-07 12:36:16] {D} View: timerState=(Number) 1
    (lmf1)[2023-12-07 12:36:17] {D} View: elapsedTimeOrigin=(Number) 9296
    (lmf1)[2023-12-07 12:36:17] {D} View: timerTimeOrigin=(Number) 4993
    (lmf1)[2023-12-07 12:36:17] {D} View: timerState=(Number) 1
    app onStop