Skip to content

Cookbook#

1. Timed session#

This automatically ends the session after 3 seconds

from pyControl.utility import *
from devices import *

states = ["state_a"]
events = ["session_over"]

v.session_duration = 3 * second

initial_state = "state_a"


def run_start():
    set_timer("session_over", v.session_duration)


def state_a(event):
    if event == "session_over":
        stop_framework()

2. Blinking light#

Demonstrates how to make multiple LEDs blink at different frequencies asynchronously. In this task, the red and green LEDs alternate: each blinks for 2 seconds before switching, while the blue LED blinks continuously at its own frequency.

from pyControl.utility import *
from devices import *


# hardware
breakout = Breakout_1_2()
blue_LED = Digital_output(breakout.LED_blue)
red_LED = Digital_output(breakout.LED_red)
green_LED = Digital_output(breakout.LED_green)

# states and events
states = ["red_state", "green_state"]
events = ["toggle_red", "toggle_green", "toggle_blue"]

# variables
v.red_frequency = 5 # Hz
v.green_frequency = 10 # Hz
v.blue_frequency = 3 # Hz

initial_state = "red_state"


def run_start():
    set_timer("toggle_blue", 1000.0 / v.blue_frequency)


def all_states(event):
    if event == "toggle_blue":
        blue_LED.toggle()
        set_timer("toggle_blue", 1000.0 / v.blue_frequency)


def red_state(event):
    if event == "entry":
        timed_goto_state("green_state", 2 * second)
        set_timer("toggle_red", 1000.0 / v.red_frequency)
    elif event == "toggle_red":
        red_LED.toggle()
        set_timer("toggle_red", 1000.0 / v.red_frequency)
    elif event == "green_state":
        goto_state("green_state")
    elif event == "exit":
        red_LED.off()


def green_state(event):
    if event == "entry":
        timed_goto_state("red_state", 2 * second)
        set_timer("toggle_green", 1000.0 / v.green_frequency)
    elif event == "toggle_green":
        green_LED.toggle()
        set_timer("toggle_green", 1000.0 / v.green_frequency)
    elif event == "exit":
        green_LED.off()

3. Button hold threshold#

Demonstrates how to detect when a button is held for a certain duration.

from pyControl.utility import *
from devices import *

breakout = Breakout_1_2()
button = Digital_input(
    breakout.button,
    pull="up",
    falling_event="button_press",
    rising_event="button_release",
)

states = ["wait_for_hold"]
events = ["button_press", "button_release", "hold_complete"]

v.hold_time = 2 * second

initial_state = "wait_for_hold"


def wait_for_hold(event):
    if event == "button_press":
        set_timer("hold_complete", v.hold_time)
    elif event == "button_release":
        ms_short = timer_remaining("hold_complete")
        disarm_timer("hold_complete")
        if ms_short > 0:
            print("Button not held long enough, {} ms remaining".format(ms_short))
    elif event == "hold_complete":
        print("Button successfully held for {} ms".format(v.hold_time))