123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- #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
|