#define F_CPU 16000000UL
#include <inttypes.h>
#include <avr/io.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include "WS2811.h"
#include "WS2811.c"
#define UP (PINB & (1 << PINB0)) //Pin B0
#define DOWN (PINB & (1 << PINB1)) //Pin B1
#define LEFT (PINB & (1 << PINB2)) //Pin B2
#define RIGHT (PINB & (1 << PINB3)) //Pin B3
void InitTimer1(void) //5hz
{
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
// 5 Hz (16000000/((3124+1)*1024))
OCR1A = 3124;
// CTC
TCCR1B |= (1 << WGM12);
// Prescaler 1024
TCCR1B |= (1 << CS12) | (1 << CS10);
// Output Compare Match A Interrupt Enable
TIMSK1 |= (1 << OCIE1A);
}
/*
long gameOver [] = {
0,0xFF00FF,0xFF00FF,0,0,0,0xFF00FF,0xFF00FF,0,0,0xFF00FF,0,0,0,0xFF00FF,0,0xFF00FF,0xFF00FF,0xFF00FF,0xFF00FF,
0xFF00FF,0,0,0,0,0xFF00FF,0,0,0xFF00FF,0,0xFF00FF,0xFF00FF,0,0xFF00FF,0xFF00FF,0,0xFF00FF,0,0,0,
0xFF00FF,0,0xFF00FF,0xFF00FF,0,0xFF00FF,0xFF00FF,0xFF00FF,0xFF00FF,0,0xFF00FF,0,0xFF00FF,0,0xFF00FF,0,0xFF00FF,0xFF00FF,0xFF00FF,0,
0xFF00FF,0,0,0xFF00FF,0,0xFF00FF,0,0,0xFF00FF,0,0xFF00FF,0,0,0,0xFF00FF,0,0xFF00FF,0,0,0,
0,0xFF00FF,0xFF00FF,0,0,0xFF00FF,0,0,0xFF00FF,0,0xFF00FF,0,0,0,0xFF00FF,0,0xFF00FF,0xFF00FF,0xFF00FF,0xFF00FF,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0xFF00FF,0xFF00FF,0,0,0xFF00FF,0,0,0,0xFF00FF,0,0xFF00FF,0xFF00FF,0xFF00FF,0xFF00FF,0,0xFF00FF,0xFF00FF,0,0,
0xFF00FF,0,0,0xFF00FF,0,0xFF00FF,0,0,0,0xFF00FF,0,0xFF00FF,0,0,0,0,0xFF00FF,0,0xFF00FF,0,
0xFF00FF,0,0,0xFF00FF,0,0xFF00FF,0,0,0,0xFF00FF,0,0xFF00FF,0xFF00FF,0xFF00FF,0,0,0xFF00FF,0xFF00FF,0xFF00FF,0,
0xFF00FF,0,0,0xFF00FF,0,0,0xFF00FF,0,0xFF00FF,0,0,0xFF00FF,0,0,0,0,0xFF00FF,0,0,0xFF00FF,
0,0xFF00FF,0xFF00FF,0,0,0,0,0xFF00FF,0,0,0,0xFF00FF,0xFF00FF,0xFF00FF,0xFF00FF,0,0xFF00FF,0,0,0xFF00FF
};
*/
long pixels[] = {
255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,
0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,0
};
uint8_t snakeX = 10;
uint8_t snakeY = 10;
char snakeDirection = 'E';
void updateMatrix(void)
{
displayHexArray(pixels,sizeof(pixels)/sizeof(long)/*+1*/); //I don't know why I'm adding one here, there's some bug in the code to send an array
}
void putSnake(char x, char y, long color) //uses bottom left as origin
{
pixels[20*(19-y)+x] = color;
}
char isOutOfBounds(void)
{
if(snakeX > 20) return 1;
else if (snakeY > 20) return 1;
else return 0;
}
void restartGame(void)
{
//blank screen
sendBlankArray(400);
cli();
delay(30000);
sei();
//reset everything
snakeX = 10;
snakeY = 10;
snakeDirection = 'E';
}
void move(void)
{
putSnake(snakeX, snakeY, 0); //delete old snake
//check which way to move, update cords as necessary
if (snakeDirection == 'N') snakeY++;
else if (snakeDirection == 'S') snakeY--;
else if (snakeDirection == 'E') snakeX++;
else if (snakeDirection == 'W') snakeX--;
//Serial.print(snakeX);
//Serial.print(",");
//Serial.println(snakeY);
if(isOutOfBounds()) restartGame();
putSnake(snakeX, snakeY, 0x00FF00); //place new snake
updateMatrix(); //update screen
}
ISR(TIMER1_COMPA_vect)//runs every 100ms/10Hz
{
if(UP) snakeDirection = 'N';
if(DOWN) snakeDirection = 'S';
if(LEFT) snakeDirection = 'W';
if(RIGHT) snakeDirection = 'E';
move();
// Serial.print(snakeX);
// Serial.print(",");
// Serial.println(snakeY);
}
void setup()
{
//initalizations
Serial.begin(9600);
sei(); //enable interupts
InitTimer1(); //initalize ISR
initWS2811(); //initialize LEDs
//set pins B0-B3 (the pushbuttons) as inputs
DDRB &= ~(1 << DDB0);
DDRB &= ~(1 << DDB1);
DDRB &= ~(1 << DDB2);
DDRB &= ~(1 << DDB3);
updateMatrix();
putSnake (snakeX,snakeY,0x00FF00);
updateMatrix();
}
void loop()
{
}