diff options
author | Kevin O'Connor <kevin@koconnor.net> | 2019-02-03 13:57:18 -0500 |
---|---|---|
committer | Kevin O'Connor <kevin@koconnor.net> | 2019-02-03 14:07:27 -0500 |
commit | 30b64142955d6b0f90de33fcedbc5e62b59a02f4 (patch) | |
tree | 6f26f76f8d596c7224863c56607d81b2541a9bee /klippy/extras/tmc2130.py | |
parent | 17a17c5b7738cb5e9e659882398b5d8541d57b8c (diff) | |
download | kutter-30b64142955d6b0f90de33fcedbc5e62b59a02f4.tar.gz kutter-30b64142955d6b0f90de33fcedbc5e62b59a02f4.tar.xz kutter-30b64142955d6b0f90de33fcedbc5e62b59a02f4.zip |
tmc2208: move local set_field/get_field helpers to FieldHelper class
Move these helper functions to the FieldHelper class so that they can
be used by other Trinamic drivers.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Diffstat (limited to 'klippy/extras/tmc2130.py')
-rw-r--r-- | klippy/extras/tmc2130.py | 36 |
1 files changed, 29 insertions, 7 deletions
diff --git a/klippy/extras/tmc2130.py b/klippy/extras/tmc2130.py index 061e9271..ac99edc4 100644 --- a/klippy/extras/tmc2130.py +++ b/klippy/extras/tmc2130.py @@ -42,22 +42,44 @@ def decode_signed_int(val, bits): return val class FieldHelper: - def __init__(self, all_fields, field_formatters={}): + def __init__(self, all_fields, field_formatters={}, registers=None): self.all_fields = all_fields self.field_formatters = field_formatters + self.registers = registers + if self.registers is None: + self.registers = {} self.field_to_register = { f: r for r, fields in self.all_fields.items() for f in fields } - def lookup_register(self, field_name): - # Return the name of the register containing the given field - return self.field_to_register[field_name] - def get_field(self, reg_name, field_name, reg_value): + def get_field(self, field_name, reg_value=None, reg_name=None): # Returns value of the register field + if reg_name is None: + reg_name = self.field_to_register[field_name] + if reg_value is None: + reg_value = self.registers[reg_name] mask = self.all_fields[reg_name][field_name] return (reg_value & mask) >> ffs(mask) - def set_field(self, reg_name, field_name, reg_value, field_value): + def set_field(self, field_name, field_value, reg_value=None, reg_name=None): # Returns register value with field bits filled with supplied value + if reg_name is None: + reg_name = self.field_to_register[field_name] + if reg_value is None: + reg_value = self.registers.get(reg_name, 0) mask = self.all_fields[reg_name][field_name] - return (reg_value & ~mask) | ((field_value << ffs(mask)) & mask) + new_value = (reg_value & ~mask) | ((field_value << ffs(mask)) & mask) + self.registers[reg_name] = new_value + return new_value + def set_config_field(self, config, field_name, default, config_name=None): + # Allow a field to be set from the config file + if config_name is None: + config_name = "driver_" + field_name.upper() + reg_name = self.field_to_register[field_name] + mask = self.all_fields[reg_name][field_name] + maxval = mask >> ffs(mask) + if maxval == 1: + val = config.getboolean(config_name, default) + else: + val = config.getint(config_name, default, minval=0, maxval=maxval) + return self.set_field(field_name, val) def pretty_format(self, reg_name, value): # Provide a string description of a register reg_fields = self.all_fields.get(reg_name, {}) |