| /* |
| * Copyright 2016-2021, Cypress Semiconductor Corporation (an Infineon company) or |
| * an affiliate of Cypress Semiconductor Corporation. All rights reserved. |
| * |
| * This software, including source code, documentation and related |
| * materials ("Software") is owned by Cypress Semiconductor Corporation |
| * or one of its affiliates ("Cypress") and is protected by and subject to |
| * worldwide patent protection (United States and foreign), |
| * United States copyright laws and international treaty provisions. |
| * Therefore, you may use this Software only as provided in the license |
| * agreement accompanying the software package from which you |
| * obtained this Software ("EULA"). |
| * If no EULA applies, Cypress hereby grants you a personal, non-exclusive, |
| * non-transferable license to copy, modify, and compile the Software |
| * source code solely for use in connection with Cypress's |
| * integrated circuit products. Any reproduction, modification, translation, |
| * compilation, or representation of this Software except as specified |
| * above is prohibited without the express written permission of Cypress. |
| * |
| * Disclaimer: THIS SOFTWARE IS PROVIDED AS-IS, WITH NO WARRANTY OF ANY KIND, |
| * EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, NONINFRINGEMENT, IMPLIED |
| * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. Cypress |
| * reserves the right to make changes to the Software without notice. Cypress |
| * does not assume any liability arising out of the application or use of the |
| * Software or any product or circuit described in the Software. Cypress does |
| * not authorize its products for use in any products where a malfunction or |
| * failure of the Cypress product may reasonably be expected to result in |
| * significant property damage, injury or death ("High Risk Product"). By |
| * including Cypress's product in a High Risk Product, the manufacturer |
| * of such system or application assumes all risk of such use and in doing |
| * so agrees to indemnify Cypress against all liability. |
| */ |
| /** @file |
| * |
| * Button manager defines generic interface for button events and button type configurations. |
| * It exposes interface to configure platform button events (like click,long press) with user configurable timing. |
| */ |
| #pragma once |
| |
| #include "platform_button.h" |
| #include "wiced.h" |
| #include "wiced_rtos.h" |
| #include "wiced_timer.h" |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| /****************************************************** |
| * Macros |
| ******************************************************/ |
| |
| /****************************************************** |
| * Constants |
| ******************************************************/ |
| |
| /****************************************************** |
| * Enumerations |
| ******************************************************/ |
| |
| /** |
| * @brief Button Manager events. |
| * |
| */ |
| typedef enum |
| { |
| BUTTON_CLICK_EVENT = (1 << 0), /**< A click is a combination of press and release button events. Typically ~ < 200 ms. */ |
| BUTTON_SHORT_DURATION_EVENT = (1 << 1), /**< Short duration click event */ |
| BUTTON_MEDIUM_DURATION_EVENT = (1 << 2), /**< Medium duration click event */ |
| BUTTON_LONG_DURATION_EVENT = (1 << 3), /**< Long duration click event */ |
| BUTTON_VERY_LONG_DURATION_EVENT = (1 << 4), /**< Very long duration click event */ |
| BUTTON_DOUBLE_CLICK_EVENT = |
| (1 << 5), /**< A double click is a combination of two single clicks with some delay between them */ |
| BUTTON_HOLDING_EVENT = (1 << 6), /**< Button is holding over at least two long duration. */ |
| } button_manager_event_t; |
| |
| /** |
| * @brief Button states. |
| * |
| */ |
| typedef enum |
| { |
| BUTTON_STATE_HELD = (0), /**< Button state held */ |
| BUTTON_STATE_RELEASED = (1), /**< Button state released */ |
| } button_manager_button_state_t; |
| |
| /****************************************************** |
| * Type Definitions |
| ******************************************************/ |
| |
| /** |
| * @brief Worker thread structure. |
| * |
| */ |
| typedef struct |
| { |
| wiced_thread_t * thread; /**< Button event thread */ |
| wiced_queue_t * event_queue; /**< Button event queue */ |
| } button_worker_thread_t; |
| |
| /** |
| * @brief Button Event Message. |
| * |
| */ |
| typedef struct |
| { |
| event_handler_t function; /**< Button event handler function */ |
| void * arg; /**< Button event message arguments to be passed */ |
| } button_event_message_t; |
| /****************************************************** |
| * Structures |
| ******************************************************/ |
| |
| /** |
| * @brief Button configuration. |
| * |
| */ |
| typedef struct |
| { |
| platform_button_t button; /**< Logical Button-ids which map to physical buttons on the board */ |
| uint16_t button_event_mask; /**< Button event mask */ |
| uint32_t application_event; /**< Application event */ |
| } wiced_button_configuration_t; |
| |
| /** |
| * @brief Button Information. |
| * |
| */ |
| typedef struct |
| { |
| const wiced_button_configuration_t * configuration; /**< Button configuration */ |
| button_manager_button_state_t current_state; /**< Button current state */ |
| button_manager_event_t last_sent_event; /**< Button last sent event */ |
| uint64_t pressed_timestamp; /**< Button pressed time stamp (us) */ |
| uint64_t released_timestamp; /**< Button released time stamp (us) */ |
| uint32_t last_released_timestamp; /**< Button last released time stamp */ |
| wiced_bool_t check_for_double_click; /**< Button double click event or not */ |
| uint32_t repeat; /**< Button holding counter */ |
| int32_t debounce_counter; /**< Button debounce counter */ |
| wiced_timer_t debounce_timer; /**< Button debounce timer */ |
| wiced_bool_t debouncing; /**< Button debounce state indication */ |
| wiced_timer_t long_press_timer; /**< Button long press detection timer */ |
| uint64_t timer_timestamp; /**< Button event time stamp (us) */ |
| } button_manager_button_t; |
| |
| /** |
| * Button event handler |
| * |
| * @param button Which button in the list has been pressed/released/held |
| * @param event What exact event the button is generating. |
| * @param state What exact state the button is in. |
| * |
| * @return void Library should not care whether app handled the button-events correctly or not. |
| * |
| */ |
| typedef void (*wiced_button_event_handler_t)(const button_manager_button_t * button, button_manager_event_t event, |
| button_manager_button_state_t state); |
| |
| /** |
| * @brief Button manager Configuration. |
| * |
| */ |
| typedef struct |
| { |
| uint16_t short_hold_duration; /**< held for short duration (ms) */ |
| uint16_t medium_hold_duration; /**< held for medium duration (ms) */ |
| uint16_t long_hold_duration; /**< held for long duration (ms) */ |
| uint16_t very_long_hold_duration; /**< held for very long duration (ms) */ |
| uint16_t debounce_duration; /**< duration taken to de-bounce (ms) */ |
| uint16_t double_click_interval; /**< Time interval between two RELEASE events */ |
| wiced_bool_t continuous_hold_detect; /**< Flag to enable button holding detection.\n |
| If this is set to true, the BUTTON_VERY_LONG_DURATION_EVENT is disabled |
| and a BUTTON_HOLDING_EVENT will be triggered if a button is pressed over |
| twice the long_hold_duration.\n |
| The BUTTON_HOLDING_EVENT will continuous be sent every long_hold_duration |
| after the first BUTTON_HOLDING_EVENT event been sent. */ |
| wiced_button_event_handler_t event_handler; |
| } wiced_button_manager_configuration_t; |
| |
| /** |
| * @brief Button Manager structure. |
| * |
| */ |
| typedef struct |
| { |
| const wiced_button_manager_configuration_t * configuration; /**< Button manager configuration */ |
| button_manager_button_t * buttons; /**< Button information */ |
| uint32_t number_of_buttons; /**< Number of buttons */ |
| wiced_button_event_handler_t button_callback; /**< Button event handler */ |
| } button_manager_t; |
| |
| /** |
| * Button's state change call back |
| * |
| * @param id Id of the button |
| * @param new_state What exact new state the button is going to. |
| * |
| * @return void Library should not care whether app handled the button-events correctly or not. |
| */ |
| |
| typedef void (*wiced_button_state_change_callback_t)(platform_button_t id, wiced_bool_t new_state); |
| |
| /****************************************************** |
| * Global Variables |
| ******************************************************/ |
| |
| /****************************************************** |
| * Function Declarations |
| ******************************************************/ |
| |
| /** |
| * The application should call this function to Initialize the Button Manager |
| * |
| * @param manager : pointer to button manager. |
| * @param configuration : Configuration for the button. |
| * @param buttons : Button information. |
| * @param number_of_buttons : Number of buttons. |
| * @return : result. |
| */ |
| extern wiced_result_t wiced_button_manager_init(button_manager_t * manager, |
| const wiced_button_manager_configuration_t * configuration, |
| button_manager_button_t * buttons, uint32_t number_of_buttons); |
| |
| /** |
| * The application should call this function to de-Initialize the Button Manager |
| * |
| * @param manager : Pointer to button manager to de-initialize. |
| * @return : result. |
| */ |
| extern wiced_result_t wiced_button_manager_deinit(button_manager_t * manager); |
| |
| #ifdef __cplusplus |
| } /* extern "C" */ |
| #endif |