Jump to content

VB.net: Enumerate bei mehreren gleichen Bricklets


Recommended Posts

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

 

Danke und Gruß

Patrick

 

 

 

 

 

 

Link zu diesem Kommentar
Share on other sites

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.

Link zu diesem Kommentar
Share on other sites

- 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

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