tfRookie Geschrieben August 26, 2014 at 18:28 Geschrieben August 26, 2014 at 18:28 Hi, gibt es eine Moeglichkeit, festzustellen wann die EnumerateCallbacks momentan angeschlossener Bricks und Bricklets komplett sind? Hintergrund dieser Frage ist ein Rechner auf dem eine Menge Bauelemente angeschlossen ist (oder auch einige nicht oder gar keine) und ein Programm, das aber beim Start relativ frueh wissen moechte, was vorhanden ist und was nicht. Sinnlose Sleeps einbauen will ich aber auch nicht ... Danke fuer Euer Feedback! Zitieren
borg Geschrieben August 26, 2014 at 18:33 Geschrieben August 26, 2014 at 18:33 Leider nicht, diese Information ist im System nicht vorhanden. Der Master eines Stacks baut sich Stück für Stück dynamisch eine Routing-Tabelle auf, wie viele Stapelteilnehmer er in Summe wirklich hat weiß er auch nicht. Wenn dein System per USB angeschlossen ist kannst du aber mit relativ kleinen Timeouts arbeiten (50-100ms oder sowas). Zitieren
tfRookie Geschrieben August 26, 2014 at 18:43 Autor Geschrieben August 26, 2014 at 18:43 Schade, das hab ich fast befuerchtet - 50-100ms total oder pro potentiell installiertem Baustein? Danke! Zitieren
borg Geschrieben August 26, 2014 at 19:17 Geschrieben August 26, 2014 at 19:17 Ich dachte jetzt das man nach jedem Enumerate eines Bricks/Bricklets einen 50ms Timer startet bzw neustartet und wenn der Timer auslöst ist die Enumerierung vorbei. D.h. es dauert dann in Summe solange wie die Enumerierung dauert plus 50ms für den Timeout. Zitieren
borg Geschrieben August 26, 2014 at 21:09 Geschrieben August 26, 2014 at 21:09 Da die Frage schon öfter gestellt wurde hab ich mal ein kleines Beispiel geschrieben dafür (in Python): #!/usr/bin/env python # -*- coding: utf-8 -*- HOST = "localhost" PORT = 4223 from tinkerforge.ip_connection import IPConnection import threading class Enumerator: WAIT_TIME = 0.1 uids = [] lock = threading.Lock() def __init__(self, ipcon): ipcon.register_callback(IPConnection.CALLBACK_ENUMERATE, self.cb_enumerate) self.timer = threading.Timer(Enumerator.WAIT_TIME, self.lock.release) self.timer.start() ipcon.enumerate() self.lock.acquire() self.lock.acquire() def cb_enumerate(self, uid, connected_uid, position, hardware_version, firmware_version, device_identifier, enumeration_type): self.timer.cancel() if not uid in self.uids: self.uids.append(uid) self.timer = threading.Timer(Enumerator.WAIT_TIME, self.lock.release) self.timer.start() if __name__ == "__main__": ipcon = IPConnection() ipcon.connect(HOST, PORT) enumerator = Enumerator(ipcon) print enumerator.uids ipcon.disconnect() Ausgabe: olaf@pc:~# python enumerate_all.py ['5W6gHB', '6JLUGS', '6kqhAN', '6QGtV5', '6QENvq', '5W5BYn', '6Kvxz4', '631cHu'] Wenn keiner Verbesserungsvorschläge hat füge ich das inkl. Beschreibung der Dokumentation hinzu. Zitieren
Nic Geschrieben August 27, 2014 at 14:50 Geschrieben August 27, 2014 at 14:50 Ich hatte bisher eine Collection-Klasse in Delphi verwendet, die als VCL-Komponente alle UIDs der zu erwartenden Bricks/Bricklets speichert. Die Lösung mit dem Timer ist natürlich eleganter und flexibler. Welche WAIT_TIME wäre im Fall einer Chibi oder WIFI Extension nötig ? Vielleicht könnte so ein OnEnumerateFinish ev. irgendwann mal in die Bindings... Zitieren
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.