| @@ -6,13 +6,16 @@ import time | |||
| from datetime import datetime | |||
| from time import sleep | |||
| import lirc | |||
| from evdev import InputDevice, categorize, ecodes | |||
| import random | |||
| import mpd | |||
| import requests | |||
| from xml.etree import ElementTree as ET | |||
| import evdev | |||
| from pyudmx import pyudmx | |||
| import talkey | |||
| @@ -33,6 +36,50 @@ class Simple(resource.Resource): | |||
| html = '[{"inuse":"%s"}]' % statustext | |||
| return html.encode('utf-8') | |||
| # Preparing IR Device | |||
| def get_ir_device(): | |||
| devices = [evdev.InputDevice(path) for path in evdev.list_devices()] | |||
| for device in devices: | |||
| if (device.name == "gpio_ir_recv"): | |||
| print("Using device", device.path, "\n") | |||
| return device | |||
| print("No device found!") | |||
| ir_dev = get_ir_device() | |||
| remote_keys = { | |||
| 0x100028: 'mode_disco', # phono start | |||
| 0x100029: 'mode_work', # phono stop | |||
| 0x10000f: 'mode_power', # tuner band | |||
| 0x100000: 'mode_music_play_1', # tuner 1 | |||
| 0x100001: 'mode_music_play_2', # tuner 2 | |||
| 0x100002: 'mode_music_play_3', # tuner 3 | |||
| 0x100003: 'mode_music_play_4', # tuner 4 | |||
| 0x100004: 'mode_music_play_5', # tuner 5 | |||
| 0x100033: 'mode_music_rewind', # tape fast rewind | |||
| 0x100037: 'mode_music_back', # tape slow rewind | |||
| 0x100032: 'mode_music_forward', # tape slow forward | |||
| 0x100034: 'mode_music_fastforward', # tape fast forward | |||
| 0x100038: 'mode_music_stop', # tape stop | |||
| 0x100039: 'mode_music_pause', # tape pause | |||
| 0x10003f: 'mode_music_info', # tape stoprec | |||
| 0x110032: 'mode_music_play', # cd play | |||
| 0x110030: 'mode_music_previous', # cd previous | |||
| 0x110031: 'mode_music_next', # cd next | |||
| 0x110038: 'mode_music_stop', # cd stop | |||
| 0x100025: 'mode_news', # source cd | |||
| 0x10001e: 'mode_play_fm4', # source video 2 | |||
| 0x100022: 'mode_play_oe1', # source video 1 | |||
| 0x100012: 'mode_volume_up', # vol up | |||
| 0x100013: 'mode_volume_down', # vol down | |||
| 0x100014: 'mode_music_mute', # vol mute | |||
| } | |||
| 0x100000 | |||
| # GPIO | |||
| pin_kugel = 2 # Input: dico ball + DMX on/off | |||
| pin_sun = 4 # Input: light bulb on/off | |||
| @@ -86,6 +133,90 @@ dmxStartupScenes = [ | |||
| [120,0,255,255,0,224] | |||
| ] | |||
| def interpretRemoteInputs(): | |||
| events = ir_dev.read() | |||
| try: | |||
| ir_event_list = [event.value for event in events] | |||
| print("Received commands:", ir_event_list) | |||
| if ir_event_list and len(ir_event_list) > 0: | |||
| remote_key = ir_event_list[0] | |||
| print(remote_key) | |||
| code = None | |||
| try: | |||
| code = remote_keys[remote_key] | |||
| except KeyError: | |||
| print('received invalid signal: ' + str(remote_key)) | |||
| lastUsed = time.time() # user is active! | |||
| hadUserInteraction = True | |||
| inUse = True | |||
| print('received code:', str(code)) | |||
| if(code == "mode_disco"): | |||
| setDiscoMode() | |||
| if(code == "mode_work"): | |||
| setWorkingMode() | |||
| if(code == "mode_power"): | |||
| setOnOff() | |||
| if(code == "mode_music_play_1"): | |||
| startMusic('1') | |||
| if(code == "mode_music_play_2"): | |||
| startMusic('2') | |||
| if(code == "mode_music_play_3"): | |||
| startMusic('3') | |||
| if(code == "mode_music_play_4"): | |||
| startMusic('4') | |||
| if(code == "mode_music_play_5"): | |||
| startMusic('5') | |||
| if(code == "mode_play_fm4"): | |||
| startMusic('https://orf-live.ors-shoutcast.at/fm4-q2a') | |||
| if(code == "mode_play_oe1"): | |||
| startMusic('https://orf-live.ors-shoutcast.at/oe1-q2a') | |||
| if(code == "mode_music_previous"): | |||
| previousSong() | |||
| if(code == "mode_music_next"): | |||
| nextSong() | |||
| if(code == "mode_music_play"): | |||
| playMusic() | |||
| if(code == "mode_music_stop"): | |||
| stopMusic() | |||
| if(code == "mode_music_mute"): | |||
| muteMusic() | |||
| if(code == "mode_music_pause"): | |||
| pauseMusic() | |||
| if(code == "mode_music_rewind"): | |||
| seek('-30') | |||
| if(code == "mode_music_back"): | |||
| seek('-5') | |||
| if(code == "mode_music_forward"): | |||
| seek('+5') | |||
| if(code == "mode_music_fastforward"): | |||
| seek('+30') | |||
| if(code == "mode_volume_up"): | |||
| changeVolume(5) | |||
| if(code == "mode_volume_down"): | |||
| changeVolume(-5) | |||
| if(code == "mode_music_info"): | |||
| getTrackInfo() | |||
| if(code == "mode_record"): | |||
| say("I'm sorry, I'm afraid I can't do that!") | |||
| if(code == "mode_news"): | |||
| oejournalUrl = getNewestPodcastUrl('https://files.orf.at/podcast/oe1/oe1_journale.xml') | |||
| startMusic(oejournalUrl) | |||
| except BlockingIOError: | |||
| # ir_event_list = None | |||
| print("No command received.\n") | |||
| # Set a dmx scene by name | |||
| def setDmxScene(scene): | |||
| # a universe of zeros | |||
| @@ -349,7 +480,7 @@ def initService(): | |||
| try: | |||
| client.setvol(defaultvolume) | |||
| except Exception: | |||
| client.connect("localhost", 6600) | |||
| client.connect("0.0.0.0", 6600) | |||
| client.setvol(defaultvolume) | |||
| volume = defaultvolume | |||
| uservolume = defaultvolume | |||
| @@ -368,7 +499,7 @@ def say(text, lang="en"): | |||
| def setOnOff(): | |||
| global mode | |||
| stopMusic() | |||
| if mode is not 'work': | |||
| if mode != 'work': | |||
| setWorkingMode() | |||
| else: | |||
| initService() | |||
| @@ -395,6 +526,7 @@ dmxScene = 0 | |||
| bootstrap() | |||
| dev = pyudmx.uDMXDevice() | |||
| dev.open() | |||
| print('dmx device: ' + str(dev)) | |||
| client = mpd.MPDClient() | |||
| client.connect("localhost", 6600) | |||
| @@ -426,11 +558,12 @@ setSun('off') | |||
| print(timestamp(), "Ready!") | |||
| lirc.init("disco", "~/discobert/lircrc", blocking=False) | |||
| #lirc.init("disco", "~/discobert/lircrc", blocking=False) | |||
| # Main event loop ... | |||
| while True: | |||
| sleep(0.25) | |||
| print("start new loop round") | |||
| sleep(0.3) | |||
| pirstate = wiringpi.digitalRead(pin_pir) | |||
| doorstate = wiringpi.digitalRead(pin_door) | |||
| #print('pirstate: ', pirstate) | |||
| @@ -454,74 +587,8 @@ while True: | |||
| inUse = False | |||
| remotesignal = lirc.nextcode() | |||
| print('remotesignal: ', remotesignal) | |||
| if remotesignal: | |||
| lastUsed = time.time() # user is active! | |||
| hadUserInteraction = True | |||
| inUse = True | |||
| for code in remotesignal: | |||
| print('received code:', code) | |||
| if(code == "mode_disco"): | |||
| setDiscoMode() | |||
| if(code == "mode_work"): | |||
| setWorkingMode() | |||
| if(code == "mode_power"): | |||
| setOnOff() | |||
| if(code == "mode_music_play_1"): | |||
| startMusic('1') | |||
| if(code == "mode_music_play_2"): | |||
| startMusic('2') | |||
| if(code == "mode_music_play_3"): | |||
| startMusic('3') | |||
| if(code == "mode_music_play_4"): | |||
| startMusic('4') | |||
| if(code == "mode_music_play_5"): | |||
| startMusic('5') | |||
| if(code == "mode_play_fm4"): | |||
| startMusic('https://orf-live.ors-shoutcast.at/fm4-q2a') | |||
| if(code == "mode_play_oe1"): | |||
| startMusic('https://orf-live.ors-shoutcast.at/oe1-q2a') | |||
| if(code == "mode_music_previous"): | |||
| previousSong() | |||
| if(code == "mode_music_next"): | |||
| nextSong() | |||
| if(code == "mode_music_play"): | |||
| playMusic() | |||
| if(code == "mode_music_stop"): | |||
| stopMusic() | |||
| if(code == "mode_music_mute"): | |||
| muteMusic() | |||
| if(code == "mode_music_pause"): | |||
| pauseMusic() | |||
| if(code == "mode_music_rewind"): | |||
| seek('-30') | |||
| if(code == "mode_music_back"): | |||
| seek('-5') | |||
| if(code == "mode_music_forward"): | |||
| seek('+5') | |||
| if(code == "mode_music_fastforward"): | |||
| seek('+30') | |||
| if(code == "mode_volume_up"): | |||
| changeVolume(5) | |||
| if(code == "mode_volume_down"): | |||
| changeVolume(-5) | |||
| if(code == "mode_music_info"): | |||
| getTrackInfo() | |||
| if(code == "mode_record"): | |||
| say("I'm sorry, I'm afraid I can't do that!") | |||
| if(code == "mode_news"): | |||
| oejournalUrl = getNewestPodcastUrl('https://files.orf.at/podcast/oe1/oe1_journale.xml') | |||
| startMusic(oejournalUrl) | |||
| interpretRemoteInputs() | |||
| if(inUseBefore != inUse): | |||
| print(timestamp(), "State change inUse:", inUseBefore, inUse) | |||
| if inUse: | |||
| @@ -534,7 +601,7 @@ while True: | |||
| # Webserver | |||
| reactor.iterate() | |||
| lirc.deinit() # Clean up lirc | |||
| #lirc.deinit() # Clean up lirc | |||
| dev.close() | |||
| # dev.close() | |||