Appiko
out_pattern_gen.c
1 
20 #include "nrf.h"
21 #include "out_pattern_gen.h"
22 #include "nrf_assert.h"
23 #include "ms_timer.h"
24 #include "hal_gpio.h"
25 #include "string.h"
26 #include "log.h"
27 #include "stddef.h"
28 #include "common_util.h"
29 
31 #define OUT_GEN_MS_TIMER_USED CONCAT_2(MS_TIMER, MS_TIMER_USED_OUT_GEN)
32 
33 static struct
34 {
35  uint32_t num_out;
36  bool is_on;
37  uint8_t out_pins[OUT_GEN_MAX_NUM_OUT];
39  uint32_t num_transitions;
40  uint32_t current_transition;
41  uint32_t transitions_durations[OUT_GEN_MAX_TRANSITIONS];
42  uint32_t end_context;
43 }context;
44 
45 void (*done_handler)(uint32_t out_gen_state);
46 
47 static uint32_t timer_start_ticks_value;
48 
49 static void timer_handler(void)
50 {
51  context.current_transition++;
52 
53 
54  for(uint32_t i = 0; i< context.num_out; i++)
55  {
56  hal_gpio_pin_write(context.out_pins[i], context.next_out[i][context.current_transition]);
57  }
58 
59  if(context.current_transition == context.num_transitions)
60  {
61  context.is_on = false;
62  if(done_handler != NULL)
63  {
64  done_handler(context.end_context);
65  }
66  }
67  else
68  {
69  ms_timer_start(OUT_GEN_MS_TIMER_USED, MS_SINGLE_CALL,
70  context.transitions_durations[context.current_transition],timer_handler);
71  }
72 }
73 
74 void out_gen_init(uint32_t num_out, uint32_t * out_pins, bool * out_init_value)
75 {
76  log_printf("OUT_GEN_INIT\n");
77  ASSERT((num_out <= OUT_GEN_MAX_NUM_OUT) && (num_out > 0));
78 
79  context.num_out = num_out;
80  for(uint32_t i = 0; i < num_out; i++)
81  {
82  context.out_pins[i] = out_pins[i];
83  hal_gpio_cfg_output(out_pins[i], out_init_value[i]);
84  }
85 
86  context.is_on = false;
87 }
88 
89 void out_gen_start(out_gen_config_t * out_gen_config)
90 {
92  && (out_gen_config->num_transitions > 0));
93  memset(context.next_out, 0, sizeof(context.next_out));
94  memset(context.transitions_durations, 0 ,
95  sizeof(context.transitions_durations));
96 
97  context.current_transition = 0;
98  context.num_transitions = out_gen_config->num_transitions;
99  memcpy(context.transitions_durations, out_gen_config->transitions_durations,
100  out_gen_config->num_transitions*sizeof(uint32_t) );
101  for(uint32_t i = 0; i < context.num_out; i++)
102  {
103  memcpy( (*(context.next_out + i)), (*(out_gen_config->next_out+i)),
104  (1+out_gen_config->num_transitions)*sizeof(bool));
105  hal_gpio_pin_write(context.out_pins[i],
106  out_gen_config->next_out[i][context.current_transition]);
107  }
108  context.is_on = true;
109  context.end_context = out_gen_config->out_gen_state;
110  done_handler = out_gen_config->done_handler;
111 
112  ms_timer_start(OUT_GEN_MS_TIMER_USED, MS_SINGLE_CALL,
113  out_gen_config->transitions_durations[context.current_transition],timer_handler);
114  timer_start_ticks_value = ms_timer_get_current_count();
115 }
116 
117 void out_gen_stop(bool * out_vals)
118 {
119  context.is_on = false;
120  ms_timer_stop(OUT_GEN_MS_TIMER_USED);
121  for(uint32_t i = 0; i< context.num_out; i++)
122  {
123  hal_gpio_pin_write(context.out_pins[i], out_vals[i]);
124  }
125 }
126 
127 bool out_gen_is_on(void)
128 {
129  return context.is_on;
130 }
131 
132 inline uint32_t out_gen_get_ticks(void)
133 {
134  return ((ms_timer_get_current_count() + (1<<24) - timer_start_ticks_value)
135  & 0x00FFFFFF);
136 }
void(* done_handler)(uint32_t out_gen_state)
A pointer to a handler called after a pattern is generated.
uint32_t ms_timer_get_current_count(void)
Return the current count (24 bit) of the RTC timer used.
Definition: ms_timer.h:127
uint32_t transitions_durations[OUT_GEN_MAX_TRANSITIONS]
1 dimensional array containing the durations in terms of LFCLK frequency ticks for the transitions.
uint32_t num_transitions
The number of transitions in this pattern.
bool next_out[OUT_GEN_MAX_NUM_OUT][OUT_GEN_MAX_TRANSITIONS]
A 2 dimensional boolean array containing the next digital output value for the various transitions ac...
uint32_t out_gen_state
State which is to be started with this configuration, passed as an argument with the done_handler.
void out_gen_init(uint32_t num_out, uint32_t *out_pins, bool *out_init_value)
Initialize the output pattern generator module with the information of the pins on which the pattern ...
void out_gen_stop(bool *out_vals)
Stop the output pattern generation and sets the output pins as specified in the arguments.
#define ASSERT(expression)
Macro for runtime assertion of an expression. If the expression is false the assert_nrf_callback func...
Definition: nrf_assert.h:48
bool out_gen_is_on(void)
To know if the output pattern generator module is on.
#define OUT_GEN_MAX_TRANSITIONS
void ms_timer_start(ms_timer_num id, ms_timer_mode mode, uint64_t ticks, void(*handler)(void))
Definition: ms_timer.c:134
Configuration structure for output pattern generation.
#define OUT_GEN_MAX_NUM_OUT
void out_gen_start(out_gen_config_t *out_gen_config)
Start the generation of the pattern with the information provided.
uint32_t out_gen_get_ticks(void)
Function to get ticks since last call of out_gen_start.
void ms_timer_stop(ms_timer_num id)
Definition: ms_timer.c:173
One shot call of the timer.
Definition: ms_timer.h:82