From e58a19a2d1360d3c9270d047f75ce565ab30a830 Mon Sep 17 00:00:00 2001 From: Neale Pickett Date: Tue, 27 Sep 2016 22:20:03 -0600 Subject: [PATCH] Added all states, all sounds, this is usable --- MusicPlayer.cpp | 2 +- ProtonPack.ino | 25 ++++++++++++++++--------- Synchrotron.cpp | 50 +++++++++++++++++++++++++++++++++++++------------ Synchrotron.h | 5 +++++ 4 files changed, 60 insertions(+), 22 deletions(-) diff --git a/MusicPlayer.cpp b/MusicPlayer.cpp index 9d3c40d..97a981a 100644 --- a/MusicPlayer.cpp +++ b/MusicPlayer.cpp @@ -10,7 +10,7 @@ MusicPlayer::MusicPlayer(int8_t cs, int8_t dcs, int8_t dreq, int8_t cardcs) { musicPlayer = new Adafruit_VS1053_FilePlayer(cs, dcs, dreq, cardcs); musicPlayer->begin(); - musicPlayer->setVolume(20, 20); // lower = louder + musicPlayer->setVolume(1, 1); // lower = louder musicPlayer->sineTest(0x44, 500); SD.begin(cardcs); } diff --git a/ProtonPack.ino b/ProtonPack.ino index 5c4b2d6..9038c82 100644 --- a/ProtonPack.ino +++ b/ProtonPack.ino @@ -65,22 +65,29 @@ void loop() { switch (state) { case 0: - if (trigger) { - if (music->startPlayingFile("track001.mp3")) { - state = 1; - sync1->charge(); - } + if (trigger && music->startPlayingFile("track001.mp3")) { + state = 1; + sync1->charge(); } break; case 1: if (! music->isPlaying()) { - if (music->startPlayingFile("track002.mp3")) { - state = 4; - sync1->standby(); - } + state = 3; + } + break; + case 3: + if (trigger && music->startPlayingFile("track003.mp3")) { + state = 4; + sync1->fire(); } break; case 4: + if (! trigger && music->startPlayingFile("track002.mp3")) { + state = 5; + sync1->discharge(); + } + break; + case 5: if (! music->isPlaying()) { state = 0; } diff --git a/Synchrotron.cpp b/Synchrotron.cpp index eaafe4d..774226b 100644 --- a/Synchrotron.cpp +++ b/Synchrotron.cpp @@ -12,29 +12,47 @@ Synchrotron::Synchrotron(uint16_t n, uint8_t p, neoPixelType t) cur = 0; pxl->begin(); pxl->show(); + + // Inital values of 0 will make it look like it's sort of warming up + ticks = 0; + tickrate = 200; + r = 0; + g = 0; + b = 0; + standby(); } +Synchrotron::transition(int duration, int final_tickrate, byte final_r, byte final_g, byte final_b) +{ + transition_length = duration; + transition_elapsed = 0; + + dtickrate = (final_tickrate - tickrate) / (float)duration; + dr = (final_r - r) / (float)duration; + dg = (final_g - g) / (float)duration; + db = (final_b - b) / (float)duration; + + initial_tickrate = tickrate; + initial_r = r; + initial_g = g; + initial_b = b; +} + Synchrotron::standby() { - tickrate = 12; - ticks = 0; - r = brightness; - g = 0; - b = 0; + transition(400, 12, brightness, 0, 0); } Synchrotron::charge() { - tickrate = 2; - ticks = 0; - r = brightness; - g = brightness / 8; - b = 0; + transition(400, 2, brightness, brightness/8, 0); } Synchrotron::fire() { + transition(40, 1, brightness/8, brightness/4, brightness/2); } Synchrotron::discharge() { + standby(); } Synchrotron::tick(unsigned long jiffies) { @@ -51,8 +69,16 @@ Synchrotron::tick(unsigned long jiffies) { pxl->show(); ticks += 1; - if (ticks == tickrate) { - ticks = 0; + if (ticks >= tickrate) { cur = (cur + 1) % npixels; + ticks = 0; + } + + if (transition_length > transition_elapsed) { + tickrate = initial_tickrate + (dtickrate * transition_elapsed); + r = initial_r + (dr * transition_elapsed); + g = initial_g + (dg * transition_elapsed); + b = initial_b + (db * transition_elapsed); + transition_elapsed += 1; } } diff --git a/Synchrotron.h b/Synchrotron.h index b6e630d..c36cae7 100644 --- a/Synchrotron.h +++ b/Synchrotron.h @@ -10,8 +10,13 @@ class Synchrotron { int tickrate; // How many millis between pixel position changes int ticks; // How many ticks have elapsed since last position change byte r, g, b; // Current color + + int transition_length, transition_elapsed; + int initial_tickrate, initial_r, initial_g, initial_b; + float dtickrate, dr, dg, db; public: Synchrotron(uint16_t n, uint8_t p=6, neoPixelType t=NEO_GRB + NEO_KHZ800); + transition(int duration, int final_tickrate, byte final_r, byte final_g, byte final_b); standby(); charge(); fire();