CC2652 Button driver

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
@file       C:\ti\simplelink_cc13xx_cc26xx_sdk_7_10_01_24\source\ti\drivers\apps\Button.h
@brief      Button driver
 
@anchor ti_drivers_Button_Synopsis
# Краткое содержание#
 
#include <ti/drivers/apps/Button.h>
 
int main(void)
{
     Button_Params params;
     Button_Handle handle;
 
     Button_Params_init(&params);
 
     handle = Button_open(CONFIG_BUTTON0, buttonCallbackFxn, &params);
 
      ...
}
 
void buttonCallbackFxn(Button_Handle handle, Button_EventMask events)
{
      if (events & Button_EV_CLICK)
      {
          // Получен щелчок, обработка состояния приложения 0 и т. д.
         handleAppCond(0);
      }
      if (events & Button_EV_LONGCLICKED)
      {
          // Длительное нажатие, обработка состояния приложения 1 и т. д.
          handleAppCond(1);
      }
       ...
}
 
 
@anchor ti_drivers_Button_Examples
## Examples #
 
@ref ti_drivers_Button_Examples_config "Generic Configuration"
 
## Обзор #

Драйвер Button упрощает взаимодействие с кнопками. Например, кнопками на LaunchPads, BoosterPacks или пользовательских досках можно легко управлять через Button API. Данный экземпляр кнопки может подписаться на один или несколько

#Button_Events.

Когда происходит подписанное событие, пользователь получит обратный вызов с дескриптором кнопки и произошедшими событиями.

## Требования пользователя #
Кнопки используют интерфейс @ref GPIO.h для взаимодействия с оборудованием, поэтому массив #GPIO_PinConfig должен существовать и содержать конфигурацию для контакта кнопки.
Пользователь должен статически выделить массив #Button_Config с именем Button_config. Каждая физическая кнопка должна соответствовать индексу в Button_config.
 
## Определение #Button_Config, #Button_Object и #Button_HWAttrs #
Каждая структура должна быть определена приложением. Следующий пример относится к MSP432, в котором установлены две кнопки.
Следующие объявления помещены в «ti_drivers_config.h» и «ti_drivers_config.c» соответственно. Как определяются конфигурации GPIO, подробно описано в следующем примере.
 
@anchor ti_drivers_Button_Examples_config
 
"ti_drivers_config.h"
 
 #define CONFIG_BUTTON_0     0  //Button number 1
 #define CONFIG_BUTTON_1     1  //Button number 2
 
 
 "ti_drivers_config.c"
 
#include <Button.h>
 
Button_Object Button_object[2];
 
const  Button_HWAttrs Button_hwAttrs[2] = {
     {
          .gpioIndex = CONFIG_S1,
      },
      {
         .gpioIndex = CONFIG_S2,
      }
};
 
const Button_Config Button_config[2] = {
      {
          .hwAttrs = &Button_hwAttrs[0],
          .object =  &Button_object[0],
      },
      {
          .hwAttrs = &Button_hwAttrs[1],
          .object =  &Button_object[1],
      },
};
 
##Настройка конфигурации GPIO #
 
Следующий пример относится к MSP432.
Мы показываем взаимодействие двух кнопок. Каждому нужен вывод GPIO. Следующие определения находятся в «ti_drivers_config.h» и «ti_drivers_config.c» соответственно. В этом примере используются контакты GPIO 1.1 и 1.4. Другие структуры конфигурации GPIO должны существовать, см. @ref GPIO.h.
 
"ti_drivers_config.h"
 
#define CONFIG_S1       0
#define CONFIG_S2       1
 
"ti_drivers_config.c"
 
#include <gpio.h>
  GPIO_PinConfig gpioPinConfigs[] = {
  GPIOMSP432_P1_1 | GPIO_CFG_IN_PU | GPIO_CFG_IN_INT_FALLING,
  GPIOMSP432_P1_4 | GPIO_CFG_IN_PU | GPIO_CFG_IN_INT_FALLING,
}
 

-------------------------------------

#include <stdint.h>
#include <stdbool.h>
 
/* Заголовочные файлы драйвера */
#include <ti/drivers/GPIO.h>
#include <ti/drivers/dpl/ClockP.h>
 
/* Количество определяемых пользователем конфигураций кнопок */
extern const uint_least8_t Button_count;
 
@brief Конфигурация кнопки
 
Каждый #Button_Config представляет одну физическую кнопку. Он содержит указатели на #Button_HWAttrs и #Button_Object кнопки. Пользователь должен статически выделить все эти структуры.
 
typedef struct Button_Config
{
    /*! Указатель на структуру #Button_Object */
    void *object;
 
    /*! Указатель на структуру #Button_HWAttrs */
    void const *hwAttrs;
} Button_Config;
 
 
@brief Дескриптор, возвращаемый вызовом Button_open().
 
Пользователь будет использовать этот дескриптор для взаимодействия с данным экземпляром кнопки.
 
