GCC Code Coverage Report
Directory: lib/ Exec Total Coverage
File: lib/WifiConfig/WifiConfigStorage.cpp Lines: 77 84 91.7 %
Date: 2020-08-11 11:38:58 Branches: 26 34 76.5 %

Line Branch Exec Source
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