PaulPaulaner Geschrieben April 29, 2020 at 07:52 Share Geschrieben April 29, 2020 at 07:52 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 Zitieren Link zu diesem Kommentar Share on other sites More sharing options...
photron Geschrieben April 29, 2020 at 08:29 Share Geschrieben April 29, 2020 at 08:29 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? Zitieren Link zu diesem Kommentar Share on other sites More sharing options...
PaulPaulaner Geschrieben April 29, 2020 at 08:39 Autor Share Geschrieben April 29, 2020 at 08:39 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. Zitieren Link zu diesem Kommentar Share on other sites More sharing options...
cl- Geschrieben April 29, 2020 at 08:44 Share Geschrieben April 29, 2020 at 08:44 (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 April 29, 2020 at 08:46 von cl- Zitieren Link zu diesem Kommentar Share on other sites More sharing options...
photron Geschrieben April 29, 2020 at 09:26 Share Geschrieben April 29, 2020 at 09:26 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? Zitieren Link zu diesem Kommentar Share on other sites More sharing options...
PaulPaulaner Geschrieben April 29, 2020 at 09:56 Autor Share Geschrieben April 29, 2020 at 09:56 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 Zitieren Link zu diesem Kommentar Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.