Skip to content

Commit

Permalink
1.2.0
Browse files Browse the repository at this point in the history
Added support for keyboard.
  • Loading branch information
jvondrus committed Jul 26, 2020
1 parent 745c347 commit ea7c231
Show file tree
Hide file tree
Showing 7 changed files with 209 additions and 30 deletions.
42 changes: 40 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ Library is made for Arduino IDE and for Arduinos, ESP32 and ESP8266.

* Service is "waiting on backgroud" and it's fired by interupts
* _Data_ and _Status_ are served by event _(callback)_ function, it's not required function at _loop_
* _Data_ is formated as 3Byte number _(unsigned long)_
* _Key_ is formated as 1Byte number _(unsigned short int / Byte)_
* _Code_ and _Data_ is formated as 3Byte number _(unsigned long)_
* _Status_ id formated as 1Byte number _(unsigned short int / Byte)_
* _Status_ data can be triggered manually

Expand All @@ -21,6 +22,8 @@ Library is made for Arduino IDE and for Arduinos, ESP32 and ESP8266.

* 1.0.0 - Initial release
* 1.1.0 - Swapping read Bytes of serial number for correct show
* 1.2.0 - Swapping readed Bytes is optional (non-swap data (125kH readers), swap data (some 13.56MHz readers))
* 2.0.0 - Support for Wiegand keyboard with 8bits protocol

## Using

Expand Down Expand Up @@ -61,11 +64,15 @@ void setup()
delay (1000);

// Wiegand RFID
wiegand.onKey (wiegandKey); // Function for handle with key
wiegand.onCode (wiegandCode); // Function for handle with code
wiegand.onData (wiegandData); // Function for handle with data
wiegand.onState (wiegandState); // Function for handle with status
wiegand.begin(wiegandD0, wiegandD1, true);
wiegand.begin(wiegandD0, wiegandD1, true, false);
// Data0 Data1 false == Send state only on change
// true == Send state on each data reading
// false == non-swap data (125kH readers)
// true == swap data (some 13.56MHz readers)

// Interrupt for Wiegand data pin
attachInterrupt(digitalPinToInterrupt(wiegandD0), wiegandPinChanged, FALLING);
Expand Down Expand Up @@ -113,6 +120,37 @@ void wiegandState (uint8_t state) {

}

// Print received Wiegand key
void wiegandKey (uint8_t value) {

Serial.print ("Wiegand26 - Key: 0x");
Serial.println (value, HEX);

Serial.print ("Wiegand26 - Key: 0b");
Serial.println (value, BIN);

Serial.print ("Wiegand26 - Key: ");
Serial.println (value, DEC);

Serial.println ();

}

// Print received Wiegand code
void wiegandCode (unsigned long value) {

Serial.print ("Wiegand26 - Code: 0x");
Serial.println (value, HEX);

Serial.print ("Wiegand26 - Code: 0b");
Serial.println (value, BIN);

Serial.print ("Wiegand26 - Code: ");
Serial.println (value, DEC);

Serial.println ();
}

