Spin and KML
I thought I would share some Spin code that I created to make animated timeline KML files out of GPS readings.
An example Google Earth file that I created with it is here:
http://www.ragtopvideo.com/me/banyon.kmz
Still trying to figure out how to move the camera view to keep the track centered.
An example Google Earth file that I created with it is here:
http://www.ragtopvideo.com/me/banyon.kmz
Still trying to figure out how to move the camera view to keep the track centered.
CON
_CLKMODE = XTAL1 + PLL16X
_XINFREQ = 5_000_000
obj
sdcard: "fsrw"
gps : "GPS_Float"
FS : "FloatString"
var
long latold, latnew, longold, longnew, distance
long x, filenum, open, oldelevation, newelevation
long Stack[16], buttonpressed, firstloopcheck
long year, month, day, hour, minute, second, endhour,endminute,endsecond
long count 'for counting every 8th icon to fly map over to new position still working on
long Elcheck,rtcheck 'elevation and rotation changes
pub main '900 coordinate updates an hour / every 4 seconds
sdcard.mount(1) ' 1 cog
gps.init ' 4 cogs
initButton ' 1 cog
dira[7]~~ 'card writing LED indicator
outa[7] := 0
dira[6]~~ 'sat fix LED indicator
outa[6] := 0
filenum := 1
open := 0
firstloopcheck := 0
repeat
repeat while buttonpressed == 0 'just wait until button pressed first time
CheckSatFix
ShortBlink
buttonpressed := 0
if open == 1 'if file open and button pressed, close file.
Endfile
firstloopcheck := 0
else
distance := 0 'start new file using filenum to increment filenames
Openfile
Pub Openfile
case filenum
1: sdcard.popen(string("track1.kml"),"w")
2: sdcard.popen(string("track2.kml"),"w")
3: sdcard.popen(string("track3.kml"),"w")
4: sdcard.popen(string("track4.kml"),"w")
5: sdcard.popen(string("track5.kml"),"w")
6: sdcard.popen(string("track6.kml"),"w")
7: sdcard.popen(string("track7.kml"),"w")
8: sdcard.popen(string("track8.kml"),"w")
9: sdcard.popen(string("track9.kml"),"w")
10: sdcard.popen(string("track10.kml"),"w")
'term1
WriteFileHeader
filenum++
open := 1
count := 1
WriteIcons
Pub EndFile
Shortblink
CheckSatFix
TakeReading
sdcard.SDStr(string("<Placemark>",13,10))
sdcard.SDStr(string("<name>Finished. Distance traveled is "))
sdcard.sddec(distance)
sdcard.SDStr(string(" ft "))
sdcard.sdstr(fs.floattostring(gps.miles))
sdcard.SDStr(string(" miles </name>",13,10))
elcheck := gps.ElevationCheck
rtcheck := gps.rotation
PickIcon
sdcard.SDStr(string("<Point>",13,10))
sdcard.SDStr(string("<coordinates>",13,10))
sdcard.sdstr(fs.floattostring(longnew))
sdcard.sdstr(string(","))
sdcard.sdstr(fs.floattostring(latnew))
sdcard.sdstr(string(","))
sdcard.sddec(0)
sdcard.sdstr(string(13,10))
sdcard.SDStr(string("</coordinates>",13,10))
sdcard.SDStr(string("</Point>",13,10))
TimeStamp
sdcard.SDStr(string("</Placemark>",13,10))
'sdcard.SDStr(string("</gx:Playlist>",13,10))
'sdcard.SDStr(string("</gx:Tour>",13,10))
sdcard.SDStr(string(" </Document>",13,10))
'sdcard.SDStr(string("</Feature>",13,10))
sdcard.SDStr(string("</kml>",13,10))
sdcard.pclose
LongBlink
open := 0
PUB InitButton
cognew(button(@buttonpressed), @stack)
Pub button(bp)
dira[8]~
long[bp] := 0
repeat
if ina[8] == 1 'stores a button press until an action is done in main program to remove timing issues.
long[bp] := 1
Pub CheckSatFix
repeat while gps.Long_Fix_Quality < 1 or gps.Long_Fix_Quality > 8
FixIndicatoroff
FixIndicatorOn
Pub FixIndicatorOn
outa[6] := 1
Pub FixIndicatorOff
outa[6] := 0
Pub WriteFileHeader
sdcard.SDStr(string("<?xml version='1.0' encoding='UTF-8'?>",13,10))
sdcard.SDStr(string("<kml xmlns='http://www.opengis.net/kml/2.2'",13,10))
sdcard.SDStr(string("xmlns:gx='http://www.google.com/kml/ext/2.2'>",13,10))
'sdcard.SDStr(string("<Feature id='Ragtops path'>",13,10))
sdcard.SDStr(string(" <Document>",13,10))
sdcard.SDStr(string("<description>This is track #"))
sdcard.SDDec(filenum)
sdcard.SDStr(string(" that was started on "))
sdcard.sddec(gps.Long_Month)
sdcard.SDStr(string("/"))
sdcard.sddec(gps.Long_Day)
sdcard.SDStr(string("/"))
sdcard.sddec(gps.Long_year)
sdcard.SDStr(string("</description>",13,10))
'sdcard.SDStr(string("<gx:Tour>",13,10))
'sdcard.SDStr(string("<name>Play me!</name>",13,10))
'sdcard.SDStr(string("<gx:Playlist> ",13,10))
Styles
TakeReading
'FlyTo
'sdcard.SDStr(string("<gx:AnimatedUpdate>",13,10))
' sdcard.SDStr(string("<gx:duration>0.0</gx:duration> ",13,10))
'sdcard.SDStr(string(" <Update>",13,10))
'sdcard.SDStr(string(" <targetHref>...</targetHref>",13,10))
'sdcard.SDStr(string("<Create>",13,10))
sdcard.SDStr(string("<Placemark>",13,10))
sdcard.SDStr(string("<name>Start</name>",13,10))
sdcard.SDStr(string("<styleUrl>#levelNIcon</styleUrl>",13,10))
sdcard.SDStr(string("<Point>",13,10))
sdcard.SDStr(string("<coordinates>",13,10))
sdcard.sdstr(fs.floattostring(longnew))
sdcard.sdstr(string(","))
sdcard.sdstr(fs.floattostring(latnew))
sdcard.sdstr(string(","))
sdcard.sddec(0)
sdcard.sdstr(string(13,10))
sdcard.SDStr(string("</coordinates>",13,10))
sdcard.SDStr(string("</Point>",13,10))
TimeStamp
sdcard.SDStr(string("</Placemark>",13,10))
' sdcard.SDStr(string("</Create>",13,10))
'sdcard.SDStr(string(" </Update>",13,10))
'sdcard.SDStr(string("</gx:AnimatedUpdate>",13,10))
firstloopcheck := 1
Pub WriteIcons
repeat while buttonpressed == 0
Shortblink
CheckSatFix
TakeReading
if count == 8 'move view of map to stay with track every 8 times
count := 1
'FlyTo
count++
elcheck := gps.ElevationCheck
rtcheck := gps.rotation
'sdcard.SDStr(string("<gx:AnimatedUpdate>",13,10))
'sdcard.SDStr(string("<gx:duration>0.0</gx:duration> ",13,10))
'sdcard.SDStr(string(" <Update>",13,10))
'sdcard.SDStr(string(" <targetHref>...</targetHref>",13,10))
'sdcard.SDStr(string("<Create>",13,10))
sdcard.SDStr(string("<Placemark>",13,10))
sdcard.SDStr(string("<name>"))
'sdcard.sddec(gps.Long_Hour)
'sdcard.SDStr(string(":"))
'sdcard.sddec(gps.Long_minute)
{sdcard.SDStr(string(" *E* "))
sdcard.SDDec(Elcheck)
sdcard.SDStr(string(" *R* "))
sdcard.SDDec(rtcheck)}
sdcard.SDStr(string("</name>",13,10))
' check for being stopped. only want one icon, so need to check if still stopped.
PickIcon
sdcard.SDStr(string("<Point>",13,10))
sdcard.SDStr(string("<coordinates>",13,10))
sdcard.sdstr(fs.floattostring(longnew))
sdcard.sdstr(string(","))
sdcard.sdstr(fs.floattostring(latnew))
sdcard.sdstr(string(","))
sdcard.sddec(0)
sdcard.sdstr(string(13,10))
sdcard.SDStr(string("</coordinates>",13,10))
sdcard.SDStr(string("</Point>",13,10))
TimeStamp
sdcard.SDStr(string("</Placemark>",13,10))
'sdcard.SDStr(string("</Create>",13,10))
'sdcard.SDStr(string(" </Update>",13,10))
'sdcard.SDStr(string("</gx:AnimatedUpdate>",13,10))
waitcnt (clkfreq * 4 + cnt)
Pub ShortBlink
repeat 8
!outa[7]
waitcnt(9000_000 + cnt)
Pub LongBlink
outa[7] := 1
waitcnt(clkfreq * 4 + cnt)
outa[7] := 0
Pub RecordOn
outa[7] := 1
Pub RecordOff
outa[7] := 0
PUB TakeReading
CheckSatFix
longold := longnew
latold := latnew
longnew := gps.Float_Longitude_Deg
latnew := gps.Float_Latitude_Deg
if firstloopcheck <> 0
gps.distance(latold,longold,latnew,longnew)
distance := gps.final
Pub FlyTo
sdcard.SDStr(string("<FlyTo>",13,10))
sdcard.SDStr(string("<duration>2.0</duration>",13,10))
if firstloopcheck == 0
sdcard.SDStr(string("<flyToMode>bounce</flyToMode>",13,10))
else
sdcard.SDStr(string("<flyToMode>smooth</flyToMode>",13,10))
sdcard.SDStr(string("<LookAt>",13,10))
TimeStamp
sdcard.SDStr(string("<longitude>"))
sdcard.sdstr(fs.floattostring(longnew))
sdcard.SDStr(string("</longitude>",13,10))
sdcard.SDStr(string("<latitude>"))
sdcard.sdstr(fs.floattostring(latnew))
sdcard.SDStr(string("</latitude>",13,10))
if firstloopcheck == 0
sdcard.SDStr(string("<altitude>1000</altitude>",13,10))
else
sdcard.SDStr(string("<altitude>300</altitude>",13,10))
sdcard.SDStr(string("<heading>0</heading>",13,10))
sdcard.SDStr(string("<tilt>0</tilt>",13,10))
'sdcard.SDStr(string("<range>4202.579</range>",13,10))
sdcard.SDStr(string("<altitudeMode>relativeToGround</altitudeMode>",13,10))
sdcard.SDStr(string("</LookAt>",13,10))
sdcard.SDStr(string("</FlyTo>",13,10))
Pub TimeStamp
sdcard.SDStr(string("<TimeSpan id='ID'>",13,10))
sdcard.SDStr(string("<begin>"))
year:=gps.Long_year
month:=gps.long_month
day:=gps.long_day
hour:=gps.long_hour - 4
minute:=gps.long_minute
second:=gps.long_second
sdcard.sddec(gps.Long_year)
sdcard.SDStr(string("-"))
if month < 10
sdcard.SDStr(string("0"))
sdcard.sddec(month)
else
sdcard.sddec(month)
sdcard.SDStr(string("-"))
if day < 10
sdcard.SDStr(string("0"))
sdcard.sddec(day)
else
sdcard.sddec(day)
sdcard.SDStr(string("T"))
if hour < 10
sdcard.SDStr(string("0"))
sdcard.sddec(hour)
else
sdcard.sddec(hour)
sdcard.SDStr(string(":"))
if minute < 10
sdcard.SDStr(string("0"))
sdcard.sddec(minute)
else
sdcard.sddec(minute)
sdcard.SDStr(string(":"))
if second < 10
sdcard.SDStr(string("0"))
sdcard.sddec(second)
else
sdcard.sddec(second)
sdcard.SDStr(string("Z</begin>"))
sdcard.SDStr(string("<end>"))
CalculateEndTime
sdcard.sddec(gps.Long_year)
sdcard.SDStr(string("-"))
if month < 10
sdcard.SDStr(string("0"))
sdcard.sddec(month)
else
sdcard.sddec(month)
sdcard.SDStr(string("-"))
if day < 10
sdcard.SDStr(string("0"))
sdcard.sddec(day)
else
sdcard.sddec(day)
sdcard.SDStr(string("T"))
if endhour < 10
sdcard.SDStr(string("0"))
sdcard.sddec(endhour)
else
sdcard.sddec(endhour)
sdcard.SDStr(string(":"))
if endminute < 10
sdcard.SDStr(string("0"))
sdcard.sddec(endminute)
else
sdcard.sddec(endminute)
sdcard.SDStr(string(":"))
if endsecond < 10
sdcard.SDStr(string("0"))
sdcard.sddec(endsecond)
else
sdcard.sddec(endsecond)
sdcard.SDStr(string("Z</end>"))
sdcard.SDStr(string("</TimeSpan>",13,10))
Pub CalculateEndTime
if (second + 20) > 60
if (minute + 1) > 60
endhour := hour + 1
endminute := 0
endsecond := (second + 20) - 60
else
endhour := hour
endminute := minute + 1
endsecond := (second + 20) - 60
else
endhour := hour
endminute := minute
endsecond := second + 20
Pub PickIcon
if elcheck == 1 ' level
case rtcheck
1: sdcard.SDStr(string("<styleUrl>#levelNIcon</styleUrl>",13,10))
2: sdcard.SDStr(string("<styleUrl>#levelNEIcon</styleUrl>",13,10))
3: sdcard.SDStr(string("<styleUrl>#levelEIcon</styleUrl>",13,10))
4: sdcard.SDStr(string("<styleUrl>#levelSEIcon</styleUrl>",13,10))
5: sdcard.SDStr(string("<styleUrl>#levelSIcon</styleUrl>",13,10))
6: sdcard.SDStr(string("<styleUrl>#levelSWIcon</styleUrl>",13,10))
7: sdcard.SDStr(string("<styleUrl>#levelWIcon</styleUrl>",13,10))
8: sdcard.SDStr(string("<styleUrl>#levelNWIcon</styleUrl>",13,10))
elseif ElCheck == 2 ' downhill
case rtcheck
1: sdcard.SDStr(string("<styleUrl>#downhillNIcon</styleUrl>",13,10))
2: sdcard.SDStr(string("<styleUrl>#downhillNEIcon</styleUrl>",13,10))
3: sdcard.SDStr(string("<styleUrl>#downhillEIcon</styleUrl>",13,10))
4: sdcard.SDStr(string("<styleUrl>#downhillSEIcon</styleUrl>",13,10))
5: sdcard.SDStr(string("<styleUrl>#downhillSIcon</styleUrl>",13,10))
6: sdcard.SDStr(string("<styleUrl>#downhillSWIcon</styleUrl>",13,10))
7: sdcard.SDStr(string("<styleUrl>#downhillWIcon</styleUrl>",13,10))
8: sdcard.SDStr(string("<styleUrl>#downhillNWIcon</styleUrl>",13,10))
elseif ElCheck == 3 ' uphill
case rtcheck
1: sdcard.SDStr(string("<styleUrl>#uphillNIcon</styleUrl>",13,10))
2: sdcard.SDStr(string("<styleUrl>#uphillNEIcon</styleUrl>",13,10))
3: sdcard.SDStr(string("<styleUrl>#uphillEIcon</styleUrl>",13,10))
4: sdcard.SDStr(string("<styleUrl>#uphillSEIcon</styleUrl>",13,10))
5: sdcard.SDStr(string("<styleUrl>#uphillSIcon</styleUrl>",13,10))
6: sdcard.SDStr(string("<styleUrl>#uphillSWIcon</styleUrl>",13,10))
7: sdcard.SDStr(string("<styleUrl>#uphillWIcon</styleUrl>",13,10))
8: sdcard.SDStr(string("<styleUrl>#uphillNWIcon</styleUrl>",13,10))
Pub Styles
sdcard.SDStr(string("<Style id='levelNIcon'>",13,10))
sdcard.SDStr(string("<IconStyle>",13,10))
sdcard.SDStr(string("<scale>1</scale>",13,10))
sdcard.SDStr(string("<Icon>",13,10))
sdcard.SDStr(string("<href>http://www.ragtopvideo.com/me/levelN.png</href>",13,10))
sdcard.SDStr(string("</Icon>",13,10))
sdcard.SDStr(string("</IconStyle>",13,10))
sdcard.SDStr(string("</Style>",13,10))
sdcard.SDStr(string("<Style id='levelNEIcon'>",13,10))
sdcard.SDStr(string("<IconStyle>",13,10))
sdcard.SDStr(string("<scale>1</scale>",13,10))
sdcard.SDStr(string("<Icon>",13,10))
sdcard.SDStr(string("<href>http://www.ragtopvideo.com/me/levelNE.png</href>",13,10))
sdcard.SDStr(string("</Icon>",13,10))
sdcard.SDStr(string("</IconStyle>",13,10))
sdcard.SDStr(string("</Style>",13,10))
sdcard.SDStr(string("<Style id='levelEIcon'>",13,10))
sdcard.SDStr(string("<IconStyle>",13,10))
sdcard.SDStr(string("<scale>1</scale>",13,10))
sdcard.SDStr(string("<Icon>",13,10))
sdcard.SDStr(string("<href>http://www.ragtopvideo.com/me/levelE.png</href>",13,10))
sdcard.SDStr(string("</Icon>",13,10))
sdcard.SDStr(string("</IconStyle>",13,10))
sdcard.SDStr(string("</Style>",13,10))
sdcard.SDStr(string("<Style id='levelSEIcon'>",13,10))
sdcard.SDStr(string("<IconStyle>",13,10))
sdcard.SDStr(string("<scale>1</scale>",13,10))
sdcard.SDStr(string("<Icon>",13,10))
sdcard.SDStr(string("<href>http://www.ragtopvideo.com/me/levelSE.png</href>",13,10))
sdcard.SDStr(string("</Icon>",13,10))
sdcard.SDStr(string("</IconStyle>",13,10))
sdcard.SDStr(string("</Style>",13,10))
sdcard.SDStr(string("<Style id='levelSIcon'>",13,10))
sdcard.SDStr(string("<IconStyle>",13,10))
sdcard.SDStr(string("<scale>1</scale>",13,10))
sdcard.SDStr(string("<Icon>",13,10))
sdcard.SDStr(string("<href>http://www.ragtopvideo.com/me/levelS.png</href>",13,10))
sdcard.SDStr(string("</Icon>",13,10))
sdcard.SDStr(string("</IconStyle>",13,10))
sdcard.SDStr(string("</Style>",13,10))
sdcard.SDStr(string("<Style id='levelSWIcon'>",13,10))
sdcard.SDStr(string("<IconStyle>",13,10))
sdcard.SDStr(string("<scale>1</scale>",13,10))
sdcard.SDStr(string("<Icon>",13,10))
sdcard.SDStr(string("<href>http://www.ragtopvideo.com/me/levelSW.png</href>",13,10))
sdcard.SDStr(string("</Icon>",13,10))
sdcard.SDStr(string("</IconStyle>",13,10))
sdcard.SDStr(string("</Style>",13,10))
sdcard.SDStr(string("<Style id='levelWIcon'>",13,10))
sdcard.SDStr(string("<IconStyle>",13,10))
sdcard.SDStr(string("<scale>1</scale>",13,10))
sdcard.SDStr(string("<Icon>",13,10))
sdcard.SDStr(string("<href>http://www.ragtopvideo.com/me/levelW.png</href>",13,10))
sdcard.SDStr(string("</Icon>",13,10))
sdcard.SDStr(string("</IconStyle>",13,10))
sdcard.SDStr(string("</Style>",13,10))
sdcard.SDStr(string("<Style id='levelNWIcon'>",13,10))
sdcard.SDStr(string("<IconStyle>",13,10))
sdcard.SDStr(string("<scale>1</scale>",13,10))
sdcard.SDStr(string("<Icon>",13,10))
sdcard.SDStr(string("<href>http://www.ragtopvideo.com/me/levelNW.png</href>",13,10))
sdcard.SDStr(string("</Icon>",13,10))
sdcard.SDStr(string("</IconStyle>",13,10))
sdcard.SDStr(string("</Style>",13,10))
sdcard.SDStr(string("<Style id='uphillNIcon'>",13,10))
sdcard.SDStr(string("<IconStyle>",13,10))
sdcard.SDStr(string("<scale>1</scale>",13,10))
sdcard.SDStr(string("<Icon>",13,10))
sdcard.SDStr(string("<href>http://www.ragtopvideo.com/me/uphillN.png</href>",13,10))
sdcard.SDStr(string("</Icon>",13,10))
sdcard.SDStr(string("</IconStyle>",13,10))
sdcard.SDStr(string("</Style>",13,10))
sdcard.SDStr(string("<Style id='uphillNEIcon'>",13,10))
sdcard.SDStr(string("<IconStyle>",13,10))
sdcard.SDStr(string("<scale>1</scale>",13,10))
sdcard.SDStr(string("<Icon>",13,10))
sdcard.SDStr(string("<href>http://www.ragtopvideo.com/me/uphillNE.png</href>",13,10))
sdcard.SDStr(string("</Icon>",13,10))
sdcard.SDStr(string("</IconStyle>",13,10))
sdcard.SDStr(string("</Style>",13,10))
sdcard.SDStr(string("<Style id='uphillEIcon'>",13,10))
sdcard.SDStr(string("<IconStyle>",13,10))
sdcard.SDStr(string("<scale>1</scale>",13,10))
sdcard.SDStr(string("<Icon>",13,10))
sdcard.SDStr(string("<href>http://www.ragtopvideo.com/me/uphillE.png</href>",13,10))
sdcard.SDStr(string("</Icon>",13,10))
sdcard.SDStr(string("</IconStyle>",13,10))
sdcard.SDStr(string("</Style>",13,10))
sdcard.SDStr(string("<Style id='uphillSEIcon'>",13,10))
sdcard.SDStr(string("<IconStyle>",13,10))
sdcard.SDStr(string("<scale>1</scale>",13,10))
sdcard.SDStr(string("<Icon>",13,10))
sdcard.SDStr(string("<href>http://www.ragtopvideo.com/me/uphillSE.png</href>",13,10))
sdcard.SDStr(string("</Icon>",13,10))
sdcard.SDStr(string("</IconStyle>",13,10))
sdcard.SDStr(string("</Style>",13,10))
sdcard.SDStr(string("<Style id='uphillSIcon'>",13,10))
sdcard.SDStr(string("<IconStyle>",13,10))
sdcard.SDStr(string("<scale>1</scale>",13,10))
sdcard.SDStr(string("<Icon>",13,10))
sdcard.SDStr(string("<href>http://www.ragtopvideo.com/me/uphillS.png</href>",13,10))
sdcard.SDStr(string("</Icon>",13,10))
sdcard.SDStr(string("</IconStyle>",13,10))
sdcard.SDStr(string("</Style>",13,10))
sdcard.SDStr(string("<Style id='uphillSWIcon'>",13,10))
sdcard.SDStr(string("<IconStyle>",13,10))
sdcard.SDStr(string("<scale>1</scale>",13,10))
sdcard.SDStr(string("<Icon>",13,10))
sdcard.SDStr(string("<href>http://www.ragtopvideo.com/me/uphillSW.png</href>",13,10))
sdcard.SDStr(string("</Icon>",13,10))
sdcard.SDStr(string("</IconStyle>",13,10))
sdcard.SDStr(string("</Style>",13,10))
sdcard.SDStr(string("<Style id='uphillWIcon'>",13,10))
sdcard.SDStr(string("<IconStyle>",13,10))
sdcard.SDStr(string("<scale>1</scale>",13,10))
sdcard.SDStr(string("<Icon>",13,10))
sdcard.SDStr(string("<href>http://www.ragtopvideo.com/me/uphillW.png</href>",13,10))
sdcard.SDStr(string("</Icon>",13,10))
sdcard.SDStr(string("</IconStyle>",13,10))
sdcard.SDStr(string("</Style>",13,10))
sdcard.SDStr(string("<Style id='uphillNWIcon'>",13,10))
sdcard.SDStr(string("<IconStyle>",13,10))
sdcard.SDStr(string("<scale>1</scale>",13,10))
sdcard.SDStr(string("<Icon>",13,10))
sdcard.SDStr(string("<href>http://www.ragtopvideo.com/me/uphillNW.png</href>",13,10))
sdcard.SDStr(string("</Icon>",13,10))
sdcard.SDStr(string("</IconStyle>",13,10))
sdcard.SDStr(string("</Style>",13,10))
sdcard.SDStr(string("<Style id='downhillNIcon'>",13,10))
sdcard.SDStr(string("<IconStyle>",13,10))
sdcard.SDStr(string("<scale>1</scale>",13,10))
sdcard.SDStr(string("<Icon>",13,10))
sdcard.SDStr(string("<href>http://www.ragtopvideo.com/me/downhillN.png</href>",13,10))
sdcard.SDStr(string("</Icon>",13,10))
sdcard.SDStr(string("</IconStyle>",13,10))
sdcard.SDStr(string("</Style>",13,10))
sdcard.SDStr(string("<Style id='downhillNEIcon'>",13,10))
sdcard.SDStr(string("<IconStyle>",13,10))
sdcard.SDStr(string("<scale>1</scale>",13,10))
sdcard.SDStr(string("<Icon>",13,10))
sdcard.SDStr(string("<href>http://www.ragtopvideo.com/me/downhillNE.png</href>",13,10))
sdcard.SDStr(string("</Icon>",13,10))
sdcard.SDStr(string("</IconStyle>",13,10))
sdcard.SDStr(string("</Style>",13,10))
sdcard.SDStr(string("<Style id='downhillEIcon'>",13,10))
sdcard.SDStr(string("<IconStyle>",13,10))
sdcard.SDStr(string("<scale>1</scale>",13,10))
sdcard.SDStr(string("<Icon>",13,10))
sdcard.SDStr(string("<href>http://www.ragtopvideo.com/me/downhillE.png</href>",13,10))
sdcard.SDStr(string("</Icon>",13,10))
sdcard.SDStr(string("</IconStyle>",13,10))
sdcard.SDStr(string("</Style>",13,10))
sdcard.SDStr(string("<Style id='downhillSEIcon'>",13,10))
sdcard.SDStr(string("<IconStyle>",13,10))
sdcard.SDStr(string("<scale>1</scale>",13,10))
sdcard.SDStr(string("<Icon>",13,10))
sdcard.SDStr(string("<href>http://www.ragtopvideo.com/me/downhillSE.png</href>",13,10))
sdcard.SDStr(string("</Icon>",13,10))
sdcard.SDStr(string("</IconStyle>",13,10))
sdcard.SDStr(string("</Style>",13,10))
sdcard.SDStr(string("<Style id='downhillSIcon'>",13,10))
sdcard.SDStr(string("<IconStyle>",13,10))
sdcard.SDStr(string("<scale>1</scale>",13,10))
sdcard.SDStr(string("<Icon>",13,10))
sdcard.SDStr(string("<href>http://www.ragtopvideo.com/me/downhillS.png</href>",13,10))
sdcard.SDStr(string("</Icon>",13,10))
sdcard.SDStr(string("</IconStyle>",13,10))
sdcard.SDStr(string("</Style>",13,10))
sdcard.SDStr(string("<Style id='downhillSWIcon'>",13,10))
sdcard.SDStr(string("<IconStyle>",13,10))
sdcard.SDStr(string("<scale>1</scale>",13,10))
sdcard.SDStr(string("<Icon>",13,10))
sdcard.SDStr(string("<href>http://www.ragtopvideo.com/me/downhillSW.png</href>",13,10))
sdcard.SDStr(string("</Icon>",13,10))
sdcard.SDStr(string("</IconStyle>",13,10))
sdcard.SDStr(string("</Style>",13,10))
sdcard.SDStr(string("<Style id='downhillWIcon'>",13,10))
sdcard.SDStr(string("<IconStyle>",13,10))
sdcard.SDStr(string("<scale>1</scale>",13,10))
sdcard.SDStr(string("<Icon>",13,10))
sdcard.SDStr(string("<href>http://www.ragtopvideo.com/me/downhillW.png</href>",13,10))
sdcard.SDStr(string("</Icon>",13,10))
sdcard.SDStr(string("</IconStyle>",13,10))
sdcard.SDStr(string("</Style>",13,10))
sdcard.SDStr(string("<Style id='downhillNWIcon'>",13,10))
sdcard.SDStr(string("<IconStyle>",13,10))
sdcard.SDStr(string("<scale>1</scale>",13,10))
sdcard.SDStr(string("<Icon>",13,10))
sdcard.SDStr(string("<href>http://www.ragtopvideo.com/me/downNW.png</href>",13,10))
sdcard.SDStr(string("</Icon>",13,10))
sdcard.SDStr(string("</IconStyle>",13,10))
sdcard.SDStr(string("</Style>",13,10))
sdcard.SDStr(string("<Style id='stopIcon'>",13,10))
sdcard.SDStr(string("<IconStyle>",13,10))
sdcard.SDStr(string("<scale>1</scale>",13,10))
sdcard.SDStr(string("<Icon>",13,10))
sdcard.SDStr(string("<href>http://www.ragtopvideo.com/me/stop.png</href>",13,10))
sdcard.SDStr(string("</Icon>",13,10))
sdcard.SDStr(string("</IconStyle>",13,10))
sdcard.SDStr(string("</Style>",13,10))

Comments
Nice demo a little bit rough but very functional.
Keep up the good work.
Thank You
Which keeps me from closing the file, losing hours of data. Got to rewrite that.