双按钮菜单迭代

Two-Button Menu Iteration

我有一个脚本,我要在 2040 上适应 micropython,我想使用两个按钮来导航菜单结构。我无法弄清楚如何使多选菜单中的迭代循环正常工作...这是我目前所知道的:

""" fit: a productivity logger """
import time
import sys
import os
import uhashlib
import machine

def final_print(sec,final_hash,final_survey):
    """ leaves the summary on the screen before shutting down """
    mins = sec // 60
    sec = sec % 60
    hours = mins // 60
    mins = mins % 60
    short_sec = int(sec)
    duration = (str(hours) + "/" + str(mins) + "/" + str(short_sec))
    print("> fit the",str(final_hash)," went ",str(final_survey)," lasted //",str(duration))

def timer_down(f_seconds,timer_focus):
    """ counts down for defined period """
    now = time.time()
    end = now + f_seconds
    while now < end:
        now = time.time()
        fit_progress(now,end,timer_focus,f_seconds)
        b1pressed = button1.value()
        time.sleep(0.01)
        if not b1pressed:
             print('Ended Manually!')
             break

def timer_up(timer_focus):
    """ counts up for indefinite period """
    now = time.time()
    while True:
         minutes = int((time.time() - now) / 60)
         print(str(timer_focus)," for ",str(minutes))
         b1pressed = button1.value()
         time.sleep(0.01)
         if not b1pressed:
             print('Ended Manually!')
             break

def fit_progress(now,end,timer_focus,f_seconds):
    """ tracks progress of a count-down fit and prints to screen """
    remain = end - now
    f_minutes = int((remain)/60)
    j = 1 - (remain / f_seconds)
    pct = int(100*j)
    print(str(timer_focus),str(f_minutes),str(pct))

def multi_choice(options):
    done = 0
    while done == 0:
        for i in options:
            b1pressed = button1.value()
            b2pressed = button2.value()
            time.sleep(.01)
            b1released = button1.value()
            b2released = button2.value()
            if b2pressed and not b1pressed:
                print(i," b2 pressed")
                continue
            if b1pressed and not b2pressed:
                print(i," b1 pressed")
                time.sleep(2)
                return i

button1 = machine.Pin(2, machine.Pin.IN, machine.Pin.PULL_UP)
button2 = machine.Pin(3, machine.Pin.IN, machine.Pin.PULL_UP)

print("format?")
fType = multi_choice(['30-minute fit','60-minute fit','indefinite fit'])
print(fType," selected")

print("focus?")
F_FOCUS = multi_choice(['personal fit','work fit','learn fit','admin fit'])
print(F_FOCUS," selected")

fStart = time.time()

if fType == "30-minute fit":
    timer_down(1800,F_FOCUS)
elif fType == "60-minute fit":
    timer_down(3600,F_FOCUS)
elif fType == "indefinite fit":
    timer_up(F_FOCUS)
else:
    sys.exit()

fEnd = time.time()

print("sentiment?")
F_SURVEY = multi_choice(['+','=','-'])
print(F_SURVEY," selected")

fDuration = fEnd - fStart

F_HASH = uhashlib.sha256(str(fEnd).encode('utf-8')).digest()
F_HASH_SHORT = F_HASH[0:3]

fitdb = open("data.csv","a")
fitdb.write(str(F_HASH)+","+str(fType)+","+str(F_FOCUS)+","+str(F_SURVEY)+","+str(fStart)+","+str(fEnd)+","+str(fDuration)+"\n")
fitdb.close()

final_print(fDuration,F_HASH_SHORT,F_SURVEY)
print(F_HASH_SHORT," ",F_HASH)

特别是,这是我正在争论的逻辑:

def multi_choice(options):
    done = 0
    while done == 0:
        for i in options:
            b1pressed = button1.value()
            b2pressed = button2.value()
            time.sleep(.01)
            b1released = button1.value()
            b2released = button2.value()
            if b2pressed and not b1pressed:
                print(i," b2 pressed")
                continue
            if b1pressed and not b2pressed:
                print(i," b1 pressed")
                time.sleep(2)
                return i

这是我想要做的事情:

对于集合中的每个项目,

同样,这是 micropython,所以我没有您认为可用的所有模块...最好用原始代码来完成。

0.01 秒太短了。关键是,在你检测到“button down”之后,你需要等待“button up”。你需要这样的东西:

def wait_for_btn_up(btn):
    count = 2
    while count > 0:
        if btn.value();
            count = 2
        else:
            count -= 1
        time.sleep(0.01)

    
def multi_choice(options):
    for i in options:
        print( "trying", i )
        # Wait for any button press.
        while 1:
            b1pressed = button1.value()
            b2pressed = button2.value()
            if b1pressed or b2pressed: 
                break
        if b1pressed:
            print( i, "chosen" )
            wait_for_btn_up(button1)
            return i
        # We know B2 was pressed.
        wait_for_btn_up(button2)