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
ConfigurationManager.h@0:a56239ae90c2, 2017-09-25 (annotated)
- 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?
User | Revision | Line number | New 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 |