-
Notifications
You must be signed in to change notification settings - Fork 85
/
Copy pathsystem_status_controller.h
99 lines (86 loc) · 2.97 KB
/
system_status_controller.h
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
#ifndef _SYSTEM_STATUS_CONTROLLER_H_
#define _SYSTEM_STATUS_CONTROLLER_H_
#include "sensesp/net/networking.h"
#include "sensesp/signalk/signalk_ws_client.h"
#include "sensesp/system/lambda_consumer.h"
#include "sensesp/system/valueproducer.h"
namespace sensesp {
enum class SystemStatus {
kWifiNoAP = 100,
kWifiDisconnected,
kWifiManagerActivated,
kSKWSDisconnected,
kSKWSAuthorizing,
kSKWSConnecting,
kSKWSConnected
};
/**
* @brief Base class for a controller that can react to system status events
*
* Classes inheriting from SystemStatusController should override the
* set_wifi_* and set_ws_* methods to take the relevant action when such
* an event occurs.
*/
class SystemStatusController : public ValueProducer<SystemStatus> {
public:
SystemStatusController() {}
ValueConsumer<WiFiState>& get_wifi_state_consumer() {
return wifi_state_consumer_;
}
ValueConsumer<SKWSConnectionState>& get_ws_connection_state_consumer() {
return ws_connection_state_consumer_;
}
protected:
void set_wifi_state(const WiFiState& new_value) {
switch (new_value) {
case WiFiState::kWifiNoAP:
this->update_state(SystemStatus::kWifiNoAP);
break;
case WiFiState::kWifiDisconnected:
this->update_state(SystemStatus::kWifiDisconnected);
break;
case WiFiState::kWifiConnectedToAP:
case WiFiState::kWifiAPModeActivated:
this->update_state(SystemStatus::kSKWSDisconnected);
break;
case WiFiState::kWifiManagerActivated:
this->update_state(SystemStatus::kWifiManagerActivated);
break;
}
}
void set_sk_ws_connection_state(const SKWSConnectionState& new_value) {
switch (new_value) {
case SKWSConnectionState::kSKWSDisconnected:
if (current_state_ != SystemStatus::kWifiDisconnected &&
current_state_ != SystemStatus::kWifiNoAP &&
current_state_ != SystemStatus::kWifiManagerActivated) {
// Wifi disconnection states override the higher level protocol state
this->update_state(SystemStatus::kSKWSDisconnected);
}
break;
case SKWSConnectionState::kSKWSConnecting:
this->update_state(SystemStatus::kSKWSConnecting);
break;
case SKWSConnectionState::kSKWSAuthorizing:
this->update_state(SystemStatus::kSKWSAuthorizing);
break;
case SKWSConnectionState::kSKWSConnected:
this->update_state(SystemStatus::kSKWSConnected);
break;
}
}
LambdaConsumer<WiFiState> wifi_state_consumer_{
[this](const WiFiState& new_value) { this->set_wifi_state(new_value); }};
LambdaConsumer<SKWSConnectionState> ws_connection_state_consumer_{
[this](const SKWSConnectionState& new_value) {
this->set_sk_ws_connection_state(new_value);
}};
void update_state(const SystemStatus new_state) {
current_state_ = new_state;
this->emit(new_state);
}
private:
SystemStatus current_state_ = SystemStatus::kWifiNoAP;
};
} // namespace sensesp
#endif