Arbeit an Ankerseite und NMEA0183
This commit is contained in:
		
							parent
							
								
									df04c9ad8e
								
							
						
					
					
						commit
						9e4622aeef
					
				
							
								
								
									
										49
									
								
								nmea0183.py
								
								
								
								
							
							
						
						
									
										49
									
								
								nmea0183.py
								
								
								
								
							|  | @ -6,16 +6,22 @@ NMEA0183 verarbeiten | ||||||
| def DBS(boatdata, msg): | def DBS(boatdata, msg): | ||||||
|     # Wassertiefe unter der Oberfläche |     # Wassertiefe unter der Oberfläche | ||||||
|     pass |     pass | ||||||
|  |     #boatdata.setValue("DBS", msg.depth) | ||||||
| 
 | 
 | ||||||
| def DBT(boatdata, msg): | def DBT(boatdata, msg): | ||||||
|     # Wassertiefe unter Geber |     # Wassertiefe unter Geber | ||||||
|     pass |     pass | ||||||
|  |     #boatdata.setValue("DBT", msg.depth) | ||||||
| 
 | 
 | ||||||
| def GLL(boatdata, msg): | def GLL(boatdata, msg): | ||||||
|     print("-> GLL") |     print("-> GLL") | ||||||
|     boatdata.setValue("LAT", msg.latitude) |     boatdata.setValue("LAT", msg.latitude) | ||||||
|     boatdata.setValue("LON", msg.longitude) |     boatdata.setValue("LON", msg.longitude) | ||||||
| 
 | 
 | ||||||
|  | def GSV(boatdata, msg): | ||||||
|  |     # Satellites in view | ||||||
|  |     print("-> GSV") | ||||||
|  | 
 | ||||||
| def HDT(boatdata, msg): | def HDT(boatdata, msg): | ||||||
|     # Heading True |     # Heading True | ||||||
|     print("-> HDT") |     print("-> HDT") | ||||||
|  | @ -27,6 +33,22 @@ def MWV(boatdata, msg): | ||||||
|     boatdata.setValue("AWA", msg.wind_angle) |     boatdata.setValue("AWA", msg.wind_angle) | ||||||
|     boatdata.setValue("AWS", msg.wind_speed) |     boatdata.setValue("AWS", msg.wind_speed) | ||||||
| 
 | 
 | ||||||
|  | def MTW(boatdata, msg): | ||||||
|  |     # Wassertemperatur | ||||||
|  |     # boatdata.setValue("WTemp", msg.xxx) | ||||||
|  |     print("-> MTW Wassertemperatur") | ||||||
|  | 
 | ||||||
|  | def RMB(boatdata, msg): | ||||||
|  |     # Recommended Minimum Navigation Information | ||||||
|  |     # Informationen bzgl. Erreichen des nächsten Wegepunkts | ||||||
|  |     # | ||||||
|  |     print("-> RMB") | ||||||
|  | 
 | ||||||
|  | def RMC(boatdata, msg): | ||||||
|  |     print("-> RMC") | ||||||
|  |     #boatdata.setValue("LAT", msg.lat) | ||||||
|  |     #boatdata.setValue("LON", msg.lon) | ||||||
|  | 
 | ||||||
| def RSA(boatdata, msg): | def RSA(boatdata, msg): | ||||||
|     # Rudder Sensor Angle |     # Rudder Sensor Angle | ||||||
|     # negative Werte bedeuten Backbord |     # negative Werte bedeuten Backbord | ||||||
|  | @ -39,6 +61,9 @@ def RTE(boatdata, msg): | ||||||
|     print("-> RTE") |     print("-> RTE") | ||||||
|     print(msg.fields) |     print(msg.fields) | ||||||
| 
 | 
 | ||||||
|  | def VBW(boatdata, msg): | ||||||
|  |     print("-> VBW") | ||||||
|  | 
 | ||||||
| def VHW(boatdata, msg): | def VHW(boatdata, msg): | ||||||
|     boatdata.setValue("STW", float(msg.water_speed_knots)) |     boatdata.setValue("STW", float(msg.water_speed_knots)) | ||||||
| 
 | 
 | ||||||
|  | @ -54,16 +79,38 @@ def WPL(boatdata, msg): | ||||||
|     print("-> WPL") |     print("-> WPL") | ||||||
|     print(msg.fields) |     print(msg.fields) | ||||||
| 
 | 
 | ||||||
|  | def XTE(boatdata, msg): | ||||||
|  |     # Cross Track error measured | ||||||
|  |     print("-> XTE") | ||||||
|  | 
 | ||||||
|  | def XTR(boatdata, msg): | ||||||
|  |     # Cross Track error gekoppelt | ||||||
|  |     print("-> XTR") | ||||||
|  | 
 | ||||||
|  | def ZDA(boatdata, msg): | ||||||
|  |     # Time and date | ||||||
|  |     print("-> XTE") | ||||||
|  |     #boatdata.gpsd | ||||||
|  |     #boatdata.gpst | ||||||
|  | 
 | ||||||
