Jump to content

EnumerateCallbacks komplett


Recommended Posts

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!

Link zu diesem Kommentar
Share on other sites

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).

Link zu diesem Kommentar
Share on other sites

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.

Link zu diesem Kommentar
Share on other sites

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...

Link zu diesem Kommentar
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Reply to this topic...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...