mirror of
https://github.com/cyberboy666/r_e_c_u_r.git
synced 2025-12-12 03:10:17 +01:00
Merge branch 'feature_plugins' into feature_plugins_shader_gadgets - MultiActions, some fixes and improved handling of action calls
This commit is contained in:
17
ACTIONS.md
17
ACTIONS.md
@@ -1,6 +1,6 @@
|
||||
# Auto-generated Actions list
|
||||
|
||||
Fri 10 Jan 17:25:14 UTC 2020
|
||||
Fri 31 Jan 20:19:55 UTC 2020
|
||||
|
||||
for branch=feature_plugins
|
||||
|
||||
@@ -173,13 +173,14 @@ for branch=feature_plugins
|
||||
* set_shader_speed_layer_([0-2])_amount
|
||||
|
||||
### Plugin routes
|
||||
* test_plugin (from MidiActionsTestPlugin)
|
||||
* cycle_shaders (from MidiActionsTestPlugin)
|
||||
* run_automation (from MidiActionsTestPlugin)
|
||||
* stop_automation (from MidiActionsTestPlugin)
|
||||
* toggle_pause_automation (from MidiActionsTestPlugin)
|
||||
* pause_automation (from MidiActionsTestPlugin)
|
||||
* toggle_loop_automation (from MidiActionsTestPlugin)
|
||||
* (.*)&&(.*) (from MultiActionsPlugin)
|
||||
* test_plugin (from TestPlugin)
|
||||
* cycle_shaders (from TestPlugin)
|
||||
* run_automation (from TestPlugin)
|
||||
* stop_automation (from TestPlugin)
|
||||
* toggle_pause_automation (from TestPlugin)
|
||||
* pause_automation (from TestPlugin)
|
||||
* toggle_loop_automation (from TestPlugin)
|
||||
|
||||
----
|
||||
|
||||
|
||||
85
actions.py
85
actions.py
@@ -1,6 +1,7 @@
|
||||
import subprocess
|
||||
import tracemalloc
|
||||
import data_centre.length_setter as length_setter
|
||||
from inspect import signature
|
||||
import sys
|
||||
import shlex
|
||||
import os
|
||||
@@ -907,19 +908,19 @@ class Actions(object):
|
||||
@property
|
||||
def parserlist(self):
|
||||
return {
|
||||
( r"play_shader_([0-9])_([0-9])", self.shaders.play_that_shader ),
|
||||
( r"toggle_shader_layer_([0-2])", self.toggle_shader_layer ),
|
||||
( r"start_shader_layer_([0-2])", self.shaders.start_shader ),
|
||||
( r"stop_shader_layer_([0-2])", self.shaders.stop_shader ),
|
||||
( r"set_the_shader_param_([0-3])_layer_([0-2])_continuous", self.shaders.set_param_layer_to_amount ),
|
||||
( r"modulate_param_([0-3])_to_amount_continuous", self.shaders.modulate_param_to_amount ),
|
||||
( r"set_param_([0-3])_layer_([0-2])_modulation_level_continuous", self.shaders.set_param_layer_offset_modulation_level ),
|
||||
( r"set_param_([0-3])_layer_offset_([0-2])_modulation_level_continuous", self.shaders.set_param_layer_offset_modulation_level ),
|
||||
( r"reset_selected_modulation", self.shaders.reset_selected_modulation ),
|
||||
( r"reset_modulation_([0-3])", self.shaders.reset_modulation ),
|
||||
( r"select_shader_modulation_slot_([0-3])", self.shaders.select_shader_modulation_slot ),
|
||||
( r"set_shader_speed_layer_offset_([0-2])_amount", self.shaders.set_speed_offset_to_amount ),
|
||||
( r"set_shader_speed_layer_([0-2])_amount", self.shaders.set_speed_layer_to_amount ),
|
||||
( r"^play_shader_([0-9])_([0-9])$", self.shaders.play_that_shader ),
|
||||
( r"^toggle_shader_layer_([0-2])$", self.toggle_shader_layer ),
|
||||
( r"^start_shader_layer_([0-2])$", self.shaders.start_shader ),
|
||||
( r"^stop_shader_layer_([0-2])$", self.shaders.stop_shader ),
|
||||
( r"^set_the_shader_param_([0-3])_layer_([0-2])_continuous$", self.shaders.set_param_layer_to_amount ),
|
||||
( r"^modulate_param_([0-3])_to_amount_continuous$", self.shaders.modulate_param_to_amount ),
|
||||
( r"^set_param_([0-3])_layer_([0-2])_modulation_level_continuous$", self.shaders.set_param_layer_modulation_level ),
|
||||
( r"^set_param_([0-3])_layer_offset_([0-2])_modulation_level_continuous$", self.shaders.set_param_layer_offset_modulation_level ),
|
||||
( r"^reset_selected_modulation$", self.shaders.reset_selected_modulation ),
|
||||
( r"^reset_modulation_([0-3])$", self.shaders.reset_modulation ),
|
||||
( r"^select_shader_modulation_slot_([0-3])$", self.shaders.select_shader_modulation_slot ),
|
||||
( r"^set_shader_speed_layer_offset_([0-2])_amount$", self.shaders.set_speed_offset_to_amount ),
|
||||
( r"^set_shader_speed_layer_([0-2])_amount$", self.shaders.set_speed_layer_to_amount ),
|
||||
}
|
||||
|
||||
def detect_types(self, args):
|
||||
@@ -942,34 +943,46 @@ class Actions(object):
|
||||
|
||||
return (found_method, args)
|
||||
|
||||
return None, None
|
||||
|
||||
def call_method_name(self, method_name, argument=None):
|
||||
# if the target method doesnt exist, call the handler
|
||||
if not hasattr(self, method_name):
|
||||
self.call_parse_method_name(method_name, argument)
|
||||
return
|
||||
method = None
|
||||
arguments = None
|
||||
|
||||
if argument is not None:
|
||||
getattr(self, method_name)(argument)
|
||||
else:
|
||||
getattr(self, method_name)()
|
||||
# first check if we have a native method to handle this for us
|
||||
# todo: assess whether it would still be performant/desirable to be able to override core actions with plugins?
|
||||
if hasattr(self, method_name):
|
||||
method = getattr(self, method_name)
|
||||
if argument is not None:
|
||||
arguments = [argument]
|
||||
|
||||
|
||||
def call_parse_method_name(self, method_name, argument):
|
||||
# first test if a registered plugin handles this for us
|
||||
from data_centre.plugin_collection import ActionsPlugin
|
||||
for plugin in self.data.plugins.get_plugins(ActionsPlugin):
|
||||
if plugin.is_handled(method_name):
|
||||
print ("Plugin %s is handling %s" % (plugin, method_name))
|
||||
method, arguments = plugin.get_callback_for_method(method_name, argument)
|
||||
method(*arguments)
|
||||
return
|
||||
|
||||
# if not then fall back to using internal method
|
||||
try:
|
||||
# if not then check if its handled by one of our parserlist dynamic route methods
|
||||
if method is None:
|
||||
method, arguments = self.get_callback_for_method(method_name, argument)
|
||||
method(*arguments)
|
||||
except:
|
||||
|
||||
# if still nothing then test if a registered plugin handles this for us -- perhaps this ought to go first?
|
||||
if method is None:
|
||||
from data_centre.plugin_collection import ActionsPlugin
|
||||
for plugin in self.data.plugins.get_plugins(ActionsPlugin):
|
||||
if plugin.is_handled(method_name):
|
||||
print ("Plugin %s is handling %s" % (plugin, method_name))
|
||||
method, arguments = plugin.get_callback_for_method(method_name, argument)
|
||||
break # only deal with the first plugin
|
||||
|
||||
if method is None:
|
||||
print ("Failed to find a method for '%s'" % method_name)
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
return
|
||||
|
||||
try:
|
||||
#print ("for method_name %s, arguments is %s and len is %s" % (method_name, arguments, len(signature(method).parameters)))
|
||||
if arguments is not None and len(signature(method).parameters)==len(arguments): # only pass arguments if count matches method sig
|
||||
method(*arguments)
|
||||
else:
|
||||
method()
|
||||
except:
|
||||
print ("Exception calling action for '%s' with arguments ( %s ) " % ( method_name, arguments))
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
|
||||
|
||||
@@ -39,12 +39,12 @@ class SequencePlugin(Plugin):
|
||||
@property
|
||||
def parserlist(self):
|
||||
return [
|
||||
( r"run_automation", self.run_automation ),
|
||||
( r"stop_automation", self.stop_automation ),
|
||||
( r"toggle_pause_automation", self.toggle_pause_automation ),
|
||||
( r"pause_automation", self.pause_automation ),
|
||||
( r"toggle_loop_automation", self.toggle_loop_automation ),
|
||||
( r"set_automation_speed", self.set_speed ),
|
||||
( r"^run_automation$", self.run_automation ),
|
||||
( r"^stop_automation$", self.stop_automation ),
|
||||
( r"^toggle_pause_automation$", self.toggle_pause_automation ),
|
||||
( r"^pause_automation$", self.pause_automation ),
|
||||
( r"^toggle_loop_automation$", self.toggle_loop_automation ),
|
||||
( r"^set_automation_speed$", self.set_speed ),
|
||||
]
|
||||
|
||||
def set_speed(self, speed):
|
||||
@@ -194,11 +194,6 @@ class ActionsPlugin(Plugin):
|
||||
|
||||
return (found_method, args)
|
||||
|
||||
#def call_parse_method_name(self, method_name, argument):
|
||||
# method, arguments = self.actions.get_callback_for_method(method_name, argument)
|
||||
# method(*arguments)
|
||||
|
||||
|
||||
# adapted from https://github.com/gdiepen/python_plugin_example
|
||||
class PluginCollection(object):
|
||||
"""Upon creation, this class will read the plugins package for modules
|
||||
|
||||
@@ -12,11 +12,11 @@ grep " def " actions.py | grep -v "^#" | sed -e 's/ def //' | sed -e 's/self//'
|
||||
echo
|
||||
|
||||
echo "## Dynamic routes"
|
||||
grep '( r"' actions.py | sed -e 's/\(.*\)"\(.*\)"\(.*\)/ * \2/'
|
||||
grep '( r"' actions.py | sed -e 's/\(.*\)"\(.*\)"\(.*\)/ * \2/' | sed -e 's/\$//' | sed -e 's/\^//'
|
||||
echo
|
||||
|
||||
echo "### Plugin routes"
|
||||
grep "( r\"" plugins/*.py | sed -e 's/plugins\/\(.*\)\.py:\(.*\)\( r\"\)\(.*\)\"\(.*\)/ * \4\t(from \1)/' | grep -v "open_serial"
|
||||
grep "( r\"" plugins/*.py | sed -e 's/plugins\/\(.*\)\.py:\(.*\)\( r\"\)\(.*\)\"\(.*\)/ * \4\t(from \1)/' | grep -v "open_serial" | sed -e 's/\$//' | sed -e 's/\^//'
|
||||
echo
|
||||
|
||||
echo "----"
|
||||
|
||||
@@ -89,12 +89,10 @@ class MidiFeedbackAPCKey25Plugin(MidiFeedbackPlugin):
|
||||
def feedback_plugin_status(self):
|
||||
from data_centre.plugin_collection import SequencePlugin
|
||||
|
||||
from plugins.MidiActionsTestPlugin import MidiActionsTestPlugin
|
||||
|
||||
try:
|
||||
from plugins.ShaderLoopRecordPlugin import ShaderLoopRecordPlugin
|
||||
for plugin in self.pc.get_plugins(SequencePlugin):
|
||||
if isinstance(plugin, ShaderLoopRecordPlugin): #MidiActionsTestPlugin):
|
||||
if isinstance(plugin, ShaderLoopRecordPlugin):
|
||||
|
||||
NOTE_PLAY_STATUS = 65
|
||||
NOTE_RECORD_STATUS = 66
|
||||
@@ -225,7 +223,7 @@ class MidiFeedbackAPCKey25Plugin(MidiFeedbackPlugin):
|
||||
#print("in update device status is %s" % self.status)
|
||||
for i,c in self.status.items():
|
||||
#'print("comparing\n%s to\n%s" % (c, self.last_state[i]))
|
||||
if self.last_state is None or self.last_state[i]!=c:
|
||||
if self.last_state is None or (i not in self.last_state or self.last_state[i]!=c):
|
||||
#print("got command: %s: %s" % (i,c))
|
||||
self.send_command(**c)
|
||||
self.last_state = deepcopy(self.status)
|
||||
|
||||
19
plugins/MultiActionsPlugin.py
Normal file
19
plugins/MultiActionsPlugin.py
Normal file
@@ -0,0 +1,19 @@
|
||||
import data_centre.plugin_collection
|
||||
from data_centre.plugin_collection import ActionsPlugin
|
||||
|
||||
class MultiActionsPlugin(ActionsPlugin):
|
||||
disabled = False
|
||||
|
||||
def __init__(self, plugin_collection):
|
||||
super().__init__(plugin_collection)
|
||||
|
||||
@property
|
||||
def parserlist(self):
|
||||
return [
|
||||
( r"(.*)&&(.*)", self.run_multi ),
|
||||
]
|
||||
|
||||
def run_multi(self, action1, action2, value):
|
||||
print("multi running %s and %s with value %s" % (action1, action2, value))
|
||||
self.pc.actions.call_method_name(action1, value)
|
||||
self.pc.actions.call_method_name(action2, value)
|
||||
@@ -10,13 +10,13 @@ class MidiActionsTestPlugin(ActionsPlugin,SequencePlugin):
|
||||
@property
|
||||
def parserlist(self):
|
||||
return [
|
||||
( r"test_plugin", self.test_plugin ),
|
||||
( r"cycle_shaders", self.cycle_shaders ),
|
||||
( r"run_automation", self.run_automation ),
|
||||
( r"stop_automation", self.stop_automation ),
|
||||
( r"toggle_pause_automation", self.toggle_pause_automation ),
|
||||
( r"pause_automation", self.pause_automation ),
|
||||
( r"toggle_loop_automation", self.toggle_loop_automation ),
|
||||
( r"^test_plugin$", self.test_plugin ),
|
||||
( r"^cycle_shaders$", self.cycle_shaders ),
|
||||
( r"^run_automation$", self.run_automation ),
|
||||
( r"^stop_automation$", self.stop_automation ),
|
||||
( r"^toggle_pause_automation$", self.toggle_pause_automation ),
|
||||
( r"^pause_automation$", self.pause_automation ),
|
||||
( r"^toggle_loop_automation$", self.toggle_loop_automation ),
|
||||
]
|
||||
|
||||
def test_plugin(self):
|
||||
@@ -42,7 +42,7 @@ class MidiActionsTestPlugin(ActionsPlugin,SequencePlugin):
|
||||
frequency = 50
|
||||
def run_sequence(self, position):
|
||||
self.pc.actions.call_method_name(
|
||||
"set_the_shader_param_0_layer_0_continuous", position
|
||||
"set_the_shader_param_3_layer_0_continuous", position
|
||||
)
|
||||
|
||||
self.pc.actions.call_method_name(
|
||||
Reference in New Issue
Block a user