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..')
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..')