Jump to content
André K.

Temperatur und Luftdruck liefern plötzlich falsche Werte

Recommended Posts

Du solltest übrigens prinzipiell darüber nachdenken, wenn ein _CONNECTED kommt, die Konfiguration des Bricklets (Callback-Registrierungen, Sample-Rates usw.) wiederherzustellen. Das ist ziemlich robust, habe ich z.B. in den openHAB-Bindings so gebaut.

Share this post


Link to post
Share on other sites

Kann ich denn davon ausgehen, daß sich das Bricklet dann im Initialzustand befindet? Oder sollte ich da vorher am besten noch eine Art Reset/Wipe auslösen, wenn das geht?

Bei einem Verlust der IP-Connection habe ich das übrigens folgendermaßen gelöst:

void cb_connected(uint8_t reason, void *user_data)
{
	syslog(LOG_INFO, "Connection to brickd (re)established (reason=%i)", reason);

	/* Bei einem Reconnect Aufzählung (und damit Initialisierung) neu anstoßen: */
	if(reason == IPCON_CONNECT_REASON_AUTO_RECONNECT) ipcon_enumerate(&bd_conn);
}

Da baue ich aber auch im Vertrauen darauf, daß sich die Bricklets "hoffentlich" alle noch im Initialzustand befinden — was aber natürlich nicht der Fall sein muß. Wenn sich jemand per Brick Viewer verbindet und eine Einstellung ändert die ich nicht extra initialisiere weil der Default OK ist wird die Einstellung vermutlich auch so bleiben …

Wie macht man sowas am elegantesten?

André

Share this post


Link to post
Share on other sites

Wenn das Bricklet die Enumeration (mit -Type Connected) schickt, sollte es im Initialzustand sein, alles andere wäre ein Firmware-Bug. D.h. wenn du danach deine Abweichungen zum Initialzustand konfiguriest sollte das reichen. Bei einem Reconnect der IP-Connection kann es im worst-case natürlich sein, dass während du nicht verbunden warst, eins der Bricklets neugestartet wurde, um maximal robust zu sein musst du da also auch alles was du brauchst neu konfigurieren.

Wenn sich jemand anderes per Brick Viewer verbindet und Konfiguration verstellt hast du verloren, das bekommst du nur in den Griff, wenn du die Bricklets resettest und danach neu konfigurierst. Da würde ich lieber die Authentication anschalten ;)

Share this post


Link to post
Share on other sites
vor 22 Minuten schrieb rtrbt:

Bei einem Reconnect der IP-Connection kann es im worst-case natürlich sein, dass während du nicht verbunden warst, eins der Bricklets neugestartet wurde, um maximal robust zu sein musst du da also auch alles was du brauchst neu konfigurieren.

Das passiert ja eh, denn bei einem Reconnect wird ja ipcon_enumerate() aufgerufen, und das Enumerate-Callback sieht so aus:

void cb_enumerate(const char *uid, const char *uplink_uid, char pos, uint8_t hw_vers[3], uint8_t fw_vers[3], uint16_t did, uint8_t enume_type, void *user_data)
{
	/* Nur auf manuell angestoßene Aufzählungen reagieren: */
	if(enume_type == IPCON_ENUMERATION_TYPE_AVAILABLE) switch (did)
	{
		case AMBIENT_LIGHT_V3_DEVICE_IDENTIFIER:
			if (cfg_dumpmode) printf("Found %s with UID=%s\n", AMBIENT_LIGHT_V3_DEVICE_DISPLAY_NAME, uid);

			/* Wurde der Speicher noch nicht allokiert? */
			if (bl_light == NULL) bl_light = new AmbientLightV3;
			else ambient_light_v3_destroy(bl_light);
			ambient_light_v3_create(bl_light, uid, &bd_conn);

			/* Konfiguration: 0-64000 Lux (= kein Gain), 150ms (Default laut Datenblatt: 100ms) */
			ambient_light_v3_set_configuration(bl_light, AMBIENT_LIGHT_V3_ILLUMINANCE_RANGE_64000LUX, AMBIENT_LIGHT_V3_INTEGRATION_TIME_150MS);
			ambient_light_v3_set_status_led_config(bl_light, AMBIENT_LIGHT_V3_STATUS_LED_CONFIG_OFF);

			/* Callback für Umgebungshelligkeit: 1s */
			ambient_light_v3_register_callback(bl_light, AMBIENT_LIGHT_V3_CALLBACK_ILLUMINANCE, (void (*)(void))cb_illuminance, NULL);
			ambient_light_v3_set_illuminance_callback_configuration(bl_light, 1000, true, AMBIENT_LIGHT_V3_THRESHOLD_OPTION_OFF, 0, 0);
			break;

Und dann folgen halt noch CASEs für sämtliche andere Bricklets die so zum Einsatz kommen.

Vielleicht reicht es ja schon, einfach das if (enum_type == …) wegzulassen? Ich weiß gerade gar nicht mehr warum ich das da eingebaut habe xD

André

Share this post


Link to post
Share on other sites
13 minutes ago, André K. said:

Vielleicht reicht es ja schon, einfach das if (enum_type == …) wegzulassen? Ich weiß gerade gar nicht mehr warum ich das da eingebaut habe xD

Wenn du das weglässt, konfigurierst du auch alles, wenn du eine Enumerierung mit ENUMERATION_TYPE_DISCONNECTED bekommst, da sollte aber der Code auf keinen Fall laufen.

Ansonsten gebe ich dir recht, wenn du eine Enumeration bei einem Reconnect auslöst, brauchst du sonst keine Spezialbehandlung.

Share this post


Link to post
Share on other sites
Am 22.6.2020 um 16:10 schrieb rtrbt:

Wenn du das weglässt, konfigurierst du auch alles, wenn du eine Enumerierung mit ENUMERATION_TYPE_DISCONNECTED bekommst, da sollte aber der Code auf keinen Fall laufen.

Hast natürlich Recht, deshalb habe ich das if() wohl auch drin. ;)

So ganz klar ist mir der ENUMERATION_TYPE_DISCONNECTED übrigens noch nicht. Ist damit der Fall gemeint, daß ein einzelnes Bricklet weg ist, also wenn ich im Laufenden Betrieb den Stecker ziehen würde? Oder ist das sozusagen die "USB-Version" vom IPCON_CALLBACK_DISCONNECTED, das es ja auch noch gibt? Also wenn ich das USB-Kabel des Stapels vom Rechner abziehe? In der Doku steht ja auch der Hinweis "Nur bei USB-Verbindungen möglich".

André

Share this post


Link to post
Share on other sites
1 hour ago, André K. said:

Ist damit der Fall gemeint, daß ein einzelnes Bricklet weg ist, also wenn ich im Laufenden Betrieb den Stecker ziehen würde?

Nein, das wird nicht unterstützt.

1 hour ago, André K. said:

Oder ist das sozusagen die "USB-Version" vom IPCON_CALLBACK_DISCONNECTED, das es ja auch noch gibt? Also wenn ich das USB-Kabel des Stapels vom Rechner abziehe?

Das kommt hin, ein Unterschied ist aber, dass du das Enumerate auch für Teile der Hardware bekommen kannst, du kannst ja zwei Stacks per USB angeschlossen haben und dann einen abziehen.

Share this post


Link to post
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.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...