// Print received Wiegand data
void wiegandData (unsigned long value) {

Expand Down
36 changes: 35 additions & 1 deletion examples/wiegand26/wiegand26.ino
Original file line number Diff line number Diff line change
Expand Up @@ -31,11 +31,15 @@ void setup()
delay (1000);

// Wiegand RFID
wiegand.onKey (wiegandKey);
wiegand.onCode (wiegandCode);
wiegand.onData (wiegandData);
wiegand.onState (wiegandState);
wiegand.begin(wiegandD0, wiegandD1, true);
wiegand.begin(wiegandD0, wiegandD1, true, false);
// Data0 Data1 false == Send state only on change
// true == Send state on each data reading
// false == non-swap data (125kH readers)
// true == swap data (some 13.56MHz readers)

// Interrupt for Wiegand data pin
attachInterrupt(digitalPinToInterrupt(wiegandD0), wiegandPinChanged, FALLING);
Expand Down Expand Up @@ -79,6 +83,36 @@ void wiegandState (uint8_t state) {

}

// Print received Wiegand key
void wiegandKey (uint8_t value) {

Serial.print ("Wiegand26 - Key: 0x");
Serial.println (value, HEX);

Serial.print ("Wiegand26 - Key: 0b");
Serial.println (value, BIN);

Serial.print ("Wiegand26 - Key: ");
Serial.println (value, DEC);

Serial.println ();

}

// Print received Wiegand code
void wiegandCode (unsigned long value) {

Serial.print ("Wiegand26 - Code: 0x");
Serial.println (value, HEX);

Serial.print ("Wiegand26 - Code: 0b");
Serial.println (value, BIN);

Serial.print ("Wiegand26 - Code: ");
Serial.println (value, DEC);

Serial.println ();
}

// Print received Wiegand data
void wiegandData (unsigned long value) {
Expand Down
6 changes: 5 additions & 1 deletion keywords.txt
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,13 @@ Wiegand26 KEYWORD1
begin KEYWORD2
readPin KEYWORD2
check KEYWORD2
onKey KEYWORD2
onCode KEYWORD2
onData KEYWORD2
onState KEYWORD2
reset KEYWORD2
emit KEYWORD2
emitKey KEYWORD2
emitData KEYWORD2

#######################################
# Instances (KEYWORD2)
Expand Down
2 changes: 1 addition & 1 deletion library.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
"type": "git",
"url": "https://github.com/jvondrus/Wiegand26"
},
"version": "1.1.0",
"version": "2.0.0",
"homepage": "https://github.com/jvondrus",
"frameworks": "Arduino",
"examples": [
Expand Down
2 changes: 1 addition & 1 deletion library.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
name=Wiegand26
version=1.1.0
version=2.0.0
author=Jiri Vondrus
maintainer=Jiri Vondrus
sentence=Receiving data from Wiegand26 card readers.
Expand Down
111 changes: 95 additions & 16 deletions src/Wiegand26.cpp
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/*
* Wiegand26
* by Jiri Vondrus (https://github.com/jvondrus)
* Version 1.1.0 06-2020
* Version 2.0.0 07-2020
*/

// Import
Expand All @@ -24,15 +24,42 @@ inline bool readBit (bool* bits, uint8_t bit) {



// Align key (buffer >> value)
inline uint8_t alignKey (bool* bits) {
uint8_t keyA = 0x00;
uint8_t keyB = 0x0F;
uint8_t o = MAX_BITS - KEY_BITS;
uint8_t p = MAX_BITS - ( KEY_BITS / 2 );
for (uint8_t i = o; i < MAX_BITS; i++) {
if (i < p) {
if (bits[i]) {
bitSet (keyA, i-o);
}
} else {
if (bits[i]) {
bitClear (keyB, i-p);
}
}
}
if (keyA != keyB) {
keyA = 0xFF;
}
return keyA;
}



// Align data (buffer >> value)
inline unsigned long alignData (bool* bits) {
inline unsigned long alignData (bool* bits, bool swap) {
unsigned long data = 0;
for (uint8_t i = 1; i < MAX_BITS-1; i++) {
if (bits[i]) {
bitSet (data, (i - 1));
}
}
data = (data & 0x0000FF) << 16 | (data & 0x00FF00) | (data & 0xFF0000) >> 16;
if (swap) {
data = (data & 0x0000FF) << 16 | (data & 0x00FF00) | (data & 0xFF0000) >> 16;
}
return data;
}

Expand All @@ -48,6 +75,7 @@ void Wiegand26::reset () {
// Reset state
_state = 0;
_bitCnt = 0;
_keyCnt = 0;
_timestamp = millis();
_elapsed = 0;

Expand All @@ -63,18 +91,55 @@ void Wiegand26::reset () {

// Send state
if (_first) {
if (funcion_state) {
if (function_state) {
_first = false;
_stateOld = _state;
funcion_state (_state);
function_state (_state);
}
}
}



// Emint Key / Code
void Wiegand26::emitKey () {

// Send key
_key = alignKey (_bitData);
if (_key <= 9) {
_code = _code * 10 + _key;
if (function_key) {
function_key (_key);
bitSet (_state, DATA_SENDED);
}

// Send Code
} else if (_key == KEY_SEND) {
if (_code && _code <= 0xFFFFFF && function_code) {
function_code (_code);
bitSet (_state, DATA_SENDED);
}
_code = 0;
}

// Reset and Send state
if (_key <= 9 || _key == KEY_SEND) {
if (function_state) {
if (_state != _stateOld || _sendState) {
_stateOld = _state;
function_state (_state);
_state = 0;
}
}
reset ();
}

}



// Emint data
void Wiegand26::emit () {
void Wiegand26::emitData () {

// Buffer size error
if (_bitCnt != MAX_BITS) {
Expand All @@ -101,18 +166,19 @@ void Wiegand26::emit () {

// Send data
if (parityFirst == EVEN && paritySecond == ODD) {
if (funcion_data) {
_data = alignData (_bitData);
funcion_data (_data);
if (function_data) {
_data = alignData (_bitData, _swapData);
function_data (_data);
bitSet (_state, DATA_SENDED);
_code = 0;
}
}

// Send state
if (funcion_state) {
if (function_state) {
if (_state != _stateOld || _sendState) {
_stateOld = _state;
funcion_state (_state);
function_state (_state);
_state = 0;
}
}
Expand All @@ -123,9 +189,9 @@ void Wiegand26::emit () {
// Check buffer
void Wiegand26::readState () {
// Send state
if (funcion_state) {
if (function_state) {
_stateOld = _state;
funcion_state (_state);
function_state (_state);
}
}

Expand All @@ -136,11 +202,16 @@ void Wiegand26::timeout () {
// Check timeout
_elapsed = millis() - _timestamp;

// Code
if (_elapsed > TIMEOUTKEY) {
_code = 0;
}

// Send
if (_elapsed > TIMEOUT) {
if (_bitCnt) {
bitSet (_state, RCV_TIMEOUT);
emit ();
emitData ();
}
reset ();
}
Expand Down Expand Up @@ -170,10 +241,16 @@ void Wiegand26::readData () {
bitSet (_state, LOGIC_FAULT);
}
_bitCnt++;
_keyCnt++;

// Key done
if (_keyCnt == KEY_BITS) {
emitKey ();
}

// Reading done
if (_bitCnt >= MAX_BITS) {
emit ();
emitData ();
reset ();
}

Expand All @@ -182,7 +259,7 @@ void Wiegand26::readData () {


// Begin
void Wiegand26::begin (uint8_t pinData0, uint8_t pinData1, bool state) {
void Wiegand26::begin (uint8_t pinData0, uint8_t pinData1, bool state, bool swapData) {
// Save pin
_pinData0 = pinData0;
_pinData1 = pinData1;
Expand All @@ -193,9 +270,11 @@ void Wiegand26::begin (uint8_t pinData0, uint8_t pinData1, bool state) {

// Inicialize
_sendState = state;
_swapData = swapData;
_first = true;
_stateOld = 0;
_state = 0;
_code = 0;
reset ();
}

Loading

0 comments on commit ea7c231

Please sign in to comment.