1# Copyright (c) 2010 The Chromium OS Authors. All rights reserved. 2# Use of this source code is governed by a BSD-style license that can be 3# found in the LICENSE file. 4 5 6# 7# This test is overly simple right now, it'll just make sure that there are 8# at least a few satellites seen (i.e. that signal can be received by the GPS). 9# 10# There are no checks to make sure that a fix can be had, nor of the precision 11# or accurracy of said fix. That can either be handled by higher-level tests 12# or added here later. 13# 14 15 16import logging, re 17from autotest_lib.client.bin import test 18from autotest_lib.client.common_lib import error, utils 19 20 21class hardware_GobiGPS(test.test): 22 version = 1 23 24 def run_once(self): 25 sats_seen = {} 26 sats_signal = {} 27 got_fix = False 28 pos_lat = "" 29 pos_long = "" 30 31 try: 32 nmea = utils.system_output('head -300 /tmp/gobi-nmea', timeout=60) 33 except: 34 raise error.TestFail('GPS access failed') 35 return 36 37 logging.debug(nmea) 38 for line in nmea.split('\n'): 39 line = line.strip() 40 41 # Satellites in view 42 if line.startswith('$GPGSV'): 43 line = line.rstrip('*0123456789ABCDEF') 44 fields = line.split(',')[4:] 45 while fields: 46 sat = fields[0] 47 if fields[3]: 48 sats_seen[sat] = True 49 sats_signal[sat] = fields[3] 50 else: 51 sats_seen[sat] = True 52 fields = fields[4:] 53 54 # Recommended minimum specific GPS/Transit data 55 if line.startswith('$GPRMC'): 56 # Looks like Gobi has non-standard GPRMC with 13 fields, not 12. 57 match = re.search( 58 r'^\$GPRMC\,(.*)\,(.*)\,(.*)\,(.*)\,(.*)\,(.*)\,(.*)\,' 59 r'(.*)\,(.*)\,(.*)\,(.*),(.*)\*(.*)$', 60 line) 61 62 if match and match.group(2) == 'A' and not got_fix: 63 logging.debug('Got fix:') 64 logging.debug('Time = %s', match.group(1)) 65 logging.debug('Status = %s', match.group(2)) 66 logging.debug('Latitude = %s %s', match.group(3), 67 match.group(4)) 68 logging.debug('Longitude = %s %s', match.group(5), 69 match.group(6)) 70 logging.debug('Speed = %s', match.group(7)) 71 logging.debug('Track Angle = %s', match.group(8)) 72 logging.debug('Date = %s', match.group(9)) 73 logging.debug('Magnetic Variation = %s %s', match.group(10), 74 match.group(11)) 75 got_fix = True 76 pos_lat = '%s%s' % (match.group(3), match.group(4)) 77 pos_long = '%s%s' % (match.group(5), match.group(6)) 78 break 79 80 logging.debug('number of satellites seen %d: %s', 81 len(sats_seen), sats_seen) 82 logging.debug('number of satellites seen with signal strength %d: %s', 83 len(sats_signal), sats_signal) 84 85 if got_fix: 86 logging.info('Got fix: %s %s' % (pos_lat, pos_long)) 87 return 88 89 # Somewhat random criteria: Pass if you can see 5 at all, and at least 2 90 # enough to get a signal reading 91 if len(sats_signal) < 2 and len(sats_seen) < 5: 92 raise error.TestFail('Unable to find GPS signal') 93 else: 94 logging.info('Saw %d GPS satellites, %d with signal strength', 95 len(sats_seen), len(sats_signal)) 96