#!/usr/bin/microperl $| = 1; sub latitude { my ($deg, $min) = unpack "a2a*", $_[0]; my $lat = $deg + $min / 60; $lat = - $lat if $_[1] =~ /[Ss]/; return $lat; } sub longitude { my ($deg, $min) = unpack "a3a*", $_[0]; my $long = $deg + $min / 60; $long = - $long if $_[1] =~ /[Ww]/; return $long; } my ($lat, $long, $alt, $altunits); my ($speed, $speedunits, $heading); my $settime = 0; open(GPS, "/dev/ttyS2"); while(<GPS>) { my $time = time(); if ($time < 1000000000 && $settime == 0) { print "Time not set, setting from gps\n"; $settime = 1; } chomp($_); my @split = split(/\,/, $_); #$GPZDA,050841.00,12,06,2006,00,00*6F #[MMDDhhmm[[CC]YY][.ss]] if ($split[0] =~ /GPZDA/ && $settime == 1) { my ($gpstime, $null) = split(/\./, $split[1]); my @s = split(//, $gpstime); $gpstime = $s[0] . $s[1] . $s[2] . $s[3]; my $gpsday = $split[2]; my $gpsmonth = $split[3]; my $gpsyear = $split[4]; `date -s $gpsmonth$gpsday$gpstime$gpsyear`; } elsif ($split[0] =~ /GPRMC/) { $speed = $split[7]; $speedunits = "K"; $heading = $split[8]; } elsif ($split[0] =~ /GPGGA/) { $lat = $split[2]; $lat = &latitude($lat, $split[3]); $lat = sprintf("%0.6f", $lat); $long = $split[4]; $long = &longitude($long, $split[5]); $long = sprintf("%0.6f", $long); $alt = $split[9]; $altunits = $split[10]; my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); my @month_array = qw( Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec ); my @day_array = qw( Mon Tue Wed Thur Fri Sat Sun ); $year += 1900; open(FILE, ">>/gps.log"); print FILE "$mday,$hour:$min:$sec,$lat,$long,$alt$altunits,$speed,$heading\n"; close (FILE); } } close(GPS);