add settings for osc, accesspoint and remote server

This commit is contained in:
langolierz
2020-02-24 17:45:10 +00:00
parent 67d1de8c3a
commit 59dfb197bc
6 changed files with 128 additions and 12 deletions

View File

@@ -28,6 +28,7 @@ class Actions(object):
self.capture = None self.capture = None
self.serial_port_process = None self.serial_port_process = None
self.openframeworks_process = None self.openframeworks_process = None
self.remote_process = None
self.set_capture_object('value') self.set_capture_object('value')
self.server = self.setup_osc_server() self.server = self.setup_osc_server()
@@ -706,8 +707,10 @@ class Actions(object):
self.video_driver.exit_all_players() self.video_driver.exit_all_players()
self.exit_openframeworks() self.exit_openframeworks()
self.exit_osc_server('','') self.exit_osc_server('','')
self.create_client_and_shutdown_osc_server()
self.stop_serial_port_process() self.stop_serial_port_process()
self.stop_openframeworks_process() self.stop_openframeworks_process()
self.stop_remote_process()
self.toggle_x_autorepeat() self.toggle_x_autorepeat()
self.tk.destroy() self.tk.destroy()
@@ -805,14 +808,59 @@ class Actions(object):
this_dispatcher.map("/shutdown", self.exit_osc_server) this_dispatcher.map("/shutdown", self.exit_osc_server)
#this_dispatcher.map("/player/a/status", self.set_status) #this_dispatcher.map("/player/a/status", self.set_status)
osc_server.ThreadingOSCUDPServer.allow_reuse_address = True
server = osc_server.ThreadingOSCUDPServer((server_args.ip, server_args.port), this_dispatcher) server = osc_server.ThreadingOSCUDPServer((server_args.ip, server_args.port), this_dispatcher)
server_thread = threading.Thread(target=server.serve_forever) server_thread = threading.Thread(target=server.serve_forever)
server_thread.start() server_thread.start()
return server return server
def exit_osc_server(self, unused_addr, args): def exit_osc_server(self, unused_addr, args):
print('shutting down of osc server')
self.server.shutdown() self.server.shutdown()
def create_client_and_shutdown_osc_server(self):
from pythonosc import udp_client
client_parser = argparse.ArgumentParser()
client_parser.add_argument("--ip", default=self.data.get_ip_for_osc_client(), help="the ip")
client_parser.add_argument("--port", type=int, default=8080, help="the port")
client_args = client_parser.parse_args()
client = udp_client.SimpleUDPClient(client_args.ip, client_args.port)
client.send_message("/shutdown", True)
def toggle_access_point(self, setting_value):
osc_setting_state = self.data.settings['user_input']['OSC_INPUT']['value']
self.data.settings['user_input']['OSC_INPUT']['value'] = 'disabled'
self.tk.after(2000, self.toggle_access_point_delay, setting_value, osc_setting_state)
def toggle_access_point_delay(self, setting_value, osc_setting_state ):
if setting_value == 'enabled':
subprocess.call(['sudo', 'bash', '/home/pi/raspiApWlanScripts-master/switchToAP.sh'])
else:
subprocess.call(['sudo', 'bash', '/home/pi/raspiApWlanScripts-master/switchToWlan.sh'])
self.tk.after(6000, self.enable_osc, osc_setting_state)
def toggle_remote_server(self, setting_value):
osc_setting_state = self.data.settings['user_input']['OSC_INPUT']['value']
self.data.settings['user_input']['OSC_INPUT']['value'] = 'disabled'
self.tk.after(2000, self.toggle_remote_server_delay, setting_value, osc_setting_state)
def toggle_remote_server_delay(self, setting_value, osc_setting_state):
if setting_value == 'enabled':
self.remote_process = subprocess.Popen(['node', '/home/pi/connecting-websockets-to-osc-for-rpi/webserver.js'])
else:
self.stop_remote_process()
self.data.settings['user_input']['OSC_INPUT']['value'] = osc_setting_state
def enable_osc(self, osc_setting_state):
self.data.settings['user_input']['OSC_INPUT']['value'] = osc_setting_state
def show_ip(self, *args):
address = self.data.get_ip_address()
self.message_handler.set_message('INFO', 'ip is {}:8080'.format(address))
def create_serial_port_process(self): def create_serial_port_process(self):
if self.serial_port_process == None: if self.serial_port_process == None:
self.serial_port_process = subprocess.Popen("exec " + "ttymidi -s /dev/serial0 -b 38400 -n serial", shell=True) self.serial_port_process = subprocess.Popen("exec " + "ttymidi -s /dev/serial0 -b 38400 -n serial", shell=True)
@@ -823,6 +871,12 @@ class Actions(object):
self.serial_port_process.kill() self.serial_port_process.kill()
self.serial_port_process = None self.serial_port_process = None
def stop_remote_process(self):
if self.remote_process is not None:
self.remote_process.kill()
self.remote_process = None
def restart_openframeworks(self): def restart_openframeworks(self):
self.reset_players() self.reset_players()
self.exit_openframeworks() self.exit_openframeworks()

