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 @@ ...@@ -24,25 +24,26 @@
typedef enum {SCHED_CH1=0,SCHED_CH2=1,SCHED_CH3=2,SCHED_CH4=3} sched_channel_t; typedef enum {SCHED_CH1=0,SCHED_CH2=1,SCHED_CH3=2,SCHED_CH4=3} sched_channel_t;
typedef struct{ typedef struct{
void (*function)(void); void (*function)(void *data);
unsigned char period_ms; unsigned char period_ms;
unsigned int pulse; unsigned int pulse;
unsigned char enabled; unsigned char enabled;
void *data;
}TSchedulerChannel; }TSchedulerChannel;
typedef struct{ typedef struct{
TSchedulerChannel channels[SCHEDULER_MAX_CHANNELS]; TSchedulerChannel channels[SCHEDULER_MAX_CHANNELS];
unsigned char num_channels; unsigned char num_channels;
unsigned short int prescaler; unsigned short int prescaler;
void (* start)(sched_channel_t); void (* start)(unsigned short int);
void (* stop)(sched_channel_t); void (* stop)(unsigned short int);
void (* set_pulse)(sched_channel_t,unsigned short,unsigned char); void (* set_pulse)(unsigned short int,unsigned short int,unsigned char);
}TScheduler; }TScheduler;
void scheduler_init(TScheduler *scheduler,unsigned char num_channels, unsigned short int prescaler); void scheduler_init(TScheduler *scheduler,unsigned char num_channels, unsigned short int prescaler);
void scheduler_interrupt(TScheduler *scheduler,sched_channel_t channel_id); void scheduler_interrupt(TScheduler *scheduler,sched_channel_t channel_id);
unsigned short int scheduler_get_pulse(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_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_period(TScheduler *scheduler,sched_channel_t channel_id,unsigned char period_ms);
void scheduler_disable_channel(TScheduler *scheduler,sched_channel_t channel_id); 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) ...@@ -42,13 +42,13 @@ void scheduler_interrupt(TScheduler *scheduler,sched_channel_t channel_id)
if(channel_id<scheduler->num_channels) if(channel_id<scheduler->num_channels)
{ {
if(scheduler->set_pulse!=0x00000000) 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) 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) if(channel_id<scheduler->num_channels)
{ {
...@@ -61,6 +61,7 @@ void scheduler_set_channel(TScheduler *scheduler,sched_channel_t channel_id, voi ...@@ -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].function=function;
scheduler->channels[channel_id].period_ms=period_ms; scheduler->channels[channel_id].period_ms=period_ms;
scheduler->channels[channel_id].pulse=scheduler_ms_to_pulse(scheduler,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) ...@@ -71,9 +72,9 @@ void scheduler_enable_channel(TScheduler *scheduler,sched_channel_t channel_id)
if(scheduler->channels[channel_id].enabled==0x00) if(scheduler->channels[channel_id].enabled==0x00)
{ {
if(scheduler->set_pulse!=0x00000000) 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) if(scheduler->start!=0x00000000)
scheduler->start(channel_id); scheduler->start(scheduler_get_channel(channel_id));
scheduler->channels[channel_id].enabled=0x01; scheduler->channels[channel_id].enabled=0x01;
} }
} }
...@@ -92,8 +93,8 @@ void scheduler_disable_channel(TScheduler *scheduler,sched_channel_t channel_id) ...@@ -92,8 +93,8 @@ void scheduler_disable_channel(TScheduler *scheduler,sched_channel_t channel_id)
if(scheduler->channels[channel_id].enabled==0x01) if(scheduler->channels[channel_id].enabled==0x01)
{ {
if(scheduler->stop!=0x00000000) if(scheduler->stop!=0x00000000)
scheduler->stop(channel_id); scheduler->stop(scheduler_get_channel(channel_id));
scheduler->channels[channel_id].enabled=0x0; 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