#!/usr/bin/perl
use Data::Dumper;
use MIDI::ALSA(SND_SEQ_EVENT_PORT_UNSUBSCRIBED);
use Getopt::Long ;


GetOptions("help" , \$help , "preset=i", \$preset , "file=s", \$file ) ; 
die "Use -p preset_number" if( ! defined( $preset) ) ; 
if( defined( $help )){
    print "Usage:
ShowBCF.pl -p preset# -f file.html
"
}

InitBCF() ; 
$reply = RequestPreset($preset) ;

open(HTML,">$file");
print HTML MessageToHtml($reply) ; 
close(HTML);
`xdg-open $file` ;

sub InitBCF{
    $res = `aplaymidi -l | grep BCF2000` ;
    ($port , $type ) = split(" ", $res) ;
    if( $type !~ /BCF2000/){
	die "BCF not found\n" ; 
    }
#    print "$port\n" ;
    MIDI::ALSA::client( 'Perl MIDI::ALSA client', 1, 1, 0 );
    MIDI::ALSA::connectfrom( 0, $port , 0 );  # input port is lower (0)
    MIDI::ALSA::connectto( 1, $port , 0 );  # input port is lower (0)
    # while (1) {
    #  	 my @alsaevent = MIDI::ALSA::input();
    #  	 print $alsaevent[0],"\n" ;
    #  	 PrintEvent();

    #  	 if ($alsaevent[0] == SND_SEQ_EVENT_PORT_UNSUBSCRIBED()) { last; }
    # 	  }

}


sub SetPreset{
    my( $num) = @_ ; 
    $data = "\x00\x20\x32\x7F\x7F\x22" ;
    $data .= chr($num -1 )  ; 
#    print Data::Dumper->Dump($res)  ;
    MIDI::ALSA::output(MIDI::ALSA::sysex(0,$data,0));
}

sub RequestPreset{
    my( $num) = @_ ; 
    $message = "" ; 
    $data = "\x00\x20\x32\x7F\x7F\x40" ;
    $data .= chr($num -1 )  ; 
#    print Data::Dumper->Dump($res)  ;
    MIDI::ALSA::output(MIDI::ALSA::sysex(0,$data,0));
     while (1) {
  	 @alsaevent = MIDI::ALSA::input();
	 $this = PrintEvent() ; 
  	 $message .= $this ;
	 last if($this =~ /\$end/) ;

    if ($alsaevent[0] == SND_SEQ_EVENT_PORT_UNSUBSCRIBED ) { last; }
     }
    return $message ; 
}

sub SendMessage{
    my( $message ) = @_ ; 

    @mess = split("\n",$message) ;

    $item = 0 ; 
    map {
	$line = $_ ; 
	$line =~ s/\n// ;
	$data = "\x00\x20\x32\x7F\x7F\x20" ;
	$data .= chr(0) . chr($item) ;
	$data .= $line ;
print "Seding: $line \n" ;
	MIDI::ALSA::output(MIDI::ALSA::sysex(0,$data,0));
	$item++ ; 
    } @mess ; 


}

sub PrintEvent{
    if($alsaevent[0] == MIDI::ALSA::SND_SEQ_EVENT_CONTROLLER ){
	print "Controlleur event\n" ;
	map { print $_->[0] , " $_->[1] $_->[2] $_>[3]\n"} @{alsaevent[5]} ;
    }
    if($alsaevent[0] == MIDI::ALSA::SND_SEQ_EVENT_SYSEX ){
	$aref = $alsaevent[7] ;
	$out = $aref->[0] ; 
	$out =~ /\xf0........(.+)\xf7/ ;
	$rep = "$1\n" ;
	
    }
    return $rep ;
}


sub InitTests{
$move_fader_2 = "\$rev F1
\$fader 2
.easypar CC 1 7 0 100 absolute
.showvalue on
.motor on
.default 20
\$end" ;
}


sub MoveSlider{
    my( $fader ) = @_ ;
    if( $fader =~ /(\d+)/ ){
	$message = MoveSliderMessage($1) ;
	SendMessage($message);
    }
}

sub MoveSliderMessage{
    my( $num) = @_ ; 
    my  $move_fader = "\$rev F1
\$fader <NUM>
.easypar CC 1 7 0 100 absolute
.showvalue on
.motor on
.default 20
\$end" ;


    $move_fader =~ s/<NUM>/$num/ ;
return $move_fader ;
}


sub MessageToHtml{


@line = split("\n" , $message ) ;

$in = 0 ; 
map {

    if(/\$(fader|button|encoder)\s+(\d+)/){
	$in = 1 ; 
	$button = $1 ; 
	$number = $2 ; 
    } 
    if( $in == 1){
	$item->{$button}->{$number} .= $_."\n"  ;	    
    }
    
} @line ;

print HTML "<html>
<head>
<style media=\"screen\" type=\"text/css\">
div.group {
border : solid ;
max-width: 900px
}
div.encoder {
vertical-align:text-top;
display: inline-block;
width: 100px;
}

</style>
</head>
<body>
<h1>Preset $preset of BCF2000</h1>
\n" ;

map {
    print HTML "<div class=\"group\" id=$_>\n" ;
    $effector = $item->{$_} ; 
    @num = () ; 
    map {	push( @num , $_ ) ;    } keys( %$effector ) ;
    map  { PrintButton( $effector->{$_}) } sort {$a <=> $b} @num ;

    print HTML "</div>\n" ;
} keys( %$item ) ;

print HTML "</body></html>\n" ;
    

}


sub PrintButton{
    my( $texte ) = @_ ; 
    if($texte =~ /\$(fader|button|encoder)\s+(\d+)/){
	print HTML "<div class=\"encoder\"><p><b>$1 $2</b><\p>\n" ;
    } 
    while( $texte =~ /\.(\S+)\s+(.+)$/mg ){
	pos $text = $' ; #'
	PrintPar($1 , $2) ;
    }
    print HTML "</div>\n"
}

sub PrintPar{
    my( $a , $b) = @_ ;
    if( $a eq "easypar"){
	print HTML "<p>Send $b</p>\n" ; 
    } else {
	print HTML "<p>$a $b</p>\n" ; 
    }
}
