X-Git-Url: https://oss.titaniummirror.com/gitweb?a=blobdiff_plain;f=tmr.c;h=670d0e142398c57313573e21b8e9666bc814ce6e;hb=be367d7f046a080f1575ac4e918a94dfad24fa73;hp=aa3f58df722b644e007b1dc98118991827af5354;hpb=8584c7dd3bf9ad3362f285f065d66c8524340ef4;p=rgblamp.git diff --git a/tmr.c b/tmr.c index aa3f58d..670d0e1 100644 --- a/tmr.c +++ b/tmr.c @@ -15,7 +15,7 @@ persistent tmr_time_t _tmr_ticks; tmr_bitno_t _tmr_on; tmr_bitno_t _tmr_periodic; -static tmr_bitno_t _tmr_fired; +static tmr_bitno_t _tmr_flag; static tmr_time_t _tmr_t0[TMR_COUNT]; static tmr_time_t _tmr_elapsed[TMR_COUNT]; @@ -52,7 +52,7 @@ void tmr_start(tmr_bitno_t t, tmr_time_t elapsed) ndi(); bit_set(_tmr_on, t); bit_clr(_tmr_periodic, t); - bit_clr(_tmr_fired, t); + bit_clr(_tmr_flag, t); _tmr_t0[t] = _tmr_ticks; _tmr_elapsed[t] = elapsed; nei(); @@ -63,8 +63,8 @@ void tmr_startAt(tmr_bitno_t t, tmr_time_t t0, tmr_time_t elapsed) ndi(); bit_set(_tmr_on, t); bit_clr(_tmr_periodic, t); - bit_clr(_tmr_fired, t); - _tmr_t0[t] = t0 + elapsed; + bit_clr(_tmr_flag, t); + _tmr_t0[t] = t0; nei(); } @@ -73,8 +73,8 @@ void tmr_startPeriodic(tmr_bitno_t t, tmr_time_t elapsed) ndi(); bit_set(_tmr_on, t); bit_set(_tmr_periodic, t); - bit_clr(_tmr_fired, t); - _tmr_t0[t] = _tmr_ticks + elapsed; + bit_clr(_tmr_flag, t); + _tmr_t0[t] = _tmr_ticks; _tmr_elapsed[t] = elapsed; nei(); } @@ -84,24 +84,22 @@ void tmr_startPeriodicAt(tmr_bitno_t t, tmr_time_t t0, tmr_time_t elapsed) ndi(); bit_set(_tmr_on, t); bit_set(_tmr_periodic, t); - bit_clr(_tmr_fired, t); - _tmr_t0[t] = t0 + elapsed; + bit_clr(_tmr_flag, t); + _tmr_t0[t] = t0; _tmr_elapsed[t] = elapsed; nei(); } bit tmr_fired(tmr_bitno_t t) { - /* FIXME: if called from ISR ndi()/nei() is not required */ - static unsigned char last_fired; unsigned char fired; ndi(); - fired = bit_get(_tmr_fired, t) != 0; + fired = bit_get(_tmr_flag, t); if (fired) - bit_clr(_tmr_fired, t); + bit_clr(_tmr_flag, t); nei(); - return fired; + return fired != 0; } void tmr_isr() @@ -110,8 +108,8 @@ void tmr_isr() TMR0IF = 0; _tmr_ticks++; for (tmr_bitno_t t = 0; t < TMR_COUNT; t++) { - if (_tmr_ticks - _tmr_t0[t] <= 0) { - bit_set(_tmr_fired, t); + if (bit_get(_tmr_on, t) && _tmr_ticks - _tmr_t0[t] <= _tmr_elapsed[t]) { + bit_set(_tmr_flag, t); if (bit_get(_tmr_periodic, t)) _tmr_t0[t] += _tmr_elapsed[t]; else