#ifndef SOLENOID_H #define SOLENOID_H #include <timer.h> #include "pincontrol.h" #define SOLENOID_DEFAULT_DWELL 12 #define SOLENOID_MAX_DWELL 100 #define SOLENOID_MIN_DWELL 4 #ifndef SOLENOID_ACTIVE #define SOLENOID_ACTIVE false #endif #ifndef SOLENOID_PIN #define SOLENOID_PIN F6 #endif bool solenoid_enabled = SOLENOID_ACTIVE; bool solenoid_on = false; bool solenoid_buzz = false; bool solenoid_buzzing = false; uint16_t solenoid_start = 0; uint8_t solenoid_dwell = SOLENOID_DEFAULT_DWELL; void solenoid_buzz_on(void) { solenoid_buzz = true; } void solenoid_buzz_off(void) { solenoid_buzz = false; } void solenoid_dwell_minus(void) { if (solenoid_dwell > 0) solenoid_dwell--; } void solenoid_dwell_plus(void) { if (solenoid_dwell < SOLENOID_MAX_DWELL) solenoid_dwell++; } void solenoid_toggle(void) { solenoid_enabled = !solenoid_enabled; } void solenoid_stop(void) { digitalWrite(SOLENOID_PIN, PinLevelLow); solenoid_on = false; solenoid_buzzing = false; } void solenoid_fire(void) { if (!solenoid_enabled) return; if (!solenoid_buzz && solenoid_on) return; if (solenoid_buzz && solenoid_buzzing) return; solenoid_on = true; solenoid_buzzing = true; solenoid_start = timer_read(); digitalWrite(SOLENOID_PIN, PinLevelHigh); } void solenoid_check(void) { uint16_t elapsed = 0; if (!solenoid_on) return; elapsed = timer_elapsed(solenoid_start); //Check if it's time to finish this solenoid click cycle if (elapsed > solenoid_dwell) { solenoid_stop(); return; } //Check whether to buzz the solenoid on and off if (solenoid_buzz) { if (elapsed / SOLENOID_MIN_DWELL % 2 == 0){ if (!solenoid_buzzing) { solenoid_buzzing = true; digitalWrite(SOLENOID_PIN, PinLevelHigh); } } else { if (solenoid_buzzing) { solenoid_buzzing = false; digitalWrite(SOLENOID_PIN, PinLevelLow); } } } } void solenoid_setup(void) { pinMode(SOLENOID_PIN, PinDirectionOutput); } #endif