Zephyr Project API 4.4.99
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
chat.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2022 Trackunit Corporation
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7#include <zephyr/kernel.h>
8#include <zephyr/types.h>
9#include <zephyr/device.h>
11
12#include <zephyr/modem/pipe.h>
13#include <zephyr/modem/stats.h>
14
15#ifndef ZEPHYR_INCLUDE_MODEM_CHAT_H_
16#define ZEPHYR_INCLUDE_MODEM_CHAT_H_
17
18#ifdef __cplusplus
19extern "C" {
20#endif
21
30
31struct modem_chat;
33
42typedef bool (*modem_chat_run_check)(void *user_data);
43
52typedef void (*modem_chat_match_callback)(struct modem_chat *chat, char **argv, uint16_t argc,
53 void *user_data);
54
74
75#define MODEM_CHAT_MATCH(_match, _separators, _callback) \
76 { \
77 .match = (uint8_t *)(_match), \
78 .separators = (uint8_t *)(_separators), \
79 .match_size = (uint8_t)(sizeof(_match) - 1), \
80 .separators_size = (uint8_t)(sizeof(_separators) - 1), \
81 .wildcards = false, \
82 .callback = _callback, \
83 }
84
85#define MODEM_CHAT_MATCH_WILDCARD(_match, _separators, _callback) \
86 { \
87 .match = (uint8_t *)(_match), \
88 .separators = (uint8_t *)(_separators), \
89 .match_size = (uint8_t)(sizeof(_match) - 1), \
90 .separators_size = (uint8_t)(sizeof(_separators) - 1), \
91 .wildcards = true, \
92 .callback = _callback, \
93 }
94
95#define MODEM_CHAT_MATCH_INITIALIZER(_match, _separators, _callback, _wildcards, _partial) \
96 { \
97 .match = (uint8_t *)(_match), \
98 .separators = (uint8_t *)(_separators), \
99 .match_size = (uint8_t)(sizeof(_match) - 1), \
100 .separators_size = (uint8_t)(sizeof(_separators) - 1), \
101 .wildcards = _wildcards, \
102 .partial = _partial, \
103 .callback = _callback, \
104 }
105
106#define MODEM_CHAT_MATCH_DEFINE(_sym, _match, _separators, _callback) \
107 const static struct modem_chat_match _sym = MODEM_CHAT_MATCH(_match, _separators, _callback)
108
109#define MODEM_CHAT_MATCH_WILDCARD_DEFINE(_sym, _match, _separators, _callback) \
110 const static struct modem_chat_match _sym = \
111 MODEM_CHAT_MATCH_WILDCARD(_match, _separators, _callback)
112
113/* Helper struct to match any response without callback. */
114extern const struct modem_chat_match modem_chat_any_match;
115
116#define MODEM_CHAT_MATCHES_DEFINE(_sym, ...) \
117 const static struct modem_chat_match _sym[] = {__VA_ARGS__}
118
119/* Helper struct to match nothing. */
120extern const struct modem_chat_match modem_chat_empty_matches[0];
121
136#if defined(CONFIG_MODEM_CHAT_COMMANDS_CONDITIONAL) || defined(__DOXYGEN__)
139#endif
140};
141
148#define MODEM_CHAT_SCRIPT_CMD_RESP(_request, _response_match) \
149 { \
150 .request = (uint8_t *)(_request), \
151 .request_size = (uint16_t)(sizeof(_request) - 1), \
152 .response_matches = &_response_match, \
153 .response_matches_size = 1, \
154 .timeout = 0, \
155 }
156
163#define MODEM_CHAT_SCRIPT_CMD_RESP_MULT(_request, _response_matches) \
164 { \
165 .request = (uint8_t *)(_request), \
166 .request_size = (uint16_t)(sizeof(_request) - 1), \
167 .response_matches = _response_matches, \
168 .response_matches_size = ARRAY_SIZE(_response_matches), \
169 .timeout = 0, \
170 }
171
178#define MODEM_CHAT_SCRIPT_CMD_RESP_NONE(_request, _timeout_ms) \
179 { \
180 .request = (uint8_t *)(_request), \
181 .request_size = (uint16_t)(sizeof(_request) - 1), \
182 .response_matches = NULL, \
183 .response_matches_size = 0, \
184 .timeout = _timeout_ms, \
185 }
186
194#define MODEM_CHAT_SCRIPT_CMD_RESP_COND(_request, _response_match, _run_check) \
195 { \
196 .request = (uint8_t *)(_request), \
197 .request_size = (uint16_t)(sizeof(_request) - 1), \
198 .response_matches = &_response_match, \
199 .response_matches_size = 1, \
200 .timeout = 0, \
201 .run_check = _run_check \
202 }
203
211#define MODEM_CHAT_SCRIPT_CMD_RESP_MULT_COND(_request, _response_matches, _run_check) \
212 { \
213 .request = (uint8_t *)(_request), \
214 .request_size = (uint16_t)(sizeof(_request) - 1), \
215 .response_matches = _response_matches, \
216 .response_matches_size = ARRAY_SIZE(_response_matches), \
217 .timeout = 0, \
218 .run_check = _run_check \
219 }
220
228#define MODEM_CHAT_SCRIPT_CMD_RESP_NONE_COND(_request, _timeout_ms, _run_check) \
229 { \
230 .request = (uint8_t *)(_request), \
231 .request_size = (uint16_t)(sizeof(_request) - 1), \
232 .response_matches = NULL, \
233 .response_matches_size = 0, \
234 .timeout = _timeout_ms, \
235 .run_check = _run_check \
236 }
237
244#define MODEM_CHAT_SCRIPT_CMDS_DEFINE(_sym, ...) \
245 const static struct modem_chat_script_chat _sym[] = {__VA_ARGS__}
246
247/* Helper struct to have no chat script command. */
249
255
265
279typedef void (*modem_chat_script_callback)(struct modem_chat *chat,
280 enum modem_chat_script_result result,
281 const struct modem_chat_script_completion_info *info,
282 void *user_data);
283
303
304#define MODEM_CHAT_SCRIPT_DEFINE(_sym, _script_chats, _abort_matches, _callback, _timeout_s) \
305 const static struct modem_chat_script _sym = { \
306 .name = #_sym, \
307 .script_chats = _script_chats, \
308 .script_chats_size = ARRAY_SIZE(_script_chats), \
309 .abort_matches = _abort_matches, \
310 .abort_matches_size = ARRAY_SIZE(_abort_matches), \
311 .callback = _callback, \
312 .timeout = _timeout_s, \
313 }
314
315#define MODEM_CHAT_SCRIPT_NO_ABORT_DEFINE(_sym, _script_chats, _callback, _timeout_s) \
316 MODEM_CHAT_SCRIPT_DEFINE(_sym, _script_chats, modem_chat_empty_matches, \
317 _callback, _timeout_s)
318
319#define MODEM_CHAT_SCRIPT_EMPTY_DEFINE(_sym) \
320 MODEM_CHAT_SCRIPT_NO_ABORT_DEFINE(_sym, modem_chat_empty_script_chats, NULL, 0)
321
328
335 /* Pipe used to send and receive data */
336 struct modem_pipe *pipe;
337
338 /* User data passed with match callbacks */
339 void *user_data;
340
341 /* Receive buffer */
342 uint8_t *receive_buf;
343 uint16_t receive_buf_size;
344 uint16_t receive_buf_len;
345
346 /* Work buffer */
347 uint8_t work_buf[CONFIG_MODEM_CHAT_WORK_BUFFER_SIZE];
348 uint16_t work_buf_len;
349
350 /* Chat delimiter */
351 const uint8_t *delimiter;
352 uint16_t delimiter_size;
353 uint16_t delimiter_match_len;
354
355 /* Array of bytes which are discarded out by parser */
356 const uint8_t *filter;
357 uint16_t filter_size;
358
359 /* Parsed arguments */
360 uint8_t **argv;
361 uint16_t argv_size;
362 uint16_t argc;
363
364 /* Matches
365 * Index 0 -> Response matches
366 * Index 1 -> Abort matches
367 * Index 2 -> Unsolicited matches
368 */
369 const struct modem_chat_match *matches[3];
370 uint16_t matches_size[3];
371
372 /* Script execution */
373 const struct modem_chat_script *script;
374 const struct modem_chat_script *pending_script;
375 struct k_work script_run_work;
376 struct k_work_delayable script_timeout_work;
377 struct k_work script_abort_work;
378 uint16_t script_chat_it;
379 atomic_t script_state;
380 enum modem_chat_script_result script_result;
381 struct k_sem script_stopped_sem;
382
383 /* Script sending */
384 enum modem_chat_script_send_state script_send_state;
385 uint16_t script_send_pos;
386 struct k_work script_send_work;
387 struct k_work_delayable script_send_timeout_work;
388
389 /* Match parsing */
390 const struct modem_chat_match *parse_match;
391 uint16_t parse_match_len;
392 uint16_t parse_arg_len;
393 uint16_t parse_match_type;
394#if defined(CONFIG_MODEM_CHAT_LOG_RAW_RX)
395 uint8_t raw_log_separators[CONFIG_MODEM_CHAT_LOG_BUFFER_SIZE];
396 uint16_t raw_log_separators_len;
397#endif
398
399 /* Process received data */
400 struct k_work receive_work;
401
402 /* Statistics */
403#if CONFIG_MODEM_STATS
404 struct modem_stats_buffer receive_buf_stats;
405 struct modem_stats_buffer work_buf_stats;
406#endif
408};
409
437
444int modem_chat_init(struct modem_chat *chat, const struct modem_chat_config *config);
445
454int modem_chat_attach(struct modem_chat *chat, struct modem_pipe *pipe);
455
463
474int modem_chat_run_script_async(struct modem_chat *chat, const struct modem_chat_script *script);
475
486int modem_chat_run_script(struct modem_chat *chat, const struct modem_chat_script *script);
487
498static inline int modem_chat_script_run(struct modem_chat *chat,
499 const struct modem_chat_script *script)
500{
501 return modem_chat_run_script_async(chat, script);
502}
503
509
515
521
531int modem_chat_match_set_match(struct modem_chat_match *chat_match, const char *match);
532
543
551
558
564void modem_chat_match_enable_wildcards(struct modem_chat_match *chat_match, bool enable);
565
571
582 const char *request);
583
594 const struct modem_chat_match *response_matches,
595 uint16_t response_matches_size);
596
603 uint16_t timeout_ms);
604
610
617void modem_chat_script_set_name(struct modem_chat_script *script, const char *name);
618
629 const struct modem_chat_script_chat *script_chats,
630 uint16_t script_chats_size);
631
642 const struct modem_chat_match *abort_matches,
643 uint16_t abort_matches_size);
644
652
659
663
664#ifdef __cplusplus
665}
666#endif
667
668#endif /* ZEPHYR_INCLUDE_MODEM_CHAT_H_ */
APIs and macros for the Zephyr device model.
long atomic_t
Atomic integer variable.
Definition atomic_types.h:31
const struct modem_chat_script_chat modem_chat_empty_script_chats[0]
void(* modem_chat_script_callback)(struct modem_chat *chat, enum modem_chat_script_result result, const struct modem_chat_script_completion_info *info, void *user_data)
Callback called when script execution completes.
Definition chat.h:279
void modem_chat_match_init(struct modem_chat_match *chat_match)
Initialize modem chat match.
int modem_chat_script_chat_set_response_matches(struct modem_chat_script_chat *script_chat, const struct modem_chat_match *response_matches, uint16_t response_matches_size)
Set modem chat script chat matches.
void modem_chat_match_enable_wildcards(struct modem_chat_match *chat_match, bool enable)
Set modem chat match wildcards flag.
int modem_chat_match_set_separators(struct modem_chat_match *chat_match, const char *separators)
Set separators of modem chat match instance.
bool(* modem_chat_run_check)(void *user_data)
Callback called to determine if a chat command should be run.
Definition chat.h:42
int modem_chat_run_script_async(struct modem_chat *chat, const struct modem_chat_script *script)
Run script asynchronously.
modem_chat_script_result
Definition chat.h:250
void modem_chat_script_set_callback(struct modem_chat_script *script, modem_chat_script_callback callback)
Set modem chat script callback.
void modem_chat_match_set_partial(struct modem_chat_match *chat_match, bool partial)
Set modem chat match partial flag.
void modem_chat_script_abort(struct modem_chat *chat)
Abort script.
void modem_chat_release(struct modem_chat *chat)
Release pipe from chat instance.
modem_chat_script_send_state
Definition chat.h:322
void modem_chat_script_set_timeout(struct modem_chat_script *script, uint32_t timeout_s)
Set modem chat script timeout.
bool modem_chat_is_running(struct modem_chat *chat)
Check if a script is running.
void modem_chat_script_set_name(struct modem_chat_script *script, const char *name)
Set modem chat script name.
int modem_chat_script_set_abort_matches(struct modem_chat_script *script, const struct modem_chat_match *abort_matches, uint16_t abort_matches_size)
Set modem chat script abort matches.
static int modem_chat_script_run(struct modem_chat *chat, const struct modem_chat_script *script)
Run script asynchronously.
Definition chat.h:498
const struct modem_chat_match modem_chat_empty_matches[0]
int modem_chat_match_set_match(struct modem_chat_match *chat_match, const char *match)
Set match of modem chat match instance.
int modem_chat_script_set_script_chats(struct modem_chat_script *script, const struct modem_chat_script_chat *script_chats, uint16_t script_chats_size)
Set modem chat script chats.
const struct modem_chat_match modem_chat_any_match
int modem_chat_script_chat_set_request(struct modem_chat_script_chat *script_chat, const char *request)
Set request of modem chat script chat instance.
void modem_chat_script_chat_set_timeout(struct modem_chat_script_chat *script_chat, uint16_t timeout_ms)
Set modem chat script chat timeout.
int modem_chat_run_script(struct modem_chat *chat, const struct modem_chat_script *script)
Run script.
void(* modem_chat_match_callback)(struct modem_chat *chat, char **argv, uint16_t argc, void *user_data)
Callback called when matching chat is received.
Definition chat.h:52
void modem_chat_script_chat_init(struct modem_chat_script_chat *script_chat)
Initialize modem chat script chat.
int modem_chat_init(struct modem_chat *chat, const struct modem_chat_config *config)
Initialize modem pipe chat instance.
int modem_chat_attach(struct modem_chat *chat, struct modem_pipe *pipe)
Attach modem chat instance to pipe.
void modem_chat_script_init(struct modem_chat_script *script)
Initialize modem chat script.
void modem_chat_match_set_callback(struct modem_chat_match *chat_match, modem_chat_match_callback callback)
Set modem chat match callback.
@ MODEM_CHAT_SCRIPT_RESULT_TIMEOUT
Definition chat.h:253
@ MODEM_CHAT_SCRIPT_RESULT_SUCCESS
Definition chat.h:251
@ MODEM_CHAT_SCRIPT_RESULT_ABORT
Definition chat.h:252
@ MODEM_CHAT_SCRIPT_SEND_STATE_REQUEST
Definition chat.h:326
@ MODEM_CHAT_SCRIPT_SEND_STATE_IDLE
Definition chat.h:324
Public kernel APIs.
Simple, header-only ring buffer implementation.
#define bool
Definition stdbool.h:13
__UINT32_TYPE__ uint32_t
Definition stdint.h:90
__UINT8_TYPE__ uint8_t
Definition stdint.h:88
__UINT16_TYPE__ uint16_t
Definition stdint.h:89
Semaphore structure.
Definition kernel.h:3738
A structure used to submit work after a delay.
Definition kernel.h:4693
A structure used to submit work.
Definition kernel.h:4651
Chat configuration.
Definition chat.h:413
const uint8_t * filter
Bytes which are discarded by parser.
Definition chat.h:425
uint8_t * receive_buf
Receive buffer used to store parsed arguments.
Definition chat.h:417
uint16_t argv_size
Elements in array of pointers.
Definition chat.h:431
const uint8_t * delimiter
Delimiter.
Definition chat.h:421
const struct modem_chat_match * unsol_matches
Array of unsolicited matches.
Definition chat.h:433
uint16_t receive_buf_size
Size of receive buffer should be longest line + longest match.
Definition chat.h:419
uint8_t delimiter_size
Size of delimiter.
Definition chat.h:423
void * user_data
Free to use user data passed with modem match callbacks.
Definition chat.h:415
uint16_t unsol_matches_size
Elements in array of unsolicited matches.
Definition chat.h:435
uint8_t ** argv
Array of pointers used to point to parsed arguments.
Definition chat.h:429
uint8_t filter_size
Size of filter.
Definition chat.h:427
Modem chat match.
Definition chat.h:58
modem_chat_match_callback callback
Callback run on a match.
Definition chat.h:64
uint8_t separators_size
Size of separators array.
Definition chat.h:68
const uint8_t * separators
Separators array.
Definition chat.h:62
bool partial
Set if script shall not continue to next step in case of match.
Definition chat.h:72
const uint8_t * match
Match array.
Definition chat.h:60
bool wildcards
Set if modem chat instance shall use wildcards when matching.
Definition chat.h:70
uint8_t match_size
Size of match.
Definition chat.h:66
Modem chat script chat.
Definition chat.h:125
uint16_t timeout
Timeout before chat script may continue to next step in milliseconds.
Definition chat.h:135
modem_chat_run_check run_check
Callback that returns whether request should be run or skipped.
Definition chat.h:138
const struct modem_chat_match * response_matches
Expected responses to request.
Definition chat.h:131
const uint8_t * request
Request to send to modem.
Definition chat.h:127
uint16_t request_size
Size of request.
Definition chat.h:129
uint16_t response_matches_size
Number of elements in expected responses.
Definition chat.h:133
Extra information about the script that completed.
Definition chat.h:259
const struct modem_chat_script * script
Script that was executing.
Definition chat.h:261
const struct modem_chat_script_chat * script_chat
Script chat that last ran or skipped (Can be NULL for empty scripts).
Definition chat.h:263
Modem chat script.
Definition chat.h:287
uint32_t timeout
Timeout in seconds within which the script execution must terminate.
Definition chat.h:301
const struct modem_chat_match * abort_matches
Array of abort matches.
Definition chat.h:295
uint16_t script_chats_size
Elements in array of script chats.
Definition chat.h:293
const struct modem_chat_script_chat * script_chats
Array of script chats.
Definition chat.h:291
modem_chat_script_callback callback
Callback called when script execution terminates.
Definition chat.h:299
uint16_t abort_matches_size
Number of elements in array of abort matches.
Definition chat.h:297
const char * name
Name of script.
Definition chat.h:289
Chat instance internal context.
Definition chat.h:333