mesycontrol Package

app_context Module

class mesycontrol.app_context.Context(main_file, auto_load_device_modules=True, parent=None)[source]

Bases: PyQt4.QtCore.QObject

add_shutdown_callback(cb)[source]
get_config_directory_hint()[source]
get_setup_directory_hint()[source]
init_device_registry()[source]
make_qsettings()[source]
open_setup(filename)[source]
reset_setup()[source]
set_config_directory_hint(filename)[source]
set_setup_directory_hint(filename)[source]
setup

The contexts current setup object.

shutdown()[source]
mesycontrol.app_context.make(*args, **kwds)[source]

Creates and yields a Context object. Makes sure shutdown() is called on the context after use. Usage:

with app_context.make(...) as context:
do_things_with(context)
mesycontrol.app_context.use(*args, **kwds)[source]

Same as make() but takes a Context instance instead of creating one.

app_model Module

class mesycontrol.app_model.AppObject(hardware=None, config=None, parent=None)[source]

Bases: PyQt4.QtCore.QObject

cfg
config_set

self, old, new

get_config()[source]
get_hardware()[source]
hardware_set

self, old, new

has_cfg
has_hw
hw
set_config(cfg)[source]
set_hardware(hw)[source]
class mesycontrol.app_model.Device(bus, address, mrc=None, hw_device=None, cfg_device=None, hw_module=None, cfg_module=None, parent=None)[source]

Bases: mesycontrol.app_model.AppObject

add_default_polling_subscription(subscriber)[source]
address_conflict
cfg_extension_changed
cfg_idc
cfg_idc_changed
cfg_module
cfg_module_changed
cfg_parameter_changed
cfg_profile
cfg_profile_changed
config_applied

True if hardware and config values are equal.

config_applied_changed
create_config(name='', create_mrc_config=True)[source]

Creates a config for this device using the default values from the device profile.

Preconditions:
  • self.cfg must be None: device must not have a config yet
  • self.profile must be set: a device profile is needed to create the config with the proper idc and initial values
  • create_mrc_config must be True or self.mrc.cfg must be set
get_cfg_idc()[source]
get_cfg_module()[source]
get_cfg_profile()[source]
get_config_parameters()[source]
get_critical_config_parameters()[source]
get_device_name()[source]
get_hw_idc()[source]
get_hw_module()[source]
get_hw_profile()[source]
get_idc()[source]
get_module()[source]
get_mrc()[source]
get_non_critical_config_parameters()[source]
get_profile()[source]
has_address_conflict()[source]
has_idc_conflict()[source]

True if hardware and config IDCs differ.

has_specialized_class()[source]
has_widget_class()[source]
hw_extension_changed
hw_idc
hw_idc_changed
hw_module
hw_module_changed
hw_parameter_changed
hw_profile
hw_profile_changed
idc
idc_changed
idc_conflict

True if hardware and config IDCs differ.

idc_conflict_changed
is_config_applied()[source]

True if hardware and config values are equal.

make_device_widget(display_mode, write_mode, make_settings=None, parent=None)[source]
make_specialized_device(read_mode, write_mode)[source]
module
module_changed
mrc
mrc_changed
profile
profile_changed
remove_polling_subscriber(subscriber)[source]
set_cfg_module(module)[source]
set_hw_module(module)[source]
set_module(module)[source]
set_mrc(mrc)[source]
update_config_applied()[source]
class mesycontrol.app_model.Director(app_registry, device_registry)[source]

Bases: object

Manages the app_model tree. Subscribes to changes to both the hardware and config trees and updates the app_model tree.

class mesycontrol.app_model.MRC(url, mrc_registry=None, hw_mrc=None, cfg_mrc=None, parent=None)[source]

Bases: mesycontrol.app_model.AppObject

add_device(device)[source]
create_config()[source]
device_about_to_be_removed
device_added
device_removed
devices
get_device(bus, address)[source]
get_devices(bus=None)[source]
get_display_url()[source]
get_mrc_registry()[source]
get_url()[source]
mrc_registry
mrc_registry_changed
remove_device(device)[source]
set_mrc_registry(registry)[source]
url
class mesycontrol.app_model.MRCRegistry(hw_reg, cfg_reg, parent=None)[source]

Bases: mesycontrol.app_model.AppObject

add_mrc(mrc)[source]
find_mrc_by_config(cfg_mrc)[source]
find_mrc_by_hardware(hw_mrc)[source]
get_mrc(url)[source]
get_mrcs()[source]
mrc_about_to_be_removed
mrc_added
mrc_removed
mrcs
remove_mrc(mrc)[source]
setup

async_util Module

class mesycontrol.async_util.DefaultGeneratorRunner(generator=None, parent_widget=None, parent=None)[source]

Bases: mesycontrol.config_util.GeneratorRunner

basic_model Module

class mesycontrol.basic_model.Device(bus=None, address=None, idc=None, parent=None)[source]

Bases: PyQt4.QtCore.QObject

address
address_changed
bus
bus_changed
clear_cached_memory()[source]

Clears the memory cache. Returns True if any parameters where cleared. Otherwise False is returned.

clear_cached_parameter(address)[source]

Removes the cached memory value at the given address. Emits parameter_changed and returns True if the parameter was present in the memory cache. Otherwise False is returned.

extension_added
extension_changed
extension_removed
extensions
get_address()[source]

Get the devices address on the bus.

get_bus()[source]

Returns the devices bus number.

get_cached_memory()[source]

Returns a copy of the memory cache in the form of a dict.

get_cached_memory_ref()[source]

Returns a reference to the memory cache (a dictionary).

get_cached_parameter(address)[source]

Returns the integer value of the cached parameter at the given address or None if the parameter is not present in the cache. address must be within PARAM_RANGE, otherwise a ValueError will be raised.

get_extension(name)[source]
get_extensions()[source]
get_idc()[source]

Get the devices identifier code.

get_mrc()[source]

Get the MRC the device is connected to. Returns None if no MRC has been set.

get_parameter(address)[source]

Get a parameter from the devices memory cache if available. Otherwise use Device.read_parameter() to read the parameter from the hardware. Returns a ResultFuture whose result is a ReadResult instance.

has_cached_parameter(address)[source]

Returns True if the given address is in the memory cache.

has_extension(name)[source]
idc
idc_changed
memory_about_to_be_cleared

memory

memory_cleared
mrc
mrc_changed
parameter_changed

address, value

read_parameter(address)[source]

Read a parameter from the device. This method returns a ResultFuture whose result is a ReadResult instance. On read success the local memory cache is updated with the newly read value.

remove_extension(name)[source]
set_address(address)[source]

Set the devices address. address must be within DEV_RANGE.

set_bus(bus)[source]

Set the devices bus number. Bus must be in BUS_RANGE.

set_cached_parameter(address, value)[source]

Set the memory cache at the given address to the given value. Emits parameter_changed and returns True if the value changes. Otherwise no signal is emitted and False is returned. Raises ValueError if address is out of range.

set_extension(name, value)[source]
set_idc(idc)[source]

Set the devices identifier code.

set_mrc(mrc)[source]

Set the MRC the device is connected to. Pass None to clear the current MRC.

set_parameter(address, value)[source]

Set the parameter at the given address to the given value. Updates the local memory cache on success. This method returns a ResultFuture whose result is a SetResult instance.

exception mesycontrol.basic_model.IDCConflict[source]

Bases: exceptions.RuntimeError

class mesycontrol.basic_model.MRC(url, parent=None)[source]

Bases: PyQt4.QtCore.QObject

