Skip to content
Snippets Groups Projects
ThreeButtonNodePactman.ino 4.33 KiB
Newer Older
Joe Revans's avatar
Joe Revans committed
#include "NameDictionary.h"
#include "Button.h"
#include "Potentiometer.h"
#include "RotaryEncoder.h"
#include <VizBlocks.h>
#include <Behaviours.h>

//Get device name
const String device_id = String(ESP.getChipId(), HEX);
NameDictionary d;
const String name = d.get(device_id);
char _name[10];

//Init as a VizBlock node with "null" ID.
VizBlocks node(
  "null",     // Our ID
  "NodeRedServer", //Wifi Access Point
  "NodeR3dAP",  //WiFi Password
  "192.168.4.1",//IP address of Node RED server
  1883          //Port for Node RED server
  );

//Init button
const int b0Pin = 2;
const int b1Pin = 3; // change this to correct pin number
const int b2Pin = 4; // change this to correct pin number

Button b0(b0Pin, 0);
Button b1(b1Pin, 1);
Button b2(b2Pin, 2);

//Button Interrupt Service Routine
void ICACHE_RAM_ATTR b0ISR() { b0.tick(); }
void ICACHE_RAM_ATTR b1ISR() { b1.tick(); }
void ICACHE_RAM_ATTR b2ISR() { b2.tick(); }

unsigned long t = 0;
const int pingInterval = 4000;

void setup() {
  //Get the serial port ready
  Serial.begin(115200);
  Serial.println("Serial started!");
  delay(500);

  //Pass event handlers into button
  b0.initInterrupts(b0ISR);
  b1.initInterrupts(b1ISR);
  b2.initInterrupts(b2ISR);

  b0.setEventHandler(bCB);
  b1.setEventHandler(bCB);
  b2.setEventHandler(bCB);
  

  //Print device name
  if (name == device_id) {
    Serial.println("!!! This device doesn't have a name yet. Let's call it: " + name);
  } else {
    Serial.println("Device name: " + name);
  }
  name.toCharArray(_name, 10);
  node.setID(_name);

  //Add in the custom behaviour we defined earlier.
  node.add(new SendCapabilities(&node) );
  node.add(new PingServer(&node) );
  node.add(new Link(&node) );

  node.add(new ButtonPressed(&node) );
  node.add(new ButtonReleased(&node) );
  node.add(new ButtonClicked(&node) );
  node.add(new ButtonHeld(&node) );
  node.add(new ButtonTick(&node) );
  node.add(new PotentiometerUpdated(&node) );
  node.add(new RotaryEncoderUpdated(&node) );

  //Initialise the whole infrastructure
  node.set_wifi(true);
  node.init();
  delay(500);

  node.process("PingServer");
}

void loop() {
  node.run();
  b0.check();
  b1.check();
  b2.check();
  pingComms(pingInterval);
}

void pingComms(int interval) {
  unsigned long timeNow = millis();
  if (timeNow > t + interval) {
    t = timeNow;
    Serial.println("Link " + name);
  }
}

void bCB(Button* button, uint8_t eventType, bool state) {
  /*
   * Button event handler that triggers VizBlocks behaviours
   */

  String idString = String(button->getId());

  Serial.println("Button ID: " + idString + " Event Type: " + String(eventType) + " State: " + String(state));

  switch(eventType) {
    case Button::kEventPressed:
    //Do something
    break;

    case Button::kEventReleased:
    //Do something else
    node.input_event("ButtonReleased " + idString);
    break;

    case Button::kEventClicked:
    //Do something else
    node.input_event("ButtonClicked " + idString);
    break;

    case Button::kEventHeld:
    //Do something else
    node.input_event("ButtonHeld " + idString);
    break;

    case Button::kEventTick:
    //Do something else
    node.input_event("ButtonTick " + idString);
    break;
  }
}

void pCB(Potentiometer* potentiometer, uint8_t eventType, uint8_t sensorValue) {
  /*
   * Potentiometer Event Handler that triggers VizBlocks behaviours
   */

  String idString = String(potentiometer->getId());

  Serial.println("Slider ID: " + idString + " Event Type: " + String(eventType) + " Sensor Value: " + String(sensorValue));

  switch(eventType) {
    case Potentiometer::kEventStableUpdate:
    //Do something
    node.input_event("PotentiometerUpdated " + idString + " " + String(sensorValue));
    break;

    case Potentiometer::kEventUnstableUpdate:
    //Do something else
    break;
  }
}

void reCB(RotaryEncoder* rotaryEncoder, uint8_t eventType, int position) {
  /*
   * Rotary Encoder event handler that triggers VizBlocks behaviours
   */

  String idString = String(rotaryEncoder->getId());

  Serial.println("Encoder ID: " + idString + " Event Type: " + String(eventType) + " Position: " + String(position));

  switch(eventType) {
    case RotaryEncoder::kEventStableUpdate:
    //Do something
    node.input_event("RotaryEncoderUpdated " + idString + " " + String(position));
    break;

    case RotaryEncoder::kEventUnstableUpdate:
    //Do something else
    break;
  }
}