Help with expansion of RFID project

Hello all,
New to this forum and the Arduino scene. It's been many, many years since I've tinkered with electronics at this level as well as programming - its quite refreshing!

So I've decided to take on an RFID project - seemed simple at first but has grown in scope. I have based my original sketch on the lovely tutorial at Instructables, and with minor tweaking , have gotten the project off the ground.
I now need to add a timer and simplify the RFID tag logic.

The overall idea for the project:
An RFID reader waits in a ready state, green LED lit.
A tag is read (TagNew), a timer starts (30 seconds), red LED is lit.
If another tag is read (TagOld) during the 30 seconds, the RFID reader "ignores" the tag, triggers an LED blink sequence.
If the original tag (TagNew) is read again during the 30 seconds, the timer will reset, retain red LED.
After the 30 seconds expires, the original tag (TagNew) information is disregarded, and the green LED is lit, ready for another Tag swipe.
If during any of these cases, an "override" tag is read (specific tag id value, hardcoded), all tag and timer information is flushed and the reader returns to a "ready" state, with green LED lit.

Here are the formal use cases I need to target:
Case 1:
LED green, ready state
Card 1 swipe, LED action from Green (available) to Red (unavalaible).
LED blink scheme called (unlock())
Timer starts.
Case 2:
Card 1 swipe, LED action from Green (available) to Red (unavalaible).
LED blink scheme called.
Timer starts.
Card 2 wwipe, timer is active (true), LED blink scheme called, LED action to Red (unavailable).
Timer continues.
Case 3:
Card 1 swipe, LED action from Green (available) to Red (unavalaible).
LED blink scheme called.
Timer starts.
Timer expires (false)
LED blink scheme.
LED action to green.
Case 4:
Card 1 swipe, LED action from Green (available) to Red (unavalaible).
LED blink scheme called.
Timer starts.
Card 2 swipe, timer is active (true), LED blink scheme called, LED action to Red (unavailable).
Timer continues.
Card "Master" swipe (reset all states)
LED blink scheme called.
Timer canceled.
LED action to green.

I am looking for guidance on how to implemented the timer and tag functions in my current sketch. I am still learning the behavior of the arduino (loops, setup detail, etc..).
Any help is appreciated and thank you in advance!
Nick

Current sketch:

/**
* RFID Access Control
*/

// Set up the serial connection to the RFID reader module. In order to
// keep the Arduino TX and RX pins free for communication with a host,
// the sketch uses the SoftwareSerial library to implement serial
// communications on other pins.
#include <SoftwareSerial.h>
#include <SimpleTimer.h>

// The RFID module's TX pin needs to be connected to the Arduino.
#define rxPin 4
#define txPin 5

// Create a software serial object for the connection to the RFID module
SoftwareSerial rfid = SoftwareSerial( rxPin, txPin );

// Set up outputs
#define ledPin12 12 //RED
#define ledPin11 11 //GREEN

// Specify how long the output should be held.
//#define unlockSeconds 2

// Define tags
//int TagNew
//int TagOld
//int TagMaster

// The tag database consists of two parts. The first part is an array of
// tag values with each tag taking up 5 bytes. The second is a list of
// names with one name for each tag (ie: group of 5 bytes). You can expand
// or shrink this as you see fit. Tags 2 and 3 are only there for example.
char* allowedTags[] =
{
	"750048414E", // Tag ID 1
	"6A0049DC1B", // Tag ID 2
	"ABC123DE45", // Tag ID 3
};

// List of names to associate with the matching tag IDs
char* tagName[] =
{
	"Tag1", // Tag ID 1
	"Tag2", // Tag ID 2
	"Tag3", // Tag ID 3
};

// Check the number of tags defined
int numberOfTags = sizeof(allowedTags)/sizeof(allowedTags[0]);
int incomingByte = 0; // To store incoming serial data

/**
* Setup
*/
void setup() 
{

        pinMode(ledPin12, OUTPUT);
        digitalWrite(ledPin12, LOW);
        pinMode(ledPin11, OUTPUT);
        digitalWrite(ledPin11, LOW);

	Serial.begin(9600); // Serial port for connection to host
	rfid.begin(9600); // Serial port for connection to RFID module
	Serial.println("RFID Reader Initialized");
}

