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

#define TFT_DC 9
#define TFT_CS 10
Adafruit_ILI9341 display = Adafruit_ILI9341(TFT_CS, TFT_DC);

void setup() {
  Serial.begin(9600);
  mString<4> ic_name;

  display.begin();

  ic_name = "50d";
   show_icon(0, 0, 10, ic_name);
    show_icon(100, 0, 4, ic_name);
  ic_name = "50n";
  show_icon(150,0, 10, ic_name);
  show_icon(100, 30, 4, ic_name);


}

void loop() { }

void show_icon(int x, int y, uint8_t scale, mString<4> &  IconName)
{
  byte k = 5;
  display.fillRect(x - 2, y - 3, scale * 9, scale * 8, ILI9341_BLACK);
  display.drawRect(x - 2, y - 3, scale * 9, scale * 8, ILI9341_CYAN);

  display.setFont();
  display.setTextSize(1);
  display.setTextColor(ILI9341_CYAN);
  display.setCursor(0, 0);
  display.print(IconName.buf);

  if      (IconName == "01d" || IconName == "01n")
  {
    if (IconName[2] == 'd')
    {
      addsun(x + scale * 4, y + scale * 3, scale);
    }
    if (IconName[2] == 'n')
    {

      addmoon(x + scale * 4, y + scale * 3, scale);
    }

    return;

  }
  else if (IconName == "02d" || IconName == "02n")
  {
    if (IconName[2] == 'd')
    {
      addsun(x + scale * 4, y + scale * 3, scale);
      addcloud(x, y, scale, ILI9341_WHITE);
    }
    if (IconName[2] == 'n')
    {

      addmoon(x + scale * 4, y + scale * 3, scale);
      addcloud(x, y, scale, ILI9341_CYAN);
    }

    return;

  }
  else if (IconName == "03d" || IconName == "03n")
  {
    if (IconName[2] == 'd')
    {
      // addsun(x + scale * 4, y + scale * 3, scale);
      addcloud(x, y + scale, scale, ILI9341_WHITE);
    }
    if (IconName[2] == 'n')
    {

      //  addmoon(x + scale * 4, y + scale * 3, scale);
      addcloud(x, y + scale, scale, ILI9341_CYAN);
    }

    return;

  }
  else if (IconName == "04d" || IconName == "04n")
  {

    addcloud(x, y + scale, scale, ILI9341_BLUE);
    return;

  }
  else if (IconName == "09d" || IconName == "09n")
  {
    addcloud(x, y, scale, ILI9341_CYAN);
    addrain( x, y, scale);
    return;

  }
  else if (IconName == "10d" || IconName == "10n")
  {
    if (IconName[2] == 'd')
    {
      addsun(x + scale * 4, y + scale * 3, scale);
    }
    if (IconName[2] == 'n')
    {
      addmoon(x + scale * 4, y + scale * 3, scale);
    }
    addcloud(x, y, scale, ILI9341_CYAN);
    addrain( x, y, scale);
    return;

  } //addtstorm
  else if (IconName == "11d" || IconName == "11n")
  {
    addrain( x, y, scale);
    addtstorm( x + scale * 4, y + scale * 2, scale);
    addcloud(x, y - scale / 2, scale, ILI9341_BLUE);

    return;

  }
  else if (IconName == "13d" || IconName == "13n")
  {
    addsnow( x, y, scale);
    addcloud(x, y - scale / 2, scale, ILI9341_BLUE);
  }
  else if (IconName == "50d"||IconName == "50n")                     ;
  {
addfog(x,y,  scale);
  }                   

}
//#########################################################################################
void addfog(int x, int y,  uint8_t scale)
 {
  
   display.fillRect(x + scale * 2, y + scale*2, scale * 5, scale, ILI9341_LIGHTGREY);
    display.fillRect(x + scale, y + scale * 3, scale * 4, scale, ILI9341_DARKGREY);
    display.fillRect(x , y + scale * 4, scale * 6, scale, ILI9341_LIGHTGREY);
   display.fillRect(x + scale, y + scale * 5, scale * 6, scale, ILI9341_DARKGREY);
   
}


