uint32_t Spindle::on_update_speed(uint32_t dummy)
{
    // If we don't get any interrupts for 1 second, set current RPM to 0
    uint32_t new_irq = irq_count;
    if (last_irq != new_irq)
        time_since_update = 0;
    else
        time_since_update++;
    last_irq = new_irq;

    if (time_since_update > UPDATE_FREQ)
        last_time = 0;

    // Calculate current RPM
    uint32_t t = last_time;
    if (t == 0) {
        current_rpm = 0;
    } else {
        float new_rpm = 1000000 * 60.0f / (t * pulses_per_rev);
        current_rpm = smoothing_decay * new_rpm + (1.0f - smoothing_decay) * current_rpm;
    }

    if (spindle_on) {
        float error = target_rpm - current_rpm;

        current_I_value += control_I_term * error * 1.0f / UPDATE_FREQ;
        current_I_value = confine(current_I_value, -1.0f, 1.0f);

        float new_pwm = 0.5f;
        new_pwm += control_P_term * error;
        new_pwm += current_I_value;
        new_pwm += control_D_term * UPDATE_FREQ * (error - prev_error);
        new_pwm = confine(new_pwm, 0.0f, 1.0f);
        prev_error = error;

        current_pwm_value = new_pwm;
    } else {
        current_I_value = 0;
        current_pwm_value = 0;
    }

    if (output_inverted)
        spindle_pin->write(1.0f - current_pwm_value);
    else
        spindle_pin->write(current_pwm_value);

    return 0;
}
Beispiel #2
0
static void
forkcmd(char *cmd, char *p, int reqfd, int datafd, int want_reply)
{
	char *q;

	switch (fork()) {
	case 0:
		if (restdir && chdir(restdir) < 0) {
			syslog(0, "ssh", "can't chdir(%s): %r", restdir);
			exits("can't chdir");
		}
		if (!prevent || (q = getenv("sshsession")) &&
		    strcmp(q, "allow") == 0)
			get_string(p+1, cmd);
		else
			confine(p+1, cmd);
		syslog(0, "ssh", "server running `%s' for %s", cmd, uname);
		/* runcmd doesn't return */
		runcmd(reqfd, datafd, "rx", "/bin/rc", "-lc", cmd);
	case -1:
		REPLY("failure");
		syslog(0, "ssh", "server can't fork: %r");
		exits("fork");
	}
}