#include <FastLED.h>
#define SIMULATOR
#ifdef SIMULATOR
#define LED_TYPE WS2812
#define COLOR_ORDER GRB
#endif
#ifndef SIMULATOR
#define LED_TYPE APA102
#define COLOR_ORDER BGR
#endif
#define BUTTON_PIN 2
#define DATA_PIN 8
#define CLOCK_PIN 9
#define NUM_LEDS 64
#define LED_WIDTH 8
#define BALL_WHITE 0xffffff
#define BALL_RED 0xff0000
#define DIRECTION -1
#define FRICTION 0.03
CRGB leds[NUM_LEDS];
byte ball_index = 0;
unsigned long ball_position = 0; // ball accurate position
unsigned long ball_speed = 1; // rounds per second
// pallo kulkee 1 rounds per second, tarkoittaa että positio muuttuu 8 kertaa
// sekunnin aikana. Eli 1/8 = 0,125
// Variables for timing functions
double rps_scale = 1000.0/(float)LED_WIDTH; // 1000/8
double rps = 0; // rounds per secons
double ball_mass = 10;
const unsigned long fade_speed = 1000; // fade to black in 1000 ms
unsigned long ball_color = BALL_WHITE;
unsigned long currentTime = millis();
unsigned long previousTime = 0;
unsigned long previousTimeFade = 0;
int buttonState = HIGH;
byte shockIndices[] {0, 2, 4, 6};
void setup() {
pinMode(BUTTON_PIN, INPUT_PULLUP);
#ifdef SIMULATOR
Serial.begin(9600);
Serial.println("so it starts");
FastLED.addLeds<LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS);
#endif
#ifndef SIMULATOR
FastLED.addLeds<LED_TYPE, DATA_PIN, CLOCK_PIN, COLOR_ORDER>(leds, NUM_LEDS);
#endif
}
void loop() {
currentTime = millis();
if( (rps > 0) && (currentTime - previousTime >= rps_scale/rps) ) { //(1000/BALL_WIDTH)/rps ){
// this counter is accurate to 0.010 seconds
ball_index += DIRECTION;
ball_index %= 8;
previousTime = currentTime;
rps -= FRICTION;
boolean inShockIndex = false;
for (byte i=0; i < sizeof(shockIndices); i++) {
if (ball_index == shockIndices[i]) {
inShockIndex = true;
}
}
if (inShockIndex) {
if (rps <= 0.10) {
Serial.println("index: " + String(ball_index) + " rps: " + String(rps));
rps = 0;
}
}
// we are not at shock index
// ollaanko shokissa?
// jos on voimaa hypätä vielä 2 pykälää, niin liiku
// jos ei ole, niin jää tähän ja anna shokki ja lopeta peli.
}
if (currentTime - previousTimeFade >= fade_speed/16 ) {
// fade towards black
for (int j=0; j< NUM_LEDS; j++) {
leds[j] -= 0x111111;
}
previousTimeFade = currentTime;
}
buttonState = digitalRead(BUTTON_PIN);
if (buttonState == LOW) {
if (rps < 10.0) {
rps += 0.13;
}
Serial.println(rps);
buttonState = HIGH;
}
for (int i=0; i < LED_WIDTH; i++) {
leds[ball_index*LED_WIDTH+i] = ball_color;
}
FastLED.show();
}