31
31
32
32
namespace mbed {
33
33
34
- static CellularConnectionUtil cellularConnection;
35
- static rtos::Semaphore cellularSemaphore (0 );
36
- static UARTSerial cellularSerial (MDMTXD, MDMRXD, MBED_CONF_PLATFORM_DEFAULT_SERIAL_BAUD_RATE);
37
-
38
-
39
34
bool EasyCellularConnection::cellular_status (int state, int next_state)
40
35
{
41
36
tr_info (" cellular_status %d=>%d" , state, next_state);
@@ -45,7 +40,7 @@ bool EasyCellularConnection::cellular_status(int state, int next_state)
45
40
} else {
46
41
_is_connected = false ;
47
42
}
48
- MBED_ASSERT (cellularSemaphore .release () == osOK);
43
+ MBED_ASSERT (_cellularSemaphore .release () == osOK);
49
44
return false ;
50
45
}
51
46
else {
@@ -54,61 +49,110 @@ bool EasyCellularConnection::cellular_status(int state, int next_state)
54
49
return true ;
55
50
}
56
51
57
- EasyCellularConnection::EasyCellularConnection () : _is_connected(false ), _target_state(CellularConnectionUtil::STATE_POWER_ON)
52
+ EasyCellularConnection::EasyCellularConnection () : _is_connected(false ), _is_initialized(false ),
53
+ _target_state (CellularConnectionUtil::STATE_POWER_ON),
54
+ _cellularSerial(MDMTXD, MDMRXD, MBED_CONF_PLATFORM_DEFAULT_SERIAL_BAUD_RATE),
55
+ _cellularSemaphore(0 ), _cellularConnectionUtil(), _credentials_err(NSAPI_ERROR_OK)
58
56
{
59
57
tr_info (" EasyCellularConnection()" );
60
58
}
61
59
62
60
EasyCellularConnection::~EasyCellularConnection ()
63
61
{
64
- cellularConnection .stop ();
62
+ _cellularConnectionUtil .stop ();
65
63
}
66
64
67
65
nsapi_error_t EasyCellularConnection::init ()
68
66
{
67
+ nsapi_error_t err = NSAPI_ERROR_OK;
68
+ if (!_is_initialized) {
69
69
#if defined (MDMRTS) && defined (MDMCTS)
70
- cellularSerial .set_flow_control (SerialBase::RTSCTS, MDMRTS, MDMCTS);
70
+ _cellularSerial .set_flow_control (SerialBase::RTSCTS, MDMRTS, MDMCTS);
71
71
#endif
72
- cellularConnection .set_serial (&cellularSerial );
73
- cellularConnection .set_callback (callback (this , &EasyCellularConnection::cellular_status));
72
+ _cellularConnectionUtil .set_serial (&_cellularSerial );
73
+ _cellularConnectionUtil .set_callback (callback (this , &EasyCellularConnection::cellular_status));
74
74
75
- nsapi_error_t err = cellularConnection .init ();
75
+ err = _cellularConnectionUtil .init ();
76
76
77
- if (err == NSAPI_ERROR_OK) {
78
- err = cellularConnection.start_dispatch ();
77
+ if (err == NSAPI_ERROR_OK) {
78
+ err = _cellularConnectionUtil.start_dispatch ();
79
+ }
80
+ _is_initialized = true ;
79
81
}
80
82
81
83
return err;
82
84
}
83
85
84
86
void EasyCellularConnection::set_credentials (const char *apn, const char *uname, const char *pwd)
85
87
{
86
- CellularNetwork * network = cellularConnection.get_network ();
88
+ _credentials_err = init ();
89
+
90
+ if (_credentials_err) {
91
+ return ;
92
+ }
93
+ CellularNetwork * network = _cellularConnectionUtil.get_network ();
87
94
if (network) {
88
- network->set_credentials (apn, uname, pwd);
95
+ _credentials_err = network->set_credentials (apn, uname, pwd);
89
96
} else {
90
97
tr_error (" NO Network..." );
91
98
}
92
99
}
93
100
94
101
void EasyCellularConnection::set_sim_pin (const char *sim_pin)
95
102
{
96
- cellularConnection.set_sim_pin (sim_pin);
103
+ if (sim_pin) {
104
+ _cellularConnectionUtil.set_sim_pin (sim_pin);
105
+ }
97
106
}
98
107
99
108
nsapi_error_t EasyCellularConnection::connect (const char *sim_pin, const char *apn, const char *uname, const char *pwd)
100
109
{
101
- cellularConnection.set_sim_pin (sim_pin);
102
- cellularConnection.get_network ()->set_credentials (apn, uname, pwd);
110
+ nsapi_error_t err = check_connect ();
111
+ if (err) {
112
+ return err;
113
+ }
114
+
115
+ if (sim_pin) {
116
+ _cellularConnectionUtil.set_sim_pin (sim_pin);
117
+ }
118
+
119
+ err = _cellularConnectionUtil.get_network ()->set_credentials (apn, uname, pwd);
120
+ if (err) {
121
+ return err;
122
+ }
123
+
103
124
return connect ();
104
125
}
105
126
127
+ nsapi_error_t EasyCellularConnection::check_connect ()
128
+ {
129
+ if (_is_connected) {
130
+ return NSAPI_ERROR_IS_CONNECTED;
131
+ }
132
+ nsapi_error_t err = init ();
133
+ if (err) {
134
+ return err;
135
+ }
136
+
137
+ return NSAPI_ERROR_OK;
138
+ }
139
+
106
140
nsapi_error_t EasyCellularConnection::connect ()
107
141
{
142
+ // there was an error while setting credentials but it's a void function so check error here...
143
+ if (_credentials_err) {
144
+ return _credentials_err;
145
+ }
146
+
147
+ nsapi_error_t err = check_connect ();
148
+ if (err) {
149
+ return err;
150
+ }
151
+
108
152
_target_state = CellularConnectionUtil::STATE_CONNECTED;
109
- nsapi_error_t err = cellularConnection .continue_to_state (_target_state);
153
+ err = _cellularConnectionUtil .continue_to_state (_target_state);
110
154
if (err == NSAPI_ERROR_OK) {
111
- int ret_wait = cellularSemaphore .wait (10 *60 *1000 ); // cellular network searching may take several minutes
155
+ int ret_wait = _cellularSemaphore .wait (10 *60 *1000 ); // cellular network searching may take several minutes
112
156
if (ret_wait != 1 ) {
113
157
tr_info (" No cellular connection" );
114
158
err = NSAPI_ERROR_NO_CONNECTION;
@@ -120,11 +164,12 @@ nsapi_error_t EasyCellularConnection::connect()
120
164
121
165
nsapi_error_t EasyCellularConnection::disconnect ()
122
166
{
167
+ _credentials_err = NSAPI_ERROR_OK;
123
168
_is_connected = false ;
124
- if (!cellularConnection .get_network ()) {
169
+ if (!_cellularConnectionUtil .get_network ()) {
125
170
return NSAPI_ERROR_NO_CONNECTION;
126
171
}
127
- return cellularConnection .get_network ()->disconnect ();
172
+ return _cellularConnectionUtil .get_network ()->disconnect ();
128
173
}
129
174
130
175
bool EasyCellularConnection::is_connected ()
@@ -134,39 +179,44 @@ bool EasyCellularConnection::is_connected()
134
179
135
180
const char *EasyCellularConnection::get_ip_address ()
136
181
{
137
- CellularNetwork * network = cellularConnection.get_network ();
138
- if (network) {
139
- return cellularConnection.get_network ()->get_ip_address ();
140
- } else {
182
+ CellularNetwork *network = _cellularConnectionUtil.get_network ();
183
+ if (!network) {
141
184
return NULL ;
142
185
}
186
+ return _cellularConnectionUtil.get_network ()->get_ip_address ();
143
187
}
144
188
145
189
const char *EasyCellularConnection::get_netmask ()
146
190
{
147
- return cellularConnection.get_network ()->get_netmask ();
191
+ CellularNetwork *network = _cellularConnectionUtil.get_network ();
192
+ if (!network) {
193
+ return NULL ;
194
+ }
195
+
196
+ return network->get_netmask ();
148
197
}
149
198
150
199
const char *EasyCellularConnection::get_gateway ()
151
200
{
152
- return cellularConnection.get_network ()->get_gateway ();
201
+ CellularNetwork *network = _cellularConnectionUtil.get_network ();
202
+ if (!network) {
203
+ return NULL ;
204
+ }
205
+
206
+ return network->get_gateway ();
153
207
}
154
208
155
209
void EasyCellularConnection::attach (mbed::Callback<void (nsapi_event_t , intptr_t )> status_cb)
156
210
{
157
- CellularNetwork * network = cellularConnection .get_network ();
211
+ CellularNetwork *network = _cellularConnectionUtil .get_network ();
158
212
if (network) {
159
213
network->attach (status_cb);
160
214
}
161
215
}
162
216
163
217
NetworkStack *EasyCellularConnection::get_stack ()
164
218
{
165
- #if NSAPI_PPP_AVAILABLE
166
- return nsapi_ppp_get_stack ();
167
- #else
168
- return cellularConnection.get_stack ();
169
- #endif // #if NSAPI_PPP_AVAILABLE
219
+ return _cellularConnectionUtil.get_stack ();
170
220
}
171
221
172
222
} // namespace
0 commit comments