Jump to content

Recommended Posts

Geschrieben

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!

Geschrieben

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

Geschrieben

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.

Geschrieben

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.

Geschrieben

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

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