add_device(device)[source]
device_about_to_be_removed
device_added
device_removed
get_device(bus, address)[source]
get_devices(bus=None)[source]
get_display_url()[source]
get_url()[source]
has_device(bus, address)[source]
remove_device(device)[source]
set_url(url)[source]
url
url_changed
class mesycontrol.basic_model.MRCRegistry(parent=None)[source]

Bases: PyQt4.QtCore.QObject

Manages MRC instances

add_mrc(mrc)[source]
contains_devices()[source]
get_mrc(url)[source]
get_mrcs()[source]
mrc_about_to_be_removed
mrc_added
mrc_removed
mrcs
remove_mrc(mrc)[source]
class mesycontrol.basic_model.ReadResult[source]

Bases: mesycontrol.basic_model.ReadResult

The result type for a read operation. A namedtuple with added conversion to int.

class mesycontrol.basic_model.ResultFuture[source]

Bases: mesycontrol.future.Future

Future subclass used to hold ReadResult/SetResult instances. This class adds an int() conversion method to easily obtain the result value.

class mesycontrol.basic_model.SetResult[source]

Bases: mesycontrol.basic_model.SetResult

The result type for a set operation. Adds requested_value to the fields of ReadResult and conversions to int and bool. The bool conversion returns True if value equals requested value.

basic_tree_model Module

class mesycontrol.basic_tree_model.BasicTreeModel(parent=None)[source]

Bases: PyQt4.QtCore.QAbstractItemModel

add_node(node, parent_node, row)[source]
clear()[source]
data(idx, role=0)[source]
find_node_by_ref(ref)[source]

Find and return the node pointing to the given ref. If no node can be found None is returned.

flags(idx)[source]
index(row, col, parent=<PyQt4.QtCore.QModelIndex object at 0x4181bb0>)[source]
index_for_node(node)[source]
index_for_ref(ref)[source]
notify_data_changed(node, col1=None, col2=None)[source]
parent(idx)[source]
remove_node(node)[source]
rowCount(parent=<PyQt4.QtCore.QModelIndex object at 0x4181c20>)[source]
setData(idx, value, role=2)[source]
class mesycontrol.basic_tree_model.BasicTreeNode(ref=None, parent=None)[source]

Bases: object

Support class for implementing the nodes of a Qt tree model.

append_child(child)[source]
data(column, role)[source]
find_node_by_ref(ref)[source]

Find and return the node pointing to the given ref. If no node can be found None is returned.

flags(column)[source]
get_model()[source]

Get this nodes model. If no model is set for this node return the parent nodes model. Return None if no model is set for the node hierarchy.

get_parent()[source]
get_ref()[source]
get_row()[source]
has_ref()[source]
model

Get this nodes model. If no model is set for this node return the parent nodes model. Return None if no model is set for the node hierarchy.

notify_all_columns_changed()[source]

No argument variant of notify_data_changed(). Useful to connect to signals whose arguments are to be discarded (the args would take the place of col1 and col2 which is not desired).

notify_data_changed(col1=0, col2=None)[source]

Calls notify_data_changed on the nodes model if a model is set. col1 and col2 specify the first and last column that changed. If col2 is None it will be set to the models column count. If the node has no model this method does nothing.

parent
ref
row
set_data(column, value, role)[source]
set_model(model)[source]
set_parent(parent)[source]
set_ref(ref)[source]

config_gui Module

class mesycontrol.config_gui.ApplyDeviceConfigRunner(device, parent_widget, parent=None)[source]

Bases: mesycontrol.config_util.GeneratorRunner

class mesycontrol.config_gui.ApplyDeviceConfigsRunner(devices, parent_widget, parent=None)[source]

Bases: mesycontrol.config_util.GeneratorRunner

progress_changed
class mesycontrol.config_gui.ApplySetupRunner(app_registry, device_registry, parent_widget, parent=None)[source]

Bases: mesycontrol.config_util.GeneratorRunner

progress_changed
class mesycontrol.config_gui.FillDeviceConfigsRunner(devices, parent_widget, parent=None)[source]

Bases: mesycontrol.config_util.GeneratorRunner

progress_changed
class mesycontrol.config_gui.ReadConfigParametersRunner(devices, parent_widget, parent=None)[source]

Bases: mesycontrol.config_util.GeneratorRunner

progress_changed
class mesycontrol.config_gui.SubProgressDialog(title='', parent=None)[source]

Bases: PyQt4.QtGui.QDialog

cancel()[source]
canceled
set_progress(progress)[source]
mesycontrol.config_gui.std_button_to_cfg_action(button)[source]

config_model Module

class mesycontrol.config_model.Device(bus=None, address=None, idc=None, parent=None)[source]

Bases: mesycontrol.basic_model.Device

clear_cached_memory(*args, **kwargs)

Clears the memory cache. Returns True if any parameters where cleared. Otherwise False is returned.

clear_cached_parameter(*args, **kwargs)

Removes the cached memory value at the given address. Emits parameter_changed and returns True if the parameter was present in the memory cache. Otherwise False is returned.

get_name()[source]
is_modified()[source]
modified
modified_changed
name
name_changed
remove_extension(*args, **kwargs)
set_address(*args, **kwargs)

Set the devices address. address must be within DEV_RANGE.

set_bus(*args, **kwargs)

Set the devices bus number. Bus must be in BUS_RANGE.

set_cached_parameter(*args, **kwargs)

Set the memory cache at the given address to the given value. Emits parameter_changed and returns True if the value changes. Otherwise no signal is emitted and False is returned. Raises ValueError if address is out of range.

set_extension(*args, **kwargs)
set_idc(*args, **kwargs)

Set the devices identifier code.

set_modified(b)
set_name(*args, **kwargs)[source]
class mesycontrol.config_model.MRC(url=None, parent=None)[source]

Bases: mesycontrol.basic_model.MRC

add_device(*args, **kwargs)[source]
autoconnect
autoconnect_changed
get_autoconnect()[source]
get_name()[source]
is_modified()[source]
modified
modified_changed
name
name_changed
remove_device(*args, **kwargs)[source]
set_autoconnect(*args, **kwargs)[source]
set_modified(b)
set_name(*args, **kwargs)[source]
set_url(*args, **kwargs)
class mesycontrol.config_model.Setup(parent=None)[source]

Bases: mesycontrol.basic_model.MRCRegistry

add_mrc(*args, **kwargs)[source]
autoconnect
autoconnect_changed
filename
filename_changed
get_autoconnect()[source]
get_filename()[source]
is_modified()[source]
modified
modified_changed
remove_mrc(*args, **kwargs)[source]
set_autoconnect(*args, **kwargs)[source]
set_filename(*args, **kwargs)[source]
set_modified(b)
mesycontrol.config_model.make_device_config(bus, address, idc, name=u'', device_profile=None)[source]
mesycontrol.config_model.modifies(f)[source]

