FlyingDoc Posted May 9, 2013 at 09:17 PM Share Posted May 9, 2013 at 09:17 PM Nach dem ich nun ja mit QT mein Projekt umsetzen kann, ahb ich jetzt folgendes Problem. Ich frage mit der IPCON_CALLBACK_ENUMERATE Funktion meine Hardware ab. Im Callback für die Variable device_identifier immer eine 0 als Wert zurück. Im Visualstudio mit QT Plugin bekomme ich aber den device_identifier zurück der den Brick oder Bricklet identifiziert. Alle anderen Werte kommen. Gerade nochmal getestet. Aufruf ipcon_register_callback(ipcon,IPCON_CALLBACK_ENUMERATE,(void *)cb_enumerate,NULL); Quote Link to comment Share on other sites More sharing options...
borg Posted May 10, 2013 at 07:18 AM Share Posted May 10, 2013 at 07:18 AM Habs gerade nochmal getestet, bei mir funktionierts: #include <stdio.h> #include "ip_connection.h" #define HOST "localhost" #define PORT 4223 // Print incoming enumeration information void cb_enumerate(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) { (void)user_data; printf("UID: %s\n", uid); printf("Enumeration Type: %d\n", enumeration_type); if(enumeration_type == IPCON_ENUMERATION_TYPE_DISCONNECTED) { printf("\n"); return; } printf("Connected UID: %s\n", connected_uid); printf("Position: %c\n", position); printf("Hardware Version: %d.%d.%d\n", hardware_version[0], hardware_version[1], hardware_version[2]); printf("Firmware Version: %d.%d.%d\n", firmware_version[0], firmware_version[1], firmware_version[2]); printf("Device Identifier: %d\n", device_identifier); printf("\n"); } int main() { // Create IP Connection IPConnection ipcon; ipcon_create(&ipcon); if(ipcon_connect(&ipcon, HOST, PORT) < 0) { fprintf(stderr, "Could not connect to brickd\n"); exit(1); } // Register enumeration callback to "cb_enumerate" ipcon_register_callback(&ipcon, IPCON_CALLBACK_ENUMERATE, (void *)cb_enumerate, NULL); // Trigger enumerate ipcon_enumerate(&ipcon); printf("Press key to exit\n"); getchar(); ipcon_destroy(&ipcon); // Calls ipcon_disconnect internally } olaf@pc:~/build20/c$ ./example Press key to exit UID: 6wVE7W Enumeration Type: 0 Connected UID: 0 Position: 0 Hardware Version: 1.1.0 Firmware Version: 2.0.1 Device Identifier: 16 UID: etG Enumeration Type: 0 Connected UID: 6wVE7W Position: a Hardware Version: 1.0.0 Firmware Version: 2.0.1 Device Identifier: 221 Wie sieht cb_enumerate bei dir aus? Quote Link to comment Share on other sites More sharing options...
FlyingDoc Posted May 10, 2013 at 08:42 AM Author Share Posted May 10, 2013 at 08:42 AM void cb_enumerate(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) { /****************************************************************************/ /* Antwort auf Komponentenabfrage (Bricks,Bricklets) */ /****************************************************************************/ // printf("device_uid: %s\tdevice_name: %s\tdevice_stack_id: %d\t is_new: %d\n\n", device_uid, device_name, device_stack_id,is_new); /****************************************************************************/ /* Testen ob IMU Brick gefunden */ /****************************************************************************/ if(device_identifier==IMU_DEVICE_IDENTIFIER) { Create_IMU(uid,device_identifier, connected_uid, position,true); } if(device_identifier==MASTER_DEVICE_IDENTIFIER) { Create_Master(uid,device_identifier, connected_uid, position,true); } if(device_identifier==ANALOG_IN_DEVICE_IDENTIFIER) { Create_AnalogIn(uid,device_identifier, connected_uid, position,true); } if(device_identifier==ROTARY_POTI_DEVICE_IDENTIFIER) { Create_RotaryPoti(uid,device_identifier, connected_uid, position,true); } if(device_identifier==TEMPERATURE_DEVICE_IDENTIFIER) { Create_Temperature(uid,device_identifier, connected_uid, position,true); } if(device_identifier==BAROMETER_DEVICE_IDENTIFIER) { Create_Barometer(uid,device_identifier, connected_uid, position,true); } if(device_identifier==IO16_DEVICE_IDENTIFIER) { Create_IO16(uid,device_identifier, connected_uid, position,true); } if(device_identifier==GPS_DEVICE_IDENTIFIER) { Create_GPS(uid,device_identifier, connected_uid, position,true); } } Quote Link to comment Share on other sites More sharing options...
borg Posted May 10, 2013 at 09:55 AM Share Posted May 10, 2013 at 09:55 AM Mh, funktioniert bei mir auch. Wenn du da jetzt ein printf("id: %d\n\n", device_identifier); reinpackst gibt das 0 aus? Quote Link to comment Share on other sites More sharing options...
FlyingDoc Posted May 10, 2013 at 10:59 AM Author Share Posted May 10, 2013 at 10:59 AM Ich schau beim Debuggen die Variable direkt an. Und da steht Nullinger drinn. Alle anderen haben einen Wert. Quote Link to comment Share on other sites More sharing options...
FlyingDoc Posted May 10, 2013 at 11:49 AM Author Share Posted May 10, 2013 at 11:49 AM Hier mal ein Screen von den Variablen Quote Link to comment Share on other sites More sharing options...
FlyingDoc Posted May 10, 2013 at 12:10 PM Author Share Posted May 10, 2013 at 12:10 PM Noch mal genauer debugt. Unzwar schon die ip_connection.cpp Der device_identifier ist wie zu sehen im Datenblock vorhanden. Wird aber als 0 übergeben. Quote Link to comment Share on other sites More sharing options...
borg Posted May 10, 2013 at 12:19 PM Share Posted May 10, 2013 at 12:19 PM Interessant, ab wann hat er denn dann die 0? Hier ist die Funktion die aufgerufen wird: uint16_t leconvert_uint16_from(uint16_t little) { if (native_endian.value == LITTLE_ENDIAN) { return little; } else { return *(uint16_t *)leconvert_swap32(&little); } } Er sollte in den Little-Endian-Fall springen und die 13 direkt wieder zurückgeben. Selbst wenn er in den Else-Fall springen würde, würde nicht 0 dabei rauskommen können . Edit: Uhhhhhh, *Kopfkratz*. Warum steht denn da leconvert_swap32 und nicht leconvert_swap16? Arbeitest du auf einem Big Endian System? Falls ja, tausch mal einmal das leconvert_swap32 durch leconvert_swap16 aus! Quote Link to comment Share on other sites More sharing options...
FlyingDoc Posted May 10, 2013 at 12:24 PM Author Share Posted May 10, 2013 at 12:24 PM Die Null hat er sofort nach dem Umwandeln in die EnumerateCallback Struktur hab ich gerade herausgefunden. enumerate_callback = (EnumerateCallback *)packet; Ich habe mal von Hand die Daten auseinanderklamüstert. Der Wert steht an der richtigen Stelle. Trotzdem ist er 0. Tante Edit sagt: Ich hab in der ip_connection.cpp mal die Struktur probeweise geändert. typedef struct { PacketHeader header; char uid[8]; char connected_uid[8]; char position; uint8_t hardware_version[3]; uint8_t firmware_version[3]; uint8_t device_identifier; uint8_t enumeration_type; } ATTRIBUTE_PACKED EnumerateCallback; Natürlich ist dann der enumeration_type flasch. War aber nur zum Test. Quote Link to comment Share on other sites More sharing options...
borg Posted May 10, 2013 at 12:59 PM Share Posted May 10, 2013 at 12:59 PM Hast du das Edit oben gelesen? Bitte probier mal einmal aus leconvert_swap32 durch leconvert_swap16 auszutauschen. Quote Link to comment Share on other sites More sharing options...
FlyingDoc Posted May 10, 2013 at 01:13 PM Author Share Posted May 10, 2013 at 01:13 PM Bringt 0 Punkte. Kann ja auch nicht. Hatte ha schon geschrieben das schon nach Umwandlung des Datenpacketes mit enumerate_callback = (EnumerateCallback *)packet; ein 0 drinn steht. Aus 0 kann man nun mal nix machen. Quote Link to comment Share on other sites More sharing options...
borg Posted May 10, 2013 at 01:37 PM Share Posted May 10, 2013 at 01:37 PM Ah, hatte die Debugger-Ausgabe falsch interpretiert. Dann kann es nur sein, dass dein MinGW aus irgendwelchen Gründen __GNUC__ nicht definiert? Kannst du bei den Compiler-Einstellungen ein "-D__GNUC__" mit einfügen zum testen? Der einzige Grund der mir noch einfällt ist nämlich, dass __attribute__((packed)) im EnumerateCallback struct nicht aktiviert ist. Wobei es da eigentlich einen Compiler-Error geben sollte (siehe ip_connection.c Zeile 37ff). Quote Link to comment Share on other sites More sharing options...
FlyingDoc Posted May 10, 2013 at 09:08 PM Author Share Posted May 10, 2013 at 09:08 PM Wo kann ich das einstellen? Quote Link to comment Share on other sites More sharing options...
photron Posted May 13, 2013 at 10:00 AM Share Posted May 13, 2013 at 10:00 AM Stellt sich heraus, dass das ein GCC 4.7 Bug ist. Ein Workaround dafür ist folgende Zeile in deine .pro Datei einzufügen: QMAKE_CXXFLAGS += -mno-ms-bitfields Quote Link to comment Share on other sites More sharing options...
FlyingDoc Posted May 13, 2013 at 10:16 AM Author Share Posted May 13, 2013 at 10:16 AM THX Quote Link to comment 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.