Browse Source

Final(?) demo

Fred Damstra (Macbook 2015) 5 months ago
parent
commit
aaa5b724e9
3 changed files with 22 additions and 295 deletions
  1. 0 194
      BackgroundRingClass.cpp
  2. 0 93
      BackgroundRingClass.h
  3. 22 8
      background_rings_demo.ino

+ 0 - 194
BackgroundRingClass.cpp

@@ -1,194 +0,0 @@
-#include "Arduino.h"
-#include "Adafruit_NeoPixel.h"
-#include "BackgroundRingClass.h"
-#include "WS2812_Definitions.h"
-
-BackgroundRingClass::BackgroundRingClass(int led_count, int pin) : Adafruit_NeoPixel(led_count+1, pin, NEO_GRB + NEO_KHZ800) {
-  this->led_count = led_count;
-  this->action = Idle;
-  this->begin();
-}
-
-void BackgroundRingClass::tick() {
-  switch(this->action) {
-    case Idle:  this->tick_idle(); break;
-    case Solid: this->tick_solid(); break;
-    case Pulse: this->tick_pulse(); break;
-    case Spin:  this->tick_spin(); break;
-    case Flip:  this->tick_flip(); break;
-    case Slowroll: this->tick_slowroll(); break;
-    default:    this->action = Idle;
-  }
-}
-
-/* Ring Functions */
-void BackgroundRingClass::setColor(unsigned long color, uint8_t brightness, bool show) {
-  this->setBrightness(brightness);
-  for(int i=0; i < this->led_count; i++) {
-    this->setPixelColor(i, color);
-  }
-  if(show) {
-    this->show();
-  }
-}
-
-void BackgroundRingClass::setRepeating(unsigned long* colors, int elements, int rotation) {
-  this->setBrightness(50);
-  int curcolor = 0;
-  for(int i = 0; i < this->led_count; i++) {
-    this->setPixelColor(i, colors[(i+rotation) % elements]);
-  }
-  this->show();
-}
-
-///////////////////////// Idle
-void BackgroundRingClass::init_idle() {
-  this->action = Idle;
-  this->setColor(BLACK, 255, true);
-}
-
-void BackgroundRingClass::tick_idle() {
-  // noop. Here for consistency
-}
-
-
-
-///////////////////////// Solid
-void BackgroundRingClass::init_solid(unsigned long color, uint8_t brightness) {
-  this->action = Solid;
-  this->setBrightness(brightness);
-  this->setColor(color);
-  this->show();
-}
-
-
-void BackgroundRingClass::tick_solid() {
-  // noop. Here for consistency
-}
-
-
-///////////////////////// Pulse
-void BackgroundRingClass::init_pulse(unsigned long color, uint8_t maxbrightness, unsigned long ms) {
-  Serial.println("Initializing pulse");
-  this->action = Pulse;
-  this->pulseinfo.color = color;
-  this->pulseinfo.increasing = true;
-  this->pulseinfo.starttime = micros();
-  this->pulseinfo.steptime = (ms * 1000) / ((2 * (unsigned long)maxbrightness) - 1);
-  this->pulseinfo.maxbrightness = maxbrightness;;
-  this->pulseinfo.curbrightness = 1;
-
-  this->setColor(this->pulseinfo.color, brightness, true); // dimmest setting
-}
-
-void BackgroundRingClass::tick_pulse() {
-    if((micros() - this->pulseinfo.starttime) < this->pulseinfo.steptime) {
-      return;
-    }
-    this->pulseinfo.starttime = micros();
-    if(this->pulseinfo.increasing && this->pulseinfo.curbrightness == this->pulseinfo.maxbrightness) {
-      this->pulseinfo.increasing = false;
-    }
-    if(this->pulseinfo.increasing) {
-      this->pulseinfo.curbrightness++;
-    } else {
-      this->pulseinfo.curbrightness--;
-    }
-    if(this->pulseinfo.curbrightness == 0) {
-      // We are done
-      this->init_idle();
-    } else {
-      //Serial.print("Setting Brightness: "); Serial.println(this->pulseinfo.curbrightness);
-      this->setColor(this->pulseinfo.color, this->pulseinfo.curbrightness, true);
-      this->show();
-    }
-}
-
-///////////////////////// Spin
-void BackgroundRingClass::init_spin(unsigned long color1, unsigned long color2, unsigned long ms, unsigned long tickdelay) {
-  this->action = Spin;
-  this->spininfo.color1 = color1;
-  this->spininfo.color2 = color2;
-  this->spininfo.ms = ms * 1000;
-  this->spininfo.tickdelay = tickdelay * 1000;
-  this->spininfo.starttime = micros();
-  this->spininfo.lasttick  = micros() - this->spininfo.tickdelay;
-  this->spininfo.rotation = 0;
-}
-
-void BackgroundRingClass::tick_spin() {
-  if(micros() - this->spininfo.starttime > this->spininfo.ms) {
-    // we're done
-    Serial.println(micros() - this->spininfo.starttime);
-    this->init_idle();
-    return;
-  }
-
-  if(micros() - this->spininfo.lasttick > this->spininfo.tickdelay) {
-    // Time to spin
-    this->spininfo.lasttick = micros();
-    this->spininfo.rotation = (this->spininfo.rotation + 1) % 3;
-    //unsigned long tickcolors[] = { this->spininfo.color1, this->spininfo.color1, this->spininfo.color1, this->spininfo.color2 };
-    //unsigned long tickcolors[] = { BLACK, this->spininfo.color1, this->spininfo.color2 };
-    unsigned long tickcolors[] = { BLACK, this->spininfo.color1, this->spininfo.color1, this->spininfo.color2 };
-    this->setRepeating(tickcolors, 4, this->spininfo.rotation);
-  }
-}
-
-///////////////////////// Flip
-void BackgroundRingClass::init_flip(unsigned long color1, unsigned long color2, unsigned long ms, unsigned long tickdelay) {
-  this->action = Flip;
-  this->flipinfo.color1 = color1;
-  this->flipinfo.color2 = color2;
-  this->flipinfo.ms = ms * 1000;
-  this->flipinfo.tickdelay = tickdelay * 1000;
-  this->flipinfo.starttime = micros();
-  this->flipinfo.lasttick  = micros() - this->flipinfo.tickdelay;
-  this->flipinfo.flipper = false;
-}
-
-void BackgroundRingClass::tick_flip() {
-  if(micros() - this->flipinfo.starttime > this->flipinfo.ms) {
-    // we're done
-    Serial.println(micros() - this->flipinfo.starttime);
-    this->init_idle();
-    return;
-  }
-
-  if(micros() - this->flipinfo.lasttick > this->flipinfo.tickdelay) {
-    // Time to flip
-    this->flipinfo.lasttick = micros();
-    unsigned long tickcolors[] = { this->flipinfo.color1, this->flipinfo.color2 };
-    this->setRepeating(tickcolors, 2, (this->flipinfo.flipper ? 0 : 1));
-    this->flipinfo.flipper = not(this->flipinfo.flipper);
-  }
-}
-
-///////////////////////// Slowroll
-void BackgroundRingClass::init_slowroll(unsigned long color1, unsigned long color2, unsigned long ms, unsigned long tickdelay) {
-  this->action = Slowroll;
-  this->slowrollinfo.color1 = color1;
-  this->slowrollinfo.color2 = color2;
-  this->slowrollinfo.ms = ms * 1000;
-  this->slowrollinfo.tickdelay = tickdelay * 1000;
-  this->slowrollinfo.starttime = micros();
-  this->slowrollinfo.lasttick  = micros() - this->slowrollinfo.tickdelay;
-  this->slowrollinfo.flipper = false;
-}
-
-void BackgroundRingClass::tick_slowroll() {
-  if(micros() - this->slowrollinfo.starttime > this->slowrollinfo.ms) {
-    // we're done
-    Serial.println(micros() - this->slowrollinfo.starttime);
-    this->init_idle();
-    return;
-  }
-
-  if(micros() - this->slowrollinfo.lasttick > this->slowrollinfo.tickdelay) {
-    // Time to slowroll
-    this->slowrollinfo.lasttick = micros();
-    unsigned long tickcolors[] = { this->slowrollinfo.color1, this->slowrollinfo.color2, BLACK };
-    this->setRepeating(tickcolors, 3, (this->slowrollinfo.flipper ? 0 : 2));
-    this->slowrollinfo.flipper = not(this->slowrollinfo.flipper);
-  }
-}

