class MainWidget(QWidget): def __init__(self, config, logger): super(MainWidget, self).__init__() self.config = config self.logger = logger self.imageDir = self.config.get("display", "image_dir", fallback="images") self.alarm = None self.route = ([], None, None) self.seenPager = False self.seenXml = False self.seenJson = False self.reportDone = False self.alarmDateTime = None self.forwarder = Forwarder(config, logger) self.notifier = Notifier(config, logger) self.sound = Sound(config, logger) self.gpioControl = GpioControl(config, logger) self.tts = TextToSpeech(config, logger) self.reportTimer = QTimer(self) self.reportTimer.setInterval( \ self.config.getint("report", "timeout", fallback = 60) * 1000) self.reportTimer.setSingleShot(True) self.reportTimer.timeout.connect(self.generateReport) self.simTimer = QTimer(self) self.simTimer.setInterval(10000) self.simTimer.setSingleShot(True) self.simTimer.timeout.connect(self.simTimeout) #self.simTimer.start() self.idleTimer = QTimer(self) idleTimeout = self.config.getint("display", "idle_timeout", fallback=30) self.idleTimer.setInterval(idleTimeout * 60000) self.idleTimer.setSingleShot(True) self.idleTimer.timeout.connect(self.idleTimeout) self.screenTimer = QTimer(self) screenTimeout = self.config.getint("display", "screen_timeout", fallback=0) self.screenTimer.setInterval(screenTimeout * 60000) self.screenTimer.setSingleShot(True) self.screenTimer.timeout.connect(self.screenTimeout) if self.screenTimer.interval() > 0: self.screenTimer.start() # Presence ----------------------------------------------------------- self.presenceTimer = QTimer(self) self.presenceTimer.setInterval(1000) self.presenceTimer.setSingleShot(False) self.presenceTimer.timeout.connect(self.checkPresence) self.presenceTimer.start() self.switchOnTimes = [] self.switchOffTimes = [] if self.config.has_section('presence'): onRe = re.compile('on[0-9]+') offRe = re.compile('off[0-9]+') for key, value in self.config.items('presence'): ma = onRe.fullmatch(key) if ma: tup = self.parsePresence(key, value) if tup: self.switchOnTimes.append(tup) continue ma = offRe.fullmatch(key) if ma: tup = self.parsePresence(key, value) if tup: self.switchOffTimes.append(tup) continue self.updateNextSwitchTimes() # Appearance --------------------------------------------------------- self.logger.info('Setting up X server...') subprocess.call(['xset', 's', 'off']) subprocess.call(['xset', 's', 'noblank']) subprocess.call(['xset', 's', '0', '0']) subprocess.call(['xset', '-dpms']) self.move(0, 0) self.resize(1920, 1080) self.setWindowTitle('Alarmdisplay') self.setStyleSheet(""" font-size: 60px; background-color: rgb(0, 34, 44); color: rgb(2, 203, 255); font-family: "DejaVu Sans"; """) # Sub-widgets -------------------------------------------------------- layout = QVBoxLayout(self) layout.setSpacing(0) layout.setContentsMargins(0, 0, 0, 0) self.stackedWidget = QStackedWidget(self) layout.addWidget(self.stackedWidget) self.idleWidget = IdleWidget(self) self.idleWidget.start() self.stackedWidget.addWidget(self.idleWidget) self.alarmWidget = AlarmWidget(self) self.stackedWidget.addWidget(self.alarmWidget) self.errorWidget = QLabel(self) self.errorWidget.setGeometry(self.contentsRect()) self.errorWidget.setAlignment(Qt.AlignCenter | Qt.AlignVCenter) self.errorWidget.setStyleSheet(""" background-color: transparent; font-size: 20px; color: red; """) # Shortcuts ---------------------------------------------------------- action = QAction(self) action.setShortcut(QKeySequence("1")) action.setShortcutContext(Qt.ApplicationShortcut) action.triggered.connect(self.exampleJugend) self.addAction(action) action = QAction(self) action.setShortcut(QKeySequence("2")) action.setShortcutContext(Qt.ApplicationShortcut) action.triggered.connect(self.exampleEngels) self.addAction(action) action = QAction(self) action.setShortcut(QKeySequence("3")) action.setShortcutContext(Qt.ApplicationShortcut) action.triggered.connect(self.exampleSack) self.addAction(action) action = QAction(self) action.setShortcut(QKeySequence("4")) action.setShortcutContext(Qt.ApplicationShortcut) action.triggered.connect(self.exampleWolfsgrabenPager) self.addAction(action) action = QAction(self) action.setShortcut(QKeySequence("5")) action.setShortcutContext(Qt.ApplicationShortcut) action.triggered.connect(self.exampleWolfsgrabenMail) self.addAction(action) action = QAction(self) action.setShortcut(QKeySequence("6")) action.setShortcutContext(Qt.ApplicationShortcut) action.triggered.connect(self.exampleWald) self.addAction(action) action = QAction(self) action.setShortcut(QKeySequence("7")) action.setShortcutContext(Qt.ApplicationShortcut) action.triggered.connect(self.exampleStadtwerkePager) self.addAction(action) action = QAction(self) action.setShortcut(QKeySequence("8")) action.setShortcutContext(Qt.ApplicationShortcut) action.triggered.connect(self.exampleLebenshilfe) self.addAction(action) action = QAction(self) action.setShortcut(QKeySequence("9")) action.setShortcutContext(Qt.ApplicationShortcut) action.triggered.connect(self.exampleHuissen) self.addAction(action) # Threads ------------------------------------------------------------ self.receiverThread = QThread() self.alarmReceiver = AlarmReceiver(self.config, self.logger) self.alarmReceiver.receivedAlarm.connect(self.receivedPagerAlarm) self.alarmReceiver.finished.connect(self.receiverThread.quit) self.alarmReceiver.errorMessage.connect(self.receiverError) self.alarmReceiver.moveToThread(self.receiverThread) self.receiverThread.started.connect(self.alarmReceiver.receive) self.receiverThread.start() self.websocketReceiverThread = QThread() self.websocketReceiver = WebsocketReceiver(self.config, self.logger) self.websocketReceiver.receivedAlarm.connect( \ self.receivedWebsocketAlarm) self.websocketReceiver.finished.connect( \ self.websocketReceiverThread.quit) self.websocketReceiver.moveToThread(self.websocketReceiverThread) self.websocketReceiverThread.started.connect( \ self.websocketReceiver.receive) self.websocketReceiverThread.start() if self.websocketReceiver.status: self.statusWidget = StatusWidget(self) layout.addWidget(self.statusWidget) self.websocketReceiver.receivedStatus.connect( \ self.statusWidget.setStatus) if self.config.has_section('email') and \ self.config.get("email", "imap_host", fallback = ''): from ImapMonitor import ImapMonitor self.imapThread = QThread() self.imapMonitor = ImapMonitor(self.config, self.logger) self.imapMonitor.receivedAlarm.connect(self.receivedXmlAlarm) self.imapMonitor.moveToThread(self.imapThread) self.imapMonitor.finished.connect(self.imapThread.quit) self.imapThread.started.connect(self.imapMonitor.start) self.imapThread.start() self.socketListener = SocketListener(self.logger) self.socketListener.pagerAlarm.connect(self.receivedPagerAlarm) self.socketListener.xmlAlarm.connect(self.receivedXmlAlarm) self.cecThread = QThread() self.cecThread.start() self.cecCommand = CecCommand(self.logger) self.cecCommand.moveToThread(self.cecThread) self.report = AlarmReport(self.config, self.logger) try: self.notifier.startup() except: self.logger.error('Startup notification failed:', exc_info=True) self.logger.info('Setup finished.') #------------------------------------------------------------------------- def parsePresence(self, key, value): dateRe = re.compile('(\S+)\s(\d+):(\d+)') ma = dateRe.fullmatch(value) if not ma: logger.error("Invalid date spec for %s: %s", key, value) return hour = int(ma.group(2)) if hour >= 24: logger.error("Invalid hour in %s: %s", key, hour) return minute = int(ma.group(3)) if minute >= 60: logger.error("Invalid minute in %s: %s", key, minute) return try: tm = time.strptime(ma.group(1), '%a') except: logger.error("Invalid week day in %s: %s", key, ma.group(1)) return weekDay = tm.tm_wday return (weekDay, hour, minute) def updateNextSwitchTimes(self): self.nextSwitchOn = self.findNextEvent(self.switchOnTimes) self.logger.info("Next switch on: %s", self.nextSwitchOn) self.nextSwitchOff = self.findNextEvent(self.switchOffTimes) self.logger.info("Next switch off: %s", self.nextSwitchOff) def findNextEvent(self, tups): nextDt = None now = datetime.datetime.now() for tup in tups: date = now.date() dayDiff = (tup[0] - date.weekday() + 7) % 7 date = date + datetime.timedelta(days=dayDiff) dt = datetime.datetime(date.year, date.month, date.day, tup[1], tup[2]) if dt < now: dt = dt + datetime.timedelta(days=7) if not nextDt or nextDt > dt: nextDt = dt return nextDt def checkPresence(self): now = datetime.datetime.now() update = False if self.nextSwitchOn and now >= self.nextSwitchOn: update = True self.cecCommand.switchOn() elif self.nextSwitchOff and now >= self.nextSwitchOff: update = True # only switch off, if no alarm active alarm = self.idleTimer.isActive() or self.screenTimer.isActive() if not alarm: self.cecCommand.switchOff() if update: self.updateNextSwitchTimes() #------------------------------------------------------------------------- def receivedPagerAlarm(self, pagerStr): self.logger.info('Received pager alarm: %s', repr(pagerStr)) alarm = Alarm(self.config) alarm.fromPager(pagerStr, self.logger) try: self.notifier.pager(pagerStr) except: self.logger.error('Pager notification failed:', exc_info=True) self.processAlarm(alarm) #------------------------------------------------------------------------- def receiverError(self, errorMessage): self.errorWidget.setText(errorMessage) #------------------------------------------------------------------------- def receivedWebsocketAlarm(self, data): self.logger.info('Received websocket alarm: %s', repr(data)) alarm = Alarm(self.config) try: alarm.fromAlamos(data, self.logger) except: self.logger.error('Failed to process websocket alarm:', exc_info=True) return self.processAlarm(alarm) #------------------------------------------------------------------------- def receivedXmlAlarm(self, xmlContent): self.logger.info('Received XML alarm.') alarm = Alarm(self.config) try: alarm.fromXml(xmlContent, self.logger) except: self.logger.error('Failed to parse XML:', exc_info=True) return self.processAlarm(alarm) #------------------------------------------------------------------------- def processAlarm(self, newAlarm): self.alarmWidget.setHourGlass(True) try: newAlarm.save() except: self.logger.error('Failed to save alarm:', exc_info=True) try: self.forwarder.forward(newAlarm) except: self.logger.error('Failed to forward alarm:', exc_info=True) if not self.alarm or not self.alarm.matches(newAlarm): self.logger.info("Processing new alarm.") self.startTimer() self.alarm = newAlarm self.route = ([], None, None) self.seenPager = False self.seenXml = False self.seenJson = False self.reportDone = False self.reportTimer.start() self.sound.start() self.tts.clear() self.tts.start() self.gpioControl.trigger() self.report.wakeupPrinter() else: self.alarm.merge(newAlarm, self.logger) if newAlarm.source == 'pager': self.seenPager = True elif newAlarm.source == 'xml': self.seenXml = True elif newAlarm.source == 'json': self.seenJson = True self.logger.info('Sources: %s', self.alarm.sources) self.idleWidget.stop() self.stackedWidget.setCurrentWidget(self.alarmWidget) self.alarmWidget.processAlarm(self.alarm) QApplication.processEvents() self.alarmWidget.setRoute(self.route) if not self.route[0]: QApplication.processEvents() self.logger.info('Route query...') self.route = getRoute(self.alarm.lat, self.alarm.lon, self.config, self.logger) self.alarmWidget.setRoute(self.route) self.logger.info('Route ready.') self.tts.setText(self.alarm.spoken()) if (self.seenJson or (self.seenPager and self.seenXml)) \ and not self.reportDone: self.reportTimer.stop() QApplication.processEvents() self.generateReport() self.alarmWidget.setHourGlass(False) def generateReport(self): if self.reportDone: self.logger.info('Report already done.') return self.reportDone = True self.alarmWidget.setHourGlass(True) self.logger.info('Report...') try: self.report.generate(self.alarm, self.route) except: self.logger.error('Report failed:', exc_info=True) self.reportDone = False self.logger.info('Finished.') self.alarmWidget.setHourGlass(False) def startTimer(self): self.alarmDateTime = QDateTime.currentDateTime() if self.idleTimer.interval() > 0: self.idleTimer.start() if self.screenTimer.interval() > 0: self.screenTimer.start() self.alarmWidget.startTimer(self.alarmDateTime) self.logger.info('Alarm at %s', self.alarmDateTime) self.cecCommand.switchOn() def simTimeout(self): self.exampleJugend() def idleTimeout(self): self.stackedWidget.setCurrentWidget(self.idleWidget) self.idleWidget.start() def screenTimeout(self): self.cecCommand.switchOff() #------------------------------------------------------------------------- def exampleJugend(self): alarm = Alarm(self.config) alarm.source = 'xml' alarm.sources.add(alarm.source) alarm.number = '40001' now = datetime.datetime.now() local_tz = get_localzone() alarm.datetime = local_tz.localize(now) alarm.art = 'B' alarm.stichwort = '3' alarm.diagnose = 'Wohnungsbrand' alarm.strasse = 'St.-Anna-Berg' alarm.ort = 'Kleve' alarm.hausnummer = '5' alarm.objektname = 'Jugendherberge' alarm.besonderheit = 'lt. Betreiber 34 Personen gemeldet' alarm.objektnummer = 'KLV 02/140' alarm.lat = 51.78317 alarm.lon = 6.10695 self.processAlarm(alarm) def exampleEngels(self): alarm = Alarm(self.config) alarm.source = 'xml' alarm.sources.add(alarm.source) alarm.number = '40002' now = datetime.datetime.now() local_tz = get_localzone() alarm.datetime = local_tz.localize(now) alarm.art = 'H' alarm.stichwort = '1' alarm.diagnose = 'Tierrettung' alarm.ort = 'Kleve' alarm.ortsteil = 'Reichswalde' alarm.strasse = 'Engelsstraße' alarm.hausnummer = '5' alarm.ort = 'Kleve' alarm.besonderheit = 'Katze auf Baum' alarm.sondersignal = '0' alarm.lat = 51.75065 alarm.lon = 6.11170 self.processAlarm(alarm) def exampleSack(self): self.logger.info('Example Sackstrasse') alarm = Alarm(self.config) alarm.source = 'xml' alarm.sources.add(alarm.source) alarm.number = '40003' now = datetime.datetime.now() local_tz = get_localzone() alarm.datetime = local_tz.localize(now) alarm.art = 'B' alarm.stichwort = '2' alarm.diagnose = 'Garagenbrand' alarm.strasse = 'Sackstraße' alarm.hausnummer = '173' alarm.ort = 'Kleve' alarm.besonderheit = 'Kfz brennt unter Carport' alarm.lat = 51.77190 alarm.lon = 6.12305 self.processAlarm(alarm) def exampleWolfsgrabenPager(self): pagerStr = '21-12-17 11:55:10 LG Reichswalde Geb{udesteuerung' + \ ' #K01;N5175638E0611815; *40004*B2 Kaminbrand**Kleve*' + \ 'Reichswalde*Wolfsgraben*11**' alarm = Alarm(self.config) alarm.fromPager(pagerStr, self.logger) self.processAlarm(alarm) def exampleWolfsgrabenMail(self): alarm = Alarm(self.config) alarm.source = 'xml' alarm.sources.add(alarm.source) now = datetime.datetime.now() local_tz = get_localzone() alarm.datetime = local_tz.localize(now) alarm.art = 'B' alarm.stichwort = '2' alarm.diagnose = 'Kaminbrand' alarm.besonderheit = 'keine Personen mehr im Gebäude' alarm.ortsteil = 'Reichswalde' alarm.strasse = 'Wolfsgraben' alarm.hausnummer = '11' alarm.ort = 'Kleve' alarm.lat = 51.75638 alarm.lon = 6.11815 alarm.meldender = 'Müller' alarm.rufnummer = '0179 555 364532' alarm.number = '1170040004' alarm.sondersignal = '1' em = EinsatzMittel('FW', 'KLV', '05', 'LF10', '1', '') alarm.einsatzmittel.add(em) em = EinsatzMittel('FW', 'KLV', '02', 'LF20', '1', '') alarm.einsatzmittel.add(em) self.processAlarm(alarm) def exampleWald(self): pagerStr = '16-12-17 18:55:10 LG Reichswalde Gebäudesteuerung' + \ ' #K01;N5173170E0606900; *40005*H1 Hilfeleistung*' + \ 'Eichhörnchen auf Baum*Kleve*Reichswalde*' + \ 'Grunewaldstrasse***Waldweg C' alarm = Alarm(self.config) alarm.fromPager(pagerStr, self.logger) self.processAlarm(alarm) def exampleStadtwerkePager(self): pagerStr = '21-12-17 11:55:10 LG Reichswalde Gebäudesteuerung' + \ ' #K01;N5179473E0613985; *40006*B3 Brand Bürogebäude*' + \ 'Stadtwerke Kleve GmbH*Kleve*Kleve*Flutstraße*36**' alarm = Alarm(self.config) alarm.fromPager(pagerStr, self.logger) self.processAlarm(alarm) def exampleLebenshilfe(self): pagerStr = '22-03-17 10:12:38 LG Reichswalde Gebäudesteuerung' + \ ' #K01;N5177287E0611253;*40007*B2 Brandmeldeanlage 2' + \ ' **Kleve*Materborn*Dorfstrasse*27*KLV 02/103' + \ '*Materborner Allee - Saalstrasse' alarm = Alarm(self.config) alarm.fromPager(pagerStr, self.logger) self.processAlarm(alarm) def exampleHuissen(self): f = open("alarm_db/2018-06-24-04-13-11.xml", "rb") xmlContent = f.read() f.close() alarm = Alarm(self.config) try: alarm.fromXml(xmlContent, self.logger) except: self.logger.error('Failed to parse XML:', exc_info=True) return self.processAlarm(alarm)
class Jeu: def __init__(self, jeu, config, vaisseau, listBullet, app, *groupes): self.app = app self._fenetre = jeu.fenetre #jeu.fond = (0, 0, 0) self.config = config self.jeu = jeu self.sound = Sound() #jeu) self.listBullet = listBullet self.Vaisseau = vaisseau self.hud = Hud(jeu, self.Vaisseau) self.gameover = GameOver(self.jeu) self.listEnnemi = ListEnnemi(self.config, self.listBullet, self.Vaisseau, self.listBullet, jeu, self.sound) self.listMeteorite = ListMeteorite(self.config, self.listBullet, self.listEnnemi, self.sound, jeu, self.Vaisseau) self.vaisseauInit = Vaisseau(self.config, []) self.BulletInit = Bullet(self.config) self.EnnemiInit = Ennemi(self.config, []) self.MeteoriteInit = Meteorite(self.config) self.imgMeteorite = self.loadImg(self.MeteoriteInit.getImg()) self.imgBullet = [ self.loadImg(self.BulletInit.getImgType(0)), self.loadImg(self.BulletInit.getImgType(1)) ] self.imgFond = self.loadImg("images/fond.png") self.imgVaisseau = [] self.imgEnnemi = [] for i in range(8): imgV = self.loadImg(self.vaisseauInit.getImgDirection(i)) imgE = self.loadImg(self.EnnemiInit.getImgDirection(i)) self.imgVaisseau.append(imgV) self.imgEnnemi.append(imgE) def getSurface(self): return self._fenetre def update(self): pygame.display.update() def loadImg(self, name): return pygame.image.load(name) def position(self, img, x, y): self._fenetre.blit(img, (x, y)) def run(self): xa_mvt = 0 ya_mvt = 0 xb_mvt = 0 yb_mvt = 0 da = 0 db = 0 dc = 0 dd = 0 tir = False listsBullet = [] self.sound.start() vitesse = self.Vaisseau.getMouvementSpeed() mybool = True while mybool: if self.Vaisseau.getLife() <= 0: ##game over self.gameover.go() self.update() time.sleep(2) mybool = False for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() quit() if event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: pygame.quit() quit() if event.key == self.config.getUpKey(): ya_mvt = -vitesse da = 1 if event.key == self.config.getDownKey(): yb_mvt = vitesse db = 1 if event.key == self.config.getLeftKey(): xa_mvt = -vitesse dc = 1 if event.key == self.config.getRightKey(): xb_mvt = vitesse dd = 1 if event.key == self.config.getFireKey(): tir = True if event.type == pygame.KEYUP: if event.key == self.config.getUpKey(): ya_mvt = 0 da = 0 if event.key == self.config.getDownKey(): yb_mvt = 0 db = 0 if event.key == self.config.getLeftKey(): xa_mvt = 0 dc = 0 if event.key == self.config.getRightKey(): xb_mvt = 0 dd = 0 if event.key == self.config.getFireKey(): tir = False time.sleep(0.02) #self._fenetre.fill(self.config.getBlue()) self.position(self.imgFond, 0, 0) ###### ajout un enemey self.listEnnemi.addElemListE() self.listEnnemi.update() for elem in self.listEnnemi.getListE(): self.position(self.imgEnnemi[elem.getDirection()], self.listEnnemi.getxElemListE(elem), self.listEnnemi.getyElemListE(elem)) #self.position(self.loadImg(self.listEnnemi.getImgElemListE(elem)),self.listEnnemi.getxElemListE(elem),self.listEnnemi.getyElemListE(elem)) ####### ###### ajout une meteorite self.listMeteorite.addElemListM() self.listMeteorite.update() for elem in self.listMeteorite.getListM(): self.position(self.imgMeteorite, self.listMeteorite.getxElemListM(elem), self.listMeteorite.getyElemListM(elem)) ####### if tir: self.Vaisseau.tirer() self.listBullet.update() for elem in self.listBullet.getListB(): self.position(self.imgBullet[elem.getType()], self.listBullet.getxElemListB(elem), self.listBullet.getyElemListB(elem)) self.Vaisseau.setDirection(da, db, dc, dd) self.Vaisseau.setx(xa_mvt + xb_mvt) self.Vaisseau.sety(ya_mvt + yb_mvt) self.Vaisseau.update() if self.Vaisseau.getInvincible(): if self.Vaisseau.getInvincibleLancer() == False: self.Vaisseau.setInvincibleLancer(True) t1 = AnimationInvincible(self.jeu, self.Vaisseau, self.config) t1.start() else: self.position(self.imgVaisseau[self.Vaisseau.getDirection()], self.Vaisseau.getx(), self.Vaisseau.gety()) self.hud.hud() self.update() self.app.menu()