]> git.donarmstrong.com Git - qmk_firmware.git/blob - users/mtdjr/solenoid.h
[Keyboard] fixed pins for numpad_5x4 layout (#6311)
[qmk_firmware.git] / users / mtdjr / solenoid.h
1 #ifndef SOLENOID_H
2 #define SOLENOID_H
3
4 #include <timer.h>
5 #include "pincontrol.h"
6
7
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
13 #endif
14 #ifndef SOLENOID_PIN
15   #define SOLENOID_PIN F6
16 #endif
17
18
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;
25
26
27 void solenoid_buzz_on(void) {
28   solenoid_buzz = true;
29 }
30
31 void solenoid_buzz_off(void) {
32   solenoid_buzz = false;
33 }
34
35 void solenoid_dwell_minus(void) {
36   if (solenoid_dwell > 0) solenoid_dwell--;
37 }
38
39 void solenoid_dwell_plus(void) {
40   if (solenoid_dwell < SOLENOID_MAX_DWELL) solenoid_dwell++;
41 }
42
43 void solenoid_toggle(void) {
44   solenoid_enabled = !solenoid_enabled;
45 }
46
47 void solenoid_stop(void) {
48   digitalWrite(SOLENOID_PIN, PinLevelLow);
49   solenoid_on = false;
50   solenoid_buzzing = false;
51 }
52
53 void solenoid_fire(void) {
54   if (!solenoid_enabled) return;
55
56   if (!solenoid_buzz && solenoid_on) return;
57   if (solenoid_buzz && solenoid_buzzing) return;
58
59   solenoid_on = true;
60   solenoid_buzzing = true;
61   solenoid_start = timer_read();
62   digitalWrite(SOLENOID_PIN, PinLevelHigh);
63 }
64
65 void solenoid_check(void) {
66   uint16_t elapsed = 0;
67
68   if (!solenoid_on) return;
69
70   elapsed = timer_elapsed(solenoid_start);
71
72   //Check if it's time to finish this solenoid click cycle
73   if (elapsed > solenoid_dwell) {
74     solenoid_stop();
75     return;
76   }
77
78   //Check whether to buzz the solenoid on and off
79   if (solenoid_buzz) {
80     if (elapsed / SOLENOID_MIN_DWELL % 2 == 0){
81       if (!solenoid_buzzing) {
82         solenoid_buzzing = true;
83         digitalWrite(SOLENOID_PIN, PinLevelHigh);
84       }
85     }
86     else {
87       if (solenoid_buzzing) {
88         solenoid_buzzing = false;
89         digitalWrite(SOLENOID_PIN, PinLevelLow);
90       }
91     }
92   }
93 }
94
95 void solenoid_setup(void) {
96   pinMode(SOLENOID_PIN, PinDirectionOutput);
97 }
98
99 #endif