#!/usr/pkg/bin/perl
use strict;
# $Id: tokyo-contest-log,v 1.1 2011/11/24 07:38:08 makoto Exp $
#open(DATA) || die "problem opening: $!\n";
## mon day time callsign sent rcvd multi MHz mode pts 
## 8 16 2133 JA2MYA 599TK 599GF GF 1.9 CW 1 
my ($freq, $mode, $date, $time, $mycall, $hisrst, $nr, $callsign, $rst, $exchange);
my ($yy,$mon, $dd, $time, $multi,$pts);
my $dummy;

my %QSO;	#        $QSO{$callsign}{$freq} databse 
my %MULTI;	#      $MULTI{$exchange}{$freq} database

my %MULTICOUNT; # $MULTICOUNT{$band}
my %POINT;	#      $POINT{$band}
my %QSOCOUNT;	#   $QSOCOUNT{$band}

my $FORMAT = " %02d,%02d,%04d,%-10s,%s,%-9s,%-5s,%4d,%4s,%3d,%s\n"; # debug
   $FORMAT = "%02d,%02d,%04d,%s,%s,%s,%s,%d,%s,%d,%s\n"; # real;
my $FORMATs= "%3s,%3s,%04s,%-10s,%-5s,%-6s,%5s,%3s,%4s,%3s,%s\n";
my $remarks;
my @lines;
# ------------------------------------------
sub get_band($){
    my ($freq) = shift;
    my ($band);
    if    ($freq == 144  )	{ $band = 144;}
    elsif ($freq == 432  )	{ $band = 430;}
    elsif ($freq < 2000 )	{ $band = 1.9;}
    elsif ($freq < 4000 )	{ $band = 3.5;}
    elsif ($freq < 8000 )	{ $band = 7;}
    elsif ($freq < 15000 )	{ $band = 14;}
    elsif ($freq < 22000 )	{ $band = 21;}
    elsif ($freq < 30000 )	{ $band = 28;}
    elsif ($freq < 54000 )	{ $band = 50;}
    elsif ($freq <146000 )	{ $band = 144;}
    elsif ($freq <440000 )	{ $band = 430;}
    else                  	{ $band = 1200;}
    return $band;
}
# 1.8 3.5 7 14 21 28 50 144 430 1200 2400 5600
sub print_score(){
    my ($qso, $pts, $multi);
    foreach my $band ( sort {$a <=> $b} keys %POINT ) {
	printf ("<SCORE BAND=%sMHz> %d,%d,%d</SCORE>\n", 
		$band,
		$QSOCOUNT{$band}, 
		$POINT{$band},
		$MULTICOUNT{$band} );
	$qso +=$QSOCOUNT{$band};
	$pts +=$POINT{$band};
	$multi +=$MULTICOUNT{$band};
    }
    printf ("<SCORE BAND=TOTAL>%d,%d,%d</SCORE>\n", $qso, $pts, $multi);
    printf ("<TOTALSCORE>%d</TOTALSCORE>\n", $pts * $multi);
}

# ------------------------------------------
while (<>) {
    if ( /^QSO: / ) {
	($dummy, $freq, $mode, $date, $time, $mycall, $hisrst, $nr, $callsign, $rst, $exchange)
	    = split;
	($yy,$mon,$dd) = split '-', $date;
	$time += 900;
#	$freq = int($freq/1000);
	$freq = get_band($freq);
	if ($mode eq 'PH') {$mode = 'SSB';};
	$exchange =~ s/[LPMH]$//;	# just for in casen

	if ($QSO{$callsign}{$freq} == 0) {
	    $QSO{$callsign}{$freq}++;
	    if ( $MULTI{$exchange}{$freq} == 0) { 
		$MULTI{$exchange}{$freq}++;	# record for this combination
		$multi = $exchange;
		$MULTICOUNT{$freq}++;
	    }
	    else {$multi = ''};
	    $exchange =~ s/ //g;
# tokyo contest special
	    if (length($exchange) == 2 ) {$pts = 1;}
	    else {$pts = 2;}
# tokyo contest special
	}
	else { $pts = 0;}
	$POINT{$freq} += $pts;
	$QSOCOUNT{$freq} ++;
	$remarks = '';
	if ($pts  ==  0) { $remarks = 'may not be complete QSO'}
	push(@lines, sprintf($FORMAT,
       $mon, $dd, $time, $callsign, $hisrst.$nr, $rst.$exchange, $multi, $freq, $mode, $pts, $remarks));
    }
}

