package GPS; use strict; use warnings; use POSIX (); use Coro::Socket; our $VERSION = 0.01; sub new { my ($class, %arg) = @_; $arg{port} ||= 2947; $arg{host} ||= 'localhost'; my $sock = new Coro::Socket PeerHost => $arg{host}, PeerPort => $arg{port} or die 'GPSD ($arg{host}:$arg{port}): $!'; print $sock "HELO\n"; <$sock> =~ /GPSD/ or die 'no GPSD'; bless { fh => $sock, minpoll => $arg{minpoll} || 1, last => 0, data => {} }, $class; } sub poll { my $self = shift; print {$self->{fh}} "dpva\n"; if ($self->{fh}->readline =~ m%GPSD,D=(\d\d)/(\d\d)/(\d\d\d\d) (\d\d):(\d\d):(\d\d),P=([\-0-9.]+) ([\-0-9.]+),V=([0-9.]+),A=([\-0-9.]+)%) { local $ENV{TZ} = "+0000"; warn "$6,$5,$4,$1,$2,$3,0,0\n"; $self->{data} = { time => (POSIX::mktime $6,$5,$4,$2,$1-1,$3-1900,0,0), lat => $7, long => $8, v => $9, alt => $10, }; $self->{last} = time; } } sub data { $_[0]->poll if time - $_[0]{last} >= $_[0]{minpoll}; $_[0]{data}; } 1;