でこーど
>|
$bitassign{'02'} = [
{start => 2.1, len => 5, name => 'dat1', printfunc => \&printBit_ox_5},
{start => 3.3, len => 5, name => 'dat2', printfunc => \&printBit_ox_5},
{start => 3.2, len => 1, name => 'Test', printfunc => \&printTest},
{start => 3.0, len => 2, name => 'Dumy', printfunc => \&printDumy}
];
sub printBit_ox_5 {
my $binstr = sprintf("%05b", $_[0]);
$binstr =~ s/0/-/g;
$binstr =~ s/1/o/g;
print $binstr;
}
sub printTest {
print $_[0];
}
sub printDumy {
printf("%X",$_[0]);
}
sub decode {
my $hexstr = $_[0];
my $msgid = substr($hexstr, 0, 2);
print "$hexstr" . "[$msgid] ";
foreach my $item (@{$bitassign{$msgid}}){
my $startbyte = int($item->{start});
my $startbit = ($item->{start} * 10) % 10;
my $bitlen = $item->{len};
my $decval = ( hex(substr($hexstr, ($startbyte-1) * 2, 2)) >> $startbit )
& ( 2**$bitlen - 1 );
print ", " . $item->{name} . ":[$startbyte.$startbit,$bitlen=>$decval]";
$item->{printfunc}->($decval);
}
print "\n";
}
&decode("01FFFF");
&decode("010000");
&decode("01AAAA");
&decode("015555");
&decode("013E00");
&decode("013EF8");
&decode("013EF9");
&decode("013EFA");
&decode("013EFB");
&decode("023EFC");
|<
しんごうそうしんとすれっどのれんしゅう
#!/usr/bin/perl use strict; use Time::HiRes qw/usleep/; use threads; use Thread::Queue; use IO::Socket; use IO::Select; # コマンドパラメータにしようと思ってまだ出来てないとこ my $threadnum=10; my $cps=50; my $scenario="hoge"; # 変数とか定義 my $sndcnt=0; # 起動時から送ったシナリオの数 my $endflg; # 終了フラグ(値を定義すると終了する。現状SIGINTを受けたときに定義される) my $starttime=time(); # 起動時刻 my $freeQ = new Thread::Queue; # 空いてるシナリオ my $workQ = new Thread::Queue; # 送信中シナリオ # 標準出力をバッファしない(autoflush) $| = 1; # SIGINT(Ctrl+C)を受けたときに終了する。(一応、通信の完了 or T.O.を待つ) $SIG{INT}=sub { print "Ctrl + C ====> EndFlag ON!!!!\n"; $endflg=1; }; # 送信データ読み込み($scenarioで指定したフォルダ配下のファイルすべてをハッシュに突っ込む) $scenario=$scenario . "/*"; my @files = grep -f, glob "$scenario"; # $scenario/*に一致するファイルを探す。 my %senddatas; foreach ( sort @files ){ # ファイルをバイナリモードで開いて open( FH , "< $_" ); binmode( FH ); # ハッシュに突っ込む $senddatas{$_}=; # 空きシナリオキューに登録(メモリ削減のため名前だけ) $freeQ->enqueue($_); } # (送信用)スレッド作成&起動 my @threads; print "Create threads : "; foreach (1 .. $threadnum){ my $thread = threads->new(\&my_thread, $_); push(@threads, $thread); } while( ! defined $endflg ){ usleep(10000); my $nowtime=time(); my $difftime=$nowtime - $starttime; my $addquenum=$cps * $difftime - $sndcnt; foreach( 1 .. $addquenum ){ my $q = $freeQ->dequeue_nb; if( defined $q ){ $workQ->enqueue( $q ); $sndcnt++; if( $sndcnt % 1000 == 0 ){ printf "%d信号送信 => %d秒(%0.1f)cps\n", $sndcnt, $difftime, $sndcnt/$difftime; } }else{ print "000 : 空きシナリオなし(シナリオ足りてない?)\n"; print "ちょっと待ってから再開。\n"; sleep(1); } } } $workQ->enqueue( undef ); print "Join threads \n"; foreach(@threads){ my ($return) = $_->join; } print "finish\n"; # スレッドの処理 # 各スレッドはよきタイミングでデータをqueueから抜き出します sub my_thread { my $i=shift; while (my $q = $workQ->dequeue){ #printf( "%03d : sendfile(%s)\n", $i, $q ); my $sock = new IO::Socket::INET(PeerAddr=>'127.0.0.1', PeerPort=>22, TimeOut=>0.1, Blocking=>0, Proto=>'tcp'); die "IO::Socket : $!" unless $sock; print $sock $senddatas{$q}; my $s = IO::Select->new(); $s->add($sock); foreach ( $s->can_read(0.1) ){ my $msg=<$sock>; chomp( $msg ); #printf( "%03d : recv(%s)\n",$i, $msg ); } close($sock); $freeQ->enqueue($q); threads->yield(); } $workQ->enqueue( undef ); return; }
テスト
てすと