ブレッドボードの絵の作成、今回で最終回です。
最後はピン配のラベルをつけていきます。あと、コマンドの指定方法が空白区切りは使い勝手が悪いので、改行区切りも対応します。
このような指定方法を、
takk@takk:~/github/bread$ cat sample.sh . bread.sh 21,1,22,20,P e14,f17,I red,j14,3,12,W black,2,15,a17,W d15,d9,300,R red,c9,2,8,L red,21,1,3,3,W black,21,20,2,18,W
このように変えます。やはり改行した方が見やすいです。
takk@takk:~/github/bread$ cat sample.sh . bread.sh ' 21,1,22,20,P e14,f17,I red,j14,3,12,W black,2,15,a17,W d15,d9,300,R red,c9,2,8,L red,21,1,3,3,W black,21,20,2,18,W ' takk@takk:~/github/bread$
引数の処理も、改行も許容するように改造します。
takk@takk:~/github/bread$ grep -A16 ARGV bread.sh foreach (@ARGV){ s/a(\d+)/5,$1/g; s/b(\d+)/6,$1/g; s/c(\d+)/7,$1/g; s/d(\d+)/8,$1/g; s/e(\d+)/9,$1/g; s/f(\d+)/10,$1/g; s/g(\d+)/11,$1/g; s/h(\d+)/12,$1/g; s/i(\d+)/13,$1/g; s/j(\d+)/14,$1/g; put_resistor(split /,/,$_) if(/R$/); put_wire(split /,/,$_) if(/W$/); put_led(split /,/,$_) if(/L$/); put_ic(split /,/,$_) if(/I$/); put_pinheader(split /,/,$_) if(/P$/); } takk@takk:~/github/bread$
各引数中の改行を処理することにより、改行で読み取れるように修正しました。
foreach $arg (@ARGV){ foreach (split /\n/,$arg){ s/a(\d+)/5,$1/g; s/b(\d+)/6,$1/g; s/c(\d+)/7,$1/g; s/d(\d+)/8,$1/g; s/e(\d+)/9,$1/g; s/f(\d+)/10,$1/g; s/g(\d+)/11,$1/g; s/h(\d+)/12,$1/g; s/i(\d+)/13,$1/g; s/j(\d+)/14,$1/g; put_resistor(split /,/,$_) if(/R$/); put_wire(split /,/,$_) if(/W$/); put_led(split /,/,$_) if(/L$/); put_ic(split /,/,$_) if(/I$/); put_pinheader(split /,/,$_) if(/P$/); } }
コマンドが改行された引数を受け付けるようになったので、もう少し見やすくしたいと思います。末尾にあったLやR等の部品の種別を先頭に持ってきて、かつ意味がわかる英単語に修正します。
takk@takk:~/github/bread$ cat sample.sh . bread.sh ' PIN,21,1,22,20 IC,e14,f17 WIRE,red,j14,3,12 WIRE,black,2,15,a17 RESISTOR,d15,d9,300 LED,red,c9,2,8 WIRE,red,21,1,3,3 WIRE,black,21,20,2,18 '
行末チェックから、
put_resistor(split /,/,$_) if(/R$/);
このように行頭チェックに変更して、単語でチェックするようにします。
put_resistor(split /,/,$_) if(/^RESISTOR\b/);
これに付随して、各サブルーチンの先頭で、第一引数を捨てる処理(shift)を入れました。
sub put_resistor{ shift; my $ohm = @_[4];
今回のメインであるラベル処理を追加します。
ピンヘッダーの左側は、右寄せテキストにしたいので、text-anchorにend指定します。右側は、左寄せにしたいので、start指定です。
sub put_pinlabel{ shift; my($color,$x,$y,$text) = @_; my($xx,$yy) = get_xxyy($x,$y); my $l_xx; my $l_yy = $yy + 5; if($x == 21){ $l_xx = $xx - 20; print qq#<text x="$l_xx" y="$l_yy" font-size="15" text-anchor="end" stroke="$color" fill="none" >$text</text>#; }else{ $l_xx = $xx + 20; print qq#<text x="$l_xx" y="$l_yy" font-size="15" text-anchor="start" stroke="$color" fill="none" >$text</text>#; } }
追加するラベルは、コマンドで指定できるようにsample.shに追加しました。
takk@takk:~/github/bread$ cat sample.sh (省略) LABEL,orange,21,1,3.3V LABEL,blue,21,2,GPIO2/SDA1 LABEL,blue,21,3,GPIO3/SCL1 LABEL,green,21,4,GPIO4/CLK0 LABEL,black,21,5,0V LABEL,green,21,6,GPI17 LABEL,green,21,7,GPI27 LABEL,green,21,8,GPI22 LABEL,orange,21,9,3.3V LABEL,purple,21,10,GPI10/MOSI LABEL,purple,21,11,GPI9/MISO (省略)
ワイヤーでラベルのテキストが見えなくなってしまうので、ラズパイからブレッドボードへ飛ばすワイヤーは、透かせます。stroke-opacityで0〜1の間で透明度を指定します。
sub put_pinwire{ shift; my($color,$x1,$y1, $x2,$y2) = @_; my($xx1,$yy1) = get_xxyy($x1,$y1); my($xx2,$yy2) = get_xxyy($x2,$y2); print qq#<circle cx="$xx1" cy="$yy1" r="4" fill="white" />#; print qq#<circle cx="$xx2" cy="$yy2" r="4" fill="white" />#; print qq#<line x1="$xx1" y1="$yy1" x2="$xx2" y2="$yy2" stroke="$color" stroke-width="12" stroke-opacity="0.5" />#; }
これでブレッドボードの絵を描くコマンドが完成しましたので、少しだけブログの絵を書くのが楽になりました。
コメント