#include "lights.h"
#define WAKEUP_LIMIT 5 // times 100 ms
+#define SHORT_PRESS_MIN 2 // in jiffies (16 Hz ticks)
+#define SHORT_PRESS_MAX 5
+#define LONG_PRESS_MIN 10
+
static uint16_t button_start[3];
union {
unsigned char all;
} else if (cur && prev) { // --- is still pressed ---
uint16_t duration = jiffies - button_start[button];
- if (duration > 160) {
+ if (duration >= LONG_PRESS_MIN) {
set_status_led(button, on1_pattern);
// acknowledge long press
}
} else if (!cur && prev) { // --- just released ---
uint16_t duration = jiffies - button_start[button];
- if (duration > 6 && duration < 60) {
+ if (duration >= SHORT_PRESS_MIN && duration < SHORT_PRESS_MAX) {
short_press(button);
- } else if (duration > 160) {
+ } else if (duration > LONG_PRESS_MIN) {
set_status_led(button, NULL);
long_press(button);
}
#include <avr/io.h>
#include <avr/interrupt.h>
+#include <avr/wdt.h>
#include "lights.h"
volatile uint16_t jiffies;
-#define PATTERN_DIV 10 // clk/10
-static unsigned char pattern_div;
void init_tmr()
{
- TCCR0A = _BV(WGM00);
- TCCR0B = _BV(CS02) | _BV(CS00); // CLK/1024 = 1 kHz
- OCR0A = 5; // 200 Hz
- TIMSK |= _BV(OCIE0A);
-
- jiffies = 0;
- pattern_div = PATTERN_DIV;
+ WDTCR = _BV(WDIE) | _BV(WDP1); // interrupt mode, 64 ms
}
void susp_tmr()
{
- TCCR0A = TCCR0B = 0;
- TIMSK &= ~_BV(OCIE0A);
- TIFR = 0;
+ wdt_disable();
}
-ISR(TIMER0_COMPA_vect)
-{
+ISR(WDT_vect) {
++jiffies;
- pwm_timer();
-
- if (--pattern_div == 0) {
- timer_check_buttons();
- patterns_next_tick();
- timer_start_slow_adcs();
- pattern_div = PATTERN_DIV;
- }
+ timer_check_buttons();
+ patterns_next_tick();
+ timer_start_slow_adcs();
- if ((jiffies & 0x7FFF) == 0)
+ if ((jiffies & 0x7FF) == 0)
ambient_log_min_max();
}