diff --git a/hidReader.ino b/hidReader.ino index c517f3e..115097a 100644 --- a/hidReader.ino +++ b/hidReader.ino @@ -1,153 +1,105 @@ -/* +/* Based on: * HID RFID Reader Wiegand Interface for Arduino Uno * Originally by Daniel Smith, 2012.01.30 -- http://www.pagemac.com/projects/rfid/arduino_wiegand - * + * * Updated 2016-11-23 by Jon "ShakataGaNai" Davis. * See https://obviate.io/?p=7470 for more details & instructions -*/ - - -#define MAX_BITS 100 // max number of bits -#define WEIGAND_WAIT_TIME 3000 // time to wait for another weigand pulse. - -unsigned char databits[MAX_BITS]; // stores all of the data bits -unsigned char bitCount; // number of bits currently captured -unsigned char flagDone; // goes low when data is currently being captured -unsigned int weigand_counter; // countdown until we assume there are no more bits - -unsigned long facilityCode=0; // decoded facility code -unsigned long cardCode=0; // decoded card code + */ -int LED_GREEN = 11; -int LED_RED = 12; -int BEEP_BEEP = 10; +#include +#include + +// LED pins +#define LED_GREEN 11; +#define LED_RED 12; +#define BEEP_BEEP 10; + +#define WEIGAND_WAIT_TIME 3000 // time to wait for another weigand pulse. + +#define DATA_SIZE 32 +volatile uint32_t dataBits = 0; // stores all of the data bits +volatile size_t bitCount = 0; // number of bits recieved + +volatile unsigned char flagDone; // goes low when data is currently being captured +volatile unsigned int weigand_counter; // countdown until we assume there are no more bits + +inline void gotBit() { + bitCount++; + flagDone = 0; + weigand_counter = WEIGAND_WAIT_TIME; +} // interrupt that happens when INTO goes low (0 bit) void ISR_INT0() { - //Serial.print("0"); // uncomment this line to display raw binary - bitCount++; - flagDone = 0; - weigand_counter = WEIGAND_WAIT_TIME; - + //Serial.print("0"); + dataBits &= ~(1UL << (DATA_SIZE - bitCount)); + gotBit(); } - + // interrupt that happens when INT1 goes low (1 bit) void ISR_INT1() { - //Serial.print("1"); // uncomment this line to display raw binary - databits[bitCount] = 1; - bitCount++; - flagDone = 0; - weigand_counter = WEIGAND_WAIT_TIME; + //Serial.print("1"); + dataBits |= 1UL << (DATA_SIZE - bitCount); + gotBit(); } - + 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(3, INPUT); // DATA1 (INT1) - + pinMode(2, INPUT); // DATA0 (INT0) + pinMode(3, INPUT); // DATA1 (INT1) + 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); - - + weigand_counter = WEIGAND_WAIT_TIME; + Keyboard.begin(); } - + void loop() { // This waits to make sure that there have been no more data pulses before processing data if (!flagDone) { if (--weigand_counter == 0) - flagDone = 1; + flagDone = 1; } - + // if we have bits and we the weigand counter went out if (bitCount > 0 && flagDone) { unsigned char i; - + uint32_t data = dataBits >> (DATA_SIZE - bitCount + 1); + Serial.print("Read "); Serial.print(bitCount); - Serial.print(" bits. "); - - if (bitCount == 35) { - // 35 bit HID Corporate 1000 format - // facility code = bits 2 to 14 - for (i=2; i<14; i++) { - facilityCode <<=1; - facilityCode |= databits[i]; - } - - // card code = bits 15 to 34 - for (i=14; i<34; i++) { - cardCode <<=1; - cardCode |= databits[i]; - } - - 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(); + Serial.print(" bits: "); + Serial.println(data, BIN); + + // standard 26 bit format: + // P: parity bit, F: facility code, C: card code + // PFFFFFFFFCCCCCCCCCCCCCCCCP + if (bitCount == 26) { + uint8_t facilityCode = (data >> 17); + uint16_t cardCode = (data >> 1); + // TODO: check parity bits + + Keyboard.print(facilityCode); + Keyboard.print('\t'); + Keyboard.print(cardCode); + Keyboard.print('\n'); + printBits(facilityCode, cardCode); } else { - // you can add other formats if you want! - // Serial.println("Unable to decode."); + // TODO: handle failures and other formats } - - // cleanup and get ready for the next card - bitCount = 0; - facilityCode = 0; - cardCode = 0; - for (i=0; i