diff --git a/TODO b/TODO index 8b38faa..6de56cc 100644 --- a/TODO +++ b/TODO @@ -1,7 +1,14 @@ -Aufgaben- und Planungs- und Ideenliste +Aufgaben, Planungs- und Ideenliste + +- Tracker + Regatta Hero + python3-paho-mqtt benötigt - Satelliten: SatelliteList verwenden und dieses auch in nmea2000 implementieren +- Satellitenübersicht / SkyView + Kreis mit Sats + Rechtecke mit SNR (Signal/Noise) - datareader für mehrere I²C-Sensoren. History muß entsprechend eine Liste sein. @@ -12,10 +19,6 @@ Aufgaben- und Planungs- und Ideenliste Kreis um Position, Liste letzter Positionen Tasten: Set/Clear, Radius+, Radius- -- Satellitenübersicht / SkyView - Kreis mit Sats - Rechtecke mit SNR (Signal/Noise) - - Sea wave recorder (siehe Steamrock) - Datenübertragung über Ethernet @@ -25,3 +28,5 @@ Aufgaben- und Planungs- und Ideenliste - Yacht Devices ASCII Raw Protokoll https://www.yachtd.com/downloads/ydnr02.pdf - Actisense? + +- AIS diff --git a/images/exclamation.png b/images/exclamation.png new file mode 100644 index 0000000..f184592 Binary files /dev/null and b/images/exclamation.png differ diff --git a/nmea0183.py b/nmea0183.py index c9022ac..321fb00 100644 --- a/nmea0183.py +++ b/nmea0183.py @@ -278,16 +278,20 @@ def TXT(boatdata, msg): print(f"TXT: {msg.msg_type} - {txt_msg}") if not boatdata.alarm: # Momentan wird kein bereits anstehender Alarm überschrieben - boatdata.setValue("TXT", txt_msg) + boatdata.alarm_msg = txt_msg.strip() boatdata.alarm = True + boatdata.alarm_id = msg.msg_type + boatdata.alarm_src = "NMEA0183" txt_curr = 0 txt_max = 0 else: print(f"TXT: {msg.msg_type} - {msg.text}", end='') if not boatdata.alarm: # Momentan wird kein bereits anstehender Alarm überschrieben - boatdata.setValue("TXT", msg.text) + boatdata.alarm_msg = msg.text.strip() boatdata.alarm = True + boatdata.alarm_id = msg.msg_type + boatdata.alarm_src = "NMEA0183" def VBW(boatdata, msg): print("-> VBW") diff --git a/obp60v.py b/obp60v.py index 1b9e2fe..515b9cc 100755 --- a/obp60v.py +++ b/obp60v.py @@ -522,6 +522,11 @@ class Frontend(Gtk.Window): if selected == 6 and self.button_clicked == 1: self.keylock = False return True + # Alarm! Only botton "1" so dismiss + if self.boatdata.alarm: + if selected == 1: + self.boatdata.alarm = False + return True if selected == 1: if self.button_clicked == 2: # Programmende bei Klicken auf 2 und loslassen auf 1 diff --git a/pages/anchor.py b/pages/anchor.py index 5009f30..467ff2f 100644 --- a/pages/anchor.py +++ b/pages/anchor.py @@ -313,4 +313,4 @@ class Anchor(Page): else: self.draw_config(ctx) if self._bd.alarm: - self.draw_alarm(ctx) + self.draw_alarm(ctx, self._bd.alarm_src, self._bd.alarm_id, self._bd.alarm_msg) diff --git a/pages/onevalue.py b/pages/onevalue.py index 0396a2f..346c29d 100644 --- a/pages/onevalue.py +++ b/pages/onevalue.py @@ -28,5 +28,6 @@ class OneValue(Page): ctx.show_text(self.ref1.format()) else: #print(dir(self.bd)) - ctx.show_text("---") # self.bd.getPlaceholder()) + #ctx.show_text("---") # self.bd.getPlaceholder()) + ctx.show_text(self.placeholder) ctx.stroke() diff --git a/pages/page.py b/pages/page.py index ac435ab..e83a584 100644 --- a/pages/page.py +++ b/pages/page.py @@ -82,6 +82,7 @@ class Page(): self.icon['ILUM'] = cairo.ImageSurface.create_from_png(os.path.join(cfg['imgpath'], "lighton.png")) self.sym_lock = cairo.ImageSurface.create_from_png(os.path.join(cfg['imgpath'], "lock.png")) self.sym_swipe = cairo.ImageSurface.create_from_png(os.path.join(cfg['imgpath'], "swipe3.png")) + self.sym_exclamation = cairo.ImageSurface.create_from_png(os.path.join(cfg['imgpath'], "exclamation.png")) self.buttonlabel = { 1: '', 2: '', @@ -208,8 +209,11 @@ class Page(): ctx.show_text(self.buttonlabel[i+1]) ctx.stroke() - def draw_alarm(self, ctx): + def draw_alarm(self, ctx, source, alarmid, message): x, y, w, h = (50, 100, 300, 150) + ctx.select_font_face("AtariST8x16SystemFont") + ctx.set_font_size(16) + # Dialogbox mit Rahmen ctx.set_line_width(1) ctx.set_source_rgb(*self.fgcolor) ctx.rectangle(x + 0.5, y + 0.5, w, h) @@ -220,7 +224,28 @@ class Page(): ctx.set_source_rgb(*self.fgcolor) ctx.set_line_width(2) ctx.rectangle(x + 3, y + 3, w - 5, h - 5) + ctx.clip_preserve() ctx.stroke() + # Symbol + ctx.save() + ctx.set_source_surface(self.sym_exclamation, x + 16, y + 16) + ctx.paint() + ctx.restore() + # Titel + ctx.move_to(x + 64, y + 30) + ctx.show_text("A L A R M") + ctx.move_to(x + 64, y + 48) + ctx.show_text(f"#{alarmid} from {source}") + # Alarmmeldung, umgebrochen + n = 0 + for l in wordwrap(message, (w - 16 - 8) / 8): + ctx.move_to(x + 16, y + 80 + n) + ctx.show_text(l) + n += 16 + if n > 64: + break + # Button-Hinweis + self.draw_text_center(ctx, x + w / 2, y + h - 16, "Press button 1 to dismiss alarm") def clear(self): ctx.set_source_rgb(1, 1, 1) @@ -312,3 +337,22 @@ class Page(): ctx.move_to(x + 4, y + h - 5 + 0.5) ctx.show_text(content) ctx.stroke() + +def wordwrap(text, wrap): + # Wrap long line to multiple lines, monospaced character set + # e.g. used for alarm dialog boxes + llen = 0 + l = 0 + lines = [""] + for w in text.split(): + wordlength = len(w) + if llen + 1 + wordlength <= wrap: + if llen > 0: + lines[l] += ' ' + lines[l] += w + llen += wordlength + 1 + else: + lines.append(w) + l += 1 + llen = wordlength + return lines