Jump to content

Recommended Posts

Geschrieben

Hallo Zusammen,

 

ich habe gerade ein kleines Problemchen, bei welchem ich nicht wirklich durchblicke :-(

 

Ich habe eine kleine Testanwendung geschrieben, welche mir ähnlich wie der BrickViewer erst einmal alle Bricks und Bricklets anzeigt, die angeschlossen sind.

 

Dazu führe ich folgenden Code aus:

 

public partial class Form1 : Form
    {

        private static string HOST = "localhost";
        private static int PORT = 4223;

        IPConnection ipcon = new IPConnection();

public Form1()
        {
            InitializeComponent();

            // Register IP Connection callbacks
            ipcon.EnumerateCallback += EnumerateCB;
            //ipcon.Connected += ConnectedCB;

            this.FormClosing += Form1_FormClosing;
        }

private void EnumerateCB(IPConnection sender, string UID, string connectedUID,
                                char position, short[] hardwareVersion,
                                short[] firmwareVersion, int deviceIdentifier,
                                short enumerationType)
        {
            if (enumerationType == IPConnection.ENUMERATION_TYPE_CONNECTED ||
               enumerationType == IPConnection.ENUMERATION_TYPE_AVAILABLE)
            {
                string deviceName = "";

                // DeviceIdentifier in lesbaren Text umwandeln
                switch (deviceIdentifier.ToString())
                {
                    case "11":
                        deviceName = "DC Brick";
                        break;
...
                }
if (connectedUID == "0")
                {
                    connectedUID = "--";
                }

                //Baue ListenItems auf
                string[] myItems = new string[5];

                if (position == '\x0030')
                {
                    myItems[3] = "--";
                }
                else
                {
                    myItems[3] = position.ToString().ToUpper();
                }

                myItems[0] = deviceName;
                myItems[1] = UID;
                myItems[2] = connectedUID; 

                ListViewItem LVItem = new ListViewItem(myItems);

                try
                {
                    listView2.Invoke(new Action(() => listView2.Items.Add(LVItem)));
                }
                catch (Exception exceptionMsg)
                {
                    MessageBox.Show(exceptionMsg.Message, "Fehler!", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Error);
                }
            }

if (connectedUID == "0")
                {
                    connectedUID = "--";
                }

                //Baue ListenItems auf
                string[] myItems = new string[5];

                if (position == '\x0030')
                {
                    myItems[3] = "--";
                }
                else
                {
                    myItems[3] = position.ToString().ToUpper();
                }

                myItems[0] = deviceName;
                myItems[1] = UID;
                myItems[2] = connectedUID;

                ListViewItem LVItem = new ListViewItem(myItems);

                try
                {
                    listView2.Invoke(new Action(() => listView2.Items.Add(LVItem)));
                }
                catch (Exception exceptionMsg)
                {
                    MessageBox.Show(exceptionMsg.Message, "Fehler!", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Error);
                }
            }
        }

private void button1_Click(object sender, EventArgs e)
        {
            // Connect to brickd, will trigger cb_connected
            try
            {
                ipcon.Connect(HOST, PORT);
                //MessageBox.Show("Connected: " + IPConnection.CONNECTION_STATE_CONNECTED.ToString(), "2");
            }
            catch (Exception exceptionMsg)
            {
                MessageBox.Show(exceptionMsg.Message + "\n\nDas Programm wird beendet.", "Fehler!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                this.Close();
            }

            try
            {
                ipcon.Enumerate();
                //MessageBox.Show("Connected: " + IPConnection.CONNECTION_STATE_CONNECTED.ToString(),"3");
            }
            catch (Exception exceptionMsg)
            {
                MessageBox.Show(exceptionMsg.Message, "Fehler!", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Error);
            }
        }

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (e.CloseReason == CloseReason.UserClosing)
            {

                MessageBox.Show("Connected: " + IPConnection.CONNECTION_STATE_CONNECTED.ToString(), "4");
                // Prompt user to save his data

                // CONNECTION STATE = 1, obwohl noch keine Verbindung aufgebaut wurde... ?
                if (IPConnection.CONNECTION_STATE_CONNECTED == 1)
                {
                    try
                    {

                        ipcon.Disconnect();
                    }
                    catch (Exception exceptionMsg)
                    {
                        MessageBox.Show(exceptionMsg.Message, "Fehler!", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Error);
                    }
                }

                listView2.Clear();

                MessageBox.Show("Tinkerforge Disconnected", "Anwendungsstop!", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }
    }
}

 

Das Phänomen:

Obwohl das Connect erst nach klick auf den button1 stattfindet - erst dann baut er mir die Liste auf, welches im EnumerateCB mit drin steht, bekomme ich für die Abfrage im Form1_FormClosing bei IPConnection.CONNECTION_STATE_CONNECTED den Wert 1 zurück.

 

Bezieht sich dies nur auf die reine USB-Verbindung?

Ist also nur dann 0, wenn der USB Stecker gezogen ist?

 

Wenn ja, wie sollte ich die Abfrage ändern, damit die "Verbindung" zu den Bricks getrennt wird?

 

Danke schon mal und Gruß,

Christoph

Geschrieben

...

Wenn ja, wie sollte ich die Abfrage ändern, damit die "Verbindung" zu den Bricks getrennt wird?

 

ich trenne die Verbindung mit

ipcon.Disconnect (DELPHI)

sollte auch in anderen Umgebungen so sein

 

---> o.k., hatte ich übersehen, ist im Form.Close drin,

ich vermute, dass sich das Connection-State auf die interne Verbindung,

aufgebaut durch die Treiber, bezieht - sonst mal in den entspr. Bindings nachschauen, welcher Rückgabewert für connected wann erzeugt wird.

 

Geschrieben

Ja, genau das mache ich auch.

if (IPConnection.CONNECTION_STATE_CONNECTED == 1)
                {
                    try
                    {

                        ipcon.Disconnect();
                    }
                    catch (Exception exceptionMsg)
                    {
                        MessageBox.Show(exceptionMsg.Message, "Fehler!", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Error);
                    }
                }

 

Folgendes verhalten:

Setze ich das ipcon.Disconnect nicht in eine try/catch block, beendet sich das programm wegen einer nicht behandelten eception. Der Tinkerforge.NotConnected (o.ä. Genauen Text hab ich jetzt nicht im Kopf).

 

Ich kann also kein Disconnect machen, weil kein Connect abgesetzt wurde.

 

Meine Lösung daher mit der if abfrage.

Nur:

 

Der Code springt IMMER in den if Block rein und gibt mir in einer msgbox, welche ich testweise mal mit rein gebaut habe den CONNECTION_STATE mit 1 aus. Springt dann aber in den catch block und wirft die exception, dass keine Verbindung besteht.

 

Das verwirrt mich ;)

