|
|
|
@ -5,9 +5,9 @@ |
|
|
|
|
#include <EEPROM.h> |
|
|
|
|
#include <Ticker.h> |
|
|
|
|
|
|
|
|
|
const char* WIFI_SSID = "Protospace"; |
|
|
|
|
const char* WIFI_PASS = "yycmakers"; |
|
|
|
|
char wifiMACAddr[18]; |
|
|
|
|
const char *WIFI_SSID PROGMEM = "Protospace"; |
|
|
|
|
const char *WIFI_PASS PROGMEM = "yycmakers"; |
|
|
|
|
char wifiMACAddr[20] = ""; |
|
|
|
|
const String SOCKET_URL = String("http://tools-socket.protospace.ca/api/lockout/"); |
|
|
|
|
const String CARD_URL = String("http://tools-auth.protospace.ca/cards/"); |
|
|
|
|
|
|
|
|
@ -43,10 +43,9 @@ typedef struct __attribute__((packed)) cardData { |
|
|
|
|
#define DELAY_TIME 10 |
|
|
|
|
#define COMM_LOCK_IDLE_TIME 50 |
|
|
|
|
#define COMM_CARD_IDLE_TIME 1000 |
|
|
|
|
#define LED_DENIED_IDLE_TIME 50 |
|
|
|
|
#define LED_DELAYED_IDLE_TIME 50 |
|
|
|
|
|
|
|
|
|
#define EEPROM_SIZE 4095 |
|
|
|
|
#define EEPROM_START 0 |
|
|
|
|
|
|
|
|
|
enum wifiStates |
|
|
|
|
{ |
|
|
|
@ -60,8 +59,8 @@ enum LEDStates |
|
|
|
|
LED_OFF, |
|
|
|
|
LED_ARMED, |
|
|
|
|
LED_ON, |
|
|
|
|
LED_DENIED, |
|
|
|
|
LED_DENIED_IDLE, |
|
|
|
|
LED_DELAYED, |
|
|
|
|
LED_DELAYED_IDLE, |
|
|
|
|
} LEDState = LED_OFF; |
|
|
|
|
|
|
|
|
|
enum lockStates |
|
|
|
@ -155,7 +154,7 @@ bool checksum(cardData_t *cardData) |
|
|
|
|
|
|
|
|
|
int8_t even = 0, odd = 0; |
|
|
|
|
|
|
|
|
|
for (int i = 0; i < CARD_DATA_LENGTH; i++) { |
|
|
|
|
for (int8_t i = 0; i < CARD_DATA_LENGTH; i++) { |
|
|
|
|
int8_t num = charToNum(cardData->data[i]); |
|
|
|
|
|
|
|
|
|
if (num == -1) return false; |
|
|
|
@ -181,11 +180,11 @@ void checkCard() |
|
|
|
|
String cardStr = String(); |
|
|
|
|
String authorizedCards = String(); |
|
|
|
|
|
|
|
|
|
for (int i = 0; i < CARD_DATA_LENGTH; i++) { |
|
|
|
|
for (uint8_t i = 0; i < CARD_DATA_LENGTH; i++) { |
|
|
|
|
cardStr += cardData->data[i]; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
for (int i = EEPROM_START; i < EEPROM_SIZE; i++) { |
|
|
|
|
for (uint16_t i = 0; i < EEPROM_SIZE; i++) { |
|
|
|
|
char tmp = EEPROM.read(i); |
|
|
|
|
authorizedCards += tmp; |
|
|
|
|
if (tmp == '$') break; |
|
|
|
@ -200,7 +199,7 @@ void checkCard() |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
if (LOGGING) Serial.println("[INFO] Card not authorized on machine."); |
|
|
|
|
LEDState = LED_DENIED; |
|
|
|
|
LEDState = LED_DELAYED; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -250,7 +249,7 @@ void processLockState() |
|
|
|
|
{ |
|
|
|
|
switch (lockState) { |
|
|
|
|
case LOCK_OFF: |
|
|
|
|
if (LEDState < LED_DENIED) LEDState = LED_OFF; |
|
|
|
|
if (LEDState < LED_DELAYED) LEDState = LED_OFF; |
|
|
|
|
|
|
|
|
|
relayOff(); |
|
|
|
|
break; |
|
|
|
@ -260,10 +259,11 @@ void processLockState() |
|
|
|
|
lockState = LOCK_ARMED; |
|
|
|
|
} else { |
|
|
|
|
lockState = LOCK_OFF; |
|
|
|
|
LEDState = LED_DELAYED; |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
case LOCK_ARMED: |
|
|
|
|
if (LEDState < LED_DENIED) LEDState = LED_ARMED; |
|
|
|
|
if (LEDState < LED_DELAYED) LEDState = LED_ARMED; |
|
|
|
|
|
|
|
|
|
relayOff(); |
|
|
|
|
|
|
|
|
@ -285,7 +285,7 @@ void processLockState() |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
case LOCK_ON: |
|
|
|
|
if (LEDState < LED_DENIED) LEDState = LED_ON; |
|
|
|
|
if (LEDState < LED_DELAYED) LEDState = LED_ON; |
|
|
|
|
|
|
|
|
|
relayOn(); |
|
|
|
|
|
|
|
|
@ -308,7 +308,7 @@ void redLEDOff() { digitalWrite(RED_LED_PIN, LED_PIN_OFF); } |
|
|
|
|
|
|
|
|
|
void processLEDState() |
|
|
|
|
{ |
|
|
|
|
static uint16_t LEDDeniedIdleCount = 0; |
|
|
|
|
static uint16_t LEDDelayedIdleCount = 0; |
|
|
|
|
|
|
|
|
|
switch (LEDState) { |
|
|
|
|
case LED_OFF: |
|
|
|
@ -326,18 +326,18 @@ void processLEDState() |
|
|
|
|
redLEDOn(); |
|
|
|
|
|
|
|
|
|
break; |
|
|
|
|
case LED_DENIED: |
|
|
|
|
LEDDeniedIdleCount = 0; |
|
|
|
|
case LED_DELAYED: |
|
|
|
|
LEDDelayedIdleCount = 0; |
|
|
|
|
|
|
|
|
|
LEDState = LED_DENIED_IDLE; |
|
|
|
|
LEDState = LED_DELAYED_IDLE; |
|
|
|
|
break; |
|
|
|
|
case LED_DENIED_IDLE: |
|
|
|
|
LEDDeniedIdleCount++; |
|
|
|
|
case LED_DELAYED_IDLE: |
|
|
|
|
LEDDelayedIdleCount++; |
|
|
|
|
|
|
|
|
|
if (LEDDeniedIdleCount < LED_DENIED_IDLE_TIME) { |
|
|
|
|
if (LEDDelayedIdleCount < LED_DELAYED_IDLE_TIME) { |
|
|
|
|
greenLEDOff(); |
|
|
|
|
redLEDOn(); |
|
|
|
|
} else if (LEDDeniedIdleCount < LED_DENIED_IDLE_TIME * 2) { |
|
|
|
|
} else if (LEDDelayedIdleCount < LED_DELAYED_IDLE_TIME * 2) { |
|
|
|
|
greenLEDOff(); |
|
|
|
|
redLEDOff(); |
|
|
|
|
} else { |
|
|
|
@ -357,7 +357,7 @@ String serializeLockJson(uint8_t lockState) |
|
|
|
|
{ |
|
|
|
|
// Generated with: https://arduinojson.org/assistant/
|
|
|
|
|
const size_t bufferSize = JSON_OBJECT_SIZE(1) + 50; |
|
|
|
|
DynamicJsonBuffer jsonBuffer(bufferSize); |
|
|
|
|
StaticJsonBuffer<bufferSize> jsonBuffer; |
|
|
|
|
|
|
|
|
|
JsonObject& root = jsonBuffer.createObject(); |
|
|
|
|
root["lockState"] = (uint8_t) lockState; |
|
|
|
@ -371,7 +371,7 @@ String deserializeLockJson(String input) |
|
|
|
|
{ |
|
|
|
|
// Generated with: https://arduinojson.org/assistant/
|
|
|
|
|
const size_t bufferSize = JSON_OBJECT_SIZE(1) + 50; |
|
|
|
|
DynamicJsonBuffer jsonBuffer(bufferSize); |
|
|
|
|
StaticJsonBuffer<bufferSize> jsonBuffer; |
|
|
|
|
JsonObject& root = jsonBuffer.parseObject(input); |
|
|
|
|
|
|
|
|
|
String action = root["action"]; |
|
|
|
@ -416,6 +416,8 @@ void postState() |
|
|
|
|
} else { |
|
|
|
|
if (LOGGING) Serial.printf("[ERROR] POST failed, error: %s\n", lockHTTP.errorToString(lockHTTPCode).c_str()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
lockHTTP.end(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void getCards() |
|
|
|
@ -440,7 +442,7 @@ void getCards() |
|
|
|
|
cardPayload += "$"; // Mark the end
|
|
|
|
|
if (LOGGING) Serial.println(cardPayload); |
|
|
|
|
|
|
|
|
|
for (int i = EEPROM_START; i < cardPayload.length(); i++) { |
|
|
|
|
for (int i = 0; i < cardPayload.length(); i++) { |
|
|
|
|
if (i >= EEPROM_SIZE) break; |
|
|
|
|
EEPROM.write(i, cardPayload.charAt(i)); |
|
|
|
|
} |
|
|
|
@ -453,6 +455,8 @@ void getCards() |
|
|
|
|
} else { |
|
|
|
|
if (LOGGING) Serial.printf("[ERROR] POST failed, error: %s\n", cardHTTP.errorToString(cardHTTPCode).c_str()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
cardHTTP.end(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void processCommState() |
|
|
|
@ -484,6 +488,8 @@ void processCommState() |
|
|
|
|
commLockIdleCount = 0; |
|
|
|
|
|
|
|
|
|
commState = COMM_IDLE; |
|
|
|
|
|
|
|
|
|
Serial.printf("******free heap size: %u\n", ESP.getFreeHeap()); |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
case COMM_CARD: |
|
|
|
@ -493,9 +499,6 @@ void processCommState() |
|
|
|
|
commCardIdleCount = 0; |
|
|
|
|
|
|
|
|
|
commState = COMM_IDLE; |
|
|
|
|
|
|
|
|
|
Serial.printf("******heap size: %u\n", ESP.getFreeHeap()); |
|
|
|
|
Serial.printf("******frag.: %u\n", ESP.getHeapFragmentation()); |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|