import cairo from .page import Page """ ROLL - Roll - Krängen / Rotation in Querrichtung PTCH - Pitch - Stampfen / Rotation in Längsrichtung YAW - Gieren XDR-Daten xdrRoll xdrPitch xdrYaw Wenn Limit überschritten ist, Warnung ausgeben Idee: Zusätzlich die Kieldaten anzeigen wenn ein Sensor dafür vorhanden ist """ import math class RollPitch(Page): def __init__(self, pageno, cfg, appdata, boatdata): super().__init__(pageno, cfg, appdata, boatdata) self.valref_r = self.bd.getRef("ROLL") self.valref_p = self.bd.getRef("PTCH") # Werte aus Konfiguration self.roll_limit = cfg['_config'].getint('hardware', 'roll_limit') self.roll_offset = cfg['_config'].getint('hardware', 'roll_offset') self.pitch_offset = cfg['_config'].getint('hardware', 'pitch_offset') def draw(self, ctx): # Horizontale Trennlinien ctx.rectangle(0, 149, 60, 3) ctx.rectangle(340, 149, 60, 3) ctx.fill() # Links oben: Limit ctx.select_font_face("DSEG7 Classic") ctx.set_font_size(40) ctx.move_to(8, 70) ctx.show_text(str(self.roll_limit)) ctx.select_font_face("Ubuntu", cairo.FontSlant.NORMAL, cairo.FontWeight.BOLD) ctx.set_font_size(20) ctx.move_to(8, 95) ctx.show_text("Limit") ctx.set_font_size(16) ctx.move_to(8, 115) ctx.show_text("deg") ctx.stroke() # Links unten: Roll-Wert ctx.set_font_size(16) ctx.move_to(8, 180) ctx.show_text(self.valref_r.unit) ctx.set_font_size(20) ctx.move_to(8, 205) ctx.show_text("Roll") ctx.select_font_face("DSEG7 Classic") ctx.set_font_size(40) ctx.move_to(8, 260) ctx.show_text(str(self.valref_r.format())) ctx.stroke() # Rechts unten: Pitch-Wert ctx.select_font_face("Ubuntu", cairo.FontSlant.NORMAL, cairo.FontWeight.BOLD) ctx.set_font_size(16) self.draw_text_ralign(ctx, 392, 180, self.valref_p.unit) ctx.set_font_size(20) self.draw_text_ralign(ctx, 392, 205, "Pitch") ctx.select_font_face("DSEG7 Classic") ctx.set_font_size(40) ctx.move_to(290, 260) ctx.show_text(str(self.valref_p.format())) ctx.stroke() # Kreis mit Skala oben +/- 60° cx = 200 cy = 160 r = 110 ctx.set_line_width(3) ctx.arc(cx, cy, r, 0, 2*math.pi) ctx.stroke() # Skala mit Strichen, Punkten und Beschriftung char = { -60: "60", -40: "40", -20: "20", 0: "0", 20: "20", 40: "40", 60: "60" } ctx.select_font_face("Ubuntu", cairo.FontSlant.NORMAL, cairo.FontWeight.BOLD) ctx.set_font_size(16) for i in range(-60, 70, 10): fx = math.sin(i / 180 * math.pi) fy = math.cos(i / 180 * math.pi) if i in char: x = cx + (r + 15) * fx y = cy - (r + 15) * fy self.draw_text_center(ctx, x, y, char[i]) ctx.stroke() if i % 20 == 0: ctx.move_to(cx + r * fx, cy - r * fy) ctx.line_to(cx + (r - 10) * fx, cy - (r - 10) * fy) ctx.stroke() else: x = cx + (r - 5) * fx y = cy - (r - 5) * fy ctx.arc(x, y, 2, 0, 2*math.pi) ctx.fill() # Meßwert if self.cfg['simulation']: angle = 45 else: angle = self.valref_r.getValueRaw() or 0 angle = 22 # Wasserlinie ctx.set_line_width(4) ctx.move_to(150, cy + 10) ctx.line_to(250, cy + 10) ctx.stroke() # Rotierte Komponenten ctx.save() ctx.translate(cx, cy) ctx.rotate(math.radians(angle)) # Rumpf ctx.arc(0, - 10, 28, 0, math.pi) ctx.fill() # Mast ctx.move_to(0, 0) ctx.line_to(0, -1 * (r - 15)) ctx.stroke() # Kiel ctx.move_to(-5, 0) ctx.line_to(5 , 0) ctx.line_to(2 , r - 60) ctx.line_to(-2 , r - 60) ctx.close_path() ctx.arc(0, r -60, 5, 0, 2*math.pi) ctx.fill() ctx.restore()