#include <SPI.h> 
#include <MFRC522.h> 
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"

#define  SS   10
#define  RST  9

LiquidCrystal_I2C lcd(0x27, 20, 4);
MFRC522 scanner(SS,RST);
SoftwareSerial mySoftwareSerial(4,3);  // RX, TX
DFRobotDFPlayerMini myDFPlayer;

const uint8_t maximum=6;
uint8_t index; 
int count=0;
String tag[6]={"9314b72d","f12fee1b","d27b920","83d2382d","9382c62d","939e3f2d"};
String goods[6]={"BISCUIT","JUICE","APPLE","CHOCOLATE","HALUA","FLOWER"};
String price[6]={"500/-","1000/-","2000/-","5000/-","3000/-","6000/-"};

void setup()
{
  // ONLY FOR SIMULATION
  pinMode(2, INPUT_PULLUP);

  lcd.init();
  lcd.backlight();
  welcomeDisplay();

  mySoftwareSerial.begin(9600);
  Serial.begin(115200);

  SPI.begin();
  scanner.PCD_Init();

  if (!myDFPlayer.begin(mySoftwareSerial)) {
    Serial.println(F("Not initialized:"));
    Serial.println(F("1. Check the DFPlayer Mini connections"));
    Serial.println(F("2. Insert an SD card"));
    //while (true);  COMMENTED FOR SIMULATION
  }
  Serial.println();
  Serial.println(F("DFPlayer Mini module initialized!"));
  // Initial settings
  myDFPlayer.volume(30);        // Volume 5
  myDFPlayer.play(11);
  init_display();
}

void loop()
{
  String tempTag=readTag();
  if(tempTag!="error")
  {
    uint8_t tempIndex=analyseTag(tempTag);
    if(tempIndex != 99)
    {
      goods_display(tempIndex);
    }
  }
  //for simulation only
  if(digitalRead(2)==LOW)
  {
    delay(500);
    goods_display(count);
    count++;
    if(count>5)
    {count=0;}
  }
}

void init_display()
{
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("SYSTEM RUNNING"); 
  lcd.setCursor(0,1);
  lcd.print("GOODS SCANNING");
}

String readTag()
{
    if(!scanner.PICC_IsNewCardPresent())
    {
      Serial.println("no card present");
      return "error";
    }
    if(!scanner.PICC_ReadCardSerial())
    {
      Serial.println("card not readable");
      return "error";
    }
    //save data and return output
    String myTag;
    for (int i = 0; i < scanner.uid.size; i++) 
    {
      myTag += String(scanner.uid.uidByte[i],HEX);
    }
    Serial.print("THE TAG DETECTED IS:");
    Serial.println(myTag);
    return myTag;
}

unsigned int analyseTag(String tagId)
{
  for(uint8_t i=0;i<maximum;i++)
  {
    if(tagId==tag[i])
    {
      return i;
    }
  }
  return 99;
}


void welcomeDisplay()
{
     lcd.clear();
     lcd.setCursor(0,0);
     lcd.print("   BLIND SHOPPING  "); 
     lcd.setCursor(0,1);
     lcd.print("     ASSISTANT     "); 
     lcd.setCursor(0,2);
     lcd.print("INITIALIZING SYS");
     lcd.setCursor(0,3);
     lcd.print("PLEASE WAIT ....");
     delay(3000);
}

void goods_display(uint8_t i)
{
     lcd.clear();
     lcd.setCursor(0,0);
     lcd.print("***DETECTION INFO***"); 
     lcd.setCursor(0,1);
     lcd.print("GOODS:"); 
     lcd.setCursor(7,1);
     lcd.print(goods[i]);  
     lcd.setCursor(0,2);
     lcd.print("PRICE:"); 
     lcd.setCursor(7,2);
     lcd.print(price[i]); 
     lcd.setCursor(0,3);
     lcd.print("******END INFO******");  
     //myDFPlayer.play(i); comment for simulation
}
nano:12
nano:11
nano:10
nano:9
nano:8
nano:7
nano:6
nano:5
nano:4
nano:3
nano:2
nano:GND.2
nano:RESET.2
nano:0
nano:1
nano:13
nano:3.3V
nano:AREF
nano:A0
nano:A1
nano:A2
nano:A3
nano:A4
nano:A5
nano:A6
nano:A7
nano:5V
nano:RESET
nano:GND.1
nano:VIN
nano:12.2
nano:5V.2
nano:13.2
nano:11.2
nano:RESET.3
nano:GND.3
lcd1:GND
lcd1:VCC
lcd1:SDA
lcd1:SCL
bz1:1
bz1:2
mp3-player-moduleBreakout
chip2:VCC
chip2:RX
chip2:TX
chip2:DAC_R
chip2:DAC_I
chip2:SPK_1
chip2:GND
chip2:SPK_2
chip2:IO_1
chip2:GND
chip2:IO_2
chip2:ADKEY_1
chip2:ADKEY_2
chip2:USB+
chip2:USB-
chip2:BUSY
bz2:1
bz2:2
rfid-rc522Breakout
chip1:SS
chip1:SCK
chip1:MOSI
chip1:MISO
chip1:IRQ
chip1:GND
chip1:RST
chip1:VCC
btn1:1.l
btn1:2.l
btn1:1.r
btn1:2.r