Method decorator which executes `wrapped_object.set_modified(True)’ if the wrapped method returns a non-false value.

config_tree_model Module

class mesycontrol.config_tree_model.BusNode(bus_number, parent=None)[source]

Bases: mesycontrol.basic_tree_model.BasicTreeNode

data(column, role)[source]
class mesycontrol.config_tree_model.ConfigTreeModel(device_registry, parent=None)[source]

Bases: mesycontrol.basic_tree_model.BasicTreeModel

columnCount(parent=<PyQt4.QtCore.QModelIndex object at 0x4209c90>)[source]
headerData(section, orientation, role=0)[source]
class mesycontrol.config_tree_model.ConfigTreeNode(ref, parent)[source]

Bases: mesycontrol.basic_tree_model.BasicTreeNode

class mesycontrol.config_tree_model.DeviceNode(device, parent=None)[source]

Bases: mesycontrol.config_tree_model.ConfigTreeNode

data(column, role)[source]
flags(column)[source]
set_data(column, value, role)[source]
class mesycontrol.config_tree_model.MRCNode(mrc, parent=None)[source]

Bases: mesycontrol.config_tree_model.ConfigTreeNode

data(column, role)[source]
flags(column)[source]
set_data(column, value, role)[source]
class mesycontrol.config_tree_model.SetupNode(setup, parent=None)[source]

Bases: mesycontrol.config_tree_model.ConfigTreeNode

data(column, role)[source]

config_util Module

exception mesycontrol.config_util.Aborted[source]

Bases: exceptions.RuntimeError

class mesycontrol.config_util.GeneratorRunner(generator=None, parent=None)[source]

Bases: PyQt4.QtCore.QObject

close()[source]
progress_changed
start()[source]

Start execution of the generator. Requires a running Qt event loop (or calls to processEvents()). Returns a Future that fullfills on generator termination.

exception mesycontrol.config_util.MissingDestinationDevice(url, bus, dev)[source]

Bases: exceptions.RuntimeError

exception mesycontrol.config_util.MissingDestinationMRC(url)[source]

Bases: exceptions.RuntimeError

class mesycontrol.config_util.ProgressUpdate(current, total, text='')[source]

Bases: object

current
get_current()[source]
get_total()[source]
increment(delta=1)[source]
set_current(cur)[source]
set_total(total)[source]
total
exception mesycontrol.config_util.RcOff(device)[source]

Bases: exceptions.RuntimeError

exception mesycontrol.config_util.SetParameterError(set_result, device=None)[source]

Bases: exceptions.RuntimeError

mesycontrol.config_util.apply_device_config(device)[source]

Device may be an app_model.Device instance or a DeviceBase subclass.

mesycontrol.config_util.apply_device_configs(devices)[source]

Applies config values to the hardware for each of the given devices. Required MRC connections are established.

mesycontrol.config_util.apply_parameters(source, dest, criticals, non_criticals)[source]

Write parameters from source to dest. First criticals are set to their safe value, then non_criticals are written to the destination and finally criticals are set to the value they have in the source device.

mesycontrol.config_util.apply_setup(app_registry, device_registry)[source]
mesycontrol.config_util.connect_and_apply_setup(app_registry, device_registry)[source]
mesycontrol.config_util.establish_connections(setup, hardware_registry)[source]
mesycontrol.config_util.fill_device_configs(devices)[source]

For each of the given devices read config parameters from the hardware and use them to fill the device config. Device extensions will also be copied from hardware to config.

mesycontrol.config_util.read_config_parameters(devices)[source]
mesycontrol.config_util.run_callables_generator(callables)[source]

config_xml Module

class mesycontrol.config_xml.CommentTreeBuilder(element_factory=None)[source]

Bases: xml.etree.ElementTree.TreeBuilder

comment(data)[source]
mesycontrol.config_xml.dict2xml(tb, d)[source]
mesycontrol.config_xml.list2xml(tb, l)[source]
mesycontrol.config_xml.read_device_config(source)[source]
mesycontrol.config_xml.read_setup(source)[source]

Load a Setup from the given source. Source may be a filename or a file like object.

mesycontrol.config_xml.value2xml(tb, value)[source]
mesycontrol.config_xml.write_device_config(device_config, dest, parameter_names={})[source]

Write the given device config to destination. The optional parameter_names should map parameter_address to parameter_name. These names will be added as comments in the resulting XML.

mesycontrol.config_xml.write_setup(setup, dest, idc_to_parameter_names={})[source]

Write the given setup to the given destination. Dest may be a filename or a file like object opened for writing. idc_to_parameter_names should map device_idc to a dictionary of param_address -> param_name.

mesycontrol.config_xml.xml2dict(node)[source]
mesycontrol.config_xml.xml2list(node)[source]
mesycontrol.config_xml.xml2value(node)[source]

device_profile Module

class mesycontrol.device_profile.DeviceProfile(idc)[source]

Bases: object

add_parameter(param)[source]
get_config_parameters()[source]
get_critical_parameters()[source]
get_extension(name)[source]
get_extensions()[source]
get_non_critical_config_parameters()[source]
get_non_critical_parameters()[source]
get_parameter_by_address(address)[source]
get_parameter_by_name(name)[source]
get_parameter_names()[source]
get_parameters()[source]
get_static_addresses()[source]
get_volatile_addresses()[source]
has_parameter(param)[source]
idc = None

Device Identifier Code

name = None

Device name (e.g. MHV4). Should be unique.

set_extension(ext)[source]
exception mesycontrol.device_profile.DuplicateParameter[source]

Bases: exceptions.RuntimeError

class mesycontrol.device_profile.ParameterProfile(address)[source]

Bases: object

address = None

Numeric address of the parameter.

critical = None

True if this parameter affects a critical

default
do_not_store = None

True if this parameters value should not be stored

static fromDict(d)[source]
get_default()[source]
get_name()[source]
get_unit(label_or_name)[source]
has_index()[source]
index = None

Index number of this parameter if it is part of a sequence

is_named()[source]
name
poll = None

True if this parameter should be polled repeatedly.

range = None

Range instance limiting this parameters values.

read_only = None

True if this parameter is read only. Its

safe_value = None

Optional safe value if this parameter is critical.

set_default(value)[source]
set_name(name)[source]
should_be_stored()[source]
units = None

Optional list of Unit definitions for this parameter.

class mesycontrol.device_profile.Range(min_value, max_value)[source]

Bases: object

in_range(value)[source]
limit_to(value)[source]
to_tuple()[source]
class mesycontrol.device_profile.Unit(label, factor=1.0, offset=0.0, name=None)[source]

Bases: object

factor

Factor used for value<->unit conversion.

static fromDict(d)[source]
get_factor()[source]
get_offset()[source]
offset

Offset used for value<->unit conversion.

raw_value(unit_value)[source]
set_factor(factor)[source]
set_offset(offset)[source]
unit_value(raw_value)[source]
mesycontrol.device_profile.from_dict(d)[source]
mesycontrol.device_profile.make_generic_profile(device_idc)[source]

device_registry Module

class mesycontrol.device_registry.DeviceRegistry(auto_load_modules=False)[source]

Bases: object

Provides access to device modules.

get_device_class(idc)[source]
get_device_module(idc)[source]
get_device_name(idc)[source]
get_device_names()[source]

Returns a list of (idc, name) tuples.

get_device_profile(idc)[source]
get_device_profiles()[source]
get_device_ui_class(idc)[source]
get_parameter_name_mapping()[source]

Returns a mapping of device_idc to a dictionary of param_address -> param_name. Basically the known parameter names for each device.

get_parameter_names(idc)[source]
load_device_module(module_name)[source]

Load device class and device UI class from the module specified by `module_name’. The module has to define three variables: `idc’, `device_class’ and `device_ui_class’ containing the device idc, the device class and the device UI class to use.

load_system_modules()[source]

Load all built-in device modules.

class mesycontrol.device_registry.VirtualDeviceModule(idc)[source]

Bases: object

has_specialized_class()[source]
has_widget_class()[source]

device_tableview Module

class mesycontrol.device_tableview.DeviceTableItemDelegate(parent=None)[source]

Bases: PyQt4.QtGui.QStyledItemDelegate

createEditor(parent, options, proxy_idx)[source]
class mesycontrol.device_tableview.DeviceTableModel(device, display_mode, write_mode, parent=None)[source]

Bases: PyQt4.QtCore.QAbstractTableModel

columnCount(parent=<PyQt4.QtCore.QModelIndex object at 0x5151590>)[source]
data(idx, role=0)[source]
device
display_mode
editing_ignore_parameter_ranges
flags(idx)[source]
get_device()[source]
get_display_mode()[source]
get_editing_ignore_parameter_ranges()[source]
get_profile()[source]
get_write_mode()[source]
headerData(section, orientation, role=0)[source]
profile
rowCount(parent=<PyQt4.QtCore.QModelIndex object at 0x51729f0>)[source]
setData(idx, value, role=2)[source]
set_device(device)[source]
set_display_mode(mode)[source]
set_editing_ignore_parameter_ranges(do_ignore)[source]
set_write_mode(mode)[source]
write_mode
class mesycontrol.device_tableview.DeviceTableSortFilterProxyModel(parent=None)[source]

Bases: PyQt4.QtGui.QSortFilterProxyModel

QSortFilterProxyModel subclass to be used with the DeviceTableView. Filtering capabilities:

  • known addresses
  • read / write addresses
  • addresses with the poll flag set
filterAcceptsRow(src_row, src_parent)[source]
filter_readonly
filter_static
filter_unknown
filter_volatile
get_filter_readonly()[source]
get_filter_static()[source]
get_filter_unknown()[source]
get_filter_volatile()[source]
set_filter_readonly(on_off)[source]
set_filter_static(on_off)[source]
set_filter_unknown(on_off)[source]

If enabled any unknown parameter addresses are filtered out. `Unknown’ means that the devices DeviceProfile does not contain the address.

