# Switch
Blok logiczny reprezentujący przełącznik ścienny
Switch
C
SP
LP
H
TG
ON
OFF
# Wyjścia
| ID | Skrót | Nazwa | Typ | Domyślnie | Opis |
|---|---|---|---|---|---|
click | C | Kliknięcie | BOOLEAN | false | Aktywne przy kliknięciu |
short_press | SP | Krótkie naciśnięcie | BOOLEAN | false | Aktywne przy krótkim naciśnięciu |
long_press | LP | Długie naciśnięcie | BOOLEAN | false | Aktywne przy długim naciśnięciu |
hold | H | Przytrzymanie | BOOLEAN | false | Aktywne przy przytrzymaniu |
toggle | TG | Przełącznik | BOOLEAN | false | Wyjście przełączające, aktywne po kliknięciu |
on | ON | Włączony | BOOLEAN | false | Aktywne gdy przełącznik jest włączony |
off | OFF | Wyłączony | BOOLEAN | true | Aktywne gdy przełącznik jest wyłączony |
# Konfiguracja
| ID | Nazwa | Typ | Domyślnie | Jednostka | Opis |
|---|---|---|---|---|---|
click_duration_ms | Czas kliknięcia | NUMBER | 500 | ms | Czas trwania kliknięcia w ms Szczegóły: ≥ 0 |
short_press_duration_ms | Czas krótkiego naciśnięcia | NUMBER | 1000 | ms | Czas trwania krótkiego naciśnięcia w ms Szczegóły: ≥ 0 > click_duration_ms |
long_press_duration_ms | Czas długiego naciśnięcia | NUMBER | 5000 | ms | Czas trwania długiego naciśnięcia w ms Szczegóły: ≥ 0 > short_press_duration_ms |
hold_duration_ms | Czas przytrzymania | NUMBER | 1000 | ms | Czas trwania przytrzymania w ms Szczegóły: ≥ 0 |
# Stan
| ID | Nazwa | Typ | Domyślnie | Jednostka | Opis |
|---|---|---|---|---|---|
last_change_time_ms | Czas ostatniej zmiany | NUMBER | 0 | ms | Czas 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)
}
