
/* 
  runs at XIAO ESP32 S3
  =======================

    add eventually:
  - Wifi

*/

//display * * * * * * * * * * * * * * * 
#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library for ST7735
#include <SPI.h>

#include "SeeedLogo.h" //bitmaps
#include "Robot.h"


//                 XIAO-ESP32-C3
  #define TFT_CS       D0   //  yellow
  #define TFT_RST      D1   //  brown
  #define TFT_DC       D2   //  violet
// SCK                 D8   //  orange
// SDA                 D10   //  blue
// LED/Lite            3.3V   //  green
//#define RADARpin     D4     //   D4
int tftLEDpin = D7;
#define ST7735_MADCTL 0x36

// For 1.44" and 1.8" TFT with ST7735 use:
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);

//variables * * * * * * * * * * * * * * * * * * 
int gap = 114;
int Sensor = D3;   //Input Pin D3/GPIO5
int LEDpin = D5;
int counter = 0;
int flag = 0;    //sensor detection flag


// sleep * * * * * * * 
#include "driver/rtc_io.h"
#define BUTTON_PIN_BITMASK(GPIO) (1ULL << GPIO)  // 2 ^ GPIO_NUMBER in hex
#define USE_EXT0_WAKEUP          1               // 1 = EXT0 wakeup, 0 = EXT1 wakeup
#define WAKEUP_GPIO              GPIO_NUM_4     // only RTC pins 0-5, here the same as sensor pin
unsigned long startTime = 0;
unsigned long currentTime = 0;


void setup(void) {
  Serial.begin(115200);
  pinMode (Sensor, INPUT);
  pinMode (LEDpin, OUTPUT);
  delay(200);
  digitalWrite(LEDpin, HIGH);   // LED on
  delay(20);
  Serial.println("Awake!"); 

  // enable sleep
  esp_sleep_enable_ext0_wakeup(WAKEUP_GPIO, 1);  //1 = High, 0 = Low
  rtc_gpio_pullup_dis(WAKEUP_GPIO);
  rtc_gpio_pulldown_en(WAKEUP_GPIO);
  uint16_t startTime = millis();


  Serial.print(F("Hello! ST77xx TFT Test"));

  // Use this initializer if using a 1.8" TFT screen:
  //tft.initR(INITR_BLACKTAB);      // Init ST7735S chip, black tab

  // OR use this initializer if using a 1.8" TFT screen with offset such as WaveShare:
  //tft.initR(INITR_GREENTAB);      // Init ST7735S chip, green tab

  // OR use this initializer (uncomment) if using a 1.44" TFT:
  tft.initR(INITR_144GREENTAB); // Init ST7735R chip, green tab
  Serial.println(F("Initialized"));

  uint16_t time = millis();
  tft.setRotation(0);
  tft.setMirror(true,false);
  tft.fillScreen(ST77XX_BLACK);  // clear screen

  //time = millis() - time;

  delay(50);

}

void newSign() {
tft.fillScreen(ST77XX_BLACK);
  //star
tft.fillTriangle(66, 11, 85, 64, 58, 48, ST77XX_YELLOW);
tft.fillTriangle(22, 23, 84, 53, 37, 72, ST77XX_YELLOW);
tft.fillTriangle(108, 34, 91, 71, 62, 44, ST77XX_YELLOW);
tft.fillTriangle(6, 52, 50, 45, 57, 83 , ST77XX_YELLOW);
tft.fillTriangle(35, 54, 71, 69, 19, 100, ST77XX_YELLOW);
tft.fillTriangle(49, 71, 80, 60, 60, 115, ST77XX_YELLOW);
tft.fillTriangle(71, 41, 123, 75, 63, 78, ST77XX_YELLOW);
tft.fillTriangle(91, 50, 95, 106, 54, 64, ST77XX_YELLOW);
//New!
tft.setCursor(34, 51);
tft.setTextColor(ST77XX_RED);
tft.setTextSize(3);
tft.println("New!");
}


void scrollTriangle() {
  Serial.println("scrollTriangle2");
  for (int x=-50; x<64; x+=6) {
      tft.fillTriangle(x, 40, x+50, 65, x, 90, ST77XX_YELLOW);
      tft.fillTriangle(x+gap, 40, x+50+gap, 65, x+gap, 90, ST77XX_YELLOW);
      delay(120);
      tft.fillTriangle(x, 40, x+50, 65, x, 90, ST77XX_BLACK);  //clear triangle
      tft.fillTriangle(x+gap, 40, x+50+gap, 65, x+gap, 90, ST77XX_BLACK);//clear triangle
      //tft.fillRect(0, 20, 128, 90, ST77XX_BLACK); //clear screen
  }
}