// display.fillRect(x + scale,y + scale * 3, scale * 7, scale, ILI9341_YELLOW);
void addtstorm(int x, int y, int scale) {
  y = y + scale * 2;
  x = x + scale;

  for (int i = 0; i < scale; i++) {
    display.drawLine(x + i + scale / 2, y, x + i - scale / 2, y + scale, ILI9341_WHITE);
  }
  display.fillRoundRect(x - scale / 2,  y + scale, scale * 3, scale / 2, scale, ILI9341_WHITE);
  display.fillTriangle(x + scale, y + scale * 1.5, x + scale * 2, y + scale * 1.5, x, y + scale * 3, ILI9341_WHITE);

}

//#########################################################################################
void addcloud(int x, int y, int scale, uint16_t color) {
  byte k = 5;
  if (scale < 6) k = 0;
  display.fillCircle(x + scale, k + y + scale * 3, scale, color);      // Clear left most circle
  display.fillCircle(x + scale * 3, k + y + scale * 2, scale * 2, color);
  display.fillCircle(x + scale * 5, k + y + scale * 2.5, scale * 1.7, color);
  display.fillCircle(x + scale * 7, k + y + scale * 3, scale, color);
  display.fillRoundRect(x + scale, k + y + scale * 3, scale * 7, scale * 1.3, scale, color);

}

//#########################################################################################
void addrain(int x, int y, byte scale) {
  y = y + scale * 4;
  x = x + scale * 2;
  for (int i = 0; i < scale; i++) {
    display.drawLine(x + 4 * i, y, x + 5 + 4 * i, y + scale * 3, ILI9341_CYAN);
  }
}

//#########################################################################################
void addsnow(int x, int y, int scale) {
   if (scale < 6)
  {
    y = y + scale * 5;
    x = x + scale ;
    for (int i = 0; i <= scale; i++)
      display.fillCircle(x + 5 * i, y, 1, ILI9341_CYAN);
    return;
  }

  y = y + scale * 4;
  x = x + scale*4 ;
 int dxo, dyo, dxi, dyi;
  for (int flakes = 0; flakes < 5; flakes++) {
    for (int i = 0; i < 360; i = i + 45) {
      dxo = 0.5 * scale * cos((i - 90) * 3.14 / 180); dxi = dxo * 0.1;
      dyo = 0.5 * scale * sin((i - 90) * 3.14 / 180); dyi = dyo * 0.1;
      display.drawLine(dxo + x +flakes * 1.5 * scale - scale * 3, dyo + y + scale * 2, dxi + x  + flakes * 1.5 * scale - scale * 3, dyi + y + scale * 2, ILI9341_CYAN);
    }
  }
}


//#########################################################################################
void addsun(int x, int y, int scale) {
  display.fillCircle(x, y, scale * 3, ILI9341_YELLOW);
}

//#########################################################################################
void addmoon (int x, int y, int scale) {
  display.fillCircle(x, y, scale * 3, ILI9341_WHITE);
  display.fillCircle(x + scale * 2, y, scale * 3, ILI9341_BLACK);
}

uno:A5.2
uno:A4.2
uno:AREF
uno:GND.1
uno:13
uno:12
uno:11
uno:10
uno:9
uno:8
uno:7
uno:6
uno:5
uno:4
uno:3
uno:2
uno:1
uno:0
uno:IOREF
uno:RESET
uno:3.3V
uno:5V
uno:GND.2
uno:GND.3
uno:VIN
uno:A0
uno:A1
uno:A2
uno:A3
uno:A4
uno:A5
lcd1:VCC
lcd1:GND
lcd1:CS
lcd1:RST
lcd1:D/C
lcd1:MOSI
lcd1:SCK
lcd1:LED
lcd1:MISO