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; }
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"); } }