Example #1
0
 def __init__(self, script, number):
     NotifyingControlElement.__init__(self)
     self._host = script
     self._active_host = []
     self._number = number
     self._channel = 0
     self._connected = False
     self._enabled = True
     self.device = None
     self._device_parent = None
     self._swing = 0
     self._autoselect_enabled = 0
     self._offset = [0, 0]
     self._color_maps = []
     self._report_offset = False
     self._local_ring_control = 1
     self._raw = False
     self._controls = [{}, {}]
     self._create_grid()
     self._create_keys()
     self._create_wheels()
     self._mod_dial = None
     self._mod_vol = 127
     self._mod_color = 0
     self._absolute_mode = 1
     self._monomodular = 0
     self._device_component = MonoDeviceComponent(self, script._host,
                                                  script)
	def __init__(self, script, number):
		NotifyingControlElement.__init__(self)
		self._host = script
		self._active_host = []
		self._number  = number
		self._channel = 0
		self._connected = False
		self._enabled = True
		self.device = None
		self._device_parent = None
		self._swing = 0
		self._autoselect_enabled = 0
		self._offset = [0, 0]
		self._color_maps = []
		self._report_offset = False
		self._local_ring_control = 1
		self._raw = False
		self._controls = [{},{}]
		self._create_grid()
		self._create_keys()
		self._create_wheels()
		self._mod_dial = None
		self._mod_vol = 127
		self._mod_color = 0
		self._absolute_mode = 1
		self._monomodular = 0
		self._device_component = MonoDeviceComponent(self, script._host, script)
Example #3
0
 def __init__(self, script, number, *a, **k):
     super(MonoClient, self).__init__(script, number, *a, **k)
     self._host = script
     self._is_monolink = False
     self._active_host = []
     self._number = number
     self._channel = 0
     self._connected = False
     self._enabled = True
     self.device = None
     self._device_parent = None
     self._device_component = None
     self._swing = 0
     self._mute = 0
     self._autoselect_enabled = 0
     self._offset = [0, 0]
     self._color_maps = []
     self._report_offset = False
     self._local_ring_control = 1
     self._c_local_ring_control = 1
     self._controls = [{}, {}]
     self._create_grid()
     self._create_keys()
     self._create_wheels()
     self._create_c_grid()
     self._create_c_keys()
     self._create_c_wheels()
     self._create_c_knobs()
     self._absolute_mode = 1
     self._c_absolute_mode = 1
     self._parameters = []
     self._mod_dial = None
     self._mod_vol = 127
     self._mod_color = 0
     self._device_component = MonoDeviceComponent(self, MOD_BANK_DICT,
                                                  MOD_TYPES)
     self._banner_state = 0
     self._monomodular = 0
Example #4
0
	def __init__(self, script, number, *a, **k):
		super(MonoClient, self).__init__(script, number, *a, **k)
		self._host = script
		self._is_monolink = False
		self._active_host = []
		self._number  = number
		self._channel = 0
		self._connected = False
		self._enabled = True
		self.device = None
		self._device_parent = None
		self._device_component = None
		self._swing = 0
		self._mute = 0
		self._autoselect_enabled = 0
		self._offset = [0, 0]
		self._color_maps = []
		self._report_offset = False
		self._local_ring_control = 1
		self._c_local_ring_control = 1
		self._controls = [{},{}]
		self._create_grid()
		self._create_keys()
		self._create_wheels()
		self._create_c_grid()
		self._create_c_keys()
		self._create_c_wheels()
		self._create_c_knobs()
		self._absolute_mode = 1
		self._c_absolute_mode = 1
		self._parameters = []
		self._mod_dial = None
		self._mod_vol = 127
		self._mod_color = 0
		self._device_component = MonoDeviceComponent(self, MOD_BANK_DICT, MOD_TYPES)
		self._banner_state = 0
		self._monomodular = 0
