Ajoute une ligne horizontale orange sur chaque graphe indiquant le niveau
atteint au moment du dernier tir détecté, avec % du seuil dans le titre.
Permet de comprendre pourquoi un tir est déclenché même si le pic BLE
(20Hz) ne semble pas dépasser le seuil (résolution temporelle limitée).
Supprime le pic 1s (remplacé par le pic dernier tir, plus pertinent).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Supprime la 2ème courbe (trompeuse, difficile à interpréter correctement)
- Affiche dans le titre : valeur courante + pic max sur 1s + % du seuil
- Les fonds rouges (trigger actif XIAO) restent la référence de décision
- Légende mise à jour : brut / seuil / trigger actif
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remplace la moyenne glissante par un max glissant sur 3 samples (60ms),
ce qui reflète fidèlement la logique réelle du XIAO : la valeur brute
est comparée au seuil et le trigger reste actif 60ms (pas de moyenne).
Légende mise à jour en conséquence.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Affiche la moyenne glissante (même fenêtre 60ms que le XIAO) en plus
de la courbe brute sur chaque graphe, avec légende. Permet de comprendre
visuellement pourquoi un tir est déclenché même si le pic brut semble
ne pas atteindre le seuil.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
All Dispatch* functions now capture UPS_BLE_Device via TWeakObjectPtr instead of
a raw pointer, preventing an access violation when the UObject is garbage collected
before the GameThread lambda executes (EXCEPTION_ACCESS_VIOLATION @ 0x60).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
IMU data (roll/pitch/yaw) is now only sent over BLE when debugMode != DEBUG_OFF,
as originally intended for production. Removes the TODO_TEST workaround.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Crash shutdown (Index >= 0) :
- OnPreExit se déclenche encore trop tard (GC déjà en cours).
- Remplacé par OnEnginePreExit qui fire avant le shutdown des core
modules, donc avant toute destruction d'UObject. RemoveFromRoot()
est maintenant appelé au bon moment.
Cache caractéristiques GATT :
- Bug : Read/Write/Subscribe rappelaient GetCharacteristicsAsync(Cached)
à chaque opération, ce qui peut retourner un ordre différent du
discovery initial (Uncached) → mauvaise caractéristique ciblée.
- Fix : les GattCharacteristic sont maintenant stockées dans
FPS_GattServiceHandle::Characteristics (std::vector) lors du
ConnectDevice, et réutilisées directement via [CI] dans toutes
les opérations ultérieures.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
PS_Win_BLE : crash à la fermeture d'Unreal (assertion Index >= 0 dans
UObjectArray) car RemoveFromRoot() était appelé dans ShutdownModule()
alors que l'UObject array est déjà partiellement détruit. Fix : cleanup
du BLEManager déplacé dans un delegate FCoreDelegates::OnPreExit qui
s'exécute plus tôt, avant la destruction des UObjects.
uproject : désactivation explicite de WinBluetoothLE (les nœuds
Blueprint restaient dans le groupe Bluetooth Low Energy car le plugin
était chargé automatiquement depuis le dossier Plugins/).
Firmware : envoi IMU BLE découplé du debug mode pour pouvoir tester
la caractéristique 6E400002 à distance (TODO_TEST — remettre la
condition debugMode != DEBUG_OFF quand Pico Motion Tracker intégré).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Toutes les entrées Blueprint (UFUNCTION, UPROPERTY, UCLASS, USTRUCT, UENUM)
sont désormais rangées dans ASTERION|Win_BLE au lieu de "PS BLE".
64 occurrences mises à jour dans les 4 headers publics.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Suppression des 'using namespace Windows::*' au scope global
(conflit avec le namespace Windows d'Unreal via AllowWindowsPlatformTypes)
- Remplacement par un macro PS_BLE_WINRT_NS avec aliases locaux
(WinBT, WinAdv, WinGAP, WinStr) utilisés dans chaque fonction
- Ajout de FPS_BLEDeviceHandle et FPS_GattServiceHandle : wrappers
heap-alloués pour les types WinRT qui suppriment operator new
- Suppression warning C4265 (dtor non-virtual interne aux headers WinRT)
- Plugin charge sans erreur dans UE 5.5
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Lit la caractéristique configChar au démarrage de la connexion BLE
pour synchroniser les seuils Python avec les valeurs sauvegardées
en flash sur le XIAO (accel, gyro, audio).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
L'envoi Roll/Pitch/Yaw sur imuChar est maintenant conditionné à
debugMode != OFF → charge BLE réduite pour Unreal en production.
Le calibration tool Python (debug FULL) continue de recevoir l'IMU.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Firmware (xiao_airsoft_pro.ino) :
- Persistance config en flash (InternalFileSystem / LittleFS)
- Mode debug activable via BLE : octet fixe offset 28 du payload config
- minSensors par défaut : 2 → 3 (exige les 3 capteurs simultanément)
- Toutes les fenêtres trigger à 60ms (> DEBUG_RATE 50ms)
Calibration tool (xiao_calibration_tool.py) :
- Scan BLE par nom automatique (30s), connexion directe si adresse fournie
- Config + debug FULL envoyés automatiquement à la connexion
- NUM0 : cycle debug OFF/RAW/TRIGGERS/FULL
- NUM6/4 : ajustement minSensors 1-3 en temps réel
- 4ème graphique : timeline des tirs détectés (barres oranges)
- Layout 4 sous-graphiques avec height_ratios=[3,3,3,1]
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>