-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDeviceRuntime.cpp
More file actions
127 lines (108 loc) · 4.51 KB
/
DeviceRuntime.cpp
File metadata and controls
127 lines (108 loc) · 4.51 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#include <DeviceRuntime.h>
// extern
DeviceRootConfig *rootConfig = new DeviceRootConfig();
MQTTDeviceService *mqttDeviceService;
MQTTDeviceInfo deviceInfo;
// intern
DeviceUpdateService *deviceUpdateService;
DNSServer dnsServer;
boolean configureMode = false;
unsigned long updateTimer = millis();
const int UPDATE_TIMEOUT = 60000;
const int MAX_WIFI_RECONNECT_TRIES = 3;
void setupDevice(WiFiClient &espClient, const String deviceId, const int buildNumber, int resetButtonPin,
const String pingId, String resetStateSwitchId, void mqttSetupFunction()) {
mountFileSystem();
checkForConfigurationReset(resetButtonPin);
if (rootConfig->read()) {
wifi_connection_status connection_status = setupWifiConnection(
rootConfig->wifiSSID, rootConfig->wifiPasswd, rootConfig->getCleanedDeviceName(), WIFI_STA, 12);
if (connection_status == CONNECTED) {
setupMqttDeviceService(espClient, deviceId, buildNumber, pingId, resetStateSwitchId);
mqttSetupFunction();
mqttDeviceService->setupMQTTDevices();
if (rootConfig->updateServerSet()) {
String deviceVersion = deviceId + "-" + VERSION + "-" + buildNumber;
setupUpdateService(espClient, rootConfig->updateServer, rootConfig->updateServerPort, deviceVersion);
}
return;
} else if (connection_status == CONNECTION_NOT_POSSIBLE) {
Serial.println("WiFi Connection failed, restarting device...");
ESP.restart();
}
Serial.println("WiFi Connection failed. SSID or password wrong, starting access point...");
}
dnsServer = setupSoftAccessPointWithDnsServer(MANUFACTURER + "_" + deviceId, "configure.me");
configureWebServer();
configureMode = true;
}
int totalFailedWifiReconnectTries = 0;
void loopDevice(int delayTimeout) {
if (configureMode) {
dnsServer.processNextRequest();
handleWebServerClient();
} else {
if (deviceUpdateService && (millis() - updateTimer) >= UPDATE_TIMEOUT) {
deviceUpdateService->installUpdateIfPossible();
updateTimer = millis();
}
if (checkWifiStatus(rootConfig->wifiSSID, rootConfig->wifiPasswd, rootConfig->getCleanedDeviceName(),
WIFI_STA, 8)) {
totalFailedWifiReconnectTries = 0;
mqttDeviceService->executeLoop();
} else {
if (totalFailedWifiReconnectTries == MAX_WIFI_RECONNECT_TRIES) {
ESP.restart();
}
totalFailedWifiReconnectTries += 1;
}
}
delay(delayTimeout);
}
MQTTDeviceInfo getMQTTDeviceInfo() { return deviceInfo; }
void registerMQTTDevice(MQTTPublisher *mqttPublisher) { mqttDeviceService->addPublisher(mqttPublisher); }
void registerMQTTDevice(MQTTStateConsumer *mqttStateConsumer) {
mqttDeviceService->addStateConsumer(mqttStateConsumer);
}
void checkForConfigurationReset(int resetButtonPin) {
EasyButton flashButton(resetButtonPin);
flashButton.begin();
flashButton.onPressed(onResetRequested);
for (int i = 0; i < 10; i++) {
flashButton.read();
delay(100);
}
}
void onResetRequested() {
rootConfig->deleteConfig();
Serial.println("Configuration resetted!");
pinMode(LED_BUILTIN, OUTPUT);
for (int i = 0; i <= 5; i++) {
digitalWrite(LED_BUILTIN, HIGH);
delay(200);
digitalWrite(LED_BUILTIN, LOW);
delay(200);
}
}
void setupMqttDeviceService(WiFiClient &espClient, const String deviceId, const int buildNumber,
const String pingId, const String resetStateSwitchId) {
mqttDeviceService = rootConfig->createMQTTDeviceService(espClient, messageReceived);
deviceInfo = rootConfig->createMQTTDeviceInfo(deviceId, buildNumber, "Node MCU");
configureStandardMQTTOperations(mqttDeviceService, deviceInfo, pingId, resetStateSwitchId);
}
void configureStandardMQTTOperations(MQTTDeviceService *deviceService, MQTTDeviceInfo deviceInfo,
const String pingId, const String resetStateSwitchId) {
MQTTDevicePing *devicePing = new MQTTDevicePing(deviceInfo, pingId, 30000);
deviceService->addPublisher(devicePing);
MQTTDeviceResetSwitch *resetStateSwitch =
new MQTTDeviceResetSwitch(deviceInfo, resetStateSwitchId, "reset_switch");
deviceService->setResetStateConsumer(resetStateSwitch);
}
void setupUpdateService(WiFiClient &client, String server, int port, String deviceVersion) {
deviceUpdateService = new DeviceUpdateService(client, server, port, deviceVersion);
deviceUpdateService->setup();
}
void messageReceived(String &topic, String &payload) {
Serial.println("incoming: " + topic + " - " + payload);
mqttDeviceService->handleMessage(topic, payload);
}