#include <FastLED.h>
#include "tables.h"
#include "LEDMatrix.h"
#include "LEDText.h"
#include "FontMatrise.h"
#define NUM_COLS 60
#define NUM_ROWS 10
#define NUM_LEDS NUM_COLS*NUM_ROWS
//CRGB leds[NUM_LEDS];
#define MATRIX_WIDTH 60
#define MATRIX_HEIGHT 10
#define MATRIX_TYPE HORIZONTAL_MATRIX
//Creo esto es de
cLEDMatrix<MATRIX_WIDTH, MATRIX_HEIGHT, MATRIX_TYPE> leds;
cLEDText ScrollingMsg;
unsigned char TxtDemo[] = {
EFFECT_SCROLL_LEFT " THX lol huh duh "
};
void setup() {
FastLED.addLeds<WS2812B, 3, GRB>(leds, NUM_LEDS);
Serial.begin(9600);
ScrollingMsg.SetFont(MatriseFontData);
ScrollingMsg.Init(&leds, leds.Width(), ScrollingMsg.FontHeight() + 1, 0, 0);
ScrollingMsg.SetText((unsigned char *)TxtDemo, sizeof(TxtDemo) - 1);
ScrollingMsg.SetTextColrOptions(COLR_RGB | COLR_SINGLE, 0xff, 0x00, 0x00);
}
void loop(){
texto ();
//pacman();
FastLED.delay(60);
}
void pacman() {
static byte frame = 0; //static no cambia el valor cuando regresa Va del 0 al 3
static byte path = 0; // va del 0 al 99
byte virtWight = 100; //tamaño virtual de la pantalla para que se oculten
byte next_Sprite_offset = 20;
byte xIndex=0;
int Leds_index;
//Serial.println (frame); 0, 1 2 y 3
//Serial.println (path); 0 al 99 por la pantalla virtual
LEDS.clear();
int index = frame*100; //este index está multiplicado por 100 para que cuando termine un sprite en 99
//salte al otro que empieza en 100. Se cambia 4 veces para que lea los 4 sprites por figura
//Pastillas para que se las coma pacman
//for (int i = 0; i < 3; i++) {
//for (int x = 0; x < 20; x++) {
//for (int y = 0; y < 1; y++) {
//int index = XY (x+i*20, 4+y);
//leds[index] = pgm_read_dword (Dots+y*20+(x+path)%4);
//}
//}
//}
for (int x = 0; x < 10; x++) { //estas son las 10 columnas de cada sprite
for (int y = 0; y < 10; y++) { //estas son las 10 lineas de cada sprite
int Spr_index = (y<<3)+(y<<1)+index+x; //<< desplaza el bit a la izquierda para convertir Y
//en el indicador de la tabla de 10 en 10
//Primera vuelta en 0, la segunda en 10, la tercera en 20... luego en 1, 11, 21... Va por Columna
// SPRITE PACMAN
//0 1 2 3 4 5 6 7 8 9
//10 11 12 13 14 15 16 17 18 19
//20 21 22 23 24 25 26 27 28 29
//30 31 32 33 34 35 36 37 38 39
//40 41 42 43 44 45 46 47 48 49
//50 51 52 53 54 55 56 57 58 59
//60 61 62 63 64 65 66 67 68 69
//70 71 72 73 74 75 76 77 78 79
//80 81 82 83 84 85 86 87 88 89
//90 91 92 93 94 95 96 97 98 99
//100
//101
//111
//Serial.println (Spr_index);
//para entender mejor el desplazamiento <<
//int a = 5; binary: 0000000000000101
//int b = a << 3; binary: 0000000000101000, or 40 in decimal
//Nota
//int a = 5; // Binario: 0000000000000101
//int b = a << 14; // Binario: 0100000000000000 - el primer 1 en 101 se desechó
xIndex= (x+path)%virtWight; //patch es para la velocidad de desplazamiento. Salta cuadros
//% Este porcentaje significa algo así como hasta virWigth
if (xIndex<60){
Leds_index = XY (xIndex, y);
//Serial.println (Leds_index);
leds[Leds_index] = pgm_read_dword (Mask11 + Spr_index);
//leds[pos] Lo que está entre corchetes es el led de la pantalla
//Mask siempre es Cero pero le indico al programa que varianle tomar
//Serial.println (pgm_read_dword (Mask11));
//La pantalla por leds está configurada así
//0 59
//60 119
//120 179
//180 239
//240 299
//300 359
//360 419
//420 479
//480 539
//540 599
}
//xIndex = (x+path+next_Sprite_offset)%virtWight;
//if (xIndex<60) {
//Leds_index = XY (xIndex, y);
//leds[Leds_index] = pgm_read_dword (Mask42+Spr_index);
//}
//xIndex = (x+path+next_Sprite_offset*2)%virtWight;
//if (xIndex<60) {
//Leds_index = XY (xIndex, y);
//leds[Leds_index] = pgm_read_dword (Mask41+Spr_index);
//}
//xIndex = (x+path+next_Sprite_offset*3)%virtWight;
//if (xIndex<60) {
//Leds_index = XY (xIndex, y);
//leds[Leds_index] = pgm_read_dword (Mask43+Spr_index);
//}
//xIndex = (x+path+next_Sprite_offset*4)%virtWight;
//if (xIndex<60) {
//Leds_index = XY (xIndex, y);
//leds[Leds_index] = pgm_read_dword (Mask44+Spr_index);
//}
}
}
frame=(frame+1)%4; //si cambio el valor de %4 solo agarra un sprite, o dos, o tres o cuatro.
path=(path+1)%virtWight; //si cambio el valor aumenta la velocidad, si lo dejo sin suma se queda estático normal en 2
//este % significa creo que hasta 4 y el otro hasta virtWight que es el espacio virtual
LEDS.show ();
}
//Para no tener que crear variables con cada Sprite
//El viene con unos valores y se va con un valor que buscamos
uint16_t XY (byte x, byte y) {
return (y*NUM_COLS+x);
}
void texto (){
//ScrollingMsg.UpdateText() == -1;
ScrollingMsg.SetText((unsigned char *)TxtDemo, sizeof(TxtDemo) - 1);
FastLED.show();
}