IR RX simple app (#218)

* split falling and rising ir rx events
* fix irda
* simple irda rx function for app
* add extern timer
* fix timer num for f2
This commit is contained in:
DrZlo13
2020-11-11 10:36:27 +03:00
committed by GitHub
parent f05ffddbde
commit 9d8c36810e
11 changed files with 79 additions and 10 deletions

View File

@@ -7,12 +7,13 @@
typedef enum {
EventTypeTick,
EventTypeKey,
EventTypeLed,
EventTypeRX,
} EventType;
typedef struct {
union {
InputEvent input;
bool rx_edge;
} value;
EventType type;
} AppEvent;
@@ -227,8 +228,11 @@ static void input_callback(InputEvent* input_event, void* ctx) {
osMessageQueuePut(event_queue, &event, 0, 0);
}
osMessageQueueId_t irda_event_queue;
void irda(void* p) {
osMessageQueueId_t event_queue = osMessageQueueNew(1, sizeof(AppEvent), NULL);
osMessageQueueId_t event_queue = osMessageQueueNew(32, sizeof(AppEvent), NULL);
irda_event_queue = event_queue;
State _state;
uint8_t mode_count = sizeof(modes) / sizeof(modes[0]);
@@ -259,6 +263,19 @@ void irda(void* p) {
}
gui->add_widget(gui, widget, GuiLayerFullscreen);
// Red LED
// create pin
GpioPin led = led_gpio[0];
// TODO open record
GpioPin* led_record = &led;
// configure pin
gpio_init(led_record, GpioModeOutputOpenDrain);
// setup irda rx timer
tim_irda_rx_init();
AppEvent event;
while(1) {
osStatus_t event_status = osMessageQueueGet(event_queue, &event, NULL, osWaitForever);
@@ -287,7 +304,10 @@ void irda(void* p) {
}
modes[state->mode_id].input(&event, state);
} else if(event.type == EventTypeRX) {
gpio_write(led_record, event.value.rx_edge);
}
} else {
// event timeout
}
@@ -295,4 +315,23 @@ void irda(void* p) {
release_mutex(&state_mutex, state);
widget_update(widget);
}
}
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef* htim) {
if(htim->Instance == TIM2) {
if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) {
// falling event
AppEvent event;
event.type = EventTypeRX;
event.value.rx_edge = false;
osMessageQueuePut(irda_event_queue, &event, 0, 0);
} else if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2) {
// rising event
//uint32_t period_in_us = HAL_TIM_ReadCapturedValue();
AppEvent event;
event.type = EventTypeRX;
event.value.rx_edge = true;
osMessageQueuePut(irda_event_queue, &event, 0, 0);
}
}
}