diff --git a/epicardium/epicardium.h b/epicardium/epicardium.h index 8814692a62a06edce3b9db0cf58c6090ba78c86a..34a5db597b2e78905cbf5c11f572bb4cc2ae5c9e 100644 --- a/epicardium/epicardium.h +++ b/epicardium/epicardium.h @@ -36,6 +36,7 @@ typedef _Bool bool; #define API_INTERRUPT_ENABLE 0xA #define API_INTERRUPT_DISABLE 0xB +#define API_INTERRUPT_IS_ENABLED 0xC #define API_UART_WRITE_STR 0x10 #define API_UART_READ_CHAR 0x11 @@ -184,6 +185,19 @@ API(API_INTERRUPT_ENABLE, int epic_interrupt_enable(api_int_id_t int_id)); */ API(API_INTERRUPT_DISABLE, int epic_interrupt_disable(api_int_id_t int_id)); +/** + * Check if an API interrupt is enabled. + * + * :param int int_id: The interrupt to be checked + * :param bool* enabled: ``true`` will be stored here if the interrupt is enabled. + * ``false`` otherwise. + * + * :return: 0 on success, ``-EINVAL`` if the interrupt is unknown. + * + * .. versionadded:: 1.16 + */ +API(API_INTERRUPT_IS_ENABLED, int epic_interrupt_is_enabled(api_int_id_t int_id, bool *enabled)); + /** * The following interrupts are defined: */ diff --git a/epicardium/modules/interrupts.c b/epicardium/modules/interrupts.c index 0ead54fc58b1d6341071cd377a8ab239bbbff8e7..d65505ea5a0629b5934057e81599d9c35d6ec454 100644 --- a/epicardium/modules/interrupts.c +++ b/epicardium/modules/interrupts.c @@ -78,6 +78,17 @@ static void interrupt_set_enabled(api_int_id_t id, bool enabled) mutex_unlock(&interrupt_mutex); } +static bool interrupt_get_enabled(api_int_id_t id) +{ + assert(id < EPIC_INT_NUM); + + bool enabled; + mutex_lock(&interrupt_mutex); + enabled = interrupt_data.int_enabled[id]; + mutex_unlock(&interrupt_mutex); + return enabled; +} + void interrupt_init(void) { if (interrupt_mutex.name == NULL) @@ -114,6 +125,17 @@ int epic_interrupt_disable(api_int_id_t int_id) interrupt_set_enabled(int_id, false); return 0; } + +int epic_interrupt_is_enabled(api_int_id_t int_id, bool *enabled) +{ + if (int_id >= EPIC_INT_NUM) { + return -EINVAL; + } + + *enabled = interrupt_get_enabled(int_id); + return 0; +} + /* }}} */ void vInterruptsTask(void *pvParameters)