Appdata für Header, Flaggensymbole laden
This commit is contained in:
		
							parent
							
								
									f3c9ced477
								
							
						
					
					
						commit
						766b191109
					
				
							
								
								
									
										35
									
								
								appdata.py
								
								
								
								
							
							
						
						
									
										35
									
								
								appdata.py
								
								
								
								
							|  | @ -2,13 +2,48 @@ | |||
| Generische Applikationsdaten | ||||
| 
 | ||||
| """ | ||||
| 
 | ||||
| import os | ||||
| from tracker import Tracker | ||||
| 
 | ||||
| class AppData(): | ||||
| 
 | ||||
|     def __init__(self): | ||||
|         self.shutdown = False # Globaler Ausschalter | ||||
|         self.track = Tracker('NONE') | ||||
|         self.frontend = None | ||||
| 
 | ||||
|         # Für u.a. Header-Indikatoren | ||||
|         # TODO | ||||
|         self.status = { | ||||
|             'AP': False,    # Accesspoint | ||||
|             'WIFI': False,  # Wireless Client | ||||
|             'TCP': False,   # TCP Network | ||||
|             'N2K': False,   # NMEA2000 | ||||
|             '183': False,   # NMEA0183 | ||||
|             'USB': False,   # USB Datenverbindung | ||||
|             'GPS': False,   # GPS-Fix und -daten | ||||
|             'TRK': False    # Tracker | ||||
|         } | ||||
| 
 | ||||
|     def setFrontend(self, frontend): | ||||
|         self.frontend = frontend # Referenz zur GUI | ||||
| 
 | ||||
|     def refreshStatus(self): | ||||
|         self.status['AP'] = False | ||||
| 
 | ||||
|         self.status['TCP'] = False | ||||
|         self.status['WIFI'] = False | ||||
|         for intf in os.listdir('/sys/class/net'): | ||||
|             statefile = os.path.join('/sys/class/net', interface, 'operstate') | ||||
|             wififile = os.path.join('/sys/class/net', interface, 'wireless') | ||||
|             if os.path.exists(statefile): | ||||
|                 with open(statefile) as fh: | ||||
|                     state = f.read().strip() | ||||
|                 if state == 'up': | ||||
|                     if os.path.exists(wififile): | ||||
|                         self.status['WIFI'] = True | ||||
|                     else: | ||||
|                         self.status['TCP'] = True | ||||
| 
 | ||||
|         self.status['TRK'] = self.track.is_active() | ||||
|  |  | |||
|  | @ -235,6 +235,7 @@ def rxd_gps(devname, devspeed): | |||
| def rxd_network(address, port): | ||||
|     # WIP Daten über Netzwerk empfangen | ||||
|     # Wir verwenden UDP. Ein verlorenes Paket tut uns nicht weh. | ||||
|     setthreadtitle("NETlistener") | ||||
|     sock = socket.socket() | ||||
|     sock.connect((address, port)) | ||||
|     while not appdata.shutdown: | ||||
|  | @ -610,7 +611,7 @@ def init_profile(config, cfg, boatdata): | |||
|             if n >= pages_max: | ||||
|                 break | ||||
|     clist = { | ||||
|         0: pages.System(0, cfg, boatdata) | ||||
|         0: pages.System(0, cfg, appdata, boatdata) | ||||
|     } | ||||
|     for i, p in pagedef.items(): | ||||
|         try: | ||||
|  |  | |||
|  | @ -37,7 +37,7 @@ from .page import Page | |||
| class Anchor(Page): | ||||
| 
 | ||||
|     def __init__(self, pageno, cfg, appdata, boatdata): | ||||
|         super().__init__(pageno, cfg, boatdata) | ||||
|         super().__init__(pageno, cfg, appdata, boatdata) | ||||
|         self.sym_anchor = cairo.ImageSurface.create_from_png(os.path.join(cfg['imgpath'], "anchor.png")) | ||||
|         self.buttonlabel[1] = 'MODE' | ||||
|         self.buttonlabel[2] = 'DROP' | ||||
|  |  | |||
|  | @ -6,7 +6,7 @@ from .page import Page | |||
| class ApparentWind(Page): | ||||
| 
 | ||||
|     def __init__(self, pageno, cfg, appdata, boatdata): | ||||
|         super().__init__(pageno, cfg, boatdata) | ||||
|         super().__init__(pageno, cfg, appdata, boatdata) | ||||
|         self.buttonlabel[1] = 'MODE' | ||||
|         self.mode = 'L' # (W)ind (L)ens | ||||
|         try: | ||||
|  |  | |||
|  | @ -12,7 +12,7 @@ from .page import Page | |||
| class Autobahn(Page): | ||||
| 
 | ||||
|     def __init__(self, pageno, cfg, appdata, boatdata): | ||||
|         super().__init__(pageno, cfg, boatdata) | ||||
|         super().__init__(pageno, cfg, appdata, boatdata) | ||||
|         self.xte = self.bd.getRef("XTE") | ||||
|         self.cog = self.bd.getRef("COG") | ||||
|         self.btw = self.bd.getRef("BTW") | ||||
|  |  | |||
|  | @ -41,7 +41,7 @@ from .page import Page | |||
| class Barograph(Page): | ||||
| 
 | ||||
|     def __init__(self, pageno, cfg, appdata, boatdata): | ||||
|         super().__init__(pageno, cfg, boatdata) | ||||
|         super().__init__(pageno, cfg, appdata, boatdata) | ||||
|         # Meßwert alle 15 Minuten:  | ||||
|         # 84 Stunden * 4 Werte je Stunde = 336 Meßwerte | ||||
|         self.bd = boatdata | ||||
|  |  | |||
|  | @ -23,7 +23,7 @@ import nmea2000.lookup | |||
| class Fluid(Page): | ||||
| 
 | ||||
|     def __init__(self, pageno, cfg, appdata, boatdata, fluidtype): | ||||
|         super().__init__(pageno, cfg, boatdata) | ||||
|         super().__init__(pageno, cfg, appdata, boatdata) | ||||
|         self.fluidtype = int(fluidtype) | ||||
|         if self.fluidtype == 0: | ||||
|             self.symbol = cairo.ImageSurface.create_from_png(os.path.join(cfg['imgpath'], "fuelpump.png")) | ||||
|  |  | |||
|  | @ -21,7 +21,7 @@ from .page import Page | |||
| class FourValues(Page): | ||||
| 
 | ||||
|     def __init__(self, pageno, cfg, appdata, boatdata, boatvalue1, boatvalue2, boatvalue3, boatvalue4): | ||||
|         super().__init__(pageno, cfg, boatdata) | ||||
|         super().__init__(pageno, cfg, appdata, boatdata) | ||||
|         self.value1 = boatvalue1 | ||||
|         self.value2 = boatvalue2 | ||||
|         self.value3 = boatvalue3 | ||||
|  |  | |||
|  | @ -19,7 +19,7 @@ from .page import Page | |||
| class FourValues2(Page): | ||||
| 
 | ||||
|     def __init__(self, pageno, cfg, appdata, boatdata, boatvalue1, boatvalue2, boatvalue3, boatvalue4): | ||||
|         super().__init__(pageno, cfg, boatdata) | ||||
|         super().__init__(pageno, cfg, appdata, boatdata) | ||||
|         self.value1 = boatvalue1 | ||||
|         self.value2 = boatvalue2 | ||||
|         self.value3 = boatvalue3 | ||||
|  |  | |||
|  | @ -16,7 +16,7 @@ from .page import Page | |||
| class Keel(Page): | ||||
| 
 | ||||
|     def __init__(self, pageno, cfg, appdata, boatdata): | ||||
|         super().__init__(pageno, cfg, boatdata) | ||||
|         super().__init__(pageno, cfg, appdata, boatdata) | ||||
|         # Wert für Kielrotation | ||||
|         self.valref = self.bd.getRef("xdrRotK") | ||||
| 
 | ||||
|  |  | |||
|  | @ -4,7 +4,7 @@ from .page import Page | |||
| class OneValue(Page): | ||||
| 
 | ||||
|     def __init__(self, pageno, cfg, appdata, boatdata, boatvalue): | ||||
|         super().__init__(pageno, cfg, boatdata) | ||||
|         super().__init__(pageno, cfg, appdata, boatdata) | ||||
|         self.ref1 = self.bd.getRef(boatvalue) | ||||
| 
 | ||||
|     def draw(self, ctx): | ||||
|  |  | |||
|  | @ -64,10 +64,11 @@ class Page(): | |||
|         c = 2 * asin(sqrt(a)) | ||||
|         return c * 3440 | ||||
| 
 | ||||
|     def __init__(self, pageno, cfg, boatdata): | ||||
|     def __init__(self, pageno, cfg, appdata, boatdata): | ||||
|         self.pageno = pageno | ||||
|         self.cfg = cfg | ||||
|         self.fullscreen = cfg['guistyle'] == 'fullscreen' | ||||
|         self.appdata = appdata | ||||
|         self.bd = boatdata | ||||
|         self.header = True | ||||
|         self.footer = True | ||||
|  | @ -126,7 +127,7 @@ class Page(): | |||
| 
 | ||||
|     def draw_header(self, ctx): | ||||
|         """ | ||||
|         Mögliche Zeichen für aktivierte Funktionen | ||||
|         Mögliche Zeichen für aktivierte Funktionen (max. 8) | ||||
|           AP - Accesspoint ist aktiv | ||||
|           WIFI - WIFI-Client | ||||
|           TCP | ||||
|  | @ -134,6 +135,7 @@ class Page(): | |||
|           183  | ||||
|           USB | ||||
|           GPS - GPS Fix vorhanden | ||||
|           TRK - Tracking aktiv | ||||
|           # TODO Umstellung auf Symbole je 16 Pixel zum Platz sparen | ||||
|           Neu: Nummer der aktiven Seite (1 - 10) | ||||
|         """ | ||||
|  | @ -143,6 +145,10 @@ class Page(): | |||
|         ctx.show_text(f"N2K GPS") | ||||
|         ctx.stroke() | ||||
| 
 | ||||
|         # AP: Nicht implementiert | ||||
|         # WIFI:  | ||||
|         # /proc/net/wireless | ||||
| 
 | ||||
|         # Tastenstatus | ||||
|         ctx.save() | ||||
|         if self.keylock: | ||||
|  |  | |||
|  | @ -5,7 +5,7 @@ from .page import Page | |||
| class Rudder(Page): | ||||
| 
 | ||||
|     def __init__(self, pageno, cfg, appdata, boatdata): | ||||
|         super().__init__(pageno, cfg, boatdata) | ||||
|         super().__init__(pageno, cfg, appdata, boatdata) | ||||
|         self.buttonlabel[1] = 'MODE' | ||||
|         self.mode = 'P' | ||||
|         # Werte für Ruderausschlag | ||||
|  |  | |||
|  | @ -20,7 +20,7 @@ class SixValues(Page): | |||
| 
 | ||||
|     def __init__(self, pageno, cfg, appdata, boatdata, boatvalue1, boatvalue2, | ||||
|                  boatvalue3, boatvalue4, boatvalue5, boatvalue6): | ||||
|         super().__init__(pageno, cfg, boatdata) | ||||
|         super().__init__(pageno, cfg, appdata, boatdata) | ||||
|         self.value1 = boatvalue1 | ||||
|         self.value2 = boatvalue2 | ||||
|         self.value3 = boatvalue3 | ||||
|  |  | |||
|  | @ -15,7 +15,7 @@ from .page import Page | |||
| class SkyView(Page): | ||||
| 
 | ||||
|     def __init__(self, pageno, cfg, appdata, boatdata): | ||||
|         super().__init__(pageno, cfg, boatdata) | ||||
|         super().__init__(pageno, cfg, appdata, boatdata) | ||||
| 
 | ||||
|     def pol2cart(azimut, elevation): | ||||
|         ''' | ||||
|  |  | |||
|  | @ -4,8 +4,8 @@ import datetime | |||
| 
 | ||||
| class System(Page): | ||||
| 
 | ||||
|     def __init__(self, pageno, cfg, boatdata): | ||||
|         super().__init__(pageno, cfg, boatdata) | ||||
|     def __init__(self, pageno, cfg, appdata, boatdata): | ||||
|         super().__init__(pageno, cfg, appdata, boatdata) | ||||
|         self.buttonlabel[1] = 'MODE' | ||||
|         self.buttonlabel[2] = 'STBY' | ||||
|         self.mode = ('I', 'N') # (I)nformation (N)MEA2000 Device List | ||||
|  |  | |||
|  | @ -4,7 +4,7 @@ from .page import Page | |||
| class ThreeValues(Page): | ||||
| 
 | ||||
|     def __init__(self, pageno, cfg, appdata, boatdata, boatvalue1, boatvalue2, boatvalue3): | ||||
|         super().__init__(pageno, cfg, boatdata) | ||||
|         super().__init__(pageno, cfg, appdata, boatdata) | ||||
|         self.ref1 = self.bd.getRef(boatvalue1) | ||||
|         self.ref2 = self.bd.getRef(boatvalue2) | ||||
|         self.ref3 = self.bd.getRef(boatvalue3) | ||||
|  |  | |||
|  | @ -1,22 +1,32 @@ | |||
| """ | ||||
| Tracker with MQTT client | ||||
| Tracker mit MQTT client | ||||
| 
 | ||||
