Jump to content

Recommended Posts

Geschrieben

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

Geschrieben

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?

Geschrieben

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.

 

 

Geschrieben (bearbeitet)

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;
    }

	...

}

 

bearbeitet von cl-
Geschrieben

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?

Geschrieben

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

 

 

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