1 |
|
|
// |
2 |
|
|
// Created by Nils Bokermann on 19.11.19. |
3 |
|
|
// |
4 |
|
|
|
5 |
|
|
#include "WifiConfigStorage.h" |
6 |
|
|
|
7 |
|
|
#include <Arduino.h> |
8 |
|
|
|
9 |
|
|
|
10 |
|
|
static const char *const ap_name = "ESP8266_Config_WLAN"; |
11 |
|
|
|
12 |
|
|
static const char *const default_password = "12345678"; |
13 |
|
|
|
14 |
|
6 |
int WifiConfigStorage::getNumberOfKnownNetworks() { |
15 |
✓✓ |
6 |
return storageIsValid ? actualData.numberOfNets : -1; |
16 |
|
|
} |
17 |
|
|
|
18 |
|
2 |
void WifiConfigStorage::addWifiNetwork(WifiStorage newNetwork) { |
19 |
✗✓ |
2 |
if (!storageIsValid) { |
20 |
|
|
initStorage(); |
21 |
|
|
} |
22 |
✓✗ |
2 |
if (actualData.numberOfNets < MAX_NUMBER_OF_NETS) { |
23 |
|
2 |
memcpy(actualData.knownNets[actualData.numberOfNets].AccessPointName, newNetwork.AccessPointName, |
24 |
|
2 |
ACCESSPOINT_NAME_LENGTH); |
25 |
|
2 |
memcpy(actualData.knownNets[actualData.numberOfNets].AccessPointPassword, newNetwork.AccessPointPassword, |
26 |
|
2 |
WIFI_PASSWORD_LENGTH); |
27 |
|
2 |
actualData.numberOfNets++; |
28 |
|
2 |
storageIsDirty = true; |
29 |
|
|
} |
30 |
|
2 |
saveToEEPROM(); |
31 |
|
2 |
} |
32 |
|
|
|
33 |
|
5 |
void WifiConfigStorage::saveToEEPROM() { |
34 |
|
5 |
log->trace("saveToEEPROM"); |
35 |
|
5 |
storage->put(actualData); |
36 |
✓✓ |
5 |
if (storage->commit()) { |
37 |
|
2 |
storageIsDirty = false; |
38 |
|
2 |
log->trace("EEPROM successfully updated"); |
39 |
|
|
} else { |
40 |
|
3 |
log->trace("EEPROM could not be updated"); |
41 |
|
3 |
storageIsValid = false; |
42 |
|
|
} |
43 |
|
5 |
} |
44 |
|
|
|
45 |
|
13 |
void WifiConfigStorage::initStorage() { |
46 |
|
13 |
storage->begin(); |
47 |
|
13 |
storage->get(actualData); |
48 |
✓✓ |
13 |
if (memcmp("NB", actualData.configValid, 3) == 0) { |
49 |
|
12 |
storageIsValid = true; |
50 |
|
12 |
log->trace("Storage was valid\n"); |
51 |
|
|
} else { |
52 |
|
1 |
log->trace("storate is invalid, generating default."); |
53 |
|
1 |
resetStorage(); |
54 |
|
1 |
storageIsValid = true; |
55 |
|
|
} |
56 |
|
13 |
} |
57 |
|
|
|
58 |
|
|
|
59 |
|
3 |
WifiStorage *WifiConfigStorage::retrieveNetwork(const char *const ssid) { |
60 |
|
3 |
log->trace("Retrieving info for ssid: %s\n", ssid); |
61 |
✗✓ |
3 |
if (!storageIsValid) { |
62 |
|
|
log->trace("Storage was invalid, initalizing\n"); |
63 |
|
|
initStorage(); |
64 |
|
|
} |
65 |
✓✓ |
6 |
for (int i = 0; i < actualData.numberOfNets; i++) { |
66 |
|
5 |
log->trace("checking against %s\n", actualData.knownNets[i].AccessPointName); |
67 |
✓✓ |
5 |
if (memcmp(actualData.knownNets[i].AccessPointName, ssid, MAX_NUMBER_OF_NETS) == 0) { |
68 |
|
2 |
log->trace("Network was found\n"); |
69 |
|
2 |
return &actualData.knownNets[i]; |
70 |
|
|
} |
71 |
|
|
} |
72 |
|
1 |
return nullptr; |
73 |
|
|
} |
74 |
|
|
|
75 |
|
1 |
WifiConfigStorage::WifiConfigStorage(Logging *logger, AbstractWifiStorage *abstractStorage) : storageIsValid(false), |
76 |
|
|
storageIsDirty(false), |
77 |
|
|
actualData{}, log(logger), |
78 |
|
1 |
storage(abstractStorage) { |
79 |
|
1 |
memcpy(actualData.configValid, "NV", 3); |
80 |
|
1 |
WifiStorage nullstorage{}; |
81 |
|
1 |
memset(nullstorage.AccessPointName, '\0', ACCESSPOINT_NAME_LENGTH); |
82 |
|
1 |
memset(nullstorage.AccessPointPassword, '\0', WIFI_PASSWORD_LENGTH); |
83 |
✓✓ |
6 |
for (int i : {0, 1, 2, 3, 4}) { |
84 |
|
5 |
actualData.knownNets[i] = nullstorage; |
85 |
|
|
} |
86 |
|
1 |
actualData.numberOfNets = 0; |
87 |
|
1 |
} |
88 |
|
|
|
89 |
|
|
WifiConfigStorage::~WifiConfigStorage() { |
90 |
|
|
storage->end(); |
91 |
|
|
} |
92 |
|
|
|
93 |
|
1 |
char *WifiConfigStorage::getApSSID(int i) { |
94 |
✓✗✓✗
|
1 |
if (storageIsValid && i < actualData.numberOfNets) { |
95 |
|
1 |
return actualData.knownNets[i].AccessPointName; |
96 |
|
|
} |
97 |
|
|
return nullptr; |
98 |
|
|
} |
99 |
|
|
|
100 |
|
1 |
WifiStorage WifiConfigStorage::getSoftAPData() { |
101 |
✗✓ |
1 |
if (!storageIsValid) { |
102 |
|
|
initStorage(); |
103 |
|
|
} |
104 |
|
1 |
return actualData.fallback; |
105 |
|
|
} |
106 |
|
|
|
107 |
|
3 |
void WifiConfigStorage::removeWifiNetwork(const char *const ssid) { |
108 |
✓✓ |
5 |
for (int i = 0; i < actualData.numberOfNets; i++) { |
109 |
✓✓ |
4 |
if (strncmp(actualData.knownNets[i].AccessPointName, ssid, ACCESSPOINT_NAME_LENGTH) == 0) { |
110 |
|
|
// Move all following members down |
111 |
|
2 |
log->trace("Removing entry for ssid: %s", actualData.knownNets[i].AccessPointName); |
112 |
|
2 |
int j = i + 1; |
113 |
✓✓ |
6 |
while (j < actualData.numberOfNets) { |
114 |
|
2 |
actualData.knownNets[j - 1] = actualData.knownNets[j]; |
115 |
|
2 |
j++; |
116 |
|
|
} |
117 |
|
2 |
actualData.numberOfNets--; |
118 |
|
2 |
saveToEEPROM(); |
119 |
|
2 |
return; |
120 |
|
|
} |
121 |
|
|
} |
122 |
|
|
} |
123 |
|
|
|
124 |
|
1 |
void WifiConfigStorage::resetStorage() { |
125 |
|
1 |
actualData.numberOfNets = 0; |
126 |
|
1 |
strncpy(actualData.configValid, "NB", 3); |
127 |
|
1 |
actualData.numberOfNets = 0; |
128 |
|
1 |
actualData.numberOfNets = 0; |
129 |
|
1 |
strncpy(actualData.fallback.AccessPointName, ap_name, ACCESSPOINT_NAME_LENGTH); |
130 |
|
1 |
strncpy(actualData.fallback.AccessPointPassword, default_password, WIFI_PASSWORD_LENGTH); |
131 |
|
1 |
saveToEEPROM(); |
132 |
✓✗✓✗
|
4 |
} |
133 |
|
|
|