FlyingDoc Geschrieben May 9, 2013 at 21:17 Geschrieben May 9, 2013 at 21:17 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); Zitieren
borg Geschrieben May 10, 2013 at 07:18 Geschrieben May 10, 2013 at 07:18 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? Zitieren
FlyingDoc Geschrieben May 10, 2013 at 08:42 Autor Geschrieben May 10, 2013 at 08:42 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); } } Zitieren
borg Geschrieben May 10, 2013 at 09:55 Geschrieben May 10, 2013 at 09:55 Mh, funktioniert bei mir auch. Wenn du da jetzt ein printf("id: %d\n\n", device_identifier); reinpackst gibt das 0 aus? Zitieren
FlyingDoc Geschrieben May 10, 2013 at 10:59 Autor Geschrieben May 10, 2013 at 10:59 Ich schau beim Debuggen die Variable direkt an. Und da steht Nullinger drinn. Alle anderen haben einen Wert. Zitieren
FlyingDoc Geschrieben May 10, 2013 at 11:49 Autor Geschrieben May 10, 2013 at 11:49 Hier mal ein Screen von den Variablen Zitieren
FlyingDoc Geschrieben May 10, 2013 at 12:10 Autor Geschrieben May 10, 2013 at 12:10 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. Zitieren
borg Geschrieben May 10, 2013 at 12:19 Geschrieben May 10, 2013 at 12:19 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! Zitieren
FlyingDoc Geschrieben May 10, 2013 at 12:24 Autor Geschrieben May 10, 2013 at 12:24 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. Zitieren
borg Geschrieben May 10, 2013 at 12:59 Geschrieben May 10, 2013 at 12:59 Hast du das Edit oben gelesen? Bitte probier mal einmal aus leconvert_swap32 durch leconvert_swap16 auszutauschen. Zitieren
FlyingDoc Geschrieben May 10, 2013 at 13:13 Autor Geschrieben May 10, 2013 at 13:13 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. Zitieren
borg Geschrieben May 10, 2013 at 13:37 Geschrieben May 10, 2013 at 13:37 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). Zitieren
FlyingDoc Geschrieben May 10, 2013 at 21:08 Autor Geschrieben May 10, 2013 at 21:08 Wo kann ich das einstellen? Zitieren
photron Geschrieben May 13, 2013 at 10:00 Geschrieben May 13, 2013 at 10:00 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 Zitieren
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.