Здесь показан процесс добавления своего обработчика кнопки с помощью функций BSP (Board Support Package, или Button Support Package, как кому больше нравится) на плате разработчика PCA10040 и примера устройства Central BLE Heart Rate Service (или клиента BLE; этот пример находится в папке examples\ble_central\ble_app_hrs_c архива SDK nRF5_SDK_12.3.0_d7731ad [2]).
Процесс по шагам:
1. Добавьте новый идентификатор события в конец перечисления bsp_event_t (оно находится в bsp.h). На примере добавления идентификатора события BSP_EVENT_MY_SEND:
typedef enum
{
BSP_EVENT_NOTHING = 0, /**< Назначьте это событие на действие, чтобы предотвратить генерацию
события в ответ на действие (эквивалентно запрету действия). */
BSP_EVENT_DEFAULT, /**< Назначьте это событие на действие, которое должно быть привязано
к событию по умолчанию для этого действия. */
BSP_EVENT_CLEAR_BONDING_DATA, /**< Постоянные данные привязки (persistent bonding data)
должны быть очищены. */
BSP_EVENT_CLEAR_ALERT, /**< Предупреждение должно быть очищено. */
...
BSP_EVENT_KEY_7, /**< Событие по умолчанию для действия по нажатию (push action) кнопки
BSP_BUTTON_7 (только в том случае, если эта кнопка присутствует). */
BSP_EVENT_MY_SEND, // Это новое добавленное событие
BSP_EVENT_KEY_LAST = BSP_EVENT_MY_SEND, // Идентификатор последнего события
} bsp_event_t;
Примечание: по умолчанию библиотека BSP присваивает кнопкам BSP_BUTTON_0 .. BSP_BUTTON_7 события BSP_EVENT_KEY_0 .. BSP_EVENT_KEY_7 и событие на все действия BSP_EVENT_NOTHING. Это делается только для тех кнопок, которые присутствуют в системе (на отладочной плате PCA10040 только 4 кнопки BSP_BUTTON_0 .. BSP_BUTTON_3). Под действием понимается нажатие, отпускание, длинное нажатие (#define константы BSP_BUTTON_ACTION_PUSH, BSP_BUTTON_ACTION_RELEASE, BSP_BUTTON_ACTION_LONG_PUSH, которые определены в том же заголовке bsp.h).
Новый идентификатор нужно добавить в перечисление bsp_event_t перед идентификатором BSP_EVENT_KEY_LAST, и соответствующим образом подкорректировать его значение.
2. Добавьте перед входом в бесконечный цикл функции main вызов bsp_event_to_button_action_assign, что будет назначать нужной кнопке генерацию нужного события на нужное действие:
bsp_event_to_button_action_assign(bsp_board_pin_to_button_idx(BSP_BUTTON_2),
BSP_BUTTON_ACTION_PUSH,
BSP_EVENT_MY_SEND);
В этом вызове назначается генерация события BSP_EVENT_MY_SEND в ответ на нажатие (BSP_BUTTON_ACTION_PUSH) кнопки BSP_BUTTON_2. Функция bsp_board_pin_to_button_idx переводит номер ножки входа, соответствующий кнопке BSP_BUTTON_2, в соответствующий индекс кнопки (кнопке BSP_BUTTON_2 соответствует индекс 2).
3. В функцию обработки события bsp_event_handler (эта функция находится в main.c) добавьте ветку для события BSP_EVENT_MY_SEND:
void bsp_event_handler(bsp_event_t event)
{
uint32_t err_code;
switch (event)
{
case BSP_EVENT_SLEEP:
...
case BSP_EVENT_MY_SEND:
umsg("Мое новое событие сработало!\n");
break;
default:
break;
}
}
[Ссылки]
1. SDK 12 Board Support Package (BSP) site:nordicsemi.com. 2. 210728nRF5_SDK_12.3.0.zip - nRF5_SDK_12.3.0_d7731ad и offline-документация. |