Geschrieben

IPConnection.CONNECTION_STATE_CONNECTED ist eine Konstante. Die ist immer 1.

 

Den Zustand der Verbindung gibt ipcon.GetConnectionState() zurück. Diesen Rückgabe Wert kannst du dann mit IPConnection.CONNECTION_STATE_* vergleichen, um zu sehen ob die IPConnection *_DISCONNECTED, *_CONNECTED oder *_PENDING ist.

 

ipcon.GetConnectionState() sagt dir nichts über einzeln Brick(let)s aus, sondern sagt dir wie die Verbindung zum Brick Daemon, zur WIFI oder zur Ethernet Extension ist.

Geschrieben

Meh. Danke :)

War dann wohl gestern zu spät dafür ^^

 

Wenn ich einzelne bricklets abfragen möchte, dann muss ich ja ein connect mit der jeweiligen uid des bricklets absetzen, richtig?

 

Wie kann ich ggf. hier überprüfen, ob noch eine Verbindung besteht?

Oder denke ich jetzt in die falsche Richtung?

Geschrieben

Es gibt in dem Sinne keine Verbindung zu den einzelnen Brick und Bricklets. Du verbindest dich mit der IPConnection zum Brick Daemon, oder zur WIFI oder Ethernet Extension und kannst dann darüber die einzelnen Bricks und Bricklets erreichen.

 

Der Enumerate Callback sagt dir dann welche Bricks und Bricklets du gerade als Stack per USB an oder abgesteckt hast. Einen Stack den du über WIFI oder Ethernet Extension erreichst ist fest und kann sich zur Laufzeit nicht ändern.

Geschrieben

...

Wenn ich einzelne bricklets abfragen möchte, dann muss ich ja ein connect mit der jeweiligen uid des bricklets absetzen, richtig?

 

Wie kann ich ggf. hier überprüfen, ob noch eine Verbindung besteht?

Oder denke ich jetzt in die falsche Richtung?

 

im Zweifelsfall mit einer Datenabfrage in einem Try-Except bzw. Try-Catch-Ressourcenschutzblock, evt. als Funktion mit boolschem Rückgabewert.

Man könnte zwar beim Connect eine Statusvariable initialisieren, diese bekommt

aber von z.B. dem Abziehgen des USB-Steckers nichts mit.

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