115 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			115 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Python
		
	
	
	
| """
 | |
| 
 | |
| Rotationssensor AS5600 mit Funktion "Kiel"
 | |
| WIP
 | |
| 
 | |
| Idee: 
 | |
|   - Zusätzlich Anzeigemöglichkeit für die Tiefe eines variablen Kiels
 | |
|   - Mode-Taste
 | |
| 
 | |
| """
 | |
| 
 | |
| import cairo
 | |
| import math
 | |
| from .page import Page
 | |
| 
 | |
| class Keel(Page):
 | |
| 
 | |
|     def __init__(self, pageno, cfg, appdata, boatdata):
 | |
|         super().__init__(pageno, cfg, appdata, boatdata)
 | |
|         # Wert für Kielrotation
 | |
|         self.valref = self.bd.getRef("xdrRotK")
 | |
| 
 | |
|     def draw(self, ctx):
 | |
| 
 | |
|         # Mitte oben Instrument (Halbkreis)
 | |
|         cx = 200
 | |
|         cy = 150
 | |
| 
 | |
|         # Radius Kielposition
 | |
|         r = 110 
 | |
| 
 | |
|         # Titel
 | |
|         ctx.select_font_face("Ubuntu", cairo.FontSlant.NORMAL, cairo.FontWeight.BOLD)
 | |
|         ctx.set_font_size(32)
 | |
|         ctx.move_to(100, 70)
 | |
|         ctx.show_text("Keel Position")
 | |
|         ctx.set_font_size(24)
 | |
|         ctx.move_to(175, 110)
 | |
|         ctx.show_text(self.valref.unit)
 | |
|         ctx.stroke()
 | |
| 
 | |
| 
 | |
|         # Halbkreis für Skala
 | |
|         ctx.set_source_rgb(*self.fgcolor)
 | |
|         ctx.set_line_width(3)
 | |
|         ctx.arc(cx, cy, r + 10, 0, math.pi)
 | |
|         ctx.stroke()
 | |
|         
 | |
|         # 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()
 | |
| 
 | |
|         # Boot und Wasserlinie
 | |
|         ctx.arc(cx, cy - 10, 28, 0, math.pi)
 | |
|         ctx.fill()
 | |
|         ctx.set_line_width(4)
 | |
|         ctx.move_to(150, cy)
 | |
|         ctx.line_to(250, cy)
 | |
|         ctx.stroke()
 | |
| 
 | |
|         #ctx.arc(200, 150, r + 10, 0, 2*math.pi)
 | |
|         #ctx.fill()
 | |
|         #ctx.set_source_rgb(*self.bgcolor)
 | |
|         #ctx.arc(200, 150, r + 7, 0, 2* math.pi)
 | |
|         #ctx.rectangle(0, 30, 299, 122)
 | |
|         #ctx.fill()
 | |
| 
 | |
|         angle = -15
 | |
|         #angle = self.valref.value
 | |
|         #TODO  Angle limits to +/-45°
 | |
|         if angle < -45:
 | |
|             angle = -45
 | |
|         elif angle > 45:
 | |
|             angle = 45
 | |
|         angle *= 2 # stretched scale
 | |
| 
 | |
|         # Kiel
 | |
|         p = ((cx - 6, cy), (cx + 6, cy), (cx + 2, cy + r - 50), (cx - 2, cy + r - 50))
 | |
|         keel = self.rotate((cx, cy), p, angle)
 | |
|         ctx.move_to(*keel[0])
 | |
|         for point in keel[1:]:
 | |
|             ctx.line_to(*point)
 | |
|         ctx.fill()
 | |
| 
 | |
|         # Kiel-Bombe
 | |
|         x, y  = self.rotate((cx, cy), ((cx, cy + r -50),), angle)[0]
 | |
|         ctx.arc(x, y, 5, 0, 2*math.pi)
 | |
|         ctx.fill()
 |