#include "project.h" #define DEBOUNCE 20 static uint8_t r_state; static uint32_t r_ticks; static uint8_t r_current; static uint8_t r_filtered; static unsigned r_expiry; #define RAIN_BANK GPIOA #define RAIN_GPIO GPIO15 static int raw_rain (void) { return !gpio_get (RAIN_BANK, RAIN_GPIO); } void rain_notify (void) { if (r_current) vents_rain_notify(); } void rain_ticker (void) { unsigned s; static int ticker = 0; s = raw_rain(); if (s == r_state) { if (r_ticks < DEBOUNCE) r_ticks++; else if (r_ticks == DEBOUNCE) { r_current = s; r_ticks++; printf ("D: rain state now %d\r\n", r_current); } } else { r_ticks = 0; r_state = s; } if (r_current) { r_filtered = 1; r_expiry = 1800; } rain_notify(); ticker++; if (ticker < 1000) return; ticker = 0; if (r_expiry) r_expiry--; else r_filtered = r_current; } void rain_slow_ticker (void) { printf ("R: %d %d\r\n", r_current, r_filtered); } int rain_filtered_state (void) { return r_filtered; } int rain_state (void) { return r_current; } char rain_state_char (void) { return r_current ? 'Y' : 'N'; } void rain_init (void) { gpio_set_mode (RAIN_BANK, GPIO_MODE_INPUT, GPIO_CNF_INPUT_PULL_UPDOWN, RAIN_GPIO); gpio_set (RAIN_BANK, RAIN_GPIO); }