+ 0 - 93
BackgroundRingClass.h

@@ -1,93 +0,0 @@
-#ifndef BackGroundRingClass_h
-#define BackGroundRingClass_h
-
-#include <SoftwareSerial.h>
-#include "Arduino.h"
-#include "Adafruit_NeoPixel.h"
-#include "WS2812_Definitions.h"
-
-typedef enum Action {
-  Idle,
-  Solid,
-  Pulse,
-  Spin,
-  Flip,
-  Slowroll
-};
-
-class BackgroundRingClass : public Adafruit_NeoPixel {
-  public:
-    int led_count;
-    Action action;
-    BackgroundRingClass(int ledcount, int pin);
-    void tick();
-
-    // Helper Functions
-    void setColor(unsigned long color, uint8_t brightness=255, bool show=false);
-    void setRepeating(unsigned long* colors, int elements, int rotation);
-
-    // Idle
-    void init_idle();
-    void tick_idle();
-
-    // Solid
-    void init_solid(unsigned long int color, uint8_t brightness);
-    void tick_solid();
-
-    // Pulse
-    struct {
-      bool increasing;
-      unsigned long color;
-      unsigned long starttime;
-      unsigned long steptime;
-      uint8_t maxbrightness;
-      uint8_t curbrightness;
-    } pulseinfo;
-
-    void init_pulse(unsigned long color, uint8_t maxbrightness, unsigned long ms);
-    void tick_pulse();
-
-    // Spin
-    struct {
-      unsigned long color1;
-      unsigned long color2;
-      unsigned long ms;
-      unsigned long tickdelay;
-      unsigned long starttime;
-      unsigned long lasttick;
-      int rotation;
-    } spininfo;
-
-    void init_spin(unsigned long color1, unsigned long color2, unsigned long ms=2000, unsigned long tickdelay=125);
-    void tick_spin();
-
-    // Flip
-    struct {
-      unsigned long color1;
-      unsigned long color2;
-      unsigned long ms;
-      unsigned long tickdelay;
-      unsigned long starttime;
-      unsigned long lasttick;
-      bool flipper;
-    } flipinfo;
-
-    void init_flip(unsigned long color1, unsigned long color2, unsigned long ms=5000, unsigned long tickdelay=500);
-    void tick_flip();
-
-    // Slowroll
-    struct {
-      unsigned long color1;
-      unsigned long color2;
-      unsigned long ms;
-      unsigned long tickdelay;
-      unsigned long starttime;
-      unsigned long lasttick;
-      bool flipper;
-    } slowrollinfo;
-
-    void init_slowroll(unsigned long color1, unsigned long color2, unsigned long ms=5000, unsigned long tickdelay=500);
-    void tick_slowroll();
-};
-
-#endif

