Mon filtre rejetait peut-être la montre, et mon message accusait le scan
Le dépôt était bien à jour : c'est moi qui avais mal lu mon propre code. Le message incriminé EST atteignable par la nouvelle version — l'état Bluetooth est publié, on passe au scan, et le publisher se tait quand même. Deux erreurs à moi, pas une du SDK. D'abord le message. Le publisher de `search()` reste muet dans DEUX cas : le scan n'a pas démarré, ou il tourne sans rien découvrir — `scanSubject` n'émet que sur découverte, et un `prepend` de liste vide n'émet pas. Affirmer « le scan n'a pas démarré » a fait chercher au mauvais endroit pendant trois itérations. Le message énonce désormais les deux possibilités, et le test qui verrouillait l'ancienne formulation vérifie maintenant qu'on n'affirme rien de trop. Ensuite le filtre. `scanPreFilter` rejetait tout ce qui n'avait ni polarDeviceId ni « polar » dans le nom. Si la Vantage ne s'annonce pas ainsi, c'est NOUS qui l'écartions, aucune session n'était créée, et le silence qui suivait était interprété comme une panne du SDK. On laisse donc tout remonter et on trie après : un test de ressemblance volontairement large (polarDeviceId, polarDeviceType, ou nom contenant polar/vantage/grit), et on n'ouvre de session que sur les candidats — ouvrir 43 sessions coûtait des minutes. Et si rien ne ressemble à un Polar, on RAPPORTE ce qu'on a vu : nombre et noms des huit premiers. C'est la seule façon de savoir sous quel nom la montre s'annonce, ou de constater qu'elle ne s'annonce pas du tout — auquel cas l'hypothèse du lien exclusif avec Polar Flow devient la bonne. 84 tests au vert. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -111,6 +111,9 @@ public enum PolarPftpError: Error, CustomStringConvertible, Equatable {
|
||||
/// opposés selon ce nombre.
|
||||
/// Une opération du SDK n'a pas rendu la main dans le délai imparti.
|
||||
case echeanceDepassee(Double)
|
||||
/// Le scan a vu des appareils, mais aucun ne ressemble à un Polar. Les
|
||||
/// exemples servent à voir sous quel nom la montre s'annonce réellement.
|
||||
case aucunPolarParmi(vues: Int, exemples: [String])
|
||||
case sdkSilencieux(vusParCoreBluetooth: Int,
|
||||
publisherAParle: Bool = true,
|
||||
erreurSdk: String? = nil)
|
||||
@@ -127,6 +130,14 @@ public enum PolarPftpError: Error, CustomStringConvertible, Equatable {
|
||||
case .bluetoothUnusable(let why):
|
||||
return why
|
||||
|
||||
case .aucunPolarParmi(let vues, let exemples):
|
||||
return "\(vues) appareil(s) Bluetooth vus, aucun ne ressemble à une "
|
||||
+ "montre Polar. Vus : \(exemples.joined(separator: ", ")). "
|
||||
+ "Si la montre est dans cette liste sous un autre nom, c'est le "
|
||||
+ "tri qui est trop strict ; si elle n'y est pas, elle ne "
|
||||
+ "s'annonce pas — probablement parce qu'elle est déjà liée à "
|
||||
+ "Polar Flow."
|
||||
|
||||
case .echeanceDepassee(let seconds):
|
||||
return "la montre n'a pas répondu en \(Int(seconds)) s. Réveiller son "
|
||||
+ "écran et la rapprocher de l'iPhone ; vérifier que Polar Flow "
|
||||
@@ -134,13 +145,15 @@ public enum PolarPftpError: Error, CustomStringConvertible, Equatable {
|
||||
|
||||
|
||||
case .sdkSilencieux(_, false, _):
|
||||
// Le publisher n'a JAMAIS rien émis : `search()` s'arrête sur
|
||||
// `monitorBleState().filter { $0 == .poweredOn }`. Le scan n'a donc
|
||||
// pas démarré — ce n'est pas « aucun appareil », c'est « on n'a
|
||||
// jamais cherché ».
|
||||
return "le SDK Polar n'a jamais signalé que le Bluetooth était prêt : "
|
||||
+ "son scan n'a pas démarré. Ce n'est pas la montre. "
|
||||
+ "Piste : le listener du SDK n'obtient pas l'état poweredOn."
|
||||
// ⚠️ Ne PAS conclure « le scan n'a pas démarré » : le publisher de
|
||||
// `search()` reste également muet quand le scan tourne mais ne
|
||||
// découvre rien — `scanSubject` n'émet que sur découverte, et le
|
||||
// `prepend(knownSessions)` d'une liste vide n'émet pas. Une version
|
||||
// précédente affirmait le contraire et a fait chercher au mauvais
|
||||
// endroit pendant trois itérations.
|
||||
return "le SDK Polar n'a remonté aucun appareil : soit son scan n'a "
|
||||
+ "pas démarré, soit il tourne sans rien découvrir. L'état "
|
||||
+ "Bluetooth, lui, a bien été atteint avant le scan."
|
||||
|
||||
case .sdkSilencieux(_, _, .some(let erreur)):
|
||||
return "le SDK Polar a répondu par une erreur : \(erreur)"
|
||||
|
||||
Reference in New Issue
Block a user