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

Revision:
0:a56239ae90c2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/CodeMemory.h	Mon Sep 25 19:02:40 2017 +0000
@@ -0,0 +1,64 @@
+
+#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
\ No newline at end of file