how do i solve this?
Code: Select all
byte namecheckerloadReady = 1;
byte namecheckerReady = 0;
byte writerReady = 0;
byte linecheckerReady = 0;
byte linenumbersetReady = 0;
byte clearerReady = 0;
byte linenumbersetdirty = 0;
byte printerReady = 0;
byte readerReady = 1;
int freeline = 0;
int linetoclear = 0;
int nextlinenumber = 0;
const byte entryCount = 17;
const byte entrySize = 19;
char inData[entryCount][entrySize];
const byte MAX_INPUT_LENGTH = 16;
char namecheck[MAX_INPUT_LENGTH+1];
char lineholder[MAX_INPUT_LENGTH+1];
byte namecheckindex = 0;
char inChar;
byte index = 0;
byte linenumber = 0;
byte queuenumber = 0;
#include <Mifare.h>
#include <NDEF.h>
#include <Wire.h>
#include <PN532_I2C.h>
#define IRQ 2
#define RESET 3
#define PAYLOAD_SIZE 224
PN532 * board = new PN532_I2C(IRQ, RESET);
Mifare mifare;
//init keys for reading classic
uint8_t Mifare::useKey = KEY_A;
uint8_t Mifare::keyA[6] = {
0xD3, 0xF7, 0xD3, 0xF7, 0xD3, 0xF7 };
uint8_t Mifare::keyB[6] = {
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
uint32_t Mifare::cardType = 0; //will get overwritten if it finds a different card
uint8_t payload[PAYLOAD_SIZE] = {
};
void setup() {
Serial.begin(115200);
board->begin();
uint32_t versiondata = board->getFirmwareVersion();
if (! versiondata) {
Serial.println("err");
while (1); // halt
}
if(mifare.SAMConfig()){
Serial.println("ok");
}
else{
Serial.println("err");
}
}
void writer()
{
// delay(1000);
// Serial.println("starting writer");
// Serial.println("inside writer");
// Serial.println(index);
// Serial.print("linenumber: ");
// Serial.println(linenumber);
if ((linenumber<entryCount) && (index < entrySize))
{
for(byte i = 0; i < entrySize; i++)
{
inChar = namecheck[i]; //read from Serial
if (inChar == 0 ) // if character is the enter key
{
// Serial.println("Writing");
inData[linenumber][index] = 0; // trailing null
// Serial.print("have written ");
// Serial.print(inData[linenumber]); // show received line
// Serial.print(" to line: ");
// Serial.println(linenumber);
index = 0;
writerReady = 0;
namecheckerloadReady = 1;
linenumber++;
printer();
clearerReady = 1;
linenumbersetdirty = 0;
linenumberset();
writerReady = 1;
break;
}
else
{
// Serial.println(index);
inData[linenumber][index] = inChar; //store it in inData
index++; //make ready for next time - Next array "downwards"
}
}
}
}
void queuefix()
{
// Serial.println("Starting queuefix");
for (byte i = linetoclear; i < entryCount; i++)
{
index = 0;
if(inData[i][0] == 0)
{
break;
}
do
{
inData[i][index] = inData[i+1][index];
index ++;
}
while (inData[i+1][index] != 0);
// Serial.print("moving ");
// Serial.println(lineholder[i]);
}
printerReady = 1;
}
void linenumberset()
{
// Serial.println("Running linenumberset");
for(byte i = 0; i < entryCount; i++)
{
if(strlen(inData[i]) == 0) // check if the length of the string is 0
{
if(linenumbersetdirty == 0)
{
linenumber = i;
}
linenumbersetdirty = 1;
// // Serial.print("free line at ");
// // Serial.println(i);
}
if(i == (entryCount-1))
{
// Serial.println("linenumberset done");
linenumbersetReady = 0;
inChar = 0;
printer();
break;
}
}
// Serial.print("freeline = ");
// Serial.println(linenumber);
linenumbersetdirty = 1;
}
void namechecker()
{
// Serial.println("Running namechecker");
delay(1000);
// Serial.print("name to look for: ");
// Serial.println(namecheck);
for(byte i = 0; i < entryCount; i++)
{
if(strcmp(inData[i], namecheck) == 0)
{
// Serial.print("name found: ");
// Serial.println(inData[i]);
linetoclear = i;
// Serial.print("is already here at position ");
// Serial.println(i);
// Serial.println("clearer line");
inData[i][0] = 0;
// Serial.print("name cleared: ");
// Serial.println(inData[i]);
index = 0;
queuefix();
linenumbersetdirty = 0;
linenumberset();
writerReady = 0; // don't needed, I believe (LS)
namecheckerloadReady = 1;
linecheckerReady = 1;
readerReady = 1;
break;
}
else
{
writerReady = 1;
index = 0;
}
}
// Serial.println("Exiting namechecker");
namecheckerReady = 0; // repeated (LS)
index = 0;
}
void printer()
{
Serial.write(27); // ESC command
Serial.print("[2J"); // clear screen command
Serial.write(27);
Serial.print("[H"); // cursor to home command
// Serial.println("Starting printer");
for(byte i = 0; i < entryCount; i++)
{
if (inData[i][0] != 0)
{
Serial.println(inData[i]);
}
}
printerReady = 0;
index = 0;
}
void reader()
{
// Serial.println("Reader Ready");
uint8_t * uid = mifare.readTarget();
if(uid){
memset(payload, 0, PAYLOAD_SIZE);
mifare.readPayload(payload, PAYLOAD_SIZE);
FOUND_MESSAGE m = NDEF().decode_message(payload);
// Serial.print("readeren recieved: ");
Serial.println((char*)m.payload);
do
{
inChar = m.payload[index]; //read from Serial //inChar is set to payload[index]. payload being the array holding the NFC readers data
namecheck[namecheckindex] = inChar; //store it in inData
namecheckindex++; //make ready for next time - Next array "downwards"
// Serial.println(index);
index++;
}
while (inChar != 13);
namecheck[namecheckindex] = 0; // trailing null
// Serial.print("namecheck has "); // show received line
// Serial.println(namecheck);
namecheckindex=0;
namecheckerReady = 1;
namecheckerloadReady = 0;
readerReady = 0; // H E R E i s a b e t t e r p l a c e
index = 0;
delay(100);
}
delay(2000);
}
void loop() {
if (readerReady == 1)
{
reader();
namecheckerloadReady = 1;
}
if (namecheckerReady == 1)
{
namechecker();
}
// if( printerReady == 1)
// {
// Serial.println("printer should start");
// printer();
// }
if (writerReady == 1)
{
writer();
}
if (linenumbersetReady == 1)
{
nextlinenumber = 30;
index = 0;
linenumberset();
linenumbersetdirty = 1;
}
if (clearerReady == 1)
{
clearerReady = 0;
readerReady = 1;
index = 0;
}
}
if i remove the tag too early, the busy light turns off, and after like 1 second, it restarts, printing the "ok" line.
i need it to just start "reader()" again, instead of the whole arduino restarting. how would i fix this? i have tried to fix it for very long now. :/