void popUp(){
  Serial.println("popUp");
 for (int i=0; i<64; i+=2){
  tft.drawCircle(64, 64, i, ST77XX_WHITE);
  delay(100);
  tft.drawCircle(64, 64, i, ST77XX_BLACK); //clear circles
  if (i>32) {
    
    tft.setCursor(34, 51);
    tft.setTextColor(ST77XX_ORANGE);
    tft.setTextSize(3);
    tft.println("New!");
  }
 }
}


void rotationTest() {
  // Rotation params:
// 0 - 0 deg
// 1 - 90 deg anti-clockwise (from 0 deg)
// 2 - 180 deg anti-clockwise
// 3 - 270 deg anti-clockwise
// 4 - mirror content, and rotate 180 deg anti-clockwise
// 5 - mirror content, and rotate 270 deg anti-clockwise
// 6 - mirror content, and rotate 0 deg anti-clockwise
// 7 - mirror content, and rotate 90 deg anti-clockwise
    tft.setCursor(5, 45);
    tft.setTextColor(ST77XX_WHITE);
    tft.setTextSize(2);

  for (int i = 0; i<=4; i++){
    tft.fillScreen(ST77XX_BLACK); // clear screen
    tft.setRotation(i);
    tft.print("Rotation ");tft.println(i);
    Serial.print("Rotation ");Serial.println(i);
    delay(2000);

  }
}

void bigT() {
  tft.fillScreen(ST77XX_BLACK);
  tft.fillRect(20, 20, 88 , 88, ST77XX_MAGENTA);
  tft.setCursor(50, 45);
  tft.setTextColor(ST77XX_WHITE);
  tft.setTextSize(5);
  tft.println("T");
}

void price() {
  tft.fillScreen(ST77XX_BLACK);
  tft.setTextColor(ST77XX_ORANGE);
  tft.setTextSize(2);
  //
  tft.fillRoundRect(20, 20, 88, 88, 5, ST77XX_WHITE); 
  tft.setCursor(35, 40);
  tft.println("12.99");
  tft.setCursor(50, 70);
  tft.println("EUR");
}

void readRadar() {
     int val = digitalRead(Sensor); //Read Pin as input
     
     if((val > 0) && (flag==0)) {
        startTime = millis();
        counter++;
        Serial.print("Motion Detected ");Serial.println(counter);
        delay(1000);    // time of warning
        //flag = 1;
     }
 
     if(val == 0) {
        currentTime = millis();
          if (currentTime - startTime > 30000){  // = 30sec
      //Go to sleep now
      Serial.println("Going to sleep in 2 sec");
      digitalWrite(tftLEDpin, LOW);
      delay(2000);
      esp_deep_sleep_start();
      Serial.println("This will never be printed");
  }
        //flag = 0;
     }
     delay(100);
}


void loop() {
  
readRadar();
  newSign(); // * * * * * * * *
  delay(2000);
  for (int i=0; i<1; i++){
    tft.invertDisplay(true);
    delay(600);
    tft.invertDisplay(false);
    delay(600);
  }
  tft.fillScreen(ST77XX_BLACK);
  delay(500);
  
readRadar();
  for (int i=0; i<2; i++){   // * * * * * * * *
    scrollTriangle();
  }
    tft.fillScreen(ST77XX_BLACK);
  delay(500);
 
 readRadar();
  popUp();// * * * * * * * *
  delay(1000);
  tft.fillScreen(ST77XX_BLACK);

  bigT();
  delay(2000);
  readRadar();

  tft.fillScreen(ST77XX_BLACK);
  tft.drawRGBBitmap(24, 24, SeeedLogo, 80, 80);
  delay(3000);
  readRadar();

  tft.fillScreen(ST77XX_BLACK);
  tft.drawRGBBitmap(24, 24, Robot, 80, 80);
  delay(3000);
  readRadar();



  price();
  delay(2000);
  readRadar();


}

/*
ready defined: = = = = = =  =
ST77XX_BLACK
ST77XX_WHITE
ST77XX_RED
ST77XX_GREEN
ST77XX_BLUE
ST77XX_CYAN
ST77XX_MAGENTA
ST77XX_YELLOW
ST77XX_ORANGE
*/