Instantly share code, notes, and snippets.
Created
October 8, 2020 17:56
-
Star
(0)
0
You must be signed in to star a gist -
Fork
(0)
0
You must be signed in to fork a gist
-
Save HeroBrine1st/f811c47d211be91e708da24477d23fba to your computer and use it in GitHub Desktop.
GyverButton rewritten in micropython
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import utime | |
from machine import Pin | |
# Алгоритм полностью спизжен у гайвера | |
# Пиздец там говнокода, даже банально return сделано с ифами типа if(a==true) return true else if(a==false) return false | |
class Button: | |
def __init__(self, pin: Pin, processor: callable = lambda x: x): # processor - обработка значения с кнопки | |
self.pin = pin | |
self.processor = processor | |
self.debounce = 80 | |
self.timeout = 500 | |
self.click_timeout = 500 | |
self.step_timeout = 100 | |
self._button_counter = 0 | |
self._last_counter = 0 | |
self._last_hold_counter = 0 | |
self._button_timer = 0 | |
self._button_deb = False | |
self._hold_flag = False | |
self._counter_flag = False | |
self._is_held_f = False | |
self._is_released_f = False | |
self._is_pressed_f = False | |
self._step_flag = False | |
self._one_click_f = False | |
self._is_one_f = False | |
self._inv_state = False | |
self._button_flag = False | |
# Кто обосрался? Опять разработчик плагина | |
# overload у них там блять, а на конвенции и применения типов из typing им похуй | |
# noinspection PyArgumentList | |
def tick(self): | |
now = utime.ticks_ms() | |
state = self.processor(self.pin.value()) | |
# Нажатие | |
if state and not self._button_flag: | |
if not self._button_deb: | |
self._button_deb = True | |
self._button_timer = now | |
elif now - self._button_timer >= self.debounce: | |
self._button_flag = True | |
self._is_pressed_f = True | |
self._one_click_f = True | |
else: | |
self._button_deb = False | |
# Отпускание | |
if not state and self._button_flag: | |
self._button_flag = False | |
if not self._hold_flag: self._button_counter += 1 | |
self._hold_flag = False | |
self._is_released_f = True | |
self._button_timer = now | |
if self._step_flag: | |
self._last_counter = 0 | |
self._button_counter = 0 | |
self._step_flag = False | |
if self._one_click_f: | |
self._one_click_f = False | |
self._is_one_f = True | |
# Кнопка удерживается | |
if self._button_flag and state and (now - self._button_timer >= self.timeout and not self._hold_flag): | |
self._hold_flag = True | |
self._last_hold_counter = self._button_counter | |
self._is_held_f = True | |
self._step_flag = True | |
self._one_click_f = False | |
self._button_timer = now | |
# Обработка накликивания | |
if now - self._button_timer >= self.click_timeout and self._button_counter != 0: | |
self._last_counter = self._button_counter | |
self._button_counter = 0 | |
self._counter_flag = True | |
def reset(self): | |
self._is_pressed_f = False | |
self._is_released_f = False | |
self._is_one_f = False | |
self._is_held_f = False | |
self._step_flag = False | |
self._counter_flag = False | |
self._last_hold_counter = 0 | |
self._last_counter = 0 | |
def has_pressed(self): | |
if self._is_pressed_f: | |
self._is_pressed_f = False | |
return True | |
return False | |
def has_released(self): | |
if self._is_released_f: | |
self._is_released_f = False | |
return True | |
return False | |
def is_click(self): | |
if self._is_one_f: | |
self._is_one_f = False | |
return True | |
return False | |
# noinspection SpellCheckingInspection | |
def has_held(self): | |
# Hold Held Held блять, а не holded | |
if self._is_held_f: | |
self._is_held_f = False | |
return True | |
return False | |
def is_holding(self): | |
return self._step_flag | |
def has_clicked(self, clicks: int = None): | |
if self._counter_flag and (clicks is not None or self._last_counter == clicks): | |
self._last_counter = 0 | |
self._counter_flag = False | |
return True | |
return False | |
def has_single(self): # *has double clicked* | |
return self.has_clicked(1) | |
def has_double(self): | |
return self.has_clicked(2) | |
def has_triple(self): | |
return self.has_clicked(3) | |
@property | |
def clicks(self): | |
last_counter = self._last_counter | |
self._last_counter = 0 | |
return last_counter | |
@property | |
def hold_clicks(self): | |
return self._last_hold_counter if self._hold_flag else 0 | |
def step(self, clicks: int = 0): | |
now = utime.ticks_ms() | |
if self._button_counter == clicks and self._step_flag and now - self._button_timer >= self.step_timeout: | |
self._button_timer = now | |
return True | |
return False | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment