Jump to content

Recommended Posts

Geschrieben

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

Geschrieben

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?

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

}

Geschrieben

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!

Geschrieben

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.

 

Geschrieben

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

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