summaryrefslogtreecommitdiff
path: root/users/mtdjr/solenoid.h
diff options
context:
space:
mode:
Diffstat (limited to 'users/mtdjr/solenoid.h')
-rw-r--r--users/mtdjr/solenoid.h103
1 files changed, 103 insertions, 0 deletions
diff --git a/users/mtdjr/solenoid.h b/users/mtdjr/solenoid.h
new file mode 100644
index 000000000..38066f4c3
--- /dev/null
+++ b/users/mtdjr/solenoid.h
@@ -0,0 +1,103 @@
+#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
+//#define SOLENOID_PIN F6
+
+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);
+}
+
+void matrix_init_user(void) {
+ solenoid_setup();
+}
+
+void matrix_scan_user(void) {
+ solenoid_check();
+}
+
+#endif