ratbag package
Subpackages
Submodules
ratbag.driver module
ratbag.emulator module
ratbag.hid module
ratbag.parser module
A Parser helper function to convert a byte array to a Python object and the
other way around. The conversion is specified in a list of Spec
instances, for example:
>>> data = bytes(range(16))
>>> spec = [
... Spec("B", "zero"),
... Spec("B", "first"),
... Spec("H", "second", endian="BE"),
... Spec("H", "third", endian="le"),
... Spec("BB", "tuples", repeat=5)
... ]
...
>>> result = Parser.to_object(data, spec)
>>> assert result.size == len(data)
>>> assert result.object.zero == 0
>>> assert result.object.first == 0x1
>>> assert result.object.second == 0x0203
>>> assert result.object.third == 0x0504 # little endian
>>> assert result.object.tuples == [(6, 7), (8, 9), (10, 11), (12, 13), (14, 15)]
And likewise, an object can be turned into a bytearray:
>>> new_data = Parser.from_object(result.object, spec)
>>> assert new_data == data
See the Spec documentation for details on the format.
- class ratbag.parser.Spec(format, name, endian='BE', repeat=1, greedy=False, convert_from_data=None, convert_to_data=None)
Bases:
objectThe format specification for a single logical in a data set. This is used in
Parser.to_object()orParser.from_object()to convert from or to a byte stream. For example:Spec("B", "myattr")is a single byte from/to an object’smyattrpropertySpec("BB", "point")is a tuple of two bytes from/to an object’smyattrproperty
See
Parser.to_object()andParser.from_object()for details.- class ConverterArg(bytes, value, index)
Bases:
objectThe argument passed to
convert_to_data- bytes: _CountingAttr(counter=74, _default=NOTHING, repr=True, eq=True, order=True, hash=None, init=True, metadata={})
- value: Any
- index: int
- format: str
The format, must be compatible to Python’s
structformat specifiers, excluding the endian prefixes. If the format contains more than one element, the respective object attribute is a tuple.With the exception of fixed-length strings (
4sfor a 4-byte string) this format must not contain any repeat specifiers. Use therepeatattribute instead. IOW:>>> Spec("3s", "string") # One 3-byte string >>> Spec("s", "string", repeat=3) # Three 1-byte strings >>> Spec("3H", "foo") # Not permitted
- name: str
The name to assign to the resulting object attribute.
- endian: str
Endianess of the field, one of
"BE"or"le".
- repeat: int
The number of times this field repeats in struct. Where repeat is greater than 1, the resulting attribute is a list with
repeatelements (each element may be tuple, seeformat).
- greedy: bool
If true,
repeatis ignored and the current field repeats until the remainder of the available data. This takes the current format spec into account. For example, a HH tuple has 4 bytes and will repeat 5 times in a data size 20.If the data size is not a multiple of the current format size, the remainder is silently skipped:
>>> spec = Spec("H", "foo", greedy=True) >>> data = Parser.to_object(bytes(5), spec) >>> assert data.object.size == 4
- convert_from_data: Optional[Callable[[Any], Any]]
Conversion function for the data. An example for converting a sequence of bytes to a string:
>>> spec = Spec("B", "foo", repeat=3, convert_from_data=lambda s: bytes(s).decode("utf-8")) # Or alternatively use the string length format: >>> spec = Spec("3s", "foo", convert_from_data=lambda s: s.decode("utf-8")) >>> data = Parser.to_object("bar".encode("utf-8"), spec) >>> assert data.object.foo == "bar"
Note that the conversion happens once all
repeathave been completed, i.e. the input value forrepeat > 1is a list.
- convert_to_data: Optional[Callable[[ConverterArg], Any]]
Conversion function of this attribute to data. This function takes the data bytes produced so far by
Parser.from_object()and the current value and index (if applicable). It must return a value compatible to the format specifier. Specifically:if
formatspecifies more than one type, the return value must be a tupleif
repeatis greater than 1, the return value must be a list ofrepeatelements. Note that this function is called once per element the list, with the data argument updated accordingly.
An example for producing a checksum with
some_crc():>>> specs = [] # other fields >>> checksum_spec("H", "checksum", convert_to_data=lambda bs, v, idx: some_crc(bs)) >>> data = Parser.from_object(myobj, specs + checksum_spec) >>> assert data[-2:] == some_crc(data[:-2])
- class ratbag.parser.Result(object, size)
Bases:
objectThe return value from
Parser.to_object()- object: Any
The object passed to
Parser.to_object()or otherwise an unspecified instance with all attribute names as requested by the parser spec.
- size: int
The number of bytes used to create this object
- class ratbag.parser.Parser
Bases:
object- classmethod to_object(data, specs, obj=None, result_class='Result')
Convert the given data into an object according to the specs. If
objis notNone, the attributes are set on that object (resetting any attributes of the same name already set on the object). Otherwise, a new generic object is created with all attributes as specified in the parser specs.The
result_classspecifies either the type of class to instantiate, or the name of the created class for this object.>>> specs = [Spec("B", "field")] >>> r = Parser.to_object(bytes(16), specs, result_class = "Foo") >>> print(type(r.object).__name__) Foo >>> class Bar: ... def __init__(self, field): ... pass >>> r = Parser.to_object(bytes(16), specs, result_class = Bar) >>> assert isinstance(r.object, Bar)
Where an existing type is used, that type must take all Spec fields as keyword arguments in the constructor, except:
Spec names with a single leading underscore are expected to drop that underscore in the constructor.
Spec names with a double leading underscore are ignored
- Return type
Any
- classmethod from_object(obj, specs, pad_to=0)
Convert the attributes on the given objects to a byte array, given the specifications (in-order). This is the inverse of
Parser.to_object().Note that each attribute must exist on the object and have the format compatible by its respective spec. For example, a
Specwitha format
"BB"must be a tuple of 2 bytesa format
"H"with arepeatof 5 must be a list of five 16-bit integers,a format
"HB"with arepeatof 3 must be a list of three tuples with a 16-bit integer and byte each
- Return type
bytes
ratbag.recorder module
- class ratbag.recorder.YamlDeviceRecorder(filename, info)
Bases:
RecorderA simple recorder that logs the data to/from the device as a series of YAML objects. All elements in config are logged as attributes.
The output of this logger can be consumed by
ratbag.emulator.YamlDevice.Example output:
logger: YAMLDeviceRecorder attributes: - { name: name, type: str, value: the device name } - { name: path, type: str: value: /dev/hidraw0 } - { name: report_descriptor, type: bytes, value: [1, 2, 3] } data: - tx: [ 16, 255, 0, 24, 0, 0, 0] # 10 ff 00 18 00 00 00 - rx: [ 17, 255, 0, 24, 4, 2, 0, 0, # 11 ff 00 18 04 02 00 00 0, 0, 0, 0, 0, 0, 0, 0, # 00 00 00 00 00 00 00 00 0, 0, 0, 0] # 00 00 00 00
- Parameters
config – a dictionary with attributes to log
- info: Dict
- last_timestamp: datetime
- last_ts_default()
- classmethod create_in_blackbox(blackbox, filename, info={})
- Return type
- start()
- Return type
None
- log_rx(data)
Log data received from the device
- Return type
None
- log_tx(data)
Log data sent to the device
- Return type
None
- log_ioctl_tx(ioctl_name, data)
- Return type
None
- log_ioctl_rx(ioctl_name, data)
- Return type
None
ratbag.util module
- ratbag.util.as_hex(bs)
Convert the bytes
bsto a"ab 12 cd 34"string.>>> as_hex(bytes([1, 2, 3])) '01 02 03'
- Return type
str
- ratbag.util.ffs(x)
- Return type
int
- ratbag.util.add_to_sparse_tuple(tpl, index, new_value)
Return a new tuple based on tpl with new_value added at the given index. The tuple is either expanded with
Nonevalues to match the new size required or the value is replaced.>>> t = add_to_sparse_tuple(('a', 'b'), 5, 'f') >>> print(t) ('a', 'b', None, None, None, 'f') >>> t = add_to_sparse_tuple(t, 3, 'd') >>> print(t) ('a', 'b', None, 'd', None, 'f') This function does not replace existing values in the tuple. :: >>> t = add_to_sparse_tuple(('a', 'b'), 0, 'A') Traceback (most recent call last): ... AssertionError
- Return type
Tuple
- ratbag.util.find_hidraw_devices()
- Return type
List[str]- Returns
a list of local hidraw device paths
["/dev/hidraw0", "/dev/hidraw1"]
- class ratbag.util.DataFile(name, matches, driver, driver_options=NOTHING)
Bases:
object- name: str
- matches: List[str]
- driver: str
- driver_options: Dict[str, str]
- classmethod from_config_parser(parser)
- ratbag.util.load_data_files()
- Return type
List[DataFile]- Returns
a list of
configparser.ConfigParserobjects
- ratbag.util.to_tuple(x)
- Return type
Tuple
- ratbag.util.to_sorted_tuple(x)
- Return type
Tuple
Module contents
- exception ratbag.ConfigError(message)
Bases:
ExceptionError indicating that the caller has tried to set the device’s configuration to an unsupported value, format, or feature.
This error is recoverable by re-reading the device’s current state and attempting a different configuration.
- message: str
The error message to display
- class ratbag.Ratbag(blackbox=None)
Bases:
ObjectAn instance managing one or more ratbag devices. This is the entry point for all ratbag clients. This context loads the data files and instantiates the drivers accordingly.
Example:
r = ratbag.Ratbag() r.connect("device-added", lambda ratbag, device: print(f"New device: {device}")) r.start() GLib.MainLoop().run()
ratbag.Ratbagrequires a GLib mainloop.- Parameters
config – a dictionary with configuration information
load_data_files –
Trueif the data files should be loaded. There is rarely a need for setting this toFalseoutside specific test cases.
GObject Signals:
device-addedNotification that a newratbag.Devicewas addeddevice-removedNotification that theratbag.Devicewas removed
- classmethod create_empty(blackbox)
Create an “empty” instance of ratbag that does not load any drivers and thus will not detect devices. The caller is responsible for adding drivers.
This is used for testing only, use
Ratbag.create()instead.- Return type
- device_added
GObject signal emitted when a new
ratbag.Devicewas added
- add_driver(drivername, supported_devices)
Add the given driver name. This API exists primarily to support testing and niche features, there is rarely a need for calling this function. Drivers are handled automatically for known devices.
- Parameters
drivername – The string name of the driver to load
supported_devices – A list of
ratbag.driver.DeviceConfiginstances with the devices supported by this driver.
- Raises
ratbag.driver.DriverUnavailable –
- start()
Start the context. Before invoking this function ensure the caller has connected to all the signals.
- Return type
None
- do_device_added(*args)
GObject signal emitted when a new
ratbag.Devicewas added
- class ratbag.Blackbox(directory=NOTHING)
Bases:
objectThe manager class for any recorders active in this session.
The default recordings directory is
$XDG_STATE_HOME/ratbag/recordings/$timestamp.- directory: Path
- add_recorder(recorder)
- make_path(filename)
Return a path for
filenamethat is within this blackbox’ recordings directory.- Return type
Path
- static default_recordings_directory()
- class ratbag.Recorder
Bases:
ObjectRecorder can be added to a
ratbag.Driverto log data between the host and the device, seeratbag.Driver.add_recorder()- Parameters
config – A dictionary with logger-specific data to initialize
- log_rx(data)
Log data received from the device
- Return type
None
- log_tx(data)
Log data sent to the device
- Return type
None
- class ratbag.CommitTransaction(device)
Bases:
ObjectA helper object for
Device.commit(). This object keeps track of a current commit transaction and emits thefinishedsignal once the driver has completed the transaction.>>> device = None # should be a device though... >>> t = CommitTransaction.create(device) >>> def on_finished(transaction): ... print(f"Device {transaction.device} is done") >>> signal_number = t.connect("finished", on_finished) >>> t.commit()
A transaction object can only be used once.
- classmethod create(device)
- Return type
- finished
GObject signal sent when the transaction is complete.
- property seqno: int
The unique sequence number for this transaction. This can be used to compare transactions.
- Return type
int
- property used: bool
True if the transaction has been used in
Device.commit()(even if the transaction is not yet complete).- Return type
bool
- property success: bool
Returns
Trueon success. This property isFalseuntil the transaction is complete.- Return type
bool
- property is_finished: bool
- Return type
bool
- commit()
- complete(success)
Complete this transaction with the given success status.
- do_finished(*args)
GObject signal sent when the transaction is complete.
- class ratbag.Device(driver, path, name, model='', firmware_version='')
Bases:
ObjectA device as exposed to Ratbag clients. A driver implementation must not expose a
ratbag.Deviceuntil it is fully setup and ready to be accessed by the client. Usually this means not sending theratbag.Driver::device-addedsignal until the device is finalized.GObject Signals:
disconnected: this device has been disconnectedcommit: commit the current state to the physical device. This signal is used by drivers.resync: callers should re-sync the state of the device
- driver: ratbag.driver.Driver
- path: str
- name: str
The device name as advertised by the kernel
- model: str
The device model, a more precise identifier (where available)
- firmware_version: str
A device-specific string with the firmware version, or the empty string. For devices with a major/minor or purely numeric firmware version, the conversion into a string is implementation-defined.
- classmethod create(driver, path, name, **kwargs)
- disconnected
GObject signal emitted when the device was disconnected
- resync
GObject signal emitted when the device state has changed and the caller should update its internal state from the device.
This signal carries a single integer that is the
CommitTransaction.seqno()for the corresponding transaction.
- property profiles: Tuple[Profile, ...]
The tuple of device profiles, in-order sorted by profile index.
- Return type
Tuple[Profile,...]
- commit(transaction)
Write the current changes to the driver. This is an asynchronous operation (maybe in a separate thread). Once complete, the given transaction object will emit the
finishedsignal.You should not call this function directly, use
CommitTransaction.commit()instead:>>> device = None # should be a device though... >>> t = CommitTransaction.create(device) >>> def on_finished(transaction): ... print(f"Device {transaction.device} is done") >>> signal_number = t.connect("finished", on_finished) >>> t.commit()
The
dirtystatus of the device’s features is reset toFalseimmediately before the callback is invoked but not before the driver handles the state changes. In other words, a caller must not rely on thedirtystatus betweencommit()and the callback.If an error occurs, the driver calls the callback with a
False.If any device state changes in response to
commit(), the driver emits aresyncsignal to notify all other listeners. This signal includes the same sequence number as the transaction to allow for filtering signals.- Returns
a sequence number for this transaction
- dirty
Trueif changes are uncommited. Connect tonotify::dirtyto receive changes.
- as_dict()
Returns this device as a dictionary that can e.g. be printed as YAML or JSON.
- Return type
Dict[str,Any]
- do_commit(*args)
GObject signal emitted when the device was disconnected. This signal is for internal use only.
Name clash with
commit()
- do_disconnected(*args)
GObject signal emitted when the device was disconnected
- do_get_property(pspec)
- do_resync(*args)
GObject signal emitted when the device state has changed and the caller should update its internal state from the device.
This signal carries a single integer that is the
CommitTransaction.seqno()for the corresponding transaction.
- do_set_property(pspec, value)
- class ratbag.Feature(device, index)
Bases:
ObjectBase class for all device features, including profiles. This is a convenience class only to avoid re-implementation of common properties.
- index_validator(attribute, value)
- property index: int
The 0-based device index of this feature. Indices are counted from the parent feature up, i.e. the first resolution of a profile 1 is resolution 0, the first resolution of profile 2 also has an index of 0.
- Return type
int
- dirty
Trueif changes are uncommited. Connect tonotify::dirtyto receive changes.
- do_get_property(pspec)
- do_set_property(pspec, value)
- class ratbag.Profile(device, index, name=NOTHING, report_rate=None, active=False, enabled=True, default=False, capabilities=NOTHING, buttons=NOTHING, resolutions=NOTHING, leds=NOTHING, report_rates=NOTHING)
Bases:
FeatureA profile on the device. A device must have at least one profile, the number of available proviles is device-specific.
Only one profile may be active at any time. When the active profile changes, the
activesignal is emitted for the previously active profile with a boolean false value, then theactivesignal is emitted on the newly active profile.- class Capability(value)
Bases:
IntEnumCapabilities specific to profiles.
- SET_DEFAULT = 101
This profile can be set as the default profile. The default profile is the one used immediately after the device has been plugged in. If this capability is missing, the device typically picks either the last-used profile or the first available profile.
- DISABLE = 102
The profile can be disabled and enabled. Profiles are not immediately deleted after being disabled, it is not guaranteed that the device will remember any disabled profiles the next time ratbag runs. Furthermore, the order of profiles may get changed the next time ratbag runs if profiles are disabled.
Note that this capability only notes the general capability. A specific profile may still fail to be disabled, e.g. when it is the last enabled profile on the device.
- WRITE_ONLY = 103
The profile information cannot be queried from the hardware. Where this capability is present, libratbag cannot query the device for its current configuration and the configured resolutions and button mappings are unknown. libratbag will still provide information about the structure of the device such as the number of buttons and resolutions. Clients that encounter a device without this resolution are encouraged to upload a configuration stored on-disk to the device to reset the device to a known state.
Any changes uploaded to the device will be cached in libratbag, once a client has sent a full configuration to the device libratbag can be used to query the device as normal.
- INDIVIDUAL_REPORT_RATE = 104
The report rate applies per-profile. On devices without this capability changing the report rate on one profile also changes it on all other profiles.
- name: str
- classmethod create(device, index, **kwargs)
- property buttons: Tuple[Button, ...]
The tuple of
Buttonthat are available in this profile- Return type
Tuple[Button,...]
- property resolutions: Tuple[Resolution, ...]
The tuple of
Resolutionthat are available in this profile- Return type
Tuple[Resolution,...]
- property leds: Tuple[Led, ...]
The tuple of
Ledthat are available in this profile- Return type
Tuple[Led,...]
- report_rate
The report rate in Hz. If the profile does not support configurable (or queryable) report rates, the report rate is always
None
- set_report_rate(rate)
Set the report rate for this profile.
- Raises
ConfigError
- Return type
None
- property report_rates: Tuple[int, ...]
The tuple of supported report rates in Hz. If the device does not support configurable report rates, the tuple is the empty tuple
- Return type
Tuple[int,...]
- property capabilities: Tuple[Capability, ...]
Return the tuple of supported
Profile.Capability- Return type
Tuple[Capability,...]
- enabled
Trueif this profile is enabled.
- set_enabled(enabled)
- Return type
None
- active
Trueif this profile is active,Falseotherwise. Note that only one profile at a time can be active. Seeset_active().
- set_active()
Set this profile to be the active profile.
- Return type
None
- default
Trueif this profile is the default profile,Falseotherwise. Note that only one profile at a time can be the default. Seeset_default().
- set_default()
Set this profile as the default profile.
- Raises
ConfigError
- Return type
None
- as_dict()
Returns this profile as a dictionary that can e.g. be printed as YAML or JSON.
- Return type
Dict[str,Any]
- do_get_property(pspec)
- do_set_property(pspec, value)
- class ratbag.Resolution(device, index, profile, dpi, *, active=False, enabled=True, default=False, capabilities=NOTHING, dpi_list=NOTHING)
Bases:
FeatureA resolution within a profile. A device must have at least one profile, the number of available proviles is device-specific.
Only one resolution may be active at any time. When the active resolution changes, the
notify::activesignal is emitted for the previously active resolution with a boolean false value, then thenotify::activesignal is emitted on the newly active resolution.- class Capability(value)
Bases:
IntEnumCapabilities specific to resolutions.
- SEPARATE_XY_RESOLUTION = 1
The device can adjust x and y resolution independently. If this capability is not present, the arguments to
set_dpi()must be a tuple of identical values.
- classmethod create(profile, index, dpi, **kwargs)
- property capabilities: Tuple[Capability, ...]
Return the tuple of supported
Resolution.Capability- Return type
Tuple[Capability,...]
- enabled
- set_enabled(enabled)
- Return type
None
- active
Trueif this resolution is active,Falseotherwise. This property should be treated as read-only, useset_active()instead of writing directly.
- set_active()
Set this resolution to be the active resolution.
- Return type
None
- default
Trueif this resolution is the default resolution,Falseotherwise. Note that only one resolution at a time can be the default. Seeset_default().
- set_default()
Set this resolution as the default resolution.
- Raises
ConfigError
- Return type
None
- dpi
A tuple of (x, y) resolution values. If this device does not have
Resolution.Capability.SEPARATE_XY_RESOLUTION(), the tuple always has two identical values.
- set_dpi(new_dpi)
Change the dpi of this device.
- Raises
ConfigError
- Return type
None
- property dpi_list: Tuple[int, ...]
Return a tuple of possible resolution values on this device
- Return type
Tuple[int,...]
- as_dict()
Returns this resolution as a dictionary that can e.g. be printed as YAML or JSON.
- Return type
Dict[str,Any]
- do_get_property(pspec)
- do_set_property(pspec, value)
- class ratbag.Action(type)
Bases:
ObjectAn “abstract” base class for all actions
- class Type(value)
Bases:
IntEnumAn enumeration.
- NONE = 0
- BUTTON = 1
- SPECIAL = 2
- MACRO = 4
- UNKNOWN = 1000
- as_dict()
- Return type
Dict[str,Any]
- class ratbag.ActionUnknown(type)
Bases:
ActionA “none” action to signal the button is disabled and does not send an event when physically presed down.
- classmethod create()
- Return type
- class ratbag.ActionNone(type)
Bases:
ActionA “none” action to signal the button is disabled and does not send an event when physically presed down.
- classmethod create()
- Return type
- class ratbag.ActionButton(type, button)
Bases:
ActionA button action triggered by a button. This is the simplest case of an action where a button triggers… a button event! Note that while
Buttonuses indices starting at zero, button actions start at button 1 (left mouse button).- classmethod create(button)
- Return type
- property button: int
The 1-indexed mouse button
- Return type
int
- as_dict()
- Return type
Dict[str,Any]
- class ratbag.ActionSpecial(type, special)
Bases:
ActionA special action triggered by a button. These actions are fixed events supported by devices, see
ActionSpecial.Specialfor the list of known actions.Note that not all devices support all special actions and buttons on a given device may not support all special events.
- class Special(value)
Bases:
IntEnumAn enumeration.
- UNKNOWN = 1073741824
- DOUBLECLICK = 1073741825
- WHEEL_LEFT = 1073741826
- WHEEL_RIGHT = 1073741827
- WHEEL_UP = 1073741828
- WHEEL_DOWN = 1073741829
- RATCHET_MODE_SWITCH = 1073741830
- RESOLUTION_CYCLE_UP = 1073741831
- RESOLUTION_CYCLE_DOWN = 1073741832
- RESOLUTION_UP = 1073741833
- RESOLUTION_DOWN = 1073741834
- RESOLUTION_ALTERNATE = 1073741835
- RESOLUTION_DEFAULT = 1073741836
- PROFILE_CYCLE_UP = 1073741837
- PROFILE_CYCLE_DOWN = 1073741838
- PROFILE_UP = 1073741839
- PROFILE_DOWN = 1073741840
- SECOND_MODE = 1073741841
- BATTERY_LEVEL = 1073741842
- classmethod create(special)
- as_dict()
- Return type
Dict[str,Any]
- class ratbag.ActionMacro(type, name='Unnamed macro', events=NOTHING)
Bases:
ActionA macro assigned to a button. The macro may consist of key presses, releases and timeouts (see
ActionMacro.Event), the length of the macro and limitations on what keys can be used are device-specific.- class Event(value)
Bases:
IntEnumAn enumeration.
- INVALID = -1
- NONE = 0
- KEY_PRESS = 1
- KEY_RELEASE = 2
- WAIT_MS = 3
- classmethod create(events, name='Unamed macro')
- property name: str
- Return type
str
- property events: List[Tuple[Event, int]]
A list of tuples that describe the sequence of this macro. Each tuple is of type
(Macro.Event.KEY_PRESS, 34)or(Macro.Event.WAIT_MS, 500), i.e. the first entry is aMacro.Eventenum and the remaining entries are the type-specific values.The length of each tuple is type-specific, clients must be able to handle tuples with lengths other than 2.
This property is read-only. To change a macro, create a new one with the desired event sequence and assign it to the button.
- Return type
List[Tuple[Event,int]]
- as_dict()
- Return type
Dict[str,Any]
- class ratbag.Button(device, index, profile, types=(<Type.BUTTON: 1>, ), action=ActionNone(_type=<Type.NONE: 0>))
Bases:
FeatureA physical button on the device as represented in a profile. A button has an
Actionassigned to it, be that to generate a button click, a special event or even a full sequence of key strokes (Macro).Note that each
Buttonrepresents one profile only so the same physical button will have multipleButtoninstances.- profile
The profile this button belongs to
- classmethod create(profile, index, **kwargs)
- property types: Tuple[Type, ...]
The list of supported
Action.Typefor this button- Return type
Tuple[Type,...]
- action
The currently assigned action. This action is guaranteed to be of type
Actionor one of its subclasses.
- set_action(new_action)
Set the action rate for this button.
- Raises
ConfigError
- Return type
None
- as_dict()
Returns this button as a dictionary that can e.g. be printed as YAML or JSON.
- Return type
Dict[str,Any]
- do_get_property(pspec)
- do_set_property(pspec, value)
- class ratbag.Led(device, index, profile, color=(0, 0, 0), brightness=0, colordepth=Colordepth.RGB_888, mode=Mode.OFF, modes=(<Mode.OFF: 0>, ), effect_duration=0)
Bases:
Feature- classmethod create(profile, index, **kwargs)
- do_get_property(pspec)
- do_set_property(pspec, value)
- color
Return a triplet of
(r, g, b)of positive integers. If any color scaling applies because of the device’sratbag.Led.Colordepththis is not reflected in this value. In other words, the color always matches the last successful call toset_color().
- set_color(rgb)
Set the color for this LED. The color provided has to be within the allowed color range, see
ratbag.Led.Colordepth. ratbag silently scales and/or clamps to the device’s color depth, it is the caller’s responsibility to set the colors in a non-ambiguous way.- Raises
ConfigError
- Return type
None
- property colordepth: Colordepth
- Return type
- brightness
- set_brightness(brightness)
- Return type
None
- effect_duration
- set_effect_duration(effect_duration)
- Return type
None
- mode
- set_mode(mode)
Change the mode of this LED. The supplied mode must be one returned by
modes().- Return type
None
- property modes: Tuple[Mode, ...]
Return a tuple of the available
Led.Modefor this LED- Return type
Tuple[Mode,...]
- as_dict()
Returns this resolution as a dictionary that can e.g. be printed as YAML or JSON.
- Return type
Dict[str,Any]