Example #5
0
class MonoClient(NotifyingControlElement):
	__module__ = __name__
	__doc__ = ' Class representing a single mod in a Monomodular hosted environment '


	__subject_events__ = (SubjectEvent(name='value', signal=InputSignal, override=True),)
	_input_signal_listener_count = 0

	def __init__(self, script, number, *a, **k):
		super(MonoClient, self).__init__(script, number, *a, **k)
		self._host = script
		self._is_monolink = False
		self._active_host = []
		self._number  = number
		self._channel = 0
		self._connected = False
		self._enabled = True
		self.device = None
		self._device_parent = None
		self._device_component = None
		self._swing = 0
		self._mute = 0
		self._autoselect_enabled = 0
		self._offset = [0, 0]
		self._color_maps = []
		self._report_offset = False
		self._local_ring_control = 1
		self._c_local_ring_control = 1
		self._controls = [{},{}]
		self._create_grid()
		self._create_keys()
		self._create_wheels()
		self._create_c_grid()
		self._create_c_keys()
		self._create_c_wheels()
		self._create_c_knobs()
		self._absolute_mode = 1
		self._c_absolute_mode = 1
		self._parameters = []
		self._mod_dial = None
		self._mod_vol = 127
		self._mod_color = 0
		self._device_component = MonoDeviceComponent(self, MOD_BANK_DICT, MOD_TYPES)
		self._banner_state = 0
		self._monomodular = 0
	

	def is_active(self):
		return (len(self._active_host) > 0)
	

	def set_enabled(self, val):
		self._enabled = val!=0
	

	def _banner(self):
		if not self.is_connected() and len(self._active_host)>0:
			if self._banner_state < 54:
				self.receive_grid_all(0)
				for index in range(16):
					for y in range(len(LOGO[self._banner_state + index])):
						self.receive_grid(index, LOGO[self._banner_state + index][y][0], LOGO[self._banner_state + index][y][1])
				self._banner_state += 1
				self._host.schedule_message(1, self._banner)
			else:
				self._banner_state = 0		
	

	def script_wants_forwarding(self):
		return True
	

	def is_connected(self):
		return self._connected
	

	def disconnect(self):
		#self._device_component.disconnect()
		self._active_host = []
		if self._device_parent != None:
			if self._device_parent.devices_has_listener(self._device_listener):
				self._device_parent.remove_devices_listener(self._device_listener)
		super(MonoClient, self).disconnect()
		self._enabled = True
		self._c_local_ring_control = 1
		self._local_ring_control = 1
		self._c_absolute_mode = 1
		self._absolute_mode = 1

	

	def reset(self):
		pass
	

	def _connect_to(self, device):
		#self._host.log_message('client ' + str(self._number) + ' connect_to'  + str(device.name))
		self._connected = True
		self.device = device
		if self._device_parent != None:
			if self._device_parent.devices_has_listener(self._device_listener):
				self._device_parent.remove_devices_listener(self._device_listener)
		self._device_parent = device.canonical_parent
		if not self._device_parent.devices_has_listener(self._device_listener):
			self._device_parent.add_devices_listener(self._device_listener)
		self._mute = 0
		self._send('toggle_mute', self._mute)
		for host in self._active_host:
			host.update()
		for host in self._host._hosts:
			if hasattr(host, '_notify_new_connection'):
				host._notify_new_connection(device)
			
	

	def _disconnect_client(self, reconnect = False):
		#self._host.log_message('disconnect client ' + str(self._number))
		self._create_grid()
		self._create_keys()
		self._create_wheels()
		self._create_c_grid()
		self._create_c_keys()
		self._create_c_wheels()
		self._create_c_knobs()
		self.set_local_ring_control(1)
		self.set_absolute_mode(1)
		self.set_c_local_ring_control(1)
		self.set_c_absolute_mode(1)
		self._mod_vol = 127
		self._mod_color = 0
		self._monomodular = 0
		self._swing = 0
		self._report_offset = False
		if self._device_parent != None:
			if self._device_parent.devices_has_listener(self._device_listener):
				self._device_parent.remove_devices_listener(self._device_listener)
		if reconnect == True:
			self._send('reconnect')
		if not self._device_component is None:
			self._device_component.disconnect_client()
		self._connected = False
		self.device = None
		for host in self._active_host:
			host.update()
			if not host.is_enabled() and 'display_mod_colors' in dir(host):
				host.display_mod_colors()
	

	def _device_listener(self):
		#self._host.log_message('device_listener' + str(self.device))
		if self.device == None:
			self._disconnect_client()
	

	def linked_device(self):
		return self.device
	


	"""initiation methods"""
	def _create_grid(self):
		self._grid = [None for index in range(16)]
		for column in range(16):
			self._grid[column] = [None for index in range(16)]
			for row in range(16):
				self._grid[column][row] = 0
	

	def _create_keys(self):
		self._key = [None for index in range(8)]
		for index in range(8):
			self._key[index] = 0
	

	def _create_wheels(self):
		self._wheel = [[] for index in range(9)]
		for column in range(9):
			self._wheel[column] = [[] for index in range(5)]
			for row in range(5):
				self._wheel[column][row] = {'log': 0, 'value': 0, 'mode':0, 'white': 0, 'green': 0, 'custom':'00000000', 'pn':' ', 'pv': '0'}
	


	"""send methods (to m4l from host)"""
	def _send(self, args1 = None, args2 = None, args3 = None, args4 = None):
		if self._enabled is True:
			self.notify_value(args1, args2, args3, args4)
	

	def _send_key(self, index, value):
		self._send('key', index, value)
	

	def _send_grid(self, column, row, value):
		self._send('grid', column, row, value)
	

	def _send_offset(self, x, y):
		self._offset = [x, y]
		if(self._report_offset is True):
			self._send('offset', x, y)	
	


	"""receive methods (from m4l)"""
	def receive_key(self, index, value=0):
		if self._key[index] != value:
			self._key[index] = value
			for host in self._active_host:
				host._send_key(index, value)
	

	def receive_grid(self, column, row, value=0):
		if self._grid[column][row] != value:
			self._grid[column][row] = value
			for host in self._active_host:
				host._send_grid(column, row, value)
	

	def receive_grid_row(self, row, value=0):
		g_len = len(self._grid)
		for column in xrange(g_len):
			self._grid[column][row] = value
		for host in self._active_host:
			for column in xrange(g_len):
				host._send_grid(column, row, value)
	

	def receive_grid_column(self, column, value=0):
		g_len = len(self._grid[column])
		for row in xrange(g_len):
			self._grid[column][row] = value
		for host in self._active_host:
			for row in xrange(g_len):
				host._send_grid(column, row, value)
	

	def receive_grid_all(self, value=0):
		for column in xrange(len(self._grid)):
			for row in xrange(len(self._grid[column])):
				self._grid[column][row] = value
				#if self.is_active():
				for host in self._active_host:
				#for column in range(len(self._grid)):
					#for row in range(len(self._grid[column])):
					host._send_grid(column, row, value)
	

	def receive_mask_key(self, num, value=-1):
		#if self.is_active():
		if value > -1:
			for host in self._active_host:
				host._send_key(num, value)
		else:
			for host in self._active_host:
				host._send_key(num, int(self._key[num]))
	

	def receive_mask_grid(self, column, row, value=-1):
		if value > -1:
			for host in self._active_host:
				host._send_grid(column, row, value)
		else:
			for host in self._active_host:
				host._send_grid(column, row, int(self._grid[column][row]))
	

	def receive_mask_column(self, column, value=-1):
		if value > -1:
			for host in self._active_host:
				for index in xrange(16):
					host._send_grid(column, index, value)
		else:
			for host in self._active_host:
				for index in xrange(16):
					host._send_grid(column, index, self._grid[column][index])
	

	def receive_mask_row(self, row, value=-1):
		hosts = self._active_host
		if value > -1:
			for index in xrange(16):
				for host in hosts:
					host._send_grid(index, row, value)
		else:
			for host in self._active_host:
				for index in xrange(16):
					host._send_grid(index, row, self._grid[index][row])
	

	def receive_mask_all(self, value=-1):
		if value > -1:
			for host in self._active_host:
				for column in xrange(16):
					for row in xrange(16):
						host._send_grid(column, row, value)
		else:
			for host in self._active_host:
				for column in xrange(16):
					for row in xrange(16):
						host._send_grid(column, row, self._grid[index][row])
	

	def receive_hotline(self, client, func = None, arguments = None):
		#self._host.log_message(str(client) + ' ' + str(func) + ' ' + str(arguments))
		if(client == 'all') and (func != None):
			for index in xrange(16):
				self._host._client[index]._send('hotline', func, arguments)
		elif(client in xrange(16)) and (func != None):
			self._host._client[client]._send('hotline', func, arguments)
	

	def receive_autoselect_enabled(self, val=0):
		self._autoselect_enabled = val
	

	def receive_swing(self, swing=0):	
		self._swing = swing
		self._send('swing', swing)
	

	def report_swing(self, swing=0):
		self._send('report_swing', swing)
	

	def toggle_mute(self):
		self._mute = abs(self._mute-1)
		self._send('toggle_mute', self._mute)
	

	def set_mute(self, val=0):
		self._mute = val
	

	def receive_channel(self, channel=0):
		if channel in range(16):
			self._channel = channel
	

	def autoselect_enabled(self=0):
		return self._autoselect_enabled > 0
	

	def _autoselect(self):
		if self.autoselect_enabled():
			if self.device != None:
				for host in self._active_host:
					host.set_appointed_device(self.device)
	

	def _set_channel(self, channel):
		self._send('channel', channel)
		self._channel = channel	
	

	def set_report_offset(self, val=0):
		self._report_offset = (val == 1)
		self._send_offset(self._offset[0], self._offset[1])
	

	def set_monomodular(self, val=0):
		self._monomodular = val
	

	def set_color_map(self, color_type, color_map):
		for host in self._host._hosts:
			#self._host.log_message(str(host._host_name) + str(host_name))
			if str(host._script._color_type) == str(color_type):
				#new_map = [color_map[i] for i in range(len(color_map))]
				#self._host.log_message('mapping ' + str(host_name) + ' to ' + str(self._number))
				new_map = color_map.split('*')
				for index in xrange(len(new_map)):
					new_map[index] = int(new_map[index])
				#self._host.log_message(str(host_name) + str(new_map))
				host._color_maps[self._number] = new_map
				if host._active_client is self:
					host._select_client(self._number)
				#self._host.log_message(str(host_name) + ' ' + str(color_map.split('*')))
	

	def linked_device(self):
		return self.device
	


	"""CNTRL:R specific methods"""
	def _create_c_grid(self):
		self._c_grid = [None for index in range(4)]
		for column in range(4):
			self._c_grid[column] = [None for index in range(4)]
			for row in range(4):
				self._c_grid[column][row] = 0
	

	def _create_c_keys(self):
		self._c_key = [None for index in range(32)]
		for index in range(32):
			self._c_key[index] = 0
	

	def _create_c_knobs(self):
		self._knob = [None for index in range(24)]
		for index in range(24):
			self._knob[index] = 0
	

	def _create_c_wheels(self):
		self._c_wheel = [[] for index in range(4)]
		for column in range(4):
			self._c_wheel[column] = [[] for index in range(3)]
			for row in range(3):
				self._c_wheel[column][row] = {'log': 0, 'value': 0, 'mode':0, 'white': 0, 'green': 0, 'custom':'00000000', 'pn':' ', 'pv': '0'}
	

	def _send_c_knob(self, index, value=0):
		self._send('c_knob', index, value)
	

	def _send_c_key(self, index, value=0):
		self._send('c_key', index, value)
	

	def _send_c_grid(self, column, row, value=0):
		self._send('c_grid', column, row, value)
	

	def _send_c_dial(self, column, row, value=0):
		self._send('c_dial', column, row, value)
	

	def _send_c_dial_button(self, column, row, value=0):
		if row > 0:
			self._send('c_dial_button', column, row-1, value)
	

	def receive_c_key(self, index, value=0):
		if self._c_key[index] != value:
			self._c_key[index] = value
			for host in self._active_host:
				host._send_c_key(index, value)
	

	def receive_c_grid(self, column, row, value=0):
		if self._c_grid[column][row] != value:
			self._c_grid[column][row] = value
			for host in self._active_host:
				host._send_c_grid(column, row, value)
	

	def receive_c_grid_row(self, row, value=0):
		g_len = len(self._c_grid)
		for column in xrange(g_len):
			self._c_grid[column][row] = value
		for host in self._active_host:
			for column in xrange(g_len):
				host._send_c_grid(column, row, value)
	

	def receive_c_grid_column(self, column, value=0):
		g_len = len(self._c_grid[0])
		for row in xrange(g_len):
			self._c_grid[column][row] = value
		for host in self._active_host:
			for row in xrange(g_len):
				host._send_c_grid(column, row, value)
	

	def receive_c_grid_all(self, value=0):
		g_len = len(self._c_grid)
		g_ht = len(self._c_grid[0])
		for column in xrange(g_len):
			for row in xrange(g_ht):
				self._c_grid[column][row] = value
		for host in self._active_host:
			for column in xrange(g_len):
				for row in xrange(g_ht):
					host._send_c_grid(column, row, value)
	

	def receive_mask_c_key(self, num, value=-1):
		if value > -1:
			for host in self._active_host:
				host._send_c_key(num, value)
		else:
			for host in self._active_host:
				host._send_c_key(num, int(self._c_key[num]))
	

	def receive_mask_c_grid(self, column, row, value=-1):
		if value > -1:
			for host in self._active_host:
				host._send_c_grid(column, row, value)
		else:
			for host in self._active_host:
				host._send_c_grid(column, row, int(self._c_grid[column][row]))
	

	def receive_mask_c_column(self, column, value=-1):
		if value > -1:
			for host in self._active_host:
				for index in xrange(4):
					host._send_c_grid(column, index, value)
		else:
			for host in self._active_host:
				for index in xrange(4):
					host._send_c_grid(column, index, self._c_grid[column][index])
	

	def receive_mask_c_row(self, row, value=-1):
		if value > -1:
			for host in self._active_host:
				for index in xrange(4):
					host._send_c_grid(index, row, value)
		else:
			for host in self._active_host:
				for index in xrange(4):
					host._send_c_grid(index, row, self._c_grid[index][row])
	

	def receive_mask_c_all(self, value=-1):
		if value > -1:
			for host in self._active_host:
				for column in xrange(4):
					for row in xrange(4):
						host._send_c_grid(column, row, value)
		else:
			for host in self._active_host:
				for column in xrange(4):
					for row in xrange(4):
						host._send_c_grid(column, row, self._c_grid[index][row])
	

	def receive_c_wheel(self, number, parameter, value):
		column = number%4
		row = int(number/4)
		if self._c_wheel[column]:
			if self._c_wheel[column][row]:
				wheel = self._c_wheel[column][row]
		 		wheel[parameter] = value
				if parameter!='white':
					for host in self._active_host:
						host._send_c_wheel(column, row, wheel, parameter)
				elif row > 0:
					for host in self._active_host:
						host._send_c_wheel(column, row, wheel, parameter)
	

	def _send_c_dial(self, column, row, value):
		self._send('c_dial', column, row, value)
	

	def _send_c_dial_button(self, column, row, value):
		if row > 0:
			self._send('c_dial_button', column, row-1, value)
	

	def set_c_absolute_mode(self, val=1):
		#self._host.log_message('client set absolute mode ' + str(val))
		self._c_absolute_mode = val
		if self._enabled:
			for host in self._active_host:
				if 'set_c_absolute_mode' in dir(host):
					host.set_c_absolute_mode(self._c_absolute_mode)
	

	def set_c_local_ring_control(self, val = 0):
		self._c_local_ring_control = val
		if self._enabled:
			for host in self._active_host:
				if 'set_c_local_ring_control' in dir(host):
					host.set_c_local_ring_control(self._c_local_ring_control)
	

	def receive_mod_color(self, val=0):
		#self._host.log_message('mod color' + str(val))
		if val != 1:
			self._mod_color = val
			for host in self._active_host:
				if '_display_mod_colors' in dir(host):
					host._display_mod_colors()
	

	def _mod_dial_parameter(self):
		param = None
		if not self.device == None:
			for parameter in self.device.parameters:
				if (parameter.original_name == 'moddial'):
					param = parameter
					break
		return param
	

	def send_midi(self, Type, num, val):
		self._host.send_midi(Type, num, val)
	


	"""Codec specific methods"""
	def _send_dial(self, column, row, value=0):
		self._send('dial', column, row, value)
	

	def _send_dial_button(self, column, row, value=0):
		if column < 8 and row < 4:
			self._send('dial_button', column, row, value)
		elif row is 4:
			self._send('column_button', column, value)
		else:
			self._send('row_button', row, value)	
	

	def receive_wheel(self, number, parameter, value):
		column = number%9
		row = int(number/9)
		if self._wheel[column]:
			if self._wheel[column][row]:
				self._wheel[column][row][parameter] = value
				#if self.is_active():
				if parameter!='white':
					for host in self._active_host:
						host._send_wheel(column, row, self._wheel[column][row], parameter)
				elif row > -1:
					for host in self._active_host:
						host._send_wheel(column, row, self._wheel[column][row], parameter)
	

	def set_local_ring_control(self, val = 1):
		#self._host.log_message('client set local ring ' + str(val))
		self._local_ring_control = val
		if self._enabled:
			for host in self._active_host:
				if 'set_local_ring_control' in dir(host):
					host.set_local_ring_control(self._local_ring_control)
	

	def set_absolute_mode(self, val = 1):
		#self._host.log_message('client set absolute mode ' + str(val))
		self._absolute_mode = val
		if self._enabled:
			for host in self._active_host:
				if 'set_absolute_mode' in dir(host):
					host.set_absolute_mode(self._absolute_mode)
	


	"""MonoDevice integration"""
	def receive_device(self, command, args0 = None, args1 = None, args2 = None):
		if command in dir(self._device_component):
			getattr(self._device_component, command)(args0, args1, args2)
