Jump to content

photron

Administrators
  • Gesamte Inhalte

    3.066
  • Benutzer seit

  • Letzter Besuch

  • Tagessiege

    42

Alle erstellten Inhalte von photron

  1. Okay, ich hab das mal versucht und kann wirklich "uses Macapi.CoreFoundation" verwenden. Aber "uses Macapi.CocoaTypes" gibt z.B. einen Fehler obwohl das laut Dokumentation auch gehen sollte. Die Dokumentation dazu ist sehr dünn von der Delphi Seite her. Laut Apple Dokumentation gibt es CFSocket im CoreFoundation Framework. Aber ich konnte nicht herausfinden wie man das dann in Delphi verwendet. Es scheint weder CFSocket, noch CFSocketRef, noch TCFSocket oder TCFSocketRef als Typ zu geben. Da steh ich auf dem Schlauch. Ich kann auch keinerlei Beispielcode dazu finden, wie das funktionieren soll. Edit: Nachdem ich noch mal ein neues Projekt angelegt habe kann ich jetzt CFSocketRef verwenden.
  2. On Windows 8 the Brick Daemon and Brick Viewer installers don't install any drivers, that's correct. There are two reasons for this: 1. The drivers aren't signed and Windows 8 doesn't allow to installed unsigned driver by default. 2. Windows 8 can auto detect a Brick and install it's own driver for it. You don't need the drivers that come with Brick Daemon and Brick Viewer on Windows 8. If you connect a Master Brick (with a version 2 firmware) to USB, it'll show up as "Master Brick" in the USB devices category in the device manager. Now brickd should be able to find it and a connected brickv should show it. If a Brick is in bootloader mode then Windows 8 will auto detect it as a serial port named "GPS Camera Detect". This serial port can then be selected in brickv for flashing. Doesn't it work for you as described?
  3. Das ist richtig. Im Moment wird angenommen, dass Delphi IDE == Windows bedeutet. Das funktioniert für iOS dann natürlich nicht mehr. Ich habe mir das gerade mal angesehen und es fehlt zumindest die Sockets Unit. Ich konnte allerdings bisher nicht herausfinden was man tun muss um die wieder zu bekommen, oder wie man mit Delphi unter iOS Sockets benutzt.
  4. Das Umbenennen von *.c nach *.cpp ist denke ich die einfachste und beste Weise um die Bindings in C++ zu verwenden. Dann passt auch das Name Mangling automatisch usw. Ich nehme das mal als empfohlenes Vorgehen für C++ in die Dokumentation auf.
  5. Here's a first prototype of the shell bindings. They are written in Python for portability and use the argparse module for the command line handling. Host and port default to localhost and 4223, they can be changed with the --host and --port option: tinkerforge --host 192.168.178.42 Enumerate It can enumerate connected devices: $ tinkerforge enumerate uid=68aT1f connected-uid=0 position=0 hardware-version=1,0,0 firmware-version=2,0,6 device-identifier=13 uid=SCT31 connected-uid=68aT1f position=a hardware-version=1,1,0 firmware-version=2,0,0 device-identifier=216 The output is in <key>=<value> format can can then be processed further with xargs, awk, etc. By default the bindings will wait 250ms for enumerate callbacks, this can be changed with the --duration option. Functions Calling the get-temperature function of a Temperature Bricklet with UID SCT31: $ tinkerforge call temperature-bricklet --uid SCT31 get-temperature temperature=2325 Callbacks Setting the temperature callback period to 500ms: $ tinkerforge call temperature-bricklet --uid SCT31 set-temperature-callback-period 500 and waiting for temperature callbacks $ tinkerforge dispatch temperature-bricklet --uid SCT31 temperature temperature=2418 temperature=2431 By default the bindings will dispatch callbacks forever, this can be changed with the --duration option. Output Processing There are two options for further output processing: --execute and --replace. The --execute option takes a shell command. The bindings then append the output values to this command and execute it: $ tinkerforge enumerate --execute echo 68aT1f 0 0 1,0,0 2,0,6 13 0 SCT31 68aT1f a 1,1,0 2,0,0 216 0 With the --replace option the bindings don't append the output values to the shell command but apply the Python string format function to the command string: $ tinkerforge dispatch temperature-bricklet --uid SCT31 temperature --execute 'echo "scale=2; {temperature} / 100" | bc | xargs printf "`date`, the temperature is: %s °C\n"' --replace Thu Apr 25 13:44:25 CEST 2013, the temperature is: 24.25 °C This allows to use the key from the <key>=<value> output pairs as placeholders (wrapped in curly braces) in the shell command. The bindings replace them with the corresponding values before executing the shell command. This two options are mainly intended for platforms such as Windows that don't have advanced shell commands (xargs, awk, etc) ready to use. Bash Completion For tab completion in bash the tinkerforge.bash_completion file has to be moved to /etc/bash_completion.d/ as tinkerforge and the tinkerforge script has to be in a location in PATH. Now tab completion should work. tinkerforge tinkerforge.bash_completion
  6. Okay, laut lsusb erkennt Linux den Servo Brick. Was sagt denn dass brickd Log unter /var/log/brickd.log dazu? Steht da was von "Added USB device" und "Removing USB device" wenn du den Brick per USB an- und absteckst?
  7. Und jetzt auch mit dem ersten Versuch für bash Completion. Dafür muss sich tinkerforge im PATH befinden, tinkerforge.bash_completion muss nach /etc/bash_completion.d/ und in tinkerforge umbenannt werden. tinkerforge tinkerforge.bash_completion
  8. Der Vorteil an daran, dass in Python zu machen ist, dass es überall da funktioniert wo Python und argparse vorhanden sind. Wir müssen also nicht für n verschiedene Plattformen n verschiedene Binaries erstellen. Der Nachteil daran ist, dass Python benötigt wird, ja. Das ist zumindest bei Debian sqeeze nicht richtig. An anderer Stelle habe ich schonmal gehakt. Es reicht hier Python 2.6: Okay. Laut Python Dokumentation ist es seit 2.7 in der Standard Library. Das hindert Debian natürlich nicht daran das auch für Python 2.6 bereitzustellen Das sind also quasi Variablen die man mit "--execute" und "--replace" weiterverarbeiten kann!? Warum muss das sein und was ist "format Funktion aus Python"? Ohne --execute werden die Ausgaben von Gettern und Enumerate als <key>=<value> per Zeile auf stdout ausgegeben. Das kannst du dann mit xargs, awk, etc weiterverarbeiten. --execute ist einfach eine andere optionale Variante die Ausgabe zu verarbeiten/formatieren. Die ist z.B. mit Hinblick auf Windows gedacht, wo Sachen wie xargs und awk nicht so einfach zur Hand sind. --execute nimmt einen Shell Befehl entgegen und hängt dann einfach alle Ausgabewerte an. tinkerforge call temperature-bricklet --uid SCT31 get-temperature --execute "echo" Hier wird dann "echo 2258" ausgeführt. Mit --replace können im Shell Befehl Platzhalter verwendet werden. In diesem Fall {temperature}: tinkerforge call temperature-bricklet --uid SCT31 get-temperature --execute "echo `date +%s` {temperature} >> t.log" --replace Hier wird dann "echo `date +%s` 2258 >> t.log" ausgeführt. Für diese Platzhalter wird einfach die Python format Funktion verwendet: http://docs.python.org/2/library/string.html#format-examples
  9. Mit LCD 20x4 Bricklet Plugin 2.0.3 ist das Problem jetzt behoben. Der Cursor springt am Zeilenende jetzt in die jeweils nächste Zeile. Aus der letzten Zeile springt er dann wieder in die erste. War nicht so schwierig zu fixen wie borg erst dachte
  10. Plugins: LCD 20x4 Bricklet 2.0.3 Fix cursor position logic at end of line Download Plugin: LCD 20x4 Bricklet
  11. Plugins: LCD 20x4 Bricklet 2.0.3 Cursor Positionierung am Ende der Zeile korrigiert Download Plugin: LCD 20x4 Bricklet
  12. Da das doch recht schnell von der Hand ging hier mal ein erster Prototyp der Shell Bindings. Sie basieren auf den Python Bindings und die Kommandozeilenbehandlung ist mit argparse gemacht. Dadurch wird mindestens Python 2.7 benötigt. Enumerate Ein Enumerate mit Standardausgabe: $ ./tinkerforge enumerate uid=68aT1f connected-uid=0 position=b'0' hardware-version=1,0,0 firmware-version=2,0,6 device-identifier=13 uid=SCT31 connected-uid=68aT1f position=b'a' hardware-version=1,1,0 firmware-version=2,0,0 device-identifier=216 Ein Enumerate mit --execute. Alle Parameter des Enumerate Callbacks werden durch Leerzeichen getrennt an die --execute Befehlszeile angehängt und dann das Ergebnis ausgeführt: $ ./tinkerforge enumerate --execute echo 68aT1f 0 0 1,0,0 2,0,6 13 0 SCT31 68aT1f a 1,1,0 2,0,0 216 0 Ein Enumerate mit --execute und --replace. Das --replace Flag sorgt dafür, dass auf die --execute Befehlszeile die format Funktion aus Python angewandt wird: $ ./tinkerforge enumerate --execute "echo {uid} {device-identifier}" --replace 68aT1f 13 SCT31 216 Funktionen Temperaturabfrage eines Temperature Bricklets mit UID SCT31: $ ./tinkerforge call temperature-bricklet --uid SCT31 get-temperature temperature=2325 Auch hier funktionieren --execute und --replace: $ ./tinkerforge call temperature-bricklet --uid SCT31 get-temperature --execute 'echo "scale=2; {temperature} / 100" | bc | xargs printf "Die Temperatur beträgt: %s °C\n" ' --replace Die Temperatur beträgt: 23.18 °C Callbacks Aufruf der set-temperature-callback-period Funktion des Temperature Bricklets mit UID SCT31: $ ./tinkerforge call temperature-bricklet --uid SCT31 set-temperature-callback-period 500 Auf Callbacks warten: $ python3 ./tinkerforge dispatch temperature-bricklet --uid SCT31 temperature temperature=2418 temperature=2431 Auch hier funktionieren --execute und --replace: ./tinkerforge dispatch temperature-bricklet --uid SCT31 temperature --execute 'echo "scale=2; {temperature} / 100" | bc | xargs printf "Die Temperatur beträgt: %s °C\n" ' --replace Die Temperatur beträgt: 23.18 °C Die Temperatur beträgt: 23.25 °C Was haltet ihr davon? tinkerforge
  13. Okay, jetzt weiss ich was da passiert. PC2 verlangt einen Response für den set_configuration, wartet aber nicht auf die Antwort sondern macht die Verbindung wieder zu, bevor die Antwort bei brickd angekommen ist. Kurzer brickd Interna Ausflug: Für eingehende Anfragen mit R Flag merkt sich brickd den Header des Pakets in einer Liste pro TCP/IP Verbindung. Dadurch kann er eingehende Antworten an die Verbindung weiterreicht, die auf diese Antwort wartet. Wenn eine Antwort ankommt, auf die keiner wartet dann wir sie an alle geschickt. Dann kommt die verlangte Antwort von set_configuration an. Da aber die anfragende Verbindung schon wieder zu ist wartet keiner mehr auf diese Antwort und brickd schickt sie an alle offenen TCP/IP Verbindungen. Und daher bekommt deine temperaturabfragende Verbindung die IO-4 Antworten. Da ist also by-Design wenn du so willst.
  14. Wie AuronX sagt, sind die Antworten vom IO-4, die du da sieht, die fürs Response Expected Flag. Unter der Annahme, dass du die Temperaturabfrage und das IO-4 Setzen nicht über die gleiche TCP/IP Verbindung machst solltest du diese IO-4 Antworten da nicht sehen. Spielt dir da vielleicht netcat einen Streich, oder machst du doch beides über eine TCP/IP Verbindung? Hast du mal ins brickd Log geschaut und dort nachverfolgt wann TCP/IP Verbindung auf und abgebaut werden und wo welche Antworten hingesandt werden? Wireshark kann auch sehr hilfreich sein. Dass da einer der IO-4 Nachrichten die letzten 2 Byte fehlen könnte an netcat liegen, dass dann eben nur die ersten n-2 von n Byte empfangen hat.
  15. Zu 1: Das ist dokumentiert im Packet Layout Abschnitt: Zu 2: Es reicht als Antwort ein Header. Schreibst du einen Brick-Emulator auf TCP/IP Protokolllevel? JavaLaurence hat einen Emulator auf dem Java-API-Level (begonnen?).
  16. Brick Daemon 2.0.5 Avoid non-portable usage of bit fields Handle big endian byte order correctly Show UIDs in log messages in Base58 Debian i386 package now really compiled for i386 instead of i686 Downloads: Windows, Linux (amd64, i386, armhf), Mac OS X
  17. Brick Daemon 2.0.5 Nicht-portable Verwendung von Bitfelder korrigiert Big Endian Byte Order wird nun korrekt behandelt UIDs werden im Log in Base58 angezeigt Debian i386 Package wird jetzt wirklich für i386 compiliert, anstatt i686 Downloads: Windows, Linux (amd64, i386, armhf), Mac OS X
  18. Loetkolben, in beiden lsusb ausgaben ist 16d0:063d als VID:PID drin. Das ist der Brick normal gestartet, er ist nicht im Bootloader.
  19. /dev/bus/usb/002/002 ist das USB Device an sich. Das ist hier nicht richtig. Du brauchst da den seriellen Port den der Bootloader des Bricks über USB anbietet. Typischerweise taucht der als /dev/ttyACM0 oder /dev/ttyUSB0 auf.
  20. Richtig, exakt so läuft das. Denn nur so ist das kompatible zu älteren Firmwares. Die beiden genannten Dinge sind jetzt dokumentiert.
  21. Das wurde vergessen zu dokumentieren, sorry. Die TCP/IP Dokumentation ist jetzt wieder aktuell.
  22. In /usr/local/lib/python2.6/dist-packages/easy-install.pth sollte sowas wie import sys; sys.__plen = len(sys.path) ./tinkerforge.egg import sys; new=sys.path[sys.__plen:]; del sys.path[sys.__plen:]; p=getattr(sys,'__egginsert',0); sys.path[p:p]=new; sys.__egginsert = p+len(new) stehen und easy_install -m tinkerforge sollte daraus die ./tinkerforge.egg Zeile entfernen.
  23. Hier ein .deb für i386 das jetzt auch wirklich mit gcc -march=i386 gebaut wurde. Wenn ich das Problem richtig verstehe sollte das jetzt bei dir funktionieren. brickd-2.0.4_really_i386.deb
  24. easy_install hat kein wirkliches Uninstall Kommando. Man kann ein mit easy_install installiertes egg aber wie folgt wieder sauber entfernen: sudo easy_install -m tinkerforge Dies trägt tinkerforge aus der Modulliste wieder aus. Dieser Befehlt gibt die dann auch was wo das entpackte egg liegt: $ sudo easy_install -m tinkerforge Searching for tinkerforge Best match: tinkerforge 2.0.5 Processing tinkerforge.egg Removing tinkerforge 2.0.5 from easy-install.pth file Using /usr/local/lib/python2.7/dist-packages/tinkerforge.egg Dann noch dass entpackte egg manuell entfernen: sudo rm -rf /usr/local/lib/python2.7/dist-packages/tinkerforge.egg
  25. Das erste was mir gerade auffällt ist das brickd-*_i386.deb auf einem i686 Rechner compiliert wird und daher eigentlich i686 ist. Kann es sein, dass du einen CPU < i686 hast? Was gibt "uname -a" aus? Was gibt "gcc -Q -v" aus, falls du gcc installiert hast?
×
×
  • Neu erstellen...