diff --git a/scheduler/include/scheduler.h b/scheduler/include/scheduler.h index 0effa946db7e27abd75e62ddef208306c0f7b5f1..40b835104285c1c424fd69d12353fc00fb5b77f0 100644 --- a/scheduler/include/scheduler.h +++ b/scheduler/include/scheduler.h @@ -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 diff --git a/scheduler/src/scheduler.c b/scheduler/src/scheduler.c index d396e9be9c7a8e1f9030392f15b5d6ab84873e35..a7501520384d9cd7af5c2fb34c72ddd4f947052c 100644 --- a/scheduler/src/scheduler.c +++ b/scheduler/src/scheduler.c @@ -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); + } } }