#!/usr/bin/perl
#
### this module
package GPS::NMEAserial;
use strict;
use warnings;
# serial port communication
use Device::SerialPort qw( :PARAM :STAT 0.07 );
# flush output of filehandle
use IO::Handle;
# create filehandles
use Symbol qw( gensym );
sub new_nmea_port {
my $class = shift;
# open the serial port attached to control unit
# $quiet parameter just for compatability
my ( $port, $config_file, $quiet ) = @_;
# this tests for an existing config file,
# and creates one if necessary...
if ( !-e $config_file ) {
my $PortObj = new Device::SerialPort( $port, $quiet )
or die("Can't open $port: $!");
$PortObj->baudrate(4800);
$PortObj->parity('none');
$PortObj->databits(8);
$PortObj->handshake('none');
# when nmea data is available every second
$PortObj->read_const_time(1100);
$PortObj->read_char_time(700);
$PortObj->stopbits(1);
$PortObj->write_settings or undef $PortObj;
$PortObj->save($config_file)
or die("Can't save $config_file: $!");
# close serial port
$PortObj->close
or warn("Close $PortObj at $port failed: $!");
# destroy serial object
# frees memory back to perl
undef $PortObj;
} else {
print("$config_file already exists!");
}
# tie filehandle to read/write from serial port (nmea device)
my $fh = gensym();
tie( *$fh, 'Device::SerialPort', $config_file )
or die("Can't tie $port: $!");
my $self = bless {
PortName => $port,
FileHandle => $fh,
ConfigurationFileName => $config_file
}, $class;
$self->{'FileHandle'}->autoflush(1);
return $self;
}
# this shouldn't be necessary
sub destroy_create_fh {
my $self = shift;
my $fh_self = $self->{'FileHandle'};
tie( *$fh_self, 'Device::SerialPort',
$self->{'ConfigurationFileName'} )
or die("Can't tie $self->{'PortName'}: $!");
$self->{'FileHandle'} = $fh_self;
}
sub get_heading {
my $self = shift;
if ( !-e $self->{'PortName'} ) {
warn("Device $self->{'PortName'} doesn't exist");
}
$self->destroy_create_fh();
while ( my $line = readline( $self->{'FileHandle'} ) ) {
print "Do something with $line";
return $line;
}
}
1;
####
use strict;
use warnings;
use lib '/usr/local/lib';
use GPS::NMEAserial;
my $nmea_unit =
GPS::NMEAserial->new_nmea_port( '/dev/nmea',
"/var/run/.nmea_unit.conf" );
my $heading_string = $nmea_unit->get_heading();
print "$heading_string\n";
sleep(10);
my $heading_string2 = $nmea_unit->get_heading();
print "$heading_string2 is not most recent value\n";
####
# tie filehandle to read/write from serial port (nmea device)
my $fh = gensym();
tie( *$fh, 'Device::SerialPort', $config_file )
or die("Can't tie $port: $!");
my $self = bless {
PortName => $port,
FileHandle => $fh,
ConfigurationFileName => $config_file
}, $class;
$self->{'FileHandle'}->autoflush(1);
return $self;