/**
* Loop
*/
void loop() {
	byte i = 0;
	byte val = 0;
	byte checksum = 0;
	byte bytesRead = 0;
	byte tempByte = 0;
	byte tagBytes[6]; // "Unique" tags are only 5 bytes but we need an extra byte for the checksum
	char tagValue[10];

        // From start, LED set to GREEN
        digitalWrite(ledPin11, HIGH);
        
	// Read from the RFID module. Because this connection uses SoftwareSerial
	// there is no equivalent to the Serial.available() function, so at this
	// point the program blocks while waiting for a value from the module
	if(rfid.available() > 0) {
		if((val = rfid.read()) == 2) { // Check for header
			bytesRead = 0;
			while (bytesRead < 12) { // Read 10 digit code + 2 digit checksum
				if(rfid.available() > 0) {
					val = rfid.read();

					// Append the first 10 bytes (0 to 9) to the raw tag value
					if (bytesRead < 10)
					{
						tagValue[bytesRead] = val;
					}

					// Check if this is a header or stop byte before the 10 digit reading is complete
					if((val == 0x0D)||(val == 0x0A)||(val == 0x03)||(val == 0x02)) {
						break; // Stop reading
					}

					// Ascii/Hex conversion:
					if ((val >= '0') && (val <= '9')) {
						val = val - '0';
					}
					else if ((val >= 'A') && (val <= 'F')) {
						val = 10 + val - 'A';
					}

					// Every two hex-digits, add a byte to the code:
					if (bytesRead & 1 == 1) {

						// Make space for this hex-digit by shifting the previous digit 4 bits to the left
						tagBytes[bytesRead >> 1] = (val | (tempByte << 4));
						if (bytesRead >> 1 != 5) { // If we're at the checksum byte,
							checksum ^= tagBytes[bytesRead >> 1]; // Calculate the checksum... (XOR)
						};
					} else {
						tempByte = val; // Store the first hex digit first
					};
					bytesRead++;
				} // Ready to read next digit
			}

			// Send the result to the host connected via USB
			if (bytesRead == 12) { // 12 digit read is complete
				tagValue[10] = '\0'; // Null-terminate the string
				Serial.print("Tag read: ");
				for (i=0; i<5; i++) {

					// Add a leading 0 to pad out values below 16
					if (tagBytes[i] < 16) {
						Serial.print("0");
					}
					Serial.print(tagBytes[i], HEX);
				}
				Serial.println();
				Serial.print("Checksum: ");
				Serial.print(tagBytes[5], HEX);
				Serial.println(tagBytes[5] == checksum ? " -- passed." : " -- error.");

				// Show the raw tag value
				Serial.print("VALUE: ");
				Serial.println(tagValue);

				// Search the tag database for this particular tag
				int tagId = findTag( tagValue );

				// Only unlock if this tag was found in the database
				if( tagId > 0 )
				{
					Serial.print("Authorized tag ID ");
					Serial.print(tagId);
					Serial.print(": unlocking for ");
					Serial.println(tagName[tagId - 1]); // Get the name for this tag from the database

					unlock(); // call unlock function
				} else {
					Serial.println("Tag not authorized");
				}
				Serial.println(); // Blank separator line in output
			}
			bytesRead = 0;
		}
	}
}

/**
* Unlock function
*/
void unlock() {
digitalWrite(ledPin12, HIGH);
delay(125);
digitalWrite(ledPin12, LOW);
delay(125);
digitalWrite(ledPin11, HIGH);
delay(125);
digitalWrite(ledPin11, LOW);
delay(125);
digitalWrite(ledPin12, HIGH);
delay(125);
digitalWrite(ledPin12, LOW);
delay(125);
digitalWrite(ledPin11, HIGH);
delay(125);
digitalWrite(ledPin11, LOW);
delay(125);
digitalWrite(ledPin12, HIGH);
delay(125);
digitalWrite(ledPin12, LOW);
delay(125);
digitalWrite(ledPin11, HIGH);
delay(125);
digitalWrite(ledPin11, LOW);
}

/**
* Search for a specific tag in the database
*/
int findTag( char tagValue[10] ) {
	for (int thisCard = 0; thisCard < numberOfTags; thisCard++) {
		// Check if the tag value matches this row in the tag database
		if(strcmp(tagValue, allowedTags[thisCard]) == 0)
		{
			// The row in the database starts at 0, so add 1 to the result so
			// that the card ID starts from 1 instead (0 represents "no match")
			return(thisCard + 1);
		}
	}
	// If we don't find the tag return a tag ID of 0 to show there was no match
	return(0);
}

In order to do what you propose, you need to highlight the code in unlock(), and delete it. During delay(), nothing else happens.

You'll need to read, understand, and embrace the blink without delay example, and do some research on state machines.

Thank you for the direction. Appreciate it.

Nick