GPS-Code von NMEA0183 getrennt, NMEA0183 weiterprogrammiert
This commit is contained in:
		
							parent
							
								
									aefd01e0f9
								
							
						
					
					
						commit
						6214d08174
					
				
							
								
								
									
										68
									
								
								obp60v.py
								
								
								
								
							
							
						
						
									
										68
									
								
								obp60v.py
								
								
								
								
							|  | @ -77,7 +77,7 @@ Version  Datum       Änderung(en)                                           von | ||||||
| -------- ----------- ------------------------------------------------------ ---- | -------- ----------- ------------------------------------------------------ ---- | ||||||
| 0.1      2024-10-31  Entwicklung begonnen                                   tho | 0.1      2024-10-31  Entwicklung begonnen                                   tho | ||||||
| 0.2      2024-12-24  Veröffentlichung als Git-Repository                    tho | 0.2      2024-12-24  Veröffentlichung als Git-Repository                    tho | ||||||
| 
 | 0.3      2025        WIP                                                    tho  | ||||||
| 
 | 
 | ||||||
| """ | """ | ||||||
| 
 | 
 | ||||||
|  | @ -195,13 +195,56 @@ def rxd_n2k(device): | ||||||
|     bus.shutdown() |     bus.shutdown() | ||||||
| 
 | 
 | ||||||
| def rxd_0183(devname): | def rxd_0183(devname): | ||||||
|     # Prüfe ob Port vorhanden ist und sich öffnen läßt |     # Prüfe ob NMEA0183-Port vorhanden ist und sich öffnen läßt | ||||||
|     try: |     try: | ||||||
|         ser = serial.Serial(devname, 115200, timeout=3) |         ser = serial.Serial(devname, 115200, timeout=3) | ||||||
|     except serial.SerialException as e: |     except serial.SerialException as e: | ||||||
|         print("NMEA0183 serial port not available") |         print("NMEA0183 serial port not available") | ||||||
|         return |         return | ||||||
|     setthreadtitle("0183listener") |     setthreadtitle("0183listener") | ||||||
|  |     while not shutdown: | ||||||
|  |         try: | ||||||
|  |             raw = ser.readline().decode('ascii') | ||||||
|  |             msg = pynmea2.parse(raw) | ||||||
|  |         except pynmea2.nmea.ParseError: | ||||||
|  |             print(f"NMEA0183: Parse-Error: {raw}") | ||||||
|  |             continue | ||||||
|  |         # sentence_type kann fehlen  | ||||||
|  |         try: | ||||||
|  |             stype = msg.sentence_type | ||||||
|  |         except: | ||||||
|  |             print(f"NMEA0183: Sentence type missing: {raw}") | ||||||
|  |             continue | ||||||
|  |         if stype == 'GLL': | ||||||
|  |             boatdata.setValue("LAT", msg.latitude) | ||||||
|  |             boatdata.setValue("LON", msg.longitude) | ||||||
|  |         elif stype == 'VTG': | ||||||
|  |             boatdata.setValue("COG", int(msg.true_track)) | ||||||
|  |             #TODO klären was für Typen hier ankommen können | ||||||
|  |             # bytearray, str, decimal.Decimal? | ||||||
|  |             sog = float(msg.spd_over_grnd_kts) | ||||||
|  |             #str von OpenCPN: sog = float(msg.spd_over_grnd_kts[:-1]) | ||||||
|  |             boatdata.setValue("SOG", sog) | ||||||
|  |         elif stype == 'VHW': | ||||||
|  |             boatdata.setValue("STW", float(msg.water_speed_knots)) | ||||||
|  |         elif stype == 'WPL': | ||||||
|  |             # Wegepunkt | ||||||
|  |             print(msg.fields) | ||||||
|  |         elif stype == 'RTE': | ||||||
|  |             # Route | ||||||
|  |             print(msg.fields) | ||||||
|  |         else: | ||||||
|  |             print(msg) | ||||||
|  |     ser.close() | ||||||
|  | 
 | ||||||