class MonoClient(NotifyingControlElement):
    __module__ = __name__
    __doc__ = ' Class representing a single mod in a Monomodular hosted environment '

    __subject_events__ = (SubjectEvent(name='value',
                                       signal=InputSignal,
                                       override=True), )
    _input_signal_listener_count = 0

    def __init__(self, script, number, *a, **k):
        super(MonoClient, self).__init__(script, number, *a, **k)
        self._host = script
        self._is_monolink = False
        self._active_host = []
        self._number = number
        self._channel = 0
        self._connected = False
        self._enabled = True
        self.device = None
        self._device_parent = None
        self._device_component = None
        self._swing = 0
        self._mute = 0
        self._autoselect_enabled = 0
        self._offset = [0, 0]
        self._color_maps = []
        self._report_offset = False
        self._local_ring_control = 1
        self._c_local_ring_control = 1
        self._controls = [{}, {}]
        self._create_grid()
        self._create_keys()
        self._create_wheels()
        self._create_c_grid()
        self._create_c_keys()
        self._create_c_wheels()
        self._create_c_knobs()
        self._absolute_mode = 1
        self._c_absolute_mode = 1
        self._parameters = []
        self._mod_dial = None
        self._mod_vol = 127
        self._mod_color = 0
        self._device_component = MonoDeviceComponent(self)
        self._banner_state = 0
        self._monomodular = 0

    def is_active(self):
        return (len(self._active_host) > 0)

    def set_enabled(self, val):
        self._enabled = val != 0

    def _banner(self):
        if not self.is_connected() and len(self._active_host) > 0:
            if self._banner_state < 54:
                self.receive_grid_all(0)
                for index in range(16):
                    for y in range(len(LOGO[self._banner_state + index])):
                        self.receive_grid(
                            index, LOGO[self._banner_state + index][y][0],
                            LOGO[self._banner_state + index][y][1])
                self._banner_state += 1
                self._host.schedule_message(1, self._banner)
            else:
                self._banner_state = 0

    def is_connected(self):
        return self._connected

    def disconnect(self):
        #self._device_component.disconnect()
        self._active_host = []
        if self._device_parent != None:
            if self._device_parent.devices_has_listener(self._device_listener):
                self._device_parent.remove_devices_listener(
                    self._device_listener)
        super(MonoClient, self).disconnect()
        self._enabled = True
        self._c_local_ring_control = 1
        self._local_ring_control = 1
        self._c_absolute_mode = 1
        self._absolute_mode = 1

    def reset(self):
        pass

    def _connect_to(self, device):
        #self._host.log_message('client ' + str(self._number) + ' connect_to'  + str(device.name))
        self._connected = True
        self.device = device
        if self._device_parent != None:
            if self._device_parent.devices_has_listener(self._device_listener):
                self._device_parent.remove_devices_listener(
                    self._device_listener)
        self._device_parent = device.canonical_parent
        if not self._device_parent.devices_has_listener(self._device_listener):
            self._device_parent.add_devices_listener(self._device_listener)
        self._mute = 0
        self._send('toggle_mute', self._mute)
        for host in self._active_host:
            host.update()

    def _disconnect_client(self, reconnect=False):
        #self._host.log_message('disconnect client ' + str(self._number))
        self._create_grid()
        self._create_keys()
        self._create_wheels()
        self._create_c_grid()
        self._create_c_keys()
        self._create_c_wheels()
        self._create_c_knobs()
        self.set_local_ring_control(1)
        self.set_absolute_mode(1)
        self.set_c_local_ring_control(1)
        self.set_c_absolute_mode(1)
        self._mod_vol = 127
        self._mod_color = 0
        self._monomodular = 0
        self._swing = 0
        self._report_offset = False
        if self._device_parent != None:
            if self._device_parent.devices_has_listener(self._device_listener):
                self._device_parent.remove_devices_listener(
                    self._device_listener)
        if reconnect == True:
            self._send('reconnect')
        if not self._device_component is None:
            self._device_component.disconnect_client()
        self._connected = False
        self.device = None
        for host in self._active_host:
            host.update()
            if not host.is_enabled() and 'display_mod_colors' in dir(host):
                host.display_mod_colors()

    def _device_listener(self):
        #self._host.log_message('device_listener' + str(self.device))
        if self.device == None:
            self._disconnect_client()

    def linked_device(self):
        return self.device

    """initiation methods"""

    def _create_grid(self):
        self._grid = [None for index in range(16)]
        for column in range(16):
            self._grid[column] = [None for index in range(16)]
            for row in range(16):
                self._grid[column][row] = 0

    def _create_keys(self):
        self._key = [None for index in range(8)]
        for index in range(8):
            self._key[index] = 0

    def _create_wheels(self):
        self._wheel = [[] for index in range(9)]
        for column in range(9):
            self._wheel[column] = [[] for index in range(5)]
            for row in range(5):
                self._wheel[column][row] = {
                    'log': 0,
                    'value': 0,
                    'mode': 0,
                    'white': 0,
                    'green': 0,
                    'custom': '00000000',
                    'pn': ' ',
                    'pv': '0'
                }

    """send methods (to m4l from host)"""

    def _send(self, args1=None, args2=None, args3=None, args4=None):
        if self._enabled is True:
            self.notify_value(args1, args2, args3, args4)

    def _send_key(self, index, value):
        self._send('key', index, value)

    def _send_grid(self, column, row, value):
        self._send('grid', column, row, value)

    def _send_offset(self, x, y):
        self._offset = [x, y]
        if (self._report_offset is True):
            self._send('offset', x, y)

    """receive methods (from m4l)"""

    def receive_key(self, index, value=0):
        if self._key[index] != value:
            self._key[index] = value
            for host in self._active_host:
                host._send_key(index, value)

    def receive_grid(self, column, row, value=0):
        if self._grid[column][row] != value:
            self._grid[column][row] = value
            for host in self._active_host:
                host._send_grid(column, row, value)

    def receive_grid_row(self, row, value=0):
        g_len = len(self._grid)
        for column in xrange(g_len):
            self._grid[column][row] = value
        for host in self._active_host:
            for column in xrange(g_len):
                host._send_grid(column, row, value)

    def receive_grid_column(self, column, value=0):
        g_len = len(self._grid[column])
        for row in xrange(g_len):
            self._grid[column][row] = value
        for host in self._active_host:
            for row in xrange(g_len):
                host._send_grid(column, row, value)

    def receive_grid_all(self, value=0):
        for column in xrange(len(self._grid)):
            for row in xrange(len(self._grid[column])):
                self._grid[column][row] = value
                #if self.is_active():
                for host in self._active_host:
                    #for column in range(len(self._grid)):
                    #for row in range(len(self._grid[column])):
                    host._send_grid(column, row, value)

    def receive_mask_key(self, num, value=-1):
        #if self.is_active():
        if value > -1:
            for host in self._active_host:
                host._send_key(num, value)
        else:
            for host in self._active_host:
                host._send_key(num, int(self._key[num]))

    def receive_mask_grid(self, column, row, value=-1):
        if value > -1:
            for host in self._active_host:
                host._send_grid(column, row, value)
        else:
            for host in self._active_host:
                host._send_grid(column, row, int(self._grid[column][row]))

    def receive_mask_column(self, column, value=-1):
        if value > -1:
            for host in self._active_host:
                for index in xrange(16):
                    host._send_grid(column, index, value)
        else:
            for host in self._active_host:
                for index in xrange(16):
                    host._send_grid(column, index, self._grid[column][index])

    def receive_mask_row(self, row, value=-1):
        hosts = self._active_host
        if value > -1:
            for index in xrange(16):
                for host in hosts:
                    host._send_grid(index, row, value)
        else:
            for host in self._active_host:
                for index in xrange(16):
                    host._send_grid(index, row, self._grid[index][row])

    def receive_mask_all(self, value=-1):
        if value > -1:
            for host in self._active_host:
                for column in xrange(16):
                    for row in xrange(16):
                        host._send_grid(column, row, value)
        else:
            for host in self._active_host:
                for column in xrange(16):
                    for row in xrange(16):
                        host._send_grid(column, row, self._grid[index][row])

    def receive_hotline(self, client, func=None, arguments=None):
        #self._host.log_message(str(client) + ' ' + str(func) + ' ' + str(arguments))
        if (client == 'all') and (func != None):
            for index in xrange(16):
                self._host._client[index]._send('hotline', func, arguments)
        elif (client in xrange(16)) and (func != None):
            self._host._client[client]._send('hotline', func, arguments)

    def receive_autoselect_enabled(self, val=0):
        self._autoselect_enabled = val

    def receive_swing(self, swing=0):
        self._swing = swing
        self._send('swing', swing)

    def report_swing(self, swing=0):
        self._send('report_swing', swing)

    def toggle_mute(self):
        self._mute = abs(self._mute - 1)
        self._send('toggle_mute', self._mute)

    def set_mute(self, val=0):
        self._mute = val

    def receive_channel(self, channel=0):
        if channel in range(16):
            self._channel = channel

    def autoselect_enabled(self=0):
        return self._autoselect_enabled > 0

    def _autoselect(self):
        if self.autoselect_enabled():
            if self.device != None:
                for host in self._active_host:
                    host.set_appointed_device(self.device)

    def _set_channel(self, channel):
        self._send('channel', channel)
        self._channel = channel

    def set_report_offset(self, val=0):
        self._report_offset = (val == 1)
        self._send_offset(self._offset[0], self._offset[1])

    def set_monomodular(self, val=0):
        self._monomodular = val

    def set_color_map(self, color_type, color_map):
        for host in self._host._hosts:
            #self._host.log_message(str(host._host_name) + str(host_name))
            if str(host._script._color_type) == str(color_type):
                #new_map = [color_map[i] for i in range(len(color_map))]
                #self._host.log_message('mapping ' + str(host_name) + ' to ' + str(self._number))
                new_map = color_map.split('*')
                for index in xrange(len(new_map)):
                    new_map[index] = int(new_map[index])
                #self._host.log_message(str(host_name) + str(new_map))
                host._color_maps[self._number] = new_map
                if host._active_client is self:
                    host._select_client(self._number)
                #self._host.log_message(str(host_name) + ' ' + str(color_map.split('*')))

    def linked_device(self):
        return self.device

    """CNTRL:R specific methods"""

    def _create_c_grid(self):
        self._c_grid = [None for index in range(4)]
        for column in range(4):
            self._c_grid[column] = [None for index in range(4)]
            for row in range(4):
                self._c_grid[column][row] = 0

    def _create_c_keys(self):
        self._c_key = [None for index in range(32)]
        for index in range(32):
            self._c_key[index] = 0

    def _create_c_knobs(self):
        self._knob = [None for index in range(24)]
        for index in range(24):
            self._knob[index] = 0

    def _create_c_wheels(self):
        self._c_wheel = [[] for index in range(4)]
        for column in range(4):
            self._c_wheel[column] = [[] for index in range(3)]
            for row in range(3):
                self._c_wheel[column][row] = {
                    'log': 0,
                    'value': 0,
                    'mode': 0,
                    'white': 0,
                    'green': 0,
                    'custom': '00000000',
                    'pn': ' ',
                    'pv': '0'
                }

    def _send_c_knob(self, index, value=0):
        self._send('c_knob', index, value)

    def _send_c_key(self, index, value=0):
        self._send('c_key', index, value)

    def _send_c_grid(self, column, row, value=0):
        self._send('c_grid', column, row, value)

    def _send_c_dial(self, column, row, value=0):
        self._send('c_dial', column, row, value)

    def _send_c_dial_button(self, column, row, value=0):
        if row > 0:
            self._send('c_dial_button', column, row - 1, value)

    def receive_c_key(self, index, value=0):
        if self._c_key[index] != value:
            self._c_key[index] = value
            for host in self._active_host:
                host._send_c_key(index, value)

    def receive_c_grid(self, column, row, value=0):
        if self._c_grid[column][row] != value:
            self._c_grid[column][row] = value
            for host in self._active_host:
                host._send_c_grid(column, row, value)

    def receive_c_grid_row(self, row, value=0):
        g_len = len(self._c_grid)
        for column in xrange(g_len):
            self._c_grid[column][row] = value
        for host in self._active_host:
            for column in xrange(g_len):
                host._send_c_grid(column, row, value)

    def receive_c_grid_column(self, column, value=0):
        g_len = len(self._c_grid[0])
        for row in xrange(g_len):
            self._c_grid[column][row] = value
        for host in self._active_host:
            for row in xrange(g_len):
                host._send_c_grid(column, row, value)

    def receive_c_grid_all(self, value=0):
        g_len = len(self._c_grid)
        g_ht = len(self._c_grid[0])
        for column in xrange(g_len):
            for row in xrange(g_ht):
                self._c_grid[column][row] = value
        for host in self._active_host:
            for column in xrange(g_len):
                for row in xrange(g_ht):
                    host._send_c_grid(column, row, value)

    def receive_mask_c_key(self, num, value=-1):
        if value > -1:
            for host in self._active_host:
                host._send_c_key(num, value)
        else:
            for host in self._active_host:
                host._send_c_key(num, int(self._c_key[num]))

    def receive_mask_c_grid(self, column, row, value=-1):
        if value > -1:
            for host in self._active_host:
                host._send_c_grid(column, row, value)
        else:
            for host in self._active_host:
                host._send_c_grid(column, row, int(self._c_grid[column][row]))

    def receive_mask_c_column(self, column, value=-1):
        if value > -1:
            for host in self._active_host:
                for index in xrange(4):
                    host._send_c_grid(column, index, value)
        else:
            for host in self._active_host:
                for index in xrange(4):
                    host._send_c_grid(column, index,
                                      self._c_grid[column][index])

    def receive_mask_c_row(self, row, value=-1):
        if value > -1:
            for host in self._active_host:
                for index in xrange(4):
                    host._send_c_grid(index, row, value)
        else:
            for host in self._active_host:
                for index in xrange(4):
                    host._send_c_grid(index, row, self._c_grid[index][row])

    def receive_mask_c_all(self, value=-1):
        if value > -1:
            for host in self._active_host:
                for column in xrange(4):
                    for row in xrange(4):
                        host._send_c_grid(column, row, value)
        else:
            for host in self._active_host:
                for column in xrange(4):
                    for row in xrange(4):
                        host._send_c_grid(column, row,
                                          self._c_grid[index][row])

    def receive_c_wheel(self, number, parameter, value):
        column = number % 4
        row = int(number / 4)
        if self._c_wheel[column]:
            if self._c_wheel[column][row]:
                wheel = self._c_wheel[column][row]
                wheel[parameter] = value
                if parameter != 'white':
                    for host in self._active_host:
                        host._send_c_wheel(column, row, wheel, parameter)
                elif row > 0:
                    for host in self._active_host:
                        host._send_c_wheel(column, row, wheel, parameter)

    def _send_c_dial(self, column, row, value):
        self._send('c_dial', column, row, value)

    def _send_c_dial_button(self, column, row, value):
        if row > 0:
            self._send('c_dial_button', column, row - 1, value)

    def set_c_absolute_mode(self, val=1):
        #self._host.log_message('client set absolute mode ' + str(val))
        self._c_absolute_mode = val
        if self._enabled:
            for host in self._active_host:
                if 'set_c_absolute_mode' in dir(host):
                    host.set_c_absolute_mode(self._c_absolute_mode)

    def set_c_local_ring_control(self, val=0):
        self._c_local_ring_control = val
        if self._enabled:
            for host in self._active_host:
                if 'set_c_local_ring_control' in dir(host):
                    host.set_c_local_ring_control(self._c_local_ring_control)

    def receive_mod_color(self, val=0):
        #self._host.log_message('mod color' + str(val))
        if val != 1:
            self._mod_color = val
            for host in self._active_host:
                if '_display_mod_colors' in dir(host):
                    host._display_mod_colors()

    def _mod_dial_parameter(self):
        param = None
        if not self.device == None:
            for parameter in self.device.parameters:
                if (parameter.original_name == 'moddial'):
                    param = parameter
                    break
        return param

    def send_midi(self, Type, num, val):
        self._host.send_midi(Type, num, val)

    """Codec specific methods"""

    def _send_dial(self, column, row, value=0):
        self._send('dial', column, row, value)

    def _send_dial_button(self, column, row, value=0):
        if column < 8 and row < 4:
            self._send('dial_button', column, row, value)
        elif row is 4:
            self._send('column_button', column, value)
        else:
            self._send('row_button', row, value)

    def receive_wheel(self, number, parameter, value):
        column = number % 9
        row = int(number / 9)
        if self._wheel[column]:
            if self._wheel[column][row]:
                self._wheel[column][row][parameter] = value
                #if self.is_active():
                if parameter != 'white':
                    for host in self._active_host:
                        host._send_wheel(column, row, self._wheel[column][row],
                                         parameter)
                elif row > -1:
                    for host in self._active_host:
                        host._send_wheel(column, row, self._wheel[column][row],
                                         parameter)

    def set_local_ring_control(self, val=1):
        #self._host.log_message('client set local ring ' + str(val))
        self._local_ring_control = val
        if self._enabled:
            for host in self._active_host:
                if 'set_local_ring_control' in dir(host):
                    host.set_local_ring_control(self._local_ring_control)

    def set_absolute_mode(self, val=1):
        #self._host.log_message('client set absolute mode ' + str(val))
        self._absolute_mode = val
        if self._enabled:
            for host in self._active_host:
                if 'set_absolute_mode' in dir(host):
                    host.set_absolute_mode(self._absolute_mode)

    """MonoDevice integration"""

    def receive_device(self, command, args0=None, args1=None, args2=None):
        if command in dir(self._device_component):
            getattr(self._device_component, command)(args0, args1, args2)
