Last active
September 4, 2015 15:35
-
-
Save pklaus/345083 to your computer and use it in GitHub Desktop.
plot run data of Garmin Forerunner using gnuplot
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/usr/bin/perl | |
| # untouched version originally found on <http://ww.telent.net/tmp/extract.pl> and <http://ww.telent.net/tmp/png.gp> | |
| # <https://web.archive.org/web/20100928045039/http://www.coruskate.net/Garmin%20and%20Linux> | |
| use strict; | |
| use warnings; | |
| use Getopt::Long; | |
| use Math::Trig; | |
| my $pi=2*acos(0); | |
| my $basedir=$ENV{HOME}."/training"; | |
| chdir($basedir); | |
| sub speed { | |
| my($old,$new)=@_; | |
| my ($lon0,$lat0)=(@{$old}[2],@{$old}[1]); | |
| my ($lon1,$lat1)=(@{$new}[2],@{$new}[1]); | |
| my $scale=cos($pi * (($lat0+$lat1) / 360)); | |
| my ($dx,$dy)=(111000*($lat1-$lat0), | |
| $scale*111000*($lat1-$lat0)); | |
| return 3.6 *((sqrt($dx*$dx+$dy*$dy))/(($new->[0]) - ($old->[0]))); | |
| } | |
| my ($start,$end); | |
| GetOptions ("start=i" => \$start, | |
| "end=i" => \$end); | |
| my %segments; | |
| my $gap=$start ? int($start/600) : 0; | |
| @ARGV=glob("linuxDataExport/*"); | |
| while(<>) { | |
| my($time,$lat,$lon,$alt,$hr)=split(/,/); | |
| next if($time =~ /[^\d]/); | |
| my $r=int($time/600); | |
| $segments{$r}++; | |
| } | |
| my ($prev,$len)=(0,0); | |
| $start || print "No --start argument: choose from:\n"; | |
| foreach my $k(sort keys %segments) { | |
| my $s=600*$k; | |
| if($prev==($k-1)) { | |
| ($gap==$prev) && $gap++; | |
| $len+=10; | |
| } else { | |
| unless($start) { | |
| if($len) { print "($len minutes)\n"; } | |
| print " ".(scalar localtime $s)." : $s "; | |
| } | |
| $segments{$k}=$len; | |
| $len=10; | |
| } | |
| $prev=$k; | |
| } | |
| if(!$start) { | |
| $len && print "($len minutes)\n"; | |
| exit 0; | |
| } | |
| unless($end) { | |
| $end=(1+$gap)*600; | |
| } | |
| $ENV{OUTNAME}="$start-$end"; | |
| open(GP,">/tmp/extract.gp") or die "extract.gp: $!"; | |
| open(DAT,">/tmp/f.$$.dat") or die "f.$$.dat: $!"; | |
| my @old; | |
| @ARGV=glob("linuxDataExport/*"); | |
| while(<>) { | |
| chomp; | |
| my @f=split(/,/); | |
| next if($f[0] =~ /[^\d]/); | |
| @old=(1,@f[1..10]) unless(@old) ; | |
| my $speed=speed(\@old,\@f); | |
| if(($f[0]>=$start) && ($f[0]<=$end)) { | |
| print DAT "".($f[0]-$start)." ".$f[4]." $speed\n"; | |
| } | |
| @old=@f; | |
| } | |
| my $title=scalar localtime $start; | |
| print GP <<CONTROL | |
| set yrange [80:180] | |
| set y2range [0:50] | |
| set y2tics 10 | |
| set ylabel "bpm" | |
| set y2label "km/h" | |
| set xlabel "Time (s)" | |
| set title "$title" | |
| plot "/tmp/f.$$.dat" using 1:3 axes x1y2 title "km/h" with lines, "" using 1:2 with lines title "HR" | |
| set term png size 400,200 | |
| set output "/tmp/graph-small.png" | |
| replot | |
| set term png size 1000,400 | |
| set output "/tmp/graph-big.png" | |
| replot | |
| set term x11 | |
| CONTROL | |
| ; | |
| close(GP); | |
| system("gnuplot /tmp/extract.gp -"); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| set term png size 400,200 | |
| set output "|cat >$OUTNAME-small.png" | |
| replot | |
| set term png size 1000,400 | |
| set output "|cat >$OUTNAME-big.png" | |
| replot | |
| set term x11 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment