14
14
15
15
namespace esp_modem {
16
16
17
+ namespace transitions {
18
+
19
+ static bool exit_data (DTE &dte, ModuleIf &device, Netif &netif)
20
+ {
21
+ netif.stop ();
22
+ auto signal = std::make_shared<SignalGroup>();
23
+ std::weak_ptr<SignalGroup> weak_signal = signal ;
24
+ dte.set_read_cb ([weak_signal](uint8_t *data, size_t len) -> bool {
25
+ if (memchr (data, ' \n ' , len))
26
+ {
27
+ ESP_LOG_BUFFER_HEXDUMP (" esp-modem: debug_data" , data, len, ESP_LOG_DEBUG);
28
+ const auto pass = std::list<std::string_view>({" NO CARRIER" , " DISCONNECTED" });
29
+ std::string_view response ((char *) data, len);
30
+ for (auto &it : pass)
31
+ if (response.find (it) != std::string::npos) {
32
+ if (auto signal = weak_signal.lock ()) {
33
+ signal ->set (1 );
34
+ }
35
+ return true ;
36
+ }
37
+ }
38
+ return false ;
39
+ });
40
+ netif.wait_until_ppp_exits ();
41
+ if (!signal ->wait (1 , 2000 )) {
42
+ if (!device.set_mode (modem_mode::COMMAND_MODE)) {
43
+ return false ;
44
+ }
45
+ }
46
+ dte.set_read_cb (nullptr );
47
+ if (!dte.set_mode (modem_mode::COMMAND_MODE)) {
48
+ return false ;
49
+ }
50
+ return true ;
51
+ }
52
+
53
+ static bool enter_data (DTE &dte, ModuleIf &device, Netif &netif)
54
+ {
55
+ if (!device.setup_data_mode ()) {
56
+ return false ;
57
+ }
58
+ if (!device.set_mode (modem_mode::DATA_MODE)) {
59
+ return false ;
60
+ }
61
+ if (!dte.set_mode (modem_mode::DATA_MODE)) {
62
+ return false ;
63
+ }
64
+ netif.start ();
65
+ return true ;
66
+ }
67
+
68
+ } // namespace transitions
69
+
17
70
/* *
18
71
* Set mode while the entire DTE is locked
19
72
*/
@@ -36,8 +89,8 @@ bool DCE_Mode::set_unsafe(DTE *dte, ModuleIf *device, Netif &netif, modem_mode m
36
89
switch (m) {
37
90
case modem_mode::UNDEF:
38
91
break ;
39
- case modem_mode::COMMAND_MODE: {
40
- if (mode == modem_mode::COMMAND_MODE) {
92
+ case modem_mode::COMMAND_MODE:
93
+ if (mode == modem_mode::COMMAND_MODE || mode >= modem_mode::CMUX_MANUAL_MODE ) {
41
94
return false ;
42
95
}
43
96
if (mode == modem_mode::CMUX_MODE) {
@@ -49,59 +102,23 @@ bool DCE_Mode::set_unsafe(DTE *dte, ModuleIf *device, Netif &netif, modem_mode m
49
102
mode = m;
50
103
return true ;
51
104
}
52
- netif.stop ();
53
- auto signal = std::make_shared<SignalGroup>();
54
- std::weak_ptr<SignalGroup> weak_signal = signal ;
55
- dte->set_read_cb ([weak_signal](uint8_t *data, size_t len) -> bool {
56
- if (memchr (data, ' \n ' , len))
57
- {
58
- ESP_LOG_BUFFER_HEXDUMP (" esp-modem: debug_data" , data, len, ESP_LOG_DEBUG);
59
- const auto pass = std::list<std::string_view>({" NO CARRIER" , " DISCONNECTED" });
60
- std::string_view response ((char *) data, len);
61
- for (auto &it : pass)
62
- if (response.find (it) != std::string::npos) {
63
- if (auto signal = weak_signal.lock ()) {
64
- signal ->set (1 );
65
- }
66
- return true ;
67
- }
68
- }
69
- return false ;
70
- });
71
- netif.wait_until_ppp_exits ();
72
- if (!signal ->wait (1 , 2000 )) {
73
- if (!device->set_mode (modem_mode::COMMAND_MODE)) {
74
- mode = modem_mode::UNDEF;
75
- return false ;
76
- }
77
- }
78
- dte->set_read_cb (nullptr );
79
- if (!dte->set_mode (modem_mode::COMMAND_MODE)) {
105
+ if (!transitions::exit_data (*dte, *device, netif)) {
80
106
mode = modem_mode::UNDEF;
81
107
return false ;
82
108
}
83
109
mode = m;
84
110
return true ;
85
- }
86
- break ;
87
111
case modem_mode::DATA_MODE:
88
- if (mode == modem_mode::DATA_MODE || mode == modem_mode::CMUX_MODE) {
89
- return false ;
90
- }
91
- if (!device->setup_data_mode ()) {
112
+ if (mode == modem_mode::DATA_MODE || mode == modem_mode::CMUX_MODE || mode >= modem_mode::CMUX_MANUAL_MODE) {
92
113
return false ;
93
114
}
94
- if (!device-> set_mode (modem_mode::DATA_MODE )) {
115
+ if (!transitions::enter_data (*dte, *device, netif )) {
95
116
return false ;
96
117
}
97
- if (!dte->set_mode (modem_mode::DATA_MODE)) {
98
- return false ;
99
- }
100
- netif.start ();
101
118
mode = m;
102
119
return true ;
103
120
case modem_mode::CMUX_MODE:
104
- if (mode == modem_mode::DATA_MODE || mode == modem_mode::CMUX_MODE) {
121
+ if (mode == modem_mode::DATA_MODE || mode == modem_mode::CMUX_MODE || mode >= modem_mode::CMUX_MANUAL_MODE ) {
105
122
return false ;
106
123
}
107
124
device->set_mode (modem_mode::CMUX_MODE); // switch the device into CMUX mode
@@ -111,17 +128,46 @@ bool DCE_Mode::set_unsafe(DTE *dte, ModuleIf *device, Netif &netif, modem_mode m
111
128
return false ;
112
129
}
113
130
mode = modem_mode::CMUX_MODE;
114
- if (!device->setup_data_mode ()) {
131
+ return transitions::enter_data (*dte, *device, netif);
132
+ case modem_mode::CMUX_MANUAL_MODE:
133
+ if (mode != modem_mode::COMMAND_MODE && mode != modem_mode::UNDEF) {
134
+ return false ;
135
+ }
136
+ device->set_mode (modem_mode::CMUX_MODE);
137
+ usleep (100'000 );
138
+
139
+ if (!dte->set_mode (m)) {
115
140
return false ;
116
141
}
117
- if (!device->set_mode (modem_mode::DATA_MODE)) {
142
+ mode = modem_mode::CMUX_MANUAL_MODE;
143
+ return true ;
144
+ case modem_mode::CMUX_MANUAL_EXIT:
145
+ if (mode != modem_mode::CMUX_MANUAL_MODE) {
146
+ return false ;
147
+ }
148
+ if (!dte->set_mode (m)) {
149
+ return false ;
150
+ }
151
+ mode = modem_mode::COMMAND_MODE;
152
+ return true ;
153
+ case modem_mode::CMUX_MANUAL_SWAP:
154
+ if (mode != modem_mode::CMUX_MANUAL_MODE) {
118
155
return false ;
119
156
}
120
- if (!dte->set_mode (modem_mode::DATA_MODE )) {
157
+ if (!dte->set_mode (m )) {
121
158
return false ;
122
159
}
123
- netif.start ();
124
160
return true ;
161
+ case modem_mode::CMUX_MANUAL_DATA:
162
+ if (mode != modem_mode::CMUX_MANUAL_MODE) {
163
+ return false ;
164
+ }
165
+ return transitions::enter_data (*dte, *device, netif);
166
+ case modem_mode::CMUX_MANUAL_COMMAND:
167
+ if (mode != modem_mode::CMUX_MANUAL_MODE) {
168
+ return false ;
169
+ }
170
+ return transitions::exit_data (*dte, *device, netif);
125
171
}
126
172
return false ;
127
173
}
0 commit comments