P4trick Geschrieben July 21, 2015 at 12:26 Geschrieben July 21, 2015 at 12:26 Hallo zusammen, ich bastel gerade ein wenig und bin dabei auf ein kleines Hindernis gestoßen. Ich habe mir mal die Demo der Wetterstation in vb.net angeschaut und dort wird der robuste Ansatz ja über EnumerateCallbacks gelöst, um keine statischen UID´s nutzen zu müssen. Ich habe etwas ähnliches nachgebaut, habe jedoch zwei gleiche Bricklets (VoltageCurrent). Jetzt wäre meine Frage wie ich hier entsprechend auch beide Bricklets initialisieren kann. speziell ist das diese Stelle: ElseIf deviceIdentifier = BrickletVoltageCurrent.DEVICE_IDENTIFIER Then Try panel_VC= New BrickletVoltageCurrent(uid, ipcon_satellit) panel_VC.SetCurrentCallbackPeriod(1000) AddHandler VC.GetCurrent, AddressOf panelCB System.Console.WriteLine("panelinitialized") Catch e As TinkerforgeException luftdruck = Nothing End Try End If Was ist da als Antwort von BrickletVoltageCurrent.DEVICE_IDENTIFIER zu erwarten? bei dem VoltageCurrent hätte ich da auch generell die Frage, wie diese Methode anzuwenden ist, wenn ich über ein Bricklet 2 Werte Abfragen kann? kann ich in einem Callback voltage und Current gleichzeitig abfragen oder sollte ich eine weitere Zeile: panel_VC.SetVoltageCallbackPeriod(1000) hinzufügen und einen weiteren Callback für Voltage erstellen? wenn ja, wie müsste das der Callback aussehen? Sub battCB(ByVal sender As BrickletVoltageCurrent, ByVal BattVoltage As Integer, ByVal BattCurrent As Integer) If brickletLCD IsNot Nothing Then Dim text As String = String.Format("Temperature {0,5:##.00} {1}C", BattVoltage / 100.0, Chr(&HDF)) brickletLCD.WriteLine(2, 0, text) System.Console.WriteLine("Write to line 3: " + text.Replace(Chr(&HDF), "°"c)) End If End Sub wenn ich das so machen, mecker er, weil ich zwei Werte mit übergeben möchte. das würde bedeuten bei zwei gleichen Bricklets hätte ich insgesamt 4 Callbacks? Oh Gott, ich hoffe das war nu nicht zu viel durcheinander Danke und Gruß Patrick Zitieren
jgmischke Geschrieben July 21, 2015 at 13:42 Geschrieben July 21, 2015 at 13:42 Wie wäre es denn mit einem Device Array, in das du je nach Bedarf die unterschiedlichen Devices reinpackst. Die Initailisierung würde dann über das Devicearray erfolgen. Also etwa: Device[0] = Bricklet0 Device[1] = MasterBrick Device[2] = uws. Zitieren
remotecontrol Geschrieben July 21, 2015 at 17:36 Geschrieben July 21, 2015 at 17:36 Mit dem deviceIdentifier = BrickletVoltageCurrent.DEVICE_IDENTIFIER liegst Du richtig. Anhand des Identifiers im Enumerate kannst Du den Typ von Brick(let) erkennen. Bei den Callbacks liegst Du auch richtig: du musst pro Bricklet und Callbacktyp je einen registrieren, also 4x etwas registrieren. Allerdings kannst Du eine Callbackfunktion ggf. wieder verwenden. Das hängt davon ab, wie Du sie implementierst. Wenn Du 4 Funktionen machst, ist damit schon klar definiert, welche Funktion für welches Bricklet wann aufgerufen wird. Wenn Du 2 Funktionen machst (z.B. je eine für Voltage und eine für Current) musst Du in der Funktion anhand des Bricklets (leider doch UID oder User-Parameter) unterscheiden. Ich habe auch eine Anwendung wo ich z.B. zwei Quad-Relais nutze. Da komme ich nicht drum herum, der Anwendung per Konfiguration (konkret UID) zu sagen, welches der beiden Relais welche Kanäle schaltet. Der Enumerate stellt ja keine Reihenfolge sicher. D.h. ich nutze dennoch den Enumerate, weise im Enumerate aber dann anhand der UID (falls ich mehr als 1 Bricklet gleicher Art erwerte) eine bestimmte Funktion zu. Zitieren
XZ3RO Geschrieben July 29, 2015 at 16:51 Geschrieben July 29, 2015 at 16:51 - Connected UID: 2SYrgt - Position: 1 - Connected UID: 5VEKbA - Position: a Das kann man doch über die (Position: [X]) machen!!!. position: Für Bricks: '0' - '8' (Position in Stapel). Für Bricklets: 'a' - 'd' (Position an Brick). oder so Sub EnumerateCB(ByVal sender As IPConnection, ByVal uid As String, _ ByVal connectedUid As String, ByVal position As Char, _ ByVal hardwareVersion() As Short, ByVal firmwareVersion() As Short, _ ByVal deviceIdentifier As Integer, ByVal enumerationType As Short) If enumerationType = IPConnection.ENUMERATION_TYPE_CONNECTED Or _ enumerationType = IPConnection.ENUMERATION_TYPE_AVAILABLE Then If deviceIdentifier = BrickRED.DEVICE_IDENTIFIER Then Try BrickRED = New BrickRED(uid, ipcon) Call Add() Catch e As TinkerforgeException System.Console.WriteLine("BrickRED init failed: " + e.Message) BrickRED = Nothing End Try ElseIf deviceIdentifier = BrickMaster.DEVICE_IDENTIFIER Then Try BrickMaster = New BrickMaster(uid, ipcon) Call Add() Catch e As TinkerforgeException System.Console.WriteLine("BrickMaster init failed: " + e.Message) BrickMaster = Nothing End Try End If End If End Sub Sub Add() If BrickRED IsNot Nothing Then System.Console.WriteLine(BrickRED.UID) End If If BrickMaster IsNot Nothing Then System.Console.WriteLine(BrickMaster.UID) End If End Sub 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.