1 | /* |
2 | * Generic button ops |
3 | * |
4 | * Copyright (C) 2019 - 2020 Andy Green <andy@warmcat.com> |
5 | * |
6 | * Permission is hereby granted, free of charge, to any person obtaining a copy |
7 | * of this software and associated documentation files (the "Software"), to |
8 | * deal in the Software without restriction, including without limitation the |
9 | * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or |
10 | * sell copies of the Software, and to permit persons to whom the Software is |
11 | * furnished to do so, subject to the following conditions: |
12 | * |
13 | * The above copyright notice and this permission notice shall be included in |
14 | * all copies or substantial portions of the Software. |
15 | * |
16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
21 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS |
22 | * IN THE SOFTWARE. |
23 | * |
24 | * Leverages the lws generic gpio pieces to bind gpio buttons to smd events |
25 | */ |
26 | |
27 | #if !defined(__LWS_BUTTON_H__) |
28 | #define __LWS_BUTTON_H__ |
29 | |
30 | typedef uint16_t lws_button_idx_t; |
31 | |
32 | /* actual minimum may be 1 x RTOS tick depending on platform */ |
33 | #define LWS_BUTTON_MON_TIMER_MS 5 |
34 | |
35 | typedef void (*lws_button_cb_t)(void *opaque, lws_button_idx_t idx, int state); |
36 | |
37 | /* These are specified in ms but the granularity is LWS_BUTTON_MON_TIMER_MS, |
38 | * which may have been rounded up to an RTOS tick depending on platform */ |
39 | |
40 | enum { |
41 | LWSBTNRGMFLAG_CLASSIFY_DOUBLECLICK = (1 << 0) |
42 | }; |
43 | |
44 | typedef struct lws_button_regime { |
45 | uint16_t ms_min_down; |
46 | uint16_t ms_min_down_longpress; |
47 | uint16_t ms_up_settle; |
48 | uint16_t ms_doubleclick_grace; |
49 | uint16_t ms_repeat_down; |
50 | uint8_t flags; |
51 | /**< when double-click classification is enabled, clicks are delayed |
52 | * by ms_min_down + ms_doubleclick_grace to wait and see if it will |
53 | * become a double-click. Set LWSBTNRGMFLAG_CLASSIFY_DOUBLECLICK to |
54 | * enable it or leave that bit at 0 to get faster single-click |
55 | * classification. |
56 | */ |
57 | } lws_button_regime_t; |
58 | |
59 | /* |
60 | * This is the const part of the button controller, describing the static |
61 | * bindings to gpio, and lws_smd event name information |
62 | */ |
63 | |
64 | typedef struct lws_button_map { |
65 | _lws_plat_gpio_t gpio; |
66 | const char *smd_interaction_name; |
67 | const lws_button_regime_t *regime; |
68 | /**< a default regime is applied if this is left NULL */ |
69 | } lws_button_map_t; |
70 | |
71 | typedef struct lws_button_controller { |
72 | const char *smd_bc_name; |
73 | const lws_gpio_ops_t *gpio_ops; |
74 | const lws_button_map_t *button_map; |
75 | lws_button_idx_t active_state_bitmap; |
76 | uint8_t count_buttons; |
77 | } lws_button_controller_t; |
78 | |
79 | struct lws_button_state; /* opaque */ |
80 | |
81 | /** |
82 | * lws_button_controller_create() - instantiate a button controller |
83 | * |
84 | * \param ctx: the lws_context |
85 | * \param controller: the static controller definition |
86 | * |
87 | * Instantiates a button controller from a static definition of the buttons |
88 | * and their smd names, and active levels, and binds it to a gpio implementation |
89 | */ |
90 | |
91 | LWS_VISIBLE LWS_EXTERN struct lws_button_state * |
92 | lws_button_controller_create(struct lws_context *ctx, |
93 | const lws_button_controller_t *controller); |
94 | |
95 | /** |
96 | * lws_button_controller_destroy() - destroys a button controller |
97 | * |
98 | * \param bcs: button controller state previously created |
99 | * |
100 | * Disables all buttons and then destroys and frees a previously created |
101 | * button controller. |
102 | */ |
103 | |
104 | LWS_VISIBLE LWS_EXTERN void |
105 | lws_button_controller_destroy(struct lws_button_state *bcs); |
106 | |
107 | |
108 | LWS_VISIBLE LWS_EXTERN lws_button_idx_t |
109 | lws_button_get_bit(struct lws_button_state *bcs, const char *name); |
110 | |
111 | /* |
112 | * lws_button_enable() - enable and disable buttons |
113 | */ |
114 | |
115 | LWS_VISIBLE LWS_EXTERN void |
116 | lws_button_enable(struct lws_button_state *bcs, |
117 | lws_button_idx_t _reset, lws_button_idx_t _set); |
118 | |
119 | #endif |
120 | |
121 | |