#!/usr/bin/perl

#
#  Draw NIMBI board
#
#  The image will be 1600x1600, rescale it to 400x400
#  to get antialiasing
#

use GD::Simple;
use GD::Image;

open IN,"/home/mk/rpi/pins.txt";
$l = <IN>;
for($i=0; $i<28; $i++)
{
  $l = <IN>;
  chomp($l);
  @f = split /\t/,$l;
  $pin = $f[0];
  $GPIO = $f[1];
  $WPi = $f[2];
  $WPi2pin[$WPi] = $pin;
  print STDERR "$pin $GPIO $WPi\n";
}

#  Nyt spil: IN0		IN1 Svar
#
#  M28   M29
#
#  M39   M30   M35
#
#  M33   M34   M38   M36
#
#  M32   M31   M37

# c type mask40 mask10 lamppin buttonpin serial

%buttons = (0 => {'mask' => 32, 'lamppin' => 30, 'buttonpin' => 26},
            1 => {'mask' => 31, 'lamppin' => 21, 'buttonpin' => 16},
            2 => {'mask' => 37, 'lamppin' => 22, 'buttonpin' => 28},
            3 => {'mask' => 33, 'lamppin' =>  3, 'buttonpin' => 25},
            4 => {'mask' => 34, 'lamppin' => 12, 'buttonpin' => 11},
            5 => {'mask' => 38, 'lamppin' => 13, 'buttonpin' =>  4},
            6 => {'mask' => 36, 'lamppin' => 14, 'buttonpin' => 31},
            7 => {'mask' => 39, 'lamppin' =>  7, 'buttonpin' => 15},
            8 => {'mask' => 30, 'lamppin' =>  0, 'buttonpin' =>  1},
            9 => {'mask' => 35, 'lamppin' =>  2, 'buttonpin' =>  5},
           10 => {'mask' =>  0, 'lamppin' =>  6, 'buttonpin' => 10},
           11 => {'mask' => 28, 'lamppin' =>  8, 'buttonpin' => 24},
           12 => {'mask' => 29, 'lamppin' =>  9, 'buttonpin' => 27},
           13 => {'mask' =>  1, 'lamppin' => 29, 'buttonpin' => 23});

$width = 1600;
$height = 1600;
$radius = $width/2 - 200;
$lradius = 24;
$side = 300;

$img = GD::Simple->new($width+662, $height);

#  black background

$img->bgcolor('white');
$img->fgcolor('white');
$img->rectangle(0,0,$width-1,$height-1);

#  white circle in center

$img->moveTo($width/2,$height/2);
$img->bgcolor('white');
$img->fgcolor('white');
$img->ellipse($radius*2,$radius*2);

#  Turtle stuff

$img->fgcolor('black');

$img->moveTo($width/2, $height/2);
$img->penSize(8,8);
$img->fgcolor('black');
$img->angle(-90);
#$img->turn($i*120);
$img->turn(0);
$img->move($side/2);
$img->fgcolor('black');
$img->turn(-30);
$img->move($side);
$img->turn(120);
# We are now at upper left corner
for($i=0;$i<3;$i++)
{
  if($i==0)
  {
    ($x[28],$y[28]) = $img->curPos;
  }
  $img->move($side); # line
  if($i==0)
  {
    ($x[29],$y[29]) = $img->curPos;
  }
  $img->turn(60);
  $img->move($side);
  $img->turn(120);
  if($i==0)
  {
    ($x[35],$y[35]) = $img->curPos;
  }
  $img->move($side); #line
  $img->turn(0);
  if($i==0)
  {
    ($x[30],$y[30]) = $img->curPos;
  }
  $img->move($side); #line
  if($i==0)
  {
    ($x[39],$y[39]) = $img->curPos;
  }
  $img->turn(-60);
  $img->move($side);
  $img->turn(-120);
  if($i==0)
  {
    ($x[33],$y[33]) = $img->curPos;
  }
  $img->move($side); #line
  $img->turn(0);
  if($i==0)
  {
    ($x[34],$y[34]) = $img->curPos;
  }
  $img->move($side); #line
  if($i==0)
  {
    ($x[38],$y[38]) = $img->curPos;
  }
  $img->move($side); #line
  if($i==0)
  {
    ($x[36],$y[36]) = $img->curPos;
  }
  $img->turn(120);
  $img->move($side);
  $img->turn(60);
  if($i==0)
  {
    ($x[37],$y[37]) = $img->curPos;
  }
  $img->move($side); #line
  $img->turn(0);
  if($i==0)
  {
    ($x[31],$y[31]) = $img->curPos;
  }
  $img->move($side); #line
  if($i==0)
  {
    ($x[32],$y[32]) = $img->curPos;
  }
  $img->turn(60);
}


