162 lines
4.3 KiB
Python
162 lines
4.3 KiB
Python
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()
|