Wiegand card reader driver library

Import libraryCardReader

Wiegand card reader driver library

This is a Wiegand 2 signal (Data0, Data1) card reader interface library.

Information

Todo - parity checking.

Wiegand technology References

Hobbyist project

Library use example

/*
 *  Wiegand card reader driver library
 *  Copyright (c) 2012 Neal Horman - http://www.wanlink.com
 *  
 *  License: MIT open source (http://opensource.org/licenses/MIT)
 *      Summary;
 *      Use / modify / distribute / publish it how you want and 
 *      if you use it, or don't, you can't hold me liable for how
 *      it does or doesn't work.
 *      If it doesn't work how you want, don't use it, or change
 *      it so that it does work.
 */
 
#include "mbed.h"
#include "ReaderWiegand.h"

Serial gSerial(USBTX, USBRX);
ReaderWiegand gReader(p10,p11);

int main()
{
    gSerial.printf("Ready\r\n");
    
    while(1)
    {
        if(gReader.isNew())
        {   uint8_t bq = gReader.bitCount();
            uint64_t bits = gReader.bits();
        
            for(uint8_t i=0; i<bq; i++)
                gSerial.printf("%c",'0' + ( ( bits & ( (uint64_t)1 << i ) ) != 0));
            gSerial.printf(" bq: %u h: 0x%llX ",bq,bits);
            if(gReader.isValid())
                gSerial.printf("f: %lu, c: %lu\r\n",gReader.facility(),gReader.card());
            else
                gSerial.printf("Unknown format\r\n");

            gReader.old();
        }
    }
}
Committer:
nkhorman
Date:
Wed Jul 18 01:54:58 2012 +0000
Revision:
0:b468573740b5
Add copyright and licensing.; Move to library.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nkhorman 0:b468573740b5 1 /*
nkhorman 0:b468573740b5 2 * Card / Proximity reader driver library
nkhorman 0:b468573740b5 3 * Copyright (c) 2012 Neal Horman - http://www.wanlink.com
nkhorman 0:b468573740b5 4 *
nkhorman 0:b468573740b5 5 * License: MIT open source (http://opensource.org/licenses/MIT)
nkhorman 0:b468573740b5 6 * Summary;
nkhorman 0:b468573740b5 7 * Use / modify / distribute / publish it how you want and
nkhorman 0:b468573740b5 8 * if you use it, or don't, you can't hold me liable for how
nkhorman 0:b468573740b5 9 * it does or doesn't work.
nkhorman 0:b468573740b5 10 * If it doesn't work how you want, don't use it, or change
nkhorman 0:b468573740b5 11 * it so that it does work.
nkhorman 0:b468573740b5 12 */
nkhorman 0:b468573740b5 13
nkhorman 0:b468573740b5 14 #ifndef _READER_H_
nkhorman 0:b468573740b5 15 #define _READER_H_
nkhorman 0:b468573740b5 16
nkhorman 0:b468573740b5 17 class Reader
nkhorman 0:b468573740b5 18 {
nkhorman 0:b468573740b5 19 public:
nkhorman 0:b468573740b5 20 Reader()
nkhorman 0:b468573740b5 21 : mCard(0)
nkhorman 0:b468573740b5 22 , mFacility(0)
nkhorman 0:b468573740b5 23 , mSite(0)
nkhorman 0:b468573740b5 24 , mBits(0)
nkhorman 0:b468573740b5 25 , mBitsCount(0)
nkhorman 0:b468573740b5 26 , mbIsValid(false)
nkhorman 0:b468573740b5 27 , mbIsNew(false)
nkhorman 0:b468573740b5 28 , mbInhibited(false)
nkhorman 0:b468573740b5 29 {};
nkhorman 0:b468573740b5 30
nkhorman 0:b468573740b5 31 uint32_t card() { return mCard; };
nkhorman 0:b468573740b5 32 uint32_t facility() { return mFacility; };
nkhorman 0:b468573740b5 33 uint16_t site() { return mSite; };
nkhorman 0:b468573740b5 34 bool isValid() { return mbIsValid; };
nkhorman 0:b468573740b5 35 bool isNew() { return mbIsNew; };
nkhorman 0:b468573740b5 36 void old() { mbIsNew = false; };
nkhorman 0:b468573740b5 37
nkhorman 0:b468573740b5 38 bool isInhibited() { return mbInhibited; };
nkhorman 0:b468573740b5 39 void inhibit(bool bInhibit = true) { mbInhibited = bInhibit; };
nkhorman 0:b468573740b5 40
nkhorman 0:b468573740b5 41 uint64_t bits() { return mLastBits; };
nkhorman 0:b468573740b5 42 uint8_t bitCount() { return mLastBitsCount; };
nkhorman 0:b468573740b5 43
nkhorman 0:b468573740b5 44 protected:
nkhorman 0:b468573740b5 45 volatile uint32_t mCard;
nkhorman 0:b468573740b5 46 volatile uint32_t mFacility;
nkhorman 0:b468573740b5 47 volatile uint16_t mSite;
nkhorman 0:b468573740b5 48 volatile uint64_t mLastBits;
nkhorman 0:b468573740b5 49 volatile uint8_t mLastBitsCount;
nkhorman 0:b468573740b5 50
nkhorman 0:b468573740b5 51 volatile uint64_t mBits;
nkhorman 0:b468573740b5 52 volatile uint8_t mBitsCount;
nkhorman 0:b468573740b5 53
nkhorman 0:b468573740b5 54 volatile bool mbIsValid;
nkhorman 0:b468573740b5 55 volatile bool mbIsNew;
nkhorman 0:b468573740b5 56
nkhorman 0:b468573740b5 57 bool mbInhibited;
nkhorman 0:b468573740b5 58
nkhorman 0:b468573740b5 59 void shiftIn(uint8_t bit)
nkhorman 0:b468573740b5 60 {
nkhorman 0:b468573740b5 61 if(bit)
nkhorman 0:b468573740b5 62 mBits |= ((uint64_t)1 << mBitsCount);
nkhorman 0:b468573740b5 63 mBitsCount ++;
nkhorman 0:b468573740b5 64 }
nkhorman 0:b468573740b5 65
nkhorman 0:b468573740b5 66 uint32_t bits32(uint8_t first, uint8_t qty)
nkhorman 0:b468573740b5 67 { uint32_t val = 0;
nkhorman 0:b468573740b5 68 uint8_t last = first + qty;
nkhorman 0:b468573740b5 69
nkhorman 0:b468573740b5 70 for(uint8_t i=first; i<last; i++)
nkhorman 0:b468573740b5 71 {
nkhorman 0:b468573740b5 72 if(val)
nkhorman 0:b468573740b5 73 val <<= 1;
nkhorman 0:b468573740b5 74 if(mBits & (1<<i))
nkhorman 0:b468573740b5 75 val |= 1;
nkhorman 0:b468573740b5 76 }
nkhorman 0:b468573740b5 77
nkhorman 0:b468573740b5 78 return val;
nkhorman 0:b468573740b5 79 }
nkhorman 0:b468573740b5 80
nkhorman 0:b468573740b5 81 virtual bool decode()
nkhorman 0:b468573740b5 82 { bool bIsValid = false;
nkhorman 0:b468573740b5 83
nkhorman 0:b468573740b5 84 mSite = 0;
nkhorman 0:b468573740b5 85 if(mBitsCount == 26)
nkhorman 0:b468573740b5 86 {
nkhorman 0:b468573740b5 87 mFacility = bits32(1,8);
nkhorman 0:b468573740b5 88 mCard = bits32(9,16);
nkhorman 0:b468573740b5 89 bIsValid = true;
nkhorman 0:b468573740b5 90 }
nkhorman 0:b468573740b5 91 else if(mBitsCount == 34)
nkhorman 0:b468573740b5 92 {
nkhorman 0:b468573740b5 93 mFacility = bits32(1,16);
nkhorman 0:b468573740b5 94 mCard = bits32(17,16);
nkhorman 0:b468573740b5 95 bIsValid = true;
nkhorman 0:b468573740b5 96 }
nkhorman 0:b468573740b5 97 else if(mBitsCount == 35)
nkhorman 0:b468573740b5 98 {
nkhorman 0:b468573740b5 99 mFacility = bits32(2,12);
nkhorman 0:b468573740b5 100 mCard = bits32(14,20);
nkhorman 0:b468573740b5 101 bIsValid = true;
nkhorman 0:b468573740b5 102 }
nkhorman 0:b468573740b5 103 else
nkhorman 0:b468573740b5 104 {
nkhorman 0:b468573740b5 105 mFacility = 0;
nkhorman 0:b468573740b5 106 mCard = 0;
nkhorman 0:b468573740b5 107 }
nkhorman 0:b468573740b5 108
nkhorman 0:b468573740b5 109 mLastBits = mBits;
nkhorman 0:b468573740b5 110 mLastBitsCount = mBitsCount;
nkhorman 0:b468573740b5 111
nkhorman 0:b468573740b5 112 return bIsValid;
nkhorman 0:b468573740b5 113 }
nkhorman 0:b468573740b5 114
nkhorman 0:b468573740b5 115 void swiped()
nkhorman 0:b468573740b5 116 {
nkhorman 0:b468573740b5 117 // decode mBits into mCard, mFacility, and mSite
nkhorman 0:b468573740b5 118 mbIsValid = !mbInhibited && decode();
nkhorman 0:b468573740b5 119 // reset mBits and mBitsCount for next operation
nkhorman 0:b468573740b5 120 mBits = 0;
nkhorman 0:b468573740b5 121 mBitsCount = 0;
nkhorman 0:b468573740b5 122 mbIsNew = !mbInhibited;
nkhorman 0:b468573740b5 123 };
nkhorman 0:b468573740b5 124 };
nkhorman 0:b468573740b5 125
nkhorman 0:b468573740b5 126 #endif