|  | def rxd_gps(devname, devspeed): | ||||||
|  |     # Prüfe ob GPS-Port vorhanden ist und sich öffnen läßt | ||||||
|  |     try: | ||||||
|  |         ser = serial.Serial(devname, devspeed, timeout=3) | ||||||
|  |     except serial.SerialException as e: | ||||||
|  |         print("GPS serial port not available") | ||||||
|  |         return | ||||||
|  |     setthreadtitle("GPSlistener") | ||||||
|     while not shutdown: |     while not shutdown: | ||||||
|         try: |         try: | ||||||
|             msg = pynmea2.parse(ser.readline().decode('ascii')) |             msg = pynmea2.parse(ser.readline().decode('ascii')) | ||||||
|  | @ -210,19 +253,9 @@ def rxd_0183(devname): | ||||||
|         if msg.sentence_type == 'GLL': |         if msg.sentence_type == 'GLL': | ||||||
|             boatdata.setValue("LAT", msg.latitude) |             boatdata.setValue("LAT", msg.latitude) | ||||||
|             boatdata.setValue("LON", msg.longitude) |             boatdata.setValue("LON", msg.longitude) | ||||||
|         elif msg.sentence_type == 'VTG': |  | ||||||
|             boatdata.setValue("COG", int(msg.true_track)) |  | ||||||
|             boatdata.setValue("SOG", float(msg.spd_over_grnd_kts[:-1])) |  | ||||||
|         elif msg.sentence_type == 'VHW': |  | ||||||
|             boatdata.setValue("STW", float(msg.water_speed_knots)) |  | ||||||
|         elif msg.sentence_type == 'WPL': |  | ||||||
|             # Wegepunkt |  | ||||||
|             print(msg.fields) |  | ||||||
|         elif msg.sentence_type == 'RTE': |  | ||||||
|             # Route |  | ||||||
|             print(msg.fields) |  | ||||||
|         else: |         else: | ||||||
|             print(msg) |             print(msg) | ||||||
|  |             print(msg.fields) | ||||||
|     ser.close() |     ser.close() | ||||||
| 
 | 
 | ||||||
| def datareader(histpath, history): | def datareader(histpath, history): | ||||||
|  | @ -274,10 +307,6 @@ def datareader(histpath, history): | ||||||
|             for k, v in history.series.items(): |             for k, v in history.series.items(): | ||||||
|                 if n % k == 0: |                 if n % k == 0: | ||||||
|                     v.add(pval) |                     v.add(pval) | ||||||
|         # Lokales GPS abfragen |  | ||||||
|         # TODO |  | ||||||
|         if cfg['gps']: |  | ||||||
|             pass |  | ||||||
|         n += 1 |         n += 1 | ||||||
| 
 | 
 | ||||||
|     for s in history.series.values(): |     for s in history.series.values(): | ||||||
|  | @ -663,6 +692,9 @@ if __name__ == "__main__": | ||||||
|     if cfg['nmea0183']: |     if cfg['nmea0183']: | ||||||
|         t_rxd_0183 = threading.Thread(target=rxd_0183, args=(cfg['0183_port'],)) |         t_rxd_0183 = threading.Thread(target=rxd_0183, args=(cfg['0183_port'],)) | ||||||
|         t_rxd_0183.start() |         t_rxd_0183.start() | ||||||
|  |     if cfg['gps']: | ||||||
|  |         t_rxd_gps = threading.Thread(target=rxd_gps, args=(cfg['gps_port'],)) | ||||||
|  |         t_rxd_gps.start() | ||||||
|     if not cfg['simulation']: |     if not cfg['simulation']: | ||||||
|         t_data = threading.Thread(target=datareader, args=(cfg['histpath'], history)) |         t_data = threading.Thread(target=datareader, args=(cfg['histpath'], history)) | ||||||
|         t_data.start() |         t_data.start() | ||||||
|  | @ -674,6 +706,8 @@ if __name__ == "__main__": | ||||||
|         t_rxd_n2k.join() |         t_rxd_n2k.join() | ||||||
|     if cfg['nmea0183']: |     if cfg['nmea0183']: | ||||||
|         t_rxd_0183.join() |         t_rxd_0183.join() | ||||||
|  |     if cfg['gps']: | ||||||
|  |         t_rxd_gps.join() | ||||||
|     if not cfg['simulation']: |     if not cfg['simulation']: | ||||||
|         t_data.join() |         t_data.join() | ||||||
|     print("Another fine product of the Sirius Cybernetics Corporation.") |     print("Another fine product of the Sirius Cybernetics Corporation.") | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue