/*
	Capitulo 47 de Arduino desde cero en Español.
	Programa que muestra texto ALARMA dentro de un rectangulo para resaltar
	Requiere instalar librerias Adafruit GFX y Adafruit SSD1306

	Autor: bitwiseAr  

*/

#include <Wire.h>			// libreria para bus I2C
#include <Adafruit_GFX.h>		// libreria para pantallas graficas
#include "Adafruit_SSD1306.h"		// libreria para controlador SSD1306
#include "FPS.h"

#define ANCHO 128			// reemplaza ocurrencia de ANCHO por 128
#define ALTO 64				// reemplaza ocurrencia de ALTO por 64
#define OLED_RESET 4			// necesario por la libreria pero no usado
#define BUZZER 11
Adafruit_SSD1306 oled(ANCHO, ALTO, &Wire, OLED_RESET);	// crea objeto

void drawBattery (int x, int y) {
  int fill = (millis() / 300) % 6;
  oled.drawRect(x, y, 18, 12, SSD1306_WHITE);
  for (int bar = 0; bar < fill; bar++){
    oled.fillRect(x + 2 + 3 * bar, y + 2, 2, 8, SSD1306_WHITE);
  }
  oled.fillRect(x + 19, y + 3, 2, 6, SSD1306_WHITE);
}

byte BRICK_A[] = {0b00000100, 0b00010101,  0b10011000, 0b01100010, 0b11001110};
byte BRICK_B[] = {0b00010100, 0b10010110};
int offsetsUp[] = {-1, -1, -2, -2, -3, -3, -4, -4};

void drawBrick (int x, int y, boolean isBrickA){
  if (isBrickA){
    int length = sizeof(BRICK_A);

    for (int i = 0; i < length; i++) {
      byte myByte = BRICK_A[i];
      int pixelX = int ((myByte >> 6) & 0b11);
      int pixelY = int ((myByte >> 4) & 0b11);
      
      oled.drawPixel(pixelX + x, pixelY + y, 1);
      
      pixelX = int ((myByte >> 2) & 0b11);
      pixelY = int ((myByte     ) & 0b11);

      oled.drawPixel(pixelX + x, pixelY + y, 1);
    }
  } else {
    int length = sizeof(BRICK_B);

    for (int i = 0; i < length; i++) {
      byte myByte = BRICK_B[i];
      int pixelX = int ((myByte >> 6) & 0b11);
      int pixelY = int ((myByte >> 4) & 0b11);
      
      oled.drawPixel(pixelX + x, pixelY + y, 1);
      
      pixelX = int ((myByte >> 2) & 0b11);
      pixelY = int ((myByte     ) & 0b11);

      oled.drawPixel(pixelX + x, pixelY + y, 1);
    }
  }
}

void updateDisplay(int fps){
  oled.clearDisplay();			// limpia pantalla			
  //oled.drawRect(20, 20, 88, 44, WHITE);	// dibuja rectangulo
  oled.setCursor(28, 34);		// ubica cursor en coordenadas 28,34
  oled.setTextSize(1);			// establece tamano de texto en 2
  oled.setTextColor(WHITE);		// establece color al unico disponible (pantalla monocromo)
  oled.setCursor(50, 0);
  oled.print( fps);			// escribe texto
  oled.setCursor(32, 0);
  oled.print( millis());

  oled.drawPixel(1, 0, WHITE);
  oled.drawPixel(0, 1, WHITE);

  drawBattery(ANCHO - 24, 0);

  for (int i = 0; i < 10; i++) {
    drawBrick(i * 8, 16, true);
    drawBrick(i * 8 + 4, 16, false);
  }
  for (int i = 0; i < 10; i++) {
    drawBrick(i * 8, 20, false);
    drawBrick(i * 8 + 4, 20, true);
  }
  for (int i = 0; i < 10; i++) {
    drawBrick(i * 8, 24, true);
    drawBrick(i * 8 + 4, 24, false);
  }
  for (int i = 0; i < 10; i++) {
    drawBrick(i * 8, 28, false);
    drawBrick(i * 8 + 4, 28, true);
  }

  oled.display();	

}

void move(int fps){
  float timeOffset = (millis() % 2000) / 2000.00;
  byte offset = 0x3F * timeOffset;
  // Serial.println(timeOffset);
  oled.ssd1306_command(0x40 | offset);
  updateDisplay(fps);
  Serial.println(fps);
}

FPS fpsController(50, &move);

void setup() {
  Serial.begin(9600);
  Wire.begin();					// inicializa bus I2C
  oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);	// inicializa pantalla con direccion 0x3C
  fpsController.start();
  updateDisplay(30);
  Serial.println("timeOffset");
}


void loop() {
  fpsController.tick();
}