class MonoClient(NotifyingControlElement):
	__module__ = __name__
	__doc__ = ' Class representing a single mod in a Monomodular hosted environment '


	def __init__(self, script, number):
		NotifyingControlElement.__init__(self)
		self._host = script
		self._active_host = []
		self._number  = number
		self._channel = 0
		self._connected = False
		self._enabled = True
		self.device = None
		self._device_parent = None
		self._swing = 0
		self._autoselect_enabled = 0
		self._offset = [0, 0]
		self._color_maps = []
		self._report_offset = False
		self._local_ring_control = 1
		self._raw = False
		self._controls = [{},{}]
		self._create_grid()
		self._create_keys()
		self._create_wheels()
		self._mod_dial = None
		self._mod_vol = 127
		self._mod_color = 0
		self._absolute_mode = 1
		self._monomodular = 0
		self._device_component = MonoDeviceComponent(self, script._host, script)
	

	def is_active(self):
		return (len(self._active_host) > 0)
	

	def set_enabled(self, val):
		self._enabled = val!=0
	

	def set_channel(self):
		if self.is_connected:
			self._host.assign_alternate_mappings(0)
		else:
			self._host.assign_alternate_mappings(self._number+1)
	

	def is_connected(self):
		return self._connected
	

	def disconnect(self):
		#self._host.log_message('client_disconnect')
		self._device_component.disconnect()
		self._active_host = []
		if self._device_parent != None:
			if self._device_parent.devices_has_listener(self._device_listener):
				self._device_parent.remove_devices_listener(self._device_listener)
		#NotifyingControlElement.disconnect(self)  #this would normally call part of the new reset in NCE, then reset in CE, both of which are handled by the new reset below this
		for entry in self._value_notifications:
			callback = entry['Callback']
			self.remove_value_listener(callback)
		self._value_notifications = []
		self._enabled = True
		self._mod_color = 0
		self._local_ring_control = 1
		self._absolute_mode = 1
		self._monomodular = 0
	

	def reset(self):
		pass
	

	def _connect_to(self, device):
		#self._host.log_message('client ' + str(self._number) + ' connect_to '  + str(device.name))
		self._connected = True
		self.device = device
		if self._device_parent != None:
			if self._device_parent.devices_has_listener(self._device_listener):
				self._device_parent.remove_devices_listener(self._device_listener)
		self._device_parent = device.canonical_parent
		if not self._device_parent.devices_has_listener(self._device_listener):
			self._device_parent.add_devices_listener(self._device_listener)
		for host in self._active_host:
			host.update()
			#if not host.is_enabled():
			#	self._host.display_mod_colors()
		#self._host._refresh_stored_data()
	

	def _disconnect_client(self, reconnect = False):
		#self._host.log_message('disconnect client ' + str(self._number))
		old_callbacks = self._value_notifications
		self._create_grid()
		self._create_keys()
		self._local_ring_control = 1
		self._absolute_mode = 1
		self._monomodular = 0
		self._swing = 0
		self._mod_color = 0
		self._raw = False
		self._report_offset = False
		if self._device_parent != None:
			if self._device_parent.devices_has_listener(self._device_listener):
				self._device_parent.remove_devices_listener(self._device_listener)
		if reconnect == True:
			self._send('reconnect')
		for entry in self._value_notifications:
			callback = entry['Callback']
			self.remove_value_listener(callback)
		self._value_notifications = []
		self._device_component.disconnect_client()
		self._connected = False
		self.device = None
		if not self._mod_dial == None:
			if self._mod_dial._parameter is self._mod_dial_parameter:
				self._mod_dial.release_parameter()
		for host in self._active_host:
			host.update()
			if not host.is_enabled():
				self._host.display_mod_colors()
	

	def _device_listener(self):
		#self._host.log_message('device_listener' + str(self.device))
		if self.device == None:
			self._disconnect_client()
	

	def linked_device(self):
		return self.device
	


	"""initiation methods"""
	def _create_grid(self):
		self._grid = [None for index in range(4)]
		for column in range(4):
			self._grid[column] = [None for index in range(16)]
			for row in range(4):
				self._grid[column][row] = 0
	

	def _create_keys(self):
		self._key = [None for index in range(32)]
		for index in range(32):
			self._key[index] = 0
	

	def _create_knobs(self):
		self._knob = [None for index in range(24)]
		for index in range(24):
			self._knob[index] = 0
	

	def _create_wheels(self):
		self._wheel = [[] for index in range(4)]
		for column in range(4):
			self._wheel[column] = [[] for index in range(3)]
			for row in range(3):
				self._wheel[column][row] = {'log': 0, 'value': 0, 'mode':0, 'white': 0, 'green': 0, 'custom':'00000000', 'pn':' ', 'pv': '0'}
	


	"""send methods (to m4l from host)"""
	def _send(self, args1 = None, args2 = None, args3 = None, args4 = None):
		if self._enabled is True:
			#self._host.log_message('send' + str(args1) + str(args2) + str(args3) + str(args4))
			for entry in self._value_notifications:
				callback = entry['Callback']
				callback(args1, args2, args3, args4)
	

	def _send_knob(self, index, value):
		self._send('knob', index, value)
	

	def _send_key(self, index, value):
		self._send('key', index, value)
		if self._raw is True:
			control = self._host._host._keys[index]
			if control != None:
				self._send('raw', control._msg_type + control._original_channel, control._original_identifier, value)
	

	def _send_grid(self, column, row, value):
		self._send('grid', column, row, value)
		if self._raw is True:
			control = self._host._host._grid.get_button(column, row)
			if control != None:
				self._send('raw', control._msg_type + control._original_channel, control._original_identifier, value)
		#self._host.log_message('client ' + str(self._number) + ' received')
	

	def _send_offset(self, x, y):
		self._offset = [x, y]
		if(self._report_offset is True):
			self._send('offset', x, y)	
	


	"""receive methods (from m4l)"""
	def receive_key(self, index, value):
		if self._key[index] != value:
			self._key[index] = value
			if self.is_active():
				for host in self._active_host:
					host._send_key(index, value)
	

	def receive_grid(self, column, row, value):
		if self._grid[column][row] != value:
			self._grid[column][row] = value
			if self.is_active():
				for host in self._active_host:
					host._send_grid(column, row, value)
	

	def receive_grid_row(self, row, value):
		for column in range(len(self._grid)):
			self._grid[column][row] = value
		if self.is_active():
			for host in self._active_host:
				for column in range(len(self._grid)):
					host._send_grid(column, row, value)
	

	def receive_grid_column(self, column, value):
		for row in range(len(self._grid[column])):
			self._grid[column][row] = value
		if self.is_active():
			for host in self._active_host:
				for row in range(len(self._grid[column])):
					host._send_grid(column, row, value)
	

	def receive_grid_all(self, value):
		for column in range(len(self._grid)):
			for row in range(len(self._grid[column])):
				self._grid[column][row] = value
		if self.is_active():
			for host in self._active_host:
				for column in range(len(self._grid)):
					for row in range(len(self._grid[column])):
						host._send_grid(column, row, value)
	

	def receive_mask_key(self, num, value):
		if self.is_active():
			if value > -1:
				for host in self._active_host:
					host._send_key(num, value)
			else:
				for host in self._active_host:
					host._send_key(num, int(self._key[num]))
	

	def receive_mask_grid(self, column, row, value):
		if self.is_active():
			if value > -1:
				for host in self._active_host:
					host._send_grid(column, row, value)
			else:
				for host in self._active_host:
					host._send_grid(column, row, int(self._grid[column][row]))
	

	def receive_mask_column(self, column, value):
		if self.is_active():
			if value > -1:
				for host in self._active_host:
					for index in range(4):
						host._send_grid(column, index, value)
			else:
				for host in self._active_host:
					for index in range(4):
						host._send_grid(column, index, self._grid[column][index])
	

	def receive_mask_row(self, row, value):
		if self.is_active():
			if value > -1:
				for host in self._active_host:
					for index in range(4):
						host._send_grid(index, row, value)
			else:
				for host in self._active_host:
					for index in range(4):
						host._send_grid(index, row, self._grid[index][row])
	

	def receive_mask_all(self, value):
		if self.is_active():
			if value > -1:
				for host in self._active_host:
					for column in range(4):
						for row in range(4):
							host._send_grid(column, row, value)
			else:
				for host in self._active_host:
					for column in range(4):
						for row in range(4):
							host._send_grid(column, row, self._grid[index][row])
	

	def receive_hotline(self, client, func = None, arguments = None):
		#self._host.log_message(str(client) + str(func) + str(arguments))
		if(client in range(4)) and (func != None):
			self._host._client[client]._send('hotline', func, arguments)
		elif(client == 'all') and (func != None):
			for client in self._host._client:
				client._send('hotline', func, arguments)
	

	def receive_autoselect_enabled(self, val):
		self._autoselect_enabled = val
	

	def receive_channel(self, channel):
		if channel in range(16):
			self._channel = channel
	

	def autoselect_enabled(self):
		return self._autoselect_enabled > 0
	

	def _autoselect(self):
		if self.autoselect_enabled():
			if self.device != None:
				for host in self._active_host:
					host.set_appointed_device(self.device)
	


	def _set_channel(self, channel):
		self._send('channel', channel)
		self._channel = channel
	

	def set_report_offset(self, val):
		self._report_offset = (val == 1)
		self._send_offset(self._offset[0], self._offset[1])
	

	def set_monomodular(self, val):
		self._monomodular = val
	

	def set_color_map(self, color_type, color_map):
		for host in self._host._hosts:
			#self._host.log_message(str(host._host_name) + str(host_name))
			if str(host._script._color_type) == str(color_type):
				#new_map = [color_map[i] for i in range(len(color_map))]
				#self._host.log_message('mapping ' + str(host_name) + ' to ' + str(self._number))
				new_map = color_map.split('*')
				for index in range(len(new_map)):
					new_map[index] = int(new_map[index])
				#self._host.log_message(str(host_name) + str(new_map))
				host._color_maps[self._number] = new_map
				if host._active_client is self:
					host._select_client(self._number)
				#self._host.log_message(str(host_name) + ' ' + str(color_map.split('*')))
	


	"""Codec/CNTRLR specific methods"""
	def _send_dial(self, column, row, value):
		self._send('dial', column, row, value)
		if self._raw is True:
			control = self._host._host._dial_matrix.get_dial(column, row)
			if control != None:
				self._send('raw', control._msg_type + control._original_channel, control._original_identifier, value)
	

	def _send_dial_button(self, column, row, value):
		if row > 0:
			self._send('dial_button', column, row-1, value)
			if self._raw is True:
				control = self._host._host._dial_button_matrix.get_button(column, row)
				if control != None:
					self._send('raw', control._msg_type + control._original_channel, control._original_identifier, value)
	

	def receive_wheel(self, number, parameter, value):
		column = number%4
		row = int(number/4)
		#if row > 0:
		self._wheel[column][row][parameter] = value
		if self.is_active():
			if parameter == 'pn' or parameter == 'pv':
				for host in self._active_host:
					#host._script.log_message(str(column) + str(row) + str(self._wheel[column][row][parameter]))
					host._send_to_lcd(column, row, self._wheel[column][row])
			if parameter!='white':
				for host in self._active_host:
					host._send_wheel(column, row, self._wheel[column][row])
			elif row > 0:
				for host in self._active_host:
					host._send_wheel(column, row, self._wheel[column][row])
		#elif (column==self._number) and  (parameter=='value'):
		#	self._wheel[column][row][parameter] = value	
			
	

	def set_local_ring_control(self, val = 0):
		self._local_ring_control = val
		if self._enabled:
			for host in self._active_host:
				host._script.set_local_ring_control(self._local_ring_control)
	

	def set_absolute_mode(self, val = 1):
		#self._host.log_message('client set absolute mode ' + str(val))
		self._absolute_mode = val
		if self._enabled:
			for host in self._active_host:
				host._script.set_absolute_mode(self._absolute_mode)
	

	def receive_mod_color(self, val):
		#self._host.log_message('mod color' + str(val))
		if val != 1:
			self._mod_color = val
			self._host.shift_update()
	

	def _mod_dial_parameter(self):
		param = None
		if not self.device == None:
			for parameter in self.device.parameters:
				if (parameter.original_name == 'moddial'):
					param = parameter
					break
		return param

	

	"""def receive_mod_vol(self, val):
		#self._host.log_message('ring value' + str(val))
		self._mod_vol = val
		if self._host._shift_mode._mode_index is 0:
			if not (self._mod_dial is None):
				self._mod_dial.send_value(self._mod_vol)"""
	


	"""MonoDevice integration"""
	def receive_device(self, command, args0 = None, args1 = None, args2 = None):
		if command in dir(self._device_component):
			getattr(self._device_component, command)(args0, args1, args2)
	


	"""raw data integration"""
	def set_raw_enabled(self, value):
		self._raw = value > 0
		#self._host.log_message('raw enabled' + str(self._raw))
		if(self._raw is True):
			self._update_controls_dictionary()
	

	def receive_raw(self, Type, Identifier, value):
		#self._host.log_message('recieve raw' + str(Type) + str(Identifier) + str(value))
		if self._controls[Type]:
			if Identifier in self._controls[Type]:
				self._controls[Type][Identifier](value)
	

	def _update_controls_dictionary(self):
		if self._host._host != None:
			self._controls = [{}, {}]
			if self._control_defs['grid'] != None:
				for column in range(self._control_defs['grid'].width()):
					for row in range(self._control_defs['grid'].height()):
						button = self._control_defs['grid'].get_button(column, row)
						if button != None:
							self._controls[0][button._original_identifier]=self._make_grid_call(column, row)
			if self._control_defs['keys'] != None:
				for index in range(len(self._control_defs['keys'])):
					key = self._control_defs['keys'][index]
					if key != None:
						self._controls[0][key._original_identifier]=self._make_key_call(index)
			if self._control_defs['dials'] != None:
				for index in range(12):
					column = index%4
					row = int(index/4)
					dial = self._control_defs['dials'].get_dial(column, row)
					if dial != None:
						self._controls[1][dial._original_identifier]=self._make_dial_call(index)
			if self._control_defs['buttons'] != None:
				for index in range(8):
					column = index%4
					row = int(index/4)+1
					button = self._control_defs['buttons'].get_button(column, row)
					if button != None:
						self._controls[0][button._original_identifier]=self._make_dial_button_call(index+4)
	

	def _make_grid_call(self, column, row):
		def recieve_grid(value):
			#self._host.log_message('receive grid' + str(value) + str(column) + str(row))
			self.receive_grid(column, row, value)
		return recieve_grid
	

	def _make_key_call(self, number):
		def receive_key(value):
			#self._host.log_message('receive key' + str(number) + str(value))
			self.receive_key(number, value)
		return receive_key
	

	def _make_dial_call(self, number):
		def receive_wheel(value):
			self.receive_wheel(number, 'value', value)
		return receive_wheel
	

	def _make_dial_button_call(self, number):
		def receive_wheel(value):
			self.receive_wheel(number, 'white', value)
		return receive_wheel
