Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
77 changes: 77 additions & 0 deletions src/hal/components/momentary2nist.comp
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
component momentary2nist "momentary button to nist logic";

description
"""
Momentary2nist can be used with a momentary push button
to control a device that has separate on and off inputs
and an is-on output.
A debounce delay in cycles can be set for 'in'. (default = 2)

* On a rising edge on pin *in* when *is-on* is low: It sets *on* until *is-on* becomes high.
* On a rising edge on pin *in* when *is-on* is high: It sets *off* until *is-on* becomes low.

....
       ┐     ┌─────xxxxxxxxxxxx┐           ┌─────xxxxxxxxxxxx┐
in   : └─────┘     xxxxxxxxxxxx└───────────┘     xxxxxxxxxxxx└─────

       ┐     ┌───────────┐
on   : └─────┘           └─────────────────────────────────────────

       ┐                                   ┌───────────┐
off  : └───────────────────────────────────┘           └───────────

       ┐                 ┌─────────────────────────────┐
is-on: └─────────────────┘                             └───────────
....

""";

pin in bit in "momentary button in";
pin in bit is_on "current state of device";
pin in unsigned debounce = 2 "debounce delay for 'in'-pin in cycles";
pin out bit on "turn device on";
pin out bit off "turn device off";
variable int debounce_cntr;
variable unsigned debounce_set;
variable int state;

option period no;
function _;
license "GPL";
author "David Mueller";
;;
FUNCTION(_) {

if (( debounce < 1 ) || ( debounce > 10000 )) {
debounce_set = 2; /* set a sane value */
} else {
debounce_set = debounce;
}

if (in && state == 0 ) { /* input has changed from debounced 0 -> 1 */
debounce_cntr++;
if ( debounce_cntr >= (int)debounce_set ) {
if (!is_on) { /* turn ON if it's off */
on=1;
off=0;
} else { /* turn OFF if it's on */
on=0;
off=1;
}
state = 1;
debounce_cntr = 0;
}
} else if (!in && state == 1) { /* input has changed from debounced 1 -> 0 */
debounce_cntr++;
if ( debounce_cntr >= (int)debounce_set ) {
state = 0;
debounce_cntr = 0;
}
} else if ((!is_on && off) || (is_on && on)) { /* reset outputs once device has switched*/
on = 0;
off = 0;
debounce_cntr = 0;
} else {
debounce_cntr = 0;
}
}
19 changes: 10 additions & 9 deletions src/hal/components/toggle2nist.comp
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,17 @@ component toggle2nist "toggle button to nist logic";

description
"""
Toggle2nist can be used with a momentary push button
Toggle2nist can be used with a latching push button
to control a device that has separate on and off inputs
and an is-on output.
A debounce delay in cycles can be set for 'in'. (default = 2)

* On a rising edge on pin *in* when *is-on* is low: It sets *on* until *is-on* becomes high.
* On a rising edge on pin *in* when *is-on* is high: It sets *off* until *is-on* becomes low.
* On a falling edge on pin *in* when *is-on* is high: It sets *off* until *is-on* becomes low.

....
       ┐     ┌─────xxxxxxxxxxxx┐           ┌─────xxxxxxxxxxxx
in   : └─────┘     xxxxxxxxxxxx└───────────┘     xxxxxxxxxxxx└─────
       ┐     ┌─────────────────────────────
in   : └─────┘                             └───────────────────────

       ┐     ┌───────────┐
on   : └─────┘           └─────────────────────────────────────────
Expand All @@ -26,7 +26,7 @@ is-on: └─────────────────┘       

""";

pin in bit in "momentary button in";
pin in bit in "toggle button in";
pin in bit is_on "current state of device";
pin in unsigned debounce = 2 "debounce delay for 'in'-pin in cycles";
pin out bit on "turn device on";
Expand All @@ -38,7 +38,7 @@ variable int state;
option period no;
function _;
license "GPL";
author "Anders Wallin, David Mueller";
author "Anders Wallin";
;;
FUNCTION(_) {

Expand All @@ -54,16 +54,17 @@ FUNCTION(_) {
if (!is_on) { /* turn ON if it's off */
on=1;
off=0;
} else { /* turn OFF if it's on */
on=0;
off=1;
}
state = 1;
debounce_cntr = 0;
}
} else if (!in && state == 1) { /* input has changed from debounced 1 -> 0 */
debounce_cntr++;
if ( debounce_cntr >= (int)debounce_set ) {
if (is_on) { /* turn OFF if it's on */
on=0;
off=1;
}
state = 0;
debounce_cntr = 0;
}
Expand Down
Loading