mirror of
https://github.com/Schrolli91/BOSWatch.git
synced 2026-04-21 06:13:39 +00:00
insert history and status pages to alarmMonitorRPi
This commit is contained in:
parent
646a2b2913
commit
f7ee3afb5c
4 changed files with 292 additions and 44 deletions
|
|
@ -14,6 +14,8 @@ Implemented functions:
|
||||||
- different colours for no alarm, test alarm and alarm
|
- different colours for no alarm, test alarm and alarm
|
||||||
- auto-turn-off display
|
- auto-turn-off display
|
||||||
- show POCSAG is alive status (coloured clock)
|
- show POCSAG is alive status (coloured clock)
|
||||||
|
- history of up to 5 alarms
|
||||||
|
- status informations
|
||||||
|
|
||||||
@author: Jens Herrmann
|
@author: Jens Herrmann
|
||||||
|
|
||||||
|
|
@ -45,8 +47,8 @@ try:
|
||||||
# create a display logger
|
# create a display logger
|
||||||
ch = logging.StreamHandler()
|
ch = logging.StreamHandler()
|
||||||
# log level for display >= info
|
# log level for display >= info
|
||||||
#ch.setLevel(logging.INFO)
|
ch.setLevel(logging.INFO)
|
||||||
ch.setLevel(logging.DEBUG)
|
#ch.setLevel(logging.DEBUG)
|
||||||
ch.setFormatter(formatter)
|
ch.setFormatter(formatter)
|
||||||
myLogger.addHandler(ch)
|
myLogger.addHandler(ch)
|
||||||
|
|
||||||
|
|
@ -113,6 +115,19 @@ try:
|
||||||
functionCharAlarm = [x.strip() for x in globals.config.get("AlarmMonitor","functionCharAlarm").replace(";", ",").split(",")]
|
functionCharAlarm = [x.strip() for x in globals.config.get("AlarmMonitor","functionCharAlarm").replace(";", ",").split(",")]
|
||||||
logging.debug("-- functionCharAlarm: %s", functionCharAlarm)
|
logging.debug("-- functionCharAlarm: %s", functionCharAlarm)
|
||||||
|
|
||||||
|
#
|
||||||
|
# try to read History from MySQL-DB
|
||||||
|
#
|
||||||
|
try:
|
||||||
|
# if db is enabled
|
||||||
|
pass
|
||||||
|
except:
|
||||||
|
# error, but we could work without history
|
||||||
|
pass
|
||||||
|
|
||||||
|
globals.startTime = int(time.time())
|
||||||
|
logging.info("alarmMonitor on standby")
|
||||||
|
|
||||||
#
|
#
|
||||||
# Main Program
|
# Main Program
|
||||||
# (Threads will set abort to True if an error occurs)
|
# (Threads will set abort to True if an error occurs)
|
||||||
|
|
@ -137,28 +152,41 @@ try:
|
||||||
logging.debug("Alarmmessage arrived")
|
logging.debug("Alarmmessage arrived")
|
||||||
logging.debug("-- ric: %s", parsed_json['ric'])
|
logging.debug("-- ric: %s", parsed_json['ric'])
|
||||||
logging.debug("-- functionChar: %s", parsed_json['functionChar'])
|
logging.debug("-- functionChar: %s", parsed_json['functionChar'])
|
||||||
|
|
||||||
|
# current time for this loop:
|
||||||
|
curtime = int(time.time())
|
||||||
|
|
||||||
# keep alive calculation with additional RICs
|
# keep alive calculation with additional RICs
|
||||||
if parsed_json['ric'] in keepAliveRICs:
|
if int(parsed_json['ric']) in keepAliveRICs:
|
||||||
logging.info("POCSAG is alive")
|
logging.info("POCSAG is alive")
|
||||||
globals.lastAlarm = int(time.time())
|
globals.lastAlarm = curtime
|
||||||
|
globals.countKeepAlive += 1
|
||||||
|
|
||||||
# (test) alarm processing
|
# (test) alarm processing
|
||||||
elif parsed_json['ric'] in alarmRICs:
|
elif int(parsed_json['ric']) in alarmRICs:
|
||||||
logging.debug("We have do to something")
|
logging.debug("We have do to something")
|
||||||
if parsed_json['functionChar'] in functionCharTestAlarm:
|
if parsed_json['functionChar'] in functionCharTestAlarm:
|
||||||
logging.info("-> Probealarm: %s", parsed_json['ric'])
|
logging.info("-> Probealarm: %s", parsed_json['ric'])
|
||||||
globals.screenBackground = pygame.Color(globals.config.get("AlarmMonitor","colourYellow"))
|
globals.screenBackground = pygame.Color(globals.config.get("AlarmMonitor","colourYellow"))
|
||||||
|
globals.countTestAlarm += 1
|
||||||
elif parsed_json['functionChar'] in functionCharAlarm:
|
elif parsed_json['functionChar'] in functionCharAlarm:
|
||||||
logging.info("-> Alarm: %s", parsed_json['ric'])
|
logging.info("-> Alarm: %s", parsed_json['ric'])
|
||||||
globals.screenBackground = pygame.Color(globals.config.get("AlarmMonitor","colourRed"))
|
globals.screenBackground = pygame.Color(globals.config.get("AlarmMonitor","colourRed"))
|
||||||
|
globals.countAlarm += 1
|
||||||
|
|
||||||
# forward data to alarmMonitor
|
# forward data to alarmMonitor
|
||||||
globals.data = parsed_json
|
globals.data = parsed_json
|
||||||
|
globals.data['timestamp'] = curtime
|
||||||
|
# save 5 alarm history entries
|
||||||
|
globals.alarmHistory.append(globals.data)
|
||||||
|
if len(globals.alarmHistory) > 5:
|
||||||
|
globals.alarmHistory.pop(0)
|
||||||
# update lastAlarm for keep alive calculation
|
# update lastAlarm for keep alive calculation
|
||||||
globals.lastAlarm = int(time.time())
|
globals.lastAlarm = curtime
|
||||||
# enable display for n seconds:
|
# enable display for n seconds:
|
||||||
globals.enableDisplayUntil = int(time.time()) + globals.config.getint("AlarmMonitor","showAlarmTime")
|
globals.enableDisplayUntil = curtime + globals.config.getint("AlarmMonitor","showAlarmTime")
|
||||||
# tell alarm-thread to turn on the display
|
# tell alarm-thread to turn on the display
|
||||||
|
globals.navigation = "alarmPage"
|
||||||
globals.showDisplay = True;
|
globals.showDisplay = True;
|
||||||
|
|
||||||
except KeyError:
|
except KeyError:
|
||||||
|
|
|
||||||
|
|
@ -41,6 +41,7 @@ def autoTurnOffDisplay():
|
||||||
# check if timestamp is in the past
|
# check if timestamp is in the past
|
||||||
if (globals.showDisplay == True) and (globals.enableDisplayUntil < int(time.time())):
|
if (globals.showDisplay == True) and (globals.enableDisplayUntil < int(time.time())):
|
||||||
globals.showDisplay = False
|
globals.showDisplay = False
|
||||||
|
globals.navigation = "alarmPage"
|
||||||
logging.info("display turned off")
|
logging.info("display turned off")
|
||||||
# we will do this only one time per second
|
# we will do this only one time per second
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
|
|
@ -103,13 +104,37 @@ def eventHandler():
|
||||||
|
|
||||||
# if touchscreen pressed
|
# if touchscreen pressed
|
||||||
if event.type == pygame.MOUSEBUTTONDOWN:
|
if event.type == pygame.MOUSEBUTTONDOWN:
|
||||||
if globals.showDisplay:
|
(posX, posY) = (pygame.mouse.get_pos() [0], pygame.mouse.get_pos() [1])
|
||||||
logging.info("turn OFF display")
|
#logging.debug("position: (%s, %s)", posX, posY)
|
||||||
globals.showDisplay = False
|
|
||||||
else:
|
# touching the dark display will turn it on for n sec
|
||||||
|
if globals.showDisplay == False:
|
||||||
logging.info("turn ON display")
|
logging.info("turn ON display")
|
||||||
globals.enableDisplayUntil = curtime + globals.config.getint("AlarmMonitor","showDisplayTime")
|
globals.enableDisplayUntil = curtime + globals.config.getint("AlarmMonitor","showDisplayTime")
|
||||||
|
globals.navigation == "alarmPage"
|
||||||
globals.showDisplay = True
|
globals.showDisplay = True
|
||||||
|
else:
|
||||||
|
# touching the enabled display will be content sensitive...
|
||||||
|
# if top 2/3: turn of display
|
||||||
|
yBoundary = globals.config.getint("Display","displayHeight") - 80
|
||||||
|
if 0 <= posY <= yBoundary:
|
||||||
|
logging.info("turn OFF display")
|
||||||
|
globals.showDisplay = False
|
||||||
|
globals.navigation = "alarmPage"
|
||||||
|
else:
|
||||||
|
# we are in the navigation area
|
||||||
|
globals.enableDisplayUntil = curtime + globals.config.getint("AlarmMonitor","showDisplayTime")
|
||||||
|
if 0 <= posX <= 110:
|
||||||
|
globals.navigation = "historyPage"
|
||||||
|
elif 111 <= posX <= 210:
|
||||||
|
globals.navigation = "statusPage"
|
||||||
|
logging.debug("Navigation: Status")
|
||||||
|
else:
|
||||||
|
globals.screenBackground = pygame.Color(globals.config.get("AlarmMonitor","colourGreen"))
|
||||||
|
globals.navigation = "alarmPage"
|
||||||
|
## end if showDisplay
|
||||||
|
## end if event MOUSEBUTTONDOWN
|
||||||
|
## end for event
|
||||||
except:
|
except:
|
||||||
logging.error("unknown error in eventHandler-thread")
|
logging.error("unknown error in eventHandler-thread")
|
||||||
logging.debug("unknown error in eventHandler-thread", exc_info=True)
|
logging.debug("unknown error in eventHandler-thread", exc_info=True)
|
||||||
|
|
@ -150,6 +175,7 @@ def displayPainter():
|
||||||
import RPi.GPIO as GPIO
|
import RPi.GPIO as GPIO
|
||||||
import pygame
|
import pygame
|
||||||
from wrapline import wrapline
|
from wrapline import wrapline
|
||||||
|
from roundrects import round_rect
|
||||||
import globals
|
import globals
|
||||||
|
|
||||||
logging.debug("displayPainter-thread called")
|
logging.debug("displayPainter-thread called")
|
||||||
|
|
@ -175,13 +201,23 @@ def displayPainter():
|
||||||
fontHeader.set_bold(True)
|
fontHeader.set_bold(True)
|
||||||
fontHeader.set_underline(True)
|
fontHeader.set_underline(True)
|
||||||
|
|
||||||
fontRIC = pygame.font.Font(None, 30)
|
|
||||||
fontRIC.set_bold(True)
|
|
||||||
|
|
||||||
fontMsg = pygame.font.Font(None, 20)
|
|
||||||
fontTime = pygame.font.Font(None, 15)
|
fontTime = pygame.font.Font(None, 15)
|
||||||
|
|
||||||
|
fontRIC = pygame.font.Font(None, 30)
|
||||||
|
fontRIC.set_bold(True)
|
||||||
|
fontMsg = pygame.font.Font(None, 20)
|
||||||
|
fontHistory = pygame.font.Font(None, 15)
|
||||||
|
|
||||||
|
fontStatus = pygame.font.Font(None, 20)
|
||||||
|
fontStatus.set_bold(True)
|
||||||
|
fontStatusContent = pygame.font.Font(None, 20)
|
||||||
|
|
||||||
|
fontButton = pygame.font.Font(None, 20)
|
||||||
|
|
||||||
clock = pygame.time.Clock()
|
clock = pygame.time.Clock()
|
||||||
|
|
||||||
|
# Build Lists out of config-entries
|
||||||
|
functionCharTestAlarm = [x.strip() for x in globals.config.get("AlarmMonitor","functionCharTestAlarm").replace(";", ",").split(",")]
|
||||||
|
|
||||||
logging.debug("displayPainter-thread started")
|
logging.debug("displayPainter-thread started")
|
||||||
|
|
||||||
|
|
@ -194,44 +230,21 @@ def displayPainter():
|
||||||
# current time for this loop:
|
# current time for this loop:
|
||||||
curtime = int(time.time())
|
curtime = int(time.time())
|
||||||
|
|
||||||
if globals.showDisplay:
|
if globals.showDisplay == True:
|
||||||
# Enable LCD display
|
# Enable LCD display
|
||||||
GPIO.output(globals.config.getint("Display","GPIOPinForBacklight"), GPIO.HIGH)
|
GPIO.output(globals.config.getint("Display","GPIOPinForBacklight"), GPIO.HIGH)
|
||||||
# Clear the screen and set the screen background
|
# Clear the screen and set the screen background
|
||||||
screen.fill(globals.screenBackground)
|
screen.fill(globals.screenBackground)
|
||||||
|
# paint black rect, so Background looks like a boarder
|
||||||
widthX = globals.config.getint("Display","displayWidth") - 20
|
widthX = globals.config.getint("Display","displayWidth") - 20
|
||||||
widthY = globals.config.getint("Display","displayHeight") - 20
|
widthY = globals.config.getint("Display","displayHeight") - 20
|
||||||
pygame.draw.rect(screen, pygame.Color(globals.config.get("AlarmMonitor","colourBlack")), (10, 10, widthX, widthY))
|
pygame.draw.rect(screen, pygame.Color(globals.config.get("AlarmMonitor","colourBlack")), (10, 10, widthX, widthY))
|
||||||
|
|
||||||
# header
|
# header
|
||||||
header = fontHeader.render("Alarm-Monitor", 1, pygame.Color(globals.config.get("AlarmMonitor","colourRed")))
|
header = fontHeader.render("Alarm-Monitor", 1, pygame.Color(globals.config.get("AlarmMonitor","colourRed")))
|
||||||
(width, height) = fontHeader.size("Alarm-Monitor")
|
(width, height) = fontHeader.size("Alarm-Monitor")
|
||||||
x = (int(globals.config.getint("Display","displayWidth")) - width)/2
|
x = (int(globals.config.getint("Display","displayWidth")) - width)/2
|
||||||
screen.blit(header, (x, 20))
|
screen.blit(header, (x, 20))
|
||||||
|
|
||||||
# Alarm - RIC:
|
|
||||||
try:
|
|
||||||
y = 50
|
|
||||||
textLines = wrapline(globals.data['description'], fontRIC, (globals.config.getint("Display","displayWidth") - 40))
|
|
||||||
for index, item in enumerate(textLines):
|
|
||||||
textZeile = fontRIC.render(item, 1, pygame.Color(globals.config.get("AlarmMonitor","colourWhite")))
|
|
||||||
screen.blit(textZeile, (20, y))
|
|
||||||
y += 25
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
# Alarm - Text
|
|
||||||
try:
|
|
||||||
y += 10
|
|
||||||
textLines = wrapline(globals.data['msg'].replace("*", " * "), fontMsg, (globals.config.getint("Display","displayWidth") - 40))
|
|
||||||
for index, item in enumerate(textLines):
|
|
||||||
textZeile = fontMsg.render(item, 1, pygame.Color(globals.config.get("AlarmMonitor","colourGrey")))
|
|
||||||
screen.blit(textZeile, (20, y))
|
|
||||||
y += 20
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
# show time of last alarm
|
# show time of last alarm
|
||||||
if globals.lastAlarm > 0:
|
if globals.lastAlarm > 0:
|
||||||
try:
|
try:
|
||||||
|
|
@ -254,16 +267,148 @@ def displayPainter():
|
||||||
except:
|
except:
|
||||||
logging.debug("unknown error in lastAlarm", exc_info=True)
|
logging.debug("unknown error in lastAlarm", exc_info=True)
|
||||||
pass
|
pass
|
||||||
|
## end if globals.lastAlarm > 0
|
||||||
|
|
||||||
# show remaining time before display will be turned off:
|
# show remaining time before display will be turned off:
|
||||||
restZeit = globals.enableDisplayUntil - curtime +1
|
restZeit = globals.enableDisplayUntil - curtime +1
|
||||||
zeit = fontTime.render(str(restZeit), 1, pygame.Color(globals.config.get("AlarmMonitor","colourDimGrey")))
|
zeit = fontTime.render(str(restZeit), 1, pygame.Color(globals.config.get("AlarmMonitor","colourDimGrey")))
|
||||||
screen.blit(zeit, (20, 20))
|
screen.blit(zeit, (20, 20))
|
||||||
|
|
||||||
|
#
|
||||||
|
# content given by navigation:
|
||||||
|
# default is "alarmPage"
|
||||||
|
#
|
||||||
|
# Startpoint for content
|
||||||
|
if globals.navigation == "historyPage":
|
||||||
|
try:
|
||||||
|
y = 50
|
||||||
|
for data in reversed(globals.alarmHistory):
|
||||||
|
# 1. Line Description
|
||||||
|
textString = time.strftime("%d.%m.%Y %H:%M:%S", time.localtime(data['timestamp'])) + ": " + data['description']
|
||||||
|
textLines = wrapline(textString, fontHistory, (globals.config.getint("Display","displayWidth") - 40))
|
||||||
|
if data['functionChar'] in functionCharTestAlarm:
|
||||||
|
colour = globals.config.get("AlarmMonitor","colourYellow")
|
||||||
|
else:
|
||||||
|
colour = globals.config.get("AlarmMonitor","colourRed")
|
||||||
|
for index, item in enumerate(textLines):
|
||||||
|
textZeile = fontHistory.render(item, 1, pygame.Color(colour))
|
||||||
|
screen.blit(textZeile, (20, y))
|
||||||
|
(width, height) = fontHistory.size(item)
|
||||||
|
y += height
|
||||||
|
# 2. Line Msg
|
||||||
|
textLines = wrapline(data['msg'], fontHistory, (globals.config.getint("Display","displayWidth") - 40))
|
||||||
|
for index, item in enumerate(textLines):
|
||||||
|
textZeile = fontHistory.render(item, 1, pygame.Color(globals.config.get("AlarmMonitor","colourGrey")))
|
||||||
|
screen.blit(textZeile, (20, y))
|
||||||
|
(width, height) = fontHistory.size(item)
|
||||||
|
y += height
|
||||||
|
y += 2
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
## end if globals.navigation == "historyPage"
|
||||||
|
|
||||||
|
elif globals.navigation == "statusPage":
|
||||||
|
(width, height) = fontStatusContent.size("Anzahl Test-Alarme:")
|
||||||
|
y = 70
|
||||||
|
x = width + 10
|
||||||
|
# Running since:
|
||||||
|
title = fontStatusContent.render("Gestartet:", 1, pygame.Color(globals.config.get("AlarmMonitor","colourWhite")))
|
||||||
|
content = fontStatusContent.render(time.strftime("%d.%m.%Y %H:%M:%S", time.localtime(globals.startTime)), 1, pygame.Color(globals.config.get("AlarmMonitor","colourGrey")))
|
||||||
|
screen.blit(title, (20, y))
|
||||||
|
screen.blit(content, (20 +x, y))
|
||||||
|
y += height + 10
|
||||||
|
|
||||||
|
# Last Alarm
|
||||||
|
title = fontStatusContent.render("Letzte Nachricht:", 1, pygame.Color(globals.config.get("AlarmMonitor","colourWhite")))
|
||||||
|
if globals.lastAlarm > 0:
|
||||||
|
content = fontStatusContent.render(time.strftime("%d.%m.%Y %H:%M:%S", time.localtime(globals.lastAlarm)), 1, timeColour)
|
||||||
|
else:
|
||||||
|
content = fontStatusContent.render("-", 1, pygame.Color(globals.config.get("AlarmMonitor","colourGrey")))
|
||||||
|
screen.blit(title, (20, y))
|
||||||
|
screen.blit(content, (20 +x, y))
|
||||||
|
y += height + 10
|
||||||
|
|
||||||
|
# Number of Alarms
|
||||||
|
title = fontStatusContent.render("Anzahl Alarme:", 1, pygame.Color(globals.config.get("AlarmMonitor","colourWhite")))
|
||||||
|
content = fontStatusContent.render(str(globals.countAlarm), 1, pygame.Color(globals.config.get("AlarmMonitor","colourGrey")))
|
||||||
|
screen.blit(title, (20, y))
|
||||||
|
screen.blit(content, (20 +x, y))
|
||||||
|
y += height + 10
|
||||||
|
|
||||||
|
# Number of TestAlarms
|
||||||
|
title = fontStatusContent.render("Anzahl Test-Alarme:", 1, pygame.Color(globals.config.get("AlarmMonitor","colourWhite")))
|
||||||
|
content = fontStatusContent.render(str(globals.countTestAlarm), 1, pygame.Color(globals.config.get("AlarmMonitor","colourGrey")))
|
||||||
|
screen.blit(title, (20, y))
|
||||||
|
screen.blit(content, (20 +x, y))
|
||||||
|
y += height + 10
|
||||||
|
|
||||||
|
# Number of DAU-Msgs
|
||||||
|
title = fontStatusContent.render("Anzahl DAU-Tests:", 1, pygame.Color(globals.config.get("AlarmMonitor","colourWhite")))
|
||||||
|
content = fontStatusContent.render(str(globals.countKeepAlive), 1, pygame.Color(globals.config.get("AlarmMonitor","colourGrey")))
|
||||||
|
screen.blit(title, (20, y))
|
||||||
|
screen.blit(content, (20 +x, y))
|
||||||
|
y += height + 10
|
||||||
|
|
||||||
|
## end if globals.navigation == "statusPage"
|
||||||
|
|
||||||
|
else:
|
||||||
|
y = 50
|
||||||
|
# Alarm - RIC:
|
||||||
|
try:
|
||||||
|
textLines = wrapline(globals.data['description'], fontRIC, (globals.config.getint("Display","displayWidth") - 40))
|
||||||
|
for index, item in enumerate(textLines):
|
||||||
|
textZeile = fontRIC.render(item, 1, pygame.Color(globals.config.get("AlarmMonitor","colourWhite")))
|
||||||
|
screen.blit(textZeile, (20, y))
|
||||||
|
y += 25
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
# Alarm - Text
|
||||||
|
try:
|
||||||
|
y += 10
|
||||||
|
textLines = wrapline(globals.data['msg'].replace("*", " * "), fontMsg, (globals.config.getint("Display","displayWidth") - 40))
|
||||||
|
for index, item in enumerate(textLines):
|
||||||
|
textZeile = fontMsg.render(item, 1, pygame.Color(globals.config.get("AlarmMonitor","colourGrey")))
|
||||||
|
screen.blit(textZeile, (20, y))
|
||||||
|
y += 20
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
## end if default navigation
|
||||||
|
|
||||||
|
# paint navigation buttons
|
||||||
|
buttonWidth = 80
|
||||||
|
buttonHeight = 25
|
||||||
|
buttonY = globals.config.getint("Display","displayHeight") - buttonHeight - 2
|
||||||
|
|
||||||
|
round_rect(screen, ( 20, buttonY, buttonWidth, buttonHeight), pygame.Color(globals.config.get("AlarmMonitor","colourDimGrey")), 10, 1, pygame.Color(globals.config.get("AlarmMonitor","colourGrey")))
|
||||||
|
buttonText = fontButton.render("Verlauf", 1, pygame.Color(globals.config.get("AlarmMonitor","colourBlack")))
|
||||||
|
(width, height) = fontButton.size("Verlauf")
|
||||||
|
textX = 20 + (buttonWidth - width)/2
|
||||||
|
textY = buttonY + (buttonHeight - height)/2
|
||||||
|
screen.blit(buttonText, (textX, textY))
|
||||||
|
|
||||||
|
round_rect(screen, (120, buttonY, buttonWidth, buttonHeight), pygame.Color(globals.config.get("AlarmMonitor","colourDimGrey")), 10, 1, pygame.Color(globals.config.get("AlarmMonitor","colourGrey")))
|
||||||
|
buttonText = fontButton.render("Status", 1, pygame.Color(globals.config.get("AlarmMonitor","colourBlack")))
|
||||||
|
(width, height) = fontButton.size("Status")
|
||||||
|
textX = 120 + (buttonWidth - width)/2
|
||||||
|
textY = buttonY + (buttonHeight - height)/2
|
||||||
|
screen.blit(buttonText, (textX, textY))
|
||||||
|
|
||||||
|
round_rect(screen, (220, buttonY, buttonWidth, buttonHeight), pygame.Color(globals.config.get("AlarmMonitor","colourDimGrey")), 10, 1, pygame.Color(globals.config.get("AlarmMonitor","colourGrey")))
|
||||||
|
buttonText = fontButton.render("Gelesen", 1, pygame.Color(globals.config.get("AlarmMonitor","colourBlack")))
|
||||||
|
(width, height) = fontButton.size("Gelesen")
|
||||||
|
textX = 220 + (buttonWidth - width)/2
|
||||||
|
textY = buttonY + (buttonHeight - height)/2
|
||||||
|
screen.blit(buttonText, (textX, textY))
|
||||||
|
|
||||||
|
## end if globals.showDisplay == True
|
||||||
|
|
||||||
else:
|
else:
|
||||||
GPIO.output(globals.config.getint("Display","GPIOPinForBacklight"), GPIO.LOW)
|
GPIO.output(globals.config.getint("Display","GPIOPinForBacklight"), GPIO.LOW)
|
||||||
|
|
||||||
# Update display...
|
# Update display...
|
||||||
pygame.display.update()
|
pygame.display.update()
|
||||||
|
## end while globals.running == True
|
||||||
|
|
||||||
except:
|
except:
|
||||||
logging.error("unknown error in displayPainter-thread")
|
logging.error("unknown error in displayPainter-thread")
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,9 @@
|
||||||
# -*- coding: UTF-8 -*-
|
# -*- coding: UTF-8 -*-
|
||||||
#
|
#
|
||||||
|
|
||||||
|
# configparser (Configparser)
|
||||||
|
config = 0
|
||||||
|
|
||||||
# control-params (Boolean)
|
# control-params (Boolean)
|
||||||
running = True
|
running = True
|
||||||
showDisplay = False
|
showDisplay = False
|
||||||
|
|
@ -10,14 +13,23 @@ abort = False
|
||||||
# color of display-boarder
|
# color of display-boarder
|
||||||
screenBackground = ""
|
screenBackground = ""
|
||||||
|
|
||||||
|
# navigation = ""
|
||||||
|
navigation = "alarmPage"
|
||||||
|
|
||||||
|
# enable display until (Timestamp)
|
||||||
|
enableDisplayUntil = 0
|
||||||
|
|
||||||
# data-structure (Dict)
|
# data-structure (Dict)
|
||||||
data = {}
|
data = {}
|
||||||
|
|
||||||
# last alarm shown (Timestamp)
|
# last alarm shown (Timestamp)
|
||||||
lastAlarm = 0
|
lastAlarm = 0
|
||||||
|
|
||||||
# enable display until (Timestamp)
|
# alarm history (List)
|
||||||
enableDisplayUntil = 0
|
alarmHistory = []
|
||||||
|
|
||||||
# configparser (Configparser)
|
# statusPage
|
||||||
config = 0
|
startTime = 0
|
||||||
|
countAlarm = 0
|
||||||
|
countTestAlarm = 0
|
||||||
|
countKeepAlive = 0
|
||||||
63
exampleAddOns/alarmMonitorRPi/roundrects.py
Normal file
63
exampleAddOns/alarmMonitorRPi/roundrects.py
Normal file
|
|
@ -0,0 +1,63 @@
|
||||||
|
"""
|
||||||
|
Rounded rectangles in both non-antialiased and antialiased varieties.
|
||||||
|
|
||||||
|
@author: Sean J. McKiernan
|
||||||
|
https://github.com/Mekire/rounded-rects-pygame
|
||||||
|
"""
|
||||||
|
|
||||||
|
import pygame as pg
|
||||||
|
|
||||||
|
from pygame import gfxdraw
|
||||||
|
|
||||||
|
|
||||||
|
def round_rect(surface, rect, color, rad=20, border=0, inside=(0,0,0,0)):
|
||||||
|
"""
|
||||||
|
Draw a rect with rounded corners to surface. Argument rad can be specified
|
||||||
|
to adjust curvature of edges (given in pixels). An optional border
|
||||||
|
width can also be supplied; if not provided the rect will be filled.
|
||||||
|
Both the color and optional interior color (the inside argument) support
|
||||||
|
alpha.
|
||||||
|
"""
|
||||||
|
rect = pg.Rect(rect)
|
||||||
|
zeroed_rect = rect.copy()
|
||||||
|
zeroed_rect.topleft = 0,0
|
||||||
|
image = pg.Surface(rect.size).convert_alpha()
|
||||||
|
image.fill((0,0,0,0))
|
||||||
|
_render_region(image, zeroed_rect, color, rad)
|
||||||
|
if border:
|
||||||
|
zeroed_rect.inflate_ip(-2*border, -2*border)
|
||||||
|
_render_region(image, zeroed_rect, inside, rad)
|
||||||
|
surface.blit(image, rect)
|
||||||
|
|
||||||
|
|
||||||
|
def _render_region(image, rect, color, rad):
|
||||||
|
"""Helper function for round_rect."""
|
||||||
|
corners = rect.inflate(-2*rad, -2*rad)
|
||||||
|
for attribute in ("topleft", "topright", "bottomleft", "bottomright"):
|
||||||
|
pg.draw.circle(image, color, getattr(corners,attribute), rad)
|
||||||
|
image.fill(color, rect.inflate(-2*rad,0))
|
||||||
|
image.fill(color, rect.inflate(0,-2*rad))
|
||||||
|
|
||||||
|
|
||||||
|
def aa_round_rect(surface, rect, color, rad=20, border=0, inside=(0,0,0)):
|
||||||
|
"""
|
||||||
|
Draw an antialiased rounded rect on the target surface. Alpha is not
|
||||||
|
supported in this implementation but other than that usage is identical to
|
||||||
|
round_rect.
|
||||||
|
"""
|
||||||
|
rect = pg.Rect(rect)
|
||||||
|
_aa_render_region(surface, rect, color, rad)
|
||||||
|
if border:
|
||||||
|
rect.inflate_ip(-2*border, -2*border)
|
||||||
|
_aa_render_region(surface, rect, inside, rad)
|
||||||
|
|
||||||
|
|
||||||
|
def _aa_render_region(image, rect, color, rad):
|
||||||
|
"""Helper function for aa_round_rect."""
|
||||||
|
corners = rect.inflate(-2*rad-1, -2*rad-1)
|
||||||
|
for attribute in ("topleft", "topright", "bottomleft", "bottomright"):
|
||||||
|
x, y = getattr(corners, attribute)
|
||||||
|
gfxdraw.aacircle(image, x, y, rad, color)
|
||||||
|
gfxdraw.filled_circle(image, x, y, rad, color)
|
||||||
|
image.fill(color, rect.inflate(-2*rad,0))
|
||||||
|
image.fill(color, rect.inflate(0,-2*rad))
|
||||||
Loading…
Add table
Add a link
Reference in a new issue