diff --git a/ini/base.ini b/ini/base.ini index b8fed1c..6212850 100644 --- a/ini/base.ini +++ b/ini/base.ini @@ -1,7 +1,7 @@ # Basic Feeds Settings # Copyright by Peter Maersk-Moller 2012 - All rights reserved #verbose -require version 0.4.0 +require version 0.4.2 # Define allowed remote host IP addresses. If omitted then only 127.0.0.1 will be accepted. system host allow 127.0.0.1 @@ -211,13 +211,23 @@ image load 1 images/logo.png image place 1 1 24 24 +#Text +text font 1 Source Code Pro Bold 32 + +text string 1 [Test text 1] +text place 1 1 1 32 650 1.0 1.0 1.0 + +text string 2 [Test text 2] +text place 2 2 1 32 700 1.0 1.0 1.0 + + command create Show overlay image 0 overlay virtual feed 1..3 overlay image 1 - #overlay text all + overlay text all loop command end diff --git a/python/scenechange.py b/python/scenechanger.py similarity index 55% rename from python/scenechange.py rename to python/scenechanger.py index fae2d84..96e041e 100644 --- a/python/scenechange.py +++ b/python/scenechanger.py @@ -1,12 +1,10 @@ #!/bin/env python2 -import socket -class SceneChange(object): +class SceneChanger(object): - def __init__(self): + def __init__(self, socket): self.cur_scene = 1 - self.snowmix_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - self.snowmix_socket.connect(("localhost", 9999)) + self.snowmix_socket = socket def switch_to(self, next_scene): diff --git a/python/textchanger.py b/python/textchanger.py new file mode 100644 index 0000000..485e735 --- /dev/null +++ b/python/textchanger.py @@ -0,0 +1,29 @@ +#!/bin/env python2 +# -*- coding: utf-8 -*- + +class TextChanger(object): + + TEXT_ID = 1 + UMLAUTS = { + 'ä' : 'ae', + 'ü' : 'ue', + 'ö' : 'oe', + 'ß' : 'ss' + } + + def __init__(self, socket): + self.snowmix_socket = socket + + + def set_text(self, text): + for umlaut, replacement in self.UMLAUTS.items(): + text = text.replace(umlaut, replacement) + + cmd = "text string %d %s\n" % (self.TEXT_ID,text) + self.snowmix_socket.send(cmd) + + def hide_text(self): + cmd = "text string %d\n" % self.TEXT_ID + self.snowmix_socket.send(cmd) + + diff --git a/python/timercontroller.py b/python/timercontroller.py new file mode 100644 index 0000000..6ab7fba --- /dev/null +++ b/python/timercontroller.py @@ -0,0 +1,80 @@ +#!/usr/bin/env python2 +# -*- coding: utf-8 -*- +import threading +import time +from datetime import datetime + +class TimerController(object): + + TEXT_ID = 2 + UMLAUTS = { + 'ä' : 'ae', + 'ü' : 'ue', + 'ö' : 'oe', + 'ß' : 'ss' + } + + + + def __init__(self, socket): + self.snowmix_socket = socket + + self.active_timer = None + self.timers = {} + + self.update_thread = threading.Thread(target=self.update_timer) + self.stopped = False + self.update_thread.start() + + def start_timer(self, name): + if not name in self.timers.keys(): + self.timers[name] = datetime.now() + + def get_timers(self): + return self.timers.keys() + + + def hide_timer(self): + self.active_timer = None + self.hide_text() + + + def set_active_timer(self, name): + if name in self.timers.keys(): + self.active_timer = name + + + def update_timer(self): + print "Starting update thread !" + while not self.stopped: + if self.active_timer != None: + delta = datetime.now() - self.timers[self.active_timer] + hours, remainder = divmod(delta.total_seconds(), 3600) + minutes, seconds = divmod(remainder, 60) + self.update_text('%s: %d:%d:%d' % (self.active_timer, hours, minutes, seconds)) + pass + time.sleep(1.0) + + print "Stopping update thread !" + + + def update_text(self, text): + for umlaut, replacement in self.UMLAUTS.items(): + text = text.replace(umlaut, replacement) + + cmd = "text string %d %s\n" % (self.TEXT_ID,text) + self.snowmix_socket.send(cmd) + + + def hide_text(self): + cmd = "text string %d\n" % self.TEXT_ID + self.snowmix_socket.send(cmd) + + + def stop(self): + self.stopped = True + self.update_thread.join(5.0) + + + + diff --git a/python/videocontroller.py b/python/videocontroller.py index 7059b33..3f1bacb 100644 --- a/python/videocontroller.py +++ b/python/videocontroller.py @@ -1,16 +1,25 @@ -#!/usr/bin/env python +#!/usr/bin/env python2 +# -*- coding: utf-8 -*- import sys +import socket from gi.repository import Gtk -from scenechange import SceneChange +from scenechanger import SceneChanger +from textchanger import TextChanger +from timercontroller import TimerController class VideoController: def __init__(self): - self.scenechange = SceneChange() + self.snowmix_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.snowmix_socket.connect(("localhost", 9999)) - self.gladefile = "videocontroler.ui" + self.scenechanger = SceneChanger(self.snowmix_socket) + self.textchanger = TextChanger(self.snowmix_socket) + self.timercontroller = TimerController(self.snowmix_socket) + + self.gladefile = "videocontroller.ui" self.builder = Gtk.Builder() self.builder.add_from_file(self.gladefile) @@ -18,6 +27,9 @@ class VideoController: self.max_cam1_button = self.builder.get_object("MaxCam1Button") self.max_cam2_button = self.builder.get_object("MaxCam2Button") self.max_cam3_button = self.builder.get_object("MaxCam3Button") + self.set_text_entry = self.builder.get_object("SetTextEntry") + self.start_timer_entry = self.builder.get_object("StartTimerEntry") + self.change_timer_combobox = self.builder.get_object("ChangeTimerComboBox") self.messagebox = Gtk.MessageDialog(self.main_window, 0, Gtk.MessageType.WARNING, Gtk.ButtonsType.OK_CANCEL, "I'm afaraid I can't let you do that dave.") @@ -30,7 +42,7 @@ class VideoController: if self.max_cam1_button.get_active(): self.max_cam2_button.set_active(False) self.max_cam3_button.set_active(False) - self.scenechange.switch_to(1) + self.scenechanger.switch_to(1) else: if not self.max_cam2_button.get_active() and not self.max_cam3_button.get_active(): self.max_cam1_button.set_active(True) @@ -40,7 +52,7 @@ class VideoController: if self.max_cam2_button.get_active(): self.max_cam1_button.set_active(False) self.max_cam3_button.set_active(False) - self.scenechange.switch_to(2) + self.scenechanger.switch_to(2) else: if not self.max_cam1_button.get_active() and not self.max_cam3_button.get_active(): self.max_cam2_button.set_active(True) @@ -50,16 +62,38 @@ class VideoController: if self.max_cam3_button.get_active(): self.max_cam1_button.set_active(False) self.max_cam2_button.set_active(False) - self.scenechange.switch_to(3) + self.scenechanger.switch_to(3) else: if not self.max_cam1_button.get_active() and not self.max_cam2_button.get_active(): self.max_cam3_button.set_active(True) + def SetTextButtonClicked(self, widget): + self.textchanger.set_text(self.set_text_entry.get_text()) + + + def HideTextButtonClicked(self, widget): + self.textchanger.hide_text() + + + def StartTimerButtonClicked(self, widget): + self.timercontroller.start_timer(self.start_timer_entry.get_text()) + self.change_timer_combobox.remove_all() + for timer in self.timercontroller.get_timers(): + self.change_timer_combobox.append_text(timer) + + def ChangeTimerComboBoxChanged(self, widget): + self.timercontroller.set_active_timer(self.change_timer_combobox.get_active_text()) + + + def HideTimerButtonClicked(self, widget): + self.timercontroller.hide_timer() + def MainWindowDelete(self, widget, event): if self.messagebox.run() == Gtk.ResponseType.OK: + self.timercontroller.stop() Gtk.main_quit() self.messagebox.hide() diff --git a/python/videocontroller.ui b/python/videocontroller.ui index 75e31fd..4503204 100644 --- a/python/videocontroller.ui +++ b/python/videocontroller.ui @@ -110,7 +110,7 @@ Cam 2 - + 180 30 True @@ -161,19 +161,6 @@ Cam 2 270 - - - 290 - 30 - True - False - - - - 170 - 270 - - Hide text @@ -182,6 +169,7 @@ Cam 2 True True True + 10 @@ -196,12 +184,26 @@ Cam 2 True True True + 230 320 + + + 285 + 30 + True + False + + + + 174 + 270 + +