mainsail-crew / mainsail

Mainsail is the popular web interface for managing and controlling 3D printers with Klipper.
https://docs.mainsail.xyz
GNU General Public License v3.0
1.72k stars 372 forks source link

Issue with output_pin #1869

Closed Guilouz closed 6 months ago

Guilouz commented 6 months ago

Mainsail Version:

2.11.1

Browser:

Chrome

Device:

Desktop PC

Operating System:

Linux

What happened?

Sliders on Web UI only set 0 or 1 when output_pin is used with scale.

What did you expect to happen instead?

Slider set the correct value in range 0-255 and not 0 or 1.

How to reproduce this bug?

I use this config:

[output_pin soc_fan]
pin: PB2
pwm: True
cycle_time: 0.0100
hardware_pwm: false
value: 0.00
scale: 255
shutdown_value: 0.0

When using slider to 100% this is the sending command:

SET_PIN PIN=soc_fan VALUE=1.00

While it should send this command:

SET_PIN PIN=soc_fan VALUE=255

Additional information:

On Fluidd it's working as expected.

dosubot[bot] commented 6 months ago

Hey @Guilouz! 👋 I'm Dosu, your friendly neighborhood bot here to help you tackle bugs, answer your questions, and guide you on your way to becoming a contributor. While we wait for a human maintainer to chime in, I'll be diving into your issue to lend a hand. Hang tight, I'll get back to you with more insights soon! 🤖

rackrick commented 6 months ago

Hey @Guilouz , you're right... the output pin is currently fixed to a value of 1. We look further into it. There were some changes of the output_pin module at the begining of the year. Looks like we did not address all those changes.

If you don't want to wait for a fix you could use fan_generic Klipper Config Ref to controll a fan the same way.

dosubot[bot] commented 6 months ago

The issue you're encountering with the output_pin configuration in Mainsail, where the slider only sets values of 0 or 1 instead of the full 0-255 range, is due to how the slider's value is processed before sending the G-code command. The slider operates within a 0.0 to 1.0 range, and this value is directly used without conversion to the expected 0-255 range for PWM control.

To address this, the value sent by the slider needs to be adjusted to the 0-255 range before being formatted into the G-code command. This can be achieved by modifying the method that handles the slider's value, specifically by multiplying the slider's value (0.0 to 1.0) by 255 to convert it to the full range before sending the command. Here's a simplified adjustment you could make:

sendCmd(newVal: number): void {
    // Convert newVal to a 0-255 range
    newVal = newVal * 255;
    let gcode = `SET_PIN PIN=${this.name} VALUE=${newVal.toFixed(0)}`;

    // Send the G-code command
    this.$store.dispatch('server/addEvent', { message: gcode, type: 'command' });
    this.$socket.emit('printer.gcode.script', { script: gcode });
}

This change ensures that the slider's value is correctly scaled to the 0-255 range expected for PWM control before the G-code command is generated and sent. It's important to thoroughly test any modifications to confirm they work as expected and don't introduce new issues.

#### Details **Sources** - [src/components/inputs/MiscellaneousSlider.vue](https://github.com/mainsail-crew/mainsail/blob/develop/src/components/inputs/MiscellaneousSlider.vue)
**About Dosu** This response is meant to be useful and save you time. It is **not meant to be a precise solution**, but rather a starting point for your own research. Help me be more useful! Please leave a 👍 if this is helpful and 👎 if it is irrelevant.

To continue the conversation, mention @dosu.