1    #!/usr/local/bin/python
       2    #
       3    # gtc-sample.py - example of how to retrieve data from Garmin Training Center
       4    #                 database on OS X
       5    #
       6    # version: 1.0
       7    #
       8    
       9    from pysqlite2 import dbapi2 as sqlite
      10    import string, os
      11    
      12    # shorthand to make deleting characters more readable
      13    
      14    def deletechars(s, todelete, id=string.maketrans('', '')):
      15    	return string.translate(s, id, todelete)
      16    
      17    
      18    # figure out where the file lives
      19    
      20    home_dir = os.environ["HOME"]
      21    gtc_file = home_dir + "/Library/Application Support/Garmin/Training Center/Training Center.gtc"
      22    
      23    if (os.path.exists(gtc_file)):
      24    
      25    	con = sqlite.connect(gtc_file)
      26    	
      27    	cur = con.cursor()
      28    
      29    	# get user info
      30    	
      31    	cur.execute("SELECT zNAME, zGENDER, zWEIGHT FROM zCDUSER")
      32    	for (name, gender, weight) in cur:
      33    		if (gender == 1):
      34    			gender = "MALE"
      35    		else:
      36    			gender = "FEMALE"
      37    		
      38    		print '%s is %3.2f kg or %3.2f lbs. [%s]' % (name, weight, (weight * 2.20462262), gender)
      39    
      40    	# get last activity		 
      41    		 
      42    	cur.execute("""SELECT zIMAGENAME, zDISPLAYEDNAME, zDISPLAYEDASCENT, zDISPLAYEDASCENT, zTRACK
    						FROM zCDTREEITEM WHERE zIMAGENAME LIKE 'history%' ORDER BY zSTARTTIME2 DESC LIMIT 1""") 
      44    	
      45    	# coulg have just done "fetchone", but this would work for multiple activities
      46    	
      47    	for (image,  name, ascent, descent, track) in cur:
      48    
      49    		# basic activity entries are "history_biking" and "history_running"
      50    	
      51    		if (image.find('biking')):
      52    			activity = 'CYCLING'
      53    		elif (image.find('running')):
      54    			activity = 'RUNNING'
      55    		else:
      56    			activity = 'OTHER'
      57    		
      58    		
      59    		print '%s, %s, %5.2f, %5.2f, %s' % (activity, name, ascent, descent, track)
      60    
      61    		# let sqlite calculate average/max heart rate
      62    		
      63    		cur2 = con.cursor() 
      64    		cur2.execute("""SELECT AVG(zHEARTRATE), MAX(zHEARTRATE) FROM zCDTRACKPOINT
    							WHERE zBELONGSTOTRACKSEGMENT = %d AND zCUMULATIVEDISTANCE > 0 ORDER BY zTIME""" % (track))
      66    		for (hr_avg, hr_max) in cur2:
      67    			print 'Average HR: [%d]; Max HR: [%d]' % (hr_avg, hr_max)
      68    
      69    		# get the total distance travelled during this activity (data from last track point in the track
      70    		
      71    		cur2.execute("""SELECT zCUMULATIVEDISTANCE FROM zCDTRACKPOINT WHERE zBELONGSTOTRACKSEGMENT = %d
    							ORDER BY zTIME DESC LIMIT 1""" % (track))
      73    		for (dist) in cur2:
      74    			distance = float(deletechars(str(dist), ',()'))
      75    			print 'Distance: [%5.2f meters] [%3.2f km] [%3.2f miles]' % (distance, (distance / 1000), (distance * 0.000621371192))
      76    
      77    		# get lat/lon boundaries for plotting purposes
      78    			
      79    		cur2.execute("""SELECT MIN(zLATITUDE), MAX(zLATITUDE), MIN(zLONGITUDE), MAX(zLONGITUDE) FROM zCDTRACKPOINT
    							WHERE zBELONGSTOTRACKSEGMENT = %d ORDER BY zTIME""" % (track))
      81    		(lat_min, lat_max, lon_min, lon_max) = cur2.fetchone()
      82    		#	print 'lat min: [%d] lat max: [%d] lon min: [%d] lon max:[%d]' % (lat_min, lat_max, lon_min, lon_max)
      83    			
      84    
      85    		# transform lat/lon points so they fit on a particular size canvas
      86    
      87    		dx = abs(lon_min - lon_max) ;
      88    		dy = lat_max - lat_min ;
      89    		
      90    		nx = int(dx / 300) # width of graphics area
      91    		ny = int(dy / 200) # height of graphcs area
      92    		
      93    		point_num = 0
      94    		
      95    		# get points to "plot"
      96    			
      97    		cur2.execute("""SELECT zLONGITUDE, zLATITUDE FROM zCDTRACKPOINT WHERE zBELONGSTOTRACKSEGMENT = %d
    							ORDER BY zTIME ASC""" % (track))
      99    		for (lon_pt, lat_pt) in cur2:
     100    		
     101    			cx = int((lon_pt - lon_min) / nx)
     102    			cy = int((lat_max - lat_pt) / ny)
     103    			
     104    			point_num += 1
     105    			if (point_num == 1):
     106    				print '%d,%d' % (cx, cy) # first point
     107    			else:
     108    				print '%d,%d' % (cx, cy)