# Switch

Wejścia register

Blok logiczny reprezentujący przełącznik ścienny

Switch
C
SP
LP
H
TG
ON
OFF

# Wyjścia

IDSkrótNazwaTypDomyślnieOpis
clickCKliknięcieBOOLEANfalseAktywne przy kliknięciu
short_pressSPKrótkie naciśnięcieBOOLEANfalseAktywne przy krótkim naciśnięciu
long_pressLPDługie naciśnięcieBOOLEANfalseAktywne przy długim naciśnięciu
holdHPrzytrzymanieBOOLEANfalseAktywne przy przytrzymaniu
toggleTGPrzełącznikBOOLEANfalseWyjście przełączające, aktywne po kliknięciu
onONWłączonyBOOLEANfalseAktywne gdy przełącznik jest włączony
offOFFWyłączonyBOOLEANtrueAktywne gdy przełącznik jest wyłączony

# Konfiguracja

IDNazwaTypDomyślnieJednostkaOpis
click_duration_msCzas kliknięciaNUMBER500msCzas trwania kliknięcia w ms

Szczegóły:

≥ 0
short_press_duration_msCzas krótkiego naciśnięciaNUMBER1000msCzas trwania krótkiego naciśnięcia w ms

Szczegóły:

≥ 0
> click_duration_ms
long_press_duration_msCzas długiego naciśnięciaNUMBER5000msCzas trwania długiego naciśnięcia w ms

Szczegóły:

≥ 0
> short_press_duration_ms
hold_duration_msCzas przytrzymaniaNUMBER1000msCzas trwania przytrzymania w ms

Szczegóły:

≥ 0

# Stan

IDNazwaTypDomyślnieJednostkaOpis
last_change_time_msCzas ostatniej zmianyNUMBER0msCzas ostatniej zmiany stanu

# Kod źródłowy

Pokaż kod Volang
callback_ms = 100
channel = input::channel()

extern fn onCallback(callback_id, callback_ms) {
    if (callback_id == 1) {
        output::set("click", false)
    } else if (callback_id == 2) {
        output::set("short_press", false)
    } else if (callback_id == 3) {
        output::set("long_press", false)
    } else if (callback_id == 10) { // hold check
        if (output::get("on") == true) {
            if (output::get("hold")) {
                output::set("hold", false)
                callback::set(config::get("hold_duration_ms"), "onCallback", 10, callback_ms)
            } else if (!output::get("hold")) {
                output::set("hold", true)
                callback::set(callback_ms, "onCallback", 10, callback_ms) // schedule callback to switch off the hold pulse
            }
        }
    }
}

pressed = input::value()
now = time::uptime()

if (pressed == 1) {
    state::set("last_change_time_ms", now)
    output::set("on", true)
    output::set("off", false)

    callback::set(config::get("hold_duration_ms"), "onCallback", 10, callback_ms)
} else {
    callback::clear()

    diff_ms = time::uptime() - state::get("last_change_time_ms")

    clicked = false
    if (diff_ms <= config::get("click_duration_ms")) {
        output::set("click", true)
        callback::set(callback_ms, "onCallback", 1, callback_ms)
        clicked = true
    } else if (diff_ms <= config::get("short_press_duration_ms")) {
        output::set("short_press", true)
        callback::set(callback_ms, "onCallback", 2, callback_ms)
    } else if (diff_ms <= config::get("long_press_duration_ms")) {
        output::set("long_press", true)
        callback::set(callback_ms, "onCallback", 3, callback_ms)
    }

    if (clicked) {
        output::toggle("toggle")
    }
    output::set("on", false)
    output::set("off", true)

    output::set("hold", false)
}
Blok logiczny reprezentujący przełącznik ścienny