set_filter_volatile(on_off)[source]
class mesycontrol.device_tableview.DeviceTableView(model, parent=None)[source]

Bases: PyQt4.QtGui.QTableView

contextMenuEvent(event)[source]
device
display_mode
display_mode_changed
does_show_config()[source]
does_show_hardware()[source]
get_display_mode()[source]
get_profile()[source]
get_toolbar()[source]
get_write_mode()[source]
profile
set_display_mode(mode)[source]
set_write_mode(mode)[source]
write_mode
write_mode_changed
class mesycontrol.device_tableview.DeviceTableWidget(device, display_mode=3, write_mode=3, parent=None)[source]

Bases: PyQt4.QtGui.QWidget

device
display_mode
display_mode_changed
get_toolbar()[source]
write_mode
write_mode_changed

eventloop_callback Module

class mesycontrol.eventloop_callback.ref(method)[source]

Bases: object

A weak method implementation

is_dead()[source]

Returns True if the referenced callable was a bound method and the instance no longer exists. Otherwise, return False.

class mesycontrol.eventloop_callback.proxy(method, quiet=False)[source]

Bases: mesycontrol.eventloop_callback.ref

Exactly like ref, but calling it will cause the referent method to be called with the same arguments. If the referent’s object no longer lives, ReferenceError is raised.

If quiet is True, then a ReferenceError is not raise and the callback silently fails if it is no longer valid.

class mesycontrol.eventloop_callback.CallbackEvent(func, *args, **kwargs)[source]

Bases: PyQt4.QtCore.QEvent

A custom QEvent that contains a callback reference

Also provides class methods for conveniently executing arbitrary callback, to be dispatched to the event loop.

EVENT_TYPE = 65535
callback()[source]

Convenience method to run the callable.

Equivalent to:
self.func(*self.args, **self.kwargs)
classmethod post(func, *args, **kwargs)[source]

Post a callable to run in the main thread

classmethod post_to(receiver, func, *args, **kwargs)[source]

Post a callable to be delivered to a specific receiver as a CallbackEvent.

It is the responsibility of this receiver to handle the event and choose to call the callback.

class mesycontrol.eventloop_callback.CallbackThreadPool(processes=None, initializer=None, initargs=())[source]

Bases: multiprocessing.pool.ThreadPool

Simple wrapper around ThreadPool to wrap callbacks in a weakref that get posted as CallbackEvents in the main thread.

apply_async(fn, args=None, kwargs=None, callback=None)[source]
map_async(fn, iterable, chunk=None, callback=None)[source]

future Module

exception mesycontrol.future.CancelledError[source]

Bases: exceptions.RuntimeError

class mesycontrol.future.Future[source]

Bases: object

add_done_callback(fn, unique=True)[source]
add_progress_callback(fn, unique=True)[source]
cancel()[source]
cancelled()[source]
done()[source]
exception()[source]
progress()[source]
progress_max()[source]
progress_min()[source]
progress_range()[source]
progress_text()[source]
result()[source]
running()[source]
set_exception(exception)[source]
set_progress(progress)[source]
set_progress_range(min_or_tuple, max_or_none=None)[source]
set_progress_text(txt)[source]
set_result(result)[source]
set_running_or_notify_cancel()[source]

If the method returns False then the Future was cancelled. Otherwise the Future will be put in running state and True is returned.

exception mesycontrol.future.FutureIsDone[source]

Bases: exceptions.RuntimeError

exception mesycontrol.future.FutureIsRunning[source]

Bases: exceptions.RuntimeError

class mesycontrol.future.FutureObserver(the_future=None, parent=None)[source]

Bases: PyQt4.QtCore.QObject

Qt wrapper around a Future object using Qt signals to notify about state changes.

cancelled
done
future
get_future()[source]
progress_changed
progress_range_changed
progress_text_changed
set_future(the_future)[source]
exception mesycontrol.future.IncompleteFuture[source]

Bases: exceptions.RuntimeError

mesycontrol.future.all_done(*futures)[source]

Returns a future that completes once all of the given futures complete. The returned futures result will be a list of futures in order of completion.

mesycontrol.future.future_progress_dialog(cancelable=True)[source]
mesycontrol.future.progress_forwarder(source, dest)[source]
mesycontrol.future.set_exception_on(result_future)[source]
mesycontrol.future.set_result_on(result_future)[source]

gui Module

class mesycontrol.gui.GUIApplication(context, mainwindow)[source]

Bases: PyQt4.QtCore.QObject

GUI logic

TOOLBAR_FONT_SIZE = 10
TOOLBAR_ICON_SIZE = PyQt4.QtCore.QSize(12, 12)
active_subwindow()[source]
app_registry
device_registry
eventFilter(watched_object, event)[source]
get_linked_mode()[source]
get_mainwindow()[source]
linked_mode
mainwindow
quit()[source]

Non-blocking method to quit the application. Needs a running event loop.

set_linked_mode(linked_mode)[source]
mesycontrol.gui.extensions_to_ptree(extensions, device_profile)[source]
mesycontrol.gui.on_tree_state_changed(emitting_param, changes)[source]

gui_mainwindow Module

class mesycontrol.gui_mainwindow.MCMdiArea(parent=None)[source]

Bases: PyQt4.QtGui.QMdiArea

class mesycontrol.gui_mainwindow.MainWindow(context, parent=None)[source]

Bases: PyQt4.QtGui.QMainWindow

closeEvent(event)[source]
on_actionAbout_Qt_triggered()[source]
on_actionAbout_triggered()[source]
restore_settings()[source]
store_settings()[source]

gui_tutorial Module

class mesycontrol.gui_tutorial.TutorialTextBrowser(parent=None, **kwargs)[source]

Bases: PyQt4.QtGui.QTextBrowser

href_hover
mouseMoveEvent(event)[source]
class mesycontrol.gui_tutorial.TutorialWidget(gui_app, parent=None)[source]

Bases: PyQt4.QtGui.QWidget

class mesycontrol.gui_tutorial.UIFlasher(widget, flashcount=10, interval_ms=500, autostart=False, parent=None)[source]

Bases: PyQt4.QtCore.QObject

set_widget(widget, autostart=True)[source]
start()[source]
stop()[source]

gui_util Module

