diff --git a/actions.py b/actions.py index 21a11c2..a331759 100644 --- a/actions.py +++ b/actions.py @@ -28,6 +28,7 @@ class Actions(object): self.capture = None self.serial_port_process = None self.openframeworks_process = None + self.remote_process = None self.set_capture_object('value') self.server = self.setup_osc_server() @@ -706,8 +707,10 @@ class Actions(object): self.video_driver.exit_all_players() self.exit_openframeworks() self.exit_osc_server('','') + self.create_client_and_shutdown_osc_server() self.stop_serial_port_process() self.stop_openframeworks_process() + self.stop_remote_process() self.toggle_x_autorepeat() self.tk.destroy() @@ -805,14 +808,59 @@ class Actions(object): this_dispatcher.map("/shutdown", self.exit_osc_server) #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_thread = threading.Thread(target=server.serve_forever) server_thread.start() return server def exit_osc_server(self, unused_addr, args): + print('shutting down of osc server') 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): if self.serial_port_process == None: 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 = 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): self.reset_players() self.exit_openframeworks() diff --git a/data_centre/data.py b/data_centre/data.py index 08ffddf..4fb6da5 100644 --- a/data_centre/data.py +++ b/data_centre/data.py @@ -1,3 +1,4 @@ +import subprocess import json import xml.etree.ElementTree as ET import os @@ -72,6 +73,7 @@ class Data(object): if os.path.isfile(self.PATH_TO_DATA_OBJECTS + 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.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) + 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 def create_empty_bank(): @@ -411,3 +421,5 @@ class Data(object): def try_remove_file(path): if os.path.exists(path): os.remove(path) + + diff --git a/display_centre/menu.py b/display_centre/menu.py index 1381b3c..d6b141f 100644 --- a/display_centre/menu.py +++ b/display_centre/menu.py @@ -119,7 +119,7 @@ class SettingsMenu(Menu): 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' ] 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'] SHADER_ORDER = ['USER_SHADER'] DETOUR_ORDER = ['TRY_DEMO'] diff --git a/dotfiles/python_for_shutting_down_osc_server.py b/dotfiles/python_for_shutting_down_osc_server.py index 5fd33a1..fd63ef4 100644 --- a/dotfiles/python_for_shutting_down_osc_server.py +++ b/dotfiles/python_for_shutting_down_osc_server.py @@ -3,15 +3,17 @@ from pythonosc import udp_client from pythonosc import dispatcher import argparse -def setup_osc_client(): +def setup_osc_client(ip, port): client_parser = argparse.ArgumentParser() - client_parser.add_argument("--ip", default="127.0.0.1", help="the ip") - client_parser.add_argument("--port", type=int, default=5433, help="the port") + client_parser.add_argument("--ip", default=ip, help="the ip") + client_parser.add_argument("--port", type=int, default=port, help="the port") client_args = client_parser.parse_args() 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) diff --git a/json_objects/settings_default.json b/json_objects/settings_default.json index b3b4a2a..4e98cb7 100644 --- a/json_objects/settings_default.json +++ b/json_objects/settings_default.json @@ -112,6 +112,35 @@ "options": [], "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": { "action": null, "options": [ diff --git a/user_input/osc_input.py b/user_input/osc_input.py index 7323d20..2394353 100644 --- a/user_input/osc_input.py +++ b/user_input/osc_input.py @@ -17,30 +17,49 @@ class OscInput(object): self.actions = actions self.data = data 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): + ip_address = self.data.get_ip_for_osc_client() + + print('%%%%%%%%%%%%%%%%%%%%% setting up external_osc on ', ip_address) server_parser = argparse.ArgumentParser() - server_parser.add_argument("--ip", default="127.0.0.1", help="the ip") - server_parser.add_argument("--port", type=int, default=5433, help="the port") + server_parser.add_argument("--ip", default=ip_address, help="the ip") + server_parser.add_argument("--port", type=int, default=8080, help="the port") server_args = server_parser.parse_args() this_dispatcher = dispatcher.Dispatcher() - + this_dispatcher.map("/keyboard/*", self.on_osc_input) this_dispatcher.map("/shaderparam0", self.on_param_osc_input) this_dispatcher.map("/shaderparam1", 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("/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_thread = threading.Thread(target=server.serve_forever) server_thread.start() - return server + self.osc_server = server def exit_osc_server(self, unused_addr, args): + print('%%%%%%%%%%%%%%%%%%%%% exiting external_osc') self.osc_server.shutdown() def on_osc_input(self, addr, args):