typedef struct Button_Config *Button_Handle;
 
@brief Состояние кнопки 
 
Это перечисление описывает, нажата или отпущена кнопка и т. д.
Это для внутренней обработки конечного автомата.
 
typedef enum Button_State
{
    /*! Обнаружен край, устранение дребезга */
    Button_PRESSING             = 1,
    /*! Нажатие подтверждено, длительное нажатие не обнаружено */
    Button_PRESSED              = 2,
    /*! Нажатие подтверждено, ожидание тайм-аута длительного нажатия. */
    Button_LONGPRESSING         = 3,
    /*! Лонгпресс проверен, ждём нег-края*/
    Button_LONGPRESSED          = 4,
    /*! Нег-край получен, устранение дребезга*/
    Button_RELEASING            = 5,
    /*! Нег-край получен после длительного нажатия, устранение дребезга. */
    Button_RELEASING_LONG       = 6,
    /*! Отпуск кнопки проверен. */
    Button_RELEASED             = 7,
    /*! EDGE обнаружил двойное нажатие */
    Button_DBLPRESS_DETECTION   = 8,
    /*! EDGE обнаружил двойное нажатие*/
    Button_DBLPRESSING          = 9,
    /*! ДВОЙНОЕ НАЖАТИЕ подтверждено, ожидание отрицательного края*/
    Button_DBLPRESSED           = 10,
    /*! ДВОЙНОЕ НАЖАТИЕ подтверждено, ожидание отрицательного края k*/
    Button_RELEASING_DBLPRESSED = 11
} Button_State;
 
@brief Флаги событий кнопки 
 
Флаги событий могут использоваться пользователем для подписки на определенные виды действий кнопок, а также драйвером для обозначения того, какое событие вызвало обратный вызов.
 
typedef enum Button_Events
{
     /*! Кнопка нажата, может быть впоследствии отпущена, а может и не быть отпущена */
     Button_EV_PRESSED = 0x01,
     /*! Кнопка удерживалась нажатой более tLongpress (мс) */
     Button_EV_LONGPRESSED = 0x02,
     /*! Кнопка отпускается после нажатия или длительного нажатия */
     Button_EV_RELEASED = 0x04,
     /*! Кнопка была нажата и отпущена, но долгое нажатие не было */
     Button_EV_CLICKED = 0x08,
     /*! Кнопка была нажата и отпущена и удерживалась дольше, чем longPressDuration (мс)*/
     Button_EV_LONGCLICKED = 0x10,
     /*! Кнопка была нажата, когда было активно обнаружение двойного щелчка */
     Button_EV_DOUBLECLICKED = 0x20,
} Button_Events;
 
@brief Подписка на событие и тип маски уведомлений
typedef uint8_t Button_EventMask;
 
@brief Обработчик для получения обратных вызовов кнопок.
typedef void (*Button_Callback)(Button_Handle buttonHandle, Button_EventMask buttonEvents);
 
@brief Настройки нажатия кнопки
 
Это перечисление определяет, является ли кнопка активным низким (PULL_UP) или активным высоким (PULL_DOWN) и используется для управления внутренней логикой.
 
typedef enum Button_Pull
{
     /* ПРИМЕЧАНИЕ. НЕ меняйте значения ВНИЗ/ВВЕРХ с (0,1) */
     Button_PULL_DOWN = 0, /*!< Кнопка подтянута ВНИЗ. */
     Button_PULL_UP = 1, /*!< Кнопка подтянута ВВЕРХ. */
} Button_Pull;
 
@brief Аппаратные настройки кнопки
 
Эта структура должна быть определена и предоставлена приложением.
 
typedef struct Button_HWAttrs
{
     /*! Индекс конфигурации GPIO. */
     uint_least8_t gpioIndex;
 
     /*! Является ли кнопка активным высоким или активным низким. */
     Button_Pull pullMode;
 
     /*! True/False, следует ли включать подтягивание на выводе GPIO */
     uint32_t InternalPullEnabled;
} Button_HWAttrs;
 
@brief Переменные состояния кнопки 
 
Каждому экземпляру кнопки требуется набор переменных для отслеживания его состояния.
Мы группируем эти переменные в структуру Button_State.
@sa Button_Params_init()
 
typedef struct Button_StateVariables
{
     /*! Состояние кнопки */
     Состояние Button_State;
     /*! Время начала нажатия кнопки в миллисекундах (мс) */
     uint32_t нажалStartTime;
     /*! Длительность нажатия кнопки (мс) */
     uint32_t LastPressedDuration;
} Button_StateVariables;
 
@brief Внутренний модуль Button. Приложение не должно иметь доступа к членам.
 
