| # 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)) |