]> git.donarmstrong.com Git - qmk_firmware.git/blob - users/mtdjr/solenoid.h
Merge branch 'master' of github.com:qmk/qmk_firmware into hf/shinydox
[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 #define SOLENOID_DEFAULT_DWELL 12
8 #define SOLENOID_MAX_DWELL 100
9 #define SOLENOID_MIN_DWELL 4
10 #ifndef SOLENOID_ACTIVE
11   #define SOLENOID_ACTIVE false
12 #endif
13 //#define SOLENOID_PIN F6
14
15 bool solenoid_enabled = SOLENOID_ACTIVE;
16 bool solenoid_on = false;
17 bool solenoid_buzz = false;
18 bool solenoid_buzzing = false;
19 uint16_t solenoid_start = 0;
20 uint8_t solenoid_dwell = SOLENOID_DEFAULT_DWELL;
21
22
23 void solenoid_buzz_on(void) {
24   solenoid_buzz = true;
25 }
26
27 void solenoid_buzz_off(void) {
28   solenoid_buzz = false;
29 }
30
31 void solenoid_dwell_minus(void) {
32   if (solenoid_dwell > 0) solenoid_dwell--;
33 }
34
35 void solenoid_dwell_plus(void) {
36   if (solenoid_dwell < SOLENOID_MAX_DWELL) solenoid_dwell++;
37 }
38
39 void solenoid_toggle(void) {
40   solenoid_enabled = !solenoid_enabled;
41 }
42
43 void solenoid_stop(void) {
44   digitalWrite(SOLENOID_PIN, PinLevelLow);
45   solenoid_on = false;
46   solenoid_buzzing = false;
47 }
48
49 void solenoid_fire(void) {
50   if (!solenoid_enabled) return;
51
52   if (!solenoid_buzz && solenoid_on) return;
53   if (solenoid_buzz && solenoid_buzzing) return;
54
55   solenoid_on = true;
56   solenoid_buzzing = true;
57   solenoid_start = timer_read();
58   digitalWrite(SOLENOID_PIN, PinLevelHigh);
59 }
60
61 void solenoid_check(void) {
62   uint16_t elapsed = 0;
63
64   if (!solenoid_on) return;
65
66   elapsed = timer_elapsed(solenoid_start);
67
68   //Check if it's time to finish this solenoid click cycle
69   if (elapsed > solenoid_dwell) {
70     solenoid_stop();
71     return;
72   }
73
74   //Check whether to buzz the solenoid on and off
75   if (solenoid_buzz) {
76     if (elapsed / SOLENOID_MIN_DWELL % 2 == 0){
77       if (!solenoid_buzzing) {
78         solenoid_buzzing = true;
79         digitalWrite(SOLENOID_PIN, PinLevelHigh);
80       }
81     }
82     else {
83       if (solenoid_buzzing) {
84         solenoid_buzzing = false;
85         digitalWrite(SOLENOID_PIN, PinLevelLow);
86       }
87     }
88   }
89 }
90
91 void solenoid_setup(void) {
92   pinMode(SOLENOID_PIN, PinDirectionOutput);
93 }
94
95 void matrix_init_user(void) {
96   solenoid_setup();
97 }
98
99 void matrix_scan_user(void) {
100   solenoid_check();
101 }
102
103 #endif