#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9341.h"

#define TFT_DC 9
#define TFT_CS 10

// Définition de quelques couleurs simples:
#define  NOIR   0x0000
#define BLEU    0x001F
#define ROUGE   0xF800
#define VERT    0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define JAUNE   0xFFE0
#define BLANC   0xFFFF

#define Black           0x0000      /*   0,   0,   0 */
#define Navy            0x000F      /*   0,   0, 128 */
#define DarkGreen       0x03E0      /*   0, 128,   0 */
#define DarkCyan        0x03EF      /*   0, 128, 128 */
#define Maroon          0x7800      /* 128,   0,   0 */
#define Purple          0x780F      /* 128,   0, 128 */
#define Olive           0x7BE0      /* 128, 128,   0 */
#define LightGrey       0xC618      /* 192, 192, 192 */
#define DarkGrey        0x7BEF      /* 128, 128, 128 */
#define Blue            0x001F      /*   0,   0, 255 */
#define Green           0x07E0      /*   0, 255,   0 */
#define Cyan            0x07FF      /*   0, 255, 255 */
#define Red             0xF800      /* 255,   0,   0 */
#define Magenta         0xF81F      /* 255,   0, 255 */
#define Yellow          0xFFE0      /* 255, 255,   0 */
#define White           0xFFFF      /* 255, 255, 255 */
#define Orange          0xFD20      /* 255, 165,   0 */
#define GreenYellow     0xAFE5      /* 173, 255,  47 */
#define Pink                        0xF81F


Adafruit_ILI9341 ECRAN = Adafruit_ILI9341(TFT_CS, TFT_DC);

uint16_t RGBto16bitColor(char red, char green, char blue) {
  /*
    Thanks to https://stackoverflow.com/a/13721235
  */
  return (((31*(red+4))/255)<<11) | (((63*(green+2))/255)<<5) | ((31*(blue+4))/255);
}

void drawHexagon(int origin_x, int origin_y, int color, int scale) {
  int origin_rect_x = origin_x + scale;
  int origin_rect_y = origin_y;
  int lenght_rect = scale;
  int height_rect = scale*2;

  ECRAN.fillRect(origin_rect_x,origin_rect_y,lenght_rect,height_rect,color);

  int peak1_trig_x = origin_x + 0.5*scale;
  int peak1_trig_y = origin_y + scale;
  int peak2_trig_x = origin_x + scale;
  int peak2_trig_y = origin_y;
  int peak3_trig_x = origin_x + scale;
  int peak3_trig_y = origin_y + 2*scale;

  ECRAN.fillTriangle(peak1_trig_x, peak1_trig_y, peak2_trig_x, peak2_trig_y, peak3_trig_x, peak3_trig_y, color);

  int peak1_trig2_x = origin_x + 2.5*scale;
  int peak1_trig2_y = origin_y + scale;
  int peak2_trig2_x = origin_x + 2*scale;
  int peak2_trig2_y = origin_y;
  int peak3_trig2_x = origin_x + 2*scale;
  int peak3_trig2_y = origin_y + 2*scale;

  ECRAN.fillTriangle(peak1_trig2_x, peak1_trig2_y, peak2_trig2_x, peak2_trig2_y, peak3_trig2_x, peak3_trig2_y, color);
}

void drawBolt(int origin_x, int origin_y, int color, int scale) {
  int origin_line1_x = origin_x + scale;
  int origin_line1_y = origin_y;
  int end_line1_x = origin_x;
  int end_line1_y = origin_y + scale;

  ECRAN.drawLine(origin_line1_x, origin_line1_y, end_line1_x, end_line1_y, color);

  int origin_line2_x = origin_x;
  int origin_line2_y = origin_y + scale;
  int end_line2_x = origin_x + scale;
  int end_line2_y = origin_y + scale;

  ECRAN.drawLine(origin_line2_x, origin_line2_y, end_line2_x, end_line2_y, color);

  int origin_line3_x = origin_x + scale;
  int origin_line3_y = origin_y + scale;
  int end_line3_x = origin_x;
  int end_line3_y = origin_y + scale * 2;

  ECRAN.drawLine(origin_line3_x, origin_line3_y, end_line3_x, end_line3_y, color);
}

void drawWrench(int origin_x, int origin_y, int color, int bgColor, int scale) {
  int origin_rect1_x = origin_x + 0.54*scale;
  int origin_rect1_y = origin_y + 2*scale;
  int width_rect1 = scale;
  int height_rect1 = scale;

  ECRAN.fillRect(origin_rect1_x, origin_rect1_y, width_rect1, height_rect1, color);

  int origin_circle2_x = origin_x + scale;
  int origin_circle2_y = origin_y + scale;
  int r_circle2 = scale;

  ECRAN.fillCircle(origin_circle2_x, origin_circle2_y, r_circle2, color);

  int origin_rect2_x = origin_x + 0.54*scale;
  int origin_rect2_y = origin_y;
  int width_rect2 = scale;
  int height_rect2 = scale;

  ECRAN.fillRect(origin_rect2_x, origin_rect2_y, width_rect2, height_rect2, bgColor);
}

