fix(train): a day's skin temperature in time order, and its heart rate a point a minute without lost contact

The skin temperature's line ran backwards in places: the band's samples
aren't always in time order, and neither the Loop's lines, nor the kept
day, nor the chart sorted them. They are sorted now, a time given twice
kept once, as the lines are read and as a kept day is opened, and
WorkoutChart draws any points in the order of their x, from the least
to the most.

The heart rate spiked down: the band writes 0 where it lost contact,
and each run's mean, the chart's one point a run, counted those in. A
value that isn't a heart's rate is 0, none read, in its place (so the
samples after keep their times), left out of every mean, days kept
before included; the chart draws the samples a point a minute, averaged
across runs, rather than one mean a run, which zigzagged where runs lay
close. ADR 0030, D65.

Whats-New: A day's skin temperature no longer runs backwards, and its heart rate no longer drops where the band lost contact.
Whats-New-De: Die Hauttemperatur eines Tages läuft nicht mehr rückwärts, und sein Puls fällt nicht mehr ab, wo das Band den Kontakt verlor.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
Tizian 「ティツィアーン」 2026-11-04 20:48:42 +01:00
commit ae3121310a
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64

View file

@ -696,8 +696,8 @@ Strava. What was found, 27 Oct:
sealed, so lines written meanwhile wait; the schedule is the phone's, for the last
person whose app opened with a band, and *Let the band go* stops it. Polar's
NONREM12 and NONREM3 are shown as light and deep sleep; the chart draws each 24/7
measurement's mean at its start; a night's times show in the phone's time zone. Not
yet tried with a Loop: whether the SDK's deletion includes its `until` day, and
measurement's mean at its start (a point a minute since D65); a night's times show
in the phone's time zone. Not yet tried with a Loop: whether the SDK's deletion includes its `until` day, and
whether the job connects to the band in the background, are for a real band.
- **D39 The Loop's training sessions are workouts** (recommended, the developer's; 28
@ -1731,6 +1731,19 @@ Strava. What was found, 27 Oct:
provider takes one from `MAP_DARK_STYLE_URL` (HTTPS, else none: the light style
in both themes). A dark Liberty made in the app (its colours inverted) was the
alternative, a style of the app's own for a provider's tiles it can't know.
- **The day's charts**: the skin temperature was drawn backwards in places, as the
band's samples aren't always in time order and nothing sorted them; they are
sorted, a time given twice kept once, as the Loop's lines are read and as a kept
day is opened (`skinInOrder`), and every line chart (`WorkoutChart`) draws its
points in the order of their x and spans their least to their most
(`chartInOrder`). The heart rate spiked down: the band writes 0 where it lost
contact, and a run's mean counted those in. A value that isn't a heart's rate
(0, or beyond 250) is 0, none read, as the lines are read, kept in its place so
the samples after keep their times, and left out of every mean, also of days
kept before. The chart draws the samples themselves a point a minute, averaged
across runs (`heartByMinute`, a second between a run's samples), not one mean a
run, which zigzagged where runs lay close. Dropping the zeros from the list was
the alternative; it would have moved the later samples' times.
## Consequences
- Train's sensors are one pattern: open profiles read by the app itself, on the phone;