Skip to content

Commit fee2979

Browse files
committed
Lots of improvements
1 parent a80e7bd commit fee2979

15 files changed

+314
-61
lines changed

src/network/connection.cpp

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
THE SOFTWARE.
2222
*/
2323

24+
#include <cstdint>
25+
#include <cstring>
2426
#include <string_view>
2527

2628
#include "GlobalVars.h"
@@ -406,6 +408,38 @@ void Connection::sendFlexData(uint8_t sensorId, float flexLevel) {
406408
));
407409
}
408410

411+
// PACKET_PROVISIONING_NEW_TRACER 29
412+
void Connection::sendProvisioningNewTracker(uint8_t mac[6]) {
413+
MUST(m_Connected);
414+
ProvisioningNewTrackerPacket packet{};
415+
memcpy(packet.mac, mac, sizeof(packet.mac));
416+
MUST(sendPacket(SendPacketType::ProvisioningNewTracker, packet));
417+
}
418+
419+
// PACKET_PROVISIONING_STATUS 30
420+
void Connection::sendProvisioningStatus(
421+
uint8_t mac[6],
422+
ProvisioningPackets::ConnectionStatus status
423+
) {
424+
MUST(m_Connected);
425+
ProvisioningStatusPacket packet{
426+
.status = status,
427+
};
428+
memcpy(packet.mac, mac, sizeof(packet.mac));
429+
MUST(sendPacket(SendPacketType::ProvisioningStatus, packet));
430+
}
431+
432+
// PACKET_PROVISIONING_FAILED 31
433+
void Connection::sendProvisioningFailed(
434+
uint8_t mac[6],
435+
ProvisioningPackets::ConnectionError error
436+
) {
437+
MUST(m_Connected);
438+
ProvisioningFailedPacket packet{.error = error};
439+
memcpy(packet.mac, mac, sizeof(packet.mac));
440+
MUST(sendPacket(SendPacketType::ProvisioningFailed, packet));
441+
}
442+
409443
#if ENABLE_INSPECTION
410444
void Connection::sendInspectionRawIMUData(
411445
uint8_t sensorId,

src/network/connection.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,16 @@
2525

2626
#include <Arduino.h>
2727
#include <WiFiUdp.h>
28+
#include <sys/types.h>
2829

30+
#include <cstdint>
2931
#include <optional>
3032

3133
#include "../configuration/SensorConfig.h"
34+
#include "c_types.h"
3235
#include "featureflags.h"
3336
#include "globals.h"
37+
#include "network/wifiprovisioning/provisioning-packets.h"
3438
#include "packets.h"
3539
#include "quat.h"
3640
#include "sensors/sensor.h"
@@ -98,6 +102,19 @@ class Connection {
98102
// PACKET_FLEX_DATA 26
99103
void sendFlexData(uint8_t sensorId, float flexLevel);
100104

105+
// PACKET_PROVISIONING_NEW_TRACER 29
106+
void sendProvisioningNewTracker(uint8_t mac[6]);
107+
108+
// PACKET_PROVISIONING_STATUS 30
109+
void sendProvisioningStatus(
110+
uint8_t mac[6],
111+
ProvisioningPackets::ConnectionStatus status
112+
);
113+
114+
// PACKET_PROVISIONING_FAILED 31
115+
void
116+
sendProvisioningFailed(uint8_t mac[6], ProvisioningPackets::ConnectionError error);
117+
101118
#if ENABLE_INSPECTION
102119
void sendInspectionRawIMUData(
103120
uint8_t sensorId,

src/network/packets.h

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,9 @@ enum class SendPacketType : uint8_t {
5656
AcknowledgeConfigChange = 24,
5757
FlexData = 26,
5858
// PositionData = 27,
59-
ProvisioningNewTracker = 28,
60-
ProvisioningStatus = 29,
61-
ProvisioningFailed = 30,
59+
ProvisioningNewTracker = 29,
60+
ProvisioningStatus = 30,
61+
ProvisioningFailed = 31,
6262
Bundle = 100,
6363
Inspection = 105,
6464
};
@@ -73,7 +73,7 @@ enum class ReceivePacketType : uint8_t {
7373
SensorInfo = 15,
7474
FeatureFlags = 22,
7575
SetConfigFlag = 25,
76-
StartWiFiProvisioning = 27,
76+
StartWiFiProvisioning = 28,
7777
};
7878

7979
enum class InspectionPacketType : uint8_t {
@@ -240,16 +240,16 @@ struct StartWiFiProvisioningPacket {
240240
bool start;
241241
};
242242

243-
struct ProvisioningNewTracker {
243+
struct ProvisioningNewTrackerPacket {
244244
uint8_t mac[6];
245245
};
246246

247-
struct ProvisioningStatus {
247+
struct ProvisioningStatusPacket {
248248
uint8_t mac[6];
249249
SlimeVR::Network::ProvisioningPackets::ConnectionStatus status;
250250
};
251251

252-
struct ProvisioningFailed {
252+
struct ProvisioningFailedPacket {
253253
uint8_t mac[6];
254254
SlimeVR::Network::ProvisioningPackets::ConnectionError error;
255255
};

src/network/wifihandler.cpp

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,19 +53,21 @@ bool WiFiNetwork::isConnected() const {
5353
void WiFiNetwork::setWiFiCredentials(const char* SSID, const char* pass) {
5454
wifiProvisioning.stopSearchForProvider();
5555
wifiProvisioning.stopProvisioning();
56-
WiFi.persistent(true);
5756
tryConnecting(false, SSID, pass);
5857
retriedOnG = false;
59-
// Reset state, will get back into provisioning if can't connect
60-
hadWifi = false;
6158
wifiState = WiFiReconnectionStatus::ServerCredAttempt;
6259
}
6360

61+
void WiFiNetwork::setProvisionedWiFiCredentials(const char* SSID, const char* pass) {
62+
tryConnecting(false, SSID, pass);
63+
retriedOnG = false;
64+
wifiState = WiFiReconnectionStatus::ProvisionedAttempt;
65+
}
66+
6467
IPAddress WiFiNetwork::getAddress() { return WiFi.localIP(); }
6568

6669
void WiFiNetwork::setUp() {
67-
// Don't need to save the already saved credentials or the hardcoded ones
68-
WiFi.persistent(false);
70+
WiFi.persistent(true);
6971
wifiHandlerLogger.info("Setting up WiFi");
7072
WiFi.mode(WIFI_AP_STA);
7173
WiFi.hostname("SlimeVR FBT Tracker");
@@ -109,7 +111,6 @@ void WiFiNetwork::setUp() {
109111

110112
void WiFiNetwork::onConnected() {
111113
wifiState = WiFiReconnectionStatus::Success;
112-
wifiProvisioning.stopProvisioning();
113114
statusManager.setStatus(SlimeVR::Status::WIFI_CONNECTING, false);
114115
hadWifi = true;
115116
wifiHandlerLogger.info(
@@ -201,6 +202,12 @@ void WiFiNetwork::upkeep() {
201202
wifiState = WiFiReconnectionStatus::Failed;
202203
}
203204
return;
205+
case WiFiReconnectionStatus::ProvisionedAttempt: // Couldn't connect with
206+
// credentials received from
207+
// provisioning
208+
if (!tryProvisionedCredentials()) {
209+
wifiState = WiFiReconnectionStatus::Failed;
210+
}
204211
case WiFiReconnectionStatus::Failed: // Couldn't connect with second set of
205212
// credentials or server credentials
206213
if (startedProvisioning) {
@@ -347,6 +354,20 @@ bool WiFiNetwork::tryServerCredentials() {
347354
return tryConnecting(true);
348355
}
349356

357+
bool WiFiNetwork::tryProvisionedCredentials() {
358+
if (WiFi.status() != WL_DISCONNECTED) {
359+
return false;
360+
}
361+
362+
if (retriedOnG) {
363+
return false;
364+
}
365+
366+
retriedOnG = true;
367+
368+
return tryConnecting(true);
369+
}
370+
350371
bool WiFiNetwork::tryConnecting(bool phyModeG, const char* SSID, const char* pass) {
351372
#if ESP8266
352373
if (phyModeG) {

src/network/wifihandler.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ class WiFiNetwork {
3838
SavedAttempt,
3939
HardcodeAttempt,
4040
ServerCredAttempt,
41+
ProvisionedAttempt,
4142
Failed,
4243
Success
4344
};
@@ -53,23 +54,25 @@ class WiFiNetwork {
5354
void setUp();
5455
void upkeep();
5556
void setWiFiCredentials(const char* SSID, const char* pass);
57+
void setProvisionedWiFiCredentials(const char* SSID, const char* pass);
5658
static IPAddress getAddress();
5759
WiFiReconnectionStatus getWiFiState();
5860
bool startedProvisioning = false;
5961

62+
static String getSSID();
63+
static String getPassword();
64+
6065
private:
6166
static constexpr float WiFiTimeoutSeconds = 11;
6267

6368
void reportWifiProgress();
6469
void setStaticIPIfDefined();
6570
void onConnected();
6671

67-
static String getSSID();
68-
static String getPassword();
69-
7072
bool trySavedCredentials();
7173
bool tryHardcodedCredentials();
7274
bool tryServerCredentials();
75+
bool tryProvisionedCredentials();
7376
bool tryConnecting(
7477
bool phyModeG = false,
7578
const char* SSID = nullptr,
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#include "provisioning-packets.h"
2+
3+
namespace SlimeVR::Network::ProvisioningPackets {
4+
5+
const char* statusToCstr(ConnectionStatus status) {
6+
switch (status) {
7+
case ConnectionStatus::Connecting:
8+
return "Connecting";
9+
case ConnectionStatus::Connected:
10+
return "Connected";
11+
case ConnectionStatus::ServerFound:
12+
return "Server Found";
13+
}
14+
return "Unknown";
15+
}
16+
17+
const char* errorToCstr(ConnectionError error) {
18+
switch (error) {
19+
case ConnectionError::ConnectionFailed:
20+
return "Connection Failed";
21+
case ConnectionError::ServerNotFound:
22+
return "Server Not Found";
23+
}
24+
return "Unknown";
25+
}
26+
27+
} // namespace SlimeVR::Network::ProvisioningPackets

src/network/wifiprovisioning/provisioning-packets.h

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,13 @@
55
namespace SlimeVR::Network::ProvisioningPackets {
66

77
enum class ProvisioningPacketId : uint8_t {
8-
ProvisioningAvailable = 0,
9-
ProvisioningRequest = 1,
10-
ProvisioningStart = 2,
11-
ProvisioningStarted = 3,
12-
ProvisioningStatus = 4,
13-
ProvisioningFailed = 5,
8+
ProvisioningAvailable,
9+
ProvisioningRequest,
10+
ProvisioningStart,
11+
ProvisioningStatus,
12+
ProvisioningStatusAck,
13+
ProvisioningFailed,
14+
ProvisioningFailedAck,
1415
};
1516

1617
#pragma pack(push, 1)
@@ -26,11 +27,15 @@ enum class ConnectionStatus : uint8_t {
2627
ServerFound,
2728
};
2829

30+
const char* statusToCstr(ConnectionStatus status);
31+
2932
enum class ConnectionError : uint8_t {
3033
ConnectionFailed,
3134
ServerNotFound,
3235
};
3336

37+
const char* errorToCstr(ConnectionError error);
38+
3439
struct ProvisioningAvailable
3540
: ProvisioningPacket<ProvisioningPacketId::ProvisioningAvailable> {};
3641

@@ -46,19 +51,22 @@ struct ProvisioningStart : ProvisioningPacket<ProvisioningPacketId::Provisioning
4651
char wifiPassword[64] = "";
4752
};
4853

49-
struct ProvisioningStarted
50-
: ProvisioningPacket<ProvisioningPacketId::ProvisioningStarted> {};
51-
5254
struct ProvisioningStatus
5355
: ProvisioningPacket<ProvisioningPacketId::ProvisioningStatus> {
5456
ConnectionStatus status = ConnectionStatus::Connecting;
5557
};
5658

59+
struct ProvisioningStatusAck
60+
: ProvisioningPacket<ProvisioningPacketId::ProvisioningStatusAck> {};
61+
5762
struct ProvisioningFailed
5863
: ProvisioningPacket<ProvisioningPacketId::ProvisioningFailed> {
5964
ConnectionError error = ConnectionError::ConnectionFailed;
6065
};
6166

67+
struct ProvisioningFailedAck
68+
: ProvisioningPacket<ProvisioningPacketId::ProvisioningFailedAck> {};
69+
6270
#pragma pack(pop)
6371

6472
} // namespace SlimeVR::Network::ProvisioningPackets

src/network/wifiprovisioning/provisioning-party.cpp

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#include <cstdint>
2+
#include <optional>
23

34
#include "logging/Logger.h"
45
#include "provisioning-party.h"
@@ -8,6 +9,16 @@ namespace SlimeVR::Network {
89
ProvisioningParty::ProvisioningParty(SlimeVR::Logging::Logger& logger) noexcept
910
: logger{logger} {}
1011

12+
void ProvisioningParty::handleSendResult(bool success) { lastPacketSuccess = success; }
13+
14+
void ProvisioningParty::resetLastSendResult() { lastPacketSuccess.reset(); }
15+
16+
std::optional<bool> ProvisioningParty::getLastSendResult() {
17+
auto result = lastPacketSuccess;
18+
lastPacketSuccess.reset();
19+
return result;
20+
}
21+
1122
void ProvisioningParty::addPeer(uint8_t macAddress[6]) const {
1223
#if ESP8266
1324
esp_now_add_peer(macAddress, ESP_NOW_ROLE_COMBO, 0, nullptr, 0);
@@ -25,12 +36,4 @@ void ProvisioningParty::removePeer(uint8_t macAddress[6]) const {
2536
esp_now_del_peer(macAddress);
2637
}
2738

28-
void ProvisioningParty::sendMessage(
29-
uint8_t receiverMac[6],
30-
const uint8_t* data,
31-
uint8_t length
32-
) const {
33-
// TODO:
34-
}
35-
3639
} // namespace SlimeVR::Network

0 commit comments

Comments
 (0)