void drawPeople(int origin_x, int origin_y, int color, int scale) {
  int origin_rect_x = origin_x ;
  int origin_rect_y = origin_y + scale * 1.5;
  int lenght_rect = scale* 2;
  int height_rect = scale * 0.5;

  ECRAN.fillRect(origin_rect_x,origin_rect_y,lenght_rect,height_rect,color);

  int peak1_trig_x = origin_x + scale;
  int peak1_trig_y = origin_y + scale;

  int peak2_trig_x = origin_x;
  int peak2_trig_y = origin_y + scale * 1.5;

  int peak3_trig_x = origin_x + scale * 2;
  int peak3_trig_y = origin_y + scale * 1.5;

  ECRAN.fillTriangle(peak1_trig_x, peak1_trig_y, peak2_trig_x, peak2_trig_y, peak3_trig_x, peak3_trig_y, color);

  int origin_circ_x = origin_x + scale;
  int origin_circ_y = origin_y + scale * 0.5;
  int ray_circ= scale * 0.5;

  ECRAN.fillCircle(origin_circ_x, origin_circ_y, ray_circ, color);
}

void drawWhiteboard(int origin_x, int origin_y, int color, int scale) {
  int origin_rect_x = origin_x ;
  int origin_rect_y = origin_y ;
  int lenght_rect = scale * 2;
  int height_rect = scale * 2;

  ECRAN.fillRect(origin_rect_x,origin_rect_y,lenght_rect,height_rect,color);
}

void drawBinary(int origin_x, int origin_y, int color, int scale) {
  int seq1_x = origin_x;
  int seq1_y = origin_y;

  int seq2_x = origin_x;
  int seq2_y = origin_y + scale;

  int seq3_x = origin_x;
  int seq3_y = origin_y + 2*scale;

  int textSize = scale / 10;

  ECRAN.setTextSize(textSize) ;
  ECRAN.setTextColor(color);
  ECRAN.setCursor(seq1_x, seq1_y);
  ECRAN.print("01010011");

  ECRAN.setTextSize(textSize) ;
  ECRAN.setTextColor(color);
  ECRAN.setCursor(seq2_x, seq2_y);
  ECRAN.print("01001001");

  ECRAN.setTextSize(textSize) ;
  ECRAN.setTextColor(color);
  ECRAN.setCursor(seq3_x, seq3_y);
  ECRAN.print("01001110");
}

void drawSTI2DLogo() {
  ECRAN.setTextSize(7) ;
  ECRAN.setTextColor(BLANC);
  ECRAN.setCursor(0, 95);
  ECRAN.print("STI");
  ECRAN.setTextSize(7) ;
  ECRAN.setTextColor(VERT);
  ECRAN.setCursor(125, 95);
  ECRAN.print("2D");

  drawHexagon(122,0,RGBto16bitColor(  227, 242, 172), 37 );
  drawHexagon(187,42,RGBto16bitColor( 141, 191, 33), 37 );
  drawHexagon(187,125,RGBto16bitColor( 70, 115, 2), 37 );
  drawHexagon(122, 166, RGBto16bitColor(61, 89, 18) , 37 );
}

void setup() {
  ECRAN.begin();

  ECRAN.setRotation(1) ;      //ecran paysage
  ECRAN.fillScreen(NOIR);      //fond noir
  ECRAN.setTextSize(2) ;

  drawSTI2DLogo();

  drawWrench(229, 138, NOIR, RGBto16bitColor( 70, 115, 2), 14);
  
  drawWhiteboard(166, 178, RGBto16bitColor(10, 90, 20), 16);
  drawPeople(153, 193, NOIR, 15);

  drawBolt(229, 50, NOIR, 27);
  drawBolt(230, 50, NOIR, 27);
  drawBolt(229, 51, NOIR, 27);
  drawBolt(229, 52, NOIR, 27);
  drawBolt(229, 53, NOIR, 27);
  drawBolt(231, 50, NOIR, 27);
  drawBolt(228, 50, NOIR, 27);
  drawBolt(227, 50, NOIR, 27);
  drawBolt(226, 50, NOIR, 27);
  drawBolt(225, 50, NOIR, 27);

  drawBinary(115, 12, NOIR, 20); 
}

void loop() { }