especially if it merges an updated upstream into a topic branch.
PROGRAM=lights
SRC=main.c logging.c pwm.c adc.c pwmled.c pattern.c buttons.c control.c \
- battery.c
+ battery.c wdt.c
OBJ=$(SRC:.c=.o)
#define NUM_ADCS 2
volatile static unsigned char current_adc;;
-static unsigned char need_battery_adc;
+volatile unsigned char need_battery_adc;
static uint16_t adc_sum, read_zero, drop_count, read_count, n_reads_log;
volatile uint16_t jiffies;
DIDR0 = 0;
}
-static void inline adc_based_timer()
-{
- static unsigned char count;
-
- if (++count < 40) // about 100 Hz jiffies
- return;
-
- count = 0;
- ++jiffies;
-
- if ((jiffies & 0x007F) == 1) { // about every 1s
- need_battery_adc = 1;
- }
- if ((jiffies & 0x0007) == 0) {
- patterns_next_tick();
- }
- timer_check_buttons();
-}
-
ISR(ADC_vect) { // IRQ handler
uint16_t adcval = ADCW;
- adc_based_timer();
-
if (read_zero) {
setup_mux(current_adc);
read_zero = 0;
#include "lights.h"
#define WAKEUP_LIMIT 5 // times 100 ms
-#define SHORT_PRESS_MIN 10 // in jiffies (100 Hz ticks)
-#define SHORT_PRESS_MAX 50
-#define LONG_PRESS_MIN 100
+#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;
static unsigned char prev_state;
} else if (!cur && prev) { // --- just released ---
uint16_t duration = jiffies - button_start;
- if (duration > SHORT_PRESS_MIN && duration < SHORT_PRESS_MAX) {
+ if (duration >= SHORT_PRESS_MIN && duration < SHORT_PRESS_MAX) {
short_press();
} else if (duration > LONG_PRESS_MIN) {
// set_status_led(button, NULL);
/* adc.c */
#define PWMLED_ADC_SHIFT 1 /* 1<<1 measurements per single callback */
-extern volatile uint16_t jiffies;
+extern volatile unsigned char need_battery_adc;
+extern volatile unsigned char adc_running;
void init_adc();
void susp_adc();
/* pwm.c */
#define PWM_MAX 0xFF
+extern volatile unsigned char pwm_running;
void init_pwm();
void susp_pwm();
void pwm_off();
#define ERR_PWMLED 2
void set_error(unsigned char err);
+/* wdt.c */
+extern volatile uint16_t jiffies;
+void init_wdt();
+void susp_wdt();
+
/* main.c */
void power_down();
{
power_all_disable();
- wdt_enable(WDTO_1S);
-
init_battery();
init_pwm();
init_adc();
+ init_wdt();
init_buttons();
{
susp_pwm();
susp_adc();
+ susp_wdt();
+
susp_buttons();
- wdt_disable();
power_all_disable();
}
sei();
#if 1
while (1) {
- wdt_reset();
- sleep_mode();
+ cli();
+ if (pwm_running) {
+ set_sleep_mode(SLEEP_MODE_IDLE);
+ } else if (adc_running) {
+ set_sleep_mode(SLEEP_MODE_ADC);
+ } else {
+ set_sleep_mode(SLEEP_MODE_PWR_DOWN);
+ }
+ // keep BOD active, no sleep_bod_disable();
+ sei();
+ sleep_cpu();
+ sleep_disable();
}
#endif
--- /dev/null
+#include <avr/io.h>
+#include <avr/interrupt.h>
+#include <avr/wdt.h>
+
+#include "lights.h"
+
+void init_wdt()
+{
+ wdt_enable(WDTO_60MS);
+ WDTCR |= _BV(WDIE);
+}
+
+void susp_wdt()
+{
+ wdt_disable();
+}
+
+ISR(WDT_vect) {
+ ++jiffies;
+
+ if (jiffies & 0x000F) {
+ need_battery_adc = 1; // about every 1s
+ }
+
+ patterns_next_tick();
+ timer_check_buttons();
+}