From 1deb672da3fcc46905a1cd6b2802d0ad2302685d Mon Sep 17 00:00:00 2001 From: Joe Revans <jrevans@ed.ac.uk> Date: Tue, 7 Apr 2020 16:30:22 +0100 Subject: [PATCH] starter node code update --- .../StarterNodePactman/StarterNodePactman.ino | 136 ++++++++++++++++-- 1 file changed, 126 insertions(+), 10 deletions(-) diff --git a/examples/StarterNodePactman/StarterNodePactman.ino b/examples/StarterNodePactman/StarterNodePactman.ino index 0200037..8af61a8 100644 --- a/examples/StarterNodePactman/StarterNodePactman.ino +++ b/examples/StarterNodePactman/StarterNodePactman.ino @@ -1,12 +1,15 @@ #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 id = d.get(device_id); -char _id[10]; +const String name = d.get(device_id); +char _name[10]; //Init as a VizBlock node with "null" ID. VizBlocks node( @@ -17,6 +20,32 @@ VizBlocks node( 1883 //Port for Node RED server ); +//Init button +const int bPin = 2; +const int bID = 0; +Button b(bPin, bID); + +//Button Interrupt Service Routine +void ICACHE_RAM_ATTR bISR() { + b.tick(); +} + +//Init potientiometer +const int pPin = A0; +const int pID = 1; +Potentiometer p(pPin, pID); + +//Init rotary encoder +const int rePinA = 4; +const int rePinB = 5; +const int reID = 2; +RotaryEncoder re(rePinA, rePinB, reID); + +//Rotary Encoder Interrupt Serivce Routine +void ICACHE_RAM_ATTR reISR() { + re.tick(); +} + unsigned long t = 0; const int pingInterval = 4000; @@ -27,15 +56,23 @@ void setup() Serial.println("Serial started!"); delay(500); + //Pass event handlers into button + b.initInterrupts(bISR); + b.setEventHandler(bCB); + //Pass event handlers into potentiometer + p.setEventHandler(pCB); + //Pass event handlers into rotary encoder + re.initInterrupts(reISR); + re.setEventHandler(reCB); //Print device name - if (id == device_id) { - Serial.println("!!! This device doesn't have a name yet. Let's call it: " + id); + if (name == device_id) { + Serial.println("!!! This device doesn't have a name yet. Let's call it: " + name); } else { - Serial.println("Device name: " + id); + Serial.println("Device name: " + name); } - id.toCharArray(_id, 10); - node.setID(_id); + name.toCharArray(_name, 10); + node.setID(_name); //Add in the custom behaviour we defined earlier. node.add(new SendCapabilities(&node) ); @@ -47,7 +84,6 @@ void setup() 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) ); @@ -59,10 +95,12 @@ void setup() node.process("PingServer"); } - void loop() { node.run(); + b.check(); + p.check(); + re.check(); pingComms(pingInterval); } @@ -70,6 +108,84 @@ void pingComms(int interval) { unsigned long timeNow = millis(); if (timeNow > t + interval) { t = timeNow; - Serial.println("Link " + id); + 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; } } -- GitLab