Zephyr API Documentation  3.6.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
14#ifndef ZEPHYR_MODEM_CHAT_
15#define ZEPHYR_MODEM_CHAT_
16
17#ifdef __cplusplus
18extern "C" {
19#endif
20
21struct modem_chat;
22
31typedef void (*modem_chat_match_callback)(struct modem_chat *chat, char **argv, uint16_t argc,
32 void *user_data);
33
39 const uint8_t *match;
52};
53
54#define MODEM_CHAT_MATCH(_match, _separators, _callback) \
55 { \
56 .match = (uint8_t *)(_match), .match_size = (uint8_t)(sizeof(_match) - 1), \
57 .separators = (uint8_t *)(_separators), \
58 .separators_size = (uint8_t)(sizeof(_separators) - 1), .wildcards = false, \
59 .callback = _callback, \
60 }
61
62#define MODEM_CHAT_MATCH_WILDCARD(_match, _separators, _callback) \
63 { \
64 .match = (uint8_t *)(_match), .match_size = (uint8_t)(sizeof(_match) - 1), \
65 .separators = (uint8_t *)(_separators), \
66 .separators_size = (uint8_t)(sizeof(_separators) - 1), .wildcards = true, \
67 .callback = _callback, \
68 }
69
70#define MODEM_CHAT_MATCH_INITIALIZER(_match, _separators, _callback, _wildcards, _partial) \
71 { \
72 .match = (uint8_t *)(_match), \
73 .match_size = (uint8_t)(sizeof(_match) - 1), \
74 .separators = (uint8_t *)(_separators), \
75 .separators_size = (uint8_t)(sizeof(_separators) - 1), \
76 .wildcards = _wildcards, \
77 .partial = _partial, \
78 .callback = _callback, \
79 }
80
81#define MODEM_CHAT_MATCH_DEFINE(_sym, _match, _separators, _callback) \
82 const static struct modem_chat_match _sym = MODEM_CHAT_MATCH(_match, _separators, _callback)
83
84/* Helper struct to match any response without callback. */
85extern const struct modem_chat_match modem_chat_any_match;
86
87#define MODEM_CHAT_MATCHES_DEFINE(_sym, ...) \
88 const static struct modem_chat_match _sym[] = {__VA_ARGS__}
89
90/* Helper struct to match nothing. */
91extern const struct modem_chat_match modem_chat_empty_matches[0];
92
107};
108
109#define MODEM_CHAT_SCRIPT_CMD_RESP(_request, _response_match) \
110 { \
111 .request = (uint8_t *)(_request), \
112 .request_size = (uint16_t)(sizeof(_request) - 1), \
113 .response_matches = &_response_match, \
114 .response_matches_size = 1, \
115 .timeout = 0, \
116 }
117
118#define MODEM_CHAT_SCRIPT_CMD_RESP_MULT(_request, _response_matches) \
119 { \
120 .request = (uint8_t *)(_request), \
121 .request_size = (uint16_t)(sizeof(_request) - 1), \
122 .response_matches = _response_matches, \
123 .response_matches_size = ARRAY_SIZE(_response_matches), \
124 .timeout = 0, \
125 }
126
127#define MODEM_CHAT_SCRIPT_CMD_RESP_NONE(_request, _timeout_ms) \
128 { \
129 .request = (uint8_t *)(_request), \
130 .request_size = (uint16_t)(sizeof(_request) - 1), \
131 .response_matches = NULL, \
132 .response_matches_size = 0, \
133 .timeout = _timeout_ms, \
134 }
135
136#define MODEM_CHAT_SCRIPT_CMDS_DEFINE(_sym, ...) \
137 const struct modem_chat_script_chat _sym[] = {__VA_ARGS__}
138
139/* Helper struct to have no chat script command. */
141
147
155typedef void (*modem_chat_script_callback)(struct modem_chat *chat,
156 enum modem_chat_script_result result, void *user_data);
157
163 const char *name;
176};
177
178#define MODEM_CHAT_SCRIPT_DEFINE(_sym, _script_chats, _abort_matches, _callback, _timeout_s) \
179 const static struct modem_chat_script _sym = { \
180 .name = #_sym, \
181 .script_chats = _script_chats, \
182 .script_chats_size = ARRAY_SIZE(_script_chats), \
183 .abort_matches = _abort_matches, \
184 .abort_matches_size = ARRAY_SIZE(_abort_matches), \
185 .callback = _callback, \
186 .timeout = _timeout_s, \
187 }
188
189#define MODEM_CHAT_SCRIPT_NO_ABORT_DEFINE(_sym, _script_chats, _callback, _timeout_s) \
190 MODEM_CHAT_SCRIPT_DEFINE(_sym, _script_chats, modem_chat_empty_matches, \
191 _callback, _timeout_s)
192
193#define MODEM_CHAT_SCRIPT_EMPTY_DEFINE(_sym) \
194 MODEM_CHAT_SCRIPT_NO_ABORT_DEFINE(_sym, modem_chat_empty_script_chats, NULL, 0)
195
197 /* No data to send */
199 /* Sending request */
201 /* Sending delimiter */
203};
204
210 /* Pipe used to send and receive data */
211 struct modem_pipe *pipe;
212
213 /* User data passed with match callbacks */
215
216 /* Receive buffer */
220
221 /* Work buffer */
224
225 /* Chat delimiter */
229
230 /* Array of bytes which are discarded out by parser */
233
234 /* Parsed arguments */
238
239 /* Matches
240 * Index 0 -> Response matches
241 * Index 1 -> Abort matches
242 * Index 2 -> Unsolicited matches
243 */
244 const struct modem_chat_match *matches[3];
246
247 /* Script execution */
256 struct k_sem script_stopped_sem;
257
258 /* Script sending */
263
264 /* Match parsing */
269
270 /* Process received data */
272};
273
300};
301
308int modem_chat_init(struct modem_chat *chat, const struct modem_chat_config *config);
309
318int modem_chat_attach(struct modem_chat *chat, struct modem_pipe *pipe);
319
330int modem_chat_run_script_async(struct modem_chat *chat, const struct modem_chat_script *script);
331
342int modem_chat_run_script(struct modem_chat *chat, const struct modem_chat_script *script);
343
354static inline int modem_chat_script_run(struct modem_chat *chat,
355 const struct modem_chat_script *script)
356{
357 return modem_chat_run_script_async(chat, script);
358}
359
365
371
372#ifdef __cplusplus
373}
374#endif
375
376#endif /* ZEPHYR_MODEM_CHAT_ */
long atomic_t
Definition: atomic_types.h:15
const struct modem_chat_script_chat modem_chat_empty_script_chats[0]
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:142
@ MODEM_CHAT_SCRIPT_RESULT_TIMEOUT
Definition: chat.h:145
@ MODEM_CHAT_SCRIPT_RESULT_SUCCESS
Definition: chat.h:143
@ MODEM_CHAT_SCRIPT_RESULT_ABORT
Definition: chat.h:144
void modem_chat_script_abort(struct modem_chat *chat)
Abort script.
void modem_chat_release(struct modem_chat *chat)
Release pipe from chat instance.
void(* modem_chat_script_callback)(struct modem_chat *chat, enum modem_chat_script_result result, void *user_data)
Callback called when script chat is received.
Definition: chat.h:155
modem_chat_script_send_state
Definition: chat.h:196
@ MODEM_CHAT_SCRIPT_SEND_STATE_REQUEST
Definition: chat.h:200
@ MODEM_CHAT_SCRIPT_SEND_STATE_IDLE
Definition: chat.h:198
@ MODEM_CHAT_SCRIPT_SEND_STATE_DELIMITER
Definition: chat.h:202
static int modem_chat_script_run(struct modem_chat *chat, const struct modem_chat_script *script)
Run script asynchronously.
Definition: chat.h:354
const struct modem_chat_match modem_chat_empty_matches[0]
const struct modem_chat_match modem_chat_any_match
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:31
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.
Public kernel APIs.
__UINT32_TYPE__ uint32_t
Definition: stdint.h:90
__UINT8_TYPE__ uint8_t
Definition: stdint.h:88
__UINT16_TYPE__ uint16_t
Definition: stdint.h:89
A structure used to submit work after a delay.
Definition: kernel.h:3903
A structure used to submit work.
Definition: kernel.h:3875
Chat configuration.
Definition: chat.h:277
uint8_t * receive_buf
Receive buffer used to store parsed arguments.
Definition: chat.h:281
uint16_t argv_size
Elements in array of pointers.
Definition: chat.h:295
const struct modem_chat_match * unsol_matches
Array of unsolicited matches.
Definition: chat.h:297
uint16_t receive_buf_size
Size of receive buffer should be longest line + longest match.
Definition: chat.h:283
uint8_t delimiter_size
Size of delimiter.
Definition: chat.h:287
uint8_t * delimiter
Delimiter.
Definition: chat.h:285
void * user_data
Free to use user data passed with modem match callbacks.
Definition: chat.h:279
uint16_t unsol_matches_size
Elements in array of unsolicited matches.
Definition: chat.h:299
uint8_t ** argv
Array of pointers used to point to parsed arguments.
Definition: chat.h:293
uint8_t * filter
Bytes which are discarded by parser.
Definition: chat.h:289
uint8_t filter_size
Size of filter.
Definition: chat.h:291
Modem chat match.
Definition: chat.h:37
uint8_t wildcards
Set if modem chat instance shall use wildcards when matching.
Definition: chat.h:47
modem_chat_match_callback callback
Type of modem chat instance.
Definition: chat.h:51
uint8_t separators_size
Size of separators array.
Definition: chat.h:45
const uint8_t * separators
Separators array.
Definition: chat.h:43
const uint8_t * match
Match array.
Definition: chat.h:39
uint8_t partial
Set if script shall not continue to next step in case of match.
Definition: chat.h:49
uint8_t match_size
Size of match.
Definition: chat.h:41
Modem chat script chat.
Definition: chat.h:96
uint16_t timeout
Timeout before chat script may continue to next step in milliseconds.
Definition: chat.h:106
const struct modem_chat_match * response_matches
Expected responses to request.
Definition: chat.h:102
const uint8_t * request
Request to send to modem.
Definition: chat.h:98
uint16_t request_size
Size of request.
Definition: chat.h:100
uint16_t response_matches_size
Number of elements in expected responses.
Definition: chat.h:104
Modem chat script.
Definition: chat.h:161
uint32_t timeout
Timeout in seconds within which the script execution must terminate.
Definition: chat.h:175
const struct modem_chat_match * abort_matches
Array of abort matches.
Definition: chat.h:169
uint16_t script_chats_size
Elements in array of script chats.
Definition: chat.h:167
const struct modem_chat_script_chat * script_chats
Array of script chats.
Definition: chat.h:165
modem_chat_script_callback callback
Callback called when script execution terminates.
Definition: chat.h:173
uint16_t abort_matches_size
Number of elements in array of abort matches.
Definition: chat.h:171
const char * name
Name of script.
Definition: chat.h:163
Chat instance internal context.
Definition: chat.h:209
uint16_t delimiter_size
Definition: chat.h:227
uint16_t filter_size
Definition: chat.h:232
uint16_t matches_size[3]
Definition: chat.h:245
void * user_data
Definition: chat.h:214
uint16_t parse_arg_len
Definition: chat.h:267
uint16_t script_send_pos
Definition: chat.h:260
struct k_work_delayable script_send_timeout_work
Definition: chat.h:262
const struct modem_chat_match * parse_match
Definition: chat.h:265
struct k_work script_run_work
Definition: chat.h:250
struct k_work receive_work
Definition: chat.h:271
struct k_work script_send_work
Definition: chat.h:261
uint8_t work_buf[32]
Definition: chat.h:222
const struct modem_chat_script * script
Definition: chat.h:248
enum modem_chat_script_result script_result
Definition: chat.h:255
uint16_t receive_buf_size
Definition: chat.h:218
uint16_t work_buf_len
Definition: chat.h:223
struct modem_pipe * pipe
Definition: chat.h:211
enum modem_chat_script_send_state script_send_state
Definition: chat.h:259
uint16_t script_chat_it
Definition: chat.h:253
struct k_sem script_stopped_sem
Definition: chat.h:256
uint8_t * delimiter
Definition: chat.h:226
const struct modem_chat_script * pending_script
Definition: chat.h:249
const struct modem_chat_match * matches[3]
Definition: chat.h:244
uint16_t argv_size
Definition: chat.h:236
uint16_t argc
Definition: chat.h:237
struct k_work_delayable script_timeout_work
Definition: chat.h:251
uint8_t * filter
Definition: chat.h:231
uint16_t parse_match_len
Definition: chat.h:266
uint16_t receive_buf_len
Definition: chat.h:219
uint16_t parse_match_type
Definition: chat.h:268
uint16_t delimiter_match_len
Definition: chat.h:228
uint8_t ** argv
Definition: chat.h:235
struct k_work script_abort_work
Definition: chat.h:252
uint8_t * receive_buf
Definition: chat.h:217
atomic_t script_state
Definition: chat.h:254