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

Committer:
acesrobertm
Date:
Mon Sep 25 19:02:40 2017 +0000
Revision:
0:a56239ae90c2
in process of moving networking code to non-blocking format

Who changed what in which revision?

UserRevisionLine numberNew contents of line
acesrobertm 0:a56239ae90c2 1
acesrobertm 0:a56239ae90c2 2 #ifndef CONFIGURATION_MANAGER_H_
acesrobertm 0:a56239ae90c2 3 #define CONFIGURATION_MANAGER_H_
acesrobertm 0:a56239ae90c2 4
acesrobertm 0:a56239ae90c2 5 #include "CodeMemory.h"
acesrobertm 0:a56239ae90c2 6 #include "NTPClient.h"
acesrobertm 0:a56239ae90c2 7 #include "TFTPClient.h"
acesrobertm 0:a56239ae90c2 8 #include "DHCPOptions.h"
acesrobertm 0:a56239ae90c2 9
acesrobertm 0:a56239ae90c2 10 #define RESET_PAUSE_SECONDS 1.5
acesrobertm 0:a56239ae90c2 11 #define ACCESS_CODE_MAX_LENGTH 5
acesrobertm 0:a56239ae90c2 12 #define ACCESS_CODE_MIN_LENGTH 3
acesrobertm 0:a56239ae90c2 13 #define ACCESS_CODE_PRINT_FORMAT "%-7u"
acesrobertm 0:a56239ae90c2 14 #define ACCESS_CODE_NUM_COLS 10
acesrobertm 0:a56239ae90c2 15 #define USB_RX_MAX_LENGTH 80
acesrobertm 0:a56239ae90c2 16 #define CONFIG_PARAM_NAME_MAX_LENGTH 8
acesrobertm 0:a56239ae90c2 17 #define CONFIG_PARAM_VALUE_MAX_LENGTH 30
acesrobertm 0:a56239ae90c2 18 #define IP_STRING_MAX_LENGTH 15
acesrobertm 0:a56239ae90c2 19 #define IP_STRING_MIN_LENGTH 7
acesrobertm 0:a56239ae90c2 20 #define DEFAULT_USB_BAUD 9600
acesrobertm 0:a56239ae90c2 21
acesrobertm 0:a56239ae90c2 22 // Periodic Timers
acesrobertm 0:a56239ae90c2 23 #define CONFIG_UPDATE_INTERVAL_SECS 30
acesrobertm 0:a56239ae90c2 24 #define TIME_UPDATE_INTERVAL_SECS 30//86400 // Once per day
acesrobertm 0:a56239ae90c2 25
acesrobertm 0:a56239ae90c2 26 #if 1
acesrobertm 0:a56239ae90c2 27 //Enable debug
acesrobertm 0:a56239ae90c2 28 #define __DEBUG__
acesrobertm 0:a56239ae90c2 29 #include <cstdio>
acesrobertm 0:a56239ae90c2 30 #define DBG(x, ...) std::printf("[NTPClient : DBG]"x"\r\n", ##__VA_ARGS__);
acesrobertm 0:a56239ae90c2 31 #define WARN(x, ...) std::printf("[NTPClient : WARN]"x"\r\n", ##__VA_ARGS__);
acesrobertm 0:a56239ae90c2 32 #define ERR(x, ...) std::printf("[NTPClient : ERR]"x"\r\n", ##__VA_ARGS__);
acesrobertm 0:a56239ae90c2 33
acesrobertm 0:a56239ae90c2 34 #else
acesrobertm 0:a56239ae90c2 35 //Disable debug
acesrobertm 0:a56239ae90c2 36 #define DBG(x, ...)
acesrobertm 0:a56239ae90c2 37 #define WARN(x, ...)
acesrobertm 0:a56239ae90c2 38 #define ERR(x, ...)
acesrobertm 0:a56239ae90c2 39 #endif
acesrobertm 0:a56239ae90c2 40
acesrobertm 0:a56239ae90c2 41 // TFTP Configuration Parameters
acesrobertm 0:a56239ae90c2 42 const char configName_enableAccess[] = "ENABLE";
acesrobertm 0:a56239ae90c2 43 const char configName_ipAddress[] = "IP";
acesrobertm 0:a56239ae90c2 44 const char configName_netMask[] = "MASK";
acesrobertm 0:a56239ae90c2 45 const char configName_gateway[] = "GATE";
acesrobertm 0:a56239ae90c2 46 const char configName_codeFileName[] = "CODEFILE";
acesrobertm 0:a56239ae90c2 47 const char configName_ntpServer[] = "NTPSRV";
acesrobertm 0:a56239ae90c2 48 const char configName_usbBaud[] = "BAUD";
acesrobertm 0:a56239ae90c2 49
acesrobertm 0:a56239ae90c2 50 bool config_enableAccess = 1;
acesrobertm 0:a56239ae90c2 51 char config_ipAddress[IP_STRING_MAX_LENGTH + 1] = "";
acesrobertm 0:a56239ae90c2 52 char config_netMask[IP_STRING_MAX_LENGTH + 1] = "";
acesrobertm 0:a56239ae90c2 53 char config_gateway[IP_STRING_MAX_LENGTH + 1] = "";
acesrobertm 0:a56239ae90c2 54 char config_codeFileName[CONFIG_PARAM_VALUE_MAX_LENGTH + 1] = "door-access-codes.cnf";
acesrobertm 0:a56239ae90c2 55 char config_tftpServer[IP_STRING_MAX_LENGTH + 1] = "0.0.0.0";
acesrobertm 0:a56239ae90c2 56 char config_ntpServer[IP_STRING_MAX_LENGTH + 1] = "0.0.0.0";
acesrobertm 0:a56239ae90c2 57 int config_usbBaud = DEFAULT_USB_BAUD;
acesrobertm 0:a56239ae90c2 58
acesrobertm 0:a56239ae90c2 59 enum ConfigUpdateSteps
acesrobertm 0:a56239ae90c2 60 {
acesrobertm 0:a56239ae90c2 61 UPDATE_STEP_IDLE = -1,
acesrobertm 0:a56239ae90c2 62 UPDATE_STEP_INITIATE = 0,
acesrobertm 0:a56239ae90c2 63 UPDATE_STEP_CONFIG_FILE_REQUEST_SENT = 1,
acesrobertm 0:a56239ae90c2 64 UPDATE_STEP_CONFIG_FILE_RECEIVED = 2,
acesrobertm 0:a56239ae90c2 65 UPDATE_STEP_CODES_FILE_REQUEST_SENT = 3,
acesrobertm 0:a56239ae90c2 66 UPDATE_STEP_CODES_FILE_RECEIVED = 4
acesrobertm 0:a56239ae90c2 67 };
acesrobertm 0:a56239ae90c2 68
acesrobertm 0:a56239ae90c2 69 class ConfigurationManager
acesrobertm 0:a56239ae90c2 70 {
acesrobertm 0:a56239ae90c2 71 public:
acesrobertm 0:a56239ae90c2 72 ConfigurationManager(EthernetInterface* stack, CodeMemory* codeMem): mEth(stack), mCodeMem(codeMem), mUpdateStep(0), lastUpdatedConfigSeconds(0), lastUpdatedTimeSeconds(0){}
acesrobertm 0:a56239ae90c2 73 void update();
acesrobertm 0:a56239ae90c2 74
acesrobertm 0:a56239ae90c2 75 private:
acesrobertm 0:a56239ae90c2 76 void remove_all_chars(char* str, char c);
acesrobertm 0:a56239ae90c2 77 bool isValidIpString(char* ip);
acesrobertm 0:a56239ae90c2 78 int parse_tftp_config(char* data);
acesrobertm 0:a56239ae90c2 79 int parse_tftp_codes(char* tftp_data);
acesrobertm 0:a56239ae90c2 80 int connectEthernet(char* mac_addr, char* ip_addr, const bool withDhcp = true, const bool printStats = 1);
acesrobertm 0:a56239ae90c2 81 void setupNetwork();
acesrobertm 0:a56239ae90c2 82 void updateClock();
acesrobertm 0:a56239ae90c2 83
acesrobertm 0:a56239ae90c2 84 EthernetInterface* mEth;
acesrobertm 0:a56239ae90c2 85 CodeMemory* mCodeMem;
acesrobertm 0:a56239ae90c2 86 char* _mac_addr;
acesrobertm 0:a56239ae90c2 87 char* _ip_addr;
acesrobertm 0:a56239ae90c2 88 NTPClient _ntp;
acesrobertm 0:a56239ae90c2 89 TFTPClient* _tftp;
acesrobertm 0:a56239ae90c2 90 char _tftp_data[MAX_TFTP_FILE_SIZE + 1];
acesrobertm 0:a56239ae90c2 91 int mUpdateStep;
acesrobertm 0:a56239ae90c2 92 // Periodic Timers
acesrobertm 0:a56239ae90c2 93 time_t lastUpdatedConfigSeconds;
acesrobertm 0:a56239ae90c2 94 time_t lastUpdatedTimeSeconds;
acesrobertm 0:a56239ae90c2 95 };
acesrobertm 0:a56239ae90c2 96
acesrobertm 0:a56239ae90c2 97 #endif