diff --git a/epicardium/ble/ble_main.c b/epicardium/ble/ble_main.c index 1ea302fe5aa4e4cdd5876765a1eedea4b6e20d13..5b10d7915b01b3b22158d4ec64a287e23be64d15 100644 --- a/epicardium/ble/ble_main.c +++ b/epicardium/ble/ble_main.c @@ -44,6 +44,8 @@ #include "modules/log.h" static bool active; +static uint32_t ble_event; + /************************************************************************************************** Macros **************************************************************************************************/ @@ -392,22 +394,48 @@ uint32_t epic_ble_get_compare_value(void) return pair_confirm_value; } -void epic_ble_confirm_compare_value(void) +void epic_ble_compare_response(bool confirmed) { + if(!active) { + return; + } + if(pair_connId != DM_CONN_ID_NONE) { - LOG_INFO("ble", "Confirming"); - DmSecCompareRsp(pair_connId, TRUE); + LOG_INFO("ble", "Value confirmed: %u", confirmed); + DmSecCompareRsp(pair_connId, confirmed); } else { - //TODO: error condition + /* error condition */ + } +} +static void trigger_event(uint32_t event) +{ + bool enabled; + epic_interrupt_is_enabled(EPIC_INT_BLE, &enabled); + if(ble_event & enabled) { + LOG_WARN("ble", "Application missed event %lu", ble_event); } + + ble_event = event; + api_interrupt_trigger(EPIC_INT_BLE); +} + +uint32_t epic_ble_get_event(void) +{ + uint32_t event = ble_event; + ble_event = 0; + return event; } -void bleHandleNumericComparison(dmSecCnfIndEvt_t *pCnfInd) +static void bleHandleNumericComparison(dmSecCnfIndEvt_t *pCnfInd) { + if(!active) { + return; + } + pair_connId = (dmConnId_t)pCnfInd->hdr.param; pair_confirm_value = DmSecGetCompareValue(pCnfInd->confirm); LOG_INFO("ble", "Confirm Value: %ld", pair_confirm_value); - api_interrupt_trigger(EPIC_INT_BLE_NUMERIC_COMPARISON); + trigger_event(1); } /*************************************************************************************************/ @@ -503,6 +531,7 @@ static void bleProcMsg(bleMsg_t *pMsg) uiEvent = APP_UI_SEC_PAIR_CMPL; /* After a successful pairing, bonding is disabled again. * We don't want that for now. */ + trigger_event(3); AppSetBondable(TRUE); break; @@ -523,6 +552,7 @@ static void bleProcMsg(bleMsg_t *pMsg) } pair_connId = DM_CONN_ID_NONE; uiEvent = APP_UI_SEC_PAIR_FAIL; + trigger_event(2); break; case DM_SEC_ENCRYPT_IND: diff --git a/epicardium/epicardium.h b/epicardium/epicardium.h index 1690706b70f8892b2629d2e92434ddf0cae81427..c41f3ce4e57f53b1265d617df5f7d2a0d8cfe857 100644 --- a/epicardium/epicardium.h +++ b/epicardium/epicardium.h @@ -148,9 +148,10 @@ typedef _Bool bool; #define API_CONFIG_GET_BOOLEAN 0x132 #define API_CONFIG_SET_STRING 0x133 -#define API_BLE_GET_COMPARE_VALUE 0x140 -#define API_BLE_CONFIRM_COMPARE_VALUE 0x141 +#define API_BLE_GET_COMPARE_VALUE 0x140 +#define API_BLE_COMPARE_RESPONSE 0x141 #define API_BLE_SET_BONDABLE 0x142 +#define API_BLE_GET_EVENT 0x143 /* clang-format on */ @@ -217,7 +218,7 @@ API(API_INTERRUPT_IS_ENABLED, int epic_interrupt_is_enabled(api_int_id_t int_id, /** MAX86150 ECG and PPG sensor. See :c:func:`epic_isr_max86150`. */ #define EPIC_INT_MAX86150 9 -#define EPIC_INT_BLE_NUMERIC_COMPARISON 10 +#define EPIC_INT_BLE 10 /* Number of defined interrupts. */ #define EPIC_INT_NUM 11 /* clang-format on */ @@ -2091,8 +2092,9 @@ API(API_CONFIG_GET_STRING, int epic_config_get_string(const char *key, char *buf API(API_CONFIG_SET_STRING, int epic_config_set_string(const char *key, const char *value)); API(API_BLE_GET_COMPARE_VALUE, uint32_t epic_ble_get_compare_value(void)); -API(API_BLE_CONFIRM_COMPARE_VALUE, void epic_ble_confirm_compare_value(void)); -API_ISR(EPIC_INT_BLE_NUMERIC_COMPARISON, epic_isr_ble_numeric_comparison); +API(API_BLE_COMPARE_RESPONSE, void epic_ble_compare_response(bool confirmed)); API(API_BLE_SET_BONDABLE, void epic_ble_set_bondable(bool bondable)); +API(API_BLE_GET_EVENT, uint32_t epic_ble_get_event(void)); +API_ISR(EPIC_INT_BLE, epic_isr_ble); #endif /* _EPICARDIUM_H */ diff --git a/pycardium/modules/qstrdefs.h b/pycardium/modules/qstrdefs.h index 1ae1ac84b2a64de9bfae34252113d0c7c54ec1fe..1010817a54f299e816b5fec944d45b809302cd6a 100644 --- a/pycardium/modules/qstrdefs.h +++ b/pycardium/modules/qstrdefs.h @@ -197,4 +197,5 @@ Q(ble) Q(get_compare_value) Q(confirm_compare_value) Q(set_bondable) +Q(get_event) diff --git a/pycardium/modules/sys_ble.c b/pycardium/modules/sys_ble.c index c6fbf47f92dab1240251b320b49b81ebf7f32f7c..898478e86e1ca7d6976d9dd1fabcce9787a58c7f 100644 --- a/pycardium/modules/sys_ble.c +++ b/pycardium/modules/sys_ble.c @@ -6,12 +6,13 @@ #include <stdint.h> -static mp_obj_t mp_ble_confirm_compare_value(void) +static mp_obj_t mp_ble_confirm_compare_value(mp_obj_t confirmed_obj) { - epic_ble_confirm_compare_value(); + bool confirmed = mp_obj_is_true(confirmed_obj); + epic_ble_compare_response(confirmed); return mp_const_none; } -static MP_DEFINE_CONST_FUN_OBJ_0(ble_confirm_compare_value_obj, mp_ble_confirm_compare_value); +static MP_DEFINE_CONST_FUN_OBJ_1(ble_confirm_compare_value_obj, mp_ble_confirm_compare_value); static mp_obj_t mp_ble_get_compare_value(void) { @@ -19,6 +20,13 @@ static mp_obj_t mp_ble_get_compare_value(void) } static MP_DEFINE_CONST_FUN_OBJ_0(ble_get_compare_value_obj, mp_ble_get_compare_value); +static mp_obj_t mp_ble_get_event(void) +{ + return mp_obj_new_int(epic_ble_get_event()); +} +static MP_DEFINE_CONST_FUN_OBJ_0(ble_get_event_obj, mp_ble_get_event); + + static mp_obj_t mp_ble_set_bondable(mp_obj_t bondable_obj) { bool bondable = mp_obj_is_true(bondable_obj); @@ -31,6 +39,7 @@ static const mp_rom_map_elem_t ble_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_sys_ble) }, { MP_ROM_QSTR(MP_QSTR_confirm_compare_value), MP_ROM_PTR(&ble_confirm_compare_value_obj) }, { MP_ROM_QSTR(MP_QSTR_get_compare_value), MP_ROM_PTR(&ble_get_compare_value_obj) }, + { MP_ROM_QSTR(MP_QSTR_get_event), MP_ROM_PTR(&ble_get_event_obj) }, { MP_ROM_QSTR(MP_QSTR_set_bondable), MP_ROM_PTR(&ble_set_bondable_obj) }, }; static MP_DEFINE_CONST_DICT(ble_module_globals, ble_module_globals_table);