def test_read_data_str_raw(self): data = """$GPRMC,184332.07,A,1929.459,S,02410.381,E,74.00,16.78,210410,0.0,E,A*2B $GPGGA,184333.07,1929.439,S,02410.387,E,1,04,2.8,100.00,M,-33.9,M,,0000*65 $GPRMC,184444.08,A,1928.041,S,02410.809,E,74.00,16.78,210410,0.0,E,A*25 $GPGGA,184445.08,1928.021,S,02410.814,E,1,04,2.7,100.00,M,-33.9,M,,0000*6E $GPGLL,1928.001,S,02410.820,E,184446.08,A,A*79 $GPVTG,16.78,T,,M,74.00,N,137.05,K,A*36 $GPRMC,184448.08,A,1927.962,S,02410.832,E,74.00,16.78,210410,0.0,E,A*26 $GPGGA,184449.08,1927.942,S,02410.838,E,1,04,1.7,100.00,M,-33.9,M,,0000*6C $GPGLL,1927.922,S,02410.844,E,184450.08,A,A*7B $GPVTG,16.78,T,,M,74.00,N,137.05,K,A*36 """ streamer = NMEAStream() nmea_objects = streamer.get_strings(data=data) nmea_objects += streamer.get_strings(data='') expected_result = [ 'GPRMC,184332.07,A,1929.459,S,02410.381,E,74.00,16.78,210410,0.0,E,A*2B', 'GPGGA,184333.07,1929.439,S,02410.387,E,1,04,2.8,100.00,M,-33.9,M,,0000*65', 'GPRMC,184444.08,A,1928.041,S,02410.809,E,74.00,16.78,210410,0.0,E,A*25', 'GPGGA,184445.08,1928.021,S,02410.814,E,1,04,2.7,100.00,M,-33.9,M,,0000*6E', 'GPGLL,1928.001,S,02410.820,E,184446.08,A,A*79', 'GPVTG,16.78,T,,M,74.00,N,137.05,K,A*36', 'GPRMC,184448.08,A,1927.962,S,02410.832,E,74.00,16.78,210410,0.0,E,A*26', 'GPGGA,184449.08,1927.942,S,02410.838,E,1,04,1.7,100.00,M,-33.9,M,,0000*6C', 'GPGLL,1927.922,S,02410.844,E,184450.08,A,A*7B', 'GPVTG,16.78,T,,M,74.00,N,137.05,K,A*36' ] self.assertEqual(expected_result, nmea_objects)
def nmea_parse(infile): ''' nmea_parse() - Read a GIS waypoint file and write lat-lon values Parameters ---------- infile : str waypoint file name Returns ------- nothing ''' from pynmea.streamer import NMEAStream nmea_file = open(infile) nmea_stream = NMEAStream(stream_obj=nmea_file) next_data = nmea_stream.get_objects() nmea_objects = [] while next_data: nmea_objects += next_data next_data = nmea_stream.get_objects() for nmea_obj in nmea_objects: if hasattr(nmea_obj, 'lat'): print(f' Lat/Lon: ({nmea_obj.lat}, {nmea_obj.lon})') return
def test__read_data(self): expected_result = [ 'GPRMC,184332.07,A,1929.459,S,02410.381,E,74.00,16.78,210410,0.0,E,A*2B', 'GPGGA,184333.07,1929.439,S,02410.387,E,1,04,2.8,100.00,M,-33.9,M,,0000*65', 'GPRMC,184444.08,A,1928.041,S,02410.809,E,74.00,16.78,210410,0.0,E,A*25', 'GPGGA,184445.08,1928.021,S,02410.814,E,1,04,2.7,100.00,M,-33.9,M,,0000*6E', 'GPGLL,1928.001,S,02410.820,E,184446.08,A,A*79', 'GPVTG,16.78,T,,M,74.00,N,137.05,K,A*36', 'GPRMC,184448.08,A,1927.962,S,02410.832,E,74.00,16.78,210410,0.0,E,A*26', 'GPGGA,184449.08,1927.942,S,02410.838,E,1,04,1.7,100.00,M,-33.9,M,,0000*6C', 'GPGLL,1927.922,S,02410.844,E,184450.08,A,A*7B', 'GPVTG,16.78,T,,M,74.00,N,137.05,K,A*36' ] input_data = """$GPRMC,184332.07,A,1929.459,S,02410.381,E,74.00,16.78,210410,0.0,E,A*2B $GPGGA,184333.07,1929.439,S,02410.387,E,1,04,2.8,100.00,M,-33.9,M,,0000*65 $GPRMC,184444.08,A,1928.041,S,02410.809,E,74.00,16.78,210410,0.0,E,A*25 $GPGGA,184445.08,1928.021,S,02410.814,E,1,04,2.7,100.00,M,-33.9,M,,0000*6E $GPGLL,1928.001,S,02410.820,E,184446.08,A,A*79 $GPVTG,16.78,T,,M,74.00,N,137.05,K,A*36 $GPRMC,184448.08,A,1927.962,S,02410.832,E,74.00,16.78,210410,0.0,E,A*26 $GPGGA,184449.08,1927.942,S,02410.838,E,1,04,1.7,100.00,M,-33.9,M,,0000*6C $GPGLL,1927.922,S,02410.844,E,184450.08,A,A*7B $GPVTG,16.78,T,,M,74.00,N,137.05,K,A*36 """ streamer = NMEAStream() data = streamer._read(data=input_data) data += streamer._read(data='') self.assertEqual(data, expected_result)
def test__read(self): test_file = os.path.join(os.path.dirname(__file__), 'test_data', 'test_data_small.gps') expected_result = [ 'GPRMC,184332.07,A,1929.459,S,02410.381,E,74.00,16.78,210410,0.0,E,A*2B', 'GPGGA,184333.07,1929.439,S,02410.387,E,1,04,2.8,100.00,M,-33.9,M,,0000*65', 'GPRMC,184444.08,A,1928.041,S,02410.809,E,74.00,16.78,210410,0.0,E,A*25', 'GPGGA,184445.08,1928.021,S,02410.814,E,1,04,2.7,100.00,M,-33.9,M,,0000*6E', 'GPGLL,1928.001,S,02410.820,E,184446.08,A,A*79', 'GPVTG,16.78,T,,M,74.00,N,137.05,K,A*36', 'GPRMC,184448.08,A,1927.962,S,02410.832,E,74.00,16.78,210410,0.0,E,A*26', 'GPGGA,184449.08,1927.942,S,02410.838,E,1,04,1.7,100.00,M,-33.9,M,,0000*6C', 'GPGLL,1927.922,S,02410.844,E,184450.08,A,A*7B', 'GPVTG,16.78,T,,M,74.00,N,137.05,K,A*36' ] with open(test_file, 'r') as test_file_fd: streamer = NMEAStream(stream_obj=test_file_fd) next_data = streamer._read() data = [] while next_data: data += next_data next_data = streamer._read() pass self.assertEqual(data, expected_result)
def start_server(self): gps_parser = NMEAStream() while True: try: if not (self.src_data is None): gps_info = source_port.readline() else: print "Loading static nav data" gps_info = self.nav_data.split('\n') for line in gps_info: gps_sentence = gps_parser._get_type(line)() gps_sentence.parse(gps_feed) if gps_sentence.sen_type == 'GPRMC' or gps_sentence.sen_type == 'GPGGA': time = datetime.strptime('%s' % gps_sentence.timestamp, '%H%M%S.%f') time += datetime.timedelta(microseconds=1000) #GPGGA print line dest_port.writeline(line) time.sleep(1) except Exception as e: pass dest_port.close()
def test_read_data_obj(self): test_file = os.path.join(os.path.dirname(__file__), 'test_data', 'test_data_small.gps') with open(test_file, 'r') as test_file_fd: streamer = NMEAStream(stream_obj=test_file_fd) next_data = streamer.get_objects() nmea_objects = [] while next_data: nmea_objects += next_data next_data = streamer.get_objects() expected_object_types = [ 'GPRMC', 'GPGGA', 'GPRMC', 'GPGGA', 'GPGLL', 'GPVTG', 'GPRMC', 'GPGGA', 'GPGLL', 'GPVTG' ] self.assertEqual(expected_object_types[0], nmea_objects[0].sen_type) self.assertEqual(expected_object_types[1], nmea_objects[1].sen_type) self.assertEqual(expected_object_types[2], nmea_objects[2].sen_type) self.assertEqual(expected_object_types[3], nmea_objects[3].sen_type) self.assertEqual(expected_object_types[4], nmea_objects[4].sen_type) self.assertEqual(expected_object_types[5], nmea_objects[5].sen_type) self.assertEqual(expected_object_types[6], nmea_objects[6].sen_type) self.assertEqual(expected_object_types[7], nmea_objects[7].sen_type) self.assertEqual(expected_object_types[8], nmea_objects[8].sen_type) self.assertEqual(expected_object_types[9], nmea_objects[9].sen_type)
def test_read_data_obj_raw(self): data = """$GPRMC,184332.07,A,1929.459,S,02410.381,E,74.00,16.78,210410,0.0,E,A*2B $GPGGA,184333.07,1929.439,S,02410.387,E,1,04,2.8,100.00,M,-33.9,M,,0000*65 $GPRMC,184444.08,A,1928.041,S,02410.809,E,74.00,16.78,210410,0.0,E,A*25 $GPGGA,184445.08,1928.021,S,02410.814,E,1,04,2.7,100.00,M,-33.9,M,,0000*6E $GPGLL,1928.001,S,02410.820,E,184446.08,A,A*79 $GPVTG,16.78,T,,M,74.00,N,137.05,K,A*36 $GPRMC,184448.08,A,1927.962,S,02410.832,E,74.00,16.78,210410,0.0,E,A*26 $GPGGA,184449.08,1927.942,S,02410.838,E,1,04,1.7,100.00,M,-33.9,M,,0000*6C $GPGLL,1927.922,S,02410.844,E,184450.08,A,A*7B $GPVTG,16.78,T,,M,74.00,N,137.05,K,A*36 """ streamer = NMEAStream() nmea_objects = streamer.get_objects(data=data) nmea_objects += streamer.get_objects(data='') expected_object_types = [ 'GPRMC', 'GPGGA', 'GPRMC', 'GPGGA', 'GPGLL', 'GPVTG', 'GPRMC', 'GPGGA', 'GPGLL', 'GPVTG' ] self.assertEqual(expected_object_types[0], nmea_objects[0].sen_type) self.assertEqual(expected_object_types[1], nmea_objects[1].sen_type) self.assertEqual(expected_object_types[2], nmea_objects[2].sen_type) self.assertEqual(expected_object_types[3], nmea_objects[3].sen_type) self.assertEqual(expected_object_types[4], nmea_objects[4].sen_type) self.assertEqual(expected_object_types[5], nmea_objects[5].sen_type) self.assertEqual(expected_object_types[6], nmea_objects[6].sen_type) self.assertEqual(expected_object_types[7], nmea_objects[7].sen_type) self.assertEqual(expected_object_types[8], nmea_objects[8].sen_type) self.assertEqual(expected_object_types[9], nmea_objects[9].sen_type)
def extract_gps_data(filepath, these_sentences=( 'GPRMC', 'GPGGA', )): """Use the pynmea library to read data out of an nmea log file.""" with open(filepath, 'r') as data_file: streamer = NMEAStream(data_file) next_data = streamer.get_objects() data = [] while next_data: for nd in next_data: if nd.sen_type in these_sentences: data.append(nd) next_data = streamer.get_objects() return data
def cmd_GPS(args): '''set GPS device''' state = mpstate.GPS_state if len(args) != 1: print("Usage: GPS <device>") return state.device = args[0] state.port = serial.Serial(state.device, 38400, timeout=0, dsrdtr=False, rtscts=False, xonxoff=False) state.port.write("AT*E2GPSCTL=1,5,1\r\n") time.sleep(2) state.port.write("AT*E2GPSNPD\r\n") time.sleep(2) state.nmea = NMEAStream(stream_obj=state.port)
def __init__(self): self.MR['rpc_connect'] = {} self.MR['rpc_disconnect'] = {} self.MR['rpc_nmeainput'] = {'line': [str, "NMEA raw data"]} self.MR['rpc_getNMEADeltaLog'] = { 'oldest': [float, "Begin of data collection."], 'newest': [float, "End of data collection. (0 = now)", 0] } self.MR['rpc_getNMEATimeLog'] = { 'eventtime': [float, "Begin of data collection."], 'maxdeviation': [float, "Maximum time deviation in seconds.", 10] } super(NMEABaseSensor, self).__init__() self.Configuration.update( {'SerialPort': 'cape.Communication.SerialPort.SerialPort_15'}) self.nmeaLog = {} self.streamer = NMEAStream()
def load_data_file(self, file_name, type='gps'): from pynmea.streamer import NMEAStream from uuts.craton.cli import navigation # Start analyze recording file Vs. gps simulator file with open(file_name, 'r') as data_file_fd: if type == 'gps': nmea_stream = NMEAStream(stream_obj=data_file_fd) elif type == 'navfix': nmea_stream = navigation.NavigationDataAnalyzer( stream_obj=data_file_fd) else: raise globals.Error("GPS information type is mismatch") next_data = nmea_stream.get_objects() nmea_objects = [] while next_data: nmea_objects += next_data next_data = nmea_stream.get_objects() data_file_fd.close() return nmea_objects
from pynmea.streamer import NMEAStream data_file = '../tests/test_data/test_data.gps' with open(data_file, 'r') as data_file_fd: nmea_stream = NMEAStream(stream_obj=data_file_fd) next_data = nmea_stream.get_objects() nmea_objects = [] while next_data: nmea_objects += next_data next_data = nmea_stream.get_objects() # All nmea objects are now in variable nmea_objects for nmea_ob in nmea_objects: print nmea_ob.sen_type
d = line.split(',') print d[7] f.write(d[7] + "\n") #f.write(d[2] + "," + d[4] + "\n") #print line except: pass print gga print lines f.close() quit() time.sleep(5) with open('gpslog291112.txt', 'r') as data_file: streamer = NMEAStream(data_file) next_data = streamer.get_objects() data = [] i = 0 samples = 0 while next_data: try: datapack = [] data += next_data next_data = streamer.get_objects() #print type(next_data) try: #print data[i].latitude #print data[i].lat_direction #print data[i].longitude
"""Parse NMEA GPS strings""" from pynmea.streamer import NMEAStream nmeaFile = open("nmea.txt") nmea_stream = NMEAStream(stream_obj=nmeaFile) next_data = nmea_stream.get_objects() nmea_objects = [] while next_data: nmea_objects += next_data next_data = nmea_stream.get_objects() # The NMEA stream is parsed! # Let's loop through the # Python object types: for nmea_ob in nmea_objects: if hasattr(nmea_ob, "lat"): print "Lat/Lon: (%s, %s)" % (nmea_ob.lat, nmea_ob.lon)
def test_splits_data_4(self): test_data = '$foo,bar,baz*77NOTHING$Meep,wibble,123,321NOTHING' streamer = NMEAStream() result = streamer._split(test_data, separator='NOTHING') self.assertEqual(result, ['foo,bar,baz*77', 'Meep,wibble,123,321'])
def start_gps_reader(self): # serial_port = self.start_serial_connection() #sock = socket.socket( socket.AF_INET, socket.SOCK_DGRAM ) #sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) #sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) #sock.setblocking(0) #sock.bind( ('', UDP_SERVER_PORT) ) context = zmq.Context() sock = context.socket(zmq.SUB) sock.setsockopt(zmq.SUBSCRIBE, '') sock.connect('tcp://localhost:%d' % UDP_SERVER_PORT) gps_parser = NMEAStream() sat_lock = 0 print "Starting reading from port" if sock: while True: try: #gps_feed = serial_port.readline() gps_feed = sock.recv() if gps_feed[0] != '$': print "JUNK feed : " + gps_feed continue # print "gps_feed : " + gps_feed gps_sentence = gps_parser._get_type(gps_feed)() gps_sentence.parse(gps_feed) if gps_sentence.sen_type == 'GPGSA': if (int(gps_sentence.mode_fix_type) > 1) and (sat_lock < 3): # Set last lock state sat_lock = int(gps_sentence.mode_fix_type) print "Sat is locked with value of {}".format( sat_lock) # Set computer clock if gps_sentence.sen_type == 'GPRMC': # print "date " + gps_sentence.datestamp + " time : " + gps_sentence.timestamp #date 240413 time : 201917.00 a = '%s %s' % (gps_sentence.datestamp, gps_sentence.timestamp) time_obj = time.strptime('%s' % a, '%d%m%y %H%M%S.%f') if ((datetime.datetime.strptime( '%s' % a, '%d%m%y %H%M%S.%f').microsecond) == 0): new_time = [ time_obj.tm_year, time_obj.tm_mon, time_obj.tm_wday, time_obj.tm_mday, time_obj.tm_hour, time_obj.tm_min, time_obj.tm_sec, 0 ] # new_time = [ time_obj.year, time_obj.month, time_obj.tm_wday, time_obj.tm_mday, time_obj.tm_hour, time_obj.tm_min, time_obj.tm_sec, 0] print "Updating clock to: date " + gps_sentence.datestamp + " time : " + gps_sentence.timestamp win32api.SetSystemTime(*new_time) except Exception, e: pass
def test_splits_data_1(self): test_data = '$foo,bar,baz*77\n$Meep,wibble,123,321\n' streamer = NMEAStream() result = streamer._split(test_data) self.assertEqual(result, ['foo,bar,baz*77', 'Meep,wibble,123,321'])
def test__get_type(self): streamer = NMEAStream() sentence = '$GPRMC,184332.07,A,1929.459,S,02410.381,E,74.00,16.78,210410,0.0,E,A*2B' sen_type = streamer._get_type(sentence) self.assertTrue(isinstance(sen_type(), GPRMC))