class mesycontrol.gui_util.DeviceNotesWidget(device, parent=None)[source]

Bases: PyQt4.QtGui.QWidget

ADD_PIXELS_PER_ROW = 5
DISPLAY_ROWS = 3
commit()[source]
get_plain_text()[source]
is_modified()[source]
class mesycontrol.gui_util.DeviceSubWindow(widget, window_name_prefix, parent=None, **kwargs)[source]

Bases: PyQt4.QtGui.QMdiSubWindow

device
display_mode
get_device()[source]
get_display_mode()[source]
get_linked_mode()[source]
get_toolbar()[source]
get_write_mode()[source]
has_combined_display()[source]
has_toolbar()[source]
linked_mode
set_display_mode(mode)[source]
set_linked_mode(linked_mode)[source]
set_write_mode(mode)[source]
update_title_and_name()[source]

Updates the window title and the object name taking into account the display_mode and the device state.

write_mode
class mesycontrol.gui_util.DeviceTableSubWindow(widget, parent=None)[source]

Bases: mesycontrol.gui_util.DeviceSubWindow

get_toolbar()[source]
has_combined_display()[source]
has_toolbar()[source]
class mesycontrol.gui_util.DeviceWidgetSubWindow(widget, parent=None)[source]

Bases: mesycontrol.gui_util.DeviceSubWindow

get_device()[source]
get_specialized_device()[source]
get_toolbar()[source]
has_combined_display()[source]
has_toolbar()[source]
class mesycontrol.gui_util.NotesTextEdit(parent=None)[source]

Bases: PyQt4.QtGui.QPlainTextEdit

mouseDoubleClickEvent(event)[source]
setReadOnly(ro)[source]
class mesycontrol.gui_util.ServerLogView(server_process, max_lines=10000, line_wrap=1, parent=None)[source]

Bases: PyQt4.QtGui.QPlainTextEdit

mesycontrol.gui_util.get_mrc(node)[source]
mesycontrol.gui_util.is_bus(node)[source]
mesycontrol.gui_util.is_config(node)[source]
mesycontrol.gui_util.is_device(node)[source]
mesycontrol.gui_util.is_device_cfg(node)[source]
mesycontrol.gui_util.is_device_hw(node)[source]
mesycontrol.gui_util.is_hardware(node)[source]
mesycontrol.gui_util.is_mrc(node)[source]
mesycontrol.gui_util.is_registry(node)[source]
mesycontrol.gui_util.is_setup(node)[source]
mesycontrol.gui_util.restore_subwindow_state(subwin, settings)[source]
mesycontrol.gui_util.run_add_device_config_dialog(device_registry, registry, mrc, bus=None, address=None, parent_widget=None)[source]
mesycontrol.gui_util.run_add_mrc_config_dialog(registry, parent_widget=None)[source]
mesycontrol.gui_util.run_add_mrc_connection_dialog(registry, parent_widget=None)[source]
mesycontrol.gui_util.run_close_setup(context, parent_widget)[source]
mesycontrol.gui_util.run_edit_device_config(device_registry, registry, device, parent_widget=None)[source]
mesycontrol.gui_util.run_edit_mrc_config(mrc, registry, parent_widget=None)[source]
mesycontrol.gui_util.run_load_device_config(device, context, parent_widget)[source]
mesycontrol.gui_util.run_open_setup_dialog(context, parent_widget)[source]
mesycontrol.gui_util.run_save_device_config(device, context, parent_widget)[source]
mesycontrol.gui_util.run_save_setup(context, parent_widget)[source]
mesycontrol.gui_util.run_save_setup_as_dialog(context, parent_widget)[source]
mesycontrol.gui_util.store_subwindow_state(subwin, settings)[source]

hardware_controller Module

class mesycontrol.hardware_controller.Controller(connection)[source]

Bases: object

Link between hardware_model.MRC and MRCConnection. Reacts to changes to the connection state and updates the hardware model accordingly. Also takes requests from the hardware model and forwards them to the connection.

acquire_write_access(force=False)[source]
add_poll_item(subscriber, bus, address, item)[source]

Add a poll subscription for the given (bus, address, item). Item may be a single parameter address or a tuple of (lower, upper) addresses to poll. The poll item is removed if the given subscriber is destroyed.

add_poll_items(subscriber, items)[source]
connect(timeout_ms=10000)[source]
disconnect()[source]
get_mrc()[source]
mrc
read_parameter(bus, device, address)[source]

Read the parameter at (bus, device address). Returns a basic_model.ResultFuture containing a basic_model.ReadResult instance on success.

release_write_access()[source]
remove_polling_subscriber(subscriber)[source]
scanbus(bus)[source]
set_mrc(mrc)[source]

Set the hardware_model.MRC instance this controller should work with.

set_parameter(bus, device, address, value)[source]

Set the parameter at (bus, device, address) to the given value. Returns a basic_model.ResultFuture containing a basic_model.SetResult instance on success.

set_rc(bus, device, on_off)[source]
set_silenced(silenced)[source]
exception mesycontrol.hardware_controller.ErrorResponse[source]

Bases: exceptions.RuntimeError

exception mesycontrol.hardware_controller.TimeoutError[source]

Bases: exceptions.RuntimeError

hardware_model Module

exception mesycontrol.hardware_model.AddressConflict[source]

Bases: exceptions.RuntimeError

class mesycontrol.hardware_model.Device(bus, address, idc, parent=None)[source]

Bases: mesycontrol.basic_model.Device

add_poll_item(subscriber, item)[source]

Add parameters that should be polled repeatedly. As long as the given subscriber object is alive and the device is connected, the given item will be polled. Item may be a single parameter address or a tuple of (lower, upper) addresses to poll. If the server and mrc support reading parameter ranges and a tuple is given, the read range command will be used.

add_poll_items(subscriber, items)[source]
address_conflict
address_conflict_changed
connected
connecting
connection_error

error object

controller
disconnected
get_controller()[source]
get_last_connection_error()[source]
get_rc()[source]
has_address_conflict()[source]
is_connected()[source]
is_connecting()[source]
is_disconnected()[source]
rc
rc_changed
remove_polling_subscriber(subscriber)[source]
set_address_conflict(conflict)[source]
set_rc(on_off)[source]

Sends a ON/OFF command to the MRC. On successful command execution the local RC flag is updated.

update_rc(rc)[source]

Updates the local RC flag of this device.

class mesycontrol.hardware_model.MRC(url, parent=None)[source]

Bases: mesycontrol.basic_model.MRC

acquire_write_access(force=False)[source]
add_device(device)[source]
address_conflict_changed
can_acquire_write_access()[source]
connect(timeout_ms=10000)[source]
connected
connecting

future object

connection
connection_error

error object

controller
disconnect()[source]
disconnected
get_connection()[source]
get_controller()[source]
get_status()[source]
has_write_access()[source]
is_connected()[source]
is_connecting()[source]
is_disconnected()[source]
is_silenced()[source]
read_parameter(bus, device, address)[source]
release_write_access()[source]
remove_device(device)[source]
scanbus(bus)[source]
set_connected()[source]
set_connecting(the_future)[source]
set_connection_error(error)[source]
set_controller(controller)[source]

Set the hardware controller this MRC should use. The MRC holds a strong reference to the controller.

set_disconnected()[source]
set_parameter(bus, device, address, value)[source]
set_silenced(silenced)[source]
set_status(status)[source]
set_write_access(has_write_access, can_acquire)[source]

Updates the local write access and can_acquire flags. Emits write_access_changed() if one of the two flags changed.

silenced
silenced_changed

is_silenced

status_changed

proto.MRCStatus

update_silenced(silenced)[source]
write_access
write_access_changed

