Lines Matching +full:for +full:- +full:each
4 * Copyright (C) 2019 - 2020 Andy Green <andy@warmcat.com>
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
24 #include "private-lib-core.h"
40 * This is the opaque, allocated, non-const, dynamic footprint of the
56 /* incremented each time the mon timer cb happens */
92 lws_button_each_t *each = (lws_button_each_t *)arg; in lws_button_irq_cb_t() local
94 each->isr_pending = 1; in lws_button_irq_cb_t()
95 LWS_PLAT_TIMER_START(each->bcs->timer); in lws_button_irq_cb_t()
100 * This is the bottom-half scheduled via a timer set in the ISR. From here we
111 lws_button_each_t *each = (lws_button_each_t *)&bcs[1]; in LWS_PLAT_TIMER_CB() local
112 const lws_button_controller_t *bc = bcs->controller; in LWS_PLAT_TIMER_CB()
116 * The ISR and bottom-half is shared by all the buttons. Each gpio in LWS_PLAT_TIMER_CB()
119 * each->isr_pending and schedules this bottom half. in LWS_PLAT_TIMER_CB()
127 for (n = 0; n < bc->count_buttons; n++) { in LWS_PLAT_TIMER_CB()
129 if (!each[n].isr_pending) in LWS_PLAT_TIMER_CB()
137 bc->gpio_ops->irq_mode(bc->button_map[n].gpio, in LWS_PLAT_TIMER_CB()
140 each[n].isr_pending = 0; in LWS_PLAT_TIMER_CB()
147 bc->gpio_ops->set(bc->button_map[n].gpio, in LWS_PLAT_TIMER_CB()
148 !!(bc->active_state_bitmap & (1 << n))); in LWS_PLAT_TIMER_CB()
149 bc->gpio_ops->mode(bc->button_map[n].gpio, LWSGGPIO_FL_WRITE); in LWS_PLAT_TIMER_CB()
151 if (each[n].state == LBCS_IDLE) { in LWS_PLAT_TIMER_CB()
158 each[n].state = LBCS_MIN_DOWN_QUALIFY; in LWS_PLAT_TIMER_CB()
159 each[n].mon_timer_comp = bcs->mon_timer_count; in LWS_PLAT_TIMER_CB()
161 if (!bcs->mon_refcount++) { in LWS_PLAT_TIMER_CB()
163 LWS_PLAT_TIMER_START(bcs->timer_mon); in LWS_PLAT_TIMER_CB()
169 * Just for a us or two inbetween here, we're driving it to the in LWS_PLAT_TIMER_CB()
172 * the switch to a deterministic-ish state. in LWS_PLAT_TIMER_CB()
175 * difference; if it was a pre-contact and the charge on the in LWS_PLAT_TIMER_CB()
181 bc->gpio_ops->mode(bc->button_map[n].gpio, LWSGGPIO_FL_READ); in LWS_PLAT_TIMER_CB()
194 bc->gpio_ops->irq_mode(bc->button_map[n].gpio, in LWS_PLAT_TIMER_CB()
195 bc->active_state_bitmap & (1 << n) ? in LWS_PLAT_TIMER_CB()
198 lws_button_irq_cb_t, &each[n]); in LWS_PLAT_TIMER_CB()
207 lws_button_each_t *each = (lws_button_each_t *)&bcs[1]; in LWS_PLAT_TIMER_CB() local
208 const lws_button_controller_t *bc = bcs->controller; in LWS_PLAT_TIMER_CB()
215 bcs->mon_timer_count++; in LWS_PLAT_TIMER_CB()
217 for (n = 0; n < bc->count_buttons; n++) { in LWS_PLAT_TIMER_CB()
219 if (each->state == LBCS_IDLE) { in LWS_PLAT_TIMER_CB()
220 each++; in LWS_PLAT_TIMER_CB()
224 if (bc->button_map[n].regime) in LWS_PLAT_TIMER_CB()
225 regime = bc->button_map[n].regime; in LWS_PLAT_TIMER_CB()
229 comp_age_ms = (bcs->mon_timer_count - each->mon_timer_comp) * in LWS_PLAT_TIMER_CB()
232 active = bc->gpio_ops->read(bc->button_map[n].gpio) ^ in LWS_PLAT_TIMER_CB()
233 (!(bc->active_state_bitmap & (1 << n))); in LWS_PLAT_TIMER_CB()
235 // lwsl_notice("%d\n", each->state); in LWS_PLAT_TIMER_CB()
237 switch (each->state) { in LWS_PLAT_TIMER_CB()
241 * is a glitch, or if it meets the criteria for being in LWS_PLAT_TIMER_CB()
244 * for the time mentioned in the applied regime (at in LWS_PLAT_TIMER_CB()
258 /* We ignore stuff for a bit after discard */ in LWS_PLAT_TIMER_CB()
259 each->mon_timer_comp = bcs->mon_timer_count; in LWS_PLAT_TIMER_CB()
260 each->state = LBCS_UP_SETTLE2; in LWS_PLAT_TIMER_CB()
264 if (comp_age_ms >= regime->ms_min_down) { in LWS_PLAT_TIMER_CB()
269 * we can call it as a long-click in LWS_PLAT_TIMER_CB()
272 each->mon_timer_repeat = bcs->mon_timer_count; in LWS_PLAT_TIMER_CB()
273 each->state = LBCS_ASSESS_DOWN_HOLD; in LWS_PLAT_TIMER_CB()
283 * past the long-click threshold, we can call it as a in LWS_PLAT_TIMER_CB()
284 * long-click and do the up processing afterwards. in LWS_PLAT_TIMER_CB()
286 if (comp_age_ms >= regime->ms_min_down_longpress) { in LWS_PLAT_TIMER_CB()
289 each->state = LBCS_WAIT_UP; in LWS_PLAT_TIMER_CB()
295 * He didn't hold it past the long-click in LWS_PLAT_TIMER_CB()
297 * as either a click or a double-click then. in LWS_PLAT_TIMER_CB()
299 * If double-clicks are not allowed to be in LWS_PLAT_TIMER_CB()
301 * as a single-click. in LWS_PLAT_TIMER_CB()
303 if (!(regime->flags & in LWS_PLAT_TIMER_CB()
308 * Just wait for the up settle time then start in LWS_PLAT_TIMER_CB()
309 * looking for a second down. in LWS_PLAT_TIMER_CB()
311 each->mon_timer_comp = bcs->mon_timer_count; in LWS_PLAT_TIMER_CB()
312 each->state = LBCS_UP_SETTLE1; in LWS_PLAT_TIMER_CB()
320 if (comp_age_ms > regime->ms_up_settle) in LWS_PLAT_TIMER_CB()
322 * Just block anything for the up settle time in LWS_PLAT_TIMER_CB()
324 each->state = LBCS_WAIT_DOUBLECLICK; in LWS_PLAT_TIMER_CB()
332 * the double-click path in LWS_PLAT_TIMER_CB()
334 each->mon_timer_comp = bcs->mon_timer_count; in LWS_PLAT_TIMER_CB()
335 each->state = LBCS_MIN_DOWN_QUALIFY2; in LWS_PLAT_TIMER_CB()
339 if (comp_age_ms >= regime->ms_doubleclick_grace) { in LWS_PLAT_TIMER_CB()
344 * single-click in LWS_PLAT_TIMER_CB()
356 * as a single-click. It could be bounce in in LWS_PLAT_TIMER_CB()
362 each->mon_timer_comp = bcs->mon_timer_count; in LWS_PLAT_TIMER_CB()
363 each->state = LBCS_UP_SETTLE2; in LWS_PLAT_TIMER_CB()
367 if (comp_age_ms == regime->ms_min_down) { in LWS_PLAT_TIMER_CB()
372 if (comp_age_ms > regime->ms_min_down) { in LWS_PLAT_TIMER_CB()
374 * It's a double-click in LWS_PLAT_TIMER_CB()
377 each->state = LBCS_WAIT_UP; in LWS_PLAT_TIMER_CB()
387 each->mon_timer_comp = bcs->mon_timer_count; in LWS_PLAT_TIMER_CB()
388 each->state = LBCS_UP_SETTLE2; in LWS_PLAT_TIMER_CB()
393 if (regime->ms_repeat_down && in LWS_PLAT_TIMER_CB()
394 (bcs->mon_timer_count - each->mon_timer_repeat) * in LWS_PLAT_TIMER_CB()
395 LWS_BUTTON_MON_TIMER_MS > regime->ms_repeat_down) { in LWS_PLAT_TIMER_CB()
396 each->mon_timer_repeat = bcs->mon_timer_count; in LWS_PLAT_TIMER_CB()
403 if (comp_age_ms < regime->ms_up_settle) in LWS_PLAT_TIMER_CB()
406 each->state = LBCS_IDLE; in LWS_PLAT_TIMER_CB()
407 if (!(--bcs->mon_refcount)) { in LWS_PLAT_TIMER_CB()
409 LWS_PLAT_TIMER_STOP(bcs->timer_mon); in LWS_PLAT_TIMER_CB()
414 each++; in LWS_PLAT_TIMER_CB()
418 lws_smd_msg_printf(bcs->ctx, LWSSMDCL_INTERACTION, in LWS_PLAT_TIMER_CB()
421 bc->smd_bc_name, in LWS_PLAT_TIMER_CB()
422 bc->button_map[n].smd_interaction_name, in LWS_PLAT_TIMER_CB()
425 each++; in LWS_PLAT_TIMER_CB()
435 (controller->count_buttons * sizeof(lws_button_each_t)), in lws_button_controller_create()
437 lws_button_each_t *each = (lws_button_each_t *)&bcs[1]; in lws_button_controller_create() local
443 bcs->controller = controller; in lws_button_controller_create()
444 bcs->ctx = ctx; in lws_button_controller_create()
446 for (n = 0; n < controller->count_buttons; n++) in lws_button_controller_create()
447 each[n].bcs = bcs; in lws_button_controller_create()
451 bcs->timer = LWS_PLAT_TIMER_CREATE("bcst", in lws_button_controller_create()
453 if (!bcs->timer) in lws_button_controller_create()
457 bcs->timer_mon = LWS_PLAT_TIMER_CREATE("bcmon", LWS_BUTTON_MON_TIMER_MS, in lws_button_controller_create()
460 if (!bcs->timer_mon) in lws_button_controller_create()
474 LWS_PLAT_TIMER_DELETE(&bcs->timer); in lws_button_controller_destroy()
475 LWS_PLAT_TIMER_DELETE(&bcs->timer_mon); in lws_button_controller_destroy()
484 const lws_button_controller_t *bc = bcs->controller; in lws_button_get_bit()
487 for (n = 0; n < bc->count_buttons; n++) in lws_button_get_bit()
488 if (!strcmp(name, bc->button_map[n].smd_interaction_name)) in lws_button_get_bit()
498 lws_button_idx_t u = (bcs->enable_bitmap & (~_reset)) | _set; in lws_button_enable()
499 const lws_button_controller_t *bc = bcs->controller; in lws_button_enable()
501 lws_button_each_t *each = (lws_button_each_t *)&bcs[1]; in lws_button_enable() local
505 for (n = 0; n < bcs->controller->count_buttons; n++) { in lws_button_enable()
506 if (!(bcs->enable_bitmap & (1 << n)) && (u & (1 << n))) { in lws_button_enable()
508 bc->gpio_ops->mode(bc->button_map[n].gpio, in lws_button_enable()
510 ((bc->active_state_bitmap & (1 << n)) ? in lws_button_enable()
514 * This one is becoming enabled... the opaque for the in lws_button_enable()
518 bc->gpio_ops->irq_mode(bc->button_map[n].gpio, in lws_button_enable()
519 bc->active_state_bitmap & (1 << n) ? in lws_button_enable()
522 lws_button_irq_cb_t, &each[n]); in lws_button_enable()
525 if ((bcs->enable_bitmap & (1 << n)) && !(u & (1 << n))) in lws_button_enable()
527 bc->gpio_ops->irq_mode(bc->button_map[n].gpio, in lws_button_enable()
531 bcs->enable_bitmap = u; in lws_button_enable()