An access controller for man doors at our facility. It receives Wiegand signals from a keypad/card reader and activates a relay to open the door. Access codes are stored in EEPROM. The active code list is updated from TFTP on a local server.

Dependencies:   24LCxx_I2C CardReader USBHOST

CodeMemory.h

Committer:
acesrobertm
Date:
2017-09-25
Revision:
0:a56239ae90c2

File content as of revision 0:a56239ae90c2:


#ifndef CODE_MEMORY_H_
#define CODE_MEMORY_H_

#include <algorithm>
#include "24LCxx_I2C/24LCxx_I2C.h"

#define EEPROM_LENGTH 1024
#define CODE_TABLE_SIZE 200 // bytes (codes * 2)
#define SPECIAL_CODE_TABLE_SIZE 20 // bytes (codes * 2)

#define EVENT_LOG_POINTER_SIZE 2 // bytes
#define EVENT_LOG_TIME_BASE_SIZE 4 // bytes
#define EVENT_SIZE 7 // bytes per event |1:event type|2:event value|4:ms timestamp|

// Event Types
#define EVENT_CARD_ACCESS_DENIED 1
#define EVENT_CARD_ACCESS_GRANTED 2
#define EVENT_KEYPAD_ACCESS_DENIED 3
#define EVENT_KEYPAD_ACCESS_GRANTED 4
#define EVENT_SPECIAL_CODE 5
#define EVENT_SPECIAL_CHANGE 6
#define EVENT_GATE_STATE_CHANGED 7 // 0 = Open, 1 = Closed
#define EVENT_ALARM_ACTIVE 8 // (Bit Array) 1:Power On, 2:East Tamper, 4:West Tamper, 8:Comms Loss
#define EVENT_ALARM_RESET 9

class CodeMemory
{
private:
    C24LCXX_I2C* _eeprom;

    int LogPointerAddress();
    int FirstEventLogAddress();
    int EventLogEndAddress();
    void PrintEvent(unsigned short eventAddress);
    int GetLatestEventAddress();
    int GetNextEventAddress();
    int GetNextEventAddress(unsigned short startAddress);
    int GetPreviousEventAddress(unsigned short startAddress);

public:
    CodeMemory(){_eeprom = new C24LCXX_I2C(D14, D15, 0, NC, 1000000);}
    ~CodeMemory(){delete _eeprom;}
    void EEPROMClear();
    unsigned short ReadAccessCode(unsigned short address);
    void WriteAccessCode(unsigned short address, unsigned short value);
    unsigned int ReadEEPROMULong(unsigned short address);
    void WriteEEPROMULong(unsigned short address, unsigned int value);
    int FindAccessCode(unsigned short code);
    int FindAccessCode(unsigned short code, unsigned short startAddress, unsigned short stopAddress);
    int ActivateAccessCode(unsigned short value);
    int DeactivateAccessCode(unsigned short value);
    void PrintAllAccessCodes();
    void SyncAccessCodes(unsigned short* codeList, unsigned short codeCount);
    bool IsSpecialCode(unsigned short specialCodeIndex, unsigned short code, unsigned short defaultCode);
    bool SetSpecialCode(unsigned short specialCodeIndex, unsigned short code);
    
    void WriteEvent(unsigned char eventType, unsigned short eventValue);
    void PrintEventLog();
    void PrintRecentEvents();
    void PrintRecentEvents(unsigned short numEvents);
};

#endif