rs92,rs41,imet1ab,dfm,m10: output -> nmea

dump
Zilog80 2016-11-02 16:07:30 +01:00
rodzic 510ff20d20
commit 8fe395642b
1 zmienionych plików z 78 dodań i 0 usunięć

78
rs92/pos2nmea.pl 100755
Wyświetl plik

@ -0,0 +1,78 @@
#!/usr/bin/env perl
use strict;
use warnings;
my $filename = $ARGV[0];
my $fpi;
if (defined $filename) {
open($fpi, "<", $filename) or die "Could not open $filename: $!";
}
else {
$fpi = *STDIN;
}
my $fplog;
my $nmeafile = "nmea.log";
my $fpo = *STDOUT;
my $line;
my $hms;
my $lat; my $lon; my $alt;
my $NS; my $EW;
my $cs;
my $str;
my $date = 11116; # (d)dmmyy ohne fuehrende 0 (wenn log kein Datum enthaelt)
my $speed = 0.00;
my $course = 0.00;
while ($line = <$fpi>) {
if ($line =~ /(\d\d):(\d\d):(\d\d\.?\d?\d?\d?).*\ +lat:\ *(-?\d*)(\.\d*)\ +lon:\ *(-?\d*)(\.\d*)\ +alt:\ *(-?\d*\.\d*).*/) {
## einzelne RMC/GGA Datensaetze fuer gpsfake
open ($fplog, '>', $nmeafile) or die "Could not open file '$nmeafile' $!";
$hms = $1*10000+$2*100+$3;
$lat = $4*100+$5*60;
if ($4 < 0) { $NS="S"; $lat *= -1; }
else { $NS="N"; }
$lon = $6*100+$7*60;
if ($6 < 0) { $EW="W"; $lon *= -1; }
else { $EW="E"; }
$alt = $8;
if ($line =~ /(\d\d\d\d)-(\d\d)-(\d\d).*/) {
$date = $3*10000+$2*100+($1%100);
}
if ($line =~ /vH:\ *(\d+\.\d+)\ +D:\ *(\d+\.\d+).*/) {
$speed = $1*3.6/1.852; # m/s -> knots
$course = $2;
}
$str = sprintf ("GPRMC,%010.3f,A,%08.3f,$NS,%09.3f,$EW,%.2f,%.2f,%06d,,", $hms, $lat, $lon, $speed, $course, $date);
$cs = 0;
$cs ^= $_ for unpack 'C*', $str;
printf $fpo "\$$str*%02X\n", $cs;
printf $fplog "\$$str*%02X\n", $cs;
## GPS ueber Ellipsoid; Geoid-Hoehe nicht beruecksichtigt
$str = sprintf ("GPGGA,%010.3f,%08.3f,$NS,%09.3f,$EW,1,04,0.0,%.3f,M,0.0,M,,", $hms, $lat, $lon, $alt);
$cs = 0;
$cs ^= $_ for unpack 'C*', $str;
printf $fpo "\$$str*%02X\n", $cs;
printf $fplog "\$$str*%02X\n", $cs;
close $fplog;
}
}
close $fpi;
close $fpo;