ac-real-io/acrealio/SL015M.cpp

133 lines
3.4 KiB
C++
Raw Permalink Normal View History

2013-09-07 10:46:05 -04:00
#include "Arduino.h"
#include "SL015M.h"
SL015M::SL015M()
{
2017-01-25 15:59:19 -05:00
card = 0;
rfcmdsent = false;
rf_i = 0;
pinset = false;
readcmd = false;
2013-09-07 10:46:05 -04:00
}
void SL015M::setPins(int sensor, HardwareSerial* serialid)
{
rfSENSOR = sensor;
rfSerial = serialid;
2017-01-25 15:59:19 -05:00
2013-09-07 10:46:05 -04:00
pinMode(rfSENSOR,INPUT); // Rfid sensor
rfSerial->begin(RFID_BAUD);
2017-01-25 15:59:19 -05:00
2013-09-07 10:46:05 -04:00
pinset=true;
}
void SL015M::update()
{
2017-01-25 15:59:19 -05:00
if (!pinset)
return;
if (!readcmd)
return;
if (digitalRead(rfSENSOR)==LOW) // card presence
2013-09-07 10:46:05 -04:00
{
2017-01-25 15:59:19 -05:00
if (!rfcmdsent)
2013-09-07 10:46:05 -04:00
{
2017-01-25 15:59:19 -05:00
rfSerial->write(0xBA); // pream
rfSerial->write(0x02); // size
rfSerial->write(0x31); // rfidcommand: get tag info
rfSerial->write(0xBA ^ 0x02 ^ 0x31); // checksum
rf_i = 0;
rfcmdsent= true;
timesent = millis();
2013-09-07 10:46:05 -04:00
}
else // if command has been sent, let's read answer
{
2017-01-25 15:59:19 -05:00
if (rfSerial->available()>0)
2013-09-07 10:46:05 -04:00
{
2017-01-25 15:59:19 -05:00
rfidp[rf_i] = rfSerial->read();
rf_i++;
if (rfidp[0] != 0xBD) // restart filling buffer from begining until received byte is 0xBD (preamb)
rf_i = 0;
if (rf_i>2) // if we know paquet length
2013-09-07 10:46:05 -04:00
{
2017-01-25 15:59:19 -05:00
byte length = rfidp[1];
if (rf_i >= length + 2) // if paquet complete
2013-09-07 10:46:05 -04:00
{
2017-01-25 15:59:19 -05:00
// checksum check
byte chk = 0x00;
for (int i=0;i< length+1;i++)
chk ^= rfidp[i];
if (chk != rfidp[length+1])
{
rfcmdsent = false; // checksum error, send cmd again
}
else
{
if (rfidp[3]!=0x00) // Operation not succeeded
{
rfcmdsent = false; // error, send again
}
else
{
//success, let's copy the uid
for (int i=0;i<8;i++)
{
uid[i] = rfidp[11-i];
}
if (uid[0] == 0xE0 && uid[1] == 0x04) // if correct konami card
card = 1;
else
card = 0;
readcmd = false;//reading finished (card found)
}
}
2013-09-07 10:46:05 -04:00
}
}
}
2017-01-25 15:59:19 -05:00
else
{
// command sent, but nothing to receive
if (millis() - timesent >500) // if last command was sent more than 500ms ago, send a new one
rfcmdsent = false;
}
2013-09-07 10:46:05 -04:00
}
}
else // if no tag in range
{
card = 0;
2013-09-07 10:46:05 -04:00
rfcmdsent = false;
readcmd = false;//reading finished (no card found)
}
}
byte SL015M::isCardPresent()
2013-09-07 10:46:05 -04:00
{
2017-01-25 15:59:19 -05:00
return card;
2013-09-07 10:46:05 -04:00
}
void SL015M::read()
{
2017-01-25 15:59:19 -05:00
readcmd=true;
2013-09-07 10:46:05 -04:00
}
void SL015M::getUID(byte* uida)
{
2017-01-25 15:59:19 -05:00
memcpy(uida,uid,8);
2013-09-07 10:46:05 -04:00
}
2017-01-25 15:59:19 -05:00