Skip to content

Instantly share code, notes, and snippets.

@HeroBrine1st
Created October 8, 2020 17:56
Show Gist options
  • Save HeroBrine1st/f811c47d211be91e708da24477d23fba to your computer and use it in GitHub Desktop.
Save HeroBrine1st/f811c47d211be91e708da24477d23fba to your computer and use it in GitHub Desktop.
GyverButton rewritten in micropython
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