diff options
author | Kevin O'Connor <kevin@koconnor.net> | 2017-12-18 19:13:23 -0500 |
---|---|---|
committer | Kevin O'Connor <kevin@koconnor.net> | 2017-12-18 20:59:07 -0500 |
commit | 3c5649219fb120c2ac1b98cf22adfefba5dd4c10 (patch) | |
tree | ca5635994ddab9b9ce476cf14ab55bfb71ad72d2 /klippy/chipmisc.py | |
parent | 68d03e4a3ee9a424d666906e00f32d5792c82b33 (diff) | |
download | kutter-3c5649219fb120c2ac1b98cf22adfefba5dd4c10.tar.gz kutter-3c5649219fb120c2ac1b98cf22adfefba5dd4c10.tar.xz kutter-3c5649219fb120c2ac1b98cf22adfefba5dd4c10.zip |
chipmisc: Add support for output pins set at runtime
Add the ability to define output pins that may be set at runtime with
a new SET_PIN extended g-code command.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Diffstat (limited to 'klippy/chipmisc.py')
-rw-r--r-- | klippy/chipmisc.py | 78 |
1 files changed, 63 insertions, 15 deletions
diff --git a/klippy/chipmisc.py b/klippy/chipmisc.py index 0c41f9d4..6fae2868 100644 --- a/klippy/chipmisc.py +++ b/klippy/chipmisc.py @@ -7,7 +7,7 @@ import pins, mcu ###################################################################### -# Statically configured output pins +# Output pins ###################################################################### class PrinterStaticDigitalOut: @@ -17,26 +17,70 @@ class PrinterStaticDigitalOut: mcu_pin = pins.setup_pin(printer, 'digital_out', pin_desc) mcu_pin.setup_static() -class PrinterStaticPWM: +PIN_MIN_TIME = 0.100 + +class PrinterPin: def __init__(self, printer, config): - mcu_pwm = pins.setup_pin(printer, 'pwm', config.get('pin')) - mcu_pwm.setup_max_duration(0.) - hard_pwm = config.getint('hard_pwm', None, minval=1) - if hard_pwm is None: - mcu_pwm.setup_cycle_time(config.getfloat( - 'cycle_time', 0.100, above=0.)) + self.printer = printer + self.is_pwm = 'pwm' in config.section.split()[0] + if self.is_pwm: + self.mcu_pin = pins.setup_pin(printer, 'pwm', config.get('pin')) + hard_pwm = config.getint('hard_pwm', None, minval=1) + if hard_pwm is None: + self.mcu_pin.setup_cycle_time(config.getfloat( + 'cycle_time', 0.100, above=0.)) + else: + self.mcu_pin.setup_hard_pwm(hard_pwm) + self.scale = config.getfloat('scale', 1., above=0.) else: - mcu_pwm.setup_hard_pwm(hard_pwm) - scale = config.getfloat('scale', 1., above=0.) - value = config.getfloat('value', minval=0., maxval=scale) - mcu_pwm.setup_static_pwm(value / scale) + self.mcu_pin = pins.setup_pin( + printer, 'digital_out', config.get('pin')) + self.scale = 1. + self.mcu_pin.setup_max_duration(0.) + self.last_value_time = 0. + self.last_value = config.getfloat( + 'value', 0., minval=0., maxval=self.scale) + self.is_static = config.section.startswith('static_') + if self.is_static: + self.mcu_pin.setup_static_pwm(self.last_value / self.scale) + else: + self.mcu_pin.setup_start_value( + self.last_value, config.getfloat('shutdown_value', 0., + minval=0., maxval=self.scale)) + self.gcode = printer.objects['gcode'] + self.gcode.register_command("SET_PIN", self.cmd_SET_PIN, + desc=self.cmd_SET_PIN_help) + cmd_SET_PIN_help = "Set the value of an output pin" + def cmd_SET_PIN(self, params): + pin_name = self.gcode.get_str('PIN', params) + pin = self.printer.objects.get('pin ' + pin_name) + if pin is not self: + if pin is None: + raise self.gcode.error("Pin not configured") + return pin.cmd_SET_PIN(params) + if self.is_static: + raise self.gcode.error("Static pin can not be changed at run-time") + value = self.gcode.get_float('VALUE', params) + if value == self.last_value: + return + print_time = self.printer.objects['toolhead'].get_last_move_time() + print_time = max(print_time, self.last_value_time + PIN_MIN_TIME) + if self.is_pwm: + if value < 0. or value > self.scale: + raise self.gcode.error("Invalid pin value") + self.mcu_pin.set_pwm(print_time, value) + else: + if value not in [0., 1.]: + raise self.gcode.error("Invalid pin value") + self.mcu_pin.set_digital(print_time, value) + self.last_value = value + self.last_value_time = print_time ###################################################################### # Servos ###################################################################### -SERVO_MIN_TIME = 0.100 SERVO_SIGNAL_PERIOD = 0.020 class PrinterServo: @@ -60,7 +104,7 @@ class PrinterServo: def set_pwm(self, print_time, value): if value == self.last_value: return - print_time = max(self.last_value_time + SERVO_MIN_TIME, print_time) + print_time = max(print_time, self.last_value_time + PIN_MIN_TIME) self.mcu_servo.set_pwm(print_time, value) self.last_value = value self.last_value_time = print_time @@ -300,8 +344,12 @@ def add_printer_objects(printer, config): printer, config.getsection('replicape'))) for s in config.get_prefix_sections('static_digital_output '): printer.add_object(s.section, PrinterStaticDigitalOut(printer, s)) + for s in config.get_prefix_sections('digital_output '): + printer.add_object('pin' + s.section[14:], PrinterPin(printer, s)) for s in config.get_prefix_sections('static_pwm_output '): - printer.add_object(s.section, PrinterStaticPWM(printer, s)) + printer.add_object('pin' + s.section[17:], PrinterPin(printer, s)) + for s in config.get_prefix_sections('pwm_output '): + printer.add_object('pin' + s.section[10:], PrinterPin(printer, s)) for s in config.get_prefix_sections('servo '): printer.add_object(s.section, PrinterServo(printer, s)) for s in config.get_prefix_sections('ad5206 '): |