typedef struct Button_Object
{
     /*! Дескриптор часов, используемый для измерения времени */
     ClockP_Handle clockHandle;
 
     /*! Переменные состояния для обработки конечного автомата устранения дребезга */
     Button_StateVariables buttonStateVariables;
 
     /*! Маска подписки на событие для кнопки */
     Button_EventMask buttonEventMask;
 
     /*! Функция обратного вызова для кнопки */
     Button_Callback buttonCallback;
 
     /*! Длительность устранения дребезга кнопки в миллисекундах (мс) */
     uint32_t debounceDuration;
 
     /*! Длительность длительного нажатия составляет миллисекунды (мс) */
     uint32_t longPressDuration;
 
     /*! Тайм-аут обнаружения двойного нажатия составляет миллисекунды (мс) */
     uint32_t doublePressDetectiontimeout;
} Button_Object;
 
@brief Параметры кнопки 
 
Параметры кнопки используются с вызовом Button_open(). Значения по умолчанию для этих параметров устанавливаются с помощью Button_Params_init().
@sa Button_Params_init()
 
структура typedef Button_Params
{
     /*! Длительность устранения дребезга кнопки в миллисекундах (мс) */
     uint32_t debounceDuration;
 
     /*! Длительность длительного нажатия составляет миллисекунды (мс) */
     uint32_t longPressDuration;
 
     /*! Тайм-аут обнаружения двойного нажатия составляет миллисекунды (мс) */
     uint32_t doublePressDetectiontimeout;
 
     /*! Маска подписки на событие для кнопки */
     Button_EventMask buttonEventMask;
 
     /*! #Button_Callback, вызываемый при возникновении замаскированного события. */
     Button_Callback buttonCallback;
} Button_Params;
 
@brief Функция для закрытия кнопки, указанной #Button_Handle
Сначала нужно было вызвать @pre Button_open().
@param[in] handle A #Button_Handle, возвращаемый из вызова Button_open()
@return True в случае успеха или false в случае неудачи.
 
extern void Button_close (дескриптор Button_Handle);
 
@brief Функция для инициализации драйвера кнопки.
 
extern void Button_init(void);
 
@brief Функция для открытия данной кнопки
 
Функция для открытия экземпляра кнопки, соответствующего #Button_Config в массиве Button_config. Конфигурации GPIO должны существовать до вызова этой функции. #Button_Params можно использовать для указания параметров времени выполнения.
Сначала необходимо вызвать @pre Button_init()
@param[in] buttonIndex Логический номер кнопки, индексированный в таблице Button_config.
@param[in] *params Указатель на структуру #Button_Params. Если NULL, будут использоваться значения по умолчанию.
@return #Button_Handle в случае успеха или NULL в случае неудачи.
@sa Button_init()
@sa Button_Params_init()
@sa Button_close()
 
extern Button_Handle Button_open(uint_least8_t buttonIndex, Button_Params *params);
 
@brief Функция для инициализации структуры #Button_Params до значений по умолчанию
@param[in] params Указатель на структуру #Button_Params, которая будет инициализирована.
 
Значения по умолчанию
 ------------------------------------------------------------------
parameter        | value        | description              | unit
 -----------------|--------------|--------------------------|------------
debounceDuration | 10           | debounce duration        | ms
longPressDuration| 2000         | long press duration      | ms
buttonEventMask  | 0xFF         | subscribed to all events | NA
 
extern void Button_Params_init(Button_Params *params);
 
@brief Функция для возврата LastPressedDuration (действительна только для короткого и длительного нажатия)
 
API возвращает продолжительность последнего нажатия и действителен только для короткого и длительного нажатия. Если этот API вызывается после получения события щелчка или длительного щелчка, API возвращает продолжительность нажатия, которая представляет собой разницу во времени между нажатием и отпусканием кнопки.
@note Этот вызов API действителен только после щелчка или длительного щелчка, а не после двойного щелчка.
 
@param[in] handle Указатель на #Button_Handle нужной кнопки.
@return  продолжительность времени в миллисекундах.
 
extern uint32_t Button_getLastPressedDuration(Button_Handle handle);
 
@brief Функция для установки функции обратного вызова для экземпляра кнопки
 
@param[in] дескриптор #Button_Handle, возвращенный из Button_open()
@param[in] buttonCallback функция обратного вызова кнопки

extern void Button_setCallback(Button_Handle handle, Button_Callback buttonCallback);

@brief Это функция обратного вызова прерывания GPIO, которая вызывается при нажатии или отпускании кнопки. Используется внутри кнопочного модуля.
 
Эта функция используется внутри кнопочного модуля для получения обратных вызовов прерываний GPIO. Это доступно приложению для случаев пробуждения.
В некоторых микроконтроллерах, когда они находятся в режиме LPDS (глубокий сон с низким энергопотреблением), прерывание GPIO используется для пробуждения, и чтобы заставить модуль кнопки работать, приложение должно вызвать этот API с индексом контакта GPIO, который на самом деле была причина пробуждения.
 
@param[in] index Индекс GPIO, для которого необходимо обнаружить нажатие кнопки. Это индекс в массиве #GPIO_PinConfig.
 
void Button_gpioCallbackFxn (uint_least8_t index);
 
 
Ваша оценка: None Средняя: 10 (1 голос)