displaybranch
This commit is contained in:
parent
46df6b9e62
commit
0ded583370
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -1,37 +0,0 @@
|
||||||
import json
|
|
||||||
|
|
||||||
class DataObject():
|
|
||||||
def __init__(self):
|
|
||||||
self.currentSpeed = 0
|
|
||||||
self.speed2AVG = 0
|
|
||||||
self.speed10AVG = 0
|
|
||||||
self.speed2Max = 0
|
|
||||||
self.speed10Max = 0
|
|
||||||
self.compass = 0
|
|
||||||
|
|
||||||
def data(self, client, userdata, msg):
|
|
||||||
|
|
||||||
m_in= self.decode( msg.payload )
|
|
||||||
|
|
||||||
try:
|
|
||||||
self.currentSpeed = m_in['windspeed']
|
|
||||||
self.speed2AVG = m_in['speed2AVG']
|
|
||||||
self.speed10AVG = m_in['speed10AVG']
|
|
||||||
self.speed2Max = m_in['speed2max']
|
|
||||||
self.speed10Max = m_in['speed10max']
|
|
||||||
self.compass = m_in['winddirection']
|
|
||||||
except:
|
|
||||||
pass
|
|
||||||
|
|
||||||
def config(self, client, userdata, msg):
|
|
||||||
|
|
||||||
m_in= self.decode( msg.payload )
|
|
||||||
|
|
||||||
try:
|
|
||||||
self.warning = m_in['warning_level']
|
|
||||||
self.alert = m_in['alert_level']
|
|
||||||
except:
|
|
||||||
pass
|
|
||||||
|
|
||||||
def decode(self,payload):
|
|
||||||
return json.loads( payload.decode("utf-8", "ignore") )
|
|
||||||
|
|
@ -1,100 +0,0 @@
|
||||||
import os
|
|
||||||
import platform
|
|
||||||
import pygame
|
|
||||||
|
|
||||||
class DriverException(Exception):
|
|
||||||
def __init__(self, driverName):
|
|
||||||
self.driverName = driverName
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return repr(self.driverName)
|
|
||||||
|
|
||||||
class Screen():
|
|
||||||
screen = None
|
|
||||||
bgColor = None
|
|
||||||
|
|
||||||
def __init__(self, width, height, fullscreen):
|
|
||||||
size = (width, height)
|
|
||||||
|
|
||||||
disp_no = os.getenv('DISPLAY')
|
|
||||||
if disp_no:
|
|
||||||
print ("I'm running under X display = {0}".format(disp_no))
|
|
||||||
self.screen = pygame.display.init()
|
|
||||||
else:
|
|
||||||
print("Try to run from framebuffer...")
|
|
||||||
drivers = ['fbcon','directfb', 'svgalib']
|
|
||||||
|
|
||||||
found = False
|
|
||||||
for driver in drivers:
|
|
||||||
print(driver)
|
|
||||||
if not os.getenv('SDL_VIDEODRIVER'):
|
|
||||||
os.putenv('SDL_VIDEODRIVER', driver)
|
|
||||||
try:
|
|
||||||
self.screen = pygame.display.init()
|
|
||||||
except pygame.error:
|
|
||||||
print("Driver: {0} failed.".format(driver))
|
|
||||||
continue
|
|
||||||
found = True
|
|
||||||
break
|
|
||||||
|
|
||||||
if not found:
|
|
||||||
raise Exception('No suitable video driver found!')
|
|
||||||
|
|
||||||
self.realSize = (pygame.display.Info().current_w, pygame.display.Info().current_h)
|
|
||||||
if size[0] > self.realSize[0]:
|
|
||||||
size = (self.realSize[0], size[1])
|
|
||||||
if size[1] > self.realSize[1]:
|
|
||||||
size = (size[0], self.realSize[1])
|
|
||||||
if not fullscreen:
|
|
||||||
self.screen = pygame.display.set_mode(size)
|
|
||||||
else:
|
|
||||||
self.screen = pygame.display.set_mode((0,0), pygame.FULLSCREEN|pygame.DOUBLEBUF|pygame.HWSURFACE)
|
|
||||||
|
|
||||||
|
|
||||||
def quit(self):
|
|
||||||
pygame.display.quit()
|
|
||||||
|
|
||||||
def update(self):
|
|
||||||
pygame.display.flip()
|
|
||||||
|
|
||||||
def blit(self, surface, x, y):
|
|
||||||
|
|
||||||
self.screen.blit( surface, (x, y) )
|
|
||||||
|
|
||||||
def background(self, color):
|
|
||||||
try:
|
|
||||||
self.screen.fill( pygame.Color(color) )
|
|
||||||
except:
|
|
||||||
self.screen.fill( pygame.Color("white"))
|
|
||||||
finally:
|
|
||||||
self.bgColor = color
|
|
||||||
|
|
||||||
def reset(self):
|
|
||||||
self.background(self.bgColor)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def setCaption(self, title):
|
|
||||||
pygame.display.set_caption(title)
|
|
||||||
|
|
||||||
def test(self):
|
|
||||||
# Fill the screen with red (255, 0, 0)
|
|
||||||
self.screen.fill(pygame.Color("red"))
|
|
||||||
# Update the display
|
|
||||||
self.update()
|
|
||||||
|
|
||||||
def getSize(self):
|
|
||||||
return self.screen.get_size()
|
|
||||||
|
|
||||||
def getRealSize(self):
|
|
||||||
return self.realSize
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Binary file not shown.
|
|
@ -1,71 +0,0 @@
|
||||||
[General]
|
|
||||||
fullscreen: True
|
|
||||||
timeToEnd: 5
|
|
||||||
|
|
||||||
[MQTT]
|
|
||||||
topic: DPW/STR/CRAN2/WIND
|
|
||||||
config: DPW/STR/CRAN2
|
|
||||||
host: localhost
|
|
||||||
port: 1884
|
|
||||||
keepalive: 60
|
|
||||||
|
|
||||||
[Color]
|
|
||||||
normal = Black
|
|
||||||
warning = Yellow
|
|
||||||
alert = Red
|
|
||||||
|
|
||||||
|
|
||||||
[CurrentSpeed]
|
|
||||||
font_size = 28
|
|
||||||
x = 386
|
|
||||||
y = 226
|
|
||||||
|
|
||||||
[AVG2Speed]
|
|
||||||
font_size = 28
|
|
||||||
x = 0
|
|
||||||
y = 0
|
|
||||||
width = 400
|
|
||||||
height = 240
|
|
||||||
|
|
||||||
[AVG10Speed]
|
|
||||||
font_size = 28
|
|
||||||
x = 0
|
|
||||||
y = 240
|
|
||||||
width = 400
|
|
||||||
height = 240
|
|
||||||
|
|
||||||
[Max2Speed]
|
|
||||||
font_size = 28
|
|
||||||
x = 400
|
|
||||||
y = 0
|
|
||||||
width = 400
|
|
||||||
height = 240
|
|
||||||
|
|
||||||
[Max10Speed]
|
|
||||||
font_size = 28
|
|
||||||
x = 400
|
|
||||||
y = 240
|
|
||||||
width = 400
|
|
||||||
height = 240
|
|
||||||
|
|
||||||
[Compass]
|
|
||||||
font_size = 20
|
|
||||||
width = 280
|
|
||||||
height = 280
|
|
||||||
x = 260
|
|
||||||
y = 100
|
|
||||||
background = Navy
|
|
||||||
needle_color = Deepskyblue
|
|
||||||
lineLength = 60
|
|
||||||
|
|
||||||
[CompassBackground]
|
|
||||||
dashedLineColor = Darkgrey
|
|
||||||
dashsize = 10
|
|
||||||
groundColor = Lightgrey
|
|
||||||
angleOffset = 13
|
|
||||||
|
|
||||||
[Splashscreen]
|
|
||||||
fadein = 0.5
|
|
||||||
fadeout = 0.5
|
|
||||||
solid = 0.5
|
|
||||||
font_size = 20
|
|
||||||
|
|
@ -1,4 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
echo Starting display application
|
|
||||||
cd /home/pi/Windmessanlage/Software/Display/
|
|
||||||
DISPLAY=:0 python3 main.py
|
|
||||||
|
|
@ -1,137 +0,0 @@
|
||||||
import pygame
|
|
||||||
import math
|
|
||||||
|
|
||||||
class Compass():
|
|
||||||
def __init__(self, font_size, size):
|
|
||||||
pygame.font.init()
|
|
||||||
self.textColor = pygame.Color("white")
|
|
||||||
self.backgroundColor = pygame.Color("White")
|
|
||||||
self.needleColor = pygame.Color("black")
|
|
||||||
|
|
||||||
self.font = pygame.font.Font(pygame.font.get_default_font(), font_size)
|
|
||||||
|
|
||||||
self.surface = pygame.Surface(size, pygame.SRCALPHA)
|
|
||||||
self.size = size
|
|
||||||
|
|
||||||
self.x = 0
|
|
||||||
self.y = 0
|
|
||||||
|
|
||||||
self.backgroundSurface = None
|
|
||||||
|
|
||||||
|
|
||||||
def setX(self, x):
|
|
||||||
self.x = x
|
|
||||||
def getX(self):
|
|
||||||
return self.x
|
|
||||||
|
|
||||||
def setY(self, y):
|
|
||||||
self.y = y
|
|
||||||
def getY(self):
|
|
||||||
return self.y
|
|
||||||
|
|
||||||
def get(self):
|
|
||||||
return self.surface
|
|
||||||
|
|
||||||
def setTextColor(self, color):
|
|
||||||
try:
|
|
||||||
self.textColor = pygame.Color(color)
|
|
||||||
except:
|
|
||||||
self.textColor = pygame.Color("black")
|
|
||||||
|
|
||||||
def setBackgroundColor(self, color):
|
|
||||||
try:
|
|
||||||
self.backgroundColor = pygame.Color(color)
|
|
||||||
except:
|
|
||||||
self.backgroundColor = pygame.Color("white")
|
|
||||||
|
|
||||||
def setNeedleColor(self, color):
|
|
||||||
try:
|
|
||||||
self.needleColor = pygame.Color(color)
|
|
||||||
except:
|
|
||||||
self.needleColor = pygame.Color("black")
|
|
||||||
|
|
||||||
def update(self, value):
|
|
||||||
raise NotImplementedError()
|
|
||||||
|
|
||||||
|
|
||||||
class MiddleNeedle(Compass):
|
|
||||||
def update(self, value):
|
|
||||||
radius = min(self.size[0]//2, self.size[1]//2)
|
|
||||||
pygame.draw.circle( self.surface, self.backgroundColor, (self.size[0]//2, self.size[1]//2), radius)
|
|
||||||
|
|
||||||
|
|
||||||
arrow = pygame.Surface( ((self.size[0]//100*60)//2, self.size[1]//100*60), pygame.SRCALPHA )
|
|
||||||
|
|
||||||
polygon_list = [
|
|
||||||
( arrow.get_width()//2, 0 ), #Middle top
|
|
||||||
( 0, arrow.get_height() ), #bottom left
|
|
||||||
( arrow.get_width()//2, (arrow.get_height()-arrow.get_height()//100*30) ), #middle pos
|
|
||||||
( arrow.get_width(), arrow.get_height() ), #bottom right
|
|
||||||
]
|
|
||||||
|
|
||||||
pygame.draw.polygon(arrow, self.needleColor, polygon_list)
|
|
||||||
arrow = pygame.transform.rotate( arrow, value )
|
|
||||||
self.surface.blit( arrow, ( (self.size[0]//2)-(arrow.get_width()//2), (self.size[1]//2)-(arrow.get_height()//2)))
|
|
||||||
|
|
||||||
text = self.font.render("N", True, self.textColor)
|
|
||||||
self.surface.blit( text, ( (self.size[0]//2) - (text.get_width()//2), int(self.size[1]/100*10) - text.get_height()//2 ) )
|
|
||||||
|
|
||||||
text = self.font.render("W", True, self.textColor)
|
|
||||||
self.surface.blit( text, ( int(self.size[0]/100*10) - (text.get_width()//2), (self.size[1]//2) - (text.get_height()//2) ) )
|
|
||||||
|
|
||||||
text = self.font.render("O", True, self.textColor)
|
|
||||||
self.surface.blit( text, ( int(self.size[0]/100*90)- (text.get_width()//2), (self.size[1]//2) - (text.get_height()//2) ) )
|
|
||||||
|
|
||||||
text = self.font.render("S", True, self.textColor)
|
|
||||||
self.surface.blit( text, ( (self.size[0]//2) - (text.get_width()//2), int(self.size[1]/100*90) - text.get_height()//2 ) )
|
|
||||||
|
|
||||||
|
|
||||||
class OuterNeedle(Compass):
|
|
||||||
def update(self, value):
|
|
||||||
radius = min(self.size[0]//2, self.size[1]//2)
|
|
||||||
pygame.draw.circle( self.surface, self.backgroundColor, (self.size[0]//2, self.size[1]//2), radius)
|
|
||||||
|
|
||||||
|
|
||||||
if self.backgroundSurface:
|
|
||||||
self.surface.blit( self.backgroundSurface, (0,0) )
|
|
||||||
|
|
||||||
if self.lineLength is None:
|
|
||||||
self.lineLength = 5
|
|
||||||
|
|
||||||
# 0 is down -> +90
|
|
||||||
# alpha = 2 * arcsin (s / 2r); s is bottom line
|
|
||||||
alpha = 2 * math.asin( self.lineLength / (2*radius) )
|
|
||||||
value = math.radians(value) + math.pi/2 #put 0 to bottom
|
|
||||||
bottom_left = self.getPos(value +alpha/2, radius)
|
|
||||||
bottom_left = ( int(bottom_left[0] + radius), bottom_left[1]+radius) #offset to screen middle
|
|
||||||
bottom_right = self.getPos(value -alpha/2, radius)
|
|
||||||
bottom_right = ( int(bottom_right[0] + radius), bottom_right[1]+radius)
|
|
||||||
height_of_segment = self.lineLength/2 * math.tan( alpha / 4 )
|
|
||||||
height_of_triangle = math.sqrt(3) /2 * self.lineLength
|
|
||||||
top = self.getPos(value, radius-height_of_segment-height_of_triangle)
|
|
||||||
top = ( int(top[0] + radius), top[1]+radius )
|
|
||||||
points = [ bottom_left, top, bottom_right ]
|
|
||||||
|
|
||||||
pygame.draw.lines( self.surface, self.needleColor, False, points,3)
|
|
||||||
|
|
||||||
text = self.font.render("N", True, self.textColor)
|
|
||||||
self.surface.blit( text, ( (self.size[0]//2) - (text.get_width()//2), int(self.size[1]/100*10) - text.get_height()//2 ) )
|
|
||||||
|
|
||||||
text = self.font.render("W", True, self.textColor)
|
|
||||||
self.surface.blit( text, ( int(self.size[0]/100*10) - (text.get_width()//2), (self.size[1]//2) - (text.get_height()//2) ) )
|
|
||||||
|
|
||||||
text = self.font.render("O", True, self.textColor)
|
|
||||||
self.surface.blit( text, ( int(self.size[0]/100*90)- (text.get_width()//2), (self.size[1]//2) - (text.get_height()//2) ) )
|
|
||||||
|
|
||||||
text = self.font.render("S", True, self.textColor)
|
|
||||||
self.surface.blit( text, ( (self.size[0]//2) - (text.get_width()//2), int(self.size[1]/100*90) - text.get_height()//2 ) )
|
|
||||||
|
|
||||||
def getPos(self, alpha, radius):
|
|
||||||
return ( int( radius * math.cos(alpha) ), int( radius * math.sin(alpha) ) )
|
|
||||||
|
|
||||||
def setLineLength(self, length):
|
|
||||||
self.lineLength = length
|
|
||||||
|
|
||||||
def setBackgroundSurface(self, surface):
|
|
||||||
self.backgroundSurface = surface
|
|
||||||
|
|
||||||
|
|
@ -1,44 +0,0 @@
|
||||||
import pygame
|
|
||||||
import math
|
|
||||||
|
|
||||||
class Point():
|
|
||||||
# constructed using a normal tupple
|
|
||||||
def __init__(self, point_t = (0,0)):
|
|
||||||
self.x = float(point_t[0])
|
|
||||||
self.y = float(point_t[1])
|
|
||||||
|
|
||||||
# define all useful operators
|
|
||||||
def __add__(self, other):
|
|
||||||
return Point((self.x + other.x, self.y + other.y))
|
|
||||||
def __sub__(self, other):
|
|
||||||
return Point((self.x - other.x, self.y - other.y))
|
|
||||||
def __mul__(self, scalar):
|
|
||||||
return Point((self.x*scalar, self.y*scalar))
|
|
||||||
def __truediv__(self, scalar):
|
|
||||||
return Point((self.x/scalar, self.y/scalar))
|
|
||||||
def __len__(self):
|
|
||||||
return int(math.sqrt(self.x**2 + self.y**2))
|
|
||||||
# get back values in original tuple format
|
|
||||||
def get(self):
|
|
||||||
return (self.x, self.y)
|
|
||||||
|
|
||||||
|
|
||||||
def draw_dashed_line(surf, color, start_pos, end_pos, width=1, dash_length=10):
|
|
||||||
origin = Point(start_pos)
|
|
||||||
target = Point(end_pos)
|
|
||||||
displacement = target - origin
|
|
||||||
length = len(displacement)
|
|
||||||
slope = displacement/length
|
|
||||||
|
|
||||||
for index in range(0, int(length/dash_length), 2):
|
|
||||||
start = origin + (slope * index * dash_length)
|
|
||||||
end = origin + (slope * (index + 1) * dash_length)
|
|
||||||
pygame.draw.line(surf, color, start.get(), end.get(), width)
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
start =(50,50)
|
|
||||||
end =(100,50)
|
|
||||||
|
|
||||||
surface = pygame.Surface( (200,200) )
|
|
||||||
|
|
||||||
draw_dashed_line( surface, pygame.Color("Black"), start, end, width=1 )
|
|
||||||
|
|
@ -1,53 +0,0 @@
|
||||||
import pygame
|
|
||||||
|
|
||||||
class Text():
|
|
||||||
def __init__(self,txt, font_size):
|
|
||||||
pygame.font.init()
|
|
||||||
self.color = pygame.Color("black")
|
|
||||||
self.txt = txt
|
|
||||||
self.font = pygame.font.Font(pygame.font.get_default_font(), font_size)
|
|
||||||
self.text = self.font.render(self.txt, True, self.color)
|
|
||||||
self.x = 0
|
|
||||||
self.y = 0
|
|
||||||
|
|
||||||
def setX(self, x):
|
|
||||||
self.x = x
|
|
||||||
def getX(self):
|
|
||||||
return self.x
|
|
||||||
|
|
||||||
def setY(self, y):
|
|
||||||
self.y = y
|
|
||||||
def getY(self):
|
|
||||||
return self.y
|
|
||||||
|
|
||||||
def get(self):
|
|
||||||
return self.text
|
|
||||||
|
|
||||||
def getSize(self):
|
|
||||||
return self.text.get_size()
|
|
||||||
|
|
||||||
def getWidth(self):
|
|
||||||
return self.text.get_width()
|
|
||||||
|
|
||||||
def setColor(self, color):
|
|
||||||
try:
|
|
||||||
self.color = pygame.Color(color)
|
|
||||||
except:
|
|
||||||
self.color = pygame.Color("black")
|
|
||||||
self.text = self.font.render(self.txt, True, self.color)
|
|
||||||
|
|
||||||
|
|
||||||
class VariableText(Text):
|
|
||||||
def __init__(self, txt, font_size):
|
|
||||||
pygame.font.init()
|
|
||||||
self.color = pygame.Color("black")
|
|
||||||
self.txt = txt+"{}"
|
|
||||||
self.font = pygame.font.Font(pygame.font.get_default_font(), font_size)
|
|
||||||
self.text = self.font.render(self.txt.format(0), True, self.color)
|
|
||||||
|
|
||||||
def setUnit(self, unit):
|
|
||||||
self.txt = self.txt+unit
|
|
||||||
self.unit = unit
|
|
||||||
|
|
||||||
def update(self, value):
|
|
||||||
self.text = self.font.render(self.txt.format(value), True, self.color)
|
|
||||||
|
|
@ -1,55 +0,0 @@
|
||||||
import pygame
|
|
||||||
|
|
||||||
class Textbox():
|
|
||||||
def __init__(self, size, x, y, font_size):
|
|
||||||
self.background = pygame.Color("grey")
|
|
||||||
self.surface = pygame.Surface( size )
|
|
||||||
self.surface.fill( self.background )
|
|
||||||
|
|
||||||
self.color = pygame.Color("White")
|
|
||||||
self.fontsize = 20
|
|
||||||
pygame.font.init()
|
|
||||||
|
|
||||||
self.font = pygame.font.Font(pygame.font.get_default_font(), font_size)
|
|
||||||
text = self.font.render("", True, self.color)
|
|
||||||
self.surface.blit( text, (0,0) )
|
|
||||||
|
|
||||||
self.x = x
|
|
||||||
self.y = y
|
|
||||||
|
|
||||||
def setText(self, text):
|
|
||||||
self.lines = text.split('\n')
|
|
||||||
self.nr_of_lines = len(self.lines)
|
|
||||||
|
|
||||||
def setTextColor(self, color):
|
|
||||||
try:
|
|
||||||
self.color = pygame.Color(color)
|
|
||||||
except:
|
|
||||||
self.color = pygame.Color("black")
|
|
||||||
|
|
||||||
def setBackgroundColor(self, color):
|
|
||||||
try:
|
|
||||||
self.background = pygame.Color(color)
|
|
||||||
except:
|
|
||||||
self.background = pygame.Color("grey")
|
|
||||||
|
|
||||||
def get(self):
|
|
||||||
return self.surface
|
|
||||||
|
|
||||||
def getX(self):
|
|
||||||
return self.x
|
|
||||||
|
|
||||||
def getY(self):
|
|
||||||
return self.y
|
|
||||||
|
|
||||||
def update(self, value):
|
|
||||||
self.surface.fill( self.background )
|
|
||||||
|
|
||||||
for lineNr, line in enumerate(self.lines):
|
|
||||||
text = self.font.render(line.format(value), True, self.color)
|
|
||||||
spacing = text.get_height()//10
|
|
||||||
x = self.surface.get_width()//2 - text.get_width()//2
|
|
||||||
height_total = self.nr_of_lines * (text.get_height() + spacing)
|
|
||||||
y = self.surface.get_height()//2 - height_total//2 + (lineNr * (text.get_height()+spacing))
|
|
||||||
self.surface.blit( text, (x,y) )
|
|
||||||
|
|
||||||
281
Display/main.py
281
Display/main.py
|
|
@ -1,281 +0,0 @@
|
||||||
import os
|
|
||||||
import platform
|
|
||||||
import pygame
|
|
||||||
import time
|
|
||||||
import math
|
|
||||||
|
|
||||||
import configparser
|
|
||||||
|
|
||||||
import paho.mqtt.client as mqtt
|
|
||||||
from DataObject import DataObject
|
|
||||||
|
|
||||||
from Screen import Screen
|
|
||||||
from elements.Text import Text, VariableText
|
|
||||||
from elements.Textbox import Textbox
|
|
||||||
from elements.Compass import OuterNeedle
|
|
||||||
from elements.Line import draw_dashed_line, Point
|
|
||||||
|
|
||||||
topic = ""
|
|
||||||
|
|
||||||
def on_connect(client, userdata, flags, rc):
|
|
||||||
print("Subscribe to {}".format(topic))
|
|
||||||
client.subscribe(topic)
|
|
||||||
|
|
||||||
|
|
||||||
def splashscreen(screen, fadein, solid, fadeout, font_size):
|
|
||||||
screen.background("white")
|
|
||||||
size = screen.getSize()
|
|
||||||
txt = Text("powered by NetWEB Systems", font_size)
|
|
||||||
img = pygame.image.load("resources/NWS.bmp")
|
|
||||||
imgSize = img.get_rect().size
|
|
||||||
surface = pygame.Surface(size)
|
|
||||||
surface.fill(pygame.Color("white"))
|
|
||||||
surface.blit(img, (size[0]//2 - imgSize[0], size[1]//2 - imgSize[1]))
|
|
||||||
surface.blit(txt.get(), (size[0]//2, size[1]//2))
|
|
||||||
|
|
||||||
if (fadein > 0):
|
|
||||||
for alpha in range(0,255): #0 is transparent, 255 is opaque
|
|
||||||
screen.reset()
|
|
||||||
surface.set_alpha(alpha)
|
|
||||||
screen.blit(surface,0,0)
|
|
||||||
screen.update()
|
|
||||||
time.sleep( fadein/255 )
|
|
||||||
|
|
||||||
screen.reset()
|
|
||||||
screen.blit(surface,0,0)
|
|
||||||
screen.update()
|
|
||||||
time.sleep(solid)
|
|
||||||
|
|
||||||
if (fadeout > 0):
|
|
||||||
for alpha in range(0,255): #0 is transparent, 255 is opaque
|
|
||||||
screen.reset()
|
|
||||||
surface.set_alpha(255-alpha)
|
|
||||||
screen.blit(surface,0,0)
|
|
||||||
screen.update()
|
|
||||||
time.sleep( fadeout/255 )
|
|
||||||
|
|
||||||
def getPos(angle, radius, offset):
|
|
||||||
return ( int( radius * math.cos(angle) )+offset, int( radius * math.sin(angle) )+offset)
|
|
||||||
|
|
||||||
def blitRotate(surf, image, pos, originPos, angle):
|
|
||||||
|
|
||||||
# calcaulate the axis aligned bounding box of the rotated image
|
|
||||||
w, h = image.get_size()
|
|
||||||
box = [pygame.math.Vector2(p) for p in [(0, 0), (w, 0), (w, -h), (0, -h)]]
|
|
||||||
box_rotate = [p.rotate(angle) for p in box]
|
|
||||||
min_box = (min(box_rotate, key=lambda p: p[0])[0], min(box_rotate, key=lambda p: p[1])[1])
|
|
||||||
max_box = (max(box_rotate, key=lambda p: p[0])[0], max(box_rotate, key=lambda p: p[1])[1])
|
|
||||||
|
|
||||||
# calculate the translation of the pivot
|
|
||||||
pivot = pygame.math.Vector2(originPos[0], -originPos[1])
|
|
||||||
pivot_rotate = pivot.rotate(angle)
|
|
||||||
pivot_move = pivot_rotate - pivot
|
|
||||||
|
|
||||||
# calculate the upper left origin of the rotated image
|
|
||||||
origin = (pos[0] - originPos[0] + min_box[0] - pivot_move[0], pos[1] - originPos[1] - max_box[1] + pivot_move[1])
|
|
||||||
|
|
||||||
# get a rotated image
|
|
||||||
rotated_image = pygame.transform.rotate(image, angle)
|
|
||||||
|
|
||||||
# rotate and blit the image
|
|
||||||
surf.blit(rotated_image, origin)
|
|
||||||
|
|
||||||
def buildBackground( size, config ):
|
|
||||||
surface = pygame.Surface( size, pygame.SRCALPHA)
|
|
||||||
|
|
||||||
w = size[0]
|
|
||||||
h = size[1]
|
|
||||||
|
|
||||||
try:
|
|
||||||
dashedLineColor = pygame.Color( config.get('CompassBackground','dashedLineColor') )
|
|
||||||
except:
|
|
||||||
dashedLineColor = pygame.Color("Black")
|
|
||||||
|
|
||||||
try:
|
|
||||||
groundColor = pygame.Color( config.get('CompassBackground','groundColor'))
|
|
||||||
except:
|
|
||||||
groundColor = pygame.Color("Black")
|
|
||||||
|
|
||||||
radius = min( w, h ) // 2
|
|
||||||
angle = config.getint('CompassBackground', 'angleOffset')
|
|
||||||
angle = math.radians( angle )
|
|
||||||
|
|
||||||
dash_length = config.getint('CompassBackground','dashSize')
|
|
||||||
|
|
||||||
#Kaimauer
|
|
||||||
start = getPos( angle, radius, offset=radius )
|
|
||||||
end = getPos( angle+math.pi, radius, offset=radius )
|
|
||||||
draw_dashed_line(surface, dashedLineColor, start, end, width=2, dash_length= dash_length )
|
|
||||||
|
|
||||||
alpha = 2 * math.acos( 1-( (radius-10)/radius ) )
|
|
||||||
start = getPos( (math.pi/2) + (alpha/2) + angle, radius, offset=radius )
|
|
||||||
end = getPos( (math.pi/2) - (alpha/2) + angle, radius, offset=radius )
|
|
||||||
draw_dashed_line(surface, dashedLineColor, start, end, width=2, dash_length= dash_length )
|
|
||||||
|
|
||||||
start = getPos( angle+(math.pi/2), radius//10*8, offset=radius )
|
|
||||||
end = getPos( angle+(math.pi/2), radius//10*1, offset=radius )
|
|
||||||
|
|
||||||
#x1 = Point( start )
|
|
||||||
#x2 = Point( end )
|
|
||||||
#alpha = math.radians(20)
|
|
||||||
#d = len(x1 - x2)
|
|
||||||
#print(d)
|
|
||||||
#length = d * (1/math.sin(math.pi+alpha))
|
|
||||||
#print(length)
|
|
||||||
#x = d * math.cos( alpha )
|
|
||||||
#y = d * math.cos( alpha )
|
|
||||||
#print( x, y)
|
|
||||||
#pygame.draw.line( surface, groundColor, start, (x,y) )
|
|
||||||
|
|
||||||
txt = Text( 'Terminal', 20 )
|
|
||||||
txt.setColor('Lightgrey')
|
|
||||||
txt_surface = pygame.transform.rotate( txt.get(), -math.degrees(angle) )
|
|
||||||
pos = getPos(angle+(math.pi/2), radius/10*2, radius-txt.getWidth()//2)
|
|
||||||
surface.blit( txt_surface, pos )
|
|
||||||
|
|
||||||
#circle_surface = pygame.Surface( size, pygame.SRCALPHA)
|
|
||||||
#pygame.draw.circle( circle_surface, groundColor, (w//2, h//2), radius, width=0, draw_bottom_left=True)
|
|
||||||
#pygame.draw.circle( circle_surface, groundColor, (w//2, h//2), radius, width=0, draw_bottom_right=True)
|
|
||||||
#blitRotate(surface, circle_surface, (w//2,h//2), (w//2,h//2), -math.degrees(angle))
|
|
||||||
|
|
||||||
return surface
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
|
|
||||||
#load config
|
|
||||||
config = configparser.ConfigParser()
|
|
||||||
config.read("config.ini")
|
|
||||||
|
|
||||||
fullscreen = config.getboolean('General', 'fullscreen')
|
|
||||||
timeToEnd = config.getfloat('General','timetoend')
|
|
||||||
|
|
||||||
screen = Screen(800,480, fullscreen)
|
|
||||||
screen.setCaption("Windmessanlage")
|
|
||||||
screen.background("white")
|
|
||||||
|
|
||||||
#Splashscreen
|
|
||||||
splashscreen(screen, config.getfloat('Splashscreen','fadein'), config.getfloat('Splashscreen','solid'), config.getfloat('Splashscreen','fadeout'), config.getint('Splashscreen','font_size'))
|
|
||||||
|
|
||||||
#-average speed 2min
|
|
||||||
size = ( int(config.get('AVG2Speed','width')), int(config.get('AVG2Speed','height')) )
|
|
||||||
x = int(config.get('AVG2Speed','x'))
|
|
||||||
y = int(config.get('AVG2Speed','y'))
|
|
||||||
averageSpeed2 = Textbox( size, x, y, int(config.get('AVG2Speed','font_size')) )
|
|
||||||
averageSpeed2.setText("Ø 2min:\n{}m/s")
|
|
||||||
averageSpeed2.setBackgroundColor("Black")
|
|
||||||
|
|
||||||
#-average speed 10min
|
|
||||||
size = ( int(config.get('AVG10Speed','width')), int(config.get('AVG10Speed','height')) )
|
|
||||||
x = int(config.get('AVG10Speed','x'))
|
|
||||||
y = int(config.get('AVG10Speed','y'))
|
|
||||||
averageSpeed10 = Textbox( size, x, y, int(config.get('AVG10Speed','font_size')) )
|
|
||||||
averageSpeed10.setText("\nØ 10min:\n{}m/s")
|
|
||||||
averageSpeed10.setBackgroundColor("Black")
|
|
||||||
|
|
||||||
#-max speed 2min
|
|
||||||
size = ( int(config.get('Max2Speed','width')), int(config.get('Max2Speed','height')) )
|
|
||||||
x = int(config.get('Max2Speed','x'))
|
|
||||||
y = int(config.get('Max2Speed','y'))
|
|
||||||
maxSpeed2 = Textbox( size, x, y, int(config.get('Max2Speed','font_size')) )
|
|
||||||
maxSpeed2.setText("Max 2min:\n{}m/s")
|
|
||||||
maxSpeed2.setBackgroundColor("black")
|
|
||||||
|
|
||||||
|
|
||||||
#-max speed 10min
|
|
||||||
size = ( int(config.get('Max10Speed','width')), int(config.get('Max10Speed','height')) )
|
|
||||||
x = int(config.get('Max10Speed','x'))
|
|
||||||
y = int(config.get('Max10Speed','y'))
|
|
||||||
maxSpeed10 = Textbox( size, x, y, int(config.get('Max10Speed','font_size')) )
|
|
||||||
maxSpeed10.setText("\nMax 10min:\n{}m/s")
|
|
||||||
maxSpeed10.setBackgroundColor("Black")
|
|
||||||
|
|
||||||
#compass
|
|
||||||
compass = OuterNeedle(int(config.get('Compass','font_size')), (int(config.get('Compass','width')), int(config.get('Compass','height'))) )
|
|
||||||
compass.setX( int(config.get('Compass','x')) )
|
|
||||||
compass.setY( int(config.get('Compass','y')) )
|
|
||||||
compass.setBackgroundColor( config.get('Compass', 'background') )
|
|
||||||
compass.setNeedleColor( config.get('Compass', 'needle_color') )
|
|
||||||
compass.setLineLength( config.getint('Compass', 'lineLength') )
|
|
||||||
|
|
||||||
compass.setBackgroundSurface( buildBackground( (int(config.get('Compass','width')), int(config.get('Compass','height'))), config ) )
|
|
||||||
|
|
||||||
#-Current speed
|
|
||||||
currentSpeed = VariableText("", int(config.get('CurrentSpeed','font_size')))
|
|
||||||
currentSpeed.setX(int(config.get('CurrentSpeed','x')))
|
|
||||||
currentSpeed.setY(int(config.get('CurrentSpeed','y')))
|
|
||||||
currentSpeed.setUnit("m/s")
|
|
||||||
currentSpeed.setColor("white")
|
|
||||||
|
|
||||||
#MQTT
|
|
||||||
topic = config.get('MQTT','topic')
|
|
||||||
mqttc = mqtt.Client()
|
|
||||||
mqttc.on_connect = on_connect
|
|
||||||
|
|
||||||
data = DataObject()
|
|
||||||
mqttc.message_callback_add( config.get('MQTT','topic'), data.data)
|
|
||||||
mqttc.message_callback_add( config.get('MQTT','config'), data.config)
|
|
||||||
|
|
||||||
mqtt_host = config.get('MQTT', 'host')
|
|
||||||
mqtt_port = int(config.get('MQTT', 'port'))
|
|
||||||
|
|
||||||
|
|
||||||
screen.reset()
|
|
||||||
screen.blit( Text("Try to connect to MQTT server", 24).get(), 0, 0)
|
|
||||||
screen.blit( Text("Server: {0}:{1}".format(mqtt_host, mqtt_port),24).get(), 0, 25)
|
|
||||||
screen.update()
|
|
||||||
pygame.mouse.set_visible(False)
|
|
||||||
|
|
||||||
while(True):
|
|
||||||
try:
|
|
||||||
mqttc.connect(mqtt_host, port=mqtt_port, keepalive=int(config.get('MQTT', 'keepalive')))
|
|
||||||
break
|
|
||||||
except (KeyboardInterrupt, SystemExit):
|
|
||||||
print("KeyboardInterrupt or SystemExit")
|
|
||||||
raise
|
|
||||||
except:
|
|
||||||
time.sleep(3)
|
|
||||||
print("Try to reconnect")
|
|
||||||
mqttc.loop_start()
|
|
||||||
|
|
||||||
|
|
||||||
#limit framerate
|
|
||||||
clock = pygame.time.Clock()
|
|
||||||
time_start = 0
|
|
||||||
|
|
||||||
while True:
|
|
||||||
e = pygame.event.poll()
|
|
||||||
if e.type == pygame.QUIT:
|
|
||||||
break
|
|
||||||
|
|
||||||
if e.type == pygame.MOUSEBUTTONDOWN:
|
|
||||||
time_start = time.time()
|
|
||||||
|
|
||||||
if e.type == pygame.MOUSEBUTTONUP:
|
|
||||||
if (time.time() - time_start > timeToEnd):
|
|
||||||
print("{}s".format(time.time() - time_start))
|
|
||||||
break
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
screen.reset()
|
|
||||||
currentSpeed.update(data.currentSpeed)
|
|
||||||
averageSpeed2.update(data.speed2AVG)
|
|
||||||
averageSpeed10.update(data.speed2AVG)
|
|
||||||
maxSpeed2.update(data.speed2Max)
|
|
||||||
maxSpeed10.update(data.speed10Max)
|
|
||||||
compass.update(data.compass)
|
|
||||||
|
|
||||||
|
|
||||||
screen.blit( averageSpeed2.get(), averageSpeed2.getX(), averageSpeed2.getY() )
|
|
||||||
screen.blit( averageSpeed10.get(), averageSpeed10.getX(), averageSpeed10.getY() )
|
|
||||||
screen.blit( maxSpeed2.get(), maxSpeed2.getX(), maxSpeed2.getY() )
|
|
||||||
screen.blit( maxSpeed10.get(), maxSpeed10.getX(), maxSpeed10.getY() )
|
|
||||||
screen.blit( compass.get(), compass.getX(), compass.getY() )
|
|
||||||
screen.blit( currentSpeed.get(), currentSpeed.getX(), currentSpeed.getY() )
|
|
||||||
screen.update()
|
|
||||||
|
|
||||||
#Limit to 30 fps
|
|
||||||
clock.tick(30)
|
|
||||||
|
|
||||||
|
|
||||||
screen.quit()
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 89 KiB |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
Before Width: | Height: | Size: 131 KiB |
Binary file not shown.
1
Sensor
1
Sensor
|
|
@ -1 +0,0 @@
|
||||||
Subproject commit a0f3d0edd763ab211ea345604120dc37abefe74b
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
Subproject commit a0f3d0edd763ab211ea345604120dc37abefe74b
|
|
||||||
Loading…
Reference in New Issue