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:
		@@ -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);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user