Skip to content
Snippets Groups Projects
Commit f72a8ec1 authored by Sergi Hernandez's avatar Sergi Hernandez
Browse files

Added a one shot feature.

parent f0f8d07f
No related branches found
No related tags found
No related merge requests found
......@@ -32,6 +32,7 @@ typedef struct{
unsigned char period_ms;
unsigned int pulse;
unsigned char enabled;
unsigned char one_shot;
void *data;
}TSchedulerChannel;
......@@ -48,8 +49,10 @@ void scheduler_init(TScheduler *scheduler,unsigned char num_channels, unsigned s
void scheduler_interrupt(TScheduler *scheduler,sched_channel_t channel_id);
unsigned short int scheduler_get_pulse(TScheduler *scheduler, sched_channel_t channel_id);
void scheduler_set_channel(TScheduler *scheduler,sched_channel_t channel_id, void (*function)(void *data), unsigned char period_ms,void *data);
void scheduler_set_channel_one_shot(TScheduler *scheduler,sched_channel_t channel_id, void (*function)(void *data), unsigned char delay_ms,void *data);
void scheduler_enable_channel(TScheduler *scheduler,sched_channel_t channel_id);
void scheduler_change_period(TScheduler *scheduler,sched_channel_t channel_id,unsigned char period_ms);
void scheduler_change_delay(TScheduler *scheduler,sched_channel_t channel_id,unsigned char delay_ms);
void scheduler_disable_channel(TScheduler *scheduler,sched_channel_t channel_id);
#ifdef __cplusplus
......
......@@ -29,6 +29,7 @@ void scheduler_init(TScheduler *scheduler,unsigned char num_channels, unsigned s
scheduler->channels[i].function=0x00000000;
scheduler->channels[i].period_ms=0;
scheduler->channels[i].enabled=0x00;
scheduler->channels[i].one_shot=0x00;
}
scheduler->num_channels=num_channels;
scheduler->prescaler=prescaler;
......@@ -41,10 +42,19 @@ void scheduler_interrupt(TScheduler *scheduler,sched_channel_t channel_id)
{
if(channel_id<scheduler->num_channels)
{
if(scheduler->set_pulse!=0x00000000)
scheduler->set_pulse(scheduler_get_channel(channel_id),scheduler->channels[channel_id].pulse,0x01);
if(scheduler->channels[channel_id].function!=0x00000000)
scheduler->channels[channel_id].function(scheduler->channels[channel_id].data);
if(scheduler->channels[channel_id].one_shot==0x00)
{
if(scheduler->set_pulse!=0x00000000)
scheduler->set_pulse(scheduler_get_channel(channel_id),scheduler->channels[channel_id].pulse,0x01);
if(scheduler->channels[channel_id].function!=0x00000000)
scheduler->channels[channel_id].function(scheduler->channels[channel_id].data);
}
else
{
if(scheduler->channels[channel_id].function!=0x00000000)
scheduler->channels[channel_id].function(scheduler->channels[channel_id].data);
scheduler_disable_channel(scheduler,channel_id);
}
}
}
......@@ -62,6 +72,25 @@ void scheduler_set_channel(TScheduler *scheduler,sched_channel_t channel_id, voi
scheduler->channels[channel_id].period_ms=period_ms;
scheduler->channels[channel_id].pulse=scheduler_ms_to_pulse(scheduler,period_ms);
scheduler->channels[channel_id].data=data;
scheduler->channels[channel_id].one_shot=0x00;
}
}
void scheduler_set_channel_one_shot(TScheduler *scheduler,sched_channel_t channel_id, void (*function)(void *data), unsigned char delay_ms,void *data)
{
if(channel_id<scheduler->num_channels)
{
if(scheduler->channels[channel_id].enabled==0x01)
{
if(scheduler->stop!=0x00000000)
scheduler->stop(channel_id);
scheduler->channels[channel_id].enabled=0x00;
}
scheduler->channels[channel_id].function=function;
scheduler->channels[channel_id].period_ms=delay_ms;
scheduler->channels[channel_id].pulse=scheduler_ms_to_pulse(scheduler,delay_ms);
scheduler->channels[channel_id].data=data;
scheduler->channels[channel_id].one_shot=0x01;
}
}
......@@ -84,8 +113,23 @@ void scheduler_change_period(TScheduler *scheduler,sched_channel_t channel_id,un
{
if(channel_id<scheduler->num_channels)
{
scheduler->channels[channel_id].period_ms=period_ms;
scheduler->channels[channel_id].pulse=scheduler_ms_to_pulse(scheduler,period_ms);
if(scheduler->channels[channel_id].one_shot==0x00)
{
scheduler->channels[channel_id].period_ms=period_ms;
scheduler->channels[channel_id].pulse=scheduler_ms_to_pulse(scheduler,period_ms);
}
}
}
void scheduler_change_delay(TScheduler *scheduler,sched_channel_t channel_id,unsigned char delay_ms)
{
if(channel_id<scheduler->num_channels)
{
if(scheduler->channels[channel_id].one_shot==0x01)
{
scheduler->channels[channel_id].period_ms=delay_ms;
scheduler->channels[channel_id].pulse=scheduler_ms_to_pulse(scheduler,delay_ms);
}
}
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment