X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?p=bike-lights.git;a=blobdiff_plain;f=firmware%2Fmain.c;h=d10a322bd34c721aca16d3bfbc63e12c2e4bb570;hp=e6f03b01fafa1156aeb86cc01cb7da7eabc62f1c;hb=HEAD;hpb=6ce11e298f73e160555e2bf4dd3d88f120fbdebd diff --git a/firmware/main.c b/firmware/main.c index e6f03b0..b3fcc65 100644 --- a/firmware/main.c +++ b/firmware/main.c @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -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)