FL-262 Interrupt manager (#270)
* interrupt manager * init interrupt manager * add usage to lf-rfid app * check ready flag * move interrupts code to target hal * fix path
This commit is contained in:
parent
153d32bf15
commit
3ba1738acd
@ -62,10 +62,8 @@ GpioPin debug_1 = {.pin = GPIO_PIN_3, .port = GPIOC};
|
|||||||
|
|
||||||
extern COMP_HandleTypeDef hcomp1;
|
extern COMP_HandleTypeDef hcomp1;
|
||||||
|
|
||||||
void* comp_ctx = NULL;
|
void comparator_trigger_callback(void* hcomp, void* comp_ctx) {
|
||||||
|
if((COMP_HandleTypeDef*)hcomp != &hcomp1) return;
|
||||||
void HAL_COMP_TriggerCallback(COMP_HandleTypeDef* hcomp) {
|
|
||||||
if(hcomp != &hcomp1) return;
|
|
||||||
|
|
||||||
// gpio_write(&debug_0, true);
|
// gpio_write(&debug_0, true);
|
||||||
|
|
||||||
@ -178,7 +176,9 @@ void lf_rfid_workaround(void* p) {
|
|||||||
gpio_write((GpioPin*)&ibutton_gpio, false);
|
gpio_write((GpioPin*)&ibutton_gpio, false);
|
||||||
|
|
||||||
// init ctx
|
// init ctx
|
||||||
comp_ctx = (void*)event_queue;
|
void* comp_ctx = (void*)event_queue;
|
||||||
|
api_interrupt_add(comparator_trigger_callback, InterruptTypeComparatorTrigger, comp_ctx);
|
||||||
|
|
||||||
// start comp
|
// start comp
|
||||||
HAL_COMP_Start(&hcomp1);
|
HAL_COMP_Start(&hcomp1);
|
||||||
|
|
||||||
|
65
core/api-hal/api-interrupt-mgr.c
Normal file
65
core/api-hal/api-interrupt-mgr.c
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
#include "api-interrupt-mgr.h"
|
||||||
|
|
||||||
|
LIST_DEF(list_interrupt, InterruptCallbackItem, M_POD_OPLIST);
|
||||||
|
list_interrupt_t interrupts;
|
||||||
|
osMutexId_t interrupt_list_mutex;
|
||||||
|
|
||||||
|
bool api_interrupt_init() {
|
||||||
|
interrupt_list_mutex = osMutexNew(NULL);
|
||||||
|
return (interrupt_list_mutex != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void api_interrupt_add(InterruptCallback callback, InterruptType type, void* context) {
|
||||||
|
if(osMutexAcquire(interrupt_list_mutex, osWaitForever) == osOK) {
|
||||||
|
// put uninitialized item to the list
|
||||||
|
// M_POD_OPLIST provide memset(&(a), 0, sizeof (a)) constructor
|
||||||
|
// so item will not be ready until we set ready flag
|
||||||
|
InterruptCallbackItem* item = list_interrupt_push_new(interrupts);
|
||||||
|
|
||||||
|
// initialize item
|
||||||
|
item->callback = callback;
|
||||||
|
item->type = type;
|
||||||
|
item->context = context;
|
||||||
|
item->ready = true;
|
||||||
|
|
||||||
|
// TODO remove on app exit
|
||||||
|
//flapp_on_exit(api_interrupt_remove, callback);
|
||||||
|
|
||||||
|
osMutexRelease(interrupt_list_mutex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void api_interrupt_remove(InterruptCallback callback) {
|
||||||
|
if(osMutexAcquire(interrupt_list_mutex, osWaitForever) == osOK) {
|
||||||
|
// iterate over items
|
||||||
|
list_interrupt_it_t it;
|
||||||
|
for(list_interrupt_it(it, interrupts); !list_interrupt_end_p(it);
|
||||||
|
list_interrupt_next(it)) {
|
||||||
|
const InterruptCallbackItem* item = list_interrupt_cref(it);
|
||||||
|
|
||||||
|
// if the iterator is equal to our element
|
||||||
|
if(item->callback == callback) {
|
||||||
|
list_interrupt_remove(interrupts, it);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
osMutexRelease(interrupt_list_mutex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void api_interrupt_call(InterruptType type, void* hw) {
|
||||||
|
// that executed in interrupt ctx so mutex don't needed
|
||||||
|
// but we need to check ready flag
|
||||||
|
|
||||||
|
// iterate over items
|
||||||
|
list_interrupt_it_t it;
|
||||||
|
for(list_interrupt_it(it, interrupts); !list_interrupt_end_p(it); list_interrupt_next(it)) {
|
||||||
|
const InterruptCallbackItem* item = list_interrupt_cref(it);
|
||||||
|
|
||||||
|
// if the iterator is equal to our element
|
||||||
|
if(item->type == type && item->ready) {
|
||||||
|
item->callback(hw, item->context);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
19
core/api-hal/api-interrupt-mgr.h
Normal file
19
core/api-hal/api-interrupt-mgr.h
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "flipper_v2.h"
|
||||||
|
|
||||||
|
typedef void (*InterruptCallback)(void*, void*);
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
InterruptTypeComparatorTrigger = 0,
|
||||||
|
} InterruptType;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
InterruptCallback callback;
|
||||||
|
InterruptType type;
|
||||||
|
void* context;
|
||||||
|
bool ready;
|
||||||
|
} InterruptCallbackItem;
|
||||||
|
|
||||||
|
bool api_interrupt_init();
|
||||||
|
void api_interrupt_add(InterruptCallback callback, InterruptType type, void* context);
|
||||||
|
void api_interrupt_remove(InterruptCallback callback);
|
@ -11,5 +11,9 @@ bool init_flipper_api(void) {
|
|||||||
no_errors = false;
|
no_errors = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(!api_interrupt_init()) {
|
||||||
|
no_errors = false;
|
||||||
|
}
|
||||||
|
|
||||||
return no_errors;
|
return no_errors;
|
||||||
}
|
}
|
@ -18,6 +18,7 @@ extern "C" {
|
|||||||
#include "api-basic/check.h"
|
#include "api-basic/check.h"
|
||||||
|
|
||||||
#include "api-hal/api-gpio.h"
|
#include "api-hal/api-gpio.h"
|
||||||
|
#include "api-hal/api-interrupt-mgr.h"
|
||||||
#include "api-hal-resources.h"
|
#include "api-hal-resources.h"
|
||||||
|
|
||||||
#include "gui/gui.h"
|
#include "gui/gui.h"
|
||||||
|
6
firmware/targets/f4/api-hal/api-interrupts.c
Normal file
6
firmware/targets/f4/api-hal/api-interrupts.c
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
#include "api-hal/api-interrupt-mgr.h"
|
||||||
|
|
||||||
|
/* interrupts */
|
||||||
|
void HAL_COMP_TriggerCallback(COMP_HandleTypeDef* hcomp) {
|
||||||
|
api_interrupt_call(InterruptTypeComparatorTrigger, hcomp);
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user