104 lines
2.8 KiB
Python
104 lines
2.8 KiB
Python
import cairo
|
|
import math
|
|
from .page import Page
|
|
|
|
class Rudder(Page):
|
|
|
|
def __init__(self, pageno, cfg, boatdata):
|
|
super().__init__(pageno, cfg, boatdata)
|
|
self.buttonlabel[1] = 'MODE'
|
|
self.mode = 'P'
|
|
# Werte für Ruderausschlag
|
|
self.valpri = self.bd.getRef("RPOS") # Primäres Ruder
|
|
self.valsec = self.bd.getRef("PRPOS") # Sekundäres Ruder
|
|
|
|
def handle_key(self, buttonid):
|
|
if buttonid == 1:
|
|
if self.mode == 'P':
|
|
self.mode = 'S'
|
|
else:
|
|
self.mode = 'P'
|
|
return True
|
|
return False
|
|
|
|
def draw(self, ctx):
|
|
|
|
# Ruder auswählen
|
|
if self.mode == 'P':
|
|
valref = self.valpri
|
|
else:
|
|
valref = self.valsec
|
|
|
|
# Rotationszentrum
|
|
cx = 200
|
|
cy = 150
|
|
|
|
# Radius des Instruments
|
|
r = 110
|
|
|
|
# Titel
|
|
ctx.select_font_face("Ubuntu", cairo.FontSlant.NORMAL, cairo.FontWeight.BOLD)
|
|
ctx.set_font_size(32)
|
|
ctx.move_to(80, 70)
|
|
ctx.show_text("Rudder Position")
|
|
|
|
ctx.set_font_size(24)
|
|
if valref.valid:
|
|
ctx.move_to(175, 110)
|
|
ctx.show_text(valref.unit)
|
|
else:
|
|
ctx.move_to(110, 110)
|
|
ctx.show_text("no data available")
|
|
ctx.stroke()
|
|
|
|
# Debug
|
|
angle = 5
|
|
|
|
# Rahmen
|
|
ctx.set_source_rgb(*self.fgcolor)
|
|
ctx.set_line_width(3)
|
|
ctx.arc(cx, cy, r + 10, 0, math.pi)
|
|
ctx.stroke()
|
|
|
|
# Zentrum
|
|
ctx.arc(cx, cy, 8, 0, 2*math.pi)
|
|
ctx.fill()
|
|
|
|
# Skala mit Strichen, Punkten und Beschriftung
|
|
char = {
|
|
90: "45",
|
|
120: "30",
|
|
150: "15",
|
|
180: "0",
|
|
210: "15",
|
|
240: "30",
|
|
270: "45"
|
|
}
|
|
# Zeichnen in 10°-Schritten
|
|
ctx.set_font_size(16)
|
|
for i in range(90, 271, 10):
|
|
fx = math.sin(i / 180 * math.pi)
|
|
fy = math.cos(i / 180 * math.pi)
|
|
if i in char:
|
|
x = cx + (r - 30) * fx
|
|
y = cy - (r - 30) * fy
|
|
self.draw_text_center(ctx, x, y, char[i])
|
|
ctx.stroke()
|
|
if i % 30 == 0:
|
|
ctx.move_to(cx + (r - 10) * fx, cy - (r - 10) * fy)
|
|
ctx.line_to(cx + (r + 10) * fx, cy - (r + 10) * fy)
|
|
ctx.stroke()
|
|
else:
|
|
x = cx + r * fx
|
|
y = cy - r * fy
|
|
ctx.arc(x, y, 2, 0, 2*math.pi)
|
|
ctx.fill()
|
|
|
|
if valref.valid:
|
|
p = ((cx - 6, cy), (cx + 6, cy), (cx + 2, cy + r - 50), (cx - 2, cy + r - 50))
|
|
rudder = self.rotate((cx, cy), p, angle)
|
|
ctx.move_to(*rudder[0])
|
|
for point in rudder[1:]:
|
|
ctx.line_to(*point)
|
|
ctx.fill()
|