You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

102 lines
2.5 KiB

/** @file flasher.c
@author M. P. Hayes, UCECE
@date 13 March 2005
@brief Combined software PWM and flashing module. Use at your peril!
This should be simplified.
*/
#include "flasher.h"
/* These routines are for flashing a LED or beeping a piezo tweeter.
Perhaps they should be separated into software PWM and flash
pattern sequencing. */
int8_t
flasher_pattern_set (flasher_t flasher, flasher_pattern_t *pattern)
{
flasher->pattern = pattern;
flasher->mod_count = 0;
flasher->flasher_count = 0;
flasher->flashes_count = 0;
flasher->flasher_prescale = 0;
return 1;
}
flasher_pattern_t *
flasher_pattern_get (flasher_t flasher)
{
return flasher->pattern;
}
/* FIXME. */
int8_t
flasher_phase_set (flasher_t flasher, uint8_t phase)
{
flasher->mod_count = 0;
flasher->flasher_count = 0;
flasher->flashes_count = phase;
return 1;
}
/* Return the next state for the associated device. For example,
to control the flashing of a LED use:
led_set (led, flasher_update (flasher)); */
bool
flasher_update (flasher_t flasher)
{
if (!flasher->pattern)
return 0;
flasher->mod_count++;
if (flasher->mod_count >= flasher->pattern->mod_period)
{
flasher->mod_count = 0;
flasher->flasher_prescale++;
if (flasher->flasher_prescale >= FLASHER_PRESCALE)
{
flasher->flasher_prescale = 0;
flasher->flasher_count++;
if (flasher->flasher_count >= flasher->pattern->flasher_period)
{
flasher->flasher_count = 0;
flasher->flashes_count++;
if (!flasher->pattern->period)
{
/* One shot mode. */
if (flasher->flashes_count >= flasher->pattern->flashes)
{
/* Disable pattern. */
flasher->pattern = 0;
return 1;
}
}
else if (flasher->flashes_count >= flasher->pattern->period)
{
flasher->flashes_count = 0;
}
}
}
}
return flasher->mod_count < flasher->pattern->mod_duty
&& flasher->flasher_count < flasher->pattern->flasher_duty
&& flasher->flashes_count < flasher->pattern->flashes;
}
/* Create a new flasher device. */
flasher_t
flasher_init (flasher_obj_t *flasher)
{
flasher_pattern_set (flasher, 0);
return flasher;
}