Esempio n. 1
0
class Remote(object):
    def __init__(self, config_data):
        device = config_data['device']
        stations = config_data['stations']
        devices = []
        if device.lower() == 'auto':
            devices = scan_for_devices()
        else:
            devices = [device]

        self._devices = devices
        self._device = devices[0]
        self._tuners = []
        for dev in self._devices:
            tuner = Tuner(dev)
            tuner.init_stations(stations)
            self._tuners.append(tuner)
        self._tuner = self._tuners[0]
        self._osd = Osd()
        self._sleep_time = 0.2
        self._osd_time = None
        self._first_digit = None
        self._show_digit_time = 0
        self._show_shutdown_message = False

    def show_tv(self):
        """
        Start vlc to show tv.
        """
        spawn('/usr/bin/vlc',
            ['vlc',
            '--quiet',
            '--video-filter=deinterlace',
            '--deinterlace-mode=blend',
            'pvr://%s' % self._device])

    def set_channel(self, channel):
        """
        Set channel.
        """
        self._tuner.set_channel(channel-1)
        self.show_osd(str(channel))
        self._first_digit = None

    def show_osd(self, message):
        """
        Show osd message for _OSD_SECONDS seconds.
        """
        self._osd.show(message)
        self._osd_time = _OSD_SECONDS

    def toggle_audio_mode(self):
        """
        Toggle between the available audio modes of the current channel.
        """
        mode = self._tuner.get_audio_mode()
        modes = self._tuner.get_available_audio_modes()
        index = 0
        try:
            index = modes.index(mode) + 1
        except ValueError:
            pass
        new_mode = modes[index % len(modes)]
        self._tuner.set_audio_mode(new_mode)
        self.show_osd(new_mode)

    def switch_device(self):
        ind = (self._devices.index(self._device) + 1) % len(self._devices)
        self._device = self._devices[ind]
        self._tuner = self._tuners[ind]

    def handle_code(self, code):
        """
        Handle the lirc commands.
        """
        logging.debug("Command: %s, Repeat: %d", code["config"], code["repeat"])
        config = code["config"]
        if config.isdigit():
            digit = int(config)
            if self._first_digit is None:
                self.show_osd('%d-' % digit)
                self._first_digit = digit
                self._show_digit_time = _SINGLE_DIGIT_SECONDS
            else:
                channel = self._first_digit * 10 + digit
                self.set_channel(channel)
        elif config == "ChanUp":
            channel = self._tuner.next_channel()
            self.show_osd(str(channel + 1))
        elif config == "ChanDown":
            channel = self._tuner.prev_channel()
            self.show_osd(str(channel + 1))
        elif config == "ShowTv":
            self.show_tv()
        elif config == "Enter" and not self._first_digit is None:
            self.set_channel(self._first_digit)
        elif config == "ToggleAudio":
            self.toggle_audio_mode()
        if config == 'Shutdown' and not is_running('vlc'):
            if self._show_shutdown_message:
                shutdown()
            else:
                self.show_osd('Shutdown?')
                self._show_shutdown_message = True
        else:
            self._show_shutdown_message = False
        if config == "SwitchDevice":
            self.switch_device()

    def _lirc_main_loop(self):
        """
        Pylirc main loop.
        """
        code = {"config" : ""}
        while True:
            # Delay...
            time.sleep(self._sleep_time)

            # reduce osd time
            if self._osd_time and self._osd_time > 0:
                self._osd_time -= self._sleep_time

            # set channel if one digit is set
            if self._first_digit:
                self._show_digit_time -= self._sleep_time
                if self._show_digit_time <= 0:
                    self.set_channel(self._first_digit)

            # hide osd message
            if self._osd_time and self._osd_time <= 0:
                self._osd.hide()
                self._osd_time = None

            # Read next code
            codes = pylirc.nextcode(1)

            # Loop as long as there are more on the queue
            # (dont want to wait a second if the user pressed many buttons...)
            while codes:
                for code in codes:
                    self.handle_code(code)

                # Read next code?
                codes = pylirc.nextcode(1)

    def start_main_loop(self):
        """
        Read lirc config file and start main pylirc main loop.
        """
        if pylirc.init("tvtuner", "~/.lircrc", False):
            try:
                self._lirc_main_loop()
            except KeyboardInterrupt:
                self._osd.hide()
                pylirc.exit()
        del self._osd
        logging.debug('Exiting..')
