#include <Adafruit_NeoPixel.h>
#include "RepeatButton.h"
#include "Hammer.h"
#include "ColorConstants.h"
#define PIN 8 // Neopixel pin with PWM
//#define PIPESTS_PIN 9 // NeoPixel Pipe Status pin
#define HAMMER_PIN A0 // Neopixel pin with PWM
#define RAIL_PIN A1 // Neopixel pin with PWM
#define LEVEL_PIN A2 // Neopixel pin with PWM
#define FIRE_PIN 4
#define R_PIN 5
#define L_PIN 3
#define NUMPIXELS 12 // number of LEDs on strip
Adafruit_NeoPixel strip(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); // Declare our NeoPixel strip object
//Adafruit_NeoPixel pipeStatus(NUMPIXELS, PIPESTS_PIN, NEO_GRB + NEO_KHZ800); // Declare our NeoPixel strip object
// NoePixel ROTATE 270°
/*
9 ----- 149
8 ----- 148
: ----- :
1 ----- 141
0 ----- 140
*/
#define ROWS 10 // Y
#define COLS 10 // X
#define yMax ROWS
#define xMax COLS
#define numberOfHammers xMax
#define NUMBERDOTS yMax * xMax // number of LEDs on neoHammer
Adafruit_NeoPixel neoHammer(NUMBERDOTS, HAMMER_PIN, NEO_GRB + NEO_KHZ800); // Declare our NeoPixel neoHammer object
#define NUMBERRAILDOTS xMax // number of LEDs on neoRial
Adafruit_NeoPixel neoRial(NUMBERRAILDOTS, RAIL_PIN, NEO_GRB + NEO_KHZ800);
#define NUMBERLEVELDOTS 10 // number of LEDs on neoPower
Adafruit_NeoPixel neoPower(NUMBERLEVELDOTS, LEVEL_PIN, NEO_GRB + NEO_KHZ800);
RepeatButton leftButton;
RepeatButton rightButton;
RepeatButton gunButton;
Hammer hammer(ROWS, COLS); // Hammer Object
uint8_t hammerCollector[numberOfHammers]; // Hammer Index Collector
uint8_t hammerIndex = 0;
boolean start = false;
uint8_t count = 0;
uint8_t prevCount = 0;
boolean newGame = true;
uint8_t level = INIT_LEVEL;
uint8_t power = INIT_POWER;
uint16_t score = 0;
uint16_t baseScore = 0;
uint8_t shotCount = 0;
uint8_t gunPosition = xMax / 2;
void EventOnLeft(ButtonEvents e);
void EventOnRight(ButtonEvents e);
void EventOnShoot(ButtonEvents e);
void EventOnStateChanged(pixel_t index, States state);
void EvnetOnChanged(pixel_t pixel, color_t color);
void EventOnShow();
void IntervalRandom();
void setup() {
Serial.begin(115200);
randomSeed(analogRead(A3));
neoHammer.begin();
//neoHammer.clear();
//neoHammer.show();
neoRial.begin();
//neoRial.clear();
InitialRail();
neoRial.show();
neoPower.begin();
//neoPower.clear();
//neoPower.show();
hammer.begin();
hammer.eventOnChanged(EvnetOnChanged);
hammer.eventOnShow(EventOnShow);
hammer.eventOnStateChanged(EventOnStateChanged);
hammer.eventOnInterval(IntervalRandom);
hammer.clear(DEFAULT_BACKCOLOR);
hammer.initial();
hammer.intervalTime(random(1000, 5000));
leftButton.buttonMode(L_PIN, INPUT_PULLUP);
leftButton.onKeyPressed(EventOnLeft);
leftButton.repeatDelay(CONTROL_REPEAT_TIME, CONTROL_REPEAT_RATE);
rightButton.buttonMode(R_PIN, INPUT_PULLUP);
rightButton.onKeyPressed(EventOnRight);
rightButton.repeatDelay(CONTROL_REPEAT_TIME, CONTROL_REPEAT_RATE);
gunButton.buttonMode(FIRE_PIN, INPUT_PULLUP);
gunButton.onKeyPressed(EventOnShoot);
gunButton.repeatDelay(GUN_REPEAT_TIME, GUN_REPEAT_RATE);
for (uint8_t index = 0; index < numberOfHammers; index++) {
hammerCollector[index] = index;
}
RandomCollector();
Serial.println("Press FIRE! to play...");
}
void loop() {
InputCondtion();
hammer.process();
}
void InputCondtion() {
leftButton.repeatButton();
rightButton.repeatButton();
gunButton.repeatButton();
}
void IntervalRandom() {
hammer.hammerFall( hammerCollector[hammerIndex]);
if (!hammer.getReady(hammerIndex)) return;
hammerIndex = (hammerIndex + 1) % numberOfHammers;
hammer.intervalTime(random(1000, 5000));
}
void EventOnShoot(ButtonEvents e) {
// TODO: START AND SHOOT
hammer.gunFire(gunPosition);
}
void EventOnLeft(ButtonEvents e) {
neoRial.setPixelColor(gunPosition, DEFAULT_RAIL_COLOR);
gunPosition = gunPosition > 0 ? gunPosition - 1 : numberOfHammers - 1;
neoRial.setPixelColor(gunPosition, DEFAULT_GUN_COLOR);
neoRial.show();
}
void EventOnRight(ButtonEvents e) {
neoRial.setPixelColor(gunPosition, DEFAULT_RAIL_COLOR);
gunPosition = (gunPosition + 1) % numberOfHammers;
neoRial.setPixelColor(gunPosition, DEFAULT_GUN_COLOR);
neoRial.show();
}
void EvnetOnChanged(pixel_t pixel, color_t color) {
neoHammer.setPixelColor(pixel, color);
}
void EventOnShow() {
neoHammer.show();
}
void EventOnStateChanged(const pixel_t index, const States state) {
switch (state) {
case STANDBY:
break;
case ACTIVE:
break;
case SHOT:
count++;
break;
case FELL:
count++;
break;
}
if (count >= numberOfHammers) {
count = 0;
hammer.clear();
hammer.initial();
RandomCollector();
}
}
void InitialRail() {
for (uint8_t index = 0; index < numberOfHammers; index ++ ) {
neoRial.setPixelColor(index, DEFAULT_RAIL_COLOR);
}
neoRial.setPixelColor(gunPosition, DEFAULT_GUN_COLOR);
neoRial.show();
}
// Random Collector for pipes
void RandomCollector() {
randomSeed(analogRead(A3));
for (uint8_t x = 0; x < numberOfHammers; x++) {
uint8_t randomNumber = random(x, numberOfHammers);
uint8_t temp = hammerCollector[x];
hammerCollector[x] = hammerCollector[randomNumber];
hammerCollector[randomNumber] = temp;
}
}
void GameStartMessage() {
Serial.print("Level:= ");
Serial.print(level + 1);
Serial.print(", Power:= ");
Serial.print(power);
Serial.print(", Score:= ");
Serial.println(score);
Serial.println("Ready!...");
}
void GameEndMessage(String message) {
Serial.println(message);
Serial.println("Press FIRE! to play...");
}