diff options
Diffstat (limited to 'klippy/extras/tmc2130.py')
-rw-r--r-- | klippy/extras/tmc2130.py | 36 |
1 files changed, 35 insertions, 1 deletions
diff --git a/klippy/extras/tmc2130.py b/klippy/extras/tmc2130.py index 28d0f2dc..da089e5a 100644 --- a/klippy/extras/tmc2130.py +++ b/klippy/extras/tmc2130.py @@ -24,6 +24,40 @@ ReadRegisters = [ "CHOPCONF", "DRV_STATUS", "PWM_SCALE", "LOST_STEPS", ] +Fields = {} + + +###################################################################### +# Field helpers +###################################################################### + +# Return the position of the first bit set in a mask +def ffs(mask): + return (mask & -mask).bit_length() - 1 + +# Provide a string description of a register +def pretty_format(all_fields, reg_name, value): + fields = [ " %s=%d" % (field_name, (value & mask) >> ffs(mask)) + for field_name, mask in sorted(all_fields.get( + reg_name, {}).items(), key = lambda f: f[1]) + if value & mask ] + return "%-15s %08x%s" % (reg_name + ":", value, "".join(fields)) + +# Returns value of the register field +def get_field(all_fields, reg_name, field_name, reg_value): + mask = all_fields.get(reg_name, {})[field_name] + return (reg_value & mask) >> ffs(mask) + +# Returns register value with field bits filled with supplied field value +def set_field(all_fields, reg_name, field_name, reg_value, field_value): + mask = all_fields.get(reg_name, {})[field_name] + return (reg_value & ~mask) | ((field_value << ffs(mask)) & mask) + + +###################################################################### +# TMC2130 printer object +###################################################################### + class TMC2130: def __init__(self, config): self.printer = config.get_printer() @@ -126,7 +160,7 @@ class TMC2130: logging.info("DUMP_TMC %s", self.name) for reg_name in ReadRegisters: val = self.get_register(reg_name) - msg = "%-15s %08x" % (reg_name + ":", val) + msg = pretty_format(Fields, reg_name, val) logging.info(msg) gcode.respond_info(msg) |