Note: This is a code snippet only (perl). It will not work on its own. It is intended to assist in understanding the interface documentation.
} elsif (/DS(\d\d\d\d):(.{16}) (.{16})/) {# DS0447:2222222422222222 2229722982222222
#Logger->log("bandscope data: $_");
my @block = reverse split(//,$3);
push @block, reverse split(//,$2);
my $base_pos = $1; # where DS line starts
my $center_pos = $self->{config}{race_gui}{bandscope}{center_pos};
my $span = $self->{config}{race_gui}{bandscope}{span};
my $step_size = $self->{config}{race_gui}{bandscope}{step_size};
my $steps = ($span*1000) / $step_size;
my $min_pos = $center_pos - ($steps / 2);
my $center_freq = $self->{scope}{center_freq};
my $min_freq = $center_freq - ($span / 2);
#Logger->log(sprintf('base_pos: %d center_pos: %d steps: %d min_pos: %d min_freq: %d',
# $base_pos, $center_pos, $steps, $min_pos, $min_freq));
for (my $step=0; $step<=31; ++$step) {
# absolute position
my $abs_pos = ($base_pos - 31) + $step;
my $strength = hex($block[$step]);
if ( ($abs_pos < $min_pos) or ($abs_pos > ($min_pos+$steps)) or
($strength <= 2) ) {
#Logger->log("Skipping $abs_pos");
next;
}
$abs_pos = $abs_pos - $min_pos; # make it zero based
# calc frequency
my $freq = $min_freq + $abs_pos * ($step_size/1000);
# send event for ui
#Logger->log(sprintf('abs_pos: %d step: %d freq: %f strength: %s',
# $abs_pos, $step, $freq, $strength));
my %datum_info = (
frequency => $freq,
strength => $strength,
passid => $self->{scope}{current_passid},
radio => $self->{alias},
time => gmtime(time()),
);
$kernel->post( $self->{caller}, 'scope_datum' => \%datum_info );
# send event to write to DB
$kernel->post( 'scope_storage',
insert => {
sql => 'insert into scopelog (frequency, strength, passid) values (?,?,?)',
placeholders => [ sprintf('%.2f',$freq), $strength, $self->{scope}{current_passid} ],
event => 'scope_datum_inserted',
},
);
}
if ($1 eq '0031') { # end of stream
$kernel->yield( 'next_scope_block' );
}
Here is the snippet of config for the above:
<race_gui>
<bandscope>
step_size 10 # kHz
span 10 # MHz
center_pos 512 # location in data stream
height 534 # height of canvas in pixels
spread 200 # freq is multiplied by this to create
# spread between freqs on canvas
</bandscope>
</race_gui>