Working code - rewrite classes and bussines logic
This commit is contained in:
Vendored
+1
@@ -1,6 +1,7 @@
|
|||||||
{
|
{
|
||||||
"files.associations": {
|
"files.associations": {
|
||||||
"pinsdefinitions": "c",
|
"pinsdefinitions": "c",
|
||||||
|
"new": "cpp"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
#include "DeviceBase.h"
|
||||||
|
|
||||||
|
DeviceBase::DeviceBase(const String id): Id(id) {};
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
#ifndef _DeviceBase_h
|
||||||
|
#define _DeviceBase_h
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
class DeviceBase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
String Id;
|
||||||
|
DeviceBase(const String id);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
#include "GSMMobileData.h"
|
||||||
|
#include "EEPROMUtils.h"
|
||||||
|
#include "DeviceBase.h"
|
||||||
|
#include "DebugLog.h"
|
||||||
|
|
||||||
|
GSMMobileData::GSMMobileData(String id) : DeviceBase(id)
|
||||||
|
{
|
||||||
|
readAllData(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
void GSMMobileData::readAllData(String id)
|
||||||
|
{
|
||||||
|
EEPROMUtils eepromUtils = EEPROMUtils();
|
||||||
|
MobileNumber = eepromUtils.readString(1, 20);
|
||||||
|
Sms = eepromUtils.readString(21, 100);
|
||||||
|
DebugLog::log("Load from EEPROM. Mobile Number: " + MobileNumber + " SMS: " + Sms);
|
||||||
|
}
|
||||||
|
|
||||||
|
void GSMMobileData::updateMobileNumber(const String &newMobileNumber)
|
||||||
|
{
|
||||||
|
if (newMobileNumber.length() <= 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (newMobileNumber != MobileNumber)
|
||||||
|
{
|
||||||
|
EEPROMUtils eepromUtils = EEPROMUtils();
|
||||||
|
MobileNumber = newMobileNumber;
|
||||||
|
eepromUtils.writeString(1, newMobileNumber, 20);
|
||||||
|
DebugLog::log("Update Mobile Number: " + newMobileNumber);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void GSMMobileData::updateSMS(const String &newSMS)
|
||||||
|
{
|
||||||
|
if (newSMS.length() <= 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (newSMS != Sms)
|
||||||
|
{
|
||||||
|
EEPROMUtils eepromUtils = EEPROMUtils();
|
||||||
|
Sms = newSMS;
|
||||||
|
eepromUtils.writeString(21, newSMS, 100);
|
||||||
|
DebugLog::log("Update sms: " + newSMS);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,15 +2,19 @@
|
|||||||
#define GSMMobileData_H
|
#define GSMMobileData_H
|
||||||
|
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include "Data/DeviceBase.h"
|
#include "DeviceBase.h" // Include the missing header file
|
||||||
|
|
||||||
|
|
||||||
class GSMMobileData : public DeviceBase
|
class GSMMobileData : public DeviceBase
|
||||||
{
|
{
|
||||||
|
private:
|
||||||
|
void readAllData(String id);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
String MobileNumber;
|
String MobileNumber;
|
||||||
String Sms;
|
String Sms;
|
||||||
|
|
||||||
GSMMobileData(String id): DeviceBase(id){};
|
GSMMobileData(String id);
|
||||||
|
|
||||||
void updateMobileNumber(const String &newMobileNumber);
|
void updateMobileNumber(const String &newMobileNumber);
|
||||||
|
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
#include <Arduino.h>
|
||||||
|
#include "PinTypeIn.h"
|
||||||
|
|
||||||
|
|
||||||
|
bool PinTypeIn::IsPinHigh()
|
||||||
|
{
|
||||||
|
return digitalRead(_pin) == HIGH ? true : false;
|
||||||
|
}
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
#ifndef PinTypeIn_H
|
||||||
|
#define PinTypeIn_H
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
#include "DeviceBase.h"
|
||||||
|
|
||||||
|
class PinTypeIn : public DeviceBase
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
uint8_t _pin;
|
||||||
|
unsigned long _debounceDelay;
|
||||||
|
unsigned long _lastDebounceTime;
|
||||||
|
int _lastButtonState;
|
||||||
|
int _buttonState;
|
||||||
|
|
||||||
|
public:
|
||||||
|
const char *description;
|
||||||
|
|
||||||
|
PinTypeIn(String id, uint8_t pin, unsigned long debounceDelay, const char *description): DeviceBase(id), _pin(pin), _debounceDelay(debounceDelay)
|
||||||
|
{
|
||||||
|
this->description = description;
|
||||||
|
pinMode(pin, INPUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @brief Get Actual Pin Value if is SET = True, if is NOT SET = False
|
||||||
|
/// @return
|
||||||
|
bool IsPinHigh();
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
#include "PinTypeOut.h"
|
||||||
|
#include <Arduino.h>
|
||||||
|
#include "DebugLog.h"
|
||||||
|
|
||||||
|
|
||||||
|
void PinTypeOut::setOutputSignalToHigh()
|
||||||
|
{
|
||||||
|
digitalWrite(_pinNumber, HIGH);
|
||||||
|
lastState = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PinTypeOut::setOutputSignalToLow()
|
||||||
|
{
|
||||||
|
digitalWrite(_pinNumber, LOW);
|
||||||
|
lastState = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool PinTypeOut::IsPinOn()
|
||||||
|
{
|
||||||
|
return lastState;
|
||||||
|
}
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
#ifndef PINTYPEOUT_H
|
||||||
|
#define PINTYPEOUT_H
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
#include "DeviceBase.h"
|
||||||
|
|
||||||
|
class PinTypeOut : public DeviceBase
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
uint8_t _pinNumber;
|
||||||
|
bool lastState;
|
||||||
|
unsigned long _debounceTime;
|
||||||
|
unsigned long lastStateChangeTime;
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
const char *description;
|
||||||
|
|
||||||
|
PinTypeOut(String id, uint8_t pinNumber, unsigned long debounceTime, const char *description)
|
||||||
|
: DeviceBase(id), _pinNumber(pinNumber), lastState(false), _debounceTime(debounceTime), lastStateChangeTime(0), description(description)
|
||||||
|
{
|
||||||
|
pinMode(pinNumber, OUTPUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
PinTypeOut(String id, uint8_t pinNumber, const char *description)
|
||||||
|
: DeviceBase(id), _pinNumber(pinNumber), lastState(false), _debounceTime(0), lastStateChangeTime(0), description(description)
|
||||||
|
{
|
||||||
|
pinMode(pinNumber, OUTPUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
void setOutputSignalToHigh();
|
||||||
|
void setOutputSignalToLow();
|
||||||
|
|
||||||
|
bool IsPinOn();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // PinTypeOut_H
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
#include "WebServerData.h"
|
||||||
|
#include <Ethernet.h>
|
||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
String WebServerData::getValue(const String &data, const String &key)
|
||||||
|
{
|
||||||
|
return getValue(data, key, '&');
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @brief Separe data PIN1=ON to PIN1 and ON
|
||||||
|
/// @param data PIN1=ON
|
||||||
|
/// @param key =
|
||||||
|
/// @param endchar end of string & or space or any other character
|
||||||
|
/// @return
|
||||||
|
String WebServerData::getValue(const String &data, const String &key, char endchar)
|
||||||
|
{
|
||||||
|
int keyIndex = data.indexOf(key);
|
||||||
|
if (keyIndex == -1)
|
||||||
|
{
|
||||||
|
return ""; // return empty string if key is not found
|
||||||
|
}
|
||||||
|
int separatorIndex = data.indexOf(endchar, keyIndex);
|
||||||
|
|
||||||
|
String value = data.substring(keyIndex + key.length(), separatorIndex != -1 ? separatorIndex : data.length());
|
||||||
|
|
||||||
|
return removeAllCharactersAfterEmptySpace(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
String WebServerData::getVariableName(const String &data, const String &key)
|
||||||
|
{
|
||||||
|
int keyIndex = data.indexOf(key);
|
||||||
|
|
||||||
|
String value = data.substring(0, keyIndex != -1 ? keyIndex : keyIndex);
|
||||||
|
|
||||||
|
return removeAllCharactersAfterEmptySpace(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
String WebServerData::removeAllCharactersAfterEmptySpace(String &data)
|
||||||
|
{
|
||||||
|
int keyIndex = data.indexOf(' ');
|
||||||
|
if (keyIndex == -1)
|
||||||
|
{
|
||||||
|
return data; // return empty string if key is not found
|
||||||
|
}
|
||||||
|
data.remove(keyIndex);
|
||||||
|
data.replace("_", " ");
|
||||||
|
return data;
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
#ifndef WebServerData_H
|
||||||
|
#define WebServerData_H
|
||||||
|
|
||||||
|
#include <Ethernet.h>
|
||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
class WebServerData
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
EthernetClient Client;
|
||||||
|
String Request;
|
||||||
|
bool IsEmpty;
|
||||||
|
|
||||||
|
WebServerData(EthernetClient client) : Client(client), IsEmpty(true){};
|
||||||
|
WebServerData(EthernetClient client, String request) : Client(client), Request(request), IsEmpty(false){};
|
||||||
|
String getValue(const String &data, const String &key, char endchar);
|
||||||
|
String getValue(const String &data, const String &key);
|
||||||
|
String removeAllCharactersAfterEmptySpace(String &data);
|
||||||
|
String getVariableName(const String &data, const String &key);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // WebServerData_H
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
#include "EEPROMUtils.h"
|
||||||
|
#include <EEPROM.h>
|
||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
|
||||||
|
// Statická metoda pro čtení řetězce z EEPROM
|
||||||
|
String EEPROMUtils::readString(int addr, int length)
|
||||||
|
{
|
||||||
|
String data;
|
||||||
|
for (int i = 0; i < length; i++)
|
||||||
|
{
|
||||||
|
char onedata = char(EEPROM.read(addr + i)); // read one byte at a time
|
||||||
|
if (onedata == '\n')
|
||||||
|
return data;
|
||||||
|
data += onedata;
|
||||||
|
}
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Statická metoda pro zápis řetězce do EEPROM
|
||||||
|
void EEPROMUtils::writeString(int addr, String data, int limit)
|
||||||
|
{
|
||||||
|
int numBytes = data.length(); // get length of the string
|
||||||
|
for (int i = 0; i < numBytes && i < limit; i++)
|
||||||
|
{
|
||||||
|
EEPROM.write(addr + i, data[i]); // write one byte at a time
|
||||||
|
}
|
||||||
|
if (numBytes < limit)
|
||||||
|
{
|
||||||
|
EEPROM.write(addr + numBytes, '\n'); // add newline character at the end
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
#ifndef EEPROMUtils_h
|
||||||
|
#define EEPROMUtils_h
|
||||||
|
|
||||||
|
#include <Arduino.h> // Include the missing header file for the String class
|
||||||
|
|
||||||
|
class EEPROMUtils
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static String readString(int addr, int length);
|
||||||
|
static void writeString(int addr, const String data, int limit); // Fix the function signature
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,82 @@
|
|||||||
|
#include "GSMMobileData.h"
|
||||||
|
#include <SoftwareSerial.h>
|
||||||
|
#include "GSMMobileDevice.h"
|
||||||
|
#include "DebugLog.h"
|
||||||
|
|
||||||
|
void GSMMobileDevice::end()
|
||||||
|
{
|
||||||
|
_gsmSerial.end();
|
||||||
|
DebugLog::log("GSM End ..");
|
||||||
|
}
|
||||||
|
|
||||||
|
void GSMMobileDevice::executeAtCommand(const String &atCommand)
|
||||||
|
{
|
||||||
|
DebugLog::log(atCommand);
|
||||||
|
_gsmSerial.print(atCommand + "\r");
|
||||||
|
delay(500);
|
||||||
|
}
|
||||||
|
|
||||||
|
String GSMMobileDevice::readStringSerialPort()
|
||||||
|
{
|
||||||
|
return _gsmSerial.readString();
|
||||||
|
}
|
||||||
|
|
||||||
|
void GSMMobileDevice::sendSMSToGSM(GSMMobileData gsmData)
|
||||||
|
{
|
||||||
|
DebugLog::log("SMS Start SEND SMS Id:" + gsmData.Id + " M:" + gsmData.MobileNumber + " with message " + gsmData.Sms);
|
||||||
|
|
||||||
|
/*executeAtCommand("AT+CMGF=1");
|
||||||
|
executeAtCommand("AT + CMGS =\"" + gsmData.MobileNumber + "\"");
|
||||||
|
executeAtCommand("ID:" + gsmData.Id + " Msg:" + gsmData.Sms);
|
||||||
|
|
||||||
|
delay(1000);
|
||||||
|
// Send a Ctrl+Z / ASCII SUB
|
||||||
|
_gsmSerial.print((char)26);
|
||||||
|
delay(500);
|
||||||
|
// Close the connection
|
||||||
|
_gsmSerial.print((char)27);*/
|
||||||
|
delay(500);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool GSMMobileDevice::checkSMSError()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
String response = readStringSerialPort();
|
||||||
|
if (response.indexOf("ERROR") != -1)
|
||||||
|
{
|
||||||
|
// If there was an error, try to reconnect and resend
|
||||||
|
_gsmSerial.println("AT+CFUN=1,1"); // Restart the module
|
||||||
|
delay(15000); // Wait for the module to restart
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
GSMMobileDevice::GSMMobileDevice(uint8_t pinRx, uint8_t pinTx, long baudRate): _gsmSerial(pinRx, pinTx)
|
||||||
|
{
|
||||||
|
_baudRate = baudRate;
|
||||||
|
// init software serial
|
||||||
|
_gsmSerial.begin(baudRate);
|
||||||
|
DebugLog::log("GSM Init ..");
|
||||||
|
//delay(5000); // initialization GSM module (give it some time to boot up)
|
||||||
|
}
|
||||||
|
|
||||||
|
void GSMMobileDevice::sendSMS(GSMMobileData gsmData)
|
||||||
|
{
|
||||||
|
init();
|
||||||
|
sendSMSToGSM(gsmData);
|
||||||
|
|
||||||
|
if (checkSMSError())
|
||||||
|
{
|
||||||
|
sendSMSToGSM(gsmData);
|
||||||
|
}
|
||||||
|
|
||||||
|
end();
|
||||||
|
}
|
||||||
|
|
||||||
|
// GSMMobileDevice::~GSMMobileDevice()
|
||||||
|
// {
|
||||||
|
// // // close gsmSerial
|
||||||
|
// // // close gsmSerial
|
||||||
|
// _gsmSerial.end();
|
||||||
|
// }
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
#ifndef GSMMobileDevice_H
|
||||||
|
#define GSMMobileDevice_H
|
||||||
|
|
||||||
|
#include "GSMMobileData.h"
|
||||||
|
#include "SoftwareSerial.h"
|
||||||
|
|
||||||
|
class GSMMobileDevice
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
|
||||||
|
SoftwareSerial _gsmSerial;
|
||||||
|
// Methods
|
||||||
|
void end();
|
||||||
|
void executeAtCommand(const String &atCommand);
|
||||||
|
String readStringSerialPort();
|
||||||
|
void sendSMSToGSM(GSMMobileData gsmData);
|
||||||
|
long _baudRate;
|
||||||
|
bool checkSMSError();
|
||||||
|
|
||||||
|
public:
|
||||||
|
// Constructor
|
||||||
|
GSMMobileDevice(uint8_t pinRx, uint8_t pinTx, long baudRate);
|
||||||
|
|
||||||
|
// Destructor
|
||||||
|
//~GSMDevice();
|
||||||
|
|
||||||
|
// Methods
|
||||||
|
void sendSMS(GSMMobileData gsmData);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // GSMDevice_H
|
||||||
@@ -0,0 +1,66 @@
|
|||||||
|
#include <Arduino.h>
|
||||||
|
#include <Ethernet.h>
|
||||||
|
#include "WebServerData.h"
|
||||||
|
#include "WebServer.h"
|
||||||
|
#include "DebugLog.h"
|
||||||
|
|
||||||
|
// Constructor
|
||||||
|
WebServer::WebServer() : _server(80) {}
|
||||||
|
|
||||||
|
WebServer::WebServer(byte mac[6], IPAddress ip, uint16_t port) : _ip(ip), _server(port)
|
||||||
|
{
|
||||||
|
memcpy(_mac, mac, 6);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Initialize the Ethernet and start the server
|
||||||
|
void WebServer::init()
|
||||||
|
{
|
||||||
|
DebugLog::log("Starting WebServer mac: " + String(_mac[0]) + String(_mac[1]) + ", IP: " + _ip);
|
||||||
|
Ethernet.begin(_mac, _ip);
|
||||||
|
DebugLog::log("Ethernet IP: " + Ethernet.localIP());
|
||||||
|
_server.begin();
|
||||||
|
DebugLog::log("Server Start");
|
||||||
|
}
|
||||||
|
|
||||||
|
EthernetClient client;
|
||||||
|
// Handle client requests
|
||||||
|
WebServerData WebServer::getWebServerData()
|
||||||
|
{
|
||||||
|
// Check if a client has connected
|
||||||
|
client = _server.available();
|
||||||
|
if (client)
|
||||||
|
{
|
||||||
|
if (client.connected())
|
||||||
|
{
|
||||||
|
//DebugLog::log("Client connected");
|
||||||
|
if (client.available())
|
||||||
|
{
|
||||||
|
|
||||||
|
String request = client.readStringUntil('\r');
|
||||||
|
// client.flush(); // Clear the incoming buffer after reading the GET request
|
||||||
|
// If you've gotten to the end of the line (received a newline
|
||||||
|
// character) and the line is blank, the http request has ended,
|
||||||
|
// so you can send a reply
|
||||||
|
if (request.startsWith("GET"))
|
||||||
|
{
|
||||||
|
DebugLog::log("GET WEB SERVER DATA: " + request);
|
||||||
|
WebServerData webServerData = WebServerData(client, request);
|
||||||
|
return webServerData;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Give the web browser time to receive the data
|
||||||
|
}
|
||||||
|
|
||||||
|
return WebServerData(client); // Return a default-constructed WebServerData object if no client is available
|
||||||
|
}
|
||||||
|
|
||||||
|
void WebServer::endServer()
|
||||||
|
{
|
||||||
|
if (_server.available())
|
||||||
|
{
|
||||||
|
delay(10);
|
||||||
|
// Close the connection
|
||||||
|
client.stop();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
#ifndef WebServer_H
|
||||||
|
#define WebServer_H
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
#include <Ethernet.h>
|
||||||
|
#include "WebServerData.h"
|
||||||
|
|
||||||
|
class WebServer
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
byte _mac[6];
|
||||||
|
IPAddress _ip;
|
||||||
|
EthernetServer _server;
|
||||||
|
|
||||||
|
public:
|
||||||
|
EthernetClient client;
|
||||||
|
|
||||||
|
WebServer();
|
||||||
|
WebServer(byte mac[6], IPAddress ip, uint16_t port);
|
||||||
|
WebServerData getWebServerData();
|
||||||
|
void init();
|
||||||
|
void endServer();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // WebServer_H
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
#include <Arduino.h>
|
||||||
|
#include "DebugLog.h"
|
||||||
|
|
||||||
|
void DebugLog::log(const String &log)
|
||||||
|
{
|
||||||
|
Serial.println(log);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DebugLog::init(const long &bound)
|
||||||
|
{
|
||||||
|
Serial.begin(bound);
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
#ifndef DebugLog_H
|
||||||
|
#define DebugLog_H
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
class DebugLog
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static void init(const long &bound);
|
||||||
|
static void log(const String &log);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
#include <Arduino.h>
|
||||||
|
#include "HTMLGenerator.h"
|
||||||
|
|
||||||
|
const String HTMLGenerator::GetElement(const String &tag, String &content, const String &attributes)
|
||||||
|
{
|
||||||
|
if (attributes != "")
|
||||||
|
{
|
||||||
|
content += "<" + tag + " " + attributes + ">" + content + "</" + tag + ">";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
content+= "<" + tag + ">" + content + "</" + tag + ">";
|
||||||
|
}
|
||||||
|
return content;
|
||||||
|
}
|
||||||
|
|
||||||
|
const String HTMLGenerator::DisplayPinStatus(const String &status, const String &link, bool isOn)
|
||||||
|
{
|
||||||
|
String element = isOn ? "H4" : "p";
|
||||||
|
String content = status + (link != "" ? " <a href=\"" + link + "\">" + (isOn ? "OFF" : "ON") + "</a>" : "");
|
||||||
|
return GetElement(element, content,"");
|
||||||
|
}
|
||||||
@@ -6,7 +6,7 @@
|
|||||||
class HTMLGenerator
|
class HTMLGenerator
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
static const String GetElement(const String &tag, const String &content, const String &attributes = "");
|
static const String GetElement(const String &tag, String &content, const String &attributes = "");
|
||||||
static const String DisplayPinStatus(const String &status, const String &link, bool isOn);
|
static const String DisplayPinStatus(const String &status, const String &link, bool isOn);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
|
||||||
|
#include <limits.h>
|
||||||
|
#include <Arduino.h>
|
||||||
|
#include "Helper.h"
|
||||||
|
|
||||||
|
unsigned long currentTime = millis();
|
||||||
|
unsigned long lastOverflowTime = 0; // Add missing declaration and initialization
|
||||||
|
|
||||||
|
// Function to check for overflow and update lastOverflowTime
|
||||||
|
bool Helper::hasOverflowed()
|
||||||
|
{
|
||||||
|
if (currentTime < lastOverflowTime)
|
||||||
|
{
|
||||||
|
lastOverflowTime = currentTime;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calculate elapsed time considering overflow
|
||||||
|
unsigned long Helper::getElapsedTime()
|
||||||
|
{
|
||||||
|
unsigned long elapsedTime = currentTime - lastOverflowTime;
|
||||||
|
if (hasOverflowed())
|
||||||
|
{
|
||||||
|
elapsedTime += (ULONG_MAX - lastOverflowTime); // Add the time since last overflow
|
||||||
|
}
|
||||||
|
return elapsedTime;
|
||||||
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
#ifndef HELPER_H
|
||||||
|
#define HELPER_H
|
||||||
|
|
||||||
|
#include <limits.h>
|
||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
class Helper
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
|
||||||
|
public:
|
||||||
|
Helper();
|
||||||
|
static bool hasOverflowed();
|
||||||
|
static unsigned long getElapsedTime();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
#include <Arduino.h>
|
|
||||||
|
|
||||||
class DeviceBase
|
|
||||||
{
|
|
||||||
|
|
||||||
public:
|
|
||||||
String Id;
|
|
||||||
DeviceBase(const String id) : Id(id) {}
|
|
||||||
};
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
#ifndef _Device_h
|
|
||||||
#define _Device_h
|
|
||||||
|
|
||||||
#include <Arduino.h>
|
|
||||||
|
|
||||||
class DeviceBase
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
String Id;
|
|
||||||
DeviceBase(const String id) : Id(id) {}
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
#include "Data/DeviceBase.h"
|
|
||||||
#include "Device/EEPROMUtils.h"
|
|
||||||
#include <Arduino.h>
|
|
||||||
|
|
||||||
class GSMMobileData : public DeviceBase
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
String MobileNumber;
|
|
||||||
String Sms;
|
|
||||||
|
|
||||||
GSMMobileData(String id) : DeviceBase(id)
|
|
||||||
{
|
|
||||||
MobileNumber = EEPROMUtils::ReadString(1, 20);
|
|
||||||
Sms = EEPROMUtils::ReadString(21, 100);
|
|
||||||
}
|
|
||||||
|
|
||||||
void updateMobileNumber(const String &newMobileNumber)
|
|
||||||
{
|
|
||||||
if (newMobileNumber.length() <= 0)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (newMobileNumber != MobileNumber)
|
|
||||||
{
|
|
||||||
MobileNumber = newMobileNumber;
|
|
||||||
EEPROMUtils::WriteString(1, newMobileNumber, 20);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void updateSMS(const String &newSMS)
|
|
||||||
{
|
|
||||||
if (newSMS.length() <= 0)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (newSMS != Sms)
|
|
||||||
{
|
|
||||||
Sms = newSMS;
|
|
||||||
EEPROMUtils::WriteString(21, newSMS, 100);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@@ -1,57 +0,0 @@
|
|||||||
#include <Arduino.h>
|
|
||||||
#include "DeviceBase.h"
|
|
||||||
|
|
||||||
class PinTypeIn : DeviceBase
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
int pin;
|
|
||||||
unsigned long debounceDelay;
|
|
||||||
unsigned long lastDebounceTime;
|
|
||||||
int lastButtonState;
|
|
||||||
int buttonState;
|
|
||||||
const char *description;
|
|
||||||
|
|
||||||
bool ReadValue()
|
|
||||||
{
|
|
||||||
int reading = digitalRead(pin);
|
|
||||||
|
|
||||||
if (reading != lastButtonState)
|
|
||||||
{
|
|
||||||
lastDebounceTime = millis();
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((millis() - lastDebounceTime) > debounceDelay)
|
|
||||||
{
|
|
||||||
if (reading != buttonState)
|
|
||||||
{
|
|
||||||
buttonState = reading;
|
|
||||||
|
|
||||||
if (buttonState == HIGH)
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
lastButtonState = reading;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public:
|
|
||||||
PinTypeIn(String id, int pin, unsigned long debounceDelay, const char *description) : DeviceBase(id)
|
|
||||||
{
|
|
||||||
this->pin = pin;
|
|
||||||
this->debounceDelay = debounceDelay;
|
|
||||||
this->description = description;
|
|
||||||
|
|
||||||
lastDebounceTime = 0;
|
|
||||||
lastButtonState = LOW;
|
|
||||||
buttonState = LOW;
|
|
||||||
pinMode(pin, INPUT);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool IsSetPinValueToHigh()
|
|
||||||
{
|
|
||||||
return ReadValue();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
#ifndef PinTypeIn_H
|
|
||||||
#define PinTypeIn_H
|
|
||||||
|
|
||||||
#include <Arduino.h>
|
|
||||||
#include <Data/DeviceBase.h>
|
|
||||||
|
|
||||||
class PinTypeIn : public DeviceBase
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
uint8_t pin;
|
|
||||||
unsigned long debounceDelay;
|
|
||||||
unsigned long lastDebounceTime;
|
|
||||||
int lastButtonState;
|
|
||||||
int buttonState;
|
|
||||||
|
|
||||||
bool ReadValue();
|
|
||||||
|
|
||||||
public:
|
|
||||||
PinTypeIn(String id, int pin, unsigned long debounceDelay, const char *description): DeviceBase(id){};
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
#include <Arduino.h>
|
|
||||||
#include "DeviceBase.h"
|
|
||||||
#include "Utills.h"
|
|
||||||
|
|
||||||
class PinTypeOut : public DeviceBase
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
uint8_t pinNumber;
|
|
||||||
bool lastState;
|
|
||||||
unsigned long debounceTime;
|
|
||||||
unsigned long lastStateChangeTime;
|
|
||||||
const char *description;
|
|
||||||
|
|
||||||
public:
|
|
||||||
PinTypeOut(String id, uint8_t pinNumber, bool lastState, unsigned long debounceTime, const char *description)
|
|
||||||
: DeviceBase(id), pinNumber(pinNumber), lastState(lastState), debounceTime(debounceTime), lastStateChangeTime(0), description(description)
|
|
||||||
{
|
|
||||||
pinMode(pinNumber, OUTPUT);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool IsTimeIgnoredPin()
|
|
||||||
{
|
|
||||||
bool currentInputState = digitalRead(pinNumber);
|
|
||||||
if (currentInputState != lastState && millis() - lastStateChangeTime >= debounceTime)
|
|
||||||
{
|
|
||||||
lastState = currentInputState;
|
|
||||||
lastStateChangeTime = millis();
|
|
||||||
// Add pin state change logic here
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SetOutputSignalToHighWithtimeIgnoring()
|
|
||||||
{
|
|
||||||
if (IsTimeIgnoredPin())
|
|
||||||
{
|
|
||||||
digitalWrite(pinNumber, HIGH);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void SetOutputSignalToLowWithtimeIgnoring()
|
|
||||||
{
|
|
||||||
if (IsTimeIgnoredPin())
|
|
||||||
{
|
|
||||||
digitalWrite(pinNumber, LOW);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void SetOutputSignalToHigh()
|
|
||||||
{
|
|
||||||
digitalWrite(pinNumber, HIGH);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SetOutputSignalToLow()
|
|
||||||
{
|
|
||||||
digitalWrite(pinNumber, LOW);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
#ifndef PinTypeOut_H
|
|
||||||
#define PinTypeOut_H
|
|
||||||
|
|
||||||
#include <Arduino.h>
|
|
||||||
#include "DeviceBase.h"
|
|
||||||
#include "Utills.h"
|
|
||||||
|
|
||||||
class PinTypeOut : public DeviceBase
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
uint8_t pinNumber;
|
|
||||||
bool lastState;
|
|
||||||
unsigned long debounceTime;
|
|
||||||
unsigned long lastStateChangeTime;
|
|
||||||
const char *description;
|
|
||||||
|
|
||||||
public:
|
|
||||||
PinTypeOut(String id, uint8_t pinNumber, bool lastState, unsigned long debounceTime, const char *description)
|
|
||||||
: DeviceBase(id), pinNumber(pinNumber), lastState(lastState), debounceTime(debounceTime), lastStateChangeTime(0), description(description)
|
|
||||||
{
|
|
||||||
};
|
|
||||||
|
|
||||||
/// @brief Ignoring input signal for debounce time
|
|
||||||
/// @return true is signal is ignored (debounced)
|
|
||||||
bool IsTimeIgnoredPin();
|
|
||||||
void SetOutputSignalToHighWithtimeIgnoring();
|
|
||||||
void SetOutputSignalToLowWithtimeIgnoring();
|
|
||||||
void SetOutputSignalToHigh();
|
|
||||||
void SetOutputSignalToLow();
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // PinOutData_H
|
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
#include <Ethernet.h>
|
|
||||||
|
|
||||||
class WebServerData
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
EthernetClient Client;
|
|
||||||
String Request;
|
|
||||||
bool IsEmpty;
|
|
||||||
|
|
||||||
WebServerData()
|
|
||||||
{
|
|
||||||
IsEmpty = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
WebServerData(const EthernetClient &client, const String &request)
|
|
||||||
{
|
|
||||||
Client = client;
|
|
||||||
Request = request;
|
|
||||||
IsEmpty = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
String getValue(const String &data, const String &key)
|
|
||||||
{
|
|
||||||
int keyIndex = data.indexOf(key);
|
|
||||||
if (keyIndex == -1)
|
|
||||||
{
|
|
||||||
return ""; // return empty string if key is not found
|
|
||||||
}
|
|
||||||
int separatorIndex = data.indexOf('&', keyIndex);
|
|
||||||
|
|
||||||
String value = data.substring(keyIndex + key.length(), separatorIndex != -1 ? separatorIndex : data.length());
|
|
||||||
|
|
||||||
return removeAllCharactesrAfterEmpty(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
String removeAllCharactesrAfterEmpty(String &data)
|
|
||||||
{
|
|
||||||
int keyIndex = data.indexOf(' ');
|
|
||||||
if (keyIndex == -1)
|
|
||||||
{
|
|
||||||
return data; // return empty string if key is not found
|
|
||||||
}
|
|
||||||
data.remove(keyIndex);
|
|
||||||
data.replace("_", " ");
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
#ifndef WebServerData_H
|
|
||||||
#define WebServerData_H
|
|
||||||
|
|
||||||
#include <Ethernet.h>
|
|
||||||
|
|
||||||
class WebServerData
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
EthernetClient Client;
|
|
||||||
String Request;
|
|
||||||
bool IsEmpty;
|
|
||||||
|
|
||||||
WebServerData();
|
|
||||||
WebServerData(EthernetClient &client, String &request);
|
|
||||||
String getValue(String &data, const String &key);
|
|
||||||
String removeAllCharactesrAfterEmpty(String &data);
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // WebServerData_H
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
#include <EEPROM.h>
|
|
||||||
#include <Arduino.h>
|
|
||||||
|
|
||||||
class EEPROMUtils
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
// Statická metoda pro čtení řetězce z EEPROM
|
|
||||||
static String ReadString(int addr, int length)
|
|
||||||
{
|
|
||||||
String data;
|
|
||||||
for (int i = 0; i < length; i++)
|
|
||||||
{
|
|
||||||
char onedata = char(EEPROM.read(addr + i)); // read one byte at a time
|
|
||||||
if (onedata == '\n')
|
|
||||||
return data;
|
|
||||||
data += onedata;
|
|
||||||
}
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Statická metoda pro zápis řetězce do EEPROM
|
|
||||||
static void WriteString(int addr, const String &data, int limit)
|
|
||||||
{
|
|
||||||
int numBytes = data.length(); // get length of the string
|
|
||||||
for (int i = 0; i < numBytes && i < limit; i++)
|
|
||||||
{
|
|
||||||
EEPROM.write(addr + i, data[i]); // write one byte at a time
|
|
||||||
}
|
|
||||||
if (numBytes < limit)
|
|
||||||
{
|
|
||||||
EEPROM.write(addr + numBytes, '\n'); // add newline character at the end
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
#ifndef EEPROMUtils_h
|
|
||||||
#define EEPROMUtils_h
|
|
||||||
|
|
||||||
class EEPROMUtils
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
static String ReadString(int addr, int length);
|
|
||||||
static void WriteString(int addr, const String &data, int limit);
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,88 +0,0 @@
|
|||||||
#include "Data/GSMMobileData.h"
|
|
||||||
#include "Utills.h"
|
|
||||||
#include <SoftwareSerial.h>
|
|
||||||
|
|
||||||
class GSMDevice
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
SoftwareSerial gsmSerial;
|
|
||||||
|
|
||||||
void end()
|
|
||||||
{
|
|
||||||
gsmSerial.end();
|
|
||||||
Utills::logDebug("GSM End ..");
|
|
||||||
}
|
|
||||||
|
|
||||||
void ExecuteAtCommand(const String &atCommand)
|
|
||||||
{
|
|
||||||
Utills::logDebug(atCommand);
|
|
||||||
gsmSerial.print(atCommand + "\r");
|
|
||||||
delay(500);
|
|
||||||
}
|
|
||||||
|
|
||||||
String ReadStringSerialPort()
|
|
||||||
{
|
|
||||||
return gsmSerial.readString();
|
|
||||||
}
|
|
||||||
|
|
||||||
void sendSMSToGSM(GSMMobileData gsmData)
|
|
||||||
{
|
|
||||||
Utills::logDebug("SMS Start SEND SMS Id:" + gsmData.Id + " M:" + gsmData.MobileNumber + " with message " + gsmData.Sms);
|
|
||||||
|
|
||||||
ExecuteAtCommand("AT+CMGF=1");
|
|
||||||
ExecuteAtCommand("AT + CMGS =\"" + gsmData.MobileNumber + "\"");
|
|
||||||
ExecuteAtCommand("ID:" + gsmData.Id + " Msg:" + gsmData.Sms);
|
|
||||||
|
|
||||||
delay(1000);
|
|
||||||
// Send a Ctrl+Z / ASCII SUB
|
|
||||||
gsmSerial.print((char)26);
|
|
||||||
delay(500);
|
|
||||||
// Close the connection
|
|
||||||
gsmSerial.print((char)27);
|
|
||||||
delay(500);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CheckSMSError()
|
|
||||||
{
|
|
||||||
String response = ReadStringSerialPort();
|
|
||||||
if (response.indexOf("ERROR") != -1)
|
|
||||||
{
|
|
||||||
// If there was an error, try to reconnect and resend
|
|
||||||
gsmSerial.println("AT+CFUN=1,1"); // Restart the module
|
|
||||||
delay(15000); // Wait for the module to restart
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
GSMDevice(uint8_t pinRx, uint8_t pinTx, long baudRate): gsmSerial(pinRx, pinTx)
|
|
||||||
{
|
|
||||||
//init software serial
|
|
||||||
gsmSerial.begin(baudRate);
|
|
||||||
Utills::logDebug("GSM Init ..");
|
|
||||||
delay(5000); // initialization GSM module (give it some time to boot up)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void sendSMS(GSMMobileData gsmData)
|
|
||||||
{
|
|
||||||
init();
|
|
||||||
sendSMSToGSM(gsmData);
|
|
||||||
|
|
||||||
if (CheckSMSError())
|
|
||||||
{
|
|
||||||
sendSMSToGSM(gsmData);
|
|
||||||
}
|
|
||||||
|
|
||||||
end();
|
|
||||||
}
|
|
||||||
|
|
||||||
// ~GSMDevice()
|
|
||||||
// {
|
|
||||||
// // close gsmSerial
|
|
||||||
// // close gsmSerial
|
|
||||||
// gsmSerial.end();
|
|
||||||
// }
|
|
||||||
};
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
#ifndef GSMDevice_H
|
|
||||||
#define GSMDevice_H
|
|
||||||
|
|
||||||
#include "Data/GSMMobileData.h"
|
|
||||||
#include "SoftwareSerial.h"
|
|
||||||
|
|
||||||
|
|
||||||
class GSMDevice
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
SoftwareSerial gsmSerial;
|
|
||||||
// Methods
|
|
||||||
void end();
|
|
||||||
void ExecuteAtCommand(const String &atCommand);
|
|
||||||
String ReadStringSerialPort();
|
|
||||||
void sendSMSToGSM(GSMMobileData gsmData);
|
|
||||||
|
|
||||||
public:
|
|
||||||
// Constructor
|
|
||||||
GSMDevice(uint8_t pinRx, uint8_t pinTx, long baudRate): gsmSerial(pinRx, pinTx){};
|
|
||||||
|
|
||||||
// Destructor
|
|
||||||
// ~GSMDevice();
|
|
||||||
|
|
||||||
// Methods
|
|
||||||
void sendSMS(GSMMobileData gsmData);
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // GSMDevice_H
|
|
||||||
@@ -1,68 +0,0 @@
|
|||||||
#include <Arduino.h>
|
|
||||||
#include <Ethernet.h>
|
|
||||||
#include "Data/WebServerData.h"
|
|
||||||
|
|
||||||
class WebServer
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
byte mac[6];
|
|
||||||
IPAddress ip;
|
|
||||||
EthernetServer server;
|
|
||||||
// Event
|
|
||||||
// Define the callback function type
|
|
||||||
|
|
||||||
// Declare a function pointer
|
|
||||||
// void (*Callback)(WebServerData) = WebBrowserDataCallback;
|
|
||||||
public:
|
|
||||||
EthernetClient client;
|
|
||||||
// Constructor
|
|
||||||
WebServer() : server(80) {}
|
|
||||||
|
|
||||||
WebServer(byte mac[6], IPAddress ip, uint16_t port) : ip(ip), server(port)
|
|
||||||
{
|
|
||||||
memcpy(this->mac, mac, sizeof(this->mac));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Initialize the Ethernet and start the server
|
|
||||||
void WebServer::Init()
|
|
||||||
{
|
|
||||||
Ethernet.begin(mac, ip);
|
|
||||||
server.begin();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handle client requests
|
|
||||||
WebServerData GetWebServerData()
|
|
||||||
{
|
|
||||||
// Check if a client has connected
|
|
||||||
client = server.available();
|
|
||||||
if (client)
|
|
||||||
{
|
|
||||||
if (client.connected())
|
|
||||||
{
|
|
||||||
while (client.available())
|
|
||||||
{
|
|
||||||
String request = client.readStringUntil('\r');
|
|
||||||
// If you've gotten to the end of the line (received a newline
|
|
||||||
// character) and the line is blank, the http request has ended,
|
|
||||||
// so you can send a reply
|
|
||||||
|
|
||||||
WebServerData webServerData = WebServerData(client, request);
|
|
||||||
return webServerData;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Give the web browser time to receive the data
|
|
||||||
}
|
|
||||||
|
|
||||||
return WebServerData(); // Return a default-constructed WebServerData object if no client is available
|
|
||||||
}
|
|
||||||
|
|
||||||
void WebServer::EndServer()
|
|
||||||
{
|
|
||||||
if (server.available())
|
|
||||||
{
|
|
||||||
delay(10);
|
|
||||||
// Close the connection
|
|
||||||
client.stop();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
#ifndef WebServer_H
|
|
||||||
#define WebServer_H
|
|
||||||
|
|
||||||
#include <Arduino.h>
|
|
||||||
#include <Ethernet.h>
|
|
||||||
#include "Data/WebServerData.h"
|
|
||||||
|
|
||||||
class WebServer
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
byte mac[6];
|
|
||||||
IPAddress ip;
|
|
||||||
EthernetServer server;
|
|
||||||
// Define the callback function type
|
|
||||||
|
|
||||||
public:
|
|
||||||
EthernetClient client;
|
|
||||||
// Constructor
|
|
||||||
WebServer() : server(80) {}
|
|
||||||
WebServer(byte mac[6], IPAddress ip, uint16_t port) : ip(ip), server(port)
|
|
||||||
{
|
|
||||||
memcpy(this->mac, mac, sizeof(this->mac));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Initialize the Ethernet and start the server
|
|
||||||
void Init();
|
|
||||||
|
|
||||||
// Handle client requests
|
|
||||||
WebServerData GetWebServerData();
|
|
||||||
void EndServer();
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // WebServer_H
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
#include <Arduino.h>
|
|
||||||
|
|
||||||
class HTMLGenerator
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
static const String GetElement(const String &tag, const String &content, const String &attributes = "")
|
|
||||||
{
|
|
||||||
String html_content = "";
|
|
||||||
if (attributes != "")
|
|
||||||
{
|
|
||||||
return "<" + tag + " " + attributes + ">" + content + "</" + tag + ">";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return "<" + tag + ">" + content + "</" + tag + ">";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static const String DisplayPinStatus(const String &status, const String &link, bool isOn)
|
|
||||||
{
|
|
||||||
String element = isOn ? "H4" : "p";
|
|
||||||
String content = status + (link != "" ? " <a href=\"" + link + "\">" + (isOn ? "OFF" : "ON") + "</a>" : "");
|
|
||||||
return GetElement(element, content);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
#include <Arduino.h>
|
|
||||||
|
|
||||||
class Utills
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
static void logDebug(const String& log)
|
|
||||||
{
|
|
||||||
Serial.println(log);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
#ifndef Utills_H
|
|
||||||
#define Utills_H
|
|
||||||
|
|
||||||
class Utills {
|
|
||||||
public:
|
|
||||||
static void logDebug(const String& log) {
|
|
||||||
// Implementation of the logDebug function goes here
|
|
||||||
// You can add your desired functionality inside this function
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
+74
-54
@@ -1,16 +1,19 @@
|
|||||||
#include "Device/GSMDevice.h"
|
#include "GSMMobileDevice.h"
|
||||||
#include "Device/WebServer.h"
|
#include "WebServer.h"
|
||||||
#include "Data/PinTypeIn.h"
|
#include "PinTypeIn.h"
|
||||||
#include "Data/PinTypeOut.h"
|
#include "PinTypeOut.h"
|
||||||
#include "Utills.h"
|
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <IPAddress.h>
|
#include <IPAddress.h>
|
||||||
#include <Ethernet.h>
|
#include <Ethernet.h>
|
||||||
|
#include "WebServer.h"
|
||||||
|
#include "WebServerData.h"
|
||||||
|
#include "DebugLog.h"
|
||||||
|
#include "HTMLGenerator.h"
|
||||||
|
|
||||||
// PIN INPUT Initialization as OUTPUT
|
// PIN INPUT Initialization as OUTPUT
|
||||||
static const int COUNT_OUTPUTS_PIN_OUT = 2;
|
static const int COUNT_OUTPUTS_PIN_OUT = 2;
|
||||||
static PinTypeOut PinIn8 = PinTypeOut("PIN8", 8, LOW, 10000, "Electric Alarm");
|
static PinTypeOut PinIn8 = PinTypeOut("PIN8", 8, "Electric Alarm");
|
||||||
static PinTypeOut PinIn7 = PinTypeOut("PIN7", 7, LOW, 100, "Default Description");
|
static PinTypeOut PinIn7 = PinTypeOut("PIN7", 7, "Default Description");
|
||||||
static const PinTypeOut OUPUTS_PINS_ARRAY[COUNT_OUTPUTS_PIN_OUT] = {PinIn8, PinIn7};
|
static const PinTypeOut OUPUTS_PINS_ARRAY[COUNT_OUTPUTS_PIN_OUT] = {PinIn8, PinIn7};
|
||||||
|
|
||||||
// PIN INPUT Initialization as INPUT
|
// PIN INPUT Initialization as INPUT
|
||||||
@@ -19,7 +22,7 @@ static PinTypeIn PinIn2 = PinTypeIn("PIN2", 2, 100, "Input EZS ALARM"); // 100ms
|
|||||||
static PinTypeIn PinIn3 = PinTypeIn("PIN3", 3, 100, "Input Contact Box");
|
static PinTypeIn PinIn3 = PinTypeIn("PIN3", 3, 100, "Input Contact Box");
|
||||||
static const PinTypeIn INPUTS_PINS_ARRAY[COUNT_INPUTS_PIN_IN] = {PinIn2, PinIn3};
|
static const PinTypeIn INPUTS_PINS_ARRAY[COUNT_INPUTS_PIN_IN] = {PinIn2, PinIn3};
|
||||||
|
|
||||||
// GSM Serial Port
|
// // GSM Serial Port
|
||||||
static const uint8_t GSM_PIN_RX = 10;
|
static const uint8_t GSM_PIN_RX = 10;
|
||||||
static const uint8_t GSM_PIN_TX = 11;
|
static const uint8_t GSM_PIN_TX = 11;
|
||||||
static const long GSM_BAUD_RATE = 115200;
|
static const long GSM_BAUD_RATE = 115200;
|
||||||
@@ -28,89 +31,86 @@ static const long GSM_BAUD_RATE = 115200;
|
|||||||
static byte WebServerMac[6] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
|
static byte WebServerMac[6] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
|
||||||
static IPAddress WebServerIP = IPAddress(192, 168, 1, 177);
|
static IPAddress WebServerIP = IPAddress(192, 168, 1, 177);
|
||||||
static const byte WebServerPort = 80;
|
static const byte WebServerPort = 80;
|
||||||
// Devices
|
// // Devices
|
||||||
|
|
||||||
GSMDevice gsmDevice = GSMDevice(GSM_PIN_RX, GSM_PIN_TX, GSM_BAUD_RATE);
|
GSMMobileDevice gsmDevice = GSMMobileDevice(GSM_PIN_RX, GSM_PIN_TX, GSM_BAUD_RATE);
|
||||||
// Pin Input
|
// // Pin Input
|
||||||
GSMMobileData gsmData = GSMMobileData("GSM");
|
GSMMobileData gsmData = GSMMobileData("GSM");
|
||||||
WebServer webServer;
|
WebServer webServer;
|
||||||
|
|
||||||
|
|
||||||
void SeparateDataFromRequest(WebServerData &request)
|
void SeparateDataFromRequest(WebServerData &request)
|
||||||
{
|
{
|
||||||
if (request.Request.indexOf("GET /?id=GSM") != -1)
|
|
||||||
|
int indexofHttp = request.Request.indexOf(" HTTP");
|
||||||
|
if (indexofHttp == -1)
|
||||||
{
|
{
|
||||||
Utills::logDebug("it is GSM");
|
DebugLog::log("ERROR: HTTP not found in GET Header!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
DebugLog::log("SeparateDataFromRequest: " + request.Request);
|
||||||
|
if (request.Request.indexOf("GET /id=GSM") != -1)
|
||||||
|
{
|
||||||
|
DebugLog::log("it is GSM");
|
||||||
// int start = request.indexOf("/?id=") + 2;
|
// int start = request.indexOf("/?id=") + 2;
|
||||||
String data = request.Request.substring(6);
|
String data = request.Request.substring(5);
|
||||||
Utills::logDebug("Update Data from GET: " + data);
|
DebugLog::log("Update Data from GET: " + data);
|
||||||
String value = request.getValue(data, "mobileNumber=");
|
String value = request.getValue(data, "mobileNumber=");
|
||||||
gsmData.updateMobileNumber(value);
|
gsmData.updateMobileNumber(value);
|
||||||
|
|
||||||
value = request.getValue(data, "sms=");
|
value = request.getValue(data, "sms=");
|
||||||
gsmData.updateSMS(value);
|
gsmData.updateSMS(value);
|
||||||
}
|
}
|
||||||
|
int indexPin = request.Request.indexOf("/PIN");
|
||||||
if (request.Request.indexOf("/PIN") == -1)
|
if (indexPin != -1)
|
||||||
{
|
{
|
||||||
String pinName = request.Request.substring(5, 4);
|
String pinName = request.Request.substring(indexPin + 1, indexofHttp);
|
||||||
Utills::logDebug("Update Data from GET as PIN : " + pinName);
|
DebugLog::log("GET as PIN [" + pinName + "]");
|
||||||
|
|
||||||
// foreach OUPUTS_PINS_ARRAY
|
// foreach OUPUTS_PINS_ARRAY
|
||||||
for (int i = 0; i < COUNT_OUTPUTS_PIN_OUT; i++)
|
for (int i = 0; i < COUNT_OUTPUTS_PIN_OUT; i++)
|
||||||
{
|
{
|
||||||
|
String actualPinName = request.getVariableName(pinName, "=");
|
||||||
PinTypeOut pinValue = OUPUTS_PINS_ARRAY[i];
|
PinTypeOut pinValue = OUPUTS_PINS_ARRAY[i];
|
||||||
if (pinValue.Id == pinName)
|
|
||||||
{
|
|
||||||
|
|
||||||
Utills::logDebug("Update Data from GET as PIN : " + pinName);
|
DebugLog::log("Compare Pin [" + actualPinName + "] with [" + pinValue.Id + "]");
|
||||||
|
if (pinValue.Id == actualPinName)
|
||||||
|
{
|
||||||
|
DebugLog::log("Update GET as PIN : " + actualPinName);
|
||||||
if (request.Request.indexOf("=ON") != -1)
|
if (request.Request.indexOf("=ON") != -1)
|
||||||
{
|
{
|
||||||
pinValue.SetOutputSignalToHighWithtimeIgnoring();
|
DebugLog::log("Set " + actualPinName + "=ON");
|
||||||
|
pinValue.setOutputSignalToHigh();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (request.Request.indexOf("=OFF") != -1)
|
if (request.Request.indexOf("=OFF") != -1)
|
||||||
{
|
{
|
||||||
pinValue.SetOutputSignalToLowWithtimeIgnoring();
|
DebugLog::log("Set " + actualPinName + "=OFF");
|
||||||
|
pinValue.setOutputSignalToLow();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebServerEvent(WebServerData data)
|
void WebServerEvent(WebServerData &data)
|
||||||
{
|
{
|
||||||
// Your function implementation here
|
// Your function implementation here
|
||||||
Utills::logDebug("Request: " + data.Request);
|
|
||||||
SeparateDataFromRequest(data);
|
SeparateDataFromRequest(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
void setup()
|
void setup()
|
||||||
{
|
{
|
||||||
|
DebugLog::init(115200);
|
||||||
|
DebugLog::log("Called: Setup");
|
||||||
webServer = WebServer(WebServerMac, WebServerIP, WebServerPort);
|
webServer = WebServer(WebServerMac, WebServerIP, WebServerPort);
|
||||||
// serial monitori init and set baud rate
|
// // serial monitori init and set baud rate
|
||||||
Serial.begin(9600);
|
|
||||||
webServer.Init();
|
webServer.init();
|
||||||
Utills::logDebug("Called: Setup");
|
DebugLog::log("Web Server Initilized");
|
||||||
}
|
}
|
||||||
|
|
||||||
void GenerateHtml(WebServerData data);
|
void GenerateHtml(WebServerData &data)
|
||||||
|
|
||||||
void loop()
|
|
||||||
{
|
|
||||||
WebServerData data = webServer.GetWebServerData();
|
|
||||||
if (!data.IsEmpty)
|
|
||||||
{
|
|
||||||
WebServerEvent(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (data.Client.available())
|
|
||||||
{
|
|
||||||
GenerateHtml(data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void GenerateHtml(WebServerData data)
|
|
||||||
{
|
{
|
||||||
EthernetClient client = data.Client;
|
EthernetClient client = data.Client;
|
||||||
client.println("HTTP/1.1 200 OK");
|
client.println("HTTP/1.1 200 OK");
|
||||||
@@ -121,20 +121,40 @@ void GenerateHtml(WebServerData data)
|
|||||||
client.println(" body { display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0;}");
|
client.println(" body { display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0;}");
|
||||||
client.println(".content {text-align: center;}");
|
client.println(".content {text-align: center;}");
|
||||||
|
|
||||||
|
for (int i = 0; i < COUNT_OUTPUTS_PIN_OUT; i++)
|
||||||
|
{
|
||||||
|
PinTypeOut pinValue = OUPUTS_PINS_ARRAY[i];
|
||||||
|
HTMLGenerator::DisplayPinStatus(pinValue.Id + "|" + pinValue.description, pinValue.Id, pinValue.IsPinOn());
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < COUNT_INPUTS_PIN_IN; i++)
|
||||||
|
{
|
||||||
|
PinTypeIn pinValue = INPUTS_PINS_ARRAY[i];
|
||||||
|
HTMLGenerator::DisplayPinStatus(pinValue.Id + "|" + pinValue.description,"", pinValue.IsPinHigh());
|
||||||
|
}
|
||||||
|
|
||||||
client.println("</style>");
|
client.println("</style>");
|
||||||
client.println("</head><body><div class=\"content\">");
|
client.println("</head><body><div class=\"content\">");
|
||||||
|
|
||||||
client.println("<H2> Trochta.net:</H2>");
|
client.println("<H2> Trochta.net:</H2>");
|
||||||
|
|
||||||
client.println("</div></body></html>");
|
client.println("</div></body></html>");
|
||||||
|
|
||||||
client.stop();
|
client.stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
int main()
|
void loop()
|
||||||
{
|
{
|
||||||
setup();
|
// DebugLog::log("Called: Loop");
|
||||||
while (true)
|
WebServerData data = webServer.getWebServerData();
|
||||||
|
if (!data.IsEmpty)
|
||||||
{
|
{
|
||||||
loop();
|
WebServerEvent(data);
|
||||||
}
|
}
|
||||||
return 0;
|
|
||||||
}
|
if (data.Client.available())
|
||||||
|
{
|
||||||
|
GenerateHtml(data);
|
||||||
|
data.Client.stop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user