#!/usr/bin/perl

# ASCII Art BlinkenSim
# version 0.1 date 2004-06-04
# Copyright (C) 2004 1stein <1stein@schuermans.info>
# Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html

use strict;
use Socket;
use Sys::Hostname;

my $HOST = "1stein.no-ip.com";
my $PORT = "23230";

if( @ARGV >= 1 ) { $HOST = $ARGV[0]; }
if( @ARGV >= 2 ) { $PORT = $ARGV[1]; }

my ( $addr, $frame, $read_in, $last_request, $height, $width, $channels, $maxval, $i, $y, $x, $c, $val );

socket( SOCKET, PF_INET, SOCK_DGRAM, getprotobyname( "udp" ) );
$addr = sockaddr_in( $PORT, inet_aton( $HOST ) );

$last_request = 0;
for( ; ; )
{
  if( $last_request + 10 < time )
  {
    send( SOCKET, "\x42\x42\x42\x42\0\0\0\0\0\0\0\0", 0, $addr );
    $last_request = time;
  }

  $read_in = '';
  vec( $read_in, fileno( SOCKET ), 1 ) = 1;
  if( select( $read_in, undef, undef, 1.0 ) )
  {
    recv( SOCKET, $frame, 16384, 0 );
    if( length( $frame ) >= 12 && substr( $frame, 0, 4 ) eq "\x23\x54\x26\x66" )
    {
      $height = ord( substr( $frame, 4, 1 ) ) << 8 |ord( substr( $frame, 5, 1 ) );
      $width = ord( substr( $frame, 6, 1 ) ) << 8 |ord( substr( $frame, 7, 1 ) );
      $channels = ord( substr( $frame, 8, 1 ) ) << 8 |ord( substr( $frame, 9, 1 ) );
      $maxval = ord( substr( $frame, 10, 1 ) ) << 8 |ord( substr( $frame, 11, 1 ) );
      if( length( $frame ) >= 12 + $height * $width * $channels )
      {
        print "\033[2J\033[H";
        print "+";
        for( $x = 0; $x < $width; $x++ ) { print "-"; }
        print "+\n";
        $i = 12;
        for( $y = 0; $y < $height; $y++ )
        {
          print "|";
          for( $x = 0; $x < $width; $x++ )
          {
            $val = 0;
            for( $c = 0; $c < $channels; $c++, $i++ )
              { $val += ord( substr( $frame, $i, 1 ) ); }
            print substr( " +*#", $val * 3 / ($maxval * $c), 1 );
          }
          print "|\n";
        }
        print "+";
        for( $x = 0; $x < $width; $x++ ) { print "-"; }
        print "+\n";
      }
    } # if( length( $frame ) >= 12 && ...
  } # if( select ...
} # for( ; ; )
