78 lines
2.7 KiB
Python
78 lines
2.7 KiB
Python
# --- SCAN DELLE PORTE A–F: CHE DISPOSITIVO C'È COLLEGATO? (fix senza p.name) ---
|
||
|
||
from pybricks.parameters import Port # costanti delle porte fisiche: A, B, C, D, E, F
|
||
from pybricks.pupdevices import (
|
||
ColorDistanceSensor, # sensore colore+distanza (SPIKE Essential / PUP combo)
|
||
ColorSensor, # sensore colore (SPIKE Prime)
|
||
ForceSensor, # sensore di forza/pulsante
|
||
Motor, # motori con encoder
|
||
UltrasonicSensor, # sensore ultrasuoni
|
||
)
|
||
from pybricks.tools import wait # piccole attese per non “martellare” il bus
|
||
|
||
# Mapping esplicito: da oggetto Port alla sua etichetta stringa
|
||
PORT_LABEL = {
|
||
Port.A: "A",
|
||
Port.B: "B",
|
||
Port.C: "C",
|
||
Port.D: "D",
|
||
Port.E: "E",
|
||
Port.F: "F",
|
||
}
|
||
|
||
|
||
def scan_ports() -> list[tuple[str, str]]:
|
||
"""
|
||
Ritorna una lista di coppie (porta, cosa_c'è).
|
||
Esempio: [("A","Motor"), ("B","vuota"), ...]
|
||
"""
|
||
# elenco delle porte esterne da scandire in ordine
|
||
ports: list[Port] = [Port.A, Port.B, Port.C, Port.D, Port.E, Port.F]
|
||
|
||
# accumulatore risultati (stringa etichetta porta, descrizione)
|
||
results: list[tuple[str, str]] = []
|
||
|
||
# analizza ogni porta
|
||
for p in ports:
|
||
descr: str = "-" # predefinito: niente collegato/riconosciuto
|
||
|
||
# prova come MOTORE (se fallisce, solleva OSError -> proviamo altro)
|
||
try:
|
||
_ = Motor(p)
|
||
descr = "Motor"
|
||
except OSError:
|
||
# prova come COLOR SENSOR “classico”
|
||
try:
|
||
_ = ColorSensor(p)
|
||
descr = "ColorSensor"
|
||
except OSError:
|
||
# prova come COLOR+DISTANCE (combo sensor)
|
||
try:
|
||
_ = ColorDistanceSensor(p)
|
||
descr = "ColorDistanceSensor"
|
||
except OSError:
|
||
# prova come ULTRASONIC
|
||
try:
|
||
_ = UltrasonicSensor(p)
|
||
descr = "UltrasonicSensor"
|
||
except OSError:
|
||
# prova come FORCE SENSOR
|
||
try:
|
||
_ = ForceSensor(p)
|
||
descr = "ForceSensor"
|
||
except OSError:
|
||
# nessun device riconosciuto: lasciamo "vuota"
|
||
pass
|
||
|
||
# aggiungi la riga risultato con etichetta porta (dal mapping) e descrizione
|
||
results.append((PORT_LABEL[p], descr))
|
||
|
||
# piccola pausa (facoltativa) per stabilità del bus
|
||
wait(5)
|
||
|
||
# ritorna la lista completa
|
||
return results
|
||
|
||
|
||
# --- Esempio d'uso minimale (stampa la lista) ---
|
||
print(scan_ports()) # otterrai qualcosa tipo: [('A','Motor'), ('B','vuota'), ...]
|