96 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			96 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Python
		
	
	
	
| # Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
 | |
| # Use of this source code is governed by a BSD-style license that can be
 | |
| # found in the LICENSE file.
 | |
| 
 | |
| 
 | |
| #
 | |
| # This test is overly simple right now, it'll just make sure that there are
 | |
| # at least a few satellites seen (i.e. that signal can be received by the GPS).
 | |
| #
 | |
| # There are no checks to make sure that a fix can be had, nor of the precision
 | |
| # or accurracy of said fix. That can either be handled by higher-level tests
 | |
| # or added here later.
 | |
| #
 | |
| 
 | |
| 
 | |
| import logging, re
 | |
| from autotest_lib.client.bin import test
 | |
| from autotest_lib.client.common_lib import error, utils
 | |
| 
 | |
| 
 | |
| class hardware_GobiGPS(test.test):
 | |
|     version = 1
 | |
| 
 | |
|     def run_once(self):
 | |
|         sats_seen = {}
 | |
|         sats_signal = {}
 | |
|         got_fix = False
 | |
|         pos_lat = ""
 | |
|         pos_long = ""
 | |
| 
 | |
|         try:
 | |
|             nmea = utils.system_output('head -300 /tmp/gobi-nmea', timeout=60)
 | |
|         except:
 | |
|             raise error.TestFail('GPS access failed')
 | |
|             return
 | |
| 
 | |
|         logging.debug(nmea)
 | |
|         for line in nmea.split('\n'):
 | |
|             line = line.strip()
 | |
| 
 | |
|             # Satellites in view
 | |
|             if line.startswith('$GPGSV'):
 | |
|                 line = line.rstrip('*0123456789ABCDEF')
 | |
|                 fields = line.split(',')[4:]
 | |
|                 while fields:
 | |
|                     sat = fields[0]
 | |
|                     if fields[3]:
 | |
|                         sats_seen[sat] = True
 | |
|                         sats_signal[sat] = fields[3]
 | |
|                     else:
 | |
|                         sats_seen[sat] = True
 | |
|                     fields = fields[4:]
 | |
| 
 | |
|             # Recommended minimum specific GPS/Transit data
 | |
|             if line.startswith('$GPRMC'):
 | |
|                 # Looks like Gobi has non-standard GPRMC with 13 fields, not 12.
 | |
|                 match = re.search(
 | |
|                     r'^\$GPRMC\,(.*)\,(.*)\,(.*)\,(.*)\,(.*)\,(.*)\,(.*)\,'
 | |
|                     r'(.*)\,(.*)\,(.*)\,(.*),(.*)\*(.*)$',
 | |
|                     line)
 | |
| 
 | |
|                 if match and match.group(2) == 'A' and not got_fix:
 | |
|                     logging.debug('Got fix:')
 | |
|                     logging.debug('Time = %s', match.group(1))
 | |
|                     logging.debug('Status = %s', match.group(2))
 | |
|                     logging.debug('Latitude = %s %s', match.group(3),
 | |
|                                   match.group(4))
 | |
|                     logging.debug('Longitude = %s %s', match.group(5),
 | |
|                                   match.group(6))
 | |
|                     logging.debug('Speed = %s', match.group(7))
 | |
|                     logging.debug('Track Angle = %s', match.group(8))
 | |
|                     logging.debug('Date = %s', match.group(9))
 | |
|                     logging.debug('Magnetic Variation = %s %s', match.group(10),
 | |
|                                   match.group(11))
 | |
|                     got_fix = True
 | |
|                     pos_lat = '%s%s' % (match.group(3), match.group(4))
 | |
|                     pos_long = '%s%s' % (match.group(5), match.group(6))
 | |
|                     break
 | |
| 
 | |
|         logging.debug('number of satellites seen %d: %s',
 | |
|                        len(sats_seen), sats_seen)
 | |
|         logging.debug('number of satellites seen with signal strength %d: %s',
 | |
|                        len(sats_signal), sats_signal)
 | |
| 
 | |
|         if got_fix:
 | |
|             logging.info('Got fix: %s %s' % (pos_lat, pos_long))
 | |
|             return
 | |
| 
 | |
|         # Somewhat random criteria: Pass if you can see 5 at all, and at least 2
 | |
|         # enough to get a signal reading
 | |
|         if len(sats_signal) < 2 and len(sats_seen) < 5:
 | |
|             raise error.TestFail('Unable to find GPS signal')
 | |
|         else:
 | |
|             logging.info('Saw %d GPS satellites, %d with signal strength',
 | |
|                          len(sats_seen), len(sats_signal))
 |