]> www.fi.muni.cz Git - bike-lights.git/blobdiff - firmware/main.c
mudflap for dual rearlights
[bike-lights.git] / firmware / main.c
index e6f03b01fafa1156aeb86cc01cb7da7eabc62f1c..b3fcc654099c4adacf9dd0262dd6d18066e53499 100644 (file)
@@ -1,5 +1,6 @@
 #include <avr/io.h>
 #include <util/delay.h>
+#include <util/atomic.h>
 #include <avr/sleep.h>
 #include <avr/interrupt.h>
 #include <avr/power.h>
@@ -7,6 +8,8 @@
 
 #include "lights.h"
 
+static unsigned char prev_jiffies_8;
+
 static void hw_setup()
 {
        init_battery();
@@ -83,11 +86,40 @@ static void inline first_boot()
        hw_setup();
        power_down(mcusr_save & _BV(WDRF));
 
+       prev_jiffies_8 = jiffies;
+
        sei();
 }
 
+static void inline do_timer()
+{
+       // For now, we run them all in their own atomic blocks
+       ATOMIC_BLOCK(ATOMIC_FORCEON) {
+               timer_check_buttons();
+       }
+       ATOMIC_BLOCK(ATOMIC_FORCEON) {
+               patterns_next_tick();
+       }
+       ATOMIC_BLOCK(ATOMIC_FORCEON) {
+               pwm_disable_if_not_needed();
+       }
+       ATOMIC_BLOCK(ATOMIC_FORCEON) {
+               timer_start_slow_adcs();
+       }
+       ATOMIC_BLOCK(ATOMIC_FORCEON) {
+               if ((jiffies & 0x7FF) == 0)
+                       ambient_log_min_max();
+       }
+}
+
 static void inline main_loop_iteration()
 {
+       unsigned char jiffies_8; /*
+                                 * we use only lower 8-bits in order to
+                                 * avoid the need for locking of 16-bit
+                                 * accesses.
+                                 */
+
        cli();
        if (TIMER1_IS_ON()) {
                set_sleep_mode(SLEEP_MODE_IDLE);
@@ -102,6 +134,20 @@ static void inline main_loop_iteration()
        sei();
        sleep_cpu();
        sleep_disable();
+
+       jiffies_8 = jiffies;
+
+       if (jiffies_8 != prev_jiffies_8) { // was timer IRQ
+               if (jiffies_8 - prev_jiffies_8 > 1) { // overrun
+                       log_byte(0xee);
+                       log_byte(jiffies_8 - prev_jiffies_8);
+                       log_flush();
+               }
+
+               prev_jiffies_8 = jiffies_8;
+
+               do_timer();
+       }
 }
 
 int main(void)