Source code for dwfpy.helpers

"""
Internal helper functions.
"""

#
# This file is part of dwfpy: https://github.com/mariusgreuel/dwfpy
# Copyright (C) 2019 Marius Greuel
#
# SPDX-License-Identifier: MIT
#

from .constants import (
    AcquisitionMode,
    AnalogInputCoupling,
    DigitalOutputMode,
    DigitalOutputType,
    DigitalOutputIdle,
    FilterMode,
    Function,
    TriggerLengthCondition,
    TriggerSlope,
    TriggerSource,
)


[docs]class Helpers: """Internal helper class.""" # pylint:disable=missing-function-docstring @staticmethod def c_char_to_string(buffer) -> str: return buffer.value.decode('ascii') @staticmethod def make_default(value, default_value=None): return default_value if value is None else value @staticmethod def map_enum_values(enum_type, values) -> tuple: return tuple(v for v in enum_type if (values & (1 << v.value)) != 0) @staticmethod def map_named_value(value, named_values, default_value=None): if value is None: return default_value if isinstance(value, str): return named_values[value.lower()] return value @staticmethod def pack_bits(data): if isinstance(data, (bytes, bytearray)): return data, len(data) * 8 bit_count = len(data) byte_buffer = bytearray((bit_count + 7) // 8) for i, bit in enumerate(data): if bit != 0: byte_buffer[i // 8] |= 1 << (i % 8) return byte_buffer, bit_count @staticmethod def map_state(value, default_value=None): named_values = { 'low': False, 'high': True, } return Helpers.map_named_value(value, named_values, default_value) @staticmethod def map_acquisition_mode(value, default_value=None): named_values = { 'single': AcquisitionMode.SINGLE, 'scan-shift': AcquisitionMode.SCAN_SHIFT, 'scan-screen': AcquisitionMode.SCAN_SCREEN, 'record': AcquisitionMode.RECORD, } return Helpers.map_named_value(value, named_values, default_value) @staticmethod def map_function(value, default_value=None): named_values = { 'dc': Function.DC, 'sine': Function.SINE, 'square': Function.SQUARE, 'triangle': Function.TRIANGLE, 'ramp-up': Function.RAMP_UP, 'ramp-down': Function.RAMP_DOWN, 'noise': Function.NOISE, 'pulse': Function.PULSE, 'trapezium': Function.TRAPEZIUM, 'sine_power': Function.SINE_POWER, 'custom-pattern': Function.CUSTOM_PATTERN, 'play-pattern': Function.PLAY_PATTERN, 'custom': Function.CUSTOM, 'play': Function.PLAY, } return Helpers.map_named_value(value, named_values, default_value) @staticmethod def map_coupling(value, default_value=None): named_values = { 'dc': AnalogInputCoupling.DC, 'ac': AnalogInputCoupling.AC, } return Helpers.map_named_value(value, named_values, default_value) @staticmethod def map_digital_output_mode(value, default_value=None): named_values = { 'pp': DigitalOutputMode.PUSH_PULL, 'push-pull': DigitalOutputMode.PUSH_PULL, 'od': DigitalOutputMode.OPEN_DRAIN, 'open-drain': DigitalOutputMode.OPEN_DRAIN, 'os': DigitalOutputMode.OPEN_SOURCE, 'open-source': DigitalOutputMode.OPEN_SOURCE, 'three-state': DigitalOutputMode.THREE_STATE, } return Helpers.map_named_value(value, named_values, default_value) @staticmethod def map_digital_output_type(value, default_value=None): named_values = { 'pulse': DigitalOutputType.PULSE, 'custom': DigitalOutputType.CUSTOM, 'random': DigitalOutputType.RANDOM, 'rom': DigitalOutputType.ROM, 'state': DigitalOutputType.STATE, 'play': DigitalOutputType.PLAY, } return Helpers.map_named_value(value, named_values, default_value) @staticmethod def map_digital_output_idle(value, default_value=None): named_values = { 'init': DigitalOutputIdle.INIT, 'initial': DigitalOutputIdle.INIT, 'low': DigitalOutputIdle.LOW, 'high': DigitalOutputIdle.HIGH, 'z': DigitalOutputIdle.ZET, 'zet': DigitalOutputIdle.ZET, } return Helpers.map_named_value(value, named_values, default_value) @staticmethod def map_filter(value, default_value=None): named_values = { 'decimate': FilterMode.DECIMATE, 'average': FilterMode.AVERAGE, 'min-max': FilterMode.MIN_MAX, } return Helpers.map_named_value(value, named_values, default_value) @staticmethod def map_trigger_length_condition(value, default_value=None): named_values = { 'less': TriggerLengthCondition.LESS, 'timeout': TriggerLengthCondition.TIMEOUT, 'more': TriggerLengthCondition.MORE, } return Helpers.map_named_value(value, named_values, default_value) @staticmethod def map_trigger_slope(value, default_value=None): named_values = { 'rise': TriggerSlope.RISE, 'rising': TriggerSlope.RISE, 'pos': TriggerSlope.RISE, 'positive': TriggerSlope.RISE, 'entering': TriggerSlope.RISE, 'fall': TriggerSlope.FALL, 'falling': TriggerSlope.FALL, 'neg': TriggerSlope.FALL, 'negative': TriggerSlope.FALL, 'exiting': TriggerSlope.FALL, 'either': TriggerSlope.EITHER, } return Helpers.map_named_value(value, named_values, default_value) @staticmethod def map_trigger_source(value, default_value=None): named_values = { 'none': TriggerSource.NONE, 'pc': TriggerSource.PC, 'detector-analog-in': TriggerSource.DETECTOR_ANALOG_IN, 'detector-digital-in': TriggerSource.DETECTOR_DIGITAL_IN, 'analog-in': TriggerSource.ANALOG_IN, 'digital-in': TriggerSource.DIGITAL_IN, 'digital-out': TriggerSource.DIGITAL_OUT, 'analog-out1': TriggerSource.ANALOG_OUT1, 'analog-out2': TriggerSource.ANALOG_OUT2, 'analog-out3': TriggerSource.ANALOG_OUT3, 'analog-out4': TriggerSource.ANALOG_OUT4, 'external1': TriggerSource.EXTERNAL1, 'external2': TriggerSource.EXTERNAL2, 'external3': TriggerSource.EXTERNAL3, 'external4': TriggerSource.EXTERNAL4, 'high': TriggerSource.HIGH, 'low': TriggerSource.LOW, 'clock': TriggerSource.CLOCK, } return Helpers.map_named_value(value, named_values, default_value)