#include <SPI.h>
#define BUTTON_PIN 2
#define STORAGE_PIN 8
volatile unsigned long delayTime = 500;
const unsigned long startDelayTime = 500;
const int step = 150;
class Button
{
public:
Button(int pinB)
{
_lastButton = HIGH;
_curButton = HIGH;
_pinButton = pinB;
pinMode(pinB, INPUT_PULLUP);
}
~Button() = default;
void process()
{
_curButton = debounce();
if (_lastButton == HIGH && _curButton == LOW)
{
if(delayTime <= step)
{
delayTime = startDelayTime;
}
else
{
delayTime -= step;
}
}
_lastButton = _curButton;
}
private:
int _lastButton;
int _curButton;
int _pinButton;
int debounce ()
{
int current = digitalRead(_pinButton);
if(_lastButton != current)
{
delay(5);
current = digitalRead(_pinButton);
}
return current;
}
};
volatile Button button(BUTTON_PIN);
void rotateLeft(uint16_t &bits)
{
uint16_t high_bit = bits & (1 << 15) ? 1 : 0;
bits = (bits << 1) | high_bit;
}
void proxyButton()
{
button.process();
}
void setup()
{
//attachInterrupt(0, proxyButton, CHANGE);
attachInterrupt(digitalPinToInterrupt(BUTTON_PIN), proxyButton, CHANGE);
SPI.begin();
pinMode(STORAGE_PIN, OUTPUT);
digitalWrite(STORAGE_PIN, LOW);
SPI.transfer(0);
SPI.transfer(0);
digitalWrite(STORAGE_PIN, HIGH);
digitalWrite(STORAGE_PIN, LOW);
}
void loop() {
static uint16_t runningLight = 1;
SPI.transfer(runningLight>>8);
SPI.transfer(runningLight);
digitalWrite(STORAGE_PIN, HIGH);
digitalWrite(STORAGE_PIN, LOW);
rotateLeft(runningLight);
noInterrupts();
unsigned long tmpTime = delayTime;
interrupts();
delay(tmpTime);
}