proton

Firmware for Ghostbusters proton pack
git clone https://git.woozle.org/neale/proton.git

commit
e58a19a
parent
2424f3e
author
Neale Pickett
date
2016-09-27 22:20:03 -0600 MDT
Added all states, all sounds, this is usable
4 files changed,  +60, -22
M MusicPlayer.cpp
+1, -1
1@@ -10,7 +10,7 @@ MusicPlayer::MusicPlayer(int8_t cs, int8_t dcs, int8_t dreq, int8_t cardcs)
2 {
3   musicPlayer = new Adafruit_VS1053_FilePlayer(cs, dcs, dreq, cardcs);
4   musicPlayer->begin();
5-  musicPlayer->setVolume(20, 20); // lower = louder
6+  musicPlayer->setVolume(1, 1); // lower = louder
7   musicPlayer->sineTest(0x44, 500);
8   SD.begin(cardcs);
9 }
M ProtonPack.ino
+16, -9
 1@@ -65,22 +65,29 @@ void loop() {
 2 
 3   switch (state) {
 4   case 0:
 5-    if (trigger) {
 6-      if (music->startPlayingFile("track001.mp3")) {
 7-	state = 1;
 8-	sync1->charge();
 9-      }
10+    if (trigger && music->startPlayingFile("track001.mp3")) {
11+      state = 1;
12+      sync1->charge();
13     }
14     break;
15   case 1:
16     if (! music->isPlaying()) {
17-      if (music->startPlayingFile("track002.mp3")) {
18-	state = 4;
19-	sync1->standby();
20-      }
21+      state = 3;
22+    }
23+    break;
24+  case 3:
25+    if (trigger && music->startPlayingFile("track003.mp3")) {
26+      state = 4;
27+      sync1->fire();
28     }
29     break;
30   case 4:
31+    if (! trigger && music->startPlayingFile("track002.mp3")) {
32+      state = 5;
33+      sync1->discharge();
34+    }
35+    break;
36+  case 5:
37     if (! music->isPlaying()) {
38       state = 0;
39     }
M Synchrotron.cpp
+38, -12
 1@@ -12,29 +12,47 @@ Synchrotron::Synchrotron(uint16_t n, uint8_t p, neoPixelType t)
 2   cur = 0;
 3   pxl->begin();
 4   pxl->show();
 5-  standby();
 6-}
 7 
 8-Synchrotron::standby() {
 9-  tickrate = 12;
10+  // Inital values of 0 will make it look like it's sort of warming up
11   ticks = 0;
12-  r = brightness;
13+  tickrate = 200;
14+  r = 0;
15   g = 0;
16   b = 0;
17+
18+  standby();
19+}
20+
21+Synchrotron::transition(int duration, int final_tickrate, byte final_r, byte final_g, byte final_b)
22+{
23+  transition_length = duration;
24+  transition_elapsed = 0;
25+
26+  dtickrate = (final_tickrate - tickrate) / (float)duration;
27+  dr = (final_r - r) / (float)duration;
28+  dg = (final_g - g) / (float)duration;
29+  db = (final_b - b) / (float)duration;
30+
31+  initial_tickrate = tickrate;
32+  initial_r = r;
33+  initial_g = g;
34+  initial_b = b;
35+}
36+
37+Synchrotron::standby() {
38+  transition(400, 12, brightness, 0, 0);
39 }
40 
41 Synchrotron::charge() {
42-  tickrate = 2;
43-  ticks = 0;
44-  r = brightness;
45-  g = brightness / 8;
46-  b = 0;
47+  transition(400, 2, brightness, brightness/8, 0);
48 }
49 
50 Synchrotron::fire() {
51+  transition(40, 1, brightness/8, brightness/4, brightness/2);
52 }
53 
54 Synchrotron::discharge() {
55+  standby();
56 }
57 
58 Synchrotron::tick(unsigned long jiffies) {
59@@ -51,8 +69,16 @@ Synchrotron::tick(unsigned long jiffies) {
60   pxl->show();
61 
62   ticks += 1;
63-  if (ticks == tickrate) {
64-    ticks = 0;
65+  if (ticks >= tickrate) {
66     cur = (cur + 1) % npixels;
67+    ticks = 0;
68+  }
69+
70+  if (transition_length > transition_elapsed) {
71+    tickrate = initial_tickrate + (dtickrate * transition_elapsed);
72+    r = initial_r + (dr * transition_elapsed);
73+    g = initial_g + (dg * transition_elapsed);
74+    b = initial_b + (db * transition_elapsed);
75+    transition_elapsed += 1;
76   }
77 }
M Synchrotron.h
+5, -0
 1@@ -10,8 +10,13 @@ class Synchrotron {
 2   int tickrate;	     // How many millis between pixel position changes
 3   int ticks; // How many ticks have elapsed since last position change
 4   byte r, g, b;			// Current color
 5+
 6+  int transition_length, transition_elapsed;
 7+  int initial_tickrate, initial_r, initial_g, initial_b;
 8+  float dtickrate, dr, dg, db;
 9 public:
10   Synchrotron(uint16_t n, uint8_t p=6, neoPixelType t=NEO_GRB + NEO_KHZ800);
11+  transition(int duration, int final_tickrate, byte final_r, byte final_g, byte final_b);
12   standby();
13   charge();
14   fire();