diff options
Diffstat (limited to 'radiator-plc/stm32/app/rain.c')
-rw-r--r-- | radiator-plc/stm32/app/rain.c | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/radiator-plc/stm32/app/rain.c b/radiator-plc/stm32/app/rain.c new file mode 100644 index 0000000..4188990 --- /dev/null +++ b/radiator-plc/stm32/app/rain.c @@ -0,0 +1,100 @@ +#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); +} + + |