You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
131 lines
3.4 KiB
131 lines
3.4 KiB
from __future__ import annotations |
|
|
|
import argparse |
|
import asyncio |
|
|
|
from .hub import DuploColor, DuploSound, DuploTrainHub |
|
|
|
|
|
MENU = """ |
|
=== Test DUPLO Hub #5 === |
|
1) Avancer |
|
2) Reculer |
|
3) Stop |
|
4) Jouer une musique |
|
5) Changer couleur lumière |
|
7) Éteindre la lumière |
|
6) Demo rapide |
|
q) Quitter |
|
""" |
|
|
|
SOUND_MENU = """ |
|
Sons disponibles: |
|
- brake |
|
- station_departure |
|
- water_refill |
|
- horn |
|
- steam |
|
""" |
|
|
|
SOUND_BY_NAME: dict[str, DuploSound] = { |
|
"brake": DuploSound.BRAKE, |
|
"station_departure": DuploSound.STATION_DEPARTURE, |
|
"water_refill": DuploSound.WATER_REFILL, |
|
"horn": DuploSound.HORN, |
|
"steam": DuploSound.STEAM, |
|
} |
|
|
|
COLOR_MENU = """ |
|
Couleurs disponibles: |
|
- black |
|
- pink |
|
- purple |
|
- blue |
|
- lightblue |
|
- cyan |
|
- green |
|
- yellow |
|
- orange |
|
- red |
|
- white |
|
""" |
|
|
|
COLOR_BY_NAME: dict[str, DuploColor] = { |
|
"black": DuploColor.BLACK, |
|
"pink": DuploColor.PINK, |
|
"purple": DuploColor.PURPLE, |
|
"blue": DuploColor.BLUE, |
|
"lightblue": DuploColor.LIGHTBLUE, |
|
"cyan": DuploColor.CYAN, |
|
"green": DuploColor.GREEN, |
|
"yellow": DuploColor.YELLOW, |
|
"orange": DuploColor.ORANGE, |
|
"red": DuploColor.RED, |
|
"white": DuploColor.WHITE, |
|
} |
|
|
|
|
|
async def run_test(address: str | None, speed: int) -> None: |
|
hub = DuploTrainHub(address=address) |
|
await hub.connect() |
|
print("Connecté au hub DUPLO.") |
|
|
|
try: |
|
while True: |
|
print(MENU) |
|
choice = input("Choix: ").strip().lower() |
|
|
|
if choice == "1": |
|
await hub.forward(speed) |
|
print(f"Avance à {abs(speed)}%") |
|
elif choice == "2": |
|
await hub.backward(speed) |
|
print(f"Recule à {abs(speed)}%") |
|
elif choice == "3": |
|
await hub.stop() |
|
print("Stop") |
|
elif choice == "4": |
|
print(SOUND_MENU) |
|
sound_name = input("Son: ").strip().lower() |
|
sound = SOUND_BY_NAME.get(sound_name) |
|
if sound is None: |
|
print("Son invalide") |
|
continue |
|
await hub.play_sound(sound) |
|
print(f"Musique jouée ({sound_name.upper()})") |
|
elif choice == "5": |
|
print(COLOR_MENU) |
|
color_name = input("Couleur: ").strip().lower() |
|
color = COLOR_BY_NAME.get(color_name) |
|
if color is None: |
|
print("Couleur invalide") |
|
continue |
|
await hub.change_light_color(color) |
|
print(f"Couleur lumière changée ({color_name.upper()})") |
|
elif choice == "7": |
|
await hub.turn_off_light() |
|
print("Lumière éteinte") |
|
elif choice == "6": |
|
await hub.demo() |
|
print("Demo terminée") |
|
elif choice == "q": |
|
break |
|
else: |
|
print("Choix invalide") |
|
finally: |
|
await hub.stop() |
|
await hub.disconnect() |
|
print("Déconnecté") |
|
|
|
|
|
def main() -> None: |
|
parser = argparse.ArgumentParser(description="Test manuel du hub DUPLO Train #5") |
|
parser.add_argument("--address", help="Adresse BLE du hub (optionnel)") |
|
parser.add_argument("--speed", type=int, default=50, help="Vitesse par défaut 0..100") |
|
args = parser.parse_args() |
|
|
|
asyncio.run(run_test(address=args.address, speed=max(0, min(100, args.speed)))) |
|
|
|
|
|
if __name__ == "__main__": |
|
main()
|
|
|