Open Source im professionellen Einsatz

Newsletter abonnieren
Seite durchsuchen

HEFTARCHIV | NEWS | E-BIBLIOTHEK | VIDEO | BLOGS | WHITEPAPER | EVENTS | ACADEMY | ABO | SHOP

user friendly

  Home  »  Heft & Abo  »  Heftarchiv  »  2009  »  05  »  Statt mit Zinnsoldaten  

RSS-Feed der aktuellen News von Linux-Magazin Online Folgen Sie Linux-Magazin Online auf Twitter
Diesen Artikel druckenDiesen Artikel weiterempfehlen Diesen Artikel kommentieren Newsletter abonnieren
Share/Bookmark

Am Anschlag

Dieser meldet, welche Aktionen gerade verfügbar sind und welche nicht. Ist der Geschützturm zum Beispiel am rechten Anschlag, liefert er einen Status-String mit dem Wert »0x08« (binär »0000_1000«) zurück, um anzuzeigen, dass alle Aktionen außer »0x08« nun verfügbar sind (»0x08« symbolisiert die Richtung »right«). Steht der Geschützturm hingegen am linken unteren Anschlag, liefert die Statusmeldung »0x05« (binär »0000_0101«) zurück, denn sowohl »0x01« (»down«) als auch »0x04« (»left«) sind jetzt blockiert.

Analog setzt das USB-Device kurz nach dem Abfeuern einer Rakete das Flag »0x10« (binär »0001_0000«), dann weiß die Steuerung, dass sie jetzt den Motor mit »0x20« abstellen kann.

Listing 1: Parameter für
»control_msg()«

01 $requesttype => 0x21
02 $request  => 0x09
03 $value  => 0x02
04 $index  => 0
05 $bytes  => chr(...)
06 $size  => 1
07 $timeout  => 1000

Listing 2:
»rocket-test«

01 #!/usr/local/bin/perl -w
02 use strict;
03
04 use Time::HiRes qw(usleep);
05 use Device::USB;
06 my $usb = Device::USB->new;
07 my $dev = $usb->find_device(0xA81, 0x701);
08 $dev->open;
09
10   # Move Up
11 my $val = 0x02;
12 $dev->control_msg(0x21, 0x09, 0x02, 0,
13                       chr($val), 1, 1000);
14
15 usleep(150_000);
16
17   # Stop
18 $val = 0x20;
19 $dev->control_msg(0x21, 0x09, 0x02, 0,
20                       chr($val), 1, 1000);
21
22   # Read status
23 $val = 0x40;
24 my $buf;
25 $dev->control_msg(0x21, 0x09, 0x02, 0,
26                       chr($val), 1, 1000);
27 $dev->bulk_read(1, $buf = "", 1, 1000);
28 printf "Status %08bn", ord($buf);

Schütze A meldet

Um den Status des Geschützes abzufragen, schickt die Steuerung zunächst den Controlcode »0x40« mit »control_msg()« an das USB-Device, um gleich hinterher per Bulk-Transfer mit der Methode »bulk_read()« den bereitgestellten Datenstring abzuholen. Zeile 28 in Listing 2 schreibt als Ergebnis in den meisten Fällen »00000000« aus, es sei denn, der Turm steht am Anschlag oder eine Rakete wurde gerade abgefeuert.

Das Modul Device::USB::MissileLaun-cher::RocketBaby vom CPAN bietet eine schöne Abstraktion der Schnittstelle, ein neu konstruiertes Objekt verfügt über die Methoden »do()« und »cando()«, die Aktionen als Strings wie »left«, »up«, »fire« oder »stop« entgegennehmen. Die Methode »do()« führt die entsprechende Aktion aus, »cando()« hingegen prüft, ob die Aktion durchführbar ist.

Listing 3 illustriert den Gebrauch. Der Code dreht den Geschützturm zunächst bis ganz nach links unten, damit er dessen genaue Position kennt. Anschließend misst er die Zeit, die er benötigt, um den Turm sowohl nach ganz oben als auch bis zum rechten Anschlag zu drehen. Das Skript halbiert dann beide Zeiten, fährt den Turm mit den gewonnenen Werten zurück in die Mitte und feuert eine Rakete nach der anderen ab.

Listing 3:
»center-fire«

01 #!/usr/local/bin/perl -w
02 use strict;
03
04 use
05   Device::USB::MissileLauncher::RocketBaby;
06 use Time::HiRes qw(usleep gettimeofday
07                    tv_interval);
08
09 my $rb =
10   Device::USB::MissileLauncher::RocketBaby
11   ->new();
12
13 do_until("left");
14 do_until("down");
15
16 my $right_start = [gettimeofday];
17 do_until("right");
18 my $right_elapsed = tv_interval(
19             $right_start, [gettimeofday] );
20
21 my $up_start = [gettimeofday];
22 do_until("up");
23 my $up_elapsed = tv_interval(
24             $up_start, [gettimeofday] );
25
26 do_until("left", $right_elapsed/2);
27 do_until("down", $up_elapsed/2);
28
29 for(1..3) {
30     do_until("fire");
31     usleep(100_000);
32 }
33
34 ###########################################
35 sub do_until {
36 ###########################################
37     my($what, $max_time) = @_;
38
39     my $start = [gettimeofday];
40
41     while($rb->cando( $what )) {
42         $rb->do( $what );
43         usleep(100_000);
44         last if defined $max_time and
45            tv_interval($start,
46                [gettimeofday]) > $max_time;
47     }
48     $rb->do("stop");
49 }
Diesen Artikel druckenDiesen Artikel weiterempfehlen Diesen Artikel kommentieren Newsletter abonnieren
Share/Bookmark
Ähnliche Artikel
Asyl für Django Webprogrammierung in Python/Django und PHP
Knoppix 6.5 Klaus Knopper über sein neues Linux
Klimaforschung Perl-Skript misst und bewertet Temperaturen
Kern-Technik Kernel- und Treiberprogrammierung mit dem Kernel 2.6 – Folge 42 Folge 42
Einbruch? Spuren und Daten nach Crackversuchen oder Beschlagnahme richtig sichern
Starthilfe Vier Notebooks der Mittel- und Oberklasse im Test
Whitepaper
Open Source Datenintegration in der Praxis: Fallstudien und Anwendungsbeispiele

Über die letzten Jahre hinweg haben sich Open Source Lösungen als fester Bestandteil des gesamten Datenintegrationsmarktes etabliert. Viele Unternehmen haben bereits das Open Source Modell für Ihre Datenintegrationsprojekte aufgegriffen. Das vorliegende White Paper illustriert anhand ausgewählter Fallstudien und Anwendungsbeispiele die Implementierung von Open Source Datenintegration in der Praxis und benennt die daraus resultierenden Vorteile.

Download PDF (Registrierung erforderlich)
The Role of Open Source in Data Integration

Obwohl in den letzten Jahren viele technische Fortschritte erzielt werden konnten, verfügen die meisten Datenintegrationsprozesse nach wie vor nur über eine sehr begrenzte Automatisierung. Das vorliegende White Paper von dem Industry Analyst Mark Madson wird zunächst ein grundlegendes Verständnis von Daten Integration vermitteln, die Vorzüge von Open Source Lösungen für Daten Integration erläutern und Ihnen professionelle Empfehlungen geben, damit Sie Ihre Integrationsjobs noch einfacher und produktiver gestalten können.

Download PDF (Registrierung erforderlich)
Kommentare (1)
von
Uli Stärk,
18.03.2010 14:04
Kernel Driver