| # Aus Performancegründen eine direkte Sprungtabelle, ggf. können | # Aus Performancegründen eine direkte Sprungtabelle, ggf. können | ||||||
| # zukünftig außer der Funktion noch weitere Daten gespeichert werdeb | # zukünftig außer der Funktion noch weitere Daten gespeichert werdeb | ||||||
| decoder = { | decoder = { | ||||||
|     "DBS": DBS, |     "DBS": DBS, | ||||||
|     "DBT": DBT, |     "DBT": DBT, | ||||||
|     "GLL": GLL, |     "GLL": GLL, | ||||||
|  |     "GSV": GSV, | ||||||
|     "MWV": MWV, |     "MWV": MWV, | ||||||
|  |     "MTW": MTW, | ||||||
|  |     "RMB": RMB, | ||||||
|  |     "RMC": RMC, | ||||||
|     "RSA": RSA, |     "RSA": RSA, | ||||||
|     "RTE": RTE, |     "RTE": RTE, | ||||||
|  |     "VBW": VBW, | ||||||
|     "VHW": VHW, |     "VHW": VHW, | ||||||
|     "VTG": VTG, |     "VTG": VTG, | ||||||
|     "WPL": WPL |     "WPL": WPL, | ||||||
|  |     "XTE": XTE, | ||||||
|  |     "XTR": XTR, | ||||||
|  |     "ZDA": ZDA | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -9,10 +9,20 @@ Daten | ||||||
|   - aktuelle Position des Schiffs |   - aktuelle Position des Schiffs | ||||||
|   - aktuelle Wassertiefe an Schiffsposition |   - aktuelle Wassertiefe an Schiffsposition | ||||||
|   - aktuelle Schiffsausrichtung bearing/heading |   - aktuelle Schiffsausrichtung bearing/heading | ||||||
|   - aktuelle Windrichtung |   - aktuelle Windrichtung (wahr) | ||||||
|   - aktuelle Windstärke |   - aktuelle Windstärke (wahr) | ||||||
|   - Alarm aktiv J/N |   - Alarm aktiv J/N | ||||||
|   - Alarmradius |   - Alarmradius | ||||||
|  |   - GPS Abweichung/ Fehler in der Horizontalen | ||||||
|  | 
 | ||||||
|  | Darstellung: | ||||||
|  |   - Modi:  | ||||||
|  |   - Anker oben / unten | ||||||
|  |   - Nord ist oben  | ||||||
|  | 
 | ||||||
|  | Es gibt verschiedene Unterseiten | ||||||
|  |   - Normalansicht | ||||||
|  |   - Konfigurationsseite | ||||||
| 
 | 
 | ||||||
| """ | """ | ||||||
| 
 | 
 | ||||||
|  | @ -26,9 +36,13 @@ class Anchor(Page): | ||||||
|     def __init__(self, pageno, cfg, boatdata): |     def __init__(self, pageno, cfg, boatdata): | ||||||
|         super().__init__(pageno, cfg, boatdata) |         super().__init__(pageno, cfg, boatdata) | ||||||
|         self.sym_anchor = cairo.ImageSurface.create_from_png(os.path.join(cfg['imgpath'], "anchor.png")) |         self.sym_anchor = cairo.ImageSurface.create_from_png(os.path.join(cfg['imgpath'], "anchor.png")) | ||||||
|         self.buttonlabel[1] = 'DEC' |         self.buttonlabel[1] = 'MODE' | ||||||
|         self.buttonlabel[2] = 'INC' |         self.buttonlabel[2] = 'SET' | ||||||
|         self.buttonlabel[5] = 'SET' |         self.buttonlabel[5] = 'ALARM' | ||||||
|  | 
 | ||||||
|  |         self.mode = 'N' # (N)ormal, (C)onfiguration | ||||||
|  | 
 | ||||||
|  |         self._bd = boatdata | ||||||
| 
 | 
 | ||||||
|         # Der sinnvolle Abstand ist abhängig von der Länge der gesteckten Kette |         # Der sinnvolle Abstand ist abhängig von der Länge der gesteckten Kette | ||||||
|         # Die initial eingegebene Position des Ankers sollte nactträglich justiert |         # Die initial eingegebene Position des Ankers sollte nactträglich justiert | ||||||
|  | @ -36,6 +50,7 @@ class Anchor(Page): | ||||||
| 
 | 
 | ||||||
|         self.chain_length = 60 # maximale Länge die ausgesteckt werden kann |         self.chain_length = 60 # maximale Länge die ausgesteckt werden kann | ||||||
|         self.chain = 35 # aktuell gesteckte Länge |         self.chain = 35 # aktuell gesteckte Länge | ||||||
|  |         self.anchor_set = False | ||||||
|         self.anchor_lat = 0 |         self.anchor_lat = 0 | ||||||
|         self.anchor_lon = 0 |         self.anchor_lon = 0 | ||||||
|         self.anchor_depth = -1 |         self.anchor_depth = -1 | ||||||
|  | @ -44,12 +59,50 @@ class Anchor(Page): | ||||||
|         self.heading = -1 |         self.heading = -1 | ||||||
|         self.depth = -1 |         self.depth = -1 | ||||||
|         self.alarm_range = 20 |         self.alarm_range = 20 | ||||||
|         self.alarm_armed = False |         self.alarm_enabled = False | ||||||
|         self.alarm = False # Alarm ist ausgelöst und aktiv |         self.alarm = False # Alarm ist ausgelöst und aktiv | ||||||
|         self.wind_angle = -1 |         self.wind_angle = -1 | ||||||
| 
 | 
 | ||||||
|  |     def handle_key(self, buttonid): | ||||||
|  |         if buttonid == 1: | ||||||
|  |             if self.mode == 'N': | ||||||
|  |                 self.mode = 'C' | ||||||
|  |             else: | ||||||
|  |                 self.mode = 'N' | ||||||
|  |             return True | ||||||
|  |         if buttonid == 2: | ||||||
|  |             if not self.anchor_set: | ||||||
|  |                 self.anchor_lat = self._bd.lat | ||||||
|  |                 self.anchor_lon = self._bd.lon | ||||||
|  |                 self.anchor_set = True | ||||||
|  |             else: | ||||||
|  |                 self.anchor_set = False | ||||||
|  |         if self.buttonid == 5: | ||||||
|  |             # Bei aktivem Alarm kann mit dieser Taste der Alarm zurückgesetzt | ||||||
|  |             # werden | ||||||
|  |             if self.alarm: | ||||||
|  |                 self.alarm = False | ||||||
|  |                 self.buttonlabel[5] = 'ALARM' | ||||||
|  |             if self.alarm_enabled: | ||||||
|  |                 self.alarm_enabled = False | ||||||
|  |                 self.buttonlabel[5] = 'ALARM' | ||||||
|  |             else: | ||||||
|  |                 self.buttonlabel[5] = 'OFF' | ||||||
|  |         return False | ||||||
|  | 
 | ||||||
|     def draw(self, ctx): |     def draw(self, ctx): | ||||||
| 
 | 
 | ||||||
|  |         """ | ||||||
|  |         value1 = LAT | ||||||
|  |         value2 = LON | ||||||
|  |         value3 = HDOP | ||||||
|  |         value4 = DBS | ||||||
|  |         value5 = TWD | ||||||
|  |         value6 = TWS | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  |         # self.anchor_lat = | ||||||
|  | 
 | ||||||
|         # Name |         # Name | ||||||
|         ctx.select_font_face("Ubuntu", cairo.FontSlant.NORMAL, cairo.FontWeight.BOLD) |         ctx.select_font_face("Ubuntu", cairo.FontSlant.NORMAL, cairo.FontWeight.BOLD) | ||||||
|         ctx.set_font_size(20) |         ctx.set_font_size(20) | ||||||
|  | @ -63,10 +116,9 @@ class Anchor(Page): | ||||||
|         ctx.move_to(2, 70) |         ctx.move_to(2, 70) | ||||||
|         ctx.show_text("Alarm: off") |         ctx.show_text("Alarm: off") | ||||||
|         ctx.move_to(320, 70) |         ctx.move_to(320, 70) | ||||||
|         ctx.show_text("45 m") |         ctx.show_text(f"{self.chain} m") | ||||||
|         ctx.stroke() |         ctx.stroke() | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
|         # Spezialseite |         # Spezialseite | ||||||
|         cx = 200 |         cx = 200 | ||||||
|         cy = 150 |         cy = 150 | ||||||
|  | @ -80,3 +132,17 @@ class Anchor(Page): | ||||||
|         ctx.set_source_surface(self.sym_anchor, cx-8, cy-8) |         ctx.set_source_surface(self.sym_anchor, cx-8, cy-8) | ||||||
|         ctx.paint() |         ctx.paint() | ||||||
|         ctx.restore() |         ctx.restore() | ||||||
|  | 
 | ||||||
|  |         # Boot zeichnen | ||||||
|  |         # Heading beachten | ||||||
|  |          | ||||||
|  | 
 | ||||||
|  |         # Windpfeil zeichnen | ||||||
|  |         # TWD / TWS  | ||||||
|  |         # boatdata.value(TWD) | ||||||
|  |         p = ((cx, cy - r + 25), (cx - 12, cy - r - 4), (cx, cy - r + 6), (cx + 12, cy - r - 4), (cx, cy - r + 25)) | ||||||
|  |         wind = self.rotate((cx, cy), p, 62) | ||||||
|  |         ctx.move_to(*wind[0]) | ||||||
|  |         for point in wind[1:]: | ||||||
|  |             ctx.line_to(*point) | ||||||
|  |         ctx.fill() | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue