api-interrupt-mgr.c 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #include "api-interrupt-mgr.h"
  2. LIST_DEF(list_interrupt, InterruptCallbackItem, M_POD_OPLIST);
  3. list_interrupt_t interrupts;
  4. osMutexId_t interrupt_list_mutex;
  5. bool api_interrupt_init() {
  6. interrupt_list_mutex = osMutexNew(NULL);
  7. return (interrupt_list_mutex != NULL);
  8. }
  9. void api_interrupt_add(InterruptCallback callback, InterruptType type, void* context) {
  10. if(osMutexAcquire(interrupt_list_mutex, osWaitForever) == osOK) {
  11. // put uninitialized item to the list
  12. // M_POD_OPLIST provide memset(&(a), 0, sizeof (a)) constructor
  13. // so item will not be ready until we set ready flag
  14. InterruptCallbackItem* item = list_interrupt_push_new(interrupts);
  15. // initialize item
  16. item->callback = callback;
  17. item->type = type;
  18. item->context = context;
  19. item->ready = true;
  20. // TODO remove on app exit
  21. //flapp_on_exit(api_interrupt_remove, callback);
  22. osMutexRelease(interrupt_list_mutex);
  23. }
  24. }
  25. void api_interrupt_remove(InterruptCallback callback) {
  26. if(osMutexAcquire(interrupt_list_mutex, osWaitForever) == osOK) {
  27. // iterate over items
  28. list_interrupt_it_t it;
  29. for(list_interrupt_it(it, interrupts); !list_interrupt_end_p(it);
  30. list_interrupt_next(it)) {
  31. const InterruptCallbackItem* item = list_interrupt_cref(it);
  32. // if the iterator is equal to our element
  33. if(item->callback == callback) {
  34. list_interrupt_remove(interrupts, it);
  35. break;
  36. }
  37. }
  38. osMutexRelease(interrupt_list_mutex);
  39. }
  40. }
  41. void api_interrupt_call(InterruptType type, void* hw) {
  42. // that executed in interrupt ctx so mutex don't needed
  43. // but we need to check ready flag
  44. // iterate over items
  45. list_interrupt_it_t it;
  46. for(list_interrupt_it(it, interrupts); !list_interrupt_end_p(it); list_interrupt_next(it)) {
  47. const InterruptCallbackItem* item = list_interrupt_cref(it);
  48. // if the iterator is equal to our element
  49. if(item->type == type && item->ready) {
  50. item->callback(hw, item->context);
  51. }
  52. }
  53. }