From: Andreas Monzner Date: Thu, 26 Oct 2006 15:36:40 +0000 (+0000) Subject: add auto vcr switching support (needs new drivers (fp.ko)) X-Git-Url: http://code.vuplus.com/gitweb/?p=vuplus_dvbapp;a=commitdiff_plain;h=e03c732afb410b4d6b9f9540c36c33c941ee38f1 add auto vcr switching support (needs new drivers (fp.ko)) --- diff --git a/data/menu.xml b/data/menu.xml index 2ebd181..2762c2e 100644 --- a/data/menu.xml +++ b/data/menu.xml @@ -19,7 +19,7 @@ - + self.session.scart.VCRSbChanged(3) diff --git a/lib/driver/avswitch.cpp b/lib/driver/avswitch.cpp index 199a785..8233d97 100644 --- a/lib/driver/avswitch.cpp +++ b/lib/driver/avswitch.cpp @@ -1,5 +1,3 @@ -#include - #include #include #include @@ -7,6 +5,8 @@ #include #include #include +#include +#include eAVSwitch *eAVSwitch::instance = 0; @@ -15,6 +15,49 @@ eAVSwitch::eAVSwitch() 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() diff --git a/lib/driver/avswitch.h b/lib/driver/avswitch.h index d0221d5..2b3b40f 100644 --- a/lib/driver/avswitch.h +++ b/lib/driver/avswitch.h @@ -1,10 +1,18 @@ #ifndef __avswitch_h #define __avswitch_h -class eAVSwitch +#include +#include + +class eSocketNotifier; + +class eAVSwitch: public Object { static eAVSwitch *instance; int m_video_mode; + eSocketNotifier *m_fp_notifier; + void fp_event(int what); + int m_fp_fd; #ifdef SWIG eAVSwitch(); ~eAVSwitch(); @@ -16,7 +24,7 @@ public: ~eAVSwitch(); #endif static eAVSwitch *getInstance(); - + int getVCRSlowBlanking(); 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); + PSignal1 vcr_sb_notifier; }; #endif diff --git a/lib/python/Screens/Menu.py b/lib/python/Screens/Menu.py index d6ec901..3cc4592 100644 --- a/lib/python/Screens/Menu.py +++ b/lib/python/Screens/Menu.py @@ -24,7 +24,6 @@ from Tools import XMLTools # self.setModeTV() # self.setModeRadio() # self.setModeFile() -# self.openDialog(ScartLoopThrough) # diff --git a/lib/python/Screens/Scart.py b/lib/python/Screens/Scart.py index 3bb2ca9..329300a 100644 --- a/lib/python/Screens/Scart.py +++ b/lib/python/Screens/Scart.py @@ -6,20 +6,35 @@ from Components.AVSwitch import AVSwitch from enigma import * class Scart(Screen): - def __init__(self, session): + def __init__(self, session, start_visible=True): Screen.__init__(self, session) - + 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): - # 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): - 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 index e69de29..0000000 diff --git a/lib/python/Screens/__init__.py b/lib/python/Screens/__init__.py index 5eac3b1..9ce0dc6 100644 --- a/lib/python/Screens/__init__.py +++ b/lib/python/Screens/__init__.py @@ -1,6 +1,6 @@ __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", diff --git a/lib/python/enigma_python.i b/lib/python/enigma_python.i index 103889b..cb87359 100644 --- a/lib/python/enigma_python.i +++ b/lib/python/enigma_python.i @@ -156,6 +156,7 @@ typedef long time_t; %immutable eListbox::selectionChanged; %immutable eDVBCI_UI::ciStateChanged; %immutable eDVBResourceManager::frontendUseMaskChanged; +%immutable eAVSwitch::vcr_sb_notifier; %include %include diff --git a/mytest.py b/mytest.py index 15f3b7d..4c30de9 100644 --- a/mytest.py +++ b/mytest.py @@ -415,6 +415,31 @@ class PowerKey: # 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)) @@ -447,6 +472,9 @@ def runScreenTest(): vol = VolumeControl(session) power = PowerKey(session) + + # we need session.scart to access it from within menu.xml + session.scart = AutoScartControl(session) runReactor()