#!/usr/bin/perl -w

use Device::USB;
use strict;
use warnings;

my $usb = Device::USB->new();

#  0x0409 / 0x0058 ist mein Hub. muss natürlich für andere Hubs angepasst werden.
my $dev = $usb->find_device( 0x0409 , 0x0058 );

die "HUB not found.\n" unless defined $dev;

$dev->open;

my @anim=(
 [1,0,0,0],
 [1,1,0,0],
 [0,1,1,0],
 [0,0,1,1],
 [0,0,0,1],
 [0,0,1,1],
 [0,1,1,0],
 [1,1,0,0],
);
while (1) {
 # Endlos-Loop über @anim, vorne abziehen, hinten wieder draufpushen.
 my $phase = shift @anim;
 push @anim,$phase;
 
 # Schleife über alle 4 LEDs
 for (my $i=0; $i<4; $i++) {
   $dev->control_msg(0x23,  # 0x23 == PORT-REQUEST
                     3,  # 3 == SET_FEATURE
                     22, # 22 == PORT_INDICATOR
                     (($phase->[$i]?2:3)<<8) | ($i+1), # LOW-Byte: Port-Nr, 
                                                       # HIGH Byte: 0 == Automatic, 1 == Amber, 2 == Green, 3 == Off, 4..FF == Reserved
                     undef,0, # Buffer + Size fuer Antwort, nicht benoetigt
                     1000); # Timeout 1000 ms
 }
 select(undef, undef, undef, 0.25); # 250msec warten bis naechster anim-schritt 
}

