solenoid.h 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. #ifndef SOLENOID_H
  2. #define SOLENOID_H
  3. #include <timer.h>
  4. #include "pincontrol.h"
  5. #define SOLENOID_DEFAULT_DWELL 12
  6. #define SOLENOID_MAX_DWELL 100
  7. #define SOLENOID_MIN_DWELL 4
  8. #ifndef SOLENOID_ACTIVE
  9. #define SOLENOID_ACTIVE false
  10. #endif
  11. //#define SOLENOID_PIN F6
  12. bool solenoid_enabled = SOLENOID_ACTIVE;
  13. bool solenoid_on = false;
  14. bool solenoid_buzz = false;
  15. bool solenoid_buzzing = false;
  16. uint16_t solenoid_start = 0;
  17. uint8_t solenoid_dwell = SOLENOID_DEFAULT_DWELL;
  18. void solenoid_buzz_on(void) {
  19. solenoid_buzz = true;
  20. }
  21. void solenoid_buzz_off(void) {
  22. solenoid_buzz = false;
  23. }
  24. void solenoid_dwell_minus(void) {
  25. if (solenoid_dwell > 0) solenoid_dwell--;
  26. }
  27. void solenoid_dwell_plus(void) {
  28. if (solenoid_dwell < SOLENOID_MAX_DWELL) solenoid_dwell++;
  29. }
  30. void solenoid_toggle(void) {
  31. solenoid_enabled = !solenoid_enabled;
  32. }
  33. void solenoid_stop(void) {
  34. digitalWrite(SOLENOID_PIN, PinLevelLow);
  35. solenoid_on = false;
  36. solenoid_buzzing = false;
  37. }
  38. void solenoid_fire(void) {
  39. if (!solenoid_enabled) return;
  40. if (!solenoid_buzz && solenoid_on) return;
  41. if (solenoid_buzz && solenoid_buzzing) return;
  42. solenoid_on = true;
  43. solenoid_buzzing = true;
  44. solenoid_start = timer_read();
  45. digitalWrite(SOLENOID_PIN, PinLevelHigh);
  46. }
  47. void solenoid_check(void) {
  48. uint16_t elapsed = 0;
  49. if (!solenoid_on) return;
  50. elapsed = timer_elapsed(solenoid_start);
  51. //Check if it's time to finish this solenoid click cycle
  52. if (elapsed > solenoid_dwell) {
  53. solenoid_stop();
  54. return;
  55. }
  56. //Check whether to buzz the solenoid on and off
  57. if (solenoid_buzz) {
  58. if (elapsed / SOLENOID_MIN_DWELL % 2 == 0){
  59. if (!solenoid_buzzing) {
  60. solenoid_buzzing = true;
  61. digitalWrite(SOLENOID_PIN, PinLevelHigh);
  62. }
  63. }
  64. else {
  65. if (solenoid_buzzing) {
  66. solenoid_buzzing = false;
  67. digitalWrite(SOLENOID_PIN, PinLevelLow);
  68. }
  69. }
  70. }
  71. }
  72. void solenoid_setup(void) {
  73. pinMode(SOLENOID_PIN, PinDirectionOutput);
  74. }
  75. void matrix_init_user(void) {
  76. solenoid_setup();
  77. }
  78. void matrix_scan_user(void) {
  79. solenoid_check();
  80. }
  81. #endif