Jump to content

Recommended Posts

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

 

Alle anderen Werte kommen.

 

Gerade nochmal getestet.

 

Aufruf

    ipcon_register_callback(ipcon,IPCON_CALLBACK_ENUMERATE,(void *)cb_enumerate,NULL);

Link zu diesem Kommentar
Share on other sites

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?

Link zu diesem Kommentar
Share on other sites

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

}

Link zu diesem Kommentar
Share on other sites

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!

Link zu diesem Kommentar
Share on other sites

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

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.

 

Link zu diesem Kommentar
Share on other sites

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

Link zu diesem Kommentar
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.

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