/**
 * Read a card using a mfrc522 reader on your SPI interface
 * Pin layout should be as follows (on Arduino Uno):
 * MOSI: Pin 11 / ICSP-4
 * MISO: Pin 12 / ICSP-1
 * SCK: Pin 13 / ISCP-3
 * SS: Pin 10
 * RST: Pin 9
 *
 * Script is based on the script of Miguel Balboa. 
 * Serial number is shown on a HD44780 compatible display
 *
 * The circuit:
 * LCD RS pin to digital pin (7)
 * LCD Enable pin to digital pin (6)
 * LCD D4 pin to digital pin 5
 * LCD D5 pin to digital pin 4
 * LCD D6 pin to digital pin 3
 * LCD D7 pin to digital pin 2
 * LCD R/W pin to ground
 * 10K resistor:
 * ends to +5V and ground
 * wiper to LCD VO pin (pin 3)
 *
 * @version 0.1
 * @author Henri de Jong
 * @since 27-01-2013
 * @version 0.2
 * @author Oscar Andersson
 */

#include <SPI.h>
#include <RFID.h>
#include <LiquidCrystal.h>

#define SS_PIN 10
#define RST_PIN 9

RFID rfid(SS_PIN, RST_PIN); 

LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

// Setup variables:
int serNum0;
int serNum1;
int serNum2;
int serNum3;
int serNum4;
int AserNum0;
int AserNum1;
int AserNum2;
int AserNum3;
int AserNum4;

void setup()
{ 
  Serial.begin(9600);
  lcd.begin(16, 2);
  SPI.begin(); 
  rfid.init();
  //Message on boot
  lcd.setCursor(0, 0);
  lcd.print("RFID Reader");
  lcd.setCursor(0, 1);
  lcd.print("By Ogglas");

  delay(5000);
  // write "Scan your tags"
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Scan your tags");
}

void loop()
{
  if (rfid.isCard()) {
    if (rfid.readCardSerial()) {
      if (rfid.serNum[0] != serNum0
        && rfid.serNum[1] != serNum1
        && rfid.serNum[2] != serNum2
        && rfid.serNum[3] != serNum3
        && rfid.serNum[4] != serNum4
        ) {
        /* With a new cardnumber, show it in Serial Monitor. */

        Serial.println(" ");
        Serial.println("Card found");
        serNum0 = rfid.serNum[0];
        serNum1 = rfid.serNum[1];
        serNum2 = rfid.serNum[2];
        serNum3 = rfid.serNum[3];
        serNum4 = rfid.serNum[4];

        AserNum0 = rfid.AserNum[0];
        AserNum1 = rfid.AserNum[1];
        AserNum2 = rfid.AserNum[2];
        AserNum3 = rfid.AserNum[3];
        AserNum4 = rfid.AserNum[4];

        //Serial.println(" ");
        Serial.println("Cardnumber:");
        Serial.print("Dec: ");
        Serial.print(rfid.serNum[0],DEC);
        Serial.print(", ");
        Serial.print(rfid.serNum[1],DEC);
        Serial.print(", ");
        Serial.print(rfid.serNum[2],DEC);
        Serial.print(", ");
        Serial.print(rfid.serNum[3],DEC);
        Serial.print(", ");
        Serial.print(rfid.serNum[4],DEC);
        Serial.println(" ");

        Serial.print("Hex: ");
        Serial.print(rfid.serNum[0],HEX);
        Serial.print(", ");
        Serial.print(rfid.serNum[1],HEX);
        Serial.print(", ");
        Serial.print(rfid.serNum[2],HEX);
        Serial.print(", ");
        Serial.print(rfid.serNum[3],HEX);
        Serial.print(", ");
        Serial.print(rfid.serNum[4],HEX);
        Serial.println(" ");

        Serial.println("Asernumber:");
        Serial.print("Dec: ");
        Serial.print(rfid.AserNum[0],DEC);
        Serial.print(", ");
        Serial.print(rfid.AserNum[1],DEC);
        Serial.print(", ");
        Serial.print(rfid.AserNum[2],DEC);
        Serial.print(", ");
        Serial.print(rfid.AserNum[3],DEC);
        Serial.print(", ");
        Serial.print(rfid.AserNum[4],DEC);
        Serial.println(" ");
        //Print specific RFID-cards too LCD
        if (rfid.serNum[0] == 182
          && rfid.serNum[1] == 158
          && rfid.serNum[2] == 174
          && rfid.serNum[3] == 128
          && rfid.serNum[4] == 6)
        {
          lcd.clear();
          lcd.setCursor(0, 0);
          lcd.print("SL Access card");
          lcd.setCursor(0, 1);
          lcd.print("SN: 21589 27542");
        }
        else if (rfid.serNum[0] == 136
          && rfid.serNum[1] == 4
          && rfid.serNum[2] == 229
          && rfid.serNum[3] == 39
          && rfid.serNum[4] == 78)
        {
          lcd.clear();
          lcd.setCursor(0, 0);
          lcd.print("NBN Jeans SN:000");
          lcd.setCursor(0, 1);
          lcd.print("Size 29/32");
        }
        else if (rfid.serNum[0] == 77
          && rfid.serNum[1] == 139
          && rfid.serNum[2] == 94
          && rfid.serNum[3] == 124
          && rfid.serNum[4] == 228)
        {
          lcd.clear();
          lcd.setCursor(0, 0);
          lcd.print("RFID Keycard");
          lcd.setCursor(0, 1);
          lcd.print(" ");
        }

        else if (rfid.serNum[0] == 136
          && rfid.serNum[1] == 4
          && rfid.serNum[2] == 60
          && rfid.serNum[3] == 66
          && rfid.serNum[4] == 242)
        {
          lcd.clear();
          lcd.setCursor(0, 0);
          lcd.print("NBN Jeans SN:000");
          lcd.setCursor(0, 1);
          lcd.print("Size 29/32");
        }
        else
        {
          //Write unidentified tag and HEX serialnumber for the unidentified tags.
          lcd.clear();                
          lcd.setCursor(0, 0);
          lcd.print("Unidentified tag");
          lcd.setCursor(0,1);
          lcd.print("H:");
          lcd.print(rfid.serNum[0], HEX);
          lcd.print(',');
          lcd.print(rfid.serNum[1], HEX);
          lcd.print(',');
          lcd.print(rfid.serNum[2], HEX);
          lcd.print(',');
          lcd.print(rfid.serNum[3], HEX);
          lcd.print(',');
          lcd.print(rfid.serNum[4], HEX); 
        }

      } 
      else {

      }
    }
  }

  rfid.halt();
}
