/**
Boceto Terminal Visual XbX DLL eVo!
*/
#include <TFT_eSPI.h>
#include <SPI.h> // this is needed for display
#include <Wire.h> // this is needed for FT6206
#include <Adafruit_FT6206.h>
#include "WS_Icon.h"
// The FT6206 uses hardware I2C (SCL/SDA)
//Adafruit_FT6206 ctp = Adafruit_FT6206();
// The display also uses hardware SPI, plus #9 & #10
#define TFT_CS 15
#define TFT_DC 2
#define TFT_MOSI 23
#define TFT_SCLK 18
//Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
TFT_eSPI lcd = TFT_eSPI();
TFT_eSprite sprite_WS = TFT_eSprite(&lcd);
TFT_eSprite sprite_AR = TFT_eSprite(&lcd);
TFT_eSprite sprite_CFG = TFT_eSprite(&lcd);
TFT_eSprite sprite_GARAGE= TFT_eSprite(&lcd);
// TFT_eSprite sprite4 = TFT_eSprite(&lcd);
#define color1 TFT_WHITE
#define color2 0x8410 //GRIS
#define color3 0x3828 //MORADO
#define color5 0x00A3 //AZUL OSCURO
//#define color6 0x00A3 //AZUL OSCURO
#define GREY 0x4228
int ADC1=13; //light sensor pin
int ADC2=12; //microphone pin
int BTN=21;
int LED =16;
int JM_x=4;
int JM_y=4;
int width=120;
int boxes=6;
int graph[4];
int pointsX[20];
int pointsY[20];
float cor[4]={0,0,2,2};
//circuit gauge variables
int sx=70; // center x
int sy=70; // center y
int r=62;
double rad=0.01745;
float x[360]; //outer point
float y[360];
float px[360]; //ineer point
float py[360];
float lx[360]; //text
float ly[360];
int start[12];
int startP[60];
String cc[10]={"0","10","20","30","40","50","60","70","80","90"};
int sp[4]={0,0,139,139}; //NEW JOY MONITOR
float slope;
//Sprite AR data
int gw=165; //graph width
int gh=63; //graph heigth
int gx=20; //graph x
int gy=55; // graph Y
void setup() {
pinMode(BTN,INPUT_PULLUP);
pinMode(LED,OUTPUT);
lcd.init();
lcd.setRotation(1);
lcd.fillScreen(TFT_BLACK);
lcd.drawLine(0,170,318,170,TFT_RED);
lcd.drawLine(318,0,318,170,TFT_RED);
lcd.setTextDatum(3);
lcd.setTextColor(TFT_BLACK,TFT_WHITE);
lcd.drawString(" WEAPON SELECTOR ",5,10);
lcd.setTextColor(TFT_WHITE,GREY);
lcd.drawString(" MENU CONFIG ",140,10);
lcd.setTextColor(TFT_BLACK,TFT_GOLD);
lcd.drawString(" TOUCHPAD MONITOR ",5,56);
lcd.setTextColor(TFT_BLACK,TFT_RED);
lcd.drawString(" ANTI-RECOIL INJECTOR ",140,94);
// sprite.createSprite(140,140); //Rueda
// sprite.setTextDatum(4);
lcd.setSwapBytes(true); //WEAPON SELECTOR ICON
lcd.pushImage(0,18,125,30,WS_Icon); //WEAPON SELECTOR ICON
sprite_WS.createSprite(65,10); //WEAPON SELECTOR
sprite_WS.fillSprite(TFT_WHITE);
sprite_WS.setTextColor(TFT_BLACK);
sprite_WS.drawString("NO WEAPON",0,0);
sprite_GARAGE.createSprite(108,105); //PLOT COORD TOUCHPAD
sprite_GARAGE.fillSprite(color2);
sprite_AR.createSprite(170,63); //Grafica AR
sprite_AR.setTextDatum(4);
sprite_CFG.createSprite(120,70); //config
// sprite4.createSprite(40,80); //boton
sprite_CFG.fillSprite(color2);
/*
sprite4.fillSprite(TFT_BLACK);
sprite4.setTextDatum(4);
sprite4.setTextColor(color1,color3);
*/
/*
int b=0;
int b2=0;
for(int i=0;i<360;i++)
{
x[i]=(r*cos(rad*i))+sx;
y[i]=(r*sin(rad*i))+sy;
px[i]=((r-12)*cos(rad*i))+sx;
py[i]=((r-12)*sin(rad*i))+sy;
lx[i]=((r-18)*cos(rad*i))+sx;
ly[i]=((r-18)*sin(rad*i))+sy;
if(i%36==0){
start[b]=i;
b++;
}
if(i%6==0){
startP[b2]=i;
b2++;
}
}
*/
// sprite.pushSprite(5,40);
drawAll();
}
int angle=0;
int values[20]={0};
int values2[20]={0};
int curent=0;
int counter=0;
int counter_last=2;
int calib=30; //CALIBRACION GRAFICA SEÑAL AR
int curentTime=0;
int period=500;
int term[9]={0};
int term2[9]={0};
int t[9]={0};
int t2[9]={0};
bool c=0;
bool c1;
int number=0;
// bool onOff=0;
// int debounce=0;
void loop() {
/*
if(digitalRead(BTN)==0)
{
if(debounce==0)
{
debounce=1;
onOff=!onOff;
digitalWrite(LED,onOff);
}
}else debounce=0;
*/
angle=map(analogRead(ADC1),0,4095,0,359);
int num=analogRead(ADC2);
curent=map(num,0,200,0,gh);
for(int i=0;i<20;i++)
values2[i]=values[i];
for(int i=19;i>0;i--)
values[i-1]=values2[i];
values[19]=curent;
// sprite4.fillRoundRect(0,0,40,80,4,color3);
sprite_AR.fillSprite(TFT_BLACK);
// sprite.fillRoundRect(0,0,120,120,3,color6);
// sprite.setTextFont(0);
/*
for(int i=0;i<10;i++)
if(start[i]+angle<360){
sprite.drawString(cc[i],x[start[i]+angle],y[start[i]+angle]);
sprite.drawLine(px[start[i]+angle],py[start[i]+angle],lx[start[i]+angle],ly[start[i]+angle],color1);
}
else
{
sprite.drawString(cc[i],x[(start[i]+angle)-360],y[(start[i]+angle)-360]);
sprite.drawLine(px[(start[i]+angle)-360],py[(start[i]+angle)-360],lx[(start[i]+angle)-360],ly[(start[i]+angle)-360],color1);
}
float v=angle/3.60;
for(int i=0;i<60;i++)
if(startP[i]+angle<360)
sprite.fillCircle(px[startP[i]+angle],py[startP[i]+angle],1,color1);
else
sprite.fillCircle(px[(startP[i]+angle)-360],py[(startP[i]+angle)-360],1,color1);
sprite.setTextColor(TFT_SILVER,color6);
sprite.drawString("AMBIENT",sx,sy-22,2);
sprite.drawString("LIGHT",sx,sy+18,2);
sprite.setTextColor(color1,color6);
sprite.drawString(String((int)v)+"%",sx,sy,4);
sprite.fillTriangle(70,28,74,36,66,36,TFT_RED);
*/
for(int i=1;i<10;i++)
sprite_AR.drawLine(gx+(i*gw/10),gy,gx+(i*gw/10),gy-gh,GREY);
for(int i=0;i<10;i++){
sprite_AR.drawLine(gx,gy-(i*6),gx+gw,gy-(i*6),GREY);
if(i==1)
sprite_AR.drawString(String(0),gx-9,gy-11);
if(i==3 || i==5)
sprite_AR.drawString(String(i*20-30),gx-12,gy-(i*9+2));
}
sprite_AR.drawLine(gx,gy,gx,gy-gh,TFT_WHITE);
sprite_AR.drawLine(gx,gy-(12),gx+gw,gy-(12),TFT_WHITE);
for(int i=0;i<19;i++){
sprite_AR.drawLine(gx+(i*8),gy-values[i]-calib,gx+((i+1)*9),gy-values[i+1]-calib,TFT_RED);
sprite_AR.drawLine(gx+(i*8),gy-values[i]-1-calib,gx+((i+1)*8),gy-values[i+1]-1-calib,TFT_RED);}
/*
if(curentTime+period<millis()){
sprite_CFG.fillSprite(TFT_BLACK);
c1=c;
for(int i=0;i<6;i++){
term2[i]=term[i];
t2[i]=t[i];
}
for(int i=5;i>0;i--){
term[i-1]=term2[i];
t[i-1]=t2[i];
}
term[5]=(analogRead(4) * 2 * 3.3 * 1000) / 4096;
t[5]=number;
sprite_CFG.setTextColor(TFT_WHITE,color5);
for(int i=0;i<6;i++){
sprite_CFG.drawString(String(t[i])+" BATERY="+String(term[i])+" ",4,4+i*11);
c1=!c1;
}
curentTime=millis();
c=!c;
number++;
}
*/
if(curentTime+period<millis()){
sprite_GARAGE.fillSprite(TFT_BLACK);
c1=c;
for(int i=0;i<9;i++){
term2[i]=term[i];
t2[i]=t[i];
}
for(int i=8;i>0;i--){
term[i-1]=term2[i];
t[i-1]=t2[i];
}
term[8]=(analogRead(4) * 2 * 3.3 * 1000) / 4096;
t[8]=number;
sprite_GARAGE.setTextColor(TFT_WHITE,color5);
for(int i=0;i<9;i++){
sprite_GARAGE.drawString(String(t[i])+" BATERY="+String(term[i])+" ",4,4+i*11);
c1=!c1;
}
curentTime=millis();
c=!c;
number++;
}
/*
if(onOff==1)
sprite4.drawString("ON",20,10);
else
sprite4.drawString("OFF",20,10);
sprite4.drawCircle(20,28,10,TFT_SILVER);
sprite4.drawCircle(20,64,10,TFT_SILVER);
sprite4.drawRect(10,28,21,36,TFT_SILVER);
sprite4.fillRect(11,28,19,36,color3);
sprite4.fillCircle(20,28+(onOff*36),7,TFT_WHITE);
*/
sprite_WS.pushSprite(27,30);
sprite_AR.pushSprite(140,105);
sprite_CFG.pushSprite(150,15);
sprite_GARAGE.pushSprite(15,65);
}
/*
String linear(float x1, float y1, float x2,float y2)
{
String res="";
float a,b,c;
a=x2-x1;
b=y2-y1;
c=(x2*y1)-(x1*y2);
String first,second;
if((b/a)<0)
first="-";
else
first="";
if((c/a)<0)
second="-";
else
second="+";
if(x1==x2)
res="x="+String(int(x1));
else if(y2==y1)
res="y="+String(int(y1));
else if(x1==0 && x2==0 && y1==0 && y2==0)
res="";
else{
if((c/a)<0)
res="y= "+String(b/a)+" x "+second+" "+String((c/a)*-1);
else
res="y= "+String(b/a)+" x "+second+" "+String((c/a));
}
return res;
}
*/
void drawF(int x, int y, int x2,int y2) //PLOT LINEA
{
lcd.drawLine(pointsX[boxes/2+1+x],pointsY[boxes/2+1-y],pointsX[boxes/2+1+x2],pointsY[boxes/2+1-y2],TFT_RED);
/*
slope=(float)(y2-y)/(float)(x2-x);
float cx=0;
float cy=0;
if(x!=x2){
for(int i=pointsY[boxes/2-y];i<=pointsY[boxes];i++)
{
cx=pointsX[boxes/2+x]+i;
cy=pointsY[boxes/2-y]-i*slope;
}
lcd.drawLine(pointsX[boxes/2+x],pointsY[boxes/2-y],cx,cy,TFT_RED);
cx=pointsX[boxes/2+x2];
cy=pointsY[boxes/2-y2];
for(int i=pointsX[boxes/2+x2];i>=pointsX[0];i--)
{
cx=cx-1;
cy=cy+slope;
}
lcd.drawLine(pointsX[boxes/2+x2],pointsY[boxes/2-y2],(int)cx,(int)cy,TFT_RED);
}else {lcd.drawLine(pointsX[boxes/2+x],pointsY[0],pointsX[boxes/2+x],pointsY[6],TFT_RED);}
*/
}
void drawAll()
{
drawF((int)cor[0],(int)cor[1],(int)cor[2],(int)cor[3]);
// drawPoint(cor[0],cor[1]);
// lcd.fillRect(0,148,135,240,TFT_BLACK);
// lcd.setTextColor(TFT_GOLD,TFT_BLACK);
// lcd.drawString("LINEAR FUNCTION",8,0,2);
// lcd.setTextColor(TFT_WHITE ,0x2880);
// lcd.drawString( " A( "+String((int)cor[0])+" , "+String((int)cor[1])+" ) ",22,160,2);
// lcd.drawString(" B( "+String((int)cor[2])+" , "+String((int)cor[3])+" ) ",22,182,2);
// lcd.fillRect(spy[counter]+7,sp[counter]+18,11,2,TFT_YELLOW);
// lcd.setTextColor(TFT_RED ,TFT_BLACK);
// lcd.drawString("@",8,sp[counter],2);
// lcd.setTextColor(0x5E37,TFT_BLACK);
// lcd.drawString(linear(cor[0],cor[1],cor[2],cor[3]),8,208,2);
// lcd.drawString("slope= "+String(slope),8,226,2);
// lcd.setTextColor(TFT_WHITE,TFT_BLACK);
}