+ 22 - 8
background_rings_demo.ino

@@ -2,7 +2,7 @@
 #include <SoftwareSerial.h>
 #include "WS2812_Definitions.h"
 #include <eRCaGuy_ButtonReader.h>
-#include "BackgroundRingClass.h"
+#include <BackgroundRingClass.h>
 
 const int LED_COUNT = 24;
 const int MAXBRIGHTNESS = 80;
@@ -25,10 +25,10 @@ const int randomPin = A5;
 BackgroundRingClass rightRing = BackgroundRingClass(LED_COUNT, ledPinRight);
 BackgroundRingClass leftRing  = BackgroundRingClass(LED_COUNT, ledPinLeft);
 
-eRCaGuy_ButtonReader leftReadyButton = eRCaGuy_ButtonReader(leftReadyButtonPin);
-eRCaGuy_ButtonReader rightReadyButton = eRCaGuy_ButtonReader(rightReadyButtonPin);
-eRCaGuy_ButtonReader leftFSRButton = eRCaGuy_ButtonReader(leftFSRSimPin);
-eRCaGuy_ButtonReader rightFSRButton = eRCaGuy_ButtonReader(rightFSRSimPin);
+eRCaGuy_ButtonReader leftReadyButton = eRCaGuy_ButtonReader(leftReadyButtonPin, 25);
+eRCaGuy_ButtonReader rightReadyButton = eRCaGuy_ButtonReader(rightReadyButtonPin, 25);
+eRCaGuy_ButtonReader leftFSRButton = eRCaGuy_ButtonReader(leftFSRSimPin, 25);
+eRCaGuy_ButtonReader rightFSRButton = eRCaGuy_ButtonReader(rightFSRSimPin, 25);
 
 
 void setup() {
@@ -58,7 +58,7 @@ void setup() {
 
 
 void loop() {
-  static bool button_released = true;
+  static unsigned long last_random_check = millis();
 
   rightRing.tick();
   leftRing.tick();
@@ -68,8 +68,9 @@ void loop() {
     //rightRing.init_pulse(random(0, 0xFFFFFF), 255, 2000);
     //rightRing.init_pulse(DARKRED, MAXBRIGHTNESS, 2000);
     //rightRing.init_spin(DARKRED, DARKGREEN);
-    rightRing.init_flip(DARKRED, DARKGREEN);
+    //rightRing.init_flip(DARKRED, DARKGREEN);
     //rightRing.init_slowroll(DARKRED, DARKGREEN);
+    rightRing.random_event();
   }
 
   if(button_pressed(leftFSRButton)) {
@@ -77,8 +78,21 @@ void loop() {
     //leftRing.init_pulse(random(0, 0xFFFFFF), 255, 2000);
     //leftRing.init_pulse(DARKGREEN, MAXBRIGHTNESS, 2000);
     //leftRing.init_spin(DARKGREEN, DARKRED);
-    leftRing.init_flip(DARKGREEN, DARKRED);
+    //leftRing.init_flip(DARKGREEN, DARKRED);
     //leftRing.init_slowroll(DARKGREEN, DARKRED);
+    leftRing.random_event();
+  }
+
+  if(leftRing.action == Idle && rightRing.action == Idle) {
+    if(millis() - last_random_check > 1000) { // only check every 10 seconds
+      if(random(0, 10) == 0) {
+        int draw = leftRing.random_event();
+        rightRing.random_event(draw); // synchronized
+      }
+      last_random_check = millis();
+    }
+  } else {
+    last_random_check = millis(); // don't count time in an action
   }
 
   //test_solids();