Projekt

Allgemein

Profil

Aktionen

Fehler #137

geschlossen
JH

ANT+-Pulsmesser werden jetzt gefunden und liefern den Puls (Gerätesuche und Pulsanzeige)

Fehler #137: ANT+-Pulsmesser werden jetzt gefunden und liefern den Puls (Gerätesuche und Pulsanzeige)

Von Julius Haman vor 5 Tagen hinzugefügt. Vor 5 Tagen aktualisiert.

Status:
Erledigt
Priorität:
Normal
Zugewiesen an:
-
Zielversion:
Beginn:
Abgabedatum:
% erledigt:

0%

Geschätzter Aufwand:
Gefunden in Version:

Beschreibung

ANT+-Pulsmesser (zum Beispiel der Brustgurt HRM 200) wurden bisher nie gefunden und lieferten keinen Puls. Das ist behoben:

  • Gerätesuche: Die Suche nach ANT+-Pulsmessern findet den Gurt und endet nach etwa 10 Sekunden mit der Anzeige der gefundenen Geräte.
  • Pulsanzeige: Der Puls des ANT+-Gurts kommt im Training an und stimmt mit dem Wert des Gurts überein.
  • Suche bei späterem Anlegen: Wird der Gurt erst nach dem Start angelegt, wird er weiterhin gefunden. Die Suche gibt nicht mehr nach etwa 30 Sekunden auf.
  • Suche nach ANT+-Trainern (FE-C): Wurde auf dieselbe Weise korrigiert, ist aber nicht auf echter Hardware geprüft.

Hinweis zum Test

  • Geprüft mit Garmin-ANT+-USB-Stick und HRM 200 am 08.10.2026: Gerätesuche findet den Gurt, Puls im Log stimmt.
  • Nicht geprüft: ANT+-Trainer (FE-C, Gerätesuche und Betrieb), da kein Trainer zur Verfügung steht.

Technische Details

Es waren mehrere voneinander unabhängige Fehler in AntInterface:

  • Broadcasts verworfen: ANT_Response.getMessageID() wirft bei Broadcasts mit erweiterten Nachrichten ("Response is not a response event"). Alle Rollen fingen die Ausnahme still ab und verwarfen damit jeden Broadcast. Die Einstellung für erweiterte Nachrichten bleibt vermutlich im Stick gespeichert, sodass auch der normale Pulskanal betroffen war (Vermutung, nicht einzeln belegt). Nun wird response.responseID direkt geprüft (HrDisplayRole, HrScanRole, FecScanRole, FecControlRole).
  • Puls-Decoder falsch: Der Decoder nahm nur Seite 0x20 und las den Puls aus Byte 4. Laut ANT+-HRM-Profil (D00000693) tragen alle Datenseiten 0 bis 7 (Bit 7 = Toggle) den berechneten Puls in Byte 7. Der Gurt sendet 0x0A/0x8A und 0x03, daher kam nie ein Wert an.
  • Such-Timeout des Scans: Der Scan wertete die Konfigurationsnachricht CHANNEL_SEARCH_TIMEOUT (0x44) aus, das echte Ende kommt als Kanal-Event EVENT_RX_SEARCH_TIMEOUT. Der Scan endete deshalb nie.
  • Exclude-Liste: includeExcludeList_Configure(..., false, ...) legt eine Include-Liste an (Parameter isExclusionList). Der Kanal hörte danach nur den bereits gefundenen Gurt. Außerdem wurde der Listenplatz immer mit 0 belegt, und unassignChannel vor dem erneuten Öffnen hätte die Liste verworfen. Jetzt: Exclude-Liste, ein Listenplatz je Gerät, Kanal wird nur geschlossen und wieder geöffnet. Die Reihenfolge folgt dem Beispiel der ANT-Spec: erst der Eintrag (Add Channel ID to List), dann Config ID List mit der Zahl der Einträge als Listengröße. Vorher wurde die Größe 4 gesetzt, bevor ein Eintrag existierte; die leeren Plätze sind undefiniert und können bei mehreren Geräten stören.
  • Blockierende Aufrufe im Callback: Die Befehle zum Weitersuchen laufen nicht mehr im Callback der ANT-Bibliothek, sondern in einem eigenen Task.
  • Pulskanal ohne Such-Timeout: Ohne explizite Einstellung schließt ANT den Kanal nach etwa 30 Sekunden Suche. HrDisplayRole setzt jetzt Search-Timeout und Low-Priority-Timeout auf 255 (unbegrenzt) und loggt Kanal-Events.
  • Log: Die Seitenmeldung im Pulskanal ignoriert das Toggle-Bit 7 und erscheint nur noch bei einer echten neuen Seite.
  • Fehlersichtbarkeit: Rückgabewerte von setNetworkKey, enableRxExtendedMessages, Listenkonfiguration und openChannel werden geprüft und gewarnt. Exceptions im Scan-Callback werden geloggt, weil die ANT-Bibliothek sie sonst verschluckt.
  • Neu: --raw-scan: Diagnosemodus, der im Scan-Modus jeden ANT+-Sender in Reichweite mit Geräte-Nummer, Device Type und Transmission Type loggt.

Hinweis zur Geräte-ID

Die Uhr (Garmin Instinct 2X Solar) zeigt für den Gurt die 20-Bit-ID 560741. ANT liefert Geräte-Nummer 36453 (16 Bit) und Transmission Type 0x81. Das obere Nibble (0x8) steckt im Transmission Type: 36453 + (0x80 << 12) = 560741. ErControl zeigt aktuell nur die 16-Bit-Nummer an, das kann für Nutzer wie ein anderes Gerät aussehen.

Quellen

  • ANT Message Protocol and Usage, Rev 5.1 (öffentlich bei Garmin: developer.garmin.com/downloads/ant/ANT_Message_Protocol_and_Usage_Rev_5.1_1.pdf):
    • 6.2 Inclusion/Exclusion Lists: Listen sollen beim Abmelden (unassign) des Kanals gelöscht werden.
    • 9.5.2.5 Channel Search Timeout: Standard 10 (25 s), 255 = unendlich.
    • 9.5.2.10 Add Channel ID to List: Listenplatz 0 bis 3, höchstens 4 Einträge.
    • 9.5.2.12 Config ID List: Exclude 0 = Include, 1 = Exclude.
  • Pulsprofil (Seiten 0-7, Puls in Byte 7): abgeglichen mit der Referenz-Implementierung incyclist/ant-plus, nicht mit der HRM-Spec D00000693 (kein Zugriff).

JH Von Julius Haman vor 5 Tagen aktualisiert Aktionen #1

  • Status wurde von Neu zu Erledigt geändert

JH Von Julius Haman vor 5 Tagen aktualisiert Aktionen #2

Ergänzt: Spec-Reihenfolge der Exclude-Liste (Nachtrag), Toggle-Bit im Log, Quellen.

Aktionen

Auch abrufbar als: PDF Atom