Jump to content

photron

Administrators
  • Gesamte Inhalte

    3.052
  • Benutzer seit

  • Letzter Besuch

  • Tagessiege

    39

Posts erstellt von photron

  1. Tja, anscheinend tappe ich immer in Fettnaepfchen. Hier die Loesung:

     

    Wenn man bei dem Temperaturbricklet als UID die MasterBrickUID einsetzt, dann kommt keine Fehlermeldung und es wird brav der Wert 0.0 zurueckgeliefert!

     

    Setzt man die 3 stellige UID des Bricklets ein, kommt der richtige Wert zurueck. Muss man erstmal verstanden haben.  :-[

     

    Die Bindings prüfen im Moment noch nicht, ob das antwortende Brick von dem Type ist das die Bindings gerade erwarten. Es steht schon auf meiner TODO Liste das zu verbessern.

     

    Und wie ArcaneDraconum schon sagt UIDs haben keine feste Länge. Zufälligerweise sind im Moment die UIDs der Bricklets im Auslieferungszustand immer 3-stellig.

  2. Iangillan, ich habe mir gerade mal Scratch angeschaut. So einfach ist die Anbindung zu Tinkerforge dann auch nicht, denke ich. Wie es aussieht kann man nicht so einfach neue Blöcke hinzufügen, ausser man erstellt eine Scratch Modification:

     

    http://wiki.scratch.mit.edu/wiki/Scratch_Modification

     

    Das ist dann ein eigenständiges Programm das nicht mehr Scratch heißen darf. Das Problem daran ist, dass Scratch in Squeak programmiert ist.

     

    Ein einfachere Variante wäre es wohl das Remote Sensors Protocol für Tinkerforge zu implementieren (z.B. in Form eines Proxies zwischen Brick Daemon und Scratch):

     

    http://wiki.scratch.mit.edu/wiki/Remote_Sensors_Protocol

     

    So weit ich das verstehe könnte man damit die Ausgabewerte der Tinkerforge Sensoren in Scrach per Sensor Block verfügbar machen und in Scratch darauf reagieren. Die Rückrichtung für Aktoren könnte man wohl über Broadcasts bauen.

     

    Ob das im Endeffekt ordentlich funktioniert und wie viel Arbeit das ist kann ich gerade nicht einschätzen.

  3. Die Callback Lösung ist nicht wirklich berauschend. Wenn man das in eine Webapplikation einbauen würde, was bei PHP ja zu erwarten ist, ist das aus meiner Sicht unbenutzbar ?

     

    Der Sinn der Callbacks ist, dass du nicht pollen musst um Ereignisse mitzubekommen. Man kommt aber an fasst alle Informationen auch ohne Callbacks. Typischerweise hast du da ein Programm das länger läuft wenn du Callbacks nutzt.

     

    Im Rahmen einer Webapplikation wird aber PHP immer nur kurz ausgeführt um die Webseite zu erstellen. Dort hast du kein lange laufendes PHP Programm, daher machen dort Callbacks wenig Sinn. Oder verstehe ich jetzt hier was falsch?

     

    In einem lange laufenden Standalone PHP Programm musst du eben dafür sorgen dispatchCallbacks regelmässig aufzurufen, wenn du Callbacks nutzt. Das ist bisher die portabelste Lösung auf die ich bis jetzt gekommen bin.

     

    Christian, mir ist nicht ganz klar was du mir mit WinBinder sagen willst. Ich sehe zumindest nichts was dich hindern sollte WinBinder und Tinkerforge in einem Programm zu verwenden.

  4. Und ich schätze immer noch, dass die PHP Bindings diese Woche verfügbar sein werden.

     

    Hier mal ein Beispiel Programm, das die Versionsinformation und die aktuelle Position eine Linear Poti Bricklets ausliest.

     

    <?php
    
    require_once('Tinkerforge/IPConnection.php');
    require_once('Tinkerforge/BrickletLinearPoti.php');
    
    use Tinkerforge\IPConnection;
    use Tinkerforge\BrickletLinearPoti;
    
    $host = 'localhost';
    $port = 4223;
    $uid = '7jb';
    
    $ipcon = new IPConnection($host, $port);
    $lp = new BrickletLinearPoti($uid);
    
    $ipcon->addDevice($lp);
    
    echo "getVersion():\n";
    var_dump($lp->getVersion());
    
    echo "getPosition():\n";
    var_dump($lp->getPosition());
    
    ?>

     

    Hier die Ausgabe des Programms mit dem PHP Kommandozeilen Tool ausgeführt. Die Minimum PHP Version wird 5.3 sein. Das ganze funktioniert auch mit dem PHP Modul in Apache.

     

    getVersion():
    array(3) {
      ["name"]=>
      string(24) "Linear Poti Bricklet 1.0"
      ["firmwareVersion"]=>
      array(3) {
        [0]=>
        int(1)
        [1]=>
        int(1)
        [2]=>
        int(0)
      }
      ["bindingVersion"]=>
      array(3) {
        [0]=>
        int(1)
        [1]=>
        int(0)
        [2]=>
        int(0)
      }
    }
    getPosition():
    int(43)
    

     

    Hier noch ein Beispiel mit Callback

     

    <?php
    
    require_once('Tinkerforge/IPConnection.php');
    require_once('Tinkerforge/BrickletLinearPoti.php');
    
    use Tinkerforge\IPConnection;
    use Tinkerforge\BrickletLinearPoti;
    
    $host = 'localhost';
    $port = 4223;
    $uid = '7jb';
    
    $ipcon = new IPConnection($host, $port);
    $lp = new BrickletLinearPoti($uid);
    
    $ipcon->addDevice($lp);
    
    function cb_position($position) {
        echo "position changed: $position\n";
    }
    
    $lp->registerCallback(BrickletLinearPoti::CALLBACK_POSITION, 'cb_position');
    $lp->setPositionCallbackPeriod(20);
    
    $ipcon->dispatchCallbacks(-1);
    
    ?>

     

    Und hier die Ausgabe nach Bewegen des Potis.

     

    position changed: 45
    position changed: 52
    position changed: 56
    position changed: 55
    position changed: 48
    position changed: 43
    position changed: 39
    position changed: 34
    position changed: 30
    position changed: 26
    position changed: 23
    position changed: 21
    position changed: 20

     

    Da PHP keine Threads unterstütz und die Workarounds alle recht plattformspezifisch sind muss man selbst dafür sorgen das Callbacks ausgeliefert werden.

     

    Dafür ist die dispatchCallbacks Methode der IPConnection da. Der kann man ein Zeitspanne in Sekunden übergeben, die Callbacks ausgeliefert werden sollen bevor dispatchCallbacks returned. -1 wie im Beispiel bedeutet unendlich.

     

    Falls ihr Vorschläge oder Kommentare dazu habe dann würde ich sie gerne hören.

  5. Okay ich habe mir die Embarcadero RAD Studio XE2 Trial Version installiert. Ich musste ein paar Änderungen am Code vornehmen damit er mit dem Borland Compiler funktioniert.

     

    Was hast du getan um den Compiler Fehler wegen PACKED zu beheben?

     

    Das eigentliche Problem ist, dass im Moment der Code für Borland Compiler kein Packing für structs aktiviert. Wenn ich das so lasse dann schlägt auch bei mir das add_device fehl.

     

    Ich behebe das gerade. Ich denke das wird die Ursache deines Problem sein.

     

  6. Ich verstehe nicht ganz was du mit fehlschlagen meinst. Es hört sich so an als könntest du dein Programm kompilieren und starten und das Problem tritt dann beim Ausführen des Programms auf.

     

    Wenn das so ist, dann ist nicht die ws2_32.lib das Problem. Denn wenn die nicht richtig eingebunden wäre dann würde der Compiler (eigentlich der Linker) einen Fehler melden beim Kompilieren.

     

    "Add Device" kann ein E_TIMEOUT (-1) zurückgeben, wenn kein Device mit der passenden UID antwortet. Meinst du dass mit "fehlschlagen"?

     

    #define UID "aySDPZAhvvd" // Change to your UID
    
    // Create device object
    Master master;
    master_create(&master, UID);

     

    Die UID die du beim Aufruf der create Funktion übergibst muss exakt die sein die der Brick Viewer für den entsprechenden Brick anzeigt. Vielleicht hast du da einen Tippfehler oder die UID aus dem Beispielcode nicht durch die deines Bricks ersetzt?

  7. Wenn ich das im Generator richtig sehe, dann wird das implizit durch die Position der Funktion in der Config gegeben.

     

    Also die zuerst angegebene Methode ist die eins, dann die zwei usw.

     

    Richtig.

     

    Da mit diesen Configs auch die Dokus erstellt werden, könnte man beispielsweise die IDs einfach bei den einzelnen Dokus mit einbringen oder daraus eine "Low-Level" (der Begriff wird woanders auch noch benutzt oder?) Doku erstellen.

     

    Die Function IDs sind bei der TCP/IP Dokumentation bei allen Funktion und Callbacks mit angegeben. Für die Bindings für andere Sprachen sind diese IDs nicht angegeben da sie dort nur intern verwendet werden.

     

    Ich verstehe nicht ganz wo du da noch die Function IDs mit angeben willst oder was du noch in eine "Low-Level" Dokumentation stecken willst dass nicht schon in der TCP/IP Dokumentation steckt, oder eigentlich dort hingehört.

  8. Verstehe ich es richtig, dass ihr nur bei den Methoden wo der Wertebereich es notwendig macht zwei Überladungen anbieten wollt? Oder soll es für jede Methode eine zweit-Überladung geben? (beispielsweise wäre sie ja bei SetVoltage im AnalogOut nicht nötig, weil der maximal 5000mV kann)

     

    Alle Methoden die unsigned Typen verwenden bekommen eine CLS-compliant Überladung. Da die Bindings generiert werden und der Generator den Typ  der Parameter kennt (aber nicht den wirklich genutzten Wertebereich) ist dies so einfacher zu lösen. Dies führt auch dazu dass die Bindings für C# im Prinzip so bleiben wie sie jetzt sind und nur für vollständige CLS-Compliance für andere .Net Sprachen erweitert werden.

  9. AuronX, danke für den Hinweis.

     

    Wir können die C# Bindings CLS-compliant machen, denke ich. Da C# unsigned Typen unterstützt würden wir diese ungern durch die nächst größeren signed Typen ersetzen (so wie das in den Java Bindnings ist, weil es da nicht anders geht).

     

    Daher wäre eine Idee, dass jede Methode die nicht CLS-compliant ist einen CLS-compliant Überladung bekommt. Zum Beispiel für BrickIMU würde aus

     

    public void SetAccelerationPeriod(uint period);

     

    dann

     

    [CLSCompliantAttribute(false)]
    public void SetAccelerationPeriod(uint period);
    [CLSCompliantAttribute(true)]
    public void SetAccelerationPeriod(long period);

     

    In der Hoffnung, dass das so geht (ich hab's noch nicht getestet) und z.B. in VB.net die CLS-compliant Variante aufgerufen wird und diese sich nicht mit Der Überladung in die Quere kommt. Falls nicht würde die CLS-compliant Variante noch einen Anhang an den Methodennamen bekommen.

     

    Siehst du sonst noch Probleme außer die unsigned Typen?

  10. Das Device nicht public ist aber als Parameter in addDevice verwendet wird ist richtig und es ist ganz normal und erwartet dass das so in Java funktioniert.

     

    Das funktioniert da Device package Visibility hat und daher können alle Brick und Bricklet Klassen im com.tinkerforge Package davon erben. Die Brick und Bricklet Klassen selbst sind public und Objekte davon können daher an addDevice übergeben werden.

     

    Aber es spricht nichts dagegen Device public zu machen. Allerdings kann man nur einen public Klasse pro .java Datei haben. Eine mögliche Lösung wäre die Device Klasse in eine Device.java auszulagern. Aber eigentlich wollen wir die IPConnection (und dazu gehört das Device) in einer Datei haben.

     

    Was ich aber recht einfach tun kann ist die Device Klasse als innere Klasse in IPConnection Klasse zu machen, so dass sie über IPConnection.Device public verfügbar ist.

×
×
  • Neu erstellen...