proton

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

Neale Pickett  ·  2016-10-02

Synchrotron.cpp

 1#include <Arduino.h>
 2#include <Adafruit_NeoPixel.h>
 3#include "Synchrotron.h"
 4
 5#define width 6
 6#define brightness 255
 7
 8Synchrotron::Synchrotron(uint16_t n, uint8_t p, neoPixelType t)
 9{
10  pxl = new Adafruit_NeoPixel(n, p, t);
11  npixels = n;
12  cur = 0;
13  pxl->begin();
14  pxl->show();
15
16  // Inital values of 0 will make it look like it's sort of warming up
17  ticks = 0;
18  tickrate = 200;
19  r = 0;
20  g = 0;
21  b = 0;
22
23  standby();
24}
25
26Synchrotron::transition(int duration, int final_tickrate, byte final_r, byte final_g, byte final_b)
27{
28  transition_length = duration;
29  transition_elapsed = 0;
30
31  dtickrate = (final_tickrate - tickrate) / (float)duration;
32  dr = (final_r - r) / (float)duration;
33  dg = (final_g - g) / (float)duration;
34  db = (final_b - b) / (float)duration;
35
36  initial_tickrate = tickrate;
37  initial_r = r;
38  initial_g = g;
39  initial_b = b;
40}
41
42bool
43Synchrotron::transitioned() {
44  return (transition_elapsed >= transition_length);
45}
46
47float
48Synchrotron::speed() {
49  return 1 / ftickrate;
50}
51
52Synchrotron::standby() {
53  transition(400, 12, brightness, 0, 0);
54}
55
56Synchrotron::charge() {
57  transition(700, 2, brightness, brightness/8, 0);
58}
59
60Synchrotron::fire() {
61  transition(40, 1, brightness/8, brightness/4, brightness/2);
62}
63
64Synchrotron::discharge() {
65  standby();
66}
67
68Synchrotron::tick(unsigned long jiffies) {
69  pxl->clear();
70  for (int i = 0; i < width; i += 1) {
71    pxl->setPixelColor((cur + i) % npixels, pxl->Color(r, g, b));
72  }
73  for (int i = 0; i < 4; i += 1) {
74    int div = 1 << (2*i);
75    pxl->setPixelColor((cur + npixels - i) % npixels, pxl->Color(r/div, g/div, b/div));
76    pxl->setPixelColor((cur + npixels + width + i) % npixels, pxl->Color(r/div, g/div, b/div));
77  }
78
79  pxl->show();
80
81  ticks += 1;
82  if (ticks >= tickrate) {
83    cur = (cur + 1) % npixels;
84    ticks = 0;
85  }
86
87  if (transition_length > transition_elapsed) {
88    transition_elapsed += 1;
89    ftickrate = initial_tickrate + (dtickrate * transition_elapsed);
90    tickrate = ftickrate;
91    r = initial_r + (dr * transition_elapsed);
92    g = initial_g + (dg * transition_elapsed);
93    b = initial_b + (db * transition_elapsed);
94  }
95}