| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 | // === ENTER NRF.getAddress() results of the couple of
// === puck.js devices you want to identify each other
const his = "12:34:56:78:9a:bc", hers = "fe:dc:ba:98:76:54";
let me = NRF.getAddress(), other = me===hers ? his : hers;
let other_id = `${other} random`;
// heart-beat LED animation sequence
let seq = [1,1,0,1,1,0,0,0,0], seq_idx = 0;
let anim_interval_id = 0, main_interval_id = 0;
let active = false, grace_period = 0;
function anim_step() { // a single heart-beat animation step
  digitalWrite(LED1, seq[seq_idx]);
  seq_idx = (seq_idx+1)%seq.length;
}
// set interval (1/rate) of animation. 0 means stop animation
function animate(interval) {
  if (anim_interval_id) {
    clearInterval(anim_interval_id);
    digitalWrite(LED1, 0);
    anim_interval_id = 0;
  }
  if (interval) {
    anim_interval_id = setInterval(anim_step, interval);
  }
}
let main_event;
main_event = function() {
  if (grace_period) {
    grace_period--;
    if (!grace_period) {
      if (active) {
        active = false;
        if (main_interval_id) {
          clearInterval(main_interval_id);
          main_interval_id = 0;
        }
        console.log("Deactivated");
      } else {
        active = true;
        console.log("Activated");
      }
      animate(0);
    }
    return;
  }
  NRF.requestDevice(
    {filters: [{id: other_id}]}
  ).then(
    function(device) {
      let rssi = device.rssi, interval = Math.max(30, 120-3*(rssi+80));
      console.log(rssi, interval);
      animate(interval);
    },
    function(e) {
      console.log(e);
      animate(0);
    }
  );
};
// Button activates/deactivates
// Also animates for a grace period:
// Slow for activate, fast for deactivate
setWatch(function() {
  grace_period = 2;
  if (active) {
    console.log("Deactivating");
    animate(20);
  } else {
    console.log("Activating");
    animate(100);
    if (!main_interval_id) {
      main_interval_id = setInterval(main_event, 3000);
    }
  }
}, BTN, {edge:"rising", debounce:50, repeat:true});
 |