Jump to content
View in the app

A better way to browse. Learn more.

Tinkerunity

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Featured Replies

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
  • Autor
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
  • Autor

Ich schau beim Debuggen die Variable direkt an.

Und da steht Nullinger drinn.

Alle anderen haben einen Wert.

Geschrieben
  • Autor

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.

Variablen1.thumb.jpg.28759a61a656fb51fe9031d7cd4fa422.jpg

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
  • Autor

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
  • Autor

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

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

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.