Jump to content

LEDStripV2 Callback-Anmerkung


duaw

Recommended Posts

Ich lese in der Doku:

Java: "Dieser [BrickletLEDStripV2.FrameStartedListener()] Listener kann mit der Funktion addFrameStartedListener() hinzugefügt werden." (Ein 'n' fehlt.)

C: "Die Registrierung kann mit der led_strip_v2_register_callback() Funktion durchgeführt werden:" 

Beobachtung: Man kann zu einem Zeitpunkt nur nur einen Listener haben. Wenn unterschiedliche Programm auf das Bricklet zugreifen (z.B. ein parallel geöffneter Brick Viewer), dann ist das Ergebnis erratisch ... 

Ich lese in der Doku:

Java: "Ein hinzugefügter Listener kann mit der Funktion removeFrameStartedListener() wieder entfernt werden." 

C: Ich vermisse in der Doku int led_strip_v2_set_frame_started_callback_configuration(LEDStripV2 *led_strip_v2, bool enable) 

Diese Funktion (und int led_strip_v2_get_frame_started_callback_configuration(LEDStripV2 *led_strip_v2, bool *ret_enable)) ist ja definiert. 

Gruß, Uwe 

Link to comment
Share on other sites

Der Typo ist gefixt, sollte bald in der Dokumentation behoben sein.

3 hours ago, duaw said:

Beobachtung: Man kann zu einem Zeitpunkt nur nur einen Listener haben. Wenn unterschiedliche Programm auf das Bricklet zugreifen (z.B. ein parallel geöffneter Brick Viewer), dann ist das Ergebnis erratisch ... 

Du solltest prinzipiell mehrere Programme ausführen können, die sich auf das selbe Callback/den selben Listener registrieren. Probleme gibt es erst, wenn mehrere Programme das Callback umkonfigurieren, also z.B. set_frame_duration auf unterschiedliche Werte setzen. Das ist aber prinzipiell erwartet, das LED Strip Bricklet kann ja nur einen Bildstrom auf einmal zeichen.

3 hours ago, duaw said:

C: Ich vermisse in der Doku int led_strip_v2_set_frame_started_callback_configuration(LEDStripV2 *led_strip_v2, bool enable) 

Diese Funktion (und int led_strip_v2_get_frame_started_callback_configuration(LEDStripV2 *led_strip_v2, bool *ret_enable)) ist ja definiert. 

Diese hier?

Link to comment
Share on other sites

Also, eine "Instanz" von ipcon.c , die beim Linken mit gebunden wird, ermöglicht in einem Programm dann einen einzelnen Listener.  

Da funkt der Brickv natürlich dazwischen. (Wann er das tut, weiß ich nicht. Beim Connect? Bei Klicken auf den Tab? ...) 

Blind, blind, blind ... Habe blind auf "Callbacks" geklickt und das Kapitel "Konfigurationsfunktionen für Callbacks" oberhalb  übersehen ... Dass ich das auch in der Header-Datei übersehen habe ... tsss ... 

Werde zukünftig NICHT mehr an euch zweifeln. 

Link to comment
Share on other sites

Das hat nichts mit dem Linken zu tun.

Du kannst pro IPConnection Objekt ein funktionales LEDStripV2 Object haben, da die IPConnection intern eine Tabelle hat die eine UID eindeutig auf ein Device Objekt abbildet. Wenn du ein weiteres Device Objekt für eine UID anlegst mit einer IPConnection bei der für diese UID schon ein Device hinterlegt ist, so wird das alte Device durch das neue verdrängt und nur noch das neue Device Objekt kann mit dem Brick/Bricklet kommunizieren. Du kannst aber ohne Probleme in einem Programm parallel mehrere IPConnections mit jeweils einem Device Objekt haben die auf die gleiche UID verweisen.

Ähnlich funktioniert das für die Registrierung von Callbacks. Jedes Device Objekt hate eine Tabelle die eine Callback ID eindeutig auf einen Fuktionspointer zuweist. Wenn du einen Callback nochmal registrierst der auf diesem Device Objekt schon registriert wurde, dann wird der alte Funktionspointer verdrängt und nur noch der neue wird aufgerufen werden.

All dies passiert nur bei dir lokal im Programm, ohne jegliche Kommunikation mit der Hardware. Was das passiert ist, dass eine Zuordnung zwischen eingehenden Antworten (Getter und Callbacks) und den Device Objekten und Callback Funktionspointern hergestellt wird. Dadurch weiß die IPConnection dann wohin mit den Antworten.

Da kann dir erstmal keiner dazwischen fummeln.

Was dir jetzt passieren kann ist dass zwei Programme die gleichzeitig laufen sich in die Quere kommen. Zum Beispiel kann dein Programm den Frame-Started-Callback aktivieren und ein anderes Programm diesen wieder deaktivieren. Denn die Information ob der Callback an oder aus ist ist auf dem Bricklet gespeichert, da das Bricklet wissen muss ob es den schicken muss oder nicht. Das ist also global und nicht lokal in deinem Programm. Ähnlich ist dass dann auch mit dem Setzen der LEDs, wenn das dein Programm und ein anderes Programm gleichzeitig machen kommt am Ende Quatsch bei rum.

Zu Brick Viewer: Hier werden nur dann Callbacks verwendet, wenn es nicht anders geht, oder der Callback nicht konfiguriert werden muss. Beim Anwählen des LED Strip 2.0 Tabs in Brick Viewer wird geprüft ob der Frame-Started-Callback aktiv ist. Falls ja passiert nichts. Falls nein, dann aktiviert Brick Viewer den Callback und merkt sich das. Beim Abwählen des Tabs prüft Brick Viewer ob der Callback vorher aus war und aktiviert wurde. Falls ja wird der Callback wieder deaktiviert. Falls nein passiert nichts.

  • Thanks 1
Link to comment
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.

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