Jump to content

Recommended Posts

Posted

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!

Posted

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

Posted

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.

Posted

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.

Posted

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.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...