Wiegand card reader driver library
Fork of CardReader by
Reader.h@0:b468573740b5, 2012-07-18 (annotated)
- Committer:
- nkhorman
- Date:
- Wed Jul 18 01:54:58 2012 +0000
- Revision:
- 0:b468573740b5
- Child:
- 1:47807713b37d
Add copyright and licensing.; Move to library.
Who changed what in which revision?
User | Revision | Line number | New 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 |