@@ -110,13 +110,16 @@ static void modem_chat_script_stop(struct modem_chat *chat, enum modem_chat_scri
110
110
k_sem_give (& chat -> script_stopped_sem );
111
111
}
112
112
113
- static void modem_chat_script_send (struct modem_chat * chat )
113
+ static void modem_chat_set_script_send_state (struct modem_chat * chat ,
114
+ enum modem_chat_script_send_state state )
114
115
{
115
- /* Initialize script send work */
116
- chat -> script_send_request_pos = 0 ;
117
- chat -> script_send_delimiter_pos = 0 ;
116
+ chat -> script_send_pos = 0 ;
117
+ chat -> script_send_state = state ;
118
+ }
118
119
119
- /* Schedule script send work */
120
+ static void modem_chat_script_send (struct modem_chat * chat )
121
+ {
122
+ modem_chat_set_script_send_state (chat , MODEM_CHAT_SCRIPT_SEND_STATE_REQUEST );
120
123
k_work_submit (& chat -> script_send_work );
121
124
}
122
125
@@ -219,119 +222,92 @@ static void modem_chat_script_abort_handler(struct k_work *item)
219
222
modem_chat_script_stop (chat , MODEM_CHAT_SCRIPT_RESULT_ABORT );
220
223
}
221
224
222
- static bool modem_chat_script_send_request (struct modem_chat * chat )
225
+ static bool modem_chat_script_chat_is_no_response (struct modem_chat * chat )
223
226
{
224
227
const struct modem_chat_script_chat * script_chat =
225
228
& chat -> script -> script_chats [chat -> script_chat_it ];
226
229
227
- uint8_t * script_chat_request_start ;
228
- uint16_t script_chat_request_remaining ;
229
- int ret ;
230
-
231
- /* Validate data to send */
232
- if (script_chat -> request_size == chat -> script_send_request_pos ) {
233
- return true;
234
- }
235
-
236
- script_chat_request_start = (uint8_t * )& script_chat -> request [chat -> script_send_request_pos ];
237
- script_chat_request_remaining = script_chat -> request_size - chat -> script_send_request_pos ;
238
-
239
- /* Send data through pipe */
240
- ret = modem_pipe_transmit (chat -> pipe , script_chat_request_start ,
241
- script_chat_request_remaining );
242
-
243
- /* Validate transmit successful */
244
- if (ret < 1 ) {
245
- return false;
246
- }
247
-
248
- /* Update script send position */
249
- chat -> script_send_request_pos += (uint16_t )ret ;
230
+ return (script_chat -> response_matches_size == 0 ) ? true : false;
231
+ }
250
232
251
- /* Check if data remains */
252
- if ( chat -> script_send_request_pos < script_chat -> request_size ) {
253
- return false;
254
- }
233
+ static uint16_t modem_chat_script_chat_get_send_timeout ( struct modem_chat * chat )
234
+ {
235
+ const struct modem_chat_script_chat * script_chat =
236
+ & chat -> script -> script_chats [ chat -> script_chat_it ];
255
237
256
- return true ;
238
+ return script_chat -> timeout ;
257
239
}
258
240
259
- static bool modem_chat_script_send_delimiter (struct modem_chat * chat )
241
+ /* Returns true when request part has been sent */
242
+ static bool modem_chat_send_script_request_part (struct modem_chat * chat )
260
243
{
261
- uint8_t * script_chat_delimiter_start ;
262
- uint8_t script_chat_delimiter_remaining ;
263
- int ret ;
244
+ const struct modem_chat_script_chat * script_chat =
245
+ & chat -> script -> script_chats [chat -> script_chat_it ];
264
246
265
- /* Validate data to send */
266
- if ( chat -> delimiter_size == chat -> script_send_delimiter_pos ) {
267
- return true ;
268
- }
247
+ uint8_t * request_part ;
248
+ uint16_t request_size ;
249
+ uint16_t request_part_size ;
250
+ int ret ;
269
251
270
- script_chat_delimiter_start = (uint8_t * )& chat -> delimiter [chat -> script_send_delimiter_pos ];
271
- script_chat_delimiter_remaining = chat -> delimiter_size - chat -> script_send_delimiter_pos ;
252
+ switch (chat -> script_send_state ) {
253
+ case MODEM_CHAT_SCRIPT_SEND_STATE_REQUEST :
254
+ request_part = (uint8_t * )(& script_chat -> request [chat -> script_send_pos ]);
255
+ request_size = script_chat -> request_size ;
256
+ break ;
272
257
273
- /* Send data through pipe */
274
- ret = modem_pipe_transmit (chat -> pipe , script_chat_delimiter_start ,
275
- script_chat_delimiter_remaining );
258
+ case MODEM_CHAT_SCRIPT_SEND_STATE_DELIMITER :
259
+ request_part = (uint8_t * )(& chat -> delimiter [chat -> script_send_pos ]);
260
+ request_size = chat -> delimiter_size ;
261
+ break ;
276
262
277
- /* Validate transmit successful */
278
- if (ret < 1 ) {
263
+ default :
279
264
return false;
280
265
}
281
266
282
- /* Update script send position */
283
- chat -> script_send_delimiter_pos += (uint8_t )ret ;
284
-
285
- /* Check if data remains */
286
- if (chat -> script_send_delimiter_pos < chat -> delimiter_size ) {
267
+ request_part_size = request_size - chat -> script_send_pos ;
268
+ ret = modem_pipe_transmit (chat -> pipe , request_part , request_part_size );
269
+ if (ret < 1 ) {
287
270
return false;
288
271
}
289
272
290
- return true;
291
- }
292
-
293
- static bool modem_chat_script_chat_is_no_response (struct modem_chat * chat )
294
- {
295
- const struct modem_chat_script_chat * script_chat =
296
- & chat -> script -> script_chats [chat -> script_chat_it ];
297
-
298
- return (script_chat -> response_matches_size == 0 ) ? true : false;
299
- }
273
+ chat -> script_send_pos += (uint16_t )ret ;
300
274
301
- static uint16_t modem_chat_script_chat_get_send_timeout (struct modem_chat * chat )
302
- {
303
- const struct modem_chat_script_chat * script_chat =
304
- & chat -> script -> script_chats [chat -> script_chat_it ];
305
-
306
- return script_chat -> timeout ;
275
+ /* Return true if all data was sent */
276
+ return request_size <= chat -> script_send_pos ;
307
277
}
308
278
309
279
static void modem_chat_script_send_handler (struct k_work * item )
310
280
{
311
281
struct modem_chat * chat = CONTAINER_OF (item , struct modem_chat , script_send_work );
312
282
uint16_t timeout ;
313
283
314
- /* Validate script running */
315
284
if (chat -> script == NULL ) {
316
285
return ;
317
286
}
318
287
319
- /* Send request */
320
- if (modem_chat_script_send_request (chat ) == false) {
321
- k_work_submit (& chat -> script_send_work );
288
+ switch (chat -> script_send_state ) {
289
+ case MODEM_CHAT_SCRIPT_SEND_STATE_IDLE :
322
290
return ;
323
- }
324
291
325
- /* Send delimiter */
326
- if (modem_chat_script_send_delimiter (chat ) == false) {
327
- k_work_submit (& chat -> script_send_work );
328
- return ;
292
+ case MODEM_CHAT_SCRIPT_SEND_STATE_REQUEST :
293
+ if (!modem_chat_send_script_request_part (chat )) {
294
+ return ;
295
+ }
296
+
297
+ modem_chat_set_script_send_state (chat , MODEM_CHAT_SCRIPT_SEND_STATE_DELIMITER );
298
+ __fallthrough ;
299
+
300
+ case MODEM_CHAT_SCRIPT_SEND_STATE_DELIMITER :
301
+ if (!modem_chat_send_script_request_part (chat )) {
302
+ return ;
303
+ }
304
+
305
+ modem_chat_set_script_send_state (chat , MODEM_CHAT_SCRIPT_SEND_STATE_IDLE );
306
+ break ;
329
307
}
330
308
331
- /* Check if script command is no response */
332
309
if (modem_chat_script_chat_is_no_response (chat )) {
333
310
timeout = modem_chat_script_chat_get_send_timeout (chat );
334
-
335
311
if (timeout == 0 ) {
336
312
modem_chat_script_next (chat , false);
337
313
} else {
@@ -708,8 +684,17 @@ static void modem_chat_pipe_callback(struct modem_pipe *pipe, enum modem_pipe_ev
708
684
{
709
685
struct modem_chat * chat = (struct modem_chat * )user_data ;
710
686
711
- if (event == MODEM_PIPE_EVENT_RECEIVE_READY ) {
687
+ switch (event ) {
688
+ case MODEM_PIPE_EVENT_RECEIVE_READY :
712
689
k_work_submit (& chat -> receive_work );
690
+ break ;
691
+
692
+ case MODEM_PIPE_EVENT_TRANSMIT_IDLE :
693
+ k_work_submit (& chat -> script_send_work );
694
+ break ;
695
+
696
+ default :
697
+ break ;
713
698
}
714
699
}
715
700
@@ -840,8 +825,8 @@ void modem_chat_release(struct modem_chat *chat)
840
825
atomic_set (& chat -> script_state , 0 );
841
826
chat -> script_result = MODEM_CHAT_SCRIPT_RESULT_ABORT ;
842
827
k_sem_reset (& chat -> script_stopped_sem );
843
- chat -> script_send_request_pos = 0 ;
844
- chat -> script_send_delimiter_pos = 0 ;
828
+ chat -> script_send_state = MODEM_CHAT_SCRIPT_SEND_STATE_IDLE ;
829
+ chat -> script_send_pos = 0 ;
845
830
chat -> parse_match = NULL ;
846
831
chat -> parse_match_len = 0 ;
847
832
chat -> parse_arg_len = 0 ;
0 commit comments