has_write_access, can_acquire

hardware_tree_model Module

class mesycontrol.hardware_tree_model.BusNode(bus_number, parent=None)[source]

Bases: mesycontrol.basic_tree_model.BasicTreeNode

data(column, role)[source]
class mesycontrol.hardware_tree_model.DeviceNode(device, parent=None)[source]

Bases: mesycontrol.hardware_tree_model.HardwareTreeNode

data(column, role)[source]
flags(column)[source]
set_data(column, value, role)[source]
class mesycontrol.hardware_tree_model.HardwareTreeModel(device_registry, parent=None)[source]

Bases: mesycontrol.basic_tree_model.BasicTreeModel

columnCount(parent=<PyQt4.QtCore.QModelIndex object at 0x57139f0>)[source]
headerData(section, orientation, role=0)[source]
class mesycontrol.hardware_tree_model.HardwareTreeNode(ref, parent)[source]

Bases: mesycontrol.basic_tree_model.BasicTreeNode

class mesycontrol.hardware_tree_model.MRCNode(mrc, parent=None)[source]

Bases: mesycontrol.hardware_tree_model.HardwareTreeNode

data(column, role)[source]
class mesycontrol.hardware_tree_model.RegistryNode(registry, parent=None)[source]

Bases: mesycontrol.hardware_tree_model.HardwareTreeNode

data(column, role)[source]

hardware_util Module

mesycontrol.hardware_util.refresh_device_memory(devices)[source]

Refreshes the memory of the given devices using device.hw.read_parameter(). The set of parameters to (re-)read is the combination of the hardware profile parameters and the parameters already present in the devices memory cache.

log_view Module

class mesycontrol.log_view.LogView(max_lines=10000, line_wrap=1, parent=None)[source]

Bases: PyQt4.QtGui.QTextEdit

append(text, prepend_time=True)[source]
contextMenuEvent(event)[source]
handle_exception(exc_type, exc_value, exc_trace)[source]
handle_log_record(log_record)[source]

mc_treeview Module

class mesycontrol.mc_treeview.AutoPopupComboBox(parent=None)[source]

Bases: PyQt4.QtGui.QComboBox

QComboBox subclass which automatically shows its popup on receiving a non-spontaneous showEvent.

hidePopup()[source]
showEvent(event)[source]
class mesycontrol.mc_treeview.ConfigTreeView(parent=None)[source]

Bases: PyQt4.QtGui.QTreeView

class mesycontrol.mc_treeview.DoubleClickSplitter(orientation=1, parent=None)[source]

Bases: PyQt4.QtGui.QSplitter

QSplitter using DoubleClickSplitterHandles.

createHandle()[source]
class mesycontrol.mc_treeview.DoubleClickSplitterHandle(orientation, parent)[source]

Bases: PyQt4.QtGui.QSplitterHandle

Double click support for QSplitterHandle. Emits the doubleClicked signal if a double click occured on the handle and the mouse button is released within 200ms (if the mouse button is not released the user is most likely dragging the handle).

doubleClicked
mouseDoubleClickEvent(event)[source]
mouseReleaseEvent(event)[source]
sizeHint()[source]
class mesycontrol.mc_treeview.HardwareTreeView(parent=None)[source]

Bases: PyQt4.QtGui.QTreeView

class mesycontrol.mc_treeview.MCTreeDirector(app_registry, device_registry, linked_mode_on=False)[source]

Bases: object

cfg_idx_for_hw_idx(hw_idx)[source]
get_linked_mode()[source]
hw_idx_for_cfg_idx(cfg_idx)[source]
linked_mode
set_linked_mode(on_off)[source]
class mesycontrol.mc_treeview.MCTreeItemDelegate(tree_director, parent=None)[source]

Bases: PyQt4.QtGui.QStyledItemDelegate

createEditor(parent, options, idx)[source]
paint(painter, option, index)[source]
setEditorData(editor, idx)[source]
setModelData(editor, model, idx)[source]
class mesycontrol.mc_treeview.MCTreeView(app_registry, device_registry, linked_mode_on=False, parent=None)[source]

Bases: PyQt4.QtGui.QWidget

cfg_context_menu_requested

node, idx, position, view

cfg_idx_for_hw_idx(hw_idx)[source]
get_linked_mode()[source]
hw_context_menu_requested

node, idx, position, view

hw_idx_for_cfg_idx(cfg_idx)[source]
linked_mode
linked_mode_changed
node_activated
node_selected
select_config_node(node)[source]
select_config_node_by_ref(ref)[source]
select_hardware_node(node)[source]
select_hardware_node_by_ref(ref)[source]
select_node(node)[source]
set_linked_mode(on_off)[source]
mesycontrol.mc_treeview.find_insertion_index(items, test_fun)[source]

mesycontrol_pb2 Module

model_util Module

mesycontrol.model_util.add_mrc_connection(hardware_registry, url, do_connect, connect_timeout_ms=10000)[source]

