Synchronisation vidéo et journaux pour les tests hardware
Les mesures vous disent ce qui s'est passé. Les vidéos et les journaux vous disent pourquoi. Un test de vibration échoué prend tout son sens quand vous pouvez voir l'unité se desserrer. Un crash firmware est plus facile à déboguer quand le journal de la console série est juste à côté du résultat de test. TofuPilot stocke les pièces jointes aux côtés des mesures.
Pourquoi les pièces jointes sont importantes
Une valeur de mesure « ÉCHEC » vous dit que quelque chose a cassé. Mais elle ne vous dit pas :
- À quoi ressemblait physiquement l'unité pendant le test
- Ce que le firmware a enregistré avant le crash
- À quoi ressemblait la forme d'onde de l'oscilloscope
- Ce que l'opérateur a vu sur son écran
Les pièces jointes comblent cette lacune. Elles transforment un résultat de test d'un simple chiffre en un enregistrement complet de ce qui s'est passé.
Types de pièces jointes de test
| Type de pièce jointe | Cas d'utilisation | Format |
|---|---|---|
| Enregistrement vidéo | Inspection visuelle, tests mécaniques | MP4, AVI |
| Journal de console série | Débogage firmware, séquence de démarrage | TXT, LOG |
| Capture d'oscilloscope | Analyse de formes d'onde, timing | PNG, CSV |
| Image thermique | Détection de points chauds | JPEG, PNG |
| Journal de la station de test | Débogage du logiciel de test | TXT, LOG |
| Fichier de configuration | Paramètres du DUT ou du montage | JSON, YAML |
| Photo | Documentation de défaut physique | JPEG, PNG |
Joindre des fichiers aux exécutions de test
Avec le client Python
from tofupilot import TofuPilotClient
client = TofuPilotClient()
client.create_run(
procedure_id="VIBRATION-SCREENING",
unit_under_test={"serial_number": "UNIT-7832"},
run_passed=False,
steps=[{
"name": "Random Vibration 20-2000Hz",
"step_type": "measurement",
"status": False,
"measurements": [{
"name": "resonance_freq_hz",
"value": 847,
"unit": "Hz",
"limit_low": 900,
"limit_high": 1500,
}],
}],
attachments=[
"recordings/unit-7832-vibration.mp4",
"logs/unit-7832-accel.csv",
"captures/unit-7832-spectrum.png",
],
)Capturer la vidéo automatiquement
Enregistrer la vidéo pendant le test et la joindre à l'exécution.
import subprocess
import os
def start_recording(output_path):
"""Démarrer l'enregistrement depuis une caméra USB."""
proc = subprocess.Popen([
"ffmpeg", "-f", "v4l2", "-i", "/dev/video0",
"-t", "120", # maximum 2 minutes
"-y", output_path,
], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
return proc
def stop_recording(proc):
"""Arrêter l'enregistrement."""
proc.terminate()
proc.wait()
# Utilisation dans un test
video_path = f"/tmp/test_{serial}.mp4"
recorder = start_recording(video_path)
# Exécuter le test...
run_test()
stop_recording(recorder)
# Joindre à l'exécution TofuPilot
client.create_run(
procedure_id="MECHANICAL-TEST",
unit_under_test={"serial_number": serial},
run_passed=passed,
steps=steps,
attachments=[video_path],
)Capturer les journaux de console série
import serial
import threading
class SerialLogger:
def __init__(self, port, baudrate=115200):
self.ser = serial.Serial(port, baudrate, timeout=1)
self.log = []
self.running = False
def start(self):
self.running = True
self.log = []
self.thread = threading.Thread(target=self._read_loop)
self.thread.start()
def stop(self):
self.running = False
self.thread.join()
self.ser.close()
def _read_loop(self):
while self.running:
line = self.ser.readline().decode("utf-8", errors="replace")
if line:
self.log.append(line)
def save(self, path):
with open(path, "w") as f:
f.writelines(self.log)
# Utilisation
logger = SerialLogger("/dev/ttyUSB0")
logger.start()
# Exécuter le test...
run_test()
logger.stop()
log_path = f"/tmp/console_{serial}.log"
logger.save(log_path)
# Joindre à TofuPilot
client.create_run(
procedure_id="FIRMWARE-VALIDATION",
unit_under_test={"serial_number": serial},
run_passed=passed,
steps=steps,
attachments=[log_path],
)Revue synchronisée
Lorsque vous ouvrez une exécution de test dans TofuPilot, toutes les pièces jointes sont disponibles aux côtés des mesures. Cette vue synchronisée vous permet de :
- Voir que
resonance_freq_hza échoué à 847 Hz (en dessous de la limite de 900 Hz) - Regarder la vidéo pour voir le boîtier fléchir pendant le test
- Ouvrir le CSV de l'accéléromètre pour voir les données brutes de vibration
- Consulter le tracé du spectre pour identifier le mode résonant
Le tout au même endroit, pour une même exécution, en un seul clic.
Quand joindre quoi
Tous les tests n'ont pas besoin de vidéo et de journaux. Les pièces jointes ajoutent du stockage et de la complexité. Utilisez-les là où elles apportent une valeur diagnostique.
| Type de test | Pièces jointes recommandées |
|---|---|
| Vibration/choc | Vidéo, données d'accéléromètre |
| Validation firmware | Journal de console série |
| Inspection visuelle | Photo du DUT |
| Test de puissance | Captures d'oscilloscope |
| Test environnemental | Journaux de température/humidité |
| Déverminage (burn-in) | Tous les journaux (longue durée, difficile à reproduire) |
Pour les tests de production de routine (ICT, fonctionnel basique), les mesures seules sont généralement suffisantes. Réservez les pièces jointes aux tests où le contexte visuel ou les journaux aident au débogage.
Considérations de stockage
| Pratique | Pourquoi |
|---|---|
| Compresser les vidéos avant de les joindre | Réduire les coûts de stockage |
| Limiter les pièces jointes à moins de 50 Mo par exécution | Vitesse pratique d'envoi/téléchargement |
| Utiliser PNG pour les graphiques, JPEG pour les photos | PNG pour la clarté, JPEG pour la taille |
| Ne joindre qu'aux exécutions en échec (optionnellement) | Économiser du stockage sur les exécutions réussies où les pièces jointes sont rarement consultées |
| Inclure des horodatages dans les fichiers journaux | Corréler les événements du journal avec le timing des étapes de test |