add auto vcr switching support (needs new drivers (fp.ko))
authorAndreas Monzner <andreas.monzner@multimedia-labs.de>
Thu, 26 Oct 2006 15:36:40 +0000 (15:36 +0000)
committerAndreas Monzner <andreas.monzner@multimedia-labs.de>
Thu, 26 Oct 2006 15:36:40 +0000 (15:36 +0000)
data/menu.xml
lib/driver/avswitch.cpp
lib/driver/avswitch.h
lib/python/Screens/Menu.py
lib/python/Screens/Scart.py
lib/python/Screens/ScartLoopThrough.py [deleted file]
lib/python/Screens/__init__.py
lib/python/enigma_python.i
mytest.py

index 2ebd181..2762c2e 100644 (file)
@@ -19,7 +19,7 @@
                <!--<item text="Radio"><code>print "radio mode"</code></item>-->
                <item text="Media player"><screen module="MediaPlayer" screen="MediaPlayer" /></item>
                <item text="Timer"><screen module="TimerEdit" screen="TimerEditList" /></item>
                <!--<item text="Radio"><code>print "radio mode"</code></item>-->
                <item text="Media player"><screen module="MediaPlayer" screen="MediaPlayer" /></item>
                <item text="Timer"><screen module="TimerEdit" screen="TimerEditList" /></item>
-               <item text="VCR scart"><screen module="Scart" screen="Scart" /></item>
+               <item text="VCR scart"><code>self.session.scart.VCRSbChanged(3)</code></item>
 
                <menu text="Information">
                        <id val="information" />
 
                <menu text="Information">
                        <id val="information" />
index 199a785..8233d97 100644 (file)
@@ -1,5 +1,3 @@
-#include <lib/driver/avswitch.h>
-
 #include <unistd.h>
 #include <fcntl.h>
 #include <sys/ioctl.h>
 #include <unistd.h>
 #include <fcntl.h>
 #include <sys/ioctl.h>
@@ -7,6 +5,8 @@
 #include <lib/base/init.h>
 #include <lib/base/init_num.h>
 #include <lib/base/eerror.h>
 #include <lib/base/init.h>
 #include <lib/base/init_num.h>
 #include <lib/base/eerror.h>
+#include <lib/base/ebase.h>
+#include <lib/driver/avswitch.h>
 
 eAVSwitch *eAVSwitch::instance = 0;
 
 
 eAVSwitch *eAVSwitch::instance = 0;
 
@@ -15,6 +15,49 @@ eAVSwitch::eAVSwitch()
        ASSERT(!instance);
        instance = this;
        m_video_mode = 0;
        ASSERT(!instance);
        instance = this;
        m_video_mode = 0;
+       m_fp_fd = open("/dev/dbox/fp0", O_RDONLY|O_NONBLOCK);
+       if (m_fp_fd == -1)
+       {
+               eDebug("couldnt open /dev/dbox/fp0 to monitor vcr scart slow blanking changed!");
+               m_fp_notifier=0;
+       }
+       else
+       {
+               m_fp_notifier = new eSocketNotifier(eApp, m_fp_fd, eSocketNotifier::Read);
+               CONNECT(m_fp_notifier->activated, eAVSwitch::fp_event);
+       }
+}
+
+#ifndef FP_IOCTL_GET_EVENT
+#define FP_IOCTL_GET_EVENT 20
+#endif
+
+#ifndef FP_IOCTL_GET_VCR
+#define FP_IOCTL_GET_VCR 7
+#endif
+
+#ifndef FP_EVENT_VCR_SB_CHANGED
+#define FP_EVENT_VCR_SB_CHANGED 1
+#endif
+
+int eAVSwitch::getVCRSlowBlanking()
+{
+       int val=0;
+       if (m_fp_fd >= 0)
+       {
+               if (ioctl(m_fp_fd, FP_IOCTL_GET_VCR, &val) < 0)
+                       eDebug("FP_GET_VCR failed (%m)");
+       }
+       return val;
+}
+
+void eAVSwitch::fp_event(int what)
+{
+       int val = FP_EVENT_VCR_SB_CHANGED;  // ask only for this event
+       if (ioctl(m_fp_fd, FP_IOCTL_GET_EVENT, &val) < 0)
+               eDebug("FP_IOCTL_GET_EVENT failed (%m)");
+       else if (val & FP_EVENT_VCR_SB_CHANGED)
+               /* emit */ vcr_sb_notifier(getVCRSlowBlanking());
 }
 
 eAVSwitch::~eAVSwitch()
 }
 
 eAVSwitch::~eAVSwitch()