View File

@@ -1,3 +1,4 @@
import subprocess
import json import json
import xml.etree.ElementTree as ET import xml.etree.ElementTree as ET
import os import os
@@ -72,6 +73,7 @@ class Data(object):
if os.path.isfile(self.PATH_TO_DATA_OBJECTS + self.SETTINGS_JSON): if os.path.isfile(self.PATH_TO_DATA_OBJECTS + self.SETTINGS_JSON):
self.settings = self._read_json(self.SETTINGS_JSON) self.settings = self._read_json(self.SETTINGS_JSON)
self.settings['user_input']['REMOTE_SERVER']['value'] = 'disabled' # remote server off at boot
self.key_mappings = self._read_json(self.KEYPAD_MAPPING_JSON) self.key_mappings = self._read_json(self.KEYPAD_MAPPING_JSON)
self.osc_mappings = self._read_json(self.OSC_MAPPING_JSON) self.osc_mappings = self._read_json(self.OSC_MAPPING_JSON)
@@ -79,7 +81,15 @@ class Data(object):
self.analog_mappings = self._read_json(self.ANALOG_MAPPING_JSON) self.analog_mappings = self._read_json(self.ANALOG_MAPPING_JSON)
def get_ip_address(self):
ip = subprocess.check_output(['hostname', '-I']).decode('utf-8').split()[0]
return ip
def get_ip_for_osc_client(self):
if self.settings['user_input']['REMOTE_SERVER']['value'] == 'enabled':
return '127.0.0.1'
else:
return self.get_ip_address()
@staticmethod @staticmethod
def create_empty_bank(): def create_empty_bank():
@@ -411,3 +421,5 @@ class Data(object):
def try_remove_file(path): def try_remove_file(path):
if os.path.exists(path): if os.path.exists(path):
os.remove(path) os.remove(path)

View File

@@ -119,7 +119,7 @@ class SettingsMenu(Menu):
FOLDER_ORDER = ['video', 'sampler', 'user_input', 'capture', 'shader', 'detour', 'system' ] FOLDER_ORDER = ['video', 'sampler', 'user_input', 'capture', 'shader', 'detour', 'system' ]
SAMPLER_ORDER = ['LOOP_TYPE', 'LOAD_NEXT', 'RAND_START_MODE', 'RESET_PLAYERS', 'FIXED_LENGTH_MODE', 'FIXED_LENGTH', 'FIXED_LENGTH_MULTIPLY' ] SAMPLER_ORDER = ['LOOP_TYPE', 'LOAD_NEXT', 'RAND_START_MODE', 'RESET_PLAYERS', 'FIXED_LENGTH_MODE', 'FIXED_LENGTH', 'FIXED_LENGTH_MULTIPLY' ]
VIDEO_ORDER = ['VIDEOPLAYER_BACKEND'] VIDEO_ORDER = ['VIDEOPLAYER_BACKEND']
USER_INPUT_ORDER = ['MIDI_INPUT', 'MIDI_STATUS', 'CYCLE_MIDI_PORT'] USER_INPUT_ORDER = ['MIDI_INPUT', 'MIDI_STATUS', 'CYCLE_MIDI_PORT', 'OSC_INPUT', 'ACCESS_POINT', 'REMOTE_SERVER', 'SHOW_IP' ]
CAPTURE_ORDER = ['DEVICE', 'TYPE'] CAPTURE_ORDER = ['DEVICE', 'TYPE']
SHADER_ORDER = ['USER_SHADER'] SHADER_ORDER = ['USER_SHADER']
DETOUR_ORDER = ['TRY_DEMO'] DETOUR_ORDER = ['TRY_DEMO']

View File