| Es gibt zwei Modi: Track und Race | ||||
|   A) Track: Es wird nur der Track gesended / aufgezeichnet | ||||
|   B) Race: Es werden zusätzlich Regattadaten angezeigt, das beinhaltet | ||||
|     die Auswahl einer Regatta, das Teilnehmen, das Aufgeben und die | ||||
|     Signalisierung vor und während einer Wettfahrt. | ||||
| 
 | ||||
|   Das Tracking kann über eine Taste ein- und ausgeschaltet werden. | ||||
|   Um versehentliches Umschalten zu vermeiden ist eine Nachfrage | ||||
|   integriert. | ||||
| 
 | ||||
|  - currentry only Ragatta hero supported | ||||
| 
 | ||||
|  TODO get data from mqtt thread | ||||
| 
 | ||||
| Verbindungsabbrüche | ||||
| Behandlung von Verbindungsabbrüchen: | ||||
|   - on_disconnect | ||||
|    | ||||
| 
 | ||||
| """ | ||||
| 
 | ||||
| import os | ||||
| import cairo | ||||
| from .page import Page | ||||
| 
 | ||||
| class Tracker(Page): | ||||
| 
 | ||||
|     def __init__(self, pageno, cfg, appdata, boatdata): | ||||
|         super().__init__(pageno, cfg, boatdata) | ||||
|         super().__init__(pageno, cfg, appdata, boatdata) | ||||
|         self._appdata = appdata | ||||
|         self.bv_lat = boatdata.getRef("LAT") | ||||
|         self.bv_lon = boatdata.getRef("LON") | ||||
|  | @ -25,6 +35,20 @@ class Tracker(Page): | |||
|         self.buttonlabel[2] = 'ON' | ||||
|         self.mode = 'N' # (N)ormal, (C)onfiguration | ||||
| 
 | ||||
|         # Flaggengröße: 96 x 64 Pixel | ||||
|         self.flagpos = ((208, 140), (308, 140), (208, 210), (308, 210)) | ||||
| 
 | ||||
|         # Flaggen laden | ||||
|         flag = ('alpha', 'answer', 'black', 'blue', 'charlie', 'class', | ||||
|                 'finish', 'hotel', 'india', 'november', 'orange',  | ||||
|                 'papa', 'repeat_one', 'sierra', 'start', 'uniform', | ||||
|                 'xray', 'yankee', 'zulu') | ||||
|         self.sym_flag = {} | ||||
|         for f in flag: | ||||
|             flagfile = os.path.join(cfg['imgpath'], 'flags', f + '.png') | ||||
|             self.sym_flag[f] = cairo.ImageSurface.create_from_png(flagfile) | ||||
|         print(self.sym_flag) | ||||
| 
 | ||||
|     def handle_key(self, buttonid): | ||||
|         if buttonid == 1: | ||||
|             # Modus umschalten | ||||
|  | @ -47,47 +71,57 @@ class Tracker(Page): | |||
| 
 | ||||
|     def draw_normal(self, ctx): | ||||
|         # Name | ||||
|         ctx.select_font_face("Ubuntu", cairo.FontSlant.NORMAL, cairo.FontWeight.BOLD) | ||||
|         ctx.set_font_size(32)  | ||||
|         ctx.move_to(20, 80) | ||||
|         ctx.show_text("Tracker") | ||||
|         #ctx.select_font_face("Ubuntu", cairo.FontSlant.NORMAL, cairo.FontWeight.BOLD) | ||||
|         #ctx.set_font_size(32)  | ||||
|         #ctx.move_to(20, 80) | ||||
|         #ctx.show_text("Tracker") | ||||
| 
 | ||||
|         ctx.select_font_face("DSEG7 Classic") | ||||
|         ctx.set_font_size(80) | ||||
| 
 | ||||
|         if self._appdata.track.is_active(): | ||||
|             ctx.move_to(20, 120) | ||||
|             ctx.show_text("-00:00") | ||||
|         else: | ||||
|             ctx.move_to(100, 120) | ||||
|             ctx.show_text("off") | ||||
| 
 | ||||
|         x0 = 8 | ||||
|         x1 = 104 | ||||
|         y0 = 150 | ||||
|         ctx.select_font_face("Ubuntu", cairo.FontSlant.NORMAL, cairo.FontWeight.BOLD) | ||||
|         ctx.set_font_size(16) | ||||
|         ctx.move_to(20, 120) | ||||
|         ctx.move_to(x0, y0) | ||||
|         ctx.show_text("Type: ") | ||||
|         ctx.move_to(x1, y0) | ||||
|         ctx.show_text(self._appdata.track.ttype) | ||||
| 
 | ||||
|         ctx.move_to(20, 140) | ||||
|         ctx.show_text("active: ") | ||||
|         if self._appdata.track.is_active(): | ||||
|             ctx.show_text("yes") | ||||
|         else: | ||||
|             ctx.show_text("no") | ||||
|         ctx.move_to(x0, y0 + 16) | ||||
|         ctx.show_text("Regatta") | ||||
|         ctx.move_to(x1, y0 + 16) | ||||
|         ctx.show_text('') | ||||
| 
 | ||||
|         ctx.move_to(20, 160) | ||||
|         ctx.move_to(x0, y0 + 32) | ||||
|         ctx.show_text("Lat=") | ||||
|         ctx.move_to(x1, y0 + 32) | ||||
|         ctx.show_text(self.bv_lat.format()) | ||||
|         ctx.move_to(20, 180) | ||||
| 
 | ||||
|         ctx.move_to(x0, y0 + 48) | ||||
|         ctx.show_text("Lon=") | ||||
|         ctx.move_to(x1, y0 + 48) | ||||
|         ctx.show_text(self.bv_lon.format()) | ||||
|         ctx.move_to(20, 200) | ||||
| 
 | ||||
|         ctx.move_to(x0, y0 + 64) | ||||
|         ctx.show_text("Sog=") | ||||
|         ctx.move_to(x1, y0 + 64) | ||||
|         ctx.show_text(self.bv_sog.format()) | ||||
| 
 | ||||
|         # Ausgewählte Regatta (raceid) | ||||
|         x = 250 | ||||
|         y = 100 | ||||
|         ctx.move_to(x, y - 24) | ||||
|         ctx.show_text("Regatta: ") | ||||
|         # if ... | ||||
|         # else | ||||
|         # "not selected" | ||||
| 
 | ||||
|     def draw_config(self, ctx): | ||||
| 
 | ||||
|         ctx.select_font_face("Ubuntu", cairo.FontSlant.NORMAL, cairo.FontWeight.BOLD) | ||||
|         ctx.set_font_size(32)  | ||||
|         ctx.move_to(20, 80) | ||||
|         ctx.show_text("Tracker config") | ||||
|         ctx.show_text("Tracker configuration") | ||||
|         # Daten aus Konfiguration anzeigen | ||||
|         # - boot | ||||
|         # - tracker | ||||
|  | @ -109,7 +143,6 @@ class Tracker(Page): | |||
|             ctx.show_text("keine") | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|         ctx.move_to(20, 120) | ||||
|         ctx.show_text("Type: ") | ||||
|         ctx.show_text(self._appdata.track.ttype) | ||||
|  |  | |||
|  | @ -17,7 +17,7 @@ from .page import Page | |||
| class TwoValues(Page): | ||||
| 
 | ||||
|     def __init__(self, pageno, cfg, appdata, boatdata, boatvalue1, boatvalue2): | ||||
|         super().__init__(pageno, cfg, boatdata) | ||||
|         super().__init__(pageno, cfg, appdata, boatdata) | ||||
|         self.ref1 = self.bd.getRef(boatvalue1) | ||||
|         self.ref2 = self.bd.getRef(boatvalue2) | ||||
|         #print(self.ref1.valname) | ||||
|  |  | |||
|  | @ -18,7 +18,7 @@ class Voltage(Page): | |||
|     avg = (1, 10, 60, 300); | ||||
| 
 | ||||
|     def __init__(self, pageno, cfg, appdata, boatdata): | ||||
|         super().__init__(pageno, cfg, boatdata) | ||||
|         super().__init__(pageno, cfg, appdata, boatdata) | ||||
|         self.trend = True | ||||
|         self.mode = 'A' | ||||
|         self.avgindex = 0 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue