3 #include <twr_common.h>
6 #include <twr_scheduler.h>
7 #include <twr_system.h>
19 TIM_HandleTypeDef ir_timer;
26 void (*event_handler)(twr_ir_rx_event_t,
void *);
29 #ifdef _TWR_IR_RX_DEBUG
34 static void TIM6_handler(
void *param);
36 void twr_ir_rx_get_code(uint32_t *nec_code)
38 *nec_code = _twr_ir_rx.ir_rx_value;
42 static void _twr_ir_rx_task_notify(
void *param)
46 if (_twr_ir_rx.event_handler != NULL)
48 _twr_ir_rx.event_handler(TWR_IR_RX_NEC_FORMAT, _twr_ir_rx.event_param);
57 #ifdef _TWR_IR_RX_DEBUG
61 if(_twr_ir_rx.counter == 0)
64 __HAL_TIM_DISABLE(&_twr_ir_rx.ir_timer);
65 __HAL_TIM_DISABLE_IT(&_twr_ir_rx.ir_timer, TIM_IT_UPDATE);
66 __HAL_TIM_CLEAR_IT(&_twr_ir_rx.ir_timer, TIM_IT_UPDATE);
68 HAL_TIM_Base_Start_IT(&_twr_ir_rx.ir_timer);
74 uint16_t act_len = __HAL_TIM_GET_COUNTER(&_twr_ir_rx.ir_timer);
75 __HAL_TIM_SET_COUNTER(&_twr_ir_rx.ir_timer, 0);
78 #ifdef _TWR_IR_RX_DEBUG
79 _twr_ir_rx.lengths[_twr_ir_rx.counter] = act_len;
83 if(_twr_ir_rx.counter == 1)
85 if(act_len < 8000 || act_len > 14000)
94 if(_twr_ir_rx.counter == 2)
96 _twr_ir_rx.ir_rx_temp = 0;
100 if(act_len > 1500 && _twr_ir_rx.counter >= 2)
102 _twr_ir_rx.ir_rx_temp |= (1 << (_twr_ir_rx.counter-2));
106 if(_twr_ir_rx.counter == 33)
108 #ifdef _TWR_IR_RX_DEBUG
115 _twr_ir_rx.counter = 0;
116 _twr_ir_rx.ir_rx_value = _twr_ir_rx.ir_rx_temp;
121 __HAL_TIM_DISABLE(&_twr_ir_rx.ir_timer);
122 __HAL_TIM_DISABLE_IT(&_twr_ir_rx.ir_timer, TIM_IT_UPDATE);
123 __HAL_TIM_CLEAR_IT(&_twr_ir_rx.ir_timer, TIM_IT_UPDATE);
130 _twr_ir_rx.counter++;
133 void twr_ir_rx_set_event_handler(
void (*event_handler)(twr_ir_rx_event_t,
void *),
void *event_param)
135 _twr_ir_rx.event_handler = event_handler;
136 _twr_ir_rx.event_param = event_param;
139 void twr_ir_rx_init()
142 twr_system_pll_enable();
151 #ifdef _TWR_IR_RX_DEBUG
159 _twr_ir_rx.ir_timer.Instance = TIM6;
161 _twr_ir_rx.ir_timer.Init.Prescaler = SystemCoreClock / 1000000;
162 _twr_ir_rx.ir_timer.Init.CounterMode = TIM_COUNTERMODE_UP;
164 _twr_ir_rx.ir_timer.Init.Period = 16000;
165 _twr_ir_rx.ir_timer.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
166 HAL_TIM_Base_Init(&_twr_ir_rx.ir_timer);
167 HAL_NVIC_EnableIRQ(TIM6_IRQn);
176 static void TIM6_handler(
void *param)
180 #ifdef _TWR_IR_RX_DEBUG
187 if(__HAL_TIM_GET_FLAG(&_twr_ir_rx.ir_timer, TIM_FLAG_UPDATE) != RESET)
189 if(__HAL_TIM_GET_IT_SOURCE(&_twr_ir_rx.ir_timer, TIM_IT_UPDATE) !=RESET)
192 __HAL_TIM_CLEAR_IT(&_twr_ir_rx.ir_timer, TIM_IT_UPDATE);
193 __HAL_TIM_DISABLE(&_twr_ir_rx.ir_timer);
194 __HAL_TIM_DISABLE_IT(&_twr_ir_rx.ir_timer, TIM_IT_UPDATE);
196 _twr_ir_rx.counter = 0;
void twr_exti_register(twr_exti_line_t line, twr_exti_edge_t edge, void(*callback)(twr_exti_line_t, void *), void *param)
Enable EXTI line interrupt and register callback function.
twr_exti_line_t
EXTI lines.
@ TWR_EXTI_LINE_P10
EXTI line P10.
@ TWR_EXTI_EDGE_FALLING
EXTI line is configured to falling edge sensitivity.
void twr_gpio_set_pull(twr_gpio_channel_t channel, twr_gpio_pull_t pull)
Set pull-up/pull-down configuration for GPIO channel.
void twr_gpio_init(twr_gpio_channel_t channel)
Initialize GPIO channel.
void twr_gpio_toggle_output(twr_gpio_channel_t channel)
Toggle output state for GPIO channel.
void twr_gpio_set_mode(twr_gpio_channel_t channel, twr_gpio_mode_t mode)
Set mode of operation for GPIO channel.
@ TWR_GPIO_MODE_INPUT
GPIO channel operates as input.
@ TWR_GPIO_MODE_OUTPUT
GPIO channel operates as output.
@ TWR_GPIO_P11
GPIO channel P11, TXD2.
@ TWR_GPIO_P10
GPIO channel P10, RXD2.
@ TWR_GPIO_PULL_UP
GPIO channel has pull-up.
size_t twr_scheduler_task_id_t
Task ID assigned by scheduler.
void twr_scheduler_plan_now(twr_scheduler_task_id_t task_id)
Schedule specified task for immediate execution.
twr_scheduler_task_id_t twr_scheduler_register(void(*task)(void *), void *param, twr_tick_t tick)
Register task in scheduler.
#define TWR_TICK_INFINITY
Maximum timestamp value.
bool twr_timer_set_irq_handler(TIM_TypeDef *tim, void(*irq_handler)(void *), void *irq_param)
Register timer IRQ handler.