@@ -3,15 +3,17 @@ from pythonosc import udp_client
from pythonosc import dispatcher from pythonosc import dispatcher
import argparse import argparse
def setup_osc_client(): def setup_osc_client(ip, port):
client_parser = argparse.ArgumentParser() client_parser = argparse.ArgumentParser()
client_parser.add_argument("--ip", default="127.0.0.1", help="the ip") client_parser.add_argument("--ip", default=ip, help="the ip")
client_parser.add_argument("--port", type=int, default=5433, help="the port") client_parser.add_argument("--port", type=int, default=port, help="the port")
client_args = client_parser.parse_args() client_args = client_parser.parse_args()
return udp_client.SimpleUDPClient(client_args.ip, client_args.port) return udp_client.SimpleUDPClient(client_args.ip, client_args.port)
client = setup_osc_client() client = setup_osc_client('127.0.0.1',5433)
client.send_message("/shutdown", True)
client = setup_osc_client('127.0.0.1',9000)
client.send_message("/shutdown", True) client.send_message("/shutdown", True)

View File

@@ -112,6 +112,35 @@
"options": [], "options": [],
"value": null "value": null
}, },
"OSC_INPUT": {
"action": null,
"options": [
"enabled",
"disabled"
],
"value": "disabled"
},
"ACCESS_POINT": {
"action": "toggle_access_point",
"options": [
"enabled",
"disabled"
],
"value": "disabled"
},
"REMOTE_SERVER": {
"action": "toggle_remote_server",
"options": [
"enabled",
"disabled"
],
"value": "disabled"
},
"SHOW_IP": {
"action": "show_ip",
"options": [],
"value": null
},
"ANALOG_INPUT": { "ANALOG_INPUT": {
"action": null, "action": null,
"options": [ "options": [

View File

@@ -17,12 +17,28 @@ class OscInput(object):
self.actions = actions self.actions = actions
self.data = data self.data = data
self.osc_mappings = data.osc_mappings self.osc_mappings = data.osc_mappings
self.osc_server = self.setup_osc_server()
self.osc_enabled = False
self.osc_server = None
self.poll_settings_for_osc_info()
def poll_settings_for_osc_info(self):
osc_setting_enabled = self.data.settings['user_input']['OSC_INPUT']['value'] == 'enabled'
if osc_setting_enabled and not self.osc_enabled:
self.setup_osc_server()
self.osc_enabled = True
elif not osc_setting_enabled and self.osc_enabled:
self.actions.create_client_and_shutdown_osc_server()
self.osc_enabled = False
self.root.after(1000, self.poll_settings_for_osc_info)
def setup_osc_server(self): def setup_osc_server(self):
ip_address = self.data.get_ip_for_osc_client()
print('%%%%%%%%%%%%%%%%%%%%% setting up external_osc on ', ip_address)
server_parser = argparse.ArgumentParser() server_parser = argparse.ArgumentParser()
server_parser.add_argument("--ip", default="127.0.0.1", help="the ip") server_parser.add_argument("--ip", default=ip_address, help="the ip")
server_parser.add_argument("--port", type=int, default=5433, help="the port") server_parser.add_argument("--port", type=int, default=8080, help="the port")
server_args = server_parser.parse_args() server_args = server_parser.parse_args()
@@ -34,13 +50,16 @@ class OscInput(object):
this_dispatcher.map("/shaderparam2", self.on_param_osc_input) this_dispatcher.map("/shaderparam2", self.on_param_osc_input)
this_dispatcher.map("/shaderparam3", self.on_param_osc_input) this_dispatcher.map("/shaderparam3", self.on_param_osc_input)
this_dispatcher.map("/shutdown", self.exit_osc_server) this_dispatcher.map("/shutdown", self.exit_osc_server)
#this_dispatcher.map("/*", print)
osc_server.ThreadingOSCUDPServer.allow_reuse_address = True
server = osc_server.ThreadingOSCUDPServer((server_args.ip, server_args.port), this_dispatcher) server = osc_server.ThreadingOSCUDPServer((server_args.ip, server_args.port), this_dispatcher)
server_thread = threading.Thread(target=server.serve_forever) server_thread = threading.Thread(target=server.serve_forever)
server_thread.start() server_thread.start()
return server self.osc_server = server
def exit_osc_server(self, unused_addr, args): def exit_osc_server(self, unused_addr, args):
print('%%%%%%%%%%%%%%%%%%%%% exiting external_osc')
self.osc_server.shutdown() self.osc_server.shutdown()
def on_osc_input(self, addr, args): def on_osc_input(self, addr, args):