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
-
-
-
- 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
+
+