Clean up and simplify code, write output as keyboard

This commit is contained in:
Adam Goldsmith 2020-03-28 16:09:35 -04:00
parent 2251196114
commit df2210bf4d

View File

@ -1,4 +1,4 @@
/* /* Based on:
* HID RFID Reader Wiegand Interface for Arduino Uno * HID RFID Reader Wiegand Interface for Arduino Uno
* Originally by Daniel Smith, 2012.01.30 -- http://www.pagemac.com/projects/rfid/arduino_wiegand * Originally by Daniel Smith, 2012.01.30 -- http://www.pagemac.com/projects/rfid/arduino_wiegand
* *
@ -6,59 +6,54 @@
* See https://obviate.io/?p=7470 for more details & instructions * See https://obviate.io/?p=7470 for more details & instructions
*/ */
#include <limits.h>
#include <Keyboard.h>
// LED pins
#define LED_GREEN 11;
#define LED_RED 12;
#define BEEP_BEEP 10;
#define MAX_BITS 100 // max number of bits
#define WEIGAND_WAIT_TIME 3000 // time to wait for another weigand pulse. #define WEIGAND_WAIT_TIME 3000 // time to wait for another weigand pulse.
unsigned char databits[MAX_BITS]; // stores all of the data bits #define DATA_SIZE 32
unsigned char bitCount; // number of bits currently captured volatile uint32_t dataBits = 0; // stores all of the data bits
unsigned char flagDone; // goes low when data is currently being captured volatile size_t bitCount = 0; // number of bits recieved
unsigned int weigand_counter; // countdown until we assume there are no more bits
unsigned long facilityCode=0; // decoded facility code volatile unsigned char flagDone; // goes low when data is currently being captured
unsigned long cardCode=0; // decoded card code volatile unsigned int weigand_counter; // countdown until we assume there are no more bits
int LED_GREEN = 11; inline void gotBit() {
int LED_RED = 12;
int BEEP_BEEP = 10;
// interrupt that happens when INTO goes low (0 bit)
void ISR_INT0() {
//Serial.print("0"); // uncomment this line to display raw binary
bitCount++; bitCount++;
flagDone = 0; flagDone = 0;
weigand_counter = WEIGAND_WAIT_TIME; weigand_counter = WEIGAND_WAIT_TIME;
}
// interrupt that happens when INTO goes low (0 bit)
void ISR_INT0() {
//Serial.print("0");
dataBits &= ~(1UL << (DATA_SIZE - bitCount));
gotBit();
} }
// interrupt that happens when INT1 goes low (1 bit) // interrupt that happens when INT1 goes low (1 bit)
void ISR_INT1() { void ISR_INT1() {
//Serial.print("1"); // uncomment this line to display raw binary //Serial.print("1");
databits[bitCount] = 1; dataBits |= 1UL << (DATA_SIZE - bitCount);
bitCount++; gotBit();
flagDone = 0;
weigand_counter = WEIGAND_WAIT_TIME;
} }
void setup() { void setup() {
pinMode(LED_RED, OUTPUT);
pinMode(LED_GREEN, OUTPUT);
pinMode(BEEP_BEEP, OUTPUT);
digitalWrite(LED_RED, HIGH); // High = Off
digitalWrite(BEEP_BEEP, HIGH); // High = off
digitalWrite(LED_GREEN, LOW); // Low = On
pinMode(2, INPUT); // DATA0 (INT0) pinMode(2, INPUT); // DATA0 (INT0)
pinMode(3, INPUT); // DATA1 (INT1) pinMode(3, INPUT); // DATA1 (INT1)
Serial.begin(9600); Serial.begin(9600);
Serial.println("RFID Readers");
// binds the ISR functions to the falling edge of INTO and INT1
attachInterrupt(0, ISR_INT0, FALLING); attachInterrupt(0, ISR_INT0, FALLING);
attachInterrupt(1, ISR_INT1, FALLING); attachInterrupt(1, ISR_INT1, FALLING);
weigand_counter = WEIGAND_WAIT_TIME; weigand_counter = WEIGAND_WAIT_TIME;
Keyboard.begin();
} }
void loop() void loop()
@ -72,82 +67,39 @@ void loop()
// if we have bits and we the weigand counter went out // if we have bits and we the weigand counter went out
if (bitCount > 0 && flagDone) { if (bitCount > 0 && flagDone) {
unsigned char i; unsigned char i;
uint32_t data = dataBits >> (DATA_SIZE - bitCount + 1);
Serial.print("Read "); Serial.print("Read ");
Serial.print(bitCount); Serial.print(bitCount);
Serial.print(" bits. "); Serial.print(" bits: ");
Serial.println(data, BIN);
if (bitCount == 35) { // standard 26 bit format:
// 35 bit HID Corporate 1000 format // P: parity bit, F: facility code, C: card code
// facility code = bits 2 to 14 // PFFFFFFFFCCCCCCCCCCCCCCCCP
for (i=2; i<14; i++) { if (bitCount == 26) {
facilityCode <<=1; uint8_t facilityCode = (data >> 17);
facilityCode |= databits[i]; uint16_t cardCode = (data >> 1);
} // TODO: check parity bits
// card code = bits 15 to 34 Keyboard.print(facilityCode);
for (i=14; i<34; i++) { Keyboard.print('\t');
cardCode <<=1; Keyboard.print(cardCode);
cardCode |= databits[i]; Keyboard.print('\n');
} printBits(facilityCode, cardCode);
printBits();
}
else if (bitCount == 26) {
// standard 26 bit format
// facility code = bits 2 to 9
for (i=1; i<9; i++) {
facilityCode <<=1;
facilityCode |= databits[i];
}
// card code = bits 10 to 23
for (i=9; i<25; i++) {
cardCode <<=1;
cardCode |= databits[i];
}
printBits();
} }
else { else {
// you can add other formats if you want! // TODO: handle failures and other formats
// Serial.println("Unable to decode.");
} }
// cleanup and get ready for the next card // reset for the next card
bitCount = 0; bitCount = 0;
facilityCode = 0;
cardCode = 0;
for (i=0; i<MAX_BITS; i++)
{
databits[i] = 0;
}
} }
} }
void printBits() { void printBits(uint8_t facilityCode, uint16_t cardCode) {
Serial.print("FC = "); Serial.print("FC = ");
Serial.print(facilityCode); Serial.print(facilityCode);
Serial.print(", CC = "); Serial.print(", CC = ");
Serial.println(cardCode); Serial.println(cardCode);
// Now lets play with some LED's for fun:
digitalWrite(LED_RED, LOW); // Red
if(cardCode == 12345){
// If this one "bad" card, turn off green
// so it's just red. Otherwise you get orange-ish
digitalWrite(LED_GREEN, HIGH);
}
delay(500);
digitalWrite(LED_RED, HIGH); // Red Off
digitalWrite(LED_GREEN, LOW); // Green back on
// Lets be annoying and beep more
digitalWrite(BEEP_BEEP, LOW);
delay(500);
digitalWrite(BEEP_BEEP, HIGH);
delay(500);
digitalWrite(BEEP_BEEP, LOW);
delay(500);
digitalWrite(BEEP_BEEP, HIGH);
} }