Jump to content
PaulPaulaner

Enumerate Callback wird nicht ausgelöst

Recommended Posts

Hallo zusammen,

Ich habe wie folgt meine Callback Funktion angelegt:

im Header außerhalb der Klasse:

void cb_enumerate_static(const char *uid, const char *connected_uid,
                                    char position, uint8_t hardware_version[3],
                                    uint8_t firmware_version[3], uint16_t device_identifier,
                                    uint8_t enumeration_type, void *user_data);

 

 

CPP-Datei

void cb_enumerate_static(const char *uid, const char *connected_uid,
                                    char position, uint8_t hardware_version[3],
                                    uint8_t firmware_version[3], uint16_t device_identifier,
                                    uint8_t enumeration_type, void *user_data)
{
    CTF_Steuerung *psTemp = reinterpret_cast<CTF_Steuerung *>(user_data);
    psTemp->cb_enumerate(uid,connected_uid,position,hardware_version,
            firmware_version,device_identifier,enumeration_type);
}

So schaut die Registrierung und der Aufruf von ipcon_enumerate(...)

CTF_Steuerung::CTF_Steuerung()
{
    QString sPro;

        // Create IP connection
    ipcon_create(&ipcon);
    if(ipcon_connect(&ipcon, HOST, PORT) < 0)
    {
        sPro = "Error ipcon_connect(...)";
    }

    ipcon_register_callback(&ipcon,
                            IPCON_CALLBACK_ENUMERATE,
                            (void (*)(void))cb_enumerate_static ,this);
    if(ipcon_enumerate(&ipcon) < 0)
    {
        sPro = "Error ipcon_enumerate(...)";        
    }

}

 

Nach meinem Verständnis sollte nach dem Aufruf von ipcon_enumerate(&ipcon) der Callback ausgelöst werden.

Kommt aber leider nicht in die Callback-Funktion, die Registrierung des Callbacks usw. läuft alles ohne Fehler durch.

Danke für eure Hilfe

Viele Grüße

Paul

Share this post


Link to post
Share on other sites

Der ipcon_enumerate führt zum Auslösen des Callbacks, aber nicht synchron, sondern asynchron. Dass heißt ipcon_enumerate returned höchstwahrscheinlich bevor der Callback ankommt.

Sprich, was passiert in deinem Programm nach dem Konstrukturaufruf? Wie lange lebt das CTF_Steuerung Objekt danach noch? Räumst du die IP Connection im Desktruktor wieder auf?

Share this post


Link to post
Share on other sites

Hallo photron,

Danke für die Antwort!

Das Objekt CTF_Steuerung bleibt bestehen, wird also beim Progammstart angelegt und erst beim Beenden wieder aufgeräumt.

Zitat

Der ipcon_enumerate führt zum Auslösen des Callbacks, aber nicht synchron, sondern asynchron.

Dass heißt ipcon_enumerate returned höchstwahrscheinlich bevor der Callback ankommt.

Das hätte ich erwartet, das nach dem Aufruf von ipcon_enumerate der Callback dann asynchron irgendwann aufgerufen wird.

Aber an meinen Haltepunkt kommt nichts an in der Callbackfunktion.

 

 

Share this post


Link to post
Share on other sites
Posted (edited)

Also ich mache es in anderer Reihenfolge, wobei ich aber nicht glaube, dass das irgendetwas ändern sollte.
Ich mach den icon_connect() erst nachdem die Callbacks registriert sind.

Innerhalb der callbackConnected() mache ich dann den ipcon_enumerate() call.

//--------------------------------------------------------------
CTF_Steuerung::CTF_Steuerung() {

    ...
    
    // create IP connection
    ipcon_create(ipcon.get());
    
    ...
    
    // register connected callback
    ipcon_register_callback(ipcon.get(), IPCON_CALLBACK_CONNECTED,
                            (void (*)(void))callbackConnected, ipcon.get());
    
    // register enumeration callback
    ipcon_register_callback(ipcon.get(), IPCON_CALLBACK_ENUMERATE,
                            (void (*)(void))callbackEnumerate, &metadata);
    
    // establish IP connection to brick daemon
    error = ipcon_connect(ipcon.get(), TF_HOST, TF_PORT);
    if (error < 0) {
        std::cerr << "Could not connect to brick daemon" << std::endl;
        return error;
    }

	...

}

 

Edited by cl-

Share this post


Link to post
Share on other sites

Der Callback muss natürlich registriert sein bevor der Callback ausgelöst wird. Das ist aber in euren beiden Beispiele für den Enumerate Callback der Fall.

@PaulPaulaner Du gibst dir aber sPro auch aus, oder? Nicht, dass einfach ipcon_connect oder ipcon_enumerate einen Fehler melden du den aber nicht siehst. Du hast aber auch Bricks/Bricklets angeschlossen, im Brick Viewer tauch was auf?

Share this post


Link to post
Share on other sites

Danke!

Das mit dem Brick-Viewer war dann der Schlüssel zum Glück!

Auf die einfachsten Sachen kommt man selbst immer nicht 🙂

Der hat die Geräte auch nicht gesehen, die hatten zwar alle geleuchtet, aber Verbindung war wohl nicht möglich erst nach erneutem Reboot des Raspberrys.

Warum auch immer?

@cl- : hab den Ablauf nach deinem Muster integriert, Danke für die Tipps von euch !!

Grüße

Paul

 

 

Share this post


Link to post
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...