shark_xl.c 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. #include "shark_xl.h"
  2. #include "common.h"
  3. #include "app_end_ctr.h"
  4. shark_u16 shark_xl_ticks;
  5. shark_u8 shark_xl_skip;
  6. shark_u16 shark_xl_speed_max;
  7. shark_u16 shark_xl_speed_tmp;
  8. shark_u16 shark_xl_speed;
  9. shark_u8 shark_xl_detected;
  10. void shark_xl_init(void)
  11. {
  12. rcu_periph_clock_enable(GPIO_RCU_XL);
  13. gpio_init(GPIO_PORT_XL, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_XL);
  14. gpio_exti_source_select(EXTI_PORT_XL, EXTI_PIN_XL);
  15. exti_init(EXTI_XL, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
  16. exti_interrupt_flag_clear(EXTI_XL);
  17. }
  18. void shark_xl_tick(void)
  19. {
  20. if (shark_xl_ticks < CONFIG_XL_TICKS) {
  21. shark_xl_ticks++;
  22. if (gpio_input_bit_get(GPIO_PORT_XL, GPIO_PIN_XL) == RESET) {
  23. shark_xl_speed_tmp++;
  24. }
  25. } else {
  26. shark_bool state;
  27. shark_xl_ticks = 0;
  28. if (shark_xl_skip > 0) {
  29. shark_xl_skip--;
  30. shark_xl_speed = 0;
  31. } else {
  32. shark_xl_speed = shark_xl_speed_tmp;
  33. }
  34. state = (shark_xl_speed > CONFIG_XL_MIN);
  35. end_ctr_self_ss_new.xl_sta = state;
  36. if (state) {
  37. shark_xl_detected = SHARK_XL_DEBOUNCE;
  38. } else if (shark_xl_detected > 0) {
  39. shark_xl_detected--;
  40. }
  41. if (shark_xl_speed_max < shark_xl_speed) {
  42. shark_xl_speed_max = shark_xl_speed;
  43. }
  44. shark_xl_speed_tmp = 0;
  45. exti_interrupt_enable(EXTI_XL);
  46. }
  47. }
  48. void shark_xl_isr(void)
  49. {
  50. if (++shark_xl_speed_tmp > CONFIG_XL_MAX) {
  51. exti_interrupt_disable(EXTI_XL);
  52. }
  53. }