Skip to content

Instantly share code, notes, and snippets.

@pklaus
Last active September 4, 2015 15:35
Show Gist options
  • Select an option

  • Save pklaus/345083 to your computer and use it in GitHub Desktop.

Select an option

Save pklaus/345083 to your computer and use it in GitHub Desktop.
plot run data of Garmin Forerunner using gnuplot
#!/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 -");
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