From f1e92a01db03b9f972d9258bcff17e896a37d290 Mon Sep 17 00:00:00 2001 From: langolierz Date: Mon, 24 Sep 2018 19:12:58 +0000 Subject: [PATCH] adding intergration with mcp3008 for analog inputs --- actions.py | 29 ++++------- data_centre/data.py | 2 + json_objects/analog_action_mapping.json | 5 ++ json_objects/midi_action_mapping.json | 10 ++-- json_objects/settings_default.json | 28 ++++++++++ r_e_c_u_r.py | 2 + user_input/analog_input.py | 68 +++++++++++++++++++++++++ user_input/midi_input.py | 10 ++-- video_centre/video_player.py | 5 +- 9 files changed, 130 insertions(+), 29 deletions(-) create mode 100644 json_objects/analog_action_mapping.json create mode 100644 user_input/analog_input.py diff --git a/actions.py b/actions.py index bf1806e..140e90e 100644 --- a/actions.py +++ b/actions.py @@ -198,30 +198,21 @@ class Actions(object): elif self.data.player_mode == 'next': self.data.player_mode = 'now' - def set_the_camera_colour_u_with_cc(self, amount): - u_value = self._convert_midi_cc_value(amount, 0, 255) - self.capture.set_colour(u_value, None) + def set_the_camera_colour_u_continuous(self, amount): + self.capture.set_colour(amount*255, None) - def set_the_camera_colour_v_with_cc(self, amount): - v_value = self._convert_midi_cc_value(amount, 0, 255) - self.capture.set_colour(None, v_value) + def set_the_camera_colour_v_continuous(self, amount): + self.capture.set_colour(None, amount*255) - def set_the_camera_alpha_cc(self, amount): - alpha_amount = self._convert_midi_cc_value(amount, 0, 255) - self.capture.set_alpha(alpha_amount) + def set_the_camera_alpha_continuous(self, amount): + self.capture.set_alpha(amount*255) - def set_the_current_video_alpha_cc(self, amount): - alpha_amount = self._convert_midi_cc_value(amount, 0, 255) - self.video_driver.current_player.set_alpha_value(alpha_amount) + def set_the_current_video_alpha_continuous(self, amount): + self.video_driver.current_player.set_alpha_value(amount*255) - def set_the_next_video_alpha_cc(self, amount): - alpha_amount = self._convert_midi_cc_value(amount, 0, 255) - self.video_driver.next_player.set_alpha_value(alpha_amount) + def set_the_next_video_alpha_continuous(self, amount): + self.video_driver.next_player.set_alpha_value(amount*255) - @staticmethod - def _convert_midi_cc_value(cc_value, min_param, max_param): - output_range = max_param - min_param - return int(( cc_value / 127 ) * output_range + min_param) def get_midi_status(self): self.message_handler.set_message('INFO', 'midi status is {}'.format(self.data.midi_status)) diff --git a/data_centre/data.py b/data_centre/data.py index 6bf6007..6de827e 100644 --- a/data_centre/data.py +++ b/data_centre/data.py @@ -16,6 +16,7 @@ class Data(object): DEFAULT_SETTINGS_JSON = 'settings_default.json' KEYPAD_MAPPING_JSON = 'keypad_action_mapping.json' MIDI_MAPPING_JSON = 'midi_action_mapping.json' + ANALOG_MAPPING_JSON = 'analog_action_mapping.json' EMPTY_SLOT = dict(name='', location='', length=-1, start=-1, end=-1, rate=1) PATH_TO_DATA_OBJECTS = '/home/pi/r_e_c_u_r/json_objects/' PATH_TO_EXTERNAL_DEVICES = '/media/pi' @@ -51,6 +52,7 @@ class Data(object): self.key_mappings = self._read_json(self.KEYPAD_MAPPING_JSON) self.midi_mappings = self._read_json(self.MIDI_MAPPING_JSON) + self.analog_mappings = self._read_json(self.ANALOG_MAPPING_JSON) @staticmethod def create_empty_bank(): diff --git a/json_objects/analog_action_mapping.json b/json_objects/analog_action_mapping.json new file mode 100644 index 0000000..31664d7 --- /dev/null +++ b/json_objects/analog_action_mapping.json @@ -0,0 +1,5 @@ +{ + "7": { + "DEFAULT": ["set_the_current_video_alpha_continuous"] + } +} diff --git a/json_objects/midi_action_mapping.json b/json_objects/midi_action_mapping.json index ec8524b..2fd28c0 100644 --- a/json_objects/midi_action_mapping.json +++ b/json_objects/midi_action_mapping.json @@ -1,18 +1,18 @@ { "control_change 0": { - "DEFAULT": ["set_the_current_video_alpha_cc"] + "DEFAULT": ["set_the_current_video_alpha_continuous"] }, "control_change 1": { - "DEFAULT": ["set_the_next_video_alpha_cc"] + "DEFAULT": ["set_the_next_video_alpha_continuous"] }, "control_change 2": { - "DEFAULT": ["set_the_camera_alpha_cc"] + "DEFAULT": ["set_the_camera_alpha_continuous"] }, "control_change 3": { - "DEFAULT": ["set_the_camera_colour_u_with_cc"] + "DEFAULT": ["set_the_camera_colour_u_continuous"] }, "control_change 4": { - "DEFAULT": ["set_the_camera_colour_v_with_cc"] + "DEFAULT": ["set_the_camera_colour_v_continuous"] }, "note_on 72": { "NAV_BROWSER": ["move_browser_selection_up"], diff --git a/json_objects/settings_default.json b/json_objects/settings_default.json index 2a5aef1..229992c 100644 --- a/json_objects/settings_default.json +++ b/json_objects/settings_default.json @@ -1,5 +1,25 @@ { "capture": { + "TYPE": { + "action": "update_capture_settings", + "options": [ + "piCamera", + "piCaptureSd1" + ], + "value": "piCaptureSd1" + }, + "PICAPTURE_INPUT": { + "action": "change_piCapture_input", + "options": [ + "auto", + "video1", + "video2", + "video3", + "svideo", + "component" + ], + "value": "video1" + }, "DEVICE": { "action": "update_capture_settings", "options": [ @@ -87,6 +107,14 @@ } }, "other": { + "ANALOG_INPUT": { + "action": null, + "options": [ + "enabled", + "disabled" + ], + "value": "disabled" + }, "DEV_MODE_RESET": { "action": "switch_dev_mode", "options": [ diff --git a/r_e_c_u_r.py b/r_e_c_u_r.py index e414a28..f57e365 100755 --- a/r_e_c_u_r.py +++ b/r_e_c_u_r.py @@ -11,6 +11,7 @@ from display_centre.display import Display from display_centre.messages import MessageHandler from user_input.numpad_input import NumpadInput from user_input.midi_input import MidiInput +from user_input.analog_input import AnalogInput from video_centre.video_driver import VideoDriver from video_centre.capture import Capture import data_centre @@ -39,6 +40,7 @@ actions = Actions(tk, message_handler, data, video_driver, capture, display) numpad_input = NumpadInput(tk, message_handler, display, actions, data) midi_input = MidiInput(tk, message_handler, display, actions, data) +analog_input = AnalogInput(tk, message_handler, display, actions, data) actions.check_and_set_output_mode_on_boot() actions.check_dev_mode() diff --git a/user_input/analog_input.py b/user_input/analog_input.py new file mode 100644 index 0000000..6b04736 --- /dev/null +++ b/user_input/analog_input.py @@ -0,0 +1,68 @@ +import Adafruit_GPIO.SPI as SPI +import Adafruit_MCP3008 + +class AnalogInput(object): + def __init__(self, root, message_handler, display, actions, data): + self.root = root + self.message_handler = message_handler + self.display = display + self.actions = actions + self.data = data + self.analog_mappings = data.analog_mappings + self.midi_device = None + self.analog_delay = 50 + + SPI_PORT = 1 + SPI_DEVICE = 2 + self.analog_input = Adafruit_MCP3008.MCP3008(spi=SPI.SpiDev(SPI_PORT, SPI_DEVICE)) + self.check_if_listening_enabled() + + + def check_if_listening_enabled(self): + if self.data.settings['other']['ANALOG_INPUT']['value'] == 'enabled': + self.poll_analog_inputs() + else: + self.root.after(1000, self.check_if_listening_enabled) + + def poll_analog_inputs(self): + if self.data.settings['other']['ANALOG_INPUT']['value'] == 'enabled': + for i in range(0,8): + if str(i) in self.analog_mappings: + print('{} is in the mapping'.format(i)) + reading = self.analog_input.read_adc(i) + self.run_action_for_mapped_channel(i, reading) + self.root.after(self.analog_delay, self.poll_analog_inputs) + else: + self.check_if_listening_enabled() + + def run_action_for_mapped_channel(self, channel, channel_value): + this_mapping = self.analog_mappings[str(channel)] + if self.data.control_mode in this_mapping: + mode = self.data.control_mode + elif 'DEFAULT' in this_mapping: + mode = 'DEFAULT' + + if self.data.function_on and len(this_mapping[mode]) > 1: + method_name = this_mapping[mode][1] + self.data.function_on = False + else: + method_name = this_mapping[mode][0] + + if channel_value is not None: + norm_channel_value = channel_value/1023 + else: + norm_channel_value = None + + print('the action being called is {}'.format(method_name)) + self.call_method_name(method_name, norm_channel_value) + ## not sure whether we want to update the screen in general; here - probably not most of the time ... + #if 'cc' not in message_name: + # self.display.refresh_display() + + def call_method_name(self, method_name, argument=None): + if argument is not None: + getattr(self.actions, method_name)(argument) + else: + getattr(self.actions, method_name)() + + diff --git a/user_input/midi_input.py b/user_input/midi_input.py index 86911c8..88203e0 100644 --- a/user_input/midi_input.py +++ b/user_input/midi_input.py @@ -91,9 +91,13 @@ class MidiInput(object): method_name = this_mapping[mode][0] print('the action being called is {}'.format(method_name)) - self.call_method_name(method_name, mapped_message_value) - ## only update screen if not cc - seeing if cc can respond faster if not refreshing screen on every action - if 'cc' not in message_name: + if mapped_message_value is not None: + norm_message_value = mapped_message_value/127 + else: + norm_message_value = None + self.call_method_name(method_name, norm_message_value) + ## only update screen if not continuous - seeing if cc can respond faster if not refreshing screen on every action + if 'continuous' not in message_name: self.display.refresh_display() def call_method_name(self, method_name, argument=None): diff --git a/video_centre/video_player.py b/video_centre/video_player.py index df63850..bab1a0c 100644 --- a/video_centre/video_player.py +++ b/video_centre/video_player.py @@ -141,8 +141,9 @@ class VideoPlayer: self.set_alpha_value(255) def set_alpha_value(self, amount): - self.omx_player.set_alpha(amount) - self.alpha = amount + if self.omx_player: + self.omx_player.set_alpha(amount) + self.alpha = amount def seek(self, amount): position = self.get_position()