#pragma once

class WIEGAND {
public:
    WIEGAND();
    void begin();
    void end();
    bool available();
    unsigned long getCode();
    unsigned long getCodeHigh();
    int getWiegandType();

    static void ReadD0();
    static void ReadD1();

private:
    static bool DoWiegandConversion();
    static unsigned long GetCardId(
        volatile unsigned long* codehigh,
        volatile unsigned long* codelow,
        char bitlength);

    static volatile unsigned long _cardTempHigh;
    static volatile unsigned long _cardTemp;
    static volatile unsigned long _lastWiegand;
    static volatile int _bitCount;
    static int _wiegandType;
    static unsigned long _code;
    static unsigned long _codeHigh;
};