Anpassung an Vollbild 800x480 auf OBP60P physischem Display

This commit is contained in:
Thomas Hooge 2025-09-19 20:01:53 +02:00
parent 65335e3c91
commit bcbaa25cf5
4 changed files with 73 additions and 34 deletions

19
led.py
View File

@ -32,23 +32,30 @@ colordef = {
class LED():
def __init__(self, parent):
def __init__(self, parent, fullscreen):
# parent muß ein Gtk.Fixed-Objekt sein
self._colorname = ""
self._color = (0, 0, 0) # Farbe schwarz ist aus
self._brightness = 0.0
self._color_off = (0.3725, 0.4275, 0.6078) # RGB(95, 109, 155)
self._pos_x = 30
self._pos_y = 14
self._radius = 5
self._flashcounter = 0
self._flashcolor = (0, 0, 0)
self._enabled = False
# Box oberhalb des Displays
self._da = Gtk.DrawingArea()
parent.put(self._da, 64, 56)
self._da.set_size_request(400, 32)
if fullscreen:
parent.put(self._da, 640, 0)
self._da.set_size_request(160, 64)
self._pos_x = 18
self._pos_y = 20
self._radius = 8
else:
parent.put(self._da, 64, 56)
self._da.set_size_request(400, 32)
self._pos_x = 30
self._pos_y = 14
self._radius = 5
self._da.connect("draw", self.on_draw)
def on_draw(self, widget, ctx):

View File

@ -371,18 +371,25 @@ class Frontend(Gtk.Window):
# Geräterahmen mit Buttons
self.da_device = Gtk.DrawingArea()
self.fixed.put(self.da_device, 0, 0)
self.da_device.set_size_request(530, 555) # für fixed benötigt
if self._fullscreen:
self.da_device.set_size_request(800, 480)
else:
self.da_device.set_size_request(530, 555) # für fixed benötigt
self.da_device.add_events(Gdk.EventMask.BUTTON_PRESS_MASK|Gdk.EventMask.BUTTON_RELEASE_MASK)
self.da_device.connect("draw", self.da_device_draw)
self.da_device.connect('button-press-event', self.da_button_press)
self.da_device.connect('button-release-event', self.da_button_release)
# Displayfläche
self.da = Gtk.DrawingArea()
self.fixed.put(self.da, 64, 95)
self.da.set_size_request(400, 300) # für fixed benötigt
if self._fullscreen:
self.fixed.put(self.da, 0, 0)
self.da.set_size_request(640, 480) # Faktor 1,6 zu 400x300
else:
self.fixed.put(self.da, 64, 95)
self.da.set_size_request(400, 300) # für fixed benötigt
self.da.connect("draw", self.da_draw)
# Flash LED
self.flashled = LED(self.fixed) # Soft Flash-LED
self.flashled = LED(self.fixed, self._fullscreen) # Soft Flash-LED
self.button_clicked = 0 # Geklickter Button vor Loslassen
self.keylock = False
@ -410,7 +417,10 @@ class Frontend(Gtk.Window):
# Tastaturstatus an Seite durchreichen
self.curpage.keylock = self.keylock
# Neuzeichnen
self.da.queue_draw()
if self._fullscreen:
self.da_device.queue_draw()
else:
self.da.queue_draw()
return True
def on_timer_slow(self):
@ -433,6 +443,9 @@ class Frontend(Gtk.Window):
viewport.width = 530
viewport.height = 555
self._svg.render_document(ctx, viewport)
if self._fullscreen:
# Seitliche Buttons zeichnen
self.curpage.draw_sidebuttons(ctx)
def da_draw(self, widget, ctx):
ctx.set_source_rgb(1.0, 0, 0)
@ -663,6 +676,17 @@ if __name__ == "__main__":
setproctitle("obp60v")
owndevice = Device(100)
# Hardcoding device, not intended to change
owndevice.manufacturercode = cfg['manufcode']
owndevice.industrygroup = cfg['industrygroup']
owndevice.deviceclass = cfg['devclass']
owndevice.devicefunction = cfg['devfunc']
boatdata = BoatData()
boatdata.addTank(0)
boatdata.addEngine(0)
# Basiskonfiguration aus Datei lesen
config = configparser.ConfigParser()
config_path = os.path.join(sys.path[0], cfg['cfgfile'])
@ -755,16 +779,6 @@ if __name__ == "__main__":
# Globale Daten, u.a. auch Shutdown-Indikator
appdata = AppData(log, cfg)
owndevice = Device(100)
# Hardcoding device, not intended to change
owndevice.manufacturercode = cfg['manufcode']
owndevice.industrygroup = cfg['industrygroup']
owndevice.deviceclass = cfg['devclass']
owndevice.devicefunction = cfg['devfunc']
boatdata = BoatData()
boatdata.addTank(0)
boatdata.addEngine(0)
# Ggf. Simulationsdaten einschalten
if cfg['simulation']:

View File

@ -21,7 +21,7 @@ import astral
class Clock(Page):
def __init__(self, pageno, cfg, appdata, boatdata):
super().__init__(pageno, cfg, boatdata)
super().__init__(pageno, cfg, appdata, boatdata)
self.buttonlabel[1] = 'MODE'
self.buttonlabel[2] = 'TZ'
self.mode = ('A', 'D', 'T') # (A)nalog (D)igital (T)imer

View File

@ -162,11 +162,40 @@ class Page():
ctx.show_text(datetime.today().strftime('%H:%M %Y-%m-%d LOT'))
ctx.stroke()
def draw_sidebuttons(self, ctx):
"""
Seitliche Buttons zeichnen im Fullscreen-Modus
"""
ctx.save()
ctx.select_font_face("AtariST8x16SystemFont")
ctx.set_font_size(16)
ctx.scale(1.6, 1.6)
ctx.set_source_rgb(0, 0, 0)
bx = 400
by = (128, 192, 256, 320, 384, 448)
bw = 160
bh = 64
for i in range(6):
if len(self.buttonlabel[i+1]) > 0 :
if self.buttonlabel[i+1][0] == "#":
# Symbol verwenden 16x16 Pixel
ctx.save()
key = self.buttonlabel[i+1][1:]
ctx.set_source_surface(self.icon[key], bx + bw / 3.2 - 8, by[i] / 1.6 - 6)
ctx.paint()
ctx.restore()
else:
w = ctx.text_extents(self.buttonlabel[i+1]).width
ctx.move_to(bx + bw/3.2 - w/2, by[i] / 1.6 + 8)
ctx.show_text(self.buttonlabel[i+1])
ctx.stroke()
ctx.restore()
def draw_footer(self, ctx):
"""
Nur Belegung der Buttons (label[1] bis label[6])
"""
ctx.select_font_face("AtariST8x16SystemFont")
ctx.set_font_size(16)
x = (35, 101, 167, 233, 299, 365)
@ -184,11 +213,6 @@ class Page():
ctx.line_to(x[i]+32.5, 300)
ctx.stroke()
# Fullscreen-Buttons
bx = 400
by = (128, 192, 256, 320, 384, 448)
bw = 160
bh = 64
for i in range(6):
if len(self.buttonlabel[i+1]) > 0 :
if self.buttonlabel[i+1][0] == "#":
@ -197,18 +221,12 @@ class Page():
key = self.buttonlabel[i+1][1:]
ctx.set_source_surface(self.icon[key], x[i]-8, y-13)
ctx.paint()
ctx.set_source_surface(self.icon[key], bx + bw / 3.2 - 8, by[i] / 1.6 - 6)
ctx.paint()
ctx.restore()
else:
text = self.buttonlabel[i+1]
w = ctx.text_extents(text).width
ctx.move_to(x[i] - w/2, y+2)
ctx.show_text(text)
if self.fullscreen:
w = ctx.text_extents(self.buttonlabel[i+1]).width
ctx.move_to(bx + bw/3.2 - w/2, by[i] / 1.6 + 8)
ctx.show_text(self.buttonlabel[i+1])
ctx.stroke()
def draw_alarm(self, ctx, source, alarmid, message):