Adds an MRC connection using the given url to the hardware_registry. If `do_connect’ is True this function will start a connection attempt and return the corresponding Future object. Otherwise the newly added MRC will be in disconnected state and None is returned.

mesycontrol.model_util.set_default_device_extensions(device, device_registry)[source]

mrc_connection Module

class mesycontrol.mrc_connection.AbstractConnection(parent=None)[source]

Bases: PyQt4.QtCore.QObject

connect()[source]
connected

connected and ready to send requests

connecting

Establishing the connection. The argument is a

connection_error

error object

disconnect()[source]
disconnected

disconnected; not ready to handle requests

error_message_received

Message

get_queue_size()[source]
get_url()[source]
is_connected()[source]
is_connecting()[source]
is_disconnected()[source]
message_received

Message

notification_received

Message

queue_empty
queue_request(request)[source]
queue_size_changed
request_queued

request, Future

request_sent

request, Future

response_received

request, response, Future

url
exception mesycontrol.mrc_connection.IsConnected[source]

Bases: exceptions.Exception

exception mesycontrol.mrc_connection.IsConnecting[source]

Bases: exceptions.Exception

class mesycontrol.mrc_connection.LocalMRCConnection(server_options={}, parent=None)[source]

Bases: mesycontrol.mrc_connection.AbstractConnection

connect()[source]
connect_delay_ms = 1000

delay between server startup and connection attempt

disconnect()[source]
get_queue_size()[source]
get_url()[source]
is_connected()[source]
is_connecting()[source]
queue_request(request)[source]
class mesycontrol.mrc_connection.MRCConnection(host, port, parent=None)[source]

Bases: mesycontrol.mrc_connection.AbstractConnection

connect()[source]
disconnect()[source]
get_queue_size()[source]
get_url()[source]
is_connected()[source]
is_connecting()[source]
queue_request(request)[source]
mesycontrol.mrc_connection.factory(**kwargs)[source]

Connection factory. Supported keyword arguments in order of priority:

  • config: MRCConnectionConfig instance specifying the details of the connection.
  • url: A string that is passed to util.parse_connection_url(). The resulting dictionary will then be used to create the connection.
  • mc_host, mc_port: Creates a MRCConnection to the given host and port.
  • serial_port, baud_rate: Creates a LocalMRCConnection using the given serial port and baud rate.
  • host, port: Creates a LocalMRCConnection connecting to the MRC on the given host and port.

Additionally ‘parent’ may specify a parent QObject for the resulting connection.

parameter_binding Module

class mesycontrol.parameter_binding.AbstractParameterBinding(device, profile, target, display_mode, write_mode=None, fixed_modes=False, **kwargs)[source]

Bases: object

add_update_callback(method_or_func, *args, **kwargs)[source]

Adds a callback to be invoked when this binding updates its target.

The callback will be called with the result_future that caused the update as its first argument and the optional args and kwargs as the following arguments.

If the given method_or_func is a bound method a weak reference to the corresponding object will be stored. This way the parameter binding won’t keep any objects alive just because they’re registered as a callback.

http://stackoverflow.com/questions/1673483/how-to-store-callback-methods

address
device
display_mode
get_address()[source]
get_device()[source]
get_display_mode()[source]
get_read_address()[source]
get_read_profile()[source]
get_write_address()[source]
get_write_mode()[source]
get_write_profile()[source]
has_rw_profile()[source]
populate()[source]

Gets the value of this bindings parameter and updates the target display once the value is retrieved.

read_address
read_profile
set_display_mode(mode)[source]
set_write_mode(mode)[source]
write_address
write_mode
write_profile
class mesycontrol.parameter_binding.CheckBoxParameterBinding(**kwargs)[source]

Bases: mesycontrol.parameter_binding.DefaultParameterBinding

class mesycontrol.parameter_binding.ComboBoxParameterBinding(**kwargs)[source]

Bases: mesycontrol.parameter_binding.DefaultParameterBinding

class mesycontrol.parameter_binding.DefaultParameterBinding(**kwargs)[source]

Bases: mesycontrol.parameter_binding.AbstractParameterBinding

class mesycontrol.parameter_binding.DoubleSpinBoxParameterBinding(unit_name, **kwargs)[source]

Bases: mesycontrol.parameter_binding.DefaultParameterBinding

class mesycontrol.parameter_binding.Factory[source]

Bases: object

append_classinfo_binding(target_classinfo, binding_class)[source]
append_predicate_binding(predicate, binding_class)[source]
get_binding_class(target_object)[source]
insert_classinfo_binding(idx, target_classinfo, binding_class)[source]
insert_predicate_binding(idx, predicate, binding_class)[source]
make_binding(**kwargs)[source]
class mesycontrol.parameter_binding.LCDNumberParameterBinding(unit_name=None, precision=2, **kwargs)[source]

Bases: mesycontrol.parameter_binding.DefaultParameterBinding

class mesycontrol.parameter_binding.LabelParameterBinding(unit_name, prec=2, **kwargs)[source]

Bases: mesycontrol.parameter_binding.DefaultParameterBinding

exception mesycontrol.parameter_binding.ParameterUnavailable(*args, **kwargs)[source]

Bases: exceptions.Exception

class mesycontrol.parameter_binding.RadioButtonGroupParameterBinding(**kwargs)[source]

Bases: mesycontrol.parameter_binding.DefaultParameterBinding

static predicate(target)[source]
class mesycontrol.parameter_binding.ReadWriteProfile[source]

Bases: mesycontrol.parameter_binding.ReadWriteProfile

get_range()[source]
get_unit(unit_name)[source]
get_units()[source]
range
units
class mesycontrol.parameter_binding.SliderParameterBinding(unit_name=None, update_on='value_changed', **kwargs)[source]

Bases: mesycontrol.parameter_binding.DefaultParameterBinding

class mesycontrol.parameter_binding.SpinBoxEditingObserver(the_binding, parent=None)[source]

Bases: PyQt4.QtCore.QObject

eventFilter(obj, event)[source]
class mesycontrol.parameter_binding.SpinBoxParameterBinding(**kwargs)[source]

Bases: mesycontrol.parameter_binding.DefaultParameterBinding

class mesycontrol.parameter_binding.TargetlessParameterBinding(**kwargs)[source]

Bases: mesycontrol.parameter_binding.AbstractParameterBinding

Usefull if there’s no target widget but the add_update_callback() functionality is needed.

set_display_mode(mode)[source]
set_write_mode(mode)[source]

proto Module

exception mesycontrol.proto.MessageError(message=None, request=None, text='', *args)[source]

Bases: exceptions.RuntimeError

mesycontrol.proto.is_error_response(msg)[source]
mesycontrol.proto.is_notification(msg)[source]
mesycontrol.proto.is_request(msg)[source]
mesycontrol.proto.is_response(msg)[source]

qt Module

resources Module

mesycontrol.resources.qCleanupResources()[source]
mesycontrol.resources.qInitResources()[source]

server_process Module

mesycontrol.server_process.BASE_PORT = 23000

The default port to listen on

mesycontrol.server_process.MAX_PORT = 65535

The maximum port number.

exception mesycontrol.server_process.ServerError[source]

Bases: exceptions.Exception

exception mesycontrol.server_process.ServerIsRunning[source]

Bases: mesycontrol.server_process.ServerError

exception mesycontrol.server_process.ServerIsStarting[source]

Bases: mesycontrol.server_process.ServerError

exception mesycontrol.server_process.ServerIsStopped[source]

Bases: mesycontrol.server_process.ServerError

exception mesycontrol.server_process.ServerIsStopping[source]

Bases: mesycontrol.server_process.ServerError

class mesycontrol.server_process.ServerProcess(binary='mesycontrol_server', listen_address='127.0.0.1', listen_port=23000, serial_port=None, baud_rate=0, tcp_host=None, tcp_port=4001, verbosity=0, output_buffer_maxlen=10000, parent=None)[source]

Bases: PyQt4.QtCore.QObject

error
exit_code()[source]
static exit_code_string(code)[source]
exit_codes = {0: 'exit_success', 1: 'exit_options_error', 2: 'exit_address_in_use', 3: 'exit_address_not_available', 4: 'exit_permission_denied', 5: 'exit_bad_listen_address', 127: 'exit_unknown_error'}
finished

exit_status, exit_code, exit_code_string

is_running()[source]
is_starting()[source]
kill()[source]
output
start()[source]
started
startup_delay_ms = 200
stop(kill=False)[source]
stopped
class mesycontrol.server_process.ServerProcessPool(parent=None)[source]

Bases: PyQt4.QtCore.QObject

Keeps track of running ServerProcesses and the listen ports they use.

create_process(options={}, parent=None)[source]
mesycontrol.server_process.get_exit_code_string(exit_code)[source]

specialized_device Module

class mesycontrol.specialized_device.DeviceBase(app_device, read_mode, write_mode, parent=None)[source]

Bases: PyQt4.QtCore.QObject

Acts as a decorator for an app_model.Device. Should be subclassed to create device specific classes, e.g. class MHV4(DeviceBase).

cfg_idc_changed
cfg_module_changed
cfg_profile_changed
config_applied_changed
config_set

self, old, new

extension_changed
get_cfg_parameter(address_or_name)[source]
get_display_string()[source]
get_extension(name)[source]
get_extensions()[source]
get_hw_parameter(address_or_name)[source]
get_module()[source]
get_parameter(address_or_name)[source]
get_profile()[source]
get_read_mode()[source]
get_write_mode()[source]
hardware_set

self, old, new

hw_idc_changed
hw_module_changed
hw_profile_changed
idc_changed
idc_conflict
idc_conflict_changed
module
module_changed
mrc_changed
parameter_changed
profile
profile_changed
read_cfg_parameter(address_or_name)[source]
read_hw_parameter(address_or_name)[source]
read_mode
read_mode_changed
set_cfg_parameter(address_or_name, value)[source]
set_extension(name, value)[source]
set_hw_parameter(address_or_name, value)[source]
set_parameter(address_or_name, value)[source]
set_read_mode(mode)[source]
set_write_mode(mode)[source]
write_mode
write_mode_changed
class mesycontrol.specialized_device.DeviceWidgetBase(specialized_device, display_mode, write_mode, parent=None)[source]

Bases: PyQt4.QtGui.QWidget

Base class for device specific widgets.

clear_parameter_bindings()[source]
closeEvent(event)[source]
display_mode
display_mode_changed
event(e)[source]
get_display_mode()[source]
get_parameter_bindings()[source]
get_toolbar()[source]
get_write_mode()[source]
hardware_connected_changed
has_toolbar()[source]
notes_visible()[source]
set_display_mode(display_mode)[source]
set_notes_visible(visible)[source]
set_write_mode(write_mode)[source]
showEvent(event)[source]
write_mode
write_mode_changed

tcp_client Module

class mesycontrol.tcp_client.MCTCPClient(parent=None)[source]

Bases: PyQt4.QtCore.QObject

Mesycontrol TCP client

connect(host, port)[source]

Connect to the given host and port. Returns a Future that fullfills once the connection has been established or an errors occurs. Disconnects if the client currently is connected.

connected
connecting
disconnect()[source]

Disconnect. Returns a Future that fullfills once the connection has been disconnected or an error occurs.

disconnected
error_received

Message

get_host()[source]
get_port()[source]
get_queue_size()[source]
host
is_busy()[source]
is_connected()[source]

True if connected, False otherwise.

is_connecting()[source]
is_disconnected()[source]
is_idle()[source]
message_received

Message

notification_received

Message

port
queue_empty
queue_request(request)[source]

Adds the given request to the outgoing queue. Returns a Future that fullfills once a response is received or an error occurs.

queue_size_changed
request_queued

request, Future

request_sent

request, Future

response_received

request, response, Future

socket_error

instance of SocketError

class mesycontrol.tcp_client.RequestResult

Bases: tuple

RequestResult(request, response)

request

Alias for field number 0

response

Alias for field number 1

util Module

class mesycontrol.util.AnyValue[source]

Bases: object

class mesycontrol.util.CallbackHandler[source]

Bases: logging.Handler

Logging handler passing log_records to callbacks.

add_callback(callback)[source]
emit(log_record)[source]
get_callbacks()[source]
remove_callback(callback)[source]
class mesycontrol.util.ChannelGroupHelper(num_channels, num_groups)[source]

Bases: object

channel_to_group(channel_num)[source]
channels_per_group()[source]
group_channel_range(group_num)[source]
class mesycontrol.util.DelayedDoubleSpinBox(parent=None, delay=0.5)[source]

Bases: PyQt4.QtGui.QDoubleSpinBox

blockSignals(b)[source]
delayed_valueChanged
setValue(value)[source]
class mesycontrol.util.DelayedSpinBox(delay=0.5, parent=None)[source]

Bases: PyQt4.QtGui.QSpinBox

delayed_valueChanged
exception mesycontrol.util.Disconnected[source]

Bases: exceptions.Exception

class mesycontrol.util.ExceptionHookRegistry[source]

Bases: object

Exception handler registry for use with sys.excepthook. Contains a list of handler objects which will get called in the order they where registered when an exception occurs.

get_handlers()[source]
register_handler(handler)[source]
unregister_handler(handler)[source]
class mesycontrol.util.FixedWidthVerticalToolBar(parent=None)[source]

Bases: PyQt4.QtGui.QWidget

Like a vertical QToolBar but having a fixed width. I did not manage to get a QToolBar to have a fixed width. That’s the only reason this class exists.

addAction(action)[source]
class mesycontrol.util.GarbageCollector(parent=None, debug=False)[source]

Bases: PyQt4.QtCore.QObject

Disable automatic garbage collection and instead collect manually every INTERVAL milliseconds.

This is done to ensure that garbage collection only happens in the GUI thread, as otherwise Qt can crash.

INTERVAL = 1000
check()[source]
debug_cycles()[source]
class mesycontrol.util.HasExceptionFilter[source]

Bases: object

filter(log_record)[source]
class mesycontrol.util.MinimumLevelFilter(minimum_level)[source]

Bases: object

Log records with a level greater or equal to minimum_level will pass through this filter.

filter(log_record)[source]
class mesycontrol.util.OrderedSet(iterable=None)[source]

Bases: _abcoll.MutableSet

add(key)[source]
discard(key)[source]
pop(last=True)[source]
class mesycontrol.util.QtLoggingBridge(parent=None)[source]

Bases: PyQt4.QtCore.QObject

log_record
class mesycontrol.util.ReadOnlyCheckBox(*args, **kwargs)[source]

Bases: PyQt4.QtGui.QCheckBox

mousePressEvent(event)[source]
mouseReleaseEvent(event)[source]
class mesycontrol.util.SimpleToolBar(orientation=1, parent=None)[source]

Bases: PyQt4.QtGui.QWidget

addAction(action)[source]
addWidget(widget)[source]
exception mesycontrol.util.SocketError(error_code, error_string)[source]

Bases: exceptions.Exception

exception mesycontrol.util.URLParseError[source]

Bases: exceptions.Exception

mesycontrol.util.block_signals(*args, **kwds)[source]
mesycontrol.util.build_connection_url(serial_port=None, baud_rate=0, host=None, port=4001, mc_host=None, mc_port=23000)[source]
mesycontrol.util.display_url(url)[source]
mesycontrol.util.hline(parent=None)[source]
mesycontrol.util.list_serial_ports(type_mask=3)[source]
mesycontrol.util.list_serial_ports_linux(type_mask)[source]
mesycontrol.util.list_serial_ports_windows(type_mask)[source]

Uses the Win32 registry to return an iterator of serial (COM) ports existing on this computer. Source: http://eli.thegreenplace.net/2009/07/31/listing-all-serial-ports-on-windows-with-python/

mesycontrol.util.loadUi(filename, baseinstance=None)[source]

This version of PyQts uic.loadUi() adds support for loading from resource files.

mesycontrol.util.make_apply_common_button_layout(input_spinbox, tooltip, on_clicked)[source]
mesycontrol.util.make_icon(source)[source]
mesycontrol.util.make_logging_source_adapter(module_name, object_instance)[source]
mesycontrol.util.make_spinbox(min_value=None, max_value=None, value=None, limits=None, prefix=None, suffix=None, single_step=None, parent=None)[source]
mesycontrol.util.make_standard_icon(icon, option=None, widget=None)[source]
mesycontrol.util.make_title_label(title)[source]
mesycontrol.util.mrc_urls_match(url1, url2)[source]
mesycontrol.util.parse_connection_url(url)[source]

Parses the given connection URL. Returns a dictionary ready to be passed to mrc_connection.factory() to create a connection instance. Supported URL formats: - For serial connections:

<serial_port>@<baud> serial://<serial_port>[@<baud=9600>]
  • For TCP connections (serial server connected to an MRC1):

    <host>:<port> tcp://<host>[:<port=4001>]

  • For connections to a mesycontrol server:

    mc://<host>[:<port=23000>]

mesycontrol.util.vline(parent=None)[source]
mesycontrol.util.wait_for_signal(signal, expected_args=None, timeout_ms=0, emitting_callable=None)[source]

Uses a local Qt event loop to wait for the given signal to arrive.

expected_args specifies which arguments are expected once the signal is emitted. If expected_args is None any arguments are valid. To specify a placeholder argument use the AnyValue class above (put the class directly into the argument sequence, don’t instantiate it).

timeout_ms gives the maximum time in milliseconds to wait for the signal. If 0 this function will wait forever.

emitting_callable can be used to pass a callable object to the function. This callable will be invoked from within the internal event loop. This is neccessary to avoid missing signals connected via Qt’s direct connection mechanism (the signal would arrive before the event loop was started and thus it would be missed completely).

The return value is True if the signal arrived within the given timeout and with the correct arguments. Otherwise False is returned.

mesycontrol.util.which(program)[source]