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

Added a pointer to a data structure.

This pointer is passed as an argument to the callback function.
parent 4b7033a7
No related branches found
No related tags found
No related merge requests found
......@@ -24,25 +24,26 @@
typedef enum {SCHED_CH1=0,SCHED_CH2=1,SCHED_CH3=2,SCHED_CH4=3} sched_channel_t;
typedef struct{
void (*function)(void);
void (*function)(void *data);
unsigned char period_ms;
unsigned int pulse;
unsigned char enabled;
void *data;
}TSchedulerChannel;
typedef struct{
TSchedulerChannel channels[SCHEDULER_MAX_CHANNELS];
unsigned char num_channels;
unsigned short int prescaler;
void (* start)(sched_channel_t);
void (* stop)(sched_channel_t);
void (* set_pulse)(sched_channel_t,unsigned short,unsigned char);
void (* start)(unsigned short int);
void (* stop)(unsigned short int);
void (* set_pulse)(unsigned short int,unsigned short int,unsigned char);
}TScheduler;
void scheduler_init(TScheduler *scheduler,unsigned char num_channels, unsigned short int prescaler);
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), unsigned char period_ms);
void scheduler_set_channel(TScheduler *scheduler,sched_channel_t channel_id, void (*function)(void *data), unsigned char period_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_disable_channel(TScheduler *scheduler,sched_channel_t channel_id);
......
......@@ -42,13 +42,13 @@ void scheduler_interrupt(TScheduler *scheduler,sched_channel_t channel_id)
if(channel_id<scheduler->num_channels)
{
if(scheduler->set_pulse!=0x00000000)
scheduler->set_pulse(channel_id,scheduler->channels[channel_id].pulse,0x01);
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].function(scheduler->channels[channel_id].data);
}
}
void scheduler_set_channel(TScheduler *scheduler,sched_channel_t channel_id, void (*function)(void), unsigned char period_ms)
void scheduler_set_channel(TScheduler *scheduler,sched_channel_t channel_id, void (*function)(void *data), unsigned char period_ms,void *data)
{
if(channel_id<scheduler->num_channels)
{
......@@ -61,6 +61,7 @@ void scheduler_set_channel(TScheduler *scheduler,sched_channel_t channel_id, voi
scheduler->channels[channel_id].function=function;
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;
}
}
......@@ -71,9 +72,9 @@ void scheduler_enable_channel(TScheduler *scheduler,sched_channel_t channel_id)
if(scheduler->channels[channel_id].enabled==0x00)
{
if(scheduler->set_pulse!=0x00000000)
scheduler->set_pulse(channel_id,scheduler->channels[channel_id].pulse,0x00);
scheduler->set_pulse(scheduler_get_channel(channel_id),scheduler->channels[channel_id].pulse,0x00);
if(scheduler->start!=0x00000000)
scheduler->start(channel_id);
scheduler->start(scheduler_get_channel(channel_id));
scheduler->channels[channel_id].enabled=0x01;
}
}
......@@ -92,8 +93,8 @@ void scheduler_disable_channel(TScheduler *scheduler,sched_channel_t channel_id)
if(scheduler->channels[channel_id].enabled==0x01)
{
if(scheduler->stop!=0x00000000)
scheduler->stop(channel_id);
scheduler->channels[channel_id].enabled=0x0;
scheduler->stop(scheduler_get_channel(channel_id));
scheduler->channels[channel_id].enabled=0x00;
}
}
}
......
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