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.
01 $requesttype => 0x21
02 $request => 0x09
03 $value => 0x02
04 $index => 0
05 $bytes => chr(...)
06 $size => 1
07 $timeout => 1000
|
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.
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 }
|
|
Ä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)
|
Dieser Online-Artikel kann Links enthalten, die auf nicht mehr vorhandene Seiten verweisen. Wir ändern solche "broken links"
nur in wenigen Ausnahmefällen. Der Online-Artikel soll möglichst unverändert der gedrucken Fassung entsprechen.
|
Uli Stärk,
18.03.2010 14:04