index d0221d5..2b3b40f 100644 (file)
@@ -1,10 +1,18 @@
 #ifndef __avswitch_h
 #define __avswitch_h
 
 #ifndef __avswitch_h
 #define __avswitch_h
 
-class eAVSwitch
+#include <lib/base/object.h>
+#include <lib/python/connections.h>
+
+class eSocketNotifier;
+
+class eAVSwitch: public Object
 {
        static eAVSwitch *instance;
        int m_video_mode;
 {
        static eAVSwitch *instance;
        int m_video_mode;
+       eSocketNotifier *m_fp_notifier;
+       void fp_event(int what);
+       int m_fp_fd;
 #ifdef SWIG
        eAVSwitch();
        ~eAVSwitch();
 #ifdef SWIG
        eAVSwitch();
        ~eAVSwitch();
@@ -16,7 +24,7 @@ public:
        ~eAVSwitch();
 #endif
        static eAVSwitch *getInstance();
        ~eAVSwitch();
 #endif
        static eAVSwitch *getInstance();
-       
+       int getVCRSlowBlanking();
        void setFastBlank(int val);
        void setColorFormat(int format);
        void setAspectRatio(int ratio);
        void setFastBlank(int val);
        void setColorFormat(int format);
        void setAspectRatio(int ratio);
@@ -24,6 +32,7 @@ public:
        void setInput(int val);
        void setSlowblank(int val);
        void setWSS(int val);
        void setInput(int val);
        void setSlowblank(int val);
        void setWSS(int val);
+       PSignal1<void, int> vcr_sb_notifier;
 };
 
 #endif
 };
 
 #endif
index d6ec901..3cc4592 100644 (file)
@@ -24,7 +24,6 @@ from Tools import XMLTools
 #              <item text="TV-Mode">self.setModeTV()</item>
 #              <item text="Radio-Mode">self.setModeRadio()</item>
 #              <item text="File-Mode">self.setModeFile()</item>
 #              <item text="TV-Mode">self.setModeTV()</item>
 #              <item text="Radio-Mode">self.setModeRadio()</item>
 #              <item text="File-Mode">self.setModeFile()</item>
-#              <item text="Scart">self.openDialog(ScartLoopThrough)</item>
 #                      <item text="Sleep Timer"></item>
 
 
 #                      <item text="Sleep Timer"></item>
 
 
index 3bb2ca9..329300a 100644 (file)
@@ -6,20 +6,35 @@ from Components.AVSwitch import AVSwitch
 from enigma import *
 
 class Scart(Screen):
 from enigma import *
 
 class Scart(Screen):
-       def __init__(self, session):
+       def __init__(self, session, start_visible=True):
                Screen.__init__(self, session)
                Screen.__init__(self, session)
-               
+
                self.avswitch = AVSwitch()
                self.avswitch = AVSwitch()
-               
-               self.avswitch.setInput("SCART")
-               
-               self.onExecBegin.append(self.showMessageBox)
-                               
+
+               if start_visible:
+                       self.onExecBegin.append(self.showMessageBox)
+                       self.msgVisible = None
+               else:
+                       self.msgVisible = False
+
        def showMessageBox(self):
        def showMessageBox(self):
-               # only open messagebox on first execBegin
-               self.onExecBegin.remove(self.showMessageBox)
-               self.session.openWithCallback(self.switchToTV, MessageBox, _("If you see this, something is wrong with\nyour scart connection. Press OK to return."), MessageBox.TYPE_ERROR)
-               
+               if self.msgVisible is None:
+                       self.onExecBegin.remove(self.showMessageBox)
+                       self.msgVisible = False
+
+               if not self.msgVisible:
+                       self.msgVisible = True
+                       self.avswitch.setInput("SCART")
+                       self.msgBox = self.session.openWithCallback(self.MsgBoxClosed, MessageBox, _("If you see this, something is wrong with\nyour scart connection. Press OK to return."), MessageBox.TYPE_ERROR)
+
+       def MsgBoxClosed(self, *val):
+               self.msgBox = None
+               self.switchToTV()
+
        def switchToTV(self, *val):
        def switchToTV(self, *val):
