5 #include "pincontrol.h"
8 #define SOLENOID_DEFAULT_DWELL 12
9 #define SOLENOID_MAX_DWELL 100
10 #define SOLENOID_MIN_DWELL 4
11 #ifndef SOLENOID_ACTIVE
12 #define SOLENOID_ACTIVE false
15 #define SOLENOID_PIN F6
19 bool solenoid_enabled = SOLENOID_ACTIVE;
20 bool solenoid_on = false;
21 bool solenoid_buzz = false;
22 bool solenoid_buzzing = false;
23 uint16_t solenoid_start = 0;
24 uint8_t solenoid_dwell = SOLENOID_DEFAULT_DWELL;
27 void solenoid_buzz_on(void) {
31 void solenoid_buzz_off(void) {
32 solenoid_buzz = false;
35 void solenoid_dwell_minus(void) {
36 if (solenoid_dwell > 0) solenoid_dwell--;
39 void solenoid_dwell_plus(void) {
40 if (solenoid_dwell < SOLENOID_MAX_DWELL) solenoid_dwell++;
43 void solenoid_toggle(void) {
44 solenoid_enabled = !solenoid_enabled;
47 void solenoid_stop(void) {
48 digitalWrite(SOLENOID_PIN, PinLevelLow);
50 solenoid_buzzing = false;
53 void solenoid_fire(void) {
54 if (!solenoid_enabled) return;
56 if (!solenoid_buzz && solenoid_on) return;
57 if (solenoid_buzz && solenoid_buzzing) return;
60 solenoid_buzzing = true;
61 solenoid_start = timer_read();
62 digitalWrite(SOLENOID_PIN, PinLevelHigh);
65 void solenoid_check(void) {
68 if (!solenoid_on) return;
70 elapsed = timer_elapsed(solenoid_start);
72 //Check if it's time to finish this solenoid click cycle
73 if (elapsed > solenoid_dwell) {
78 //Check whether to buzz the solenoid on and off
80 if (elapsed / SOLENOID_MIN_DWELL % 2 == 0){
81 if (!solenoid_buzzing) {
82 solenoid_buzzing = true;
83 digitalWrite(SOLENOID_PIN, PinLevelHigh);
87 if (solenoid_buzzing) {
88 solenoid_buzzing = false;
89 digitalWrite(SOLENOID_PIN, PinLevelLow);
95 void solenoid_setup(void) {
96 pinMode(SOLENOID_PIN, PinDirectionOutput);