Example #8
0
class MonoClient(NotifyingControlElement):
    __module__ = __name__
    __doc__ = ' Class representing a single mod in a Monomodular hosted environment '

    def __init__(self, script, number):
        NotifyingControlElement.__init__(self)
        self._host = script
        self._active_host = []
        self._number = number
        self._channel = 0
        self._connected = False
        self._enabled = True
        self.device = None
        self._device_parent = None
        self._swing = 0
        self._autoselect_enabled = 0
        self._offset = [0, 0]
        self._color_maps = []
        self._report_offset = False
        self._local_ring_control = 1
        self._raw = False
        self._controls = [{}, {}]
        self._create_grid()
        self._create_keys()
        self._create_wheels()
        self._mod_dial = None
        self._mod_vol = 127
        self._mod_color = 0
        self._absolute_mode = 1
        self._monomodular = 0
        self._device_component = MonoDeviceComponent(self, script._host,
                                                     script)

    def is_active(self):
        return (len(self._active_host) > 0)

    def set_enabled(self, val):
        self._enabled = val != 0

    def set_channel(self):
        if self.is_connected:
            self._host.assign_alternate_mappings(0)
        else:
            self._host.assign_alternate_mappings(self._number + 1)

    def is_connected(self):
        return self._connected

    def disconnect(self):
        #self._host.log_message('client_disconnect')
        self._device_component.disconnect()
        self._active_host = []
        if self._device_parent != None:
            if self._device_parent.devices_has_listener(self._device_listener):
                self._device_parent.remove_devices_listener(
                    self._device_listener)
        #NotifyingControlElement.disconnect(self)  #this would normally call part of the new reset in NCE, then reset in CE, both of which are handled by the new reset below this
        for entry in self._value_notifications:
            callback = entry['Callback']
            self.remove_value_listener(callback)
        self._value_notifications = []
        self._enabled = True
        self._mod_color = 0
        self._local_ring_control = 1
        self._absolute_mode = 1
        self._monomodular = 0

    def reset(self):
        pass

    def _connect_to(self, device):
        #self._host.log_message('client ' + str(self._number) + ' connect_to '  + str(device.name))
        self._connected = True
        self.device = device
        if self._device_parent != None:
            if self._device_parent.devices_has_listener(self._device_listener):
                self._device_parent.remove_devices_listener(
                    self._device_listener)
        self._device_parent = device.canonical_parent
        if not self._device_parent.devices_has_listener(self._device_listener):
            self._device_parent.add_devices_listener(self._device_listener)
        for host in self._active_host:
            host.update()
            #if not host.is_enabled():
            #	self._host.display_mod_colors()
        #self._host._refresh_stored_data()

    def _disconnect_client(self, reconnect=False):
        #self._host.log_message('disconnect client ' + str(self._number))
        old_callbacks = self._value_notifications
        self._create_grid()
        self._create_keys()
        self._local_ring_control = 1
        self._absolute_mode = 1
        self._monomodular = 0
        self._swing = 0
        self._mod_color = 0
        self._raw = False
        self._report_offset = False
        if self._device_parent != None:
            if self._device_parent.devices_has_listener(self._device_listener):
                self._device_parent.remove_devices_listener(
                    self._device_listener)
        if reconnect == True:
            self._send('reconnect')
        for entry in self._value_notifications:
            callback = entry['Callback']
            self.remove_value_listener(callback)
        self._value_notifications = []
        self._device_component.disconnect_client()
        self._connected = False
        self.device = None
        if not self._mod_dial == None:
            if self._mod_dial._parameter is self._mod_dial_parameter:
                self._mod_dial.release_parameter()
        for host in self._active_host:
            host.update()
            if not host.is_enabled():
                self._host.display_mod_colors()

    def _device_listener(self):
        #self._host.log_message('device_listener' + str(self.device))
        if self.device == None:
            self._disconnect_client()

    def linked_device(self):
        return self.device

    """initiation methods"""

    def _create_grid(self):
        self._grid = [None for index in range(4)]
        for column in range(4):
            self._grid[column] = [None for index in range(16)]
            for row in range(4):
                self._grid[column][row] = 0

    def _create_keys(self):
        self._key = [None for index in range(32)]
        for index in range(32):
            self._key[index] = 0

    def _create_knobs(self):
        self._knob = [None for index in range(24)]
        for index in range(24):
            self._knob[index] = 0

    def _create_wheels(self):
        self._wheel = [[] for index in range(4)]
        for column in range(4):
            self._wheel[column] = [[] for index in range(3)]
            for row in range(3):
                self._wheel[column][row] = {
                    'log': 0,
                    'value': 0,
                    'mode': 0,
                    'white': 0,
                    'green': 0,
                    'custom': '00000000',
                    'pn': ' ',
                    'pv': '0'
                }

    """send methods (to m4l from host)"""

    def _send(self, args1=None, args2=None, args3=None, args4=None):
        if self._enabled is True:
            #self._host.log_message('send' + str(args1) + str(args2) + str(args3) + str(args4))
            for entry in self._value_notifications:
                callback = entry['Callback']
                callback(args1, args2, args3, args4)

    def _send_knob(self, index, value):
        self._send('knob', index, value)

    def _send_key(self, index, value):
        self._send('key', index, value)
        if self._raw is True:
            control = self._host._host._keys[index]
            if control != None:
                self._send('raw',
                           control._msg_type + control._original_channel,
                           control._original_identifier, value)

    def _send_grid(self, column, row, value):
        self._send('grid', column, row, value)
        if self._raw is True:
            control = self._host._host._grid.get_button(column, row)
            if control != None:
                self._send('raw',
                           control._msg_type + control._original_channel,
                           control._original_identifier, value)
        #self._host.log_message('client ' + str(self._number) + ' received')

    def _send_offset(self, x, y):
        self._offset = [x, y]
        if (self._report_offset is True):
            self._send('offset', x, y)

    """receive methods (from m4l)"""

    def receive_key(self, index, value):
        if self._key[index] != value:
            self._key[index] = value
            if self.is_active():
                for host in self._active_host:
                    host._send_key(index, value)

    def receive_grid(self, column, row, value):
        if self._grid[column][row] != value:
            self._grid[column][row] = value
            if self.is_active():
                for host in self._active_host:
                    host._send_grid(column, row, value)

    def receive_grid_row(self, row, value):
        for column in range(len(self._grid)):
            self._grid[column][row] = value
        if self.is_active():
            for host in self._active_host:
                for column in range(len(self._grid)):
                    host._send_grid(column, row, value)

    def receive_grid_column(self, column, value):
        for row in range(len(self._grid[column])):
            self._grid[column][row] = value
        if self.is_active():
            for host in self._active_host:
                for row in range(len(self._grid[column])):
                    host._send_grid(column, row, value)

    def receive_grid_all(self, value):
        for column in range(len(self._grid)):
            for row in range(len(self._grid[column])):
                self._grid[column][row] = value
        if self.is_active():
            for host in self._active_host:
                for column in range(len(self._grid)):
                    for row in range(len(self._grid[column])):
                        host._send_grid(column, row, value)

    def receive_mask_key(self, num, value):
        if self.is_active():
            if value > -1:
                for host in self._active_host:
                    host._send_key(num, value)
            else:
                for host in self._active_host:
                    host._send_key(num, int(self._key[num]))

    def receive_mask_grid(self, column, row, value):
        if self.is_active():
            if value > -1:
                for host in self._active_host:
                    host._send_grid(column, row, value)
            else:
                for host in self._active_host:
                    host._send_grid(column, row, int(self._grid[column][row]))

    def receive_mask_column(self, column, value):
        if self.is_active():
            if value > -1:
                for host in self._active_host:
                    for index in range(4):
                        host._send_grid(column, index, value)
            else:
                for host in self._active_host:
                    for index in range(4):
                        host._send_grid(column, index,
                                        self._grid[column][index])

    def receive_mask_row(self, row, value):
        if self.is_active():
            if value > -1:
                for host in self._active_host:
                    for index in range(4):
                        host._send_grid(index, row, value)
            else:
                for host in self._active_host:
                    for index in range(4):
                        host._send_grid(index, row, self._grid[index][row])

    def receive_mask_all(self, value):
        if self.is_active():
            if value > -1:
                for host in self._active_host:
                    for column in range(4):
                        for row in range(4):
                            host._send_grid(column, row, value)
            else:
                for host in self._active_host:
                    for column in range(4):
                        for row in range(4):
                            host._send_grid(column, row,
                                            self._grid[index][row])

    def receive_hotline(self, client, func=None, arguments=None):
        #self._host.log_message(str(client) + str(func) + str(arguments))
        if (client in range(4)) and (func != None):
            self._host._client[client]._send('hotline', func, arguments)
        elif (client == 'all') and (func != None):
            for client in self._host._client:
                client._send('hotline', func, arguments)

    def receive_autoselect_enabled(self, val):
        self._autoselect_enabled = val

    def receive_channel(self, channel):
        if channel in range(16):
            self._channel = channel

    def autoselect_enabled(self):
        return self._autoselect_enabled > 0

    def _autoselect(self):
        if self.autoselect_enabled():
            if self.device != None:
                for host in self._active_host:
                    host.set_appointed_device(self.device)

    def _set_channel(self, channel):
        self._send('channel', channel)
        self._channel = channel

    def set_report_offset(self, val):
        self._report_offset = (val == 1)
        self._send_offset(self._offset[0], self._offset[1])

    def set_monomodular(self, val):
        self._monomodular = val

    def set_color_map(self, color_type, color_map):
        for host in self._host._hosts:
            #self._host.log_message(str(host._host_name) + str(host_name))
            if str(host._script._color_type) == str(color_type):
                #new_map = [color_map[i] for i in range(len(color_map))]
                #self._host.log_message('mapping ' + str(host_name) + ' to ' + str(self._number))
                new_map = color_map.split('*')
                for index in range(len(new_map)):
                    new_map[index] = int(new_map[index])
                #self._host.log_message(str(host_name) + str(new_map))
                host._color_maps[self._number] = new_map
                if host._active_client is self:
                    host._select_client(self._number)
                #self._host.log_message(str(host_name) + ' ' + str(color_map.split('*')))

    """Codec/CNTRLR specific methods"""

    def _send_dial(self, column, row, value):
        self._send('dial', column, row, value)
        if self._raw is True:
            control = self._host._host._dial_matrix.get_dial(column, row)
            if control != None:
                self._send('raw',
                           control._msg_type + control._original_channel,
                           control._original_identifier, value)

    def _send_dial_button(self, column, row, value):
        if row > 0:
            self._send('dial_button', column, row - 1, value)
            if self._raw is True:
                control = self._host._host._dial_button_matrix.get_button(
                    column, row)
                if control != None:
                    self._send('raw',
                               control._msg_type + control._original_channel,
                               control._original_identifier, value)

    def receive_wheel(self, number, parameter, value):
        column = number % 4
        row = int(number / 4)
        #if row > 0:
        self._wheel[column][row][parameter] = value
        if self.is_active():
            if parameter == 'pn' or parameter == 'pv':
                for host in self._active_host:
                    #host._script.log_message(str(column) + str(row) + str(self._wheel[column][row][parameter]))
                    host._send_to_lcd(column, row, self._wheel[column][row])
            if parameter != 'white':
                for host in self._active_host:
                    host._send_wheel(column, row, self._wheel[column][row])
            elif row > 0:
                for host in self._active_host:
                    host._send_wheel(column, row, self._wheel[column][row])
        #elif (column==self._number) and  (parameter=='value'):
        #	self._wheel[column][row][parameter] = value

    def set_local_ring_control(self, val=0):
        self._local_ring_control = val
        if self._enabled:
            for host in self._active_host:
                host._script.set_local_ring_control(self._local_ring_control)

    def set_absolute_mode(self, val=1):
        #self._host.log_message('client set absolute mode ' + str(val))
        self._absolute_mode = val
        if self._enabled:
            for host in self._active_host:
                host._script.set_absolute_mode(self._absolute_mode)

    def receive_mod_color(self, val):
        #self._host.log_message('mod color' + str(val))
        if val != 1:
            self._mod_color = val
            self._host.shift_update()

    def _mod_dial_parameter(self):
        param = None
        if not self.device == None:
            for parameter in self.device.parameters:
                if (parameter.original_name == 'moddial'):
                    param = parameter
                    break
        return param

    """def receive_mod_vol(self, val):
		#self._host.log_message('ring value' + str(val))
		self._mod_vol = val
		if self._host._shift_mode._mode_index is 0:
			if not (self._mod_dial is None):
				self._mod_dial.send_value(self._mod_vol)"""
    """MonoDevice integration"""

    def receive_device(self, command, args0=None, args1=None, args2=None):
        if command in dir(self._device_component):
            getattr(self._device_component, command)(args0, args1, args2)

    """raw data integration"""

    def set_raw_enabled(self, value):
        self._raw = value > 0
        #self._host.log_message('raw enabled' + str(self._raw))
        if (self._raw is True):
            self._update_controls_dictionary()

    def receive_raw(self, Type, Identifier, value):
        #self._host.log_message('recieve raw' + str(Type) + str(Identifier) + str(value))
        if self._controls[Type]:
            if Identifier in self._controls[Type]:
                self._controls[Type][Identifier](value)

    def _update_controls_dictionary(self):
        if self._host._host != None:
            self._controls = [{}, {}]
            if self._control_defs['grid'] != None:
                for column in range(self._control_defs['grid'].width()):
                    for row in range(self._control_defs['grid'].height()):
                        button = self._control_defs['grid'].get_button(
                            column, row)
                        if button != None:
                            self._controls[0][
                                button.
                                _original_identifier] = self._make_grid_call(
                                    column, row)
            if self._control_defs['keys'] != None:
                for index in range(len(self._control_defs['keys'])):
                    key = self._control_defs['keys'][index]
                    if key != None:
                        self._controls[0][
                            key._original_identifier] = self._make_key_call(
                                index)
            if self._control_defs['dials'] != None:
                for index in range(12):
                    column = index % 4
                    row = int(index / 4)
                    dial = self._control_defs['dials'].get_dial(column, row)
                    if dial != None:
                        self._controls[1][
                            dial._original_identifier] = self._make_dial_call(
                                index)
            if self._control_defs['buttons'] != None:
                for index in range(8):
                    column = index % 4
                    row = int(index / 4) + 1
                    button = self._control_defs['buttons'].get_button(
                        column, row)
                    if button != None:
                        self._controls[0][
                            button.
                            _original_identifier] = self._make_dial_button_call(
                                index + 4)

    def _make_grid_call(self, column, row):
        def recieve_grid(value):
            #self._host.log_message('receive grid' + str(value) + str(column) + str(row))
            self.receive_grid(column, row, value)

        return recieve_grid

    def _make_key_call(self, number):
        def receive_key(value):
            #self._host.log_message('receive key' + str(number) + str(value))
            self.receive_key(number, value)

        return receive_key

    def _make_dial_call(self, number):
        def receive_wheel(value):
            self.receive_wheel(number, 'value', value)

        return receive_wheel

    def _make_dial_button_call(self, number):
        def receive_wheel(value):
            self.receive_wheel(number, 'white', value)

        return receive_wheel