herosdevices.helper
===================

.. py:module:: herosdevices.helper

.. autoapi-nested-parse::

   Helper functions for writing hardware drivers.









Module Contents
---------------

.. py:data:: SPAM
   :value: 5


.. py:class:: Logger(name, level=NOTSET)

   Bases: :py:obj:`logging.Logger`


   Extend logger to include a spam level for debugging device communication.


   .. py:method:: setLevel(level: str | int, globally: bool = False) -> None

      Set the logging level of this logger.  level must be an int or a str.



   .. py:method:: spam(msg: str, *args, **kwargs) -> None

      Log a message with severity SPAM, even lower than DEBUG.



.. py:data:: format_str
   :value: '%(asctime)-15s %(name)s: %(message)s'


.. py:data:: log

.. py:data:: SI_PREFIX_EXP

.. py:function:: limits(lower: float, upper: float) -> collections.abc.Callable[[float], str | bool]

   Create a function which checks if a value is within the specified range.

   :param lower: The lower bound of the valid range.
   :param upper: The upper bound of the valid range.

   :returns: A function that takes a value and returns True if within the range, or a message
             indicating it's out of range.


.. py:function:: limits_int(lower: int, upper: int) -> collections.abc.Callable[[int], str | bool]

   Create a function to check if a value is within a specified range and is an integer.

   :param lower: The lower bound of the valid range.
   :param upper: The upper bound of the valid range.

   :returns: A function that takes a value and returns True if within the range and is an integer,
             or a message indicating why it's invalid.


.. py:function:: explicit(values: list[Any]) -> collections.abc.Callable[[Any], str | bool]

   Create a function to check if a value is in a list of allowed values.

   :param values: A list of allowed values.

   :returns: A function that takes a value and returns True if within the list, or a message
             indicating it's not in the list.


.. py:function:: extract_regex(pattern: str) -> collections.abc.Callable[[str], str]

   Create a function to extract a value from a string via regex pattern matching.

   :param regex: regex pattern string.

   :returns: A function that takes a string and returns the first match group.


.. py:function:: transform_unit(in_unit: str, out_unit: str) -> collections.abc.Callable[[float, bool], float]

   Create a function to transform a value from one unit to another using SI prefixes.

   :param in_unit: The input unit (e.g., 'k' for kilo, 'm' for milli). Use 'base' for no prefix.
   :param out_unit: The output unit (e.g., 'k' for kilo, 'm' for milli). Use 'base' for no prefix.

   :returns: A function that transforms a given value from the input unit to the output unit,
             optionally allowing reverse transformation (second argument True).


.. py:function:: merge_dicts(dict1: dict, dict2: dict) -> dict

   Recursively merge two dicts of dicts.


.. py:function:: add_class_descriptor(cls: type, attr_name: str, descriptor) -> None

   Add a descriptor to a class.

   This is a simple helper function which uses `setattr` to add an attribute to the class and then also calls
   `__set_name__` on the attribute.

   :param cls: Class to add the descriptor to
   :param attr_name: Name of the attribute the descriptor will be added to
   :param descriptor: The descriptor to be added


