为什么这个去抖动功能不起作用?
Why does this debounce function not work?
所以我正在尝试进行简单的去抖动,但我就是想不通哪里搞砸了。
这是代码:
def debounce(var, db):
if var == 1 and db == 0:
db = 1
elif var == 0:
db = 0
else:
var = 0
return var, db
while True:
mouse_buttons = get_mouse_buttons() # -This is the fuction that if the mouse's buttons are pressed
pressed, db = debounce(mouse_buttons[0], db)
mouse_buttons = (pressed, 0, 0)
print(mouse_buttons[0])
我的预期输出是,如果我按下鼠标按钮,那么它会一次为 1,然后变为 0,直到我松开并再次按下它。当前代码第一次给出1,不管怎样,之后只给出0。 (我测试过,与returns鼠标按下按钮的功能无关。)
去抖总是需要设置db
。您不会在所有情况下都这样做。如果您希望 pressed
成为去抖动值,那么您需要:
def debounce(var, db):
if var == 1 and db == 0:
db = 1
else:
db = 0
return db, var
为了解决这个问题,请随时间将状态写在纸上:
var = 0 1 1 1 1 1 1 0 0 0 1 1 1
db = 0 1 0 0 0 0 0 0 0 0 1 0 0
只是为了确认您的测试预期
var | db | var,db
----------------------
0 0 0,0
0 1 0,0
1 0 1,1
1 1 0,1
如果这是正确的,那么我不确定你的函数是否这样做。
这更简单 - 重现相同的逻辑 table。
def debounce(var, db):
return var and not db, var
在这种情况下,当 var 为 0 - 这将 return 0,0
当 var 为 1 时,这将 return 1,1 if db == 0
当 var 为 0 时,这将 return 0,1 if db == 1
附录 - 当我重新 运行 你的代码时 get_mouse_buttons()
替换为:
def get_mouse_buttons():
return (int(input('>>').lower()=='y'), 0, 0)
在您决定(通过键入 Y/y)鼠标按钮是否被按下的地方,事实证明您的去抖动代码 - 尽管笨拙确实做了预期的事情 - 你的循环只打印 1 时您最初键入 'y' 或者您从非 'y' 变为 'y' - 即您的代码正确检测到从未按下到按下的初始变化。
既然你说你的代码不起作用,那么很明显怀疑你的 get_mouse_buttons() 函数 - 你声称它工作正常。
所以我正在尝试进行简单的去抖动,但我就是想不通哪里搞砸了。 这是代码:
def debounce(var, db):
if var == 1 and db == 0:
db = 1
elif var == 0:
db = 0
else:
var = 0
return var, db
while True:
mouse_buttons = get_mouse_buttons() # -This is the fuction that if the mouse's buttons are pressed
pressed, db = debounce(mouse_buttons[0], db)
mouse_buttons = (pressed, 0, 0)
print(mouse_buttons[0])
我的预期输出是,如果我按下鼠标按钮,那么它会一次为 1,然后变为 0,直到我松开并再次按下它。当前代码第一次给出1,不管怎样,之后只给出0。 (我测试过,与returns鼠标按下按钮的功能无关。)
去抖总是需要设置db
。您不会在所有情况下都这样做。如果您希望 pressed
成为去抖动值,那么您需要:
def debounce(var, db):
if var == 1 and db == 0:
db = 1
else:
db = 0
return db, var
为了解决这个问题,请随时间将状态写在纸上:
var = 0 1 1 1 1 1 1 0 0 0 1 1 1
db = 0 1 0 0 0 0 0 0 0 0 1 0 0
只是为了确认您的测试预期
var | db | var,db
----------------------
0 0 0,0
0 1 0,0
1 0 1,1
1 1 0,1
如果这是正确的,那么我不确定你的函数是否这样做。
这更简单 - 重现相同的逻辑 table。
def debounce(var, db):
return var and not db, var
在这种情况下,当 var 为 0 - 这将 return 0,0 当 var 为 1 时,这将 return 1,1 if db == 0 当 var 为 0 时,这将 return 0,1 if db == 1
附录 - 当我重新 运行 你的代码时 get_mouse_buttons()
替换为:
def get_mouse_buttons():
return (int(input('>>').lower()=='y'), 0, 0)
在您决定(通过键入 Y/y)鼠标按钮是否被按下的地方,事实证明您的去抖动代码 - 尽管笨拙确实做了预期的事情 - 你的循环只打印 1 时您最初键入 'y' 或者您从非 'y' 变为 'y' - 即您的代码正确检测到从未按下到按下的初始变化。
既然你说你的代码不起作用,那么很明显怀疑你的 get_mouse_buttons() 函数 - 你声称它工作正常。