$img->angle(0);
$img->turn(0);
$img->fgcolor('black');
$img->bgcolor('black');
# $font = $img->font("Courier-Bold", 40);
$img->font("Courier:bold");
$img->fontsize(40);
$img->moveTo(60,150);
$img->string("Nyt spil");
$img->moveTo(364,130);
($x[0],$y[0]) = $img->curPos;
$img->ellipse($lradius*2,$lradius*2);
$x1 = int($x[0]*0.25+0.5);
$y1 = int($y[0]*0.25+0.5);

$img->moveTo(1300,150);
$img->string("Svar");
$img->moveTo(1236,130);
($x[1],$y[1]) = $img->curPos;
$img->ellipse($lradius*2,$lradius*2);
$x1 = int($x[1]*0.25+0.5);
$y1 = int($y[1]*0.25+0.5);

$img->angle(0);
$img->turn(0);
$img->font("Courier:regular");
$img->fontsize(30);
$img->fgcolor('black');
$img->bgcolor('black');
for($j=26;$j<=39;$j++)
{
  $i = $j;
  $i = $j-26 if($j<28);
  $lamppin='?';
  $buttonpin='?';
  while(($key, $value) = each(%buttons))
  {
    if($value->{'mask'}==$i)
    {
      $lamppin=$WPi2pin[$value->{'lamppin'}];
      $buttonpin=$WPi2pin[$value->{'buttonpin'}];
    }
  }
  print "$i\t".$x[$i]."\t".$y[$i]."\n";
  $img->moveTo($x[$i],$y[$i]);
  if($i==28)
  {
  $img->bgcolor('black');
  $img->fgcolor('black');
  }
  else
  {
  $img->bgcolor('black');
  $img->fgcolor('black');
  }
  $img->ellipse($lradius,$lradius);
  $x1 = $x[$i];
  $y1 = $y[$i];
  $str = "$lamppin/$buttonpin";
  $w1 = $img->stringWidth($str);
  $img->moveTo($x1-0.5*$w1,$y1-50);
  $img->string($str);
}
$img->font("Courier:bold");
$img->fontsize(40);
$x1 = 800;
$y1 = 1350;
$str = "LED/trykknap";
$w1 = $img->stringWidth($str);
$img->moveTo($x1-$w1/2,$y1);
$img->string($str);

$img->font("Courier:regular");
$img->fontsize(40);
$y1 = 1450;
$str = "0V: 9,25,39,6,14,20,30,34";
$w1 = $img->stringWidth($str);
$img->moveTo($x1-$w1/2,$y1);
$img->string($str);

$y1 = 1550;
$str = "3.3V: 1,17";
$w1 = $img->stringWidth($str);
$img->moveTo($x1-$w1/2,$y1);
$img->string($str);

# 1600+662 = 2262
# 508x502
# 662x654
$pimg = GD::Image->new("rpi_pins.png");

$pw = 508;
$ph = 502;
$ps = 662/508*1.4;
$pw2 = int($pw*$ps);
$ph2 = int($ph*$ps);

$img->copyResized($pimg,2262-$pw2,1600/2-$ph2/2,0,0,$pw2,$ph2,$pw,$ph);

open OUT,">nimbitavle.png";
print OUT $img->png;
close OUT;