-               self.avswitch.setInput("ENCODER")
-               self.close()
+               if self.msgVisible:
+                       if self.msgBox:
+                               self.msgBox.close() # ... MsgBoxClosed -> switchToTV again..
+                               return
+                       self.avswitch.setInput("ENCODER")
+                       self.msgVisible = False
diff --git a/lib/python/Screens/ScartLoopThrough.py b/lib/python/Screens/ScartLoopThrough.py
deleted file mode 100644 (file)
index e69de29..0000000
index 5eac3b1..9ce0dc6 100644 (file)
@@ -1,6 +1,6 @@
 __all__ = ["ChannelSelection", "ClockDisplay", "ConfigMenu", 
        "InfoBar", "MessageBox", "Menu", "MovieSelection", 
 __all__ = ["ChannelSelection", "ClockDisplay", "ConfigMenu", 
        "InfoBar", "MessageBox", "Menu", "MovieSelection", 
-       "ScartLoopThrough", "Screen", "ServiceScan", "About",
+       "Screen", "ServiceScan", "About",
        "TimerEdit", "Setup", "HarddiskSetup", "FixedMenu",
        "Satconfig", "Scanconfig", "Ci.py", "Volume.py", "Mute.py",
        "EpgSelection", "EventView", "Standby", "ServiceInfo",
        "TimerEdit", "Setup", "HarddiskSetup", "FixedMenu",
        "Satconfig", "Scanconfig", "Ci.py", "Volume.py", "Mute.py",
        "EpgSelection", "EventView", "Standby", "ServiceInfo",
index 103889b..cb87359 100644 (file)
@@ -156,6 +156,7 @@ typedef long time_t;
 %immutable eListbox::selectionChanged;
 %immutable eDVBCI_UI::ciStateChanged;
 %immutable eDVBResourceManager::frontendUseMaskChanged;
 %immutable eListbox::selectionChanged;
 %immutable eDVBCI_UI::ciStateChanged;
 %immutable eDVBResourceManager::frontendUseMaskChanged;
+%immutable eAVSwitch::vcr_sb_notifier;
 
 %include <lib/base/console.h>
 %include <lib/base/nconfig.h>
 
 %include <lib/base/console.h>
 %include <lib/base/nconfig.h>
index 15f3b7d..4c30de9 100644 (file)
--- a/mytest.py
+++ b/mytest.py
@@ -415,6 +415,31 @@ class PowerKey:
                # halt
                quitMainloop(1)
 
                # halt
                quitMainloop(1)
 
+from Screens.Scart import Scart
+
+class AutoScartControl:
+       def __init__(self, session):
+               self.force = False
+               self.current_vcr_sb = eAVSwitch.getInstance().getVCRSlowBlanking()
+               if self.current_vcr_sb and config.av.vcrswitch.value:
+                       self.scartDialog = session.instantiateDialog(Scart, True)
+               else:
+                       self.scartDialog = session.instantiateDialog(Scart, False)
+               config.av.vcrswitch.addNotifier(self.recheckVCRSb)
+               eAVSwitch.getInstance().vcr_sb_notifier.get().append(self.VCRSbChanged)
+
+       def recheckVCRSb(self, configElement):
+               self.VCRSbChanged(self.current_vcr_sb)
+
+       def VCRSbChanged(self, value):
+               #print "vcr sb changed to", value
+               self.current_vcr_sb = value
+               if config.av.vcrswitch.value or value > 2:
+                       if value:
+                               self.scartDialog.showMessageBox()
+                       else:
+                               self.scartDialog.switchToTV()
+
 def runScreenTest():
        plugins.readPluginList(resolveFilename(SCOPE_PLUGINS))
 
 def runScreenTest():
        plugins.readPluginList(resolveFilename(SCOPE_PLUGINS))
 
@@ -447,6 +472,9 @@ def runScreenTest():
        
        vol = VolumeControl(session)
        power = PowerKey(session)
        
        vol = VolumeControl(session)
        power = PowerKey(session)
+
+       # we need session.scart to access it from within menu.xml
+       session.scart = AutoScartControl(session)
        
        runReactor()
        
        
        runReactor()