From 59dfb197bc2986009134e3c8eccb266729d577ec Mon Sep 17 00:00:00 2001 From: langolierz Date: Mon, 24 Feb 2020 17:45:10 +0000 Subject: [PATCH 1/8] add settings for osc, accesspoint and remote server --- actions.py | 54 +++++++++++++++++++ data_centre/data.py | 12 +++++ display_centre/menu.py | 2 +- .../python_for_shutting_down_osc_server.py | 12 +++-- json_objects/settings_default.json | 29 ++++++++++ user_input/osc_input.py | 31 ++++++++--- 6 files changed, 128 insertions(+), 12 deletions(-) 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): From 989e65af280f9279e4f6a2f1b252d10a98bccd13 Mon Sep 17 00:00:00 2001 From: langolierz Date: Mon, 24 Feb 2020 19:21:05 +0000 Subject: [PATCH 2/8] added pg-updwn and fixed x3speed bug --- actions.py | 21 +++++++++++++++++++ display_centre/display.py | 8 ++++--- display_centre/menu.py | 17 +++++++++++++++ json_objects/keypad_action_mapping.json | 12 +++++------ json_objects/midi_action_mapping.json | 15 +++++++------ json_objects/osc_action_mapping.json | 28 ++++++++++++------------- video_centre/shaders.py | 2 +- 7 files changed, 71 insertions(+), 32 deletions(-) diff --git a/actions.py b/actions.py index a331759..561efb8 100644 --- a/actions.py +++ b/actions.py @@ -47,6 +47,13 @@ class Actions(object): def move_browser_selection_up(self): self.display.browser_menu.navigate_menu_up() + def move_browser_selection_page_down(self): + self.display.browser_menu.navigate_menu_page_down() + + def move_browser_selection_page_up(self): + self.display.browser_menu.navigate_menu_page_up() + + def enter_on_browser_selection(self): self.display.browser_menu.enter_on_browser_selection() @@ -56,6 +63,13 @@ class Actions(object): def move_settings_selection_up(self): self.display.settings_menu.navigate_menu_up() + def move_settings_selection_page_down(self): + self.display.settings_menu.navigate_menu_page_down() + + def move_settings_selection_page_up(self): + self.display.settings_menu.navigate_menu_page_up() + + def enter_on_settings_selection(self): is_setting, setting = self.display.settings_menu.enter_on_setting_selection() if is_setting: @@ -71,6 +85,13 @@ class Actions(object): def move_shaders_selection_up(self): self.shaders.shaders_menu.navigate_menu_up() + def move_shaders_selection_page_down(self): + self.shaders.shaders_menu.navigate_menu_page_down() + + def move_shaders_selection_page_up(self): + self.shaders.shaders_menu.navigate_menu_page_up() + + def enter_on_shaders_selection(self): ##want to select shader if its not selected, and want to enter 'param' mode if it already is is_shader, is_selected_shader, selected_shader = self.shaders.enter_on_shaders_selection() diff --git a/display_centre/display.py b/display_centre/display.py index 17afa99..b86fc59 100644 --- a/display_centre/display.py +++ b/display_centre/display.py @@ -139,7 +139,7 @@ class Display(object): self.display_text.insert(END, '{:40} {:5} \n'.format(path['name'][0:38], path['slot'])) number_of_lines_displayed = number_of_lines_displayed + 1 - for index in range(self.MENU_HEIGHT - number_of_browser_items): + for index in range(self.browser_menu.top_menu_index + self.browser_menu.menu_height - number_of_browser_items): self.display_text.insert(END, '\n') self._highlight_this_row(self.browser_menu.selected_list_index - self.browser_menu.top_menu_index) @@ -159,7 +159,7 @@ class Display(object): self.display_text.insert(END, '{:<23} {:<22} \n'.format(setting['name'][0:22], setting['value'])) line_count = line_count + 1 - for index in range(self.MENU_HEIGHT - number_of_settings_items): + for index in range(self.settings_menu.top_menu_index + self.settings_menu.menu_height - number_of_settings_items): self.display_text.insert(END, '\n') self._highlight_this_row(self.settings_menu.selected_list_index - self.settings_menu.top_menu_index) @@ -190,8 +190,10 @@ class Display(object): shader_line = shaders_list[index] self.display_text.insert(END, '{:<40} {:<5} \n'.format(shader_line['name'][0:30], shader_line['shad_type'])) line_count = line_count + 1 - for index in range(self.MENU_HEIGHT - number_of_shader_items): + + for index in range(self.shaders.shaders_menu.top_menu_index + self.shaders.shaders_menu.menu_height - number_of_shader_items): self.display_text.insert(END, '\n') + self._highlight_this_row(self.shaders.shaders_menu.selected_list_index - self.shaders.shaders_menu.top_menu_index) if self.data.control_mode == "SHADER_PARAM": self._highlight_this_param(self.shaders.focused_param) diff --git a/display_centre/menu.py b/display_centre/menu.py index d6b141f..67e3fe9 100644 --- a/display_centre/menu.py +++ b/display_centre/menu.py @@ -23,6 +23,15 @@ class Menu(object): if self.top_menu_index < 0: self.top_menu_index = 0 + def navigate_menu_page_up(self): + if self.top_menu_index < self.menu_height: + self.top_menu_index = 0 + self.selected_list_index = 0 + else: + self.top_menu_index -= self.menu_height + self.selected_list_index -= self.menu_height + print('self.top_menu_index ', self.top_menu_index) + def navigate_menu_down(self): last_list_index = len(self.menu_list) - 1 if self.selected_list_index != last_list_index: @@ -33,6 +42,14 @@ class Menu(object): else: self.top_menu_index = 0 self.selected_list_index = self.top_menu_index + + def navigate_menu_page_down(self): + if self.top_menu_index >= len(self.menu_list) - self.menu_height: + self.selected_list_index = (len(self.menu_list) - 1) + else: + self.top_menu_index += self.menu_height + self.selected_list_index = min(self.menu_height + self.selected_list_index, len(self.menu_list) - 1) + def update_open_folders(self, folder_name): if folder_name not in self.open_folders: diff --git a/json_objects/keypad_action_mapping.json b/json_objects/keypad_action_mapping.json index 836e46e..4c8ba12 100644 --- a/json_objects/keypad_action_mapping.json +++ b/json_objects/keypad_action_mapping.json @@ -1,19 +1,19 @@ { "a": { - "NAV_BROWSER": ["move_browser_selection_up"], + "NAV_BROWSER": ["move_browser_selection_up", "move_browser_selection_page_up"], "DEFAULT": ["seek_back_on_player", "decrease_seek_time"], - "NAV_SETTINGS": ["move_settings_selection_up"], - "NAV_SHADERS": ["move_shaders_selection_up"], + "NAV_SETTINGS": ["move_settings_selection_up", "move_settings_selection_page_up"], + "NAV_SHADERS": ["move_shaders_selection_up", "move_shaders_selection_page_up"], "LENGTH_SET": ["return_to_default_control_mode"], "CONFIRM": ["return_to_default_control_mode"], "SHADER_PARAM": ["decrease_this_param", "decrease_shader_param"], "PLAY_SHADER": ["decrease_this_param", "decrease_shader_param"] }, "b": { - "NAV_BROWSER": ["move_browser_selection_down"], + "NAV_BROWSER": ["move_browser_selection_down", "move_browser_selection_page_down"], "DEFAULT": ["seek_forward_on_player", "increase_seek_time"], - "NAV_SETTINGS": ["move_settings_selection_down"], - "NAV_SHADERS": ["move_shaders_selection_down"], + "NAV_SETTINGS": ["move_settings_selection_down", "move_settings_selection_page_down"], + "NAV_SHADERS": ["move_shaders_selection_down", "move_shaders_selection_page_down"], "LENGTH_SET": ["return_to_default_control_mode"], "CONFIRM": ["return_to_default_control_mode"], "SHADER_PARAM": ["increase_this_param", "increase_shader_param"], diff --git a/json_objects/midi_action_mapping.json b/json_objects/midi_action_mapping.json index c2eae1b..e50ce45 100644 --- a/json_objects/midi_action_mapping.json +++ b/json_objects/midi_action_mapping.json @@ -43,26 +43,25 @@ "DEFAULT": ["set_strobe_amount_continuous"] }, "note_on 72": { - "NAV_BROWSER": ["move_browser_selection_up"], + "NAV_BROWSER": ["move_browser_selection_up", "move_browser_selection_page_up"], "DEFAULT": ["seek_back_on_player", "decrease_seek_time"], - "NAV_SETTINGS": ["move_settings_selection_up"], - "NAV_SHADERS": ["move_shaders_selection_up"], + "NAV_SETTINGS": ["move_settings_selection_up", "move_settings_selection_page_up"], + "NAV_SHADERS": ["move_shaders_selection_up", "move_shaders_selection_page_up"], "LENGTH_SET": ["return_to_default_control_mode"], "CONFIRM": ["return_to_default_control_mode"], "SHADER_PARAM": ["decrease_this_param", "decrease_shader_param"], "PLAY_SHADER": ["decrease_this_param", "decrease_shader_param"] }, "note_on 73": { - "NAV_BROWSER": ["move_browser_selection_down"], + "NAV_BROWSER": ["move_browser_selection_down", "move_browser_selection_page_down"], "DEFAULT": ["seek_forward_on_player", "increase_seek_time"], - "NAV_SETTINGS": ["move_settings_selection_down"], - "NAV_SHADERS": ["move_shaders_selection_down"], + "NAV_SETTINGS": ["move_settings_selection_down", "move_settings_selection_page_down"], + "NAV_SHADERS": ["move_shaders_selection_down", "move_shaders_selection_page_down"], "LENGTH_SET": ["return_to_default_control_mode"], "CONFIRM": ["return_to_default_control_mode"], "SHADER_PARAM": ["increase_this_param", "increase_shader_param"], "PLAY_SHADER": ["increase_this_param", "increase_shader_param"] - - }, + }, "note_on 74": { "NAV_BROWSER": ["enter_on_browser_selection"], "DEFAULT": ["toggle_action_on_player","toggle_show_on_player"], diff --git a/json_objects/osc_action_mapping.json b/json_objects/osc_action_mapping.json index aeaa23f..48a3b24 100644 --- a/json_objects/osc_action_mapping.json +++ b/json_objects/osc_action_mapping.json @@ -16,25 +16,25 @@ "NAV_DETOUR": ["set_detour_end_continuous"] }, "a": { - "NAV_BROWSER": ["move_browser_selection_up"], - "DEFAULT": ["seek_back_on_player", "decrease_seek_time"], - "NAV_SETTINGS": ["move_settings_selection_up"], - "NAV_SHADERS": ["move_shaders_selection_up"], - "LENGTH_SET": ["return_to_default_control_mode"], - "CONFIRM": ["return_to_default_control_mode"], - "SHADER_PARAM": ["decrease_this_param", "decrease_shader_param"], - "PLAY_SHADER": ["decrease_this_param", "decrease_shader_param"] - }, - "b": { - "NAV_BROWSER": ["move_browser_selection_down"], + "NAV_BROWSER": ["move_browser_selection_down", "move_browser_selection_page_down"], "DEFAULT": ["seek_forward_on_player", "increase_seek_time"], - "NAV_SETTINGS": ["move_settings_selection_down"], - "NAV_SHADERS": ["move_shaders_selection_down"], + "NAV_SETTINGS": ["move_settings_selection_down", "move_settings_selection_page_down"], + "NAV_SHADERS": ["move_shaders_selection_down", "move_shaders_selection_page_down"], "LENGTH_SET": ["return_to_default_control_mode"], "CONFIRM": ["return_to_default_control_mode"], "SHADER_PARAM": ["increase_this_param", "increase_shader_param"], "PLAY_SHADER": ["increase_this_param", "increase_shader_param"] - + }, + "b": { + "NAV_BROWSER": ["enter_on_browser_selection"], + "DEFAULT": ["toggle_action_on_player","toggle_show_on_player"], + "NAV_SETTINGS": ["enter_on_settings_selection"], + "NAV_SHADERS": ["enter_on_shaders_selection", "map_on_shaders_selection"], + "LENGTH_SET": ["record_fixed_length"], + "SHADER_PARAM": ["return_to_default_control_mode"], + "CONFIRM": ["perform_confirm_action"], + "NAV_DETOUR": ["toggle_detour_play"], + "PLAY_SHADER": ["toggle_shaders", "toggle_shader_speed"] }, "c": { "NAV_BROWSER": ["enter_on_browser_selection"], diff --git a/video_centre/shaders.py b/video_centre/shaders.py index da7f9cf..46adf66 100644 --- a/video_centre/shaders.py +++ b/video_centre/shaders.py @@ -254,7 +254,7 @@ class Shaders(object): def set_speed_to_amount(self, amount, layer_offset=0): layer = (self.data.shader_layer + layer_offset) % 3 - self.set_speed_to_amount_layer(layer) + self.set_speed_layer_to_amount(layer, amount) def set_speed_layer_to_amount(self, layer, amount): self.osc_client.send_message("/shader/{}/speed".format(str(layer)), amount ) From 26ef3d68911d7ea2e2b6216b8e5e60f4361c2457 Mon Sep 17 00:00:00 2001 From: langolierz Date: Mon, 24 Feb 2020 19:45:52 +0000 Subject: [PATCH 3/8] eject usb setting --- actions.py | 5 +++++ data_centre/data.py | 7 +++++-- json_objects/settings_default.json | 5 +++++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/actions.py b/actions.py index 561efb8..f353a75 100644 --- a/actions.py +++ b/actions.py @@ -973,6 +973,11 @@ class Actions(object): if os.path.exists(path): os.remove(path) + def eject_all_usb_drives(self): + for i in range(1, 4): + if os.path.exists('/dev/sda{}'.format(i)): + subprocess.call(['sudo', 'eject', '/dev/sda{}'.format(i)]) + # TODO: make this interrogate the various components for available routes to parse # this would include eg a custom script module.. @property diff --git a/data_centre/data.py b/data_centre/data.py index 4fb6da5..6155572 100644 --- a/data_centre/data.py +++ b/data_centre/data.py @@ -82,8 +82,11 @@ class Data(object): def get_ip_address(self): - ip = subprocess.check_output(['hostname', '-I']).decode('utf-8').split()[0] - return ip + ip_list = subprocess.check_output(['hostname', '-I']).decode('utf-8').split() + if len(ip_list) > 0: + return ip_list[0] + else: + return 'none' def get_ip_for_osc_client(self): if self.settings['user_input']['REMOTE_SERVER']['value'] == 'enabled': diff --git a/json_objects/settings_default.json b/json_objects/settings_default.json index 4e98cb7..4ba61a9 100644 --- a/json_objects/settings_default.json +++ b/json_objects/settings_default.json @@ -183,6 +183,11 @@ "action": "shutdown_pi", "options": [], "value": null + }, + "EJECT_USB_DRIVES": { + "action": "eject_all_usb_drives", + "options": [], + "value": null }, "RESTART_OPENFRAMEWORKS": { "action": "restart_openframeworks", From 6eed290777187f94c54026fd97b58e143f89cd91 Mon Sep 17 00:00:00 2001 From: langolierz Date: Mon, 24 Feb 2020 20:38:49 +0000 Subject: [PATCH 4/8] added mouse input --- json_objects/keypad_action_mapping.json | 10 ++++++- json_objects/settings_default.json | 8 ++++++ user_input/numpad_input.py | 37 +++++++++++++++++++------ 3 files changed, 45 insertions(+), 10 deletions(-) diff --git a/json_objects/keypad_action_mapping.json b/json_objects/keypad_action_mapping.json index 4c8ba12..cb33c56 100644 --- a/json_objects/keypad_action_mapping.json +++ b/json_objects/keypad_action_mapping.json @@ -101,5 +101,13 @@ "s": { "DEFAULT": ["load_slot_9_into_next_player","confirm_shutdown"], "PLAY_SHADER": ["play_shader_9","confirm_shutdown"] - } + }, + "x_m": { + "DEFAULT": ["set_the_shader_param_0_layer_offset_0_continuous"], + "NAV_DETOUR": ["set_detour_mix_continuous"] + }, + "y_m": { + "DEFAULT": ["set_the_shader_param_1_layer_offset_0_continuous"], + "NAV_DETOUR": ["set_detour_speed_position_continuous"] + } } diff --git a/json_objects/settings_default.json b/json_objects/settings_default.json index 4ba61a9..0ff919c 100644 --- a/json_objects/settings_default.json +++ b/json_objects/settings_default.json @@ -141,6 +141,14 @@ "options": [], "value": null }, + "MOUSE_INPUT": { + "action": null, + "options": [ + "enabled", + "disabled" + ], + "value": "disabled" + }, "ANALOG_INPUT": { "action": null, "options": [ diff --git a/user_input/numpad_input.py b/user_input/numpad_input.py index f4b19ae..0093a02 100644 --- a/user_input/numpad_input.py +++ b/user_input/numpad_input.py @@ -16,6 +16,7 @@ class NumpadInput(object): def bind_actions(self): self.display.display_text.bind("", self.on_key_press) self.display.display_text.bind("", self.on_key_release) + self.display.display_text.bind("", self.on_mouse_move) def on_key_press(self, event): numpad = list(string.ascii_lowercase[0:19]) @@ -34,7 +35,19 @@ class NumpadInput(object): if event.char in numpad: self.check_key_release_settings(event.char) - def run_action_for_mapped_key(self, key): + def on_mouse_move(self, event): + if self.data.settings['user_input']['MOUSE_INPUT']['value'] != 'enabled': + return + if event.x > 480 or event.y > 320: + return + width = 480 + height = 320 # hard coded since display is fixed , and reading screen is more work + + self.root.after(0, self.run_action_for_mapped_key, 'x_m', event.x / width) + self.root.after(0, self.run_action_for_mapped_key, 'y_m', event.y / height) + #self.run_action_for_mapped_key(event.char) + + def run_action_for_mapped_key(self, key, value=-1): this_mapping = self.key_mappings[key] if self.data.control_mode in this_mapping: mode = self.data.control_mode @@ -42,15 +55,21 @@ class NumpadInput(object): mode = 'DEFAULT' if self.data.function_on and len(this_mapping[mode]) > 1: - print('the action being called is {}'.format(this_mapping[mode][1])) - getattr(self.actions, this_mapping[mode][1])() - if self.data.settings['sampler']['FUNC_GATED']['value'] == 'off': - self.data.function_on = False + is_function = 1 else: - print('the action being called is {}'.format(this_mapping[mode][0])) - getattr(self.actions, this_mapping[mode][0])() - - self.display.refresh_display() + is_function = 0 + + print('the action being called is {}'.format(this_mapping[mode][is_function])) + if value != -1: + getattr(self.actions, this_mapping[mode][is_function])(value) + else: + getattr(self.actions, this_mapping[mode][is_function])() + + if is_function and self.data.settings['sampler']['FUNC_GATED']['value'] == 'off': + self.data.function_on = False + + if not value: + self.display.refresh_display() From f2fb362ad5ade51a2a829e568878b0d93dcd62b4 Mon Sep 17 00:00:00 2001 From: langolierz Date: Thu, 27 Feb 2020 21:31:28 +0100 Subject: [PATCH 5/8] Update README.md --- dotfiles/README.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/dotfiles/README.md b/dotfiles/README.md index 6645ced..b77fe58 100644 --- a/dotfiles/README.md +++ b/dotfiles/README.md @@ -183,7 +183,33 @@ dtoverlay=pi3-miniuart-bt dtoverlay=midi-uart0 ``` +## updates for v2.2 : +### install AccessPoint switching repo : + +- `git clone https://github.com/Autodrop3d/raspiApWlanScripts.git` +- then run the setup script with correct wlan name / password , and the setup for access-point : +`sudo bash raspiApWlanScripts/setup_wlan_and_AP_modes.sh -s -p -a r_e_c_u_r -r cyberboy666` +- remove wifi and password from wpa_supplicant.conf since now it reads from wpa_supplicant-wlan.conf ,, + +### install and setup node server for remote access/control + +- `git clone https://github.com/guergana/r_e_m_o_t_e.git` +- download node `wget https://nodejs.org/dist/latest-v10.x/node-v10.17.0-linux-armv6l.tar.gz` +- extract files `tar -xzf node-v10.17.0-linux-armv6l.tar.gz` + +Finally copy node to its final location and expose it as a global command: + +``` +cd node-v6.11.1-linux-armv6l/ +sudo cp -R * /usr/local/ +``` +- noe `cd r_e_m_o_t_e/` +- now install sockets `npm install socket.io --save` +- install node-osc `npm install node-osc --save` (do we need this ?) +- install osc-js `npm install node-osc --save` + +install serial package : `pip3 install pyserial` # wjhat follows is info, not instructions for setup: From 4e3e5476dc8c43c79a0db2d8d8aae162b63d37ee Mon Sep 17 00:00:00 2001 From: Tristan Rowley Date: Sat, 29 Feb 2020 12:40:37 +0000 Subject: [PATCH 6/8] Make numpad input use actions the same as midi input etc, so that plugins can extend numpad functionality --- user_input/numpad_input.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user_input/numpad_input.py b/user_input/numpad_input.py index 0093a02..aae0d97 100644 --- a/user_input/numpad_input.py +++ b/user_input/numpad_input.py @@ -61,9 +61,9 @@ class NumpadInput(object): print('the action being called is {}'.format(this_mapping[mode][is_function])) if value != -1: - getattr(self.actions, this_mapping[mode][is_function])(value) + self.actions.call_method_name(this_mapping[mode][is_function])(value) else: - getattr(self.actions, this_mapping[mode][is_function])() + self.actions.call_method_name(this_mapping[mode][is_function])() if is_function and self.data.settings['sampler']['FUNC_GATED']['value'] == 'off': self.data.function_on = False From 00aacd53605e49eb008144b8a20232be5d124f25 Mon Sep 17 00:00:00 2001 From: Tristan Rowley Date: Sat, 29 Feb 2020 12:46:58 +0000 Subject: [PATCH 7/8] Updated ACTIONS and generate-list-actions to hide internal commands --- ACTIONS.md | 14 ++++++++++++-- dotfiles/generate-list-actions.sh | 2 +- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/ACTIONS.md b/ACTIONS.md index 260c9e8..5e1bc84 100644 --- a/ACTIONS.md +++ b/ACTIONS.md @@ -1,8 +1,8 @@ # Auto-generated Actions list -Fri 3 Jan 22:08:36 UTC 2020 +Sat 29 Feb 12:43:41 UTC 2020 -for branch=feature_shader_midi +for branch=dev # Methods * change_composite_setting(setting_value) @@ -30,6 +30,7 @@ for branch=feature_shader_midi * decrease_speed * decrease_this_param * disable_feedback + * eject_all_usb_drives * enable_feedback * enter_on_browser_selection * enter_on_settings_selection @@ -59,10 +60,16 @@ for branch=feature_shader_midi * _load_this_slot_into_next_player(slot) * map_on_shaders_selection * move_browser_selection_down + * move_browser_selection_page_down + * move_browser_selection_page_up * move_browser_selection_up * move_settings_selection_down + * move_settings_selection_page_down + * move_settings_selection_page_up * move_settings_selection_up * move_shaders_selection_down + * move_shaders_selection_page_down + * move_shaders_selection_page_up * move_shaders_selection_up * next_bank * next_shader_layer @@ -124,6 +131,7 @@ for branch=feature_shader_midi * set_the_shader_param_3_layer_offset_2_continuous(amount) * set_the_shader_param_3_layer_offset_3_continuous(amount) * shutdown_pi + * stop_remote_process * switch_conjur_player_type(value) * switch_dev_mode(state) * switch_display_to_hdmi @@ -135,6 +143,8 @@ for branch=feature_shader_midi * switch_to_next_player * switch_to_this_detour(number) * switch_video_backend(state) + * toggle_access_point_delay(setting_value, osc_setting_state ) + * toggle_access_point(setting_value) * toggle_action_on_player * toggle_capture_preview * toggle_capture_recording diff --git a/dotfiles/generate-list-actions.sh b/dotfiles/generate-list-actions.sh index dc555cb..3a5bd84 100755 --- a/dotfiles/generate-list-actions.sh +++ b/dotfiles/generate-list-actions.sh @@ -8,7 +8,7 @@ echo echo "# Methods" grep " def " actions.py | grep -v "^#" | sed -e 's/ def //' | sed -e 's/self//' | sed -e 's/(, /(/' | sed -e 's/()//' | sed -e 's/\(.*\)/ *\1/' | sed -e 's/://' | sort -n \ - | grep -v "parserlist\|check_if_should_start_openframeworks\|create_serial_port_process\|__init__\|persist_composite_setting\|receive_detour_info\|_refresh_frame_buffer\|refresh_frame_buffer_and_restart_openframeworks\|run_script\|setup_osc_server\|start_confirm_action\|stop_serial_port_process\|stop_openframeworks_process\|update_capture_settings\|update_config_settings\|update_video_settings\|try_remove_file\|get_callback\|call_method_name\|call_parse_method\|detect_types" + | grep -v "parserlist\|check_if_should_start_openframeworks\|create_serial_port_process\|__init__\|persist_composite_setting\|receive_detour_info\|_refresh_frame_buffer\|refresh_frame_buffer_and_restart_openframeworks\|run_script\|setup_osc_server\|start_confirm_action\|stop_serial_port_process\|stop_openframeworks_process\|update_capture_settings\|update_config_settings\|update_video_settings\|try_remove_file\|get_callback\|call_method_name\|call_parse_method\|detect_types\|show_ip\|toggle_remote_server\|enable_osc\|shutdown_osc_server" echo echo "# Dynamic routes" From 391e8aef01ac9b5044b8e7ecff88d456b1caf4b1 Mon Sep 17 00:00:00 2001 From: Tristan Rowley Date: Sat, 29 Feb 2020 13:28:24 +0000 Subject: [PATCH 8/8] oops, actually fixed, and fix if REMOTE_SERVER is missing from configuration --- data_centre/data.py | 5 +++-- user_input/numpad_input.py | 4 ++-- user_input/osc_input.py | 2 ++ 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/data_centre/data.py b/data_centre/data.py index 6155572..236e4db 100644 --- a/data_centre/data.py +++ b/data_centre/data.py @@ -69,11 +69,12 @@ class Data(object): self.shader_bank_data = [self.create_empty_shader_bank() for i in range(3)] if os.path.isfile(self.PATH_TO_DATA_OBJECTS + self.SHADER_BANK_DATA_JSON): self.shader_bank_data = self._read_json(self.SHADER_BANK_DATA_JSON) - self.settings = self._read_json(self.DEFAULT_SETTINGS_JSON) + self.settings = self.default_settings = self._read_json(self.DEFAULT_SETTINGS_JSON) 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.settings['user_input'].setdefault('REMOTE_SERVER', + self.default_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) diff --git a/user_input/numpad_input.py b/user_input/numpad_input.py index aae0d97..dd3c765 100644 --- a/user_input/numpad_input.py +++ b/user_input/numpad_input.py @@ -61,9 +61,9 @@ class NumpadInput(object): print('the action being called is {}'.format(this_mapping[mode][is_function])) if value != -1: - self.actions.call_method_name(this_mapping[mode][is_function])(value) + self.actions.call_method_name(this_mapping[mode][is_function],value) else: - self.actions.call_method_name(this_mapping[mode][is_function])() + self.actions.call_method_name(this_mapping[mode][is_function]) if is_function and self.data.settings['sampler']['FUNC_GATED']['value'] == 'off': self.data.function_on = False diff --git a/user_input/osc_input.py b/user_input/osc_input.py index 01f57ad..80819af 100644 --- a/user_input/osc_input.py +++ b/user_input/osc_input.py @@ -23,6 +23,8 @@ class OscInput(object): self.poll_settings_for_osc_info() def poll_settings_for_osc_info(self): + self.data.settings['user_input'].setdefault('OSC_INPUT', + self.data.default_settings['user_input'].get('OSC_INPUT')) 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()