component toggle2nist "toggle button to nist logic"; description """ Toggle2nist 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 _ nofp; license "GPL"; author "Anders Wallin, 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; } }