summary_one();
print_score();
summary_two();
printf("$FORMATs",
       'mon', 'day', 'time', 'callsign','sent', 'rcvd', 'multi', 'MHz', 'mode', 'pts', 'remarks');

print @lines;
print "</LOGSHEET>\n";

exit;

sub summary_one(){
    print <<SUMMARY1;
<SUMMARYSHEET VERSION=R1.0>
<CONTESTNAME>コンテストの名称</CONTESTNAME>
<CATEGORYCODE>参加部門種目コードナンバー</CATEGORYCODE>
<CATEGORYNAME>参加部門種目名称</CATEGORYNAME>
<CALLSIGN>コールサイン</CALLSIGN>
<OPCALLSIGN>運用者のコールサイン</OPCALLSIGN>
SUMMARY1
}
sub summary_two(){
#<SCORE BAND=430MHz>    </SCORE>
#<SCORE BAND=TOTAL>    </SCORE>
#<TOTALSCORE>    </TOTALSCORE>
    print <<SUMMARY2;
<FDCOEFF>フィールドデーコンテストの場合の局種係数</FDCOEFF>
<TOTALSCORE>総得点</TOTALSCORE>
<ADDRESS>連絡先住所</ADDRESS>
<TEL>電話番号</TEL>
<NAME>局免許者の氏名(社団の名称)</NAME>
<EMAIL>E-mailアドレス</EMAIL>
<LICENSECLASS>局免許者の無線従事者資格</LICENSECLASS>
<POWER>コンテスト中使用した最大空中線電力(W)</POWER>
<POWERTYPE>定格出力or実測出力</POWERTYPE>
<OPPLACE>運用地</OPPLACE>
<POWERSUPPLY>使用電源</POWERSUPPLY>
<EQUIPMENT>使用した設備</EQUIPMENT>
<COMMENTS>意見</COMMENTS>
<MULTIOPLIST>運用者のコールサイン(氏名)および無線従事者の資格</MULTIOPLIST>
<REGCLUBNUMBER>登録クラブ番号</REGCLUBNUMBER>
<REGCLUBNAME>登録クラブ名称</REGCLUBNAME>
<OATH>私は、JARL制定のコンテスト規約および電波法令に従い運用した結果、
ここに提出するサマリーシートおよびログシートなどが事実と相違ないものであることを、
私の名誉において誓います。</OATH>
<DATE>    </DATE>
<SIGNATURE>署名</SIGNATURE>
</SUMMARYSHEET>
<LOGSHEET TYPE=CSV>
SUMMARY2
}
# 必須：総得点：34241　　　　（各バンドで得た得点の和×各バンドで得たマルチの和）
# 任意：バンドごとの交信局数，得点，およびマルチ数　　　（書いて頂いたほうが、集計作業の参考になります） 
# マルチバンドの例 
# FREQ　 QSO POINT MULTI 
# 1.9MHz　　　　　35 35 25 
# 3.5MHz　　　　　70 78 22 
# 7 MHz　　　　 200 240 50 
# Total 305 353 97 34241 
# シングルバンド(7MHz) の例(CHK-LOGを含む) 
# FREQ QSO POINT MULTI 
# 1.9MHz 35 0 0 
# 3.5MHz 70 0 0 
# 7 MHz 200 240 50 
# Total 305 240 50 12000 

__DATA__
__END__
３)ＫＣＪ標準様式のログシート （ZLOGの使用が一番多いようですのでZLOG様式を標準とします）
mon day time callsign sent rcvd multi MHz mode pts 
8 16 2133 JA2MYA 599TK 599GF GF 1.9 CW 1 

http://www.jarl.or.jp/Japanese/1_Tanoshimo/1-1_Contest/e-log.htm
http://www.jarl-tokyo.com/densishinsei.html
jarltokyo@gmail.com

  月  日  時刻  コールサイン  送信 No.  受信 No.  マルチ  周波数  モード  得点  備考

