4
4
#define RESULT_ERROR " ERROR\r\n "
5
5
#define RESULT_DATA " DATA\r\n "
6
6
7
- ModemClass::ModemClass (int tx, int rx) : beginned(false ), delete_serial(false ), _timeout(MODEM_TIMEOUT) {
7
+ /* -------------------------------------------------------------------------- */
8
+ ModemClass::ModemClass (int tx, int rx) : beginned(false ), delete_serial(false ), _timeout(MODEM_TIMEOUT), trim_results(true ), read_by_size(false ) {
9
+ /* -------------------------------------------------------------------------- */
8
10
_serial = new UART (tx,rx);
9
11
}
10
12
11
- ModemClass::ModemClass (UART * serial) : beginned(false ) , delete_serial(true ) , _serial(serial), _timeout(MODEM_TIMEOUT){
12
-
13
+ /* -------------------------------------------------------------------------- */
14
+ ModemClass::ModemClass (UART * serial) : beginned(false ) , delete_serial(true ) , _serial(serial), _timeout(MODEM_TIMEOUT), trim_results(true ), read_by_size(false ) {
15
+ /* -------------------------------------------------------------------------- */
13
16
}
14
17
18
+ /* -------------------------------------------------------------------------- */
15
19
ModemClass::~ModemClass () {
20
+ /* -------------------------------------------------------------------------- */
16
21
if (_serial != nullptr && !delete_serial){
17
22
delete _serial;
18
23
_serial = nullptr ;
19
24
}
20
25
}
21
26
27
+ /* -------------------------------------------------------------------------- */
22
28
void ModemClass::begin (int badurate){
29
+ /* -------------------------------------------------------------------------- */
23
30
if (_serial != nullptr && !beginned) {
24
31
_serial->begin (badurate);
25
32
beginned = true ;
26
33
}
27
34
}
28
35
36
+ /* -------------------------------------------------------------------------- */
29
37
void ModemClass::end (){
38
+ /* -------------------------------------------------------------------------- */
30
39
_serial->end ();
31
40
}
32
41
33
-
42
+ /* -------------------------------------------------------------------------- */
34
43
bool ModemClass::passthrough (const uint8_t *data, size_t size) {
35
- Serial. println ( " [CALL] ModemClass::passthrough " );
44
+ /* -------------------------------------------------------------------------- */
36
45
_serial->write (data,size);
37
46
bool res = false ;
38
47
bool found = false ;
@@ -53,7 +62,7 @@ bool ModemClass::passthrough(const uint8_t *data, size_t size) {
53
62
}
54
63
}
55
64
}
56
- #ifdef MODEM_DEBUG
65
+ #ifdef MODEM_DEBUG_PASSTHROUGH
57
66
Serial.print (" passthrough, rx |>>" );
58
67
Serial.print (data_res.c_str ());
59
68
Serial.println (" <<|" );
@@ -67,8 +76,9 @@ bool ModemClass::passthrough(const uint8_t *data, size_t size) {
67
76
return res;
68
77
}
69
78
79
+ /* -------------------------------------------------------------------------- */
70
80
void ModemClass::write_nowait (const string &cmd, string &str, char * fmt, ...) {
71
-
81
+ /* -------------------------------------------------------------------------- */
72
82
memset (tx_buff,0x00 ,MAX_BUFF_SIZE);
73
83
va_list va;
74
84
va_start (va, fmt);
@@ -84,69 +94,146 @@ void ModemClass::write_nowait(const string &cmd, string &str, char * fmt, ...) {
84
94
}
85
95
86
96
97
+ /* -------------------------------------------------------------------------- */
87
98
bool ModemClass::write (const string &prompt, string &data_res, char * fmt, ...){
88
-
99
+ /* -------------------------------------------------------------------------- */
89
100
data_res.clear ();
90
-
91
101
memset (tx_buff,0x00 ,MAX_BUFF_SIZE);
92
102
va_list va;
93
103
va_start (va, fmt);
94
104
vsprintf ((char *)tx_buff, fmt, va);
95
105
va_end (va);
96
106
#ifdef MODEM_DEBUG
107
+ Serial.println ();
108
+ Serial.println (" ###>" );
109
+ Serial.print (" READ BY SIZE: " );
110
+ Serial.println ((int )read_by_size);
97
111
Serial.print (" Write Call, command sent: " );
98
112
Serial.write (tx_buff,strlen ((char *)tx_buff));
99
113
Serial.println ();
114
+
115
+ Serial.println (" <###" );
100
116
#endif
101
117
_serial->write (tx_buff,strlen ((char *)tx_buff));
102
118
return buf_read (prompt,data_res);;
103
119
}
104
120
105
121
122
+ typedef enum {
123
+ IDLE,
124
+ WAIT_FOR_SIZE,
125
+ WAIT_FOR_DATA
126
+ } ReadBySizeSt_t;
127
+
128
+
129
+ /* -------------------------------------------------------------------------- */
130
+ bool ModemClass::read_by_size_finished (string &rx) {
131
+ /* -------------------------------------------------------------------------- */
132
+ bool rv = false ;
133
+ static bool first_call = true ;
134
+ static ReadBySizeSt_t st = IDLE;
135
+ static int data_to_be_received = 0 ;
136
+ static int data_received = 0 ;
137
+ if (first_call) {
138
+ first_call = false ;
139
+ st = WAIT_FOR_SIZE;
140
+ }
141
+
142
+ switch (st) {
143
+ case IDLE:
144
+
145
+ break ;
146
+ case WAIT_FOR_SIZE: {
147
+ int pos = rx.find (" |" );
148
+ int pos_space = rx.find (" " );
149
+ if (pos != string::npos && pos_space != string::npos) {
150
+ string n = rx.substr (pos_space,pos);
151
+ data_to_be_received = atoi (n.c_str ());
152
+ rx.clear ();
153
+ data_received = 0 ;
154
+ st = WAIT_FOR_DATA;
155
+
156
+ }
157
+ }
158
+ break ;
159
+
160
+ case WAIT_FOR_DATA:
161
+ data_received++;
162
+ if (data_received == data_to_be_received) {
163
+ rv = true ;
164
+ first_call = true ;
165
+ st = IDLE;
166
+ }
167
+ break ;
168
+
169
+ default :
170
+ st = IDLE;
171
+ break ;
172
+ }
173
+ return rv;
174
+ }
175
+
176
+ /* -------------------------------------------------------------------------- */
106
177
bool ModemClass::buf_read (const string &prompt, string &data_res) {
178
+ /* -------------------------------------------------------------------------- */
107
179
bool res = false ;
108
180
bool found = false ;
109
181
unsigned long start_time = millis ();
110
182
while (millis () - start_time < _timeout && !found){
111
183
while (_serial->available ()){
112
184
char c = _serial->read ();
113
185
data_res += c;
114
- if (string::npos != data_res. rfind (RESULT_DATA) ) {
115
- found = true ;
116
- data_res = data_res. substr ( 0 , data_res. length () - sizeof (RESULT_DATA)) ;
117
- if (prompt != DO_NOT_CHECK_CMD) {
118
- if ( removeAtBegin (data_res, prompt)) {
119
- Serial. println ( " DATA RECIVED " );
120
- res = true ;
186
+ if (read_by_size ) {
187
+ if ( read_by_size_finished (data_res)) {
188
+ found = true ;
189
+ read_by_size = false ;
190
+ res = true ;
191
+ while (_serial-> available ()){
192
+ _serial-> read () ;
121
193
}
122
194
}
123
- else {
124
- res = true ;
125
- }
126
- break ;
127
195
}
128
- else if (string::npos != data_res.rfind (RESULT_OK)){
129
- found = true ;
130
- data_res = data_res.substr (0 , data_res.length () - sizeof (RESULT_OK));
131
- if (prompt != DO_NOT_CHECK_CMD) {
132
- if (removeAtBegin (data_res, prompt)) {
133
- res = true ;
196
+ else {
197
+ if (string::npos != data_res.rfind (RESULT_DATA)) {
198
+ found = true ;
199
+ data_res = data_res.substr (0 , data_res.length () - sizeof (RESULT_DATA));
200
+ if (prompt != DO_NOT_CHECK_CMD) {
201
+ if (removeAtBegin (data_res, prompt)) {
202
+ res = true ;
203
+ }
204
+ }
205
+ else {
206
+ res = true ;
134
207
}
208
+ break ;
135
209
}
136
- else {
137
- res = true ;
210
+ else if (string::npos != data_res.rfind (RESULT_OK)){
211
+ found = true ;
212
+ data_res = data_res.substr (0 , data_res.length () - sizeof (RESULT_OK));
213
+ if (prompt != DO_NOT_CHECK_CMD) {
214
+ if (removeAtBegin (data_res, prompt)) {
215
+ res = true ;
216
+ }
217
+ }
218
+ else {
219
+ res = true ;
220
+ }
221
+ break ;
222
+ }
223
+ else if (string::npos != data_res.rfind (RESULT_ERROR)) {
224
+ data_res.substr (0 , data_res.length () - sizeof (RESULT_ERROR));
225
+ res = false ;
226
+ break ;
138
227
}
139
- break ;
140
- }
141
- else if (string::npos != data_res.rfind (RESULT_ERROR)) {
142
- data_res.substr (0 , data_res.length () - sizeof (RESULT_ERROR));
143
- res = false ;
144
- break ;
145
228
}
146
229
}
147
- }
148
- trim (data_res);
149
- #ifdef MODEM_DEBUG
230
+ }
231
+ if (trim_results) {
232
+ trim (data_res);
233
+ }
234
+ trim_results = true ;
235
+
236
+ #ifdef MODEM_DEBUG
150
237
Serial.print (" Write Call, response rx |>>" );
151
238
Serial.print (data_res.c_str ());
152
239
Serial.println (" <<|" );
@@ -156,7 +243,7 @@ bool ModemClass::buf_read(const string &prompt, string &data_res) {
156
243
else {
157
244
Serial.println (" Result: FAILED" );
158
245
}
159
- #endif
246
+ #endif
160
247
161
248
return res;
162
249
}
0 commit comments