Esempio n. 2
0
class Remote(object):
    def __init__(self, config_data):
        device = config_data['device']
        stations = config_data['stations']
        devices = []
        if device.lower() == 'auto':
            devices = scan_for_devices()
        else:
            devices = [device]

        self._devices = devices
        self._device = devices[0]
        self._tuners = []
        for dev in self._devices:
            tuner = Tuner(dev)
            tuner.init_stations(stations)
            self._tuners.append(tuner)
        self._tuner = self._tuners[0]
        self._osd = Osd()
        self._sleep_time = 0.2
        self._osd_time = None
        self._first_digit = None
        self._show_digit_time = 0
        self._show_shutdown_message = False

    def show_tv(self):
        """
        Start vlc to show tv.
        """
        spawn('/usr/bin/vlc', [
            'vlc', '--quiet', '--video-filter=deinterlace',
            '--deinterlace-mode=blend',
            'pvr://%s' % self._device
        ])

    def set_channel(self, channel):
        """
        Set channel.
        """
        self._tuner.set_channel(channel - 1)
        self.show_osd(str(channel))
        self._first_digit = None

    def show_osd(self, message):
        """
        Show osd message for _OSD_SECONDS seconds.
        """
        self._osd.show(message)
        self._osd_time = _OSD_SECONDS

    def toggle_audio_mode(self):
        """
        Toggle between the available audio modes of the current channel.
        """
        mode = self._tuner.get_audio_mode()
        modes = self._tuner.get_available_audio_modes()
        index = 0
        try:
            index = modes.index(mode) + 1
        except ValueError:
            pass
        new_mode = modes[index % len(modes)]
        self._tuner.set_audio_mode(new_mode)
        self.show_osd(new_mode)

    def switch_device(self):
        ind = (self._devices.index(self._device) + 1) % len(self._devices)
        self._device = self._devices[ind]
        self._tuner = self._tuners[ind]

    def handle_code(self, code):
        """
        Handle the lirc commands.
        """
        logging.debug("Command: %s, Repeat: %d", code["config"],
                      code["repeat"])
        config = code["config"]
        if config.isdigit():
            digit = int(config)
            if self._first_digit is None:
                self.show_osd('%d-' % digit)
                self._first_digit = digit
                self._show_digit_time = _SINGLE_DIGIT_SECONDS
            else:
                channel = self._first_digit * 10 + digit
                self.set_channel(channel)
        elif config == "ChanUp":
            channel = self._tuner.next_channel()
            self.show_osd(str(channel + 1))
        elif config == "ChanDown":
            channel = self._tuner.prev_channel()
            self.show_osd(str(channel + 1))
        elif config == "ShowTv":
            self.show_tv()
        elif config == "Enter" and not self._first_digit is None:
            self.set_channel(self._first_digit)
        elif config == "ToggleAudio":
            self.toggle_audio_mode()
        if config == 'Shutdown' and not is_running('vlc'):
            if self._show_shutdown_message:
                shutdown()
            else:
                self.show_osd('Shutdown?')
                self._show_shutdown_message = True
        else:
            self._show_shutdown_message = False
        if config == "SwitchDevice":
            self.switch_device()

    def _lirc_main_loop(self):
        """
        Pylirc main loop.
        """
        code = {"config": ""}
        while True:
            # Delay...
            time.sleep(self._sleep_time)

            # reduce osd time
            if self._osd_time and self._osd_time > 0:
                self._osd_time -= self._sleep_time

            # set channel if one digit is set
            if self._first_digit:
                self._show_digit_time -= self._sleep_time
                if self._show_digit_time <= 0:
                    self.set_channel(self._first_digit)

            # hide osd message
            if self._osd_time and self._osd_time <= 0:
                self._osd.hide()
                self._osd_time = None

            # Read next code
            codes = pylirc.nextcode(1)

            # Loop as long as there are more on the queue
            # (dont want to wait a second if the user pressed many buttons...)
            while codes:
                for code in codes:
                    self.handle_code(code)

                # Read next code?
                codes = pylirc.nextcode(1)

    def start_main_loop(self):
        """
        Read lirc config file and start main pylirc main loop.
        """
        if pylirc.init("tvtuner", "~/.lircrc", False):
            try:
                self._lirc_main_loop()
            except KeyboardInterrupt:
                self._osd.hide()
                pylirc